|
在Zmud时代,几乎没有模块化的概念,Zscript没有提供
这方面的任何支持,包括函数,过程,内部变量都没有,也
就没有模块化可言,那时候我实现模块化是用alias来实现的,
但是alias有许多问题,对alias无法控制,传入参数只能通过
%1,%2等来实现,很不直观,alias执行之后输出很成问题。
Zmud把alias里面的东西都当作命令来执行了,总是回显很多
'>'换行。
Cmud时代终于有了函数,过程和内部变量这些概念。函数
就是#function,过程就是#event,内部变量就是#local或者
直接用$var赋值就可以,这里说一个小技巧,用内部变量之前
最好对$var=""或者$var=0进行初始化然后才接受函数返回值,
否则有可能会出现赋值失败的问题,这个用多了应该都能知道。
这个问题不知道是Cmud本身的Bug还是别的什么。由于无法对
Com Object进行初始化,所以内部变量无法创建Com object或
者说我没找到方法,只能使用全局变量来创建。内部变量的问
题就到这里为止了,下面进入正题。
Cmud的#function的正确使用场合是计算,里面不能包含
给服务器的命令。要给服务器命令使用#event来处理。#function
就是处理你输入参数,我对参数进行处理,返回结果给你或者
给全局变量进行修改,大体就是这些,没有更多了。举一个例
子:
#function compare_room($room,$targetname,$targetdirect) {
#local $detect_flag,$detect
$detect_flag=0
#local $detect
$detect=1
#if $targetname=$room.name {
$detect=0
#loop %numitems( $targetdirect) {
#if %ismember( %item( $targetdirect, %i), $room.direct)=0 {
$detect=1
}
}
}
#if ($detect=0&&$detect_flag=0) {
$detect_flag=1
#return 1
}
#return -1}
这个例子是一个比较房间是否正确的函数,输入$room是通过
数据库取出来的房间信息,是一个database record结构,里面
包含name=房间名称,id=房间号,direct=方向,其他暂时不说。
$targetname和$targetdirect是用触发器抓下来的房间名称和
房间的方向。这个函数在比较成功的情况下返回1,比较失败
返回-1。使用函数可以让负责计算的部分代码更通用。不用
相似的代码要写很多遍。
Cmud的过程也就是不需要返回值的代码是通过Event来
实现的。#event命令是用来创建事件的,也可以通过package
Editor窗口来创建事件。#raiseevent是调用事件的命令。
#raiseevent par1 par2 ...来传入参数。事件包括系统事件
和用户事件两种,系统时间查看#event命令的帮助就详细列
出系统已经提供的事件,你只要实现事件本身的逻辑,就可
以在系统发出事件的时候自动执行。用户事件就需要自己定
义了。事件是和Trigger类似的一个概念,里面可以放逻辑
判断,命令等等,可以传入参数,唯一区别就是事件不需要
触发条件,他的触发途径就是#raiseevent命令。我举一个
事件的简单例子:
#event hbWalk($direct,$mode) {
#if (@target_pathid<@locate_pathid&&$mode=1) {
#SECTION SingleThread {
target_arr_flag=1
locate_pathid=@target_pathid
}
#t- walk_room_check
#t- hbWalk
#unt check_locate
#alarm quest_search_huoji {+3} {set action 伙计搜索阶段一}
} {
#show $direct
#SWITCH ($mode=0) {
#exec gan che to $direct
} ($mode=1) {
#exec $direct
} {
#win hubiao 护镖任务:行走模式:$mode,有问题!行走命令:$direct
}
}
}
这是一个我自己开发的护镖行走事件,行走的时候输入方向和模式
就可以自动执行行走命令。模式0是确定的方向,1是特殊命令。
比如#raiseevent hbWalk north 0镖车就会向北走。再比如
#raiseevent hbWalk "yell boat" 1就会叫渡船。
如果你在cmud开发的时候能够熟练使用函数和事件,你的代码
可维护性就会提高到一个新的层级。另外还有一个命令是#varfunc
就是Zmud模式的函数,可以实现一些简单计算,比如大小值比较之
类,使用的相对比较少。可以参考帮助系统查询具体使用方法。 |
评分
-
查看全部评分
|