人物触发其他人物执行脚本,指一名角色执行操作后,服务端脚本捕捉该事件,让指定目标玩家执行对应脚本逻辑,常见场景包含对玩家使用物品\(LEVEL>、<\)点击玩家\(LEVEL>、<\)组队触发\(LEVEL>、<\)交易触发\(LEVEL>、<\)选中目标释放技能,GOM\(LEVEL>、<\)GEE\(LEVEL>、<\)3K引擎在命令语法与对象获取方式上存在区别,编写前确认引擎版本,避免命令不识别导致脚本失效。
首先理清脚本执行主体的区别,脚本默认由触发者也就是A角色运行,若要让B角色执行代码,不能直接在A的#ACT段写逻辑,需要使用引擎提供的角色对象调用命令,切换执行对象到目标玩家,或者把脚本指令发送到目标玩家的执行队列。两种实现思路,第一种是直接切换脚本执行者,第二种是调用目标角色标签执行外部脚本段,不同引擎的命令写法不通用。
3K引擎人物互触脚本基础写法,以对目标玩家双击物品触发为例,物品DB内设置AniCount编号,QFunction-0.txt捕捉[@OnUseItem]事件。事件内先判断是否选中玩家目标,使用HAVEHUMANTARGET判断是否存在玩家对象,获取目标角色名称存入变量,HUMANTARGETNAME S1,S1就是B角色名字。切换执行对象命令HUMANSCRIPT S1,切换之后后面#ACT内所有指令都会由S1对应的B角色执行。基础示例,[@OnUseItem]
#IF
HAVEHUMANTARGET
ISADMIN = 0
#ACT
HUMANTARGETNAME S1
HUMANSCRIPT S1
SENDMSG 6 你被其他玩家触发脚本指令
CHANGEHP -200
BREAK
#ELSEACT
SENDMSG 6 没有选中玩家目标
BREAK
这段脚本由A双击物品触发,HUMANSCRIPT切换执行主体为B,SENDMSG提示信息和扣血动作都会作用在B角色身上。切换完成后如果需要切回A角色执行后续逻辑,需要再次调用HUMANSCRIPT,参数改为触发者自身变量S0。
GOM引擎对应的实现方式,GOM没有HUMANSCRIPT,使用H.CALL命令调用目标玩家执行脚本段,或者使用EXECUTEHUMAN命令向目标玩家发送脚本。[@OnUseItem]
#IF
HAVEHUMANTARGET
#ACT
HUMANTARGETNAME S1
EXECUTEHUMAN S1 @TargetRun
BREAK
[@TargetRun]
#ACT
SENDMSG 6 你收到来自其他玩家的脚本触发
CHANGEGOLD 1000
BREAK
EXECUTEHUMAN的作用是在目标玩家S1的上下文运行[@TargetRun]脚本段,变量\(LEVEL>、<\)属性读取全部以B角色为准,不会读取A角色的属性。注意EXECUTEHUMAN属于异步调用,主脚本不会等待目标脚本执行完毕,适合不需要同步返回结果的功能。如果需要同步等待目标执行完成,使用H.CALL,H.CALL S1 @TargetRun,主脚本会暂停,直到目标角色脚本运行结束再继续向下执行。
GEE引擎语法接近GOM,EXECUTEHUMAN同样支持,额外增加H.RUN命令,可直接传递参数给目标脚本段。[@OnUseItem]
#IF
HAVEHUMANTARGET
#ACT
HUMANTARGETNAME S1
H.RUN S1 @TargetRun <$\(USERNAME>
BREAK
[@TargetRun]
#ACT
SENDMSG 6 玩家<\)$PARAM(1)>对你执行了交互脚本
BREAK
参数传递可以把触发者A的名字\(LEVEL>、<\)等级\(LEVEL>、<\)地图编号传给B的脚本,用于日志记录或者判定权限。
常用触发事件列表,除双击物品外还有其他人物交互入口。[@OnClickHuman]点击玩家触发,点击B角色,A作为触发者,适合NPC点击玩家\(LEVEL>、<\)人物直接点击人物交互。[@OnTargetSkill]技能命中玩家,A释放技能命中B,可用来做技能附加效果,比如命中后给目标加buff\(LEVEL>、<\)扣金币\(LEVEL>、<\)标记状态。[@OnGroupAdd]加入队伍,A邀请B入队,触发后给全队发放临时增益。[@OnTradeStart]开启交易,A发起和B的交易,可做交易前校验,限制特定装备不能交易。[@OnTradeSuccess]交易成功完成,交易结束后执行脚本,记录交易数据或者扣除交易税费。
权限与状态判定条件,脚本执行前增加校验,防止功能被滥用。CHECKISADMIN,判断触发者是否管理员,管理员可单独放行或者拦截。CHECKHUMANSAMEGROUP,判断A和B是否在同一个队伍。CHECKHUMANDIST,判断两人之间格子距离,超出距离禁止触发,防止跨地图远程调用。CHECKHUMANONHORSE,判断目标是否骑马,骑马状态下禁止执行脚本。CHECKHUMANISDEAD,判断目标角色是否死亡,死亡角色无法执行部分指令,需要提前拦截。CHECKMAPNAME,判断双方所在地图,限制只能在指定地图使用该交互功能。
变量隔离是重点,A角色的局部变量S1\(LEVEL>、<\)S2,和B角色脚本内局部变量相互独立。当使用EXECUTEHUMAN或者HUMANSCRIPT切换主体后,读取<$LEVEL>\(LEVEL>、<\)<$HP>这类内置变量,读取的是当前执行主体也就是B的数据,不再是A的数据。如果需要在B的脚本里获取A角色信息,必须提前把A的名字\(LEVEL>、<\)等级存入全局变量或者通过参数传递,不能直接在目标脚本读取A的内置变量。
限制与异常处理,目标角色离线时调用人物执行脚本,命令会直接失效,不会报错,需要增加CHECKHUMANONLINE S1,判断目标是否在线,离线直接返回提示。目标角色处于安全区\(LEVEL>、<\)战斗状态\(LEVEL>、<\)挂机状态,可增加对应的条件判断,按需拦截。部分指令存在执行限制,目标角色在脱机\(LEVEL>、<\)小退加载界面时,部分人物属性修改指令无法生效。不要高频循环调用EXECUTEHUMAN,短时间大量触发会增加服务端脚本线程压力,出现卡顿或者指令丢失。
高级扩展用法,多人批量触发,遍历队伍内所有队员,逐个调用EXECUTEHUMAN,实现一人操作全队执行脚本。玩家PK命中触发,在[@OnTargetSkill]内获取被攻击玩家名称,调用脚本给攻击者和被攻击者增加标记,记录PK计时。玩家对玩家使用道具传送,A对B使用传送符,切换B为执行主体,执行MAPMOVE命令传送B到指定坐标。玩家之间互相标记,触发后给目标角色添加人物变量,用来记录A和B之间的交互次数,设置冷却时间,短时间内重复触发不生效。
调试方法,修改脚本后,在M2内重载脚本文件,不需要重启服务端。测试时分别测试目标在线\(LEVEL>、<\)离线\(LEVEL>、<\)死亡\(LEVEL>、<\)不同地图\(LEVEL>、<\)超出距离等场景,查看M2日志窗口,脚本执行失败会打印错误信息,比如角色不存在\(LEVEL>、<\)脚本段未定义\(LEVEL>、<\)命令不识别。日志内可以查看变量取值,确认目标角色名称是否正确获取。编写脚本尽量分步测试,先实现基础触发,再叠加判定条件,一次性增加大量逻辑会提高排错难度。
编写脚本注意事项,角色名称变量不能包含特殊符号,玩家名称带空格\(LEVEL>、<\)特殊字符时,部分引擎读取HUMANTARGETNAME会出现截断,导致调用失败。脚本内所有数字参数使用半角字符,中文全角符号会造成脚本解析失败。人物交互脚本属于跨角色调用,部分引擎不支持在目标脚本内执行MAPMOVE\(LEVEL>、<\)CHANGEMAP等地图跳转指令,不同引擎限制不同,需要单独测试。全局变量多玩家共用,跨角色交互尽量使用人物私有变量,避免多个玩家同时触发时变量互相覆盖冲突。调试稳定后,保存脚本文件备份,后续修改前保留旧版本,方便回滚。
传奇引擎人物交互触发,A角色动作唤起B角色执行脚本的编写与调用方法
来源:
作者:
点击:

