用户工具

站点工具


cmud:hints:cmud的代码模块化处理

Cmud的代码模块化处理

出品人:Seagate

原帖地址:Cmud的代码模块化处理

在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模式的函数,可以实现一些简单计算,比如大小值比较之 类,使用的相对比较少。可以参考帮助系统查询具体使用方法。

cmud/hints/cmud的代码模块化处理.txt · 最后更改: 2020/08/15 21:40 (外部编辑)