|
|
本帖最后由 chenzhouch2 于 2026-10-3 03:47 PM 编辑
CZ 系列 Lua 函数手册
适用于 Wow 3.3.5(12340)客户端 · 共 67 个 Lua 函数
统一 CZ 前缀、无下划线。DLL 放游戏根目录被动加载,进入游戏后自动注册,所有函数全局可调。
DLL 自带一个控制台窗口(见「十二、内嵌控制台界面」):进游戏自动出现、/reload 后自动重建,不需要任何额外文件。
2026年10月3号更新内容:
函数 59 → 67 个。★ 新增「自动寻路」:跑的是真实可行走路径,屏幕上有路径线,卡住会自己绕出来。
新增「自动钓鱼」「天气」两行界面开关;界面设置改成按角色记住,换号、重启、/reload 都不用重勾。
修了一大批地形卡墙问题,骑坐骑 / 飞行时寻路不再一顿一顿。后续我准备更新几个用我写的自定义接口来适配的插件。
上次发布(9月17号)之后的改动:
9-18 新增「天气」;修正转身 / 朝向偏 90° 的问题
9-19 新增 CZtype(查单位类型);CZInfo 能认可采集物;新增「自动钓鱼」(可填鱼漂名);施法接口完善
9-20 ~ 9-22 ★ 新增自动寻路:路径线绘制、卡住自救(跳 → 扇形侧移 → 后退);连续修卡锐角墙 / 卡凹槽 / 走出凹槽又被拉回 / 拐角拐不出来 / 墙的碰撞体比看着高
9-23 CZMon / CZAoe 排除小动物;CZLookat 改为走游戏自带的转身(服务器能看到、不打断读条)
9-24 界面设置按角色记住;寻路接口精简为 4 个;修若干界面问题
9-25 寻路推进改为按移动速度自适应(跑 / 骑 100% / 骑 280% / 飞 310% 都不再停顿)
10-3 修「个别情况下进游戏完全没有界面」;重新打包
通用约定
1. GUID / token 双收
所有收“GUID 串”参数的函数(枚举类除外,它们收的是范围数字),同时接受单位 token:
- CZHp("target") -- token 写法
- CZHp(UnitGUID("target")) -- GUID 串写法,两者等价
复制代码
判别规则:参数含 0x 前缀或全为十六进制字符 → 按 GUID 解析;否则按 token 解析。所有 token(player、target、focus、mouseover、party1、raid12 等)都含非十六进制字符,不会误判。解析失败一律按“对象不存在”处理。
2. GUID 格式
入参十六进制串,带 0x 前缀、裸十六进制、大小写均可,例如 0x0300000002A4BC12。所有枚举函数返回值与客户端 UnitGUID 格式完全一致(0x + 16 位大写十六进制),可直接回传。
3. 编码
对象名(CZName 返回值、CZFish 入参等)为 UTF-8 字节串,游戏内中文参数直接写即可。
4. 参数省略
GUID 参数不填时各函数有自己的默认值(多为当前目标),个别必填 / 返回 nil 的在函数说明中单独标注。
一、坐标与移动
CZGetPos 获取单位坐标与朝向
参数:unit:string,可选,单位 token 或 GUID 串(规则同上)
返回值:x, y, z, r, mapID 共 5 个值;无参数或取不到对象时无返回值
- local x, y, z, r, map = CZGetPos("player")
- local tx, ty, tz = CZGetPos(UnitGUID("target"))
复制代码
CZMoveTo 命令角色跑向指定坐标(会被服务器校验路径)
参数:x, y, z(float,目的地坐标) 返回值:无
- CZMoveTo(1234.5, 567.8, 91.2)
复制代码
CZGoTo 瞬移到指定坐标(不走移动指令)
参数:x, y, z(float,目的地坐标) 返回值:无
CZRGoTo 瞬移到指定坐标并设朝向
参数:x, y, z:float,目的地坐标;r:float,朝向角(前方向量 (cos r, sin r),与客户端原生转向差 90°)
返回值:无
CZLookat 原地转身面朝指定点 / 对象
参数(二选一):x, y:float,目标点坐标(两参调用);unit:string,token 或 GUID 串(单参调用),转向该对象所在点
返回值:无
说明:转身走的是游戏自己的转身路径(和鼠标右键转身同一条)—— 服务器能看到、不会打断读条。角度约定和 CZGetPos 返回的 r 一致,前方向量为 (cos r, sin r)。
- CZLookat("target") -- 一步面朝当前目标
- CZLookat(UnitGUID("target"))
- local x, y = CZGetPos("target"); CZLookat(x, y)
复制代码
CZClickGo 瞬移到鼠标最后一次点击的目的地
参数:无 返回值:无
CZJump 跳跃
参数:无 返回值:无
二、目标枚举
枚举类函数收范围数字(int,码数),返回 GUID 串表(UnitGUID 同款格式)。
CZMon 范围内所有可攻击单位(怪物、敌对玩家)的 GUID,小动物不计入(兔子 / 羊 / 蟑螂这类打了没收益的)
参数:Range,不填默认 30,负数取 30
返回值:table { ["1"]="0x…", ["2"]="0x…", … };范围内没有时返回 nil
- local t = CZMon(35)
- if t then for k, v in pairs(t) do print(v, CZName(v)) end end
复制代码
CZAoe 以一个可攻击目标为圆心,统计它周围范围内其他可攻击单位的数量(不含圆心自身,不含小动物)
参数(注意顺序:距离在前):Range:int,第一位,不填默认 30,负数取 30;GUID:string,第二位,可选,圆心目标(token / GUID 串均可),不填默认当前目标
返回值:int,范围内其他可攻击单位数量
- local n = CZAoe(10) -- 当前目标 10 码内还有几个可攻击
- local n2 = CZAoe(15, "focus") -- 指定 focus 为圆心
- local n3 = CZAoe(30, "player") -- 以自己为圆心数周围可攻击数
复制代码
CZNpc 范围内所有不可攻击单位(友方 NPC、队友等)的 GUID
参数:Range,不填默认 30,<=0 取 30
返回值:table,同 CZMon 格式;没有时返回 nil
CZTotem 范围内属于自己的单位(宠物、图腾等)
参数:无 返回值:table,GUID 数组;没有时返回空表
CZGather 当前地图所有可采集物(矿、草、宝箱等)的 GUID
参数:无 返回值:table,GUID 数组(无距离过滤,配合 CZDist 自行筛选)
三、单位信息
CZInfo 一个对象的完整信息打包表
参数:GUID:string,token / GUID 串均可;不填返回 nil(不默认目标)
返回值:table,对象不存在时返回 nil
| 字段 | 类型 | 含义 | | name | string | 对象名(UTF-8) | | hostile | int | 1=对玩家敌对(可攻击) | | dead | int | 1=已死亡(血量≤0 或带死亡标志) | | combat | int | 1=战斗中 | | lootable | int | 1=可拾取状态 | | hp / maxhp | int | 当前 / 最大生命值 | | dist | float | 与玩家直线距离(码) |
- local info = CZInfo("target")
- if info and info.hostile == 1 and info.dead == 0 then AttackTarget() end
复制代码
表里的字段是单位的(血量、战斗、拾取等);物件(宝箱 / 矿脉等)上这些字段没有意义,只取 name、dist 和 CZtype 即可。
CZtype 对象的类型名。单位返回生物类型(野兽 / 亡灵 / 机械 / 小动物 / 人型 / 龙类…),物件(可采集物等)返回物件类型(采集物 / 鱼群 / 门 / 集合石…)
参数:GUID,token / GUID 串均可;不填返回 nil(不默认目标)
返回值:string,类型名;参数取不到对象时返回 nil,对象没有类型(如玩家角色)时返回空串
- -- 站在矿槽旁列出附近的采集物:名字 + 类型
- local g = CZGather()
- for i = 1, #g do
- print(CZName(g[i]), CZtype(g[i])) -- 例: 铜矿脉 采集物
- end
复制代码
单位类型名(客户端本地化名字,和游戏里显示的完全一致):野兽 龙类 恶魔 元素 巨人 亡灵 人型 小动物 机械 未指定 图腾 非战斗宠物 气体云
物件类型名(共 36 项,与客户端顺序一致):
| 值 | 名字 | 值 | 名字 | 值 | 名字 | | 0 | 门 | 12 | 区域伤害 | 24 | 战场旗杆 | | 1 | 按钮 | 13 | 镜头 | 25 | 鱼群 | | 2 | 任务给予者 | 14 | 静态地图物件 | 26 | 旗帜掉落点 | | 3 | 采集物 | 15 | 移动运输工具 | 27 | 小游戏 | | 4 | 灵魂绑定者 | 16 | 决斗仲裁者 | 28 | 彩票亭 | | 5 | 通用装饰 | 17 | 钓鱼浮标节点 | 29 | 占领点 | | 6 | 陷阱 | 18 | 召唤仪式台 | 30 | 光环生成器 | | 7 | 椅子 | 19 | 邮箱 | 31 | 副本难度切换器 | | 8 | 法术焦点 | 20 | 拍卖行 | 32 | 理发椅 | | 9 | 铭文 | 21 | 守卫岗哨 | 33 | 可摧毁建筑 | | 10 | 万能可交互物 | 22 | 传送门 | 34 | 公会银行 | | 11 | 固定运输工具 | 23 | 集合石 | 35 | 活板门 |
矿脉 / 草药 / 宝箱 / 渔点容器这类可拾取物件大多都归在采集物(具体是哪种看名字或拾取内容);鱼群是渔点,钓鱼浮标节点是鱼漂。
CZHp / CZMaxHp 目标当前 / 最大血量
参数:GUID,token / GUID 串均可 返回值:int
CZName 目标名字
参数:GUID,token / GUID 串均可 返回值:string(UTF-8)
CZCombat 目标是否在战斗中
参数:GUID,token / GUID 串均可,不填默认当前目标
返回值:int,1 = 战斗中,0 = 未在战斗
CZLooting 目标是否正在拾取中
参数:GUID,token / GUID 串均可 返回值:int,1 = 拾取中
四、距离与视线
CZDist 两对象间直线距离(码)
参数:GUID1:string,token / GUID 串均可,不填默认自己;GUID2:string,token / GUID 串均可,不填默认当前目标
- CZDist("player", "target") -- 自己到目标
- CZDist("focus") -- 自己到 focus
复制代码
CZLos 目标是否在玩家视线内(自动按视高判定)。治疗用来判断队友是否卡视野
参数:GUID,token / GUID 串均可,不填默认当前目标
返回值:int,1 = 视线可达,0 = 被挡
CZLosHit 两点间视线检测,被挡时返回障碍物碰撞点。也常用来做垂直射线找脚下落点
参数:x1, y1, z1 → x2, y2, z2:起终点坐标(两点原样连线,不自动加视高;“人眼到人眼”自行 +1.3);flags:int,可选,一般不用填
返回值:los, hx, hy, hz, mask 共 5 个值
- los=1 可达(h* 为 0)
- los=0 被挡(h* = 碰撞点坐标,mask = 命中掩码)
- -- 垂直找脚下落点并瞬移(大跨度纵向贯穿,命中即落)
- local x, y, z = CZGetPos("player")
- local los, hx, hy, hz = CZLosHit(x + 3, y, z - 10000, x + 3, y, z + 10000)
- if los == 0 then CZGoTo(hx, hy, hz) end
复制代码
五、施法、光环与面向
CZCast 释放技能(需等 GCD 转完,比宏稍慢)
参数:SpellID:int,技能 ID;GUID:string,token / GUID 串均可,不填默认当前目标
返回值:int,1 = 已提交,0 = 失败,-1 = 参数无效
CZBuff 刷新目标光环缓存(后续 CZBuff* 系列都读这份缓存),每帧调用一次即可
参数:GUID,token / GUID 串均可,不填默认当前目标
返回值:int,1 = 目标身上有光环,0 = 无
CZBuffTime / CZBuffCnt 目标身上指定技能 ID 光环的剩余时间 / 层数(任意施放者)
参数:SpellID:int,技能 ID;GUID:string,token / GUID 串均可,不填默认当前目标
返回值:剩余秒数(无时限 0,不存在 -1)/ 层数(不存在 -1)
CZBuffTimeTo / CZBuffCntTo 目标身上由指定施放者施加的光环剩余时间 / 层数
参数:SpellID:int;GUID:string,目标,token / GUID 串均可;CasterGUID:string,施放者,token / GUID 串均可,不填默认自己
- CZBuff("target")
- local t = CZBuffTimeTo(47813, "target", "player") -- 自己上的破甲还剩几秒
复制代码
CZFacing 玩家是否面向目标(0.95 弧度锥)。唯一的“面向判断”
参数:GUID,token / GUID 串均可,不填默认当前目标
返回值:int,1 = 已面向,0 = 未面向
- if CZFacing() == 0 then CZLookat("target") end
复制代码
CZBehind 自己是否在目标身后(目标 1.6 弧度正面锥之外)
参数:GUID,token / GUID 串均可,不填默认当前目标
返回值:int,1 = 在身后,0 = 不在
CZCastAt 对目标释放当前等待落点的法术(配合 SpellIsTargeting())
参数:GUID,token / GUID 串均可,不填默认当前目标 返回值:无
- if SpellIsTargeting() then CZCastAt() else BeeRun("/cast !枯萎凋零") end
复制代码
六、交互与选中
CZInteract 与对象交互(对话、开箱、采集、摸尸体等)
参数:GUID,token / GUID 串均可 返回值:int,1 = 已交互,0 = 参数无效或对象不存在
CZSelect 选中目标(采集物等无法选中的对象静默失败)
参数:GUID,token / GUID 串均可 返回值:int,1 = 调用已发出,0 = 参数无效
直接调用即可,不需要再用 CZC 包:
- CZSelect(UnitGUID("target"))
复制代码
返回 1 只代表调用已发出,采集物这类点不中的对象是静默失败,以游戏里的选中框为准。
CZLoot 拾取范围内可拾取的尸体,调用一次执行一次
参数:Range,不填默认 6(6 码是服务器拾取判定上限,再大服务器不认) 返回值:无
CZClick 模拟点击地形(移动需开启【界面】-【鼠标】-【点击移动】)
参数:x, y, z:float,地形坐标;type:int,1 左键(可在 AOE 施法等待时落地)/ 4 右键移动(默认)
返回值:无
CZClickObj 模拟点击指定对象(点击请求里带对象,服务端按对象处理,与按坐标点地形的 CZClick 语义不同)
参数:GUID:string,必填,token / GUID 串均可;type:int,1 左键(默认)/ 4 右键
返回值:无
CZFish 钓鱼收杆。扫描物件,指定名字的物件处于“上钩”状态时交互
参数:name,string,可选,物件名(UTF-8),不填默认 "鱼漂"
返回值:int,1 = 已交互,0 = 没找到上钩物件
- CZFish() -- 默认鱼漂
- CZFish("鱼票") -- 按名字匹配
复制代码
使用方法
- if BeeUnitCastSpellName("Player")=="钓鱼" then
- CZFish()
- else
- BeeRun("钓鱼")
- BeeUnitCastSpellDelay("钓鱼",1.5);
- end
复制代码
七、定时任务与脚本包裹
CZPost 提交一次性定时任务,到时运行指定宏,运行后自动销毁
参数:time:int,毫秒;macro:string,要运行的宏代码,多行用 \n 连接
- CZPost(61*1000, "/use 10")
- CZPost(61*1000, "/cast 死亡之愿
- /use 10")
复制代码
CZClear 取消所有定时任务
参数:无 返回值:无
CZC 包裹执行客户端限制的 API,不弹提示和警告;第二参传全局变量名可取回脚本执行后的变量值
参数:script:string,要执行的脚本;varname:string,可选,执行后返回该全局变量的字符串值
- CZC("CastSpellByName('攻击')")
- local name = CZC("name = UnitName('player')", "name")
复制代码
八、状态存取
跨脚本调用持久,DLL 重载后复位。CZSave / CZLoad 与 CZSaveG / CZLoadG 是相互独立的两套槽位。
CZSave / CZLoad 保存 / 读取一个 int 值
CZSaveG / CZLoadG 另一组独立的 int 槽位,常用于存时间戳做节流
- if time() - CZLoadG() >= 30 then
- DoSomething()
- CZSaveG(time())
- end
复制代码
九、窗口
CZFlash 游戏窗口不在前台时闪烁任务栏图标提醒
参数:无 返回值:无
十、开关类功能
以下功能用 on 参数开关,进游戏即生效,不用重载。
参数:on(非 0 = 开,0 = 关;不给参数按关处理)
返回值:number,1 = 切换成功,0 = 没切成(客户端版本不符,或这个功能已被别的工具改过)
说明:切换失败时不会出任何问题,只是没生效。开与关可以随时来回切。
| 函数 | 功能 | | CZWaterWalk(on) | 水上行走 | | CZWallClimb(on) | 爬墙 | | CZPassWall(on) | 穿墙 | | CZNoM2(on) | 穿物体 | | CZNoM2Fx(on) | 穿装饰 | | CZAirJump(on) | 空中跳跃 | | CZNoFall(on) | 无坠落伤害 | | CZAntiAFK(on) | 防止 AFK | | CZShowLevel(on) | 显示等级 | | CZTameInfo(on) | 显示驯服信息 |
关于「穿墙 / 穿物体 / 穿装饰」这三个:它们管的是一套东西 —— 穿墙管建筑、地形主体,穿物体管树、箱子、栅栏这类常规模型,穿装饰管带粒子发光的装饰物。打开之后画面里不会有任何东西消失,只是原本过不去的地方能穿过去了。
- CZWaterWalk(1) -- 开
- CZWaterWalk(0) -- 关
- print(CZAntiAFK(1)) -- 1
- print(CZPassWall(1)) -- 1(穿墙)
- CZNoM2(1) -- 穿物体
- CZNoM2Fx(1) -- 穿装饰
复制代码
CZPlane 传送至位面 —— 只把出站坐标的 Z(服务器 / 别人看到的那个 Z)加上一个固定偏移,X/Y 仍是你的真实位置。效果是「你自己屏幕上看正常站在地面,别人和服务器看到你整体上浮或下沉了偏移量」,可用来躲指向性技能、防被拉。
参数:on(1 开 / 0 关)、dz(偏移量,正数上浮、负数下沉;关时按 0 处理)
返回值:number,当前生效的偏移量
- CZPlane(1, -20) -- 开:别人看到的 Z = 真实 Z - 20
- CZPlane(1, 50) -- 改成上浮 50
- CZPlane(0) -- 关,恢复原样
复制代码
说明
- 偏移是恒定差值,不是固定坐标:站 z=10 填 -20,对方看到 -10;站 z=15,对方看到 -5。
- 服务端对 Z 可能有校验,先用小偏移(±20 量级)试。
- 开着的时候改 dz 立即生效,不用重编也不用退出游戏。
- CZPlane(0) 只是把偏移归零,不会关掉这个功能本身(下次调仍按新值生效)。
- 控制台窗口里有这一行(最后一行「传送至位面」):点行开 / 关,行尾显示当前偏移,右边的 - / + 每次调 5(默认 -20);开着的时候调数值立即生效。因为记录状态在 Lua,/reload 后回到默认值。
十一、其它开关与状态功能
以下功能用法与上一节相同,CZFollow 见单独说明。
CZFollow 跟随指定单位,不限队友关系(原版只能跟随队友)
参数:unit —— 单位 token("target" / "mouseover" / "raid1" …)或十六进制 GUID 串,规则与 CZGetPos / CZLookat 完全一致
返回值:number,1 = 跟随已生效,0 = 被客户端内部拒绝(状态不满足,静默失败),-1 = 参数不是有效单位或拿不到自己
- print(CZFollow("target")) -- 跟随当前目标(1 = 生效)
- CZFollow("0xF1300080A1B2C3D4") -- 跟随指定 GUID
- CZFollow("player") -- 自己跟随自己,客户端会拒绝(返回 0)
复制代码
说明
- 跟随是客户端移动指令:目标在你身边时看不出效果,先走开一段距离再调用,看角色是否自己走回去。
- 一旦用成功过,“跟随任何人”这个限制就一直是解开的,不用每次重新解。
CZFly 切换玩家的飞行 / 正常状态。菜单里的「防止坠落」就是靠它:瞬间切到飞行、0.1 秒后切回正常,正在下坠的状态会被清掉,持续坠落就被打断。
参数:on(非 0 = 飞行,0 = 正常)
返回值:number,1 = 已切换,0 = 拿不到玩家(还没进入世界)
- CZFly(1) -- 切到飞行状态
- CZFly(0) -- 切回正常
复制代码
说明
- 单独调它只是改状态,不给你真正的飞行能力;本工程目前只把它当防坠落的手段用。
CZWeather 强制天气 —— 手动指定晴 / 雨 / 雪 / 沙暴。不传参数就是只读,返回当前天气。
参数:type(可省略;0 晴 / 1 雨 / 2 雪 / 3 沙暴)、intensity(可省略,强度,默认 1 = 最大)
返回值:number,调用之后读到的当前天气 0~3;还没进入世界、天气管理器没建立时返回 -1
- CZWeather(1) -- 下雨
- CZWeather(2, 0.5) -- 下雪,强度一半
- print(CZWeather()) -- 只读:现在是什么天气
复制代码
说明
- 3.3.5 客户端没把天气开放给 Lua,这里是直接写客户端自己的天气管理器,所以表现和服务端下发的天气一致。
- 强度会被客户端夹到 0 ~ 1,传大于 1 的值和传 1 等价。
- 只管这一次:客户端自己的天气演算照旧,过一会儿天气可能又自己变回去。要一直保持就在需要时反复调。
- 控制台窗口里有这一行(「天气」):行尾 - / + 在晴 / 雨 / 雪 / 沙暴之间循环,开着的时候切换立即生效;取消勾选只是不再干预,天气交回游戏自己演算。
通用注意
- 仅适用于 3.3.5(12340)客户端。
- 与其它同类工具(如 Gagarin)同时使用时,同一个功能不要两边都开,否则可能崩游戏。同一时间只用一个。
十二、内嵌控制台界面
游戏里自带一个控制台窗口,进游戏自动出现,/reload 之后会自动重建,不需要任何额外文件。
最后六行
- 自动拾取:每 0.5 秒自动拾取一次身边 6 码内的尸体
- 自动钓鱼:全自动钓鱼。没在钓就抛竿,抛出去之后等上钩,上钩自动收杆,收完接着下一杆;中途被打断(移动 / 进战斗)会自己重抛。行尾有一个按钮写着鱼漂的物件名(默认「鱼漂」)—— 不同客户端叫法不一样时点它改,改完会被记住
- 防止坠落:检测到持续下坠时自动打断
- 传送至位面:CZPlane 的入口。这行除了开关,行尾还显示当前偏移,右边的 - / + 每次调 5(默认 -20,往上步进为 -15,即上浮方向);开着的时候点 - / + 立即生效
- 天气:手动指定天气(晴 / 雨 / 雪 / 沙暴)。行尾 - / + 循环切换,开着的时候切换立即生效;关掉之后不再干预,天气交回游戏自己演算
- 停止自动寻路:不是开关,是一颗急停按钮。点一下 = CZNavStop():掐掉当前这一段寻路 + 让角色站住,不记状态 —— 下次插件再发目标照常又开始走。行尾显示当前状态(空闲 / 行走中 / 已到达 / 算不出 / 卡住 / 不可用),每 0.5 秒刷一次。路径线跟着寻路走,行走中行尾会提示画线状态:无路径线 = 这台机器拿不到 D3D 设备(寻路不受影响)
前四行在面板隐藏或收起之后照常工作。
设置按角色记住:整套设置按角色存一份,进游戏建好窗口后自动读回来 —— 不用每次启动重勾一遍。包含 10 个字节补丁开关、自动拾取 / 自动钓鱼 / 防止坠落、传送至位面的开关与偏移、天气的开关与类型、鱼漂物件名、面板位置。点任意一行、按 - / +、改鱼漂名、拖完面板,都会立刻落盘,不需要手动保存。换角色各记各的;新角色从全关开始,不会悄悄替你打开什么。想全部关掉重来:/czreset。
文件放在 <游戏根目录>\CZUI\ 下,一个角色一个 .cfg,纯文本 —— 备份 / 改默认值 / 拷给别人都可以。游戏目录不可写时保存会失败,聊天框里提示一次。
右上角那个控件是「收起」,不是「关闭」:展开时它是右上角一条 10px 的横线,点一下面板缩成 20×20 的小方框(只剩底色 + 四边线 + 正中间一个 CZ 字样);再点这个小方框还原成完整菜单,并重新刷新每个勾。拖动要从标题那条空白区按左键(行本身是按钮,会吃掉点击);面板收起成小方块时点它是“还原”而不是拖动。
出问题看 CZERR:界面没建出来时,游戏里 print(CZERR) 会给出原因,正常情况下 CZERR 是 nil。
CZUI 显示控制台窗口;窗口不存在就新建(重复调用只是重新显示出来)
参数:无 返回值:无
- CZUI() -- 被收起或 /cz 隐藏之后重新打开
- /cz -- 斜杠命令:显示 / 隐藏 切换
复制代码
CZState 查某个功能开关当前是开是关
参数:number idx,与下表序号一致
返回值:number,1 = 已开启,0 = 已关闭,-1 = 读不到确定状态(客户端版本不符,或这个功能被别的工具改过)
| idx | 功能 | idx | 功能 | | 0 | 水上行走 | 6 | 显示驯服信息 | | 1 | 爬墙 | 7 | 跟随任何人 | | 2 | 空中跳跃 | 8 | 穿墙 | | 3 | 无坠落伤害 | 9 | 穿物体 | | 4 | 防止 AFK | 10 | 穿装饰 | | 5 | 显示等级 | | |
- print(CZState(0)) -- 水上行走现在是开是关
复制代码
说明
- 读的是实际生效状态,所以 /reload 之后界面显示的和实际生效的必然一致,不会出现「界面说关着、其实还开着」。
- 界面上的勾每次点击后也会回读一次:万一切换失败(版本不符等),勾选状态会自动弹回原样。
CZSaveCfg 把一段文本按 key 写进游戏目录。界面就是靠它把设置按角色存下来的,也可以拿它存自己插件的设置
参数:key(字符串,当文件名用)、text(字符串,原样覆盖写入)
返回值:number,1 = 写成功,0 = 没写成功(游戏目录不可写、key 非法等)
说明:文件落在 <游戏根目录>\CZUI\<key>.cfg,CZUI 目录不存在会自动创建。key 里的非法文件名字符会被换成 _,所以中文也能当 key;但两个不同的名字可能被换成一模一样的文件名而互相覆盖,要稳就自己先编成 ASCII 再传(界面用的是十六进制)。内容 DLL 不看、不校验,格式随你。
- CZSaveCfg("myset", "a=1|b=2")
复制代码
CZLoadCfg 把 CZSaveCfg 写的那段文本读回来
参数:key(字符串) 返回值:string = 文件内容;nil = 文件不存在或读不出来
- local s = CZLoadCfg("myset")
- if s then print(s) end
复制代码
十三、自动寻路
沿导航网自动跑图。跑的是真实可行走路径,不是直线硬冲。
导航数据下载:mmaps(各张地图的导航数据)
链接:https://pan.baidu.com/s/1KayBjn4Ws13UFixZW1zS3A 提取码:6666
完整解压到游戏根目录的 mmaps 里面。如果没有mmaps目录,就自己手动创建一个。
对外只有 4 个函数:CZNavGo(开始)/ CZNavTick(状态机驱动)/ CZNavState(状态查询)/ CZNavStop(停止)。
默认就能用:不需要先在界面上打开什么。想中途停下,点控制台那一行「停止自动寻路」(= CZNavStop())。
最重要的约定:发起寻路后,必须每帧调一次 CZNavTick(),否则不会走。
- local drv = CreateFrame("Frame"); drv:Hide()
- drv:SetScript("OnUpdate", function()
- if CZNavTick() ~= 1 then ... end -- 0空闲 1移动中 2到达 3算不出 4卡住 5环境不可用
- end)
复制代码
路径线
路径线是寻路的附属显示,没有单独开关:DLL 在第一次真的要走路时才去挂渲染钩子,把正在走的那条路径在世界里画成一条折线(跟着地形起伏,从角色脚下一直连到终点),终点一个绿十字。
- 线是连续的一条:相邻两个路点之间都有线段相连。末点不等于终点,说明这一轮只算到中途。
- 钩子装不上(这台机器拿不到 D3D 设备)时寻路照走,只是没有线。这时 CZNavState() 的第 8 个返回值是 0,控制台「停止自动寻路」行尾会多出「无路径线」。
- 全程只读客户端,不改任何东西;算得不准只影响画出来的线,不影响寻路本身。
CZNavGo 开始沿导航网跑向指定坐标。起终点都会自动吸附到最近的可走点(终点常落在山里,会被吸到最近能站的地方)
参数:x, y, z(float,目的地坐标);mapId(number,可省略,默认当前地图)
返回值:number
| 返回 | 含义 | 建议处理 | | 1 | 已开始移动 | 之后每帧调 CZNavTick() | | 0 | 环境不可用(没 DLL / 该图没数据 / 还没进世界) | 别走,提示用户 | | -1 | 参数不足(少于 3 个数字参数) | 不处理 | | -2 | 算不出路径(起终点在导航网上不连通,例如目标在湖心岛、暴风城内城被城墙隔断) | 换个目标点 | | -3 | 目标在别的地图(mapId 与当前地图不同) | 先把人弄到目标图再调 |
- local r = CZNavGo(-11000, 1500, -2)
- if r == 1 then
- -- 开始走了,记得每帧调 CZNavTick()
- else
- print("没走成,原因:" .. r)
- end
复制代码
说明:不会自动结束上一段寻路 —— 重复调用就是换目标。长距离会自动「边走边重算」,跨整张大陆(实测 23400 码)也能到。中途换地图、连续算不出路径、卡住不动,都会自动停机。
CZNavTick 驱动寻路状态机一步。每帧都要调
参数:无
返回值:number
| 返回 | 含义 | | 0 | 没在寻路(空闲,或调过 CZNavStop) | | 1 | 移动中 —— 继续每帧调 | | 2 | 已到达(距吸附后的终点 ≤ 4 码),已自动停机 | | 3 | 算不出路径,已自动停机 | | 4 | 卡住不动(自救阶梯走完 6 级仍出不来),已自动停机 | | 5 | 环境不可用,已自动停机 |
- local st = CZNavTick()
- if st == 2 then print("到了") elseif st ~= 1 then print("停了:" .. st) end
复制代码
说明
- 没在寻路时调用它没有副作用(恒返回 0),可以放心每帧调。
- 卡住时会发生什么:1.2 秒内位移不足 1 码就算卡住,然后按阶梯自救 —— 原地跳一下 → 前左 45° → 前右 45° → 纯左 → 纯右 → 后退 4 码,每一级挪完都重算一次路径。6 级全走完还出不来才返回 4,整套大概十几秒。
- 为什么要自救:台阶 / 门槛这类地方导航网认为能走、客户端却爬不上去,这时光重算路径毫无用处(起点没变,算出来还是同一条),必须先把人挪开。
- 移动指令不是定时重发的:只有目标点变了、或者人明显停住了、或者距上次下发超过 2 秒,才会再发一条,避免反复重置客户端的移动状态机(角色直着走、转弯不平滑)。
CZNavStop 停止寻路 —— 和控制台「停止自动寻路」按钮是同一个动作
参数:无 返回值:number,恒为 1
说明:会让角色真的站住(清状态机 → 清路点(路径线消失)→ 撤掉客户端手里那条移动指令)。不记状态:下次 CZNavGo 照常放行,没有「关了要记得开」这回事。玩家自己手动移动之前,建议先调一次。
CZNavState 读当前寻路状态。纯查询 —— 不改状态,也不推进状态机
参数:无
返回值(10 个):state, 当前路点下标, 本轮路点总数, 距终点直线距离, 起点到终点直线距离, 已重算轮数, 地图号, 路径线可用, 当前移动速度, 当前推进阈值
- local st, idx, cnt, remain, total, replans, mapId, lineOk, speed, reach = CZNavState()
- -- "行走中 3/12 · 剩 128 码";lineOk == 0 时补一句「无路径线」
复制代码
说明
- state 与 CZNavTick 的返回值同一套编码。不在寻路时,剩余距离返回 0,其余字段保留上一次的值。
- 第 8 个 路径线可用:1 = 渲染钩子已装好(正常);0 = 还没装好、或这台机器拿不到 D3D 设备装不上。它只表示线能不能画,和寻路能不能走无关。
- 第 9 个 当前移动速度(码/秒):客户端本帧的实际移动速度,跑速约 7。读不到时返回 0(还没进世界等),寻路会退回跑速基准值工作。
- 第 10 个 当前推进阈值(码):本帧「走到了当前路点」的判定距离。它随移动速度线性放大 —— 跑速 0.8 码,骑 100% 坐骑约 1.6 码,骑 280% 坐骑约 3.0 码。高速下阈值必须跟着放大,否则客户端真实的停点误差会超过阈值,每到一个路点都要白白多停一下。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?加入我们
x
|