[分享]基礎建設之 MOVE_D

本文转载自小猫的世界MUD,原文链接:https://catworld.muds.me/forum/viewtopic.php?f=23&t=748

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);

// ...略
}
京ICP备13031296号-4