关于游戏中对象查找相关的efun使用总结

在LPMUD开发中,我们总是需要查找对象,比如找到某个玩家,找到某个物品……在LPC语言中,提供了不少相关的efun,这里做一个汇总。

查找特定对象

在游戏中有大量的情况要查询特定的对象,找到返回object类型的值,没找到返回0,具体相关efun如下:

查找对象-find_object

函数

object find_object(string, int default: 0);

说明

此函数是根据文件名在游戏中查找对象,如果对象文件不存在或未载入游戏,返回 0,否则返回找到的对象。如果指定参数flag为1,此函数作用和load_object一致,如果对象未载入游戏会自动载入,只有在对象文件不存在时才返回0.

查找生物-find_living

函数

object find_living(string);

说明

此函数是根据生物ID在游戏中查找对象,从代码上说,就是查过曾经呼叫过 enable_commands 外部函数而且使用 set_living_name 外部函数设置了名字为arg的对象。

查找玩家-find_player

函数

object find_player(string);

说明

此函数和find_living类似,只是仅从玩家对象中查找。

查找当前对象-this_object

函数

object this_object();

说明

返回调用此函数的对象。这个函数在游戏开发中使用频率是最高的几个之一。

查找前一个对象-previous_object

函数

mixed previous_object(int default: 0);

说明

this_object不同的时这个函数返回的不是当前对象,而是调用当前对象的对象。比如:在玩家指令中this_object()返回的是此指令对象,而previous_object()返回的是调用指令的玩家对象。

previous_object()函数可以通过参数指定要返回的是第几级的对象,如:A调用B,B调用C,C调用D,那么在对象D中previous_object()previous_object(0)返回C,previous_object(1)返回B,previous_object(2)返回A。而previous_object(-1)相当于all_previous_objects(),返回的是数组({A, B, C})。

查找当前玩家-this_player

函数

object this_player(int default: 0);
object this_user(int default: 0);
object this_interactive();

说明

返回调用此函数的玩家对象,this_user()this_player()的别名,而this_interactive()this_player(1)作用一致。在某些情况下this_player(1)的返回结果类似previous_object(),如:玩家A调用玩家B,this_player()类似this_object(),返回B,而this_player(1)或this_interactive()类似previous_object(),返回的是A。

查找对象环境-environment

函数

object environment(void | object);

说明

此函数是查找当前对象或指定对象所有环境并返回环境对象,这个函数在游戏开发中使用频率是最高的几个之一。

查找特定对象-present

函数

object present(object | string, void | object);

说明

这个外部函数比较特殊,查询结果依赖apply方法id()的判断。但是这个函数的作用很强大,用的也比较多。此函数第一个参数可以是objectstring类型,第二个参数可以省略或为object类型,不同参数类型的使用是不同的,说明如下:

  1. 如果第一个参数是字符串str,第二个参数是对象,则在指定对象中查找并返回id(str)返回值为1的对象;如果第二个参数省略,则在当前对象中或对象所在环境中查找;
  2. 如果第一个参数是对象ob,第二个参数为对象,则检查第一个对象是否在第二个对象中,是则返回第一个对象ob;如果第二个参数省略,则检查第一个对象是否在当前对象中或当前对象所在环境中,是则返回ob所在的对象,即ob的环境。

present函数是很容易被模拟出来的,在游戏中也是非常常用的函数之一。

查找特定对象-first_inventory

函数

object first_inventory(object | void default: F__THIS_OBJECT);

说明

查找指定对象或当前对象中的第一个对象,注意最后进入环境的对象为first,有点类似数据结构中的栈,后进的在前。

查找特定对象-next_inventory

函数

object next_inventory(object | void default: F__THIS_OBJECT);

说明

查找和指定对象在相同环境中的下一个对象。如果有A、B、C三个对象按顺序进入环境D,first_inventory(D)返回的是最后进入环境的对象C,而next_inventory(C)为B,next_inventory(B)为A。

更多特定对象查询相关efun

以下efun使用的频率相关比较低,这里不做介绍,可自己查询mud.wiki了解。


object function_owner(function);
object master();
object query_shadowing(object);
object query_snoop(object);
object query_snooping(object);
object shadow(object, int default: 1);
object snoop(object, void | object);

查找所有相关对象

除了返回特定单独的对象,还有返回所有相关对象的函数,返回值为对象数组,如果没有找到则返回空数组。相关efun如下:

返回所有对象

函数

object *objects(void | string | function);

说明

返回游戏中的所有对象,如果指定参数为string类型或function类型,则可通过指定函数过滤对象。

示例

int main(object me, string arg)
{
    // 列出游戏中加载的所有食物对象
    printf("%O\n", objects("food"));
    // 列出游戏中所有复制对象
    printf("%O\n", objects((:clonep:)));
    // 列出游戏中所有非复制对象
    printf("%O\n", objects((:!clonep($1):)))
    return 1;
}

int food(object ob)
{
    return ob->is_food();
}

返回所有生物对象

函数

object *livings();

说明

返回游戏中的所有生物对象。

返回所有玩家对象

函数

object *users();

说明

返回游戏中所有玩家对象。

更新中……

object *all_inventory(object | void);
object *all_previous_objects();
object *children(string);
object *deep_inventory(object | object * | function, void | function);
object *get_garbage();
object *heart_beats();
object *named_livings();
京ICP备13031296号-4