在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()的判断。但是这个函数的作用很强大,用的也比较多。此函数第一个参数可以是object或string类型,第二个参数可以省略或为object类型,不同参数类型的使用是不同的,说明如下:
- 如果第一个参数是字符串
str,第二个参数是对象,则在指定对象中查找并返回id(str)返回值为1的对象;如果第二个参数省略,则在当前对象中或对象所在环境中查找; - 如果第一个参数是对象
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();