加载中...

「RO 笔记」添加自定义 NPC


0x00 前言

还记得我最早接触 RO 的时候,国内的版本是「樱之花嫁」,那时就是 SMM 在做代言的,每个城市都有一个 SMM 的 NPC 角色形象帮玩家免费回血。

但后面 SMM 不再代言之后,这个福利也被取消了。

当我想扒拉出来怀旧的时候,却发现即使翻遍现在任何一个官方运营的 GRF,对应的 NPC 图档也被彻底删除了。

机缘巧合之下,我拿到了 SMM 的图档文件 4_f_son.act4_f_son.spr

本篇就以此为例讲解一下怎么添加自定义的 NPC 。

0x10 在服务端添加 NPC 脚本

首先我们需要实现一个简单的 NPC 脚本,功能其实很简单: 走近 SMM 附近 5x5 的范围内自动回血。

prontera,146,95,6    script    孙燕资#prt    777,5,5,{
    cutin "4_f_son", 2;

    // 和 NPC 对话可额外获得 BUFF(可选)
    callfunc("F_HEALER_PLUS");

    cutin "", 255;
    close;
    end;


// 走近 NPC 5x5 范围内时触发自动回复
OnTouch:
    npctalk "我是音乐精灵孙燕资 ~";

    specialeffect2 EF_HEAL2;            // 治愈效果
    soundeffect "pokemon_heal.wav", 0;    // 治愈音效

    percentheal 100, 100;    // 回复 HP/SP
    healap 200;                // 回复 AP

    sleep2 3000;
    npctalk "我可以用音乐治愈你的心灵哦 ^0^";
    emotion ET_SMILE;
    end;
}

代码很简单,而且我做了注释、就不过多解释了,相关语法在 doc/script_commands.txt 都可以找到。

里面涉及 NPC 图档的只有两个地方:

  1. NPC 图档: 第一行的 777,其实是在 NPC 外观池中声明的自定义 ID
  2. NPC 立绘(可选): cutin "4_f_son", 2;,其中 4_f_son 就是立绘文件名

其中针对 NPC ID,在 rAthena 的源码 src/map/npc.hpp 中定义了若干个范围:

#define npcdb_checkid(id) ( ( (id) > NPC_RANGE1_START && (id) < NPC_RANGE1_END ) || (id) == JT_HIDDEN_WARP_NPC || ( (id) > NPC_RANGE2_START && (id) < NPC_RANGE2_END ) || (id) == JT_INVISIBLE || ( (id) > NPC_RANGE3_START && (id) < NPC_RANGE3_END ) )

具体数值为:

  • 范围一:
    • NPC_RANGE1_START = 44
    • NPC_RANGE1_END = 126
  • 范围二:
    • NPC_RANGE2_START = 400
    • NPC_RANGE2_END = 1000
  • 范围三:
    • NPC_RANGE3_START = 10000
    • NPC_RANGE3_END = 20000(rAthena)
    • NPC_RANGE3_END = 23001(Pandas)

如果自定义 NPC ID 不在这三个范围内,启动时就会报错: status_set_viewdata (NPC): Invalid view data

如果希望增加 ID 范围,需要修改 npc.hpp ,然后重新编译服务端

0x20 在客户端添加 NPC 图档

0x21 添加 NPC 图档

参考《客户端目录结构及功能说明(2024 修订)》,NPC 图档目录为 data/sprite/npc

我们把 4_f_son.act4_f_son.spr 两个文件放进去这个目录下:

然后修改 NPC 外观池:

  • 定义「NPC 唯一代码」和「NPC ID」的关系: data/luafiles514/lua files/datainfo/npcidentity.lub
  • 定义「NPC 唯一代码」和「NPC 图档名称」的关系: data/luafiles514/lua files/datainfo/jobname.lub

npcidentity.lub 中添加一行:

    JT_4_F_SMM = 777

jobname.lub 中添加一行:

    [jobtbl.JT_4_F_SMM] = "4_f_son",

此时进入游戏就可以看到 SMM 了:

看过《添加自定义魔物》的同学应该了解到,NPC 外观池是和魔物外观池共用的。在早期,小于 1000 的 ID 是预留给 NPC 使用的,大于 1000 则都是魔物。但随着官方的 NPC 越来越多,现在基本已经没有这个约定了,你完全可以用魔物 ID 当 NPC 用。

0x22 添加 NPC 立绘(可选)

所谓的立绘就是和 NPC 对话时、才会出现在画面中的 NPC 形象:

立绘图片的要求很简单:

  • 立绘图片可以网上搜索、PS 修改即可
  • 格式要求为 bmp
  • 希望游戏中显示为透明的部分,可将其设置为粉红色 FF00FF
  • 图片要放到 data/texture/蜡历牢磐其捞胶/illust 目录下

如这里立绘图档名字为 4_f_son.bmp,只需要在服务端 NPC 脚本中使用 cutin "4_f_son", 2; 即可把立绘召唤出来(2 是召唤立绘的位置,详见 doc/script_commands.txt)。

0x30 效果

至此自定义 NPC 就添加成功了,看一下效果:

备用视频源:youtube

0xF0 相关文档


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
 上一篇
「Gym 课程笔记 04」经典控制 - Mountain Car 山地车(离散动作) 「Gym 课程笔记 04」经典控制 - Mountain Car 山地车(离散动作)
Mountain Car(离散)是控制一个无法直接攀登陡峭山坡的小车,必须利用山坡的反向坡度来获得足够的动量,使其尽快到达山顶。
2024-03-04
下一篇 
「RO 笔记」设定自定义宠物的进化路线 「RO 笔记」设定自定义宠物的进化路线
目标是神奇宝贝大师!本文将教你如何在 RO 中添加口袋妖怪的进化系统,从此复刻口袋妖怪、数码宝贝世界将不在话下 ...
2024-02-06
  目录