一般 npc 若是沒有玩家在附近, 其實是可以暫停其 heart_beat 的
但是隨機移動或巡邏的 npc, 停止其 heart_beat 也同時會停止移動
若為了移動的目的而保持其 heart_beat
在 heart_beat() 裡面只有移動的行為
其他大量的 code 都是白工
結論:
可以建立一個 MOVE_D, 將 npc 內的移動行為改由 MOVE_D 處理
如此可保留 npc 移動行為, 也可以有效降低 heart_beat 數量
建立 /adm/daemons/moved.c (MOVE_D)
代碼: 選擇全部
nosave object *target;
void create() {
target = filter_array(objects(), (: $1->query_random_move() :));
set_heart_beat(1);
}
// 處理 npc 的 random_move()
void heart_beat() {
foreach (object ob in target) {
if (ob && environment(ob)
&& living(ob)
&& !ob->is_busy()
&& !ob->is_fighting()
&& random(100) < ob->query_random_move()
&& ob->random_move()) {
reset_eval_cost();
}
}
}
// 增加受控管之 npc
void register(object ob) {
target += ({ ob });
}
// reset 時清除已消失的 npc
void reset() {
target -= ({ 0 });
}
// 移除受控管之 npc
void unregister(object ob) {
target -= ({ ob });
}
修改 /std/char/npc.c
代碼: 選擇全部
nosave int move_chance = 0;
// 設定 npc 隨機移動, 並指定其頻率
nomask void set_random_move(int chance) {
if (clonep() && chance != move_chance && chance >= 0) {
if (move_chance) {
if (!chance) {
MOVE_D->unregister(this_object());
}
} else {
MOVE_D->register(this_object());
}
move_chance = chance;
}
}
nomask int query_random_move() {
return move_chance;
}
一般 NPC 的調整
代碼: 選擇全部
void create() {
...略
set("chat_chance", 8);
set("chat_msg", ({
(: random_move :)
}));
...略
}
代碼: 選擇全部
void create() {
...略
set_random_move(8);
...略
}