传奇 第六期 实战 GM工具

image.png

这是一个非常详细的《传奇》GM工具开发教学记录,涵盖了从基础功能到高级集成的多个层面。下面我将内容进行梳理、总结,并补充一些关键点,使其更易于理解和实践。

课程核心内容梳理

本次课程的核心是制作一个功能强大、可扩展的GM管理工具,重点在于理解变量传递多级脚本以及TXT脚本与Lua脚本的交互


第一部分:基础GM功能(纯TXT脚本实现)

这部分使用游戏内的NPC脚本语言实现,不依赖Lua,通用性极强。

1. 界面创建与布局

  • 创建NPC对话框:在 Merchant.txt中定义一个新的NPC,用于打开GM工具界面。
  • 前端界面设计:使用Cocos引擎的界面描述语法创建对话框,包含按钮、输入框等元素。
  • 关键技巧:提取公共样式(如按钮位置、大小)到变量中,实现代码复用,类似于“提取公因式”。

2. 核心功能一:查询与修改变量

  • 功能:输入玩家名,查询或修改该玩家的变量(如元宝、等级)。

  • 实现关键

    • 使用 INPUT框获取玩家名字。
    • 使用 CHECKONLINE检测玩家是否在线。
    • 使用 GetHumVarSetHumVar命令进行变量的读取和设置。
    • 通过 goto语句实现界面跳转和状态刷新。

3. 核心功能二:玩家位置操作(理解多级脚本)

  • 功能一:传送到玩家身边

    • 逻辑:获取目标玩家的坐标(GetHumWord),然后让自己移动过去(MapMove)。

    • 代码示例:

      [@传送到他]
      #IF
      CHECKONLINE <$STR(S$查询玩家名)>
      #ACT
      GetHumWord <$STR(S$查询玩家名)> <$STR(S$临时地图)> <$STR(S$临时X)> <$STR(S$临时Y)>
      MapMove <$STR(S$临时地图)> <$STR(S$临时X)> <$STR(S$临时Y)>
      break
      
  • 功能二:将玩家拉到身边

    • 逻辑:获取自己的坐标,然后设置目标玩家的坐标(SetHumWord)。

    • 代码示例:

      [@拉他过来]
      #IF
      CHECKONLINE <$STR(S$查询玩家名)>
      #ACT
      GetMyPos <$STR(S$我的地图)> <$STR(S$我的X)> <$STR(S$我的Y)>
      SetHumWord <$STR(S$查询玩家名)> <$STR(S$我的地图)> <$STR(S$我的X)> <$STR(S$我的Y)>
      break
      
  • 多级脚本精髓:在上述代码中,<$STR(S$查询玩家名)>这个变量在多个标签间传递。要清晰理解每一步操作时,变量是属于“GM自己”还是“目标玩家”。


第二部分:高级功能(TXT与Lua集成)

这部分实现了更强大、更灵活的功能,需要引擎支持Lua脚本。

1. 超级命令行

  • 目标:在游戏内输入框直接执行复杂的TXT脚本命令,无需修改 QFunction-0.txt并重载服务器。

  • 实现原理

    1. MapEvent.txt中声明一个自定义命令(如 LuaGm)。
    2. 当输入指定命令时,引擎会调用 QFunction-0.txt中对应的标签(如 [@LuaGm])。
    3. [@LuaGm]标签内,调用一个Lua函数,并将输入框的参数传递过去。
    4. Lua函数负责解析参数并执行相应的TXT脚本命令(如 gotochangelevel等)。
  • 强大之处:实现了“在线脚本执行器”,可以动态执行几乎所有TXT脚本功能,极大提升调试和运营效率。

2. 扩展功能示例:检测玩家网络延迟

  • 目标:获取指定玩家的网络延迟情况。

  • 实现原理

    1. TXT端:GM点击按钮,通过 SENDMESSAGE协议号(如1001)向目标玩家的客户端发送一个指令。
    2. 客户端Lua:目标玩家的客户端收到协议号1001的消息后,执行一个Lua函数。
    3. 客户端操作:该Lua函数调用系统命令(如 ping -n 4 www.qq.com),将结果写入一个临时文件。
    4. 数据回传:Lua函数读取文件结果,将其通过另一个协议号发回给服务器。
    5. TXT端显示:服务器收到回传的数据后,在GM的对话框里显示出来。
  • 思维扩展:此原理可广泛应用于反外挂(检测进程列表)、获取客户端信息等场景。


第三部分:实战难点解析(通过UID查找玩家)

  • 问题:在某些系统回调(如行会踢人)中,只提供了玩家的UID,但需要知道其名字才能进行后续操作。TXT脚本没有直接通过UID查名字的命令。

  • 解决方案

    1. TXT触发:在行会踢人的触发脚本(QFunction-0.txt[@GuildDeleteMember])中,获取被踢玩家的UID(%p1)。

    2. 调用Lua:将UID作为参数,调用一个自定义的Lua函数。

    3. Lua逻辑

      • 获取行会对象。
      • 遍历行会所有成员名单。
      • 通过成员名字,获取其玩家对象。
      • 对比玩家对象的UID与传入的UID。
      • 如果匹配,则返回该玩家的名字。
    4. 结果返回:TXT脚本获得名字后,即可进行公告、记录等操作。

  • 总结:对于T脚本难以处理或无法处理的复杂逻辑(遍历、对比),交给Lua来完成是最佳实践。


课程总结与建议

  1. 打好TXT基础:GM工具的核心是对游戏指令的熟练运用。务必掌握变量、检测、执行这一套流程。
  2. 理解交互逻辑:明确TXT脚本是“服务端逻辑”,客户端Lua是“客户端逻辑”,两者通过“协议号”进行通信。理解这一点是实现高级功能的关键。
  3. 模块化思想:将通用功能(如“查询玩家是否在线”)写成独立的标签或Lua函数,多次调用,使代码清晰易维护。
  4. 安全性:此类强大工具务必做好权限校验,防止普通玩家滥用。
  5. 循序渐进:先实现纯TXT的简单功能,再尝试TXT与Lua的简单交互,最后攻克复杂功能。

这份教学记录包含了非常宝贵的实战经验,建议结合实际操作,从简单的功能开始模仿和练习,逐步掌握整个GM工具的开发思路。

课程入口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

举报

改内容来自
开发实战
进入
快速回复 返回顶部 返回列表