基礎建設之 MOVE_D

回覆文章
jrealm
系統管理員
文章: 1084
註冊時間: 2014-03-31, 23:10

基礎建設之 MOVE_D

文章 jrealm » 2017-07-07, 14:47

heart_beat 物件數量的多寡, 決定了系統效能的表現
一般 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);

...略
}

回覆文章