详谈add_action()及其BUG
2021/4/7 11:27:29
几年前,add_action()的当机BUG是令众多巫师极为头痛的事情,如今各显神通,有
从MUDOS上解决,有从MUDLIB里调整。基本上已经看不到这种问题了。但是,如果未能了
解这个BUG的产生原理,那么还有可能在其它的很多地方再次产生各种各样的新BUG,结
合本人的摸索感受,试图全面介绍一下这方面的知识。

  首先我们来了解一下MUD对玩家输入信息的处理流程。玩家在客户端的指令行里输入
一些或长或短的字符后,系统接收到之后首先会调用在/feature/目录下的alias.c里的p
rocess_input(string str)函数
进行预处理。而那些字符也就是参数str。
(例一:玩家输入gall str==gall
 例二:玩家输入c 我要go str==我要go
 例三:玩家输入out  str==out
 例四:玩家输入kill llm str==kill llm)
  这个函数首先要对玩家的信息进行一些过滤判断,例如对于连续重复指令方面的判
断呀之类的,主要是对机器人的限制。然后就是调用玩家自己设定的alias以及系统设定
的alias(主要由/adm/daemons/下的aliasd.c定义)看看str里面是否有事先设定的alias
,有的话就要转换成原先真正的指令,最后返回
这个经过处理过的新的字符串str。
(例一:gall 经检查发现与玩家设定gall==get all,因此str==get all
例二:c 我要go 经检查发现玩家设定c==chat,因此str==chat 我要go
例三:out 检查没发现alias,因此out==out
 例四:kill llm 检查后没发现alias,因此str==kill llm )

  在玩家进入MUD之后,连线程序logind.c在成功创造玩家的身体之后,会调用一个函
数enable_player(),这个函数原型是在/feature/command.c里。该函数首先调用一个外
部函数enable_commands(),允许它使用 add_action()所加入的命令。然后就add_actio
n("command_hook", "", 1);
  add_action()这是一个外部函数,格式如add_action(A,B,C);就是表示如果玩家输
入指令第一个空格之前的单词与B相同的话,就是调用函数A,后面的参数C一般用不着,
这里不细讲了。那么我们看看这里的就表示,如果玩家输入的第一个单词是"",其实就
是所有的指令都符合这个条件的,那么就会调用到
函数command_hook()。而command_hook()函数就是在command.c里。str如果超过一个单
词,也就是有空格,就会分成第一个为verb,后面的为arg。开始按顺序判断verb是否是
方向、固定指令、emote动作、频道指令,如果是的话,就会把arg作为相应的参数传入
。如果都不是,就会返回0,也就是出现“什麽”的
字样。
(例一:str==get all,get为一固定指令,调用get.c->main()参数是"all"
例二:str==chat 我要go,chat为频道名,调用channeld.c里的do_chat,
  参数arg是"我要go"
例三:str==out,玩家所在场景发现有名叫out的出口,因此调用go.c->main()
  参数arg是"out"
 例四:str==kill llm,kill是一固定指令,调kill.c->main(),arg是"llm" )

  以上是MUD处理信息的经过。
  因此,MUD里所有的指令都是通过add_action()来实现的。而add_action()可以增加
相同名称的指令,如果指令相同,则后加的会先执行,请注意这里,并不是说后加的“
覆盖”先加的,而是“先执行”。关于一个同样的动作单词就可以有好几层的add_actio
n。那么在上一层调用的函数如果是返回0的情况下,系统会自动再去执行下一层的add_a
ction()调用的函数,如果是其中任意一层返回是1,就表示到此中止,不会再执行下一
层的add_action(),关于这一点特性可以灵活地使用。比如一个kill指令,本身通过com
mand_hook已经加了一个,有的房间里再次调用一个add_action("do_kill","kill"),后
来进来一个NPC,NPC身上也带有一个新的add_action("do_kill","kill"),那么

下一页
返回列表
返回首页
©2024 MUD游戏网_文字mud 电脑版
Powered by iwms