【Paotin++】入门系列之三: 最常用内置变量,别名。
本帖最后由 doumimi 于 2024-8-21 10:53 AM 编辑【Paotin++】入门系列之一: 客户端基础 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)
paotin 本身内置了很多好用的变量, 比如 char、 gMapRoom 等。这篇文章和大家一起看一下 最常用的变量都有哪些。本篇文章并不是讲解每个变量和函数该怎么用, 因为 PT的文档非常的完善,大部分看了文档都差不多知道是什么功能,该怎么用, 看文档就用HELP xxx 。PT本身内置的变量和别名特别多, 那这篇文章的最主要的作用就是告诉各位同学,哪些可能最常用,能加速萌新的入门。
ps: 北侠是我第一个玩的mud游戏, 好在我本身是个三流的程序员,很多东西接受的稍微快一些。 在学习怎么写机器的过程中,发现了PaoTin++ 客户端是个大宝藏, 但是这个大宝藏目前没有入口的指引,需要各位玩家自己去发掘, 比如看到超新手打坐教程,同学们可能惊奇的发现有个 char[内力百分比] , 哇塞,这是个什么玩意儿,这么好用。 那除了这个,还有哪些好用的变量呢?我个人当时是非常有这个疑问的, 但是并没有人介绍到这一块。 我是结合着源码,也看了很多变量、别名的HELP说明,再加上自己写机器的经验, 想分享给大家可能最常用的 变量和别名, 也是这个系列贴的目标,介绍最重要的20%的内容, 让大家能写至少80%的机器。
一、 内置变量的概述
pt内置的这些变量,大多数都是通过触发、 gmcp 获取的。 相当于框架已经做了很多前置工作, 你只需要会用就行。
如果你还发现什么比较需要的变量, 也不用自己抓, 直接给炮爷提需求!炮爷非常乐意看到客户端更加完善,也很希望能帮助更多人轻松游玩北侠{:7_279:}
1、有时候你发现char 有时候没有内力上限, 没有char[锦囊], 或者缺失一些其他属性,那就是因为没有触发抓取到, 所以此时,只需要执行一下 hp -neili 或者 jiancha jin nang 这些内容就有了。
2、pt内置的这些变量和普通的变量没有任何区别, 你也可以自己去修改这些变量,或者给某些变量去增加一些字段。 比如我想有一系列变量,控制是否发送pfm,或者血量低于多少执行recover,或者逃跑。 完全可以 #var char[太极剑.缠] 1; 或者#var char 60; 这里仅仅是举例,实际用另外一个变量可能更好。
3、pt变量聚合在一起的这种写法我个人比较推荐, 就是将一系列相关的变量通过 table这种数据结构组合起来。 比如将某个任务过程中的所有变量都聚合在一起, 这个任务finish的时候,直接#unvar 都全部清空了。
本帖最后由 doumimi 于 2024-8-23 10:12 AM 编辑
二、 常用变量
首先大家可以执行 VARS 来看到当前一共都有哪些变量。 这里只说最常用的。
#var char
这里面的变量,用来进行 打坐、吐纳、学习、领悟 的判断非常方便, 气势也可以用来 进行战斗的自动pfm判断。
#VARIABLE {char}
{
{内力上限} {5990}
<font color="#ff0000"> {内力百分比} {96}</font>
{加力} {0}
{口渴} {缺水}
<font color="#ff0000"> {当前内力} {11124}
{当前气血} {9035}</font>
{当前真元} {100}
{当前真气} {0}
<font color="#ff0000"> {当前精力} {9067}
{当前精神} {2048}</font>
{忙} {true}
{战斗中} {false}
{最大内力} {5762}
{最大气血} {9035}
{最大真气} {0}
{最大精力} {5166}
{最大精神} {2048}
{最大食物} {410}
{最大饮水} {410}
{有效气血} {9035}
{有效精神} {2048}
{毒} {}
<font color="#ff0000"> {气势} {0}</font>
<font color="#ff0000"> {气血健康度} {100}
{气血百分比} {100}</font>
{潜能} {1065676}
{潜能显示} {1065676}
{状态} {健康;极度疲倦}
{真元} {0}
{真气减伤} {0}
<font color="#ff0000"> {精力百分比} {87}
{精神健康度} {100}
{精神百分比} {100}</font>
{经验} {7250000.00}
{经验显示} {7.25M}
{走火入魔} {0.00}
{食物} {0}
{饥饿} {缺食}
}
#var char
所有技能相关的内容都在这里了,包括 level 、limit 、jifa-level、是否enabled 等属性比较重要,可以在领悟、练习、读书的时候,用来判断。
#VARIABLE {char}
{
{叫化绝活}
{
{code} {begging}
{enabled} {false}
{level} {7.37}
{limit} {0}
{name} {叫化绝活}
{rank} {新学乍用}
{type} {基本知识}
}
{基本内功}
{
{code} {force}
{enabled} {false}
<font color="#ff0000">{jifa-level} {306}</font>
{jifa-to} {混天气功}
{jifa-type} {基本功夫}
<font color="#ff0000"> {level} {198.03}
{limit} {198}</font>
{name} {基本内功}
{rank} {初出茅庐}
{type} {基本功夫}
}
{降龙十八掌}
{
{code} {xianglong-zhang}
{enabled} {true}
{jifa-level} {302}
{jifa-to} {基本招架;基本掌法}
{level} {195.00}
{limit} {198}
{name} {降龙十八掌}
{rank} {初出茅庐}
{type} {特殊功夫}
}
}
#var char[锦囊]
在执行了 jiancha nang 之后,char[锦囊]里面就会有所有的宝石信息, 包括宝石序号、 种类、宝石等级、宝石数量、阴阳等, 有了这些信息,可以很方便的写出来一个宝石合成的机器。
#VARIABLE {char[锦囊]}
{
{B3A}
{
{序号} {B3A}
<font color="#ff0000"> {数量} {1}
{种类} {玄冰}
{等级} {水}
{阴阳} {☆}</font>
}
{B4A}
{
{序号} {B4A}
{数量} {1}
{种类} {玄冰}
{等级} {风}
{阴阳} {☆}
}
{B5A}
{
{序号} {B5A}
{数量} {1}
{种类} {玄冰}
{等级} {雷}
{阴阳} {☆}
}
{B6A}
{
{序号} {B6A}
{数量} {1}
{种类} {玄冰}
{等级} {火}
{阴阳} {☆}
}
}
背包管理相关的
这几个变量都是跟背包有关的,可以通过这个变量判断所有跟背包物品有关的逻辑, 比如是否有钱,是否穿了装备,是否携带武器,右手和左手的武器是什么。
注意,这几个变量要想获得准确的值, 请先执行 i2。 并且通过sync.Wait确保 命令被顺利的执行完毕后,再通过变量判断.
<b> #var char.Item {};
#var char.Cash {};
#var char.Wear {};
#var char.Wield {};
#var char.Equip {};
#var char.Autoload{};
#var char.ItemID {};</b>
#VARIABLE {char.Cash}
{
{铜板/coin}
{
{amount} {47}
{id} {coin}
{name} {铜板}
}
{黄金/gold}
{
{amount} {1}
{id} {gold}
{name} {黄金}
}
}
#VARIABLE {char.Wield}
{
{熟铜棍/右手/shutong gun}
{
{hand} {<font color="#ff0000">右手</font>}
{id} {shutong gun}
{item} {熟铜棍}
}
{百战之盾/左手/shield}
{
{hand} {<font color="#ff0000">左手</font>}
{id} {shield}
{item} {百战之盾}
}
}
#var gMapRoom
这个变量抓取了look能知道的信息, 也非常重要, 其中最重要的是 name descexits , 还有objs也挺重要的, npc,玩家,一些物品信息都会抓到 objs里面。 将来长大了自己需要画地图的时候,就不需要再自己抓取这些内容。
#VARIABLE {gMapRoom}
{
<font color="#ff0000"> {desc} </font>{这里是扬州城的中心,一个很宽阔的广场,地面由青石铺就。一些游手好闲的人在这里溜溜达达,经常有艺人在这里表演。中央有一棵大榕树,盘根错节,据传已有千年的树龄,见证了这座城市的历史。树干底部有一个很大的洞 (shudon
g)。你可以看到北边有来自各地的行人来来往往,南面人声鼎沸,一派繁华景象,东边不时地传来朗朗的读书声,西边则见不到几个行人,一片肃静。}
<font color="#ff0000"> {exits} {down;east;north;south;up;west}</font>
{map} {| 北大街|| ||| 西大街---中央广场---东大街|| ||| 南大街|}
<font color="#ff0000"> {name} {中央广场}</font>
{nation} {大宋}
{node} {扬州}
<font color="#ff0000"> {objs}</font>
{
{5}
{
{id} {huo tong}
{name} {四块火铜}
}
{8}
{
{id} {marsflyer}
{name} {大葱战将}
{nick} {朱雀刺客}
{title} {武学大家;华山派;剑宗传人}
}
}
{terrain} {城市}
{weather} {东方的天空布满了灰蒙蒙的云层。}
}
#var gGMCP
gmcp 大家可以搜一下,我个人理解就是mud服务推送过来的消息。 pt框架解析了这些消息,封装到变量里面。
通过这个gGMCP 可以更加准确的获取到当前房间的名称,上一次走路是否成功,以及出口有哪些。
{Move}
{
{出口信息}
{
{1} {east}
{2} {northwest}
}
{成功} {true}
{房间名} {比武场}
}
#var gGMCP gGMCP
这两个都是战斗相关的,就一起说了, 可以最快速度的了解 战斗中敌我属性的变化, 以及技能信息,技能cd也都会有。
#VARIABLE {gGMCP}
{
{Combat}
{
{id} {mu zhuangzi#44678}
{姓名} {木桩子}
<font color="#ff0000"> {有效气血百分比} {98}</font>
{有效精血百分比} {100}
<font color="#ff0000"> {气血伤害} {300}
{气血受损} {100}
{气血比率} {97}</font>
{精血伤害} {0}
{精血受损} {0}
{精血百分比} {100}
}
{Status}
{
{id} {mu zhuangzi#44678}
{姓名} {木桩子}
{有效气血} {3196695}
{气血} {3101123}
}
{Combat}
{
<font color="#ff0000"> {CD时长} {30}</font>
{绝招ID} {xianglong-zhang.xiao}
{绝招名称} {降龙啸}
}
}
#var gJobState
想要使用这个变量,需要 LM basic/cmds/jobquery;然后执行一下 jq 就有了。
主要作用是查看任务CD的, 一旦CD好了,立马接任务,不用再一直查询npc了,可以有效减少服务器压力!
#VARIABLE {gJobState}
{
{万安塔}
{
<font color="#ff0000"> {CD} {23}</font>
{ID} {13}
{名称} {万安塔}
{成功率} {}
{次数} {}
{类型} {主}
{附加信息} {经验必须达到1000000。}
}
{偷学}
{
<font color="#ff0000"> {CD} {58}</font>
{ID} {16}
{名称} {偷学}
{成功率} {}
{次数} {}
{类型} {主}
{附加信息} {前置慕容任务需完成至少1000次。}
}
}
#var gLoyalty
门忠任务相关的信息。 机器里面使用的话, 可以更加准确的伪造 以及交付给NPC。
#VARIABLE {gLoyalty}
{
{1}
{
<font color="#ff0000"> {ID} {jinchuang yao}</font>
<font color="#ff0000"> {NPC} {guan jia}</font>
{姓名} {女管家}
{序号} {1}
<font color="#ff0000"> {房间} {北京鳌府后院}</font>
{描述} {这是一件中等(三尺至六尺)大小形状为不规则形态的金创药,其材质为其他类物质,实心、不导热。}
{时间} {8月8日 11时26分}
<font color="#ff0000"> {物品} {金创药}</font>
{积分} {15}
<font color="#ff0000"> {类型} {找到}</font>
}
{2}
{
{ID} {jinxian yu}
{NPC} {zhao yishang}
{姓名} {赵一伤}
{序号} {2}
{房间} {明教正厅}
{描述} {这是一件细微(一寸至三寸)大小形状为长条形的金线鱼,其材质为肉质,实心、不导热。}
{时间} {8月8日 17时18分}
{物品} {金线鱼}
{积分} {15}
{类型} {找到}
}
}
本帖最后由 doumimi 于 2024-8-30 03:20 PM 编辑
三、常用别名
这部分也不会讲的特别细, 本篇文章的主旨还是给大家科普一下有哪些很好用的内置功能, 如果有不理解的,可以用HELP来看文档,PT的文档十分的详细。输入ALIS 查看全部的别名
背包管理
char.backpack.SellAll 把身上的低价值物品全部卖掉
char.backpack.DropAll 把身上的不能卖的低价值物品全部扔掉。
打出来一堆,金戒指,青蛙腿,碎肉屑,蝙蝠血甲, 你想一键卖掉,然后卖不了的一键drop掉吗? 试试这个别名吧。关于自动买的东西是可以配置的, 可以在var/etc/loots.extra.tin 里面决定哪些东西卖,哪些东西drop,哪些东西保留.
#var gLootPool[蓝马褂/cloth] {{kind}{衣服} {unit}{件}{value}{drop}};
#var gLootPool[紫蟒袍/cloth]{{kind}{衣服} {unit}{件}{value}{drop}};
#var gLootPool[明黄锦袍/cloth]{{kind}{衣服} {unit}{件}{value}{drop}};
#var gLootPool[粉红绸衫/pink cloth]{{kind}{衣服} {unit}{件}{value}{sell}};
#var gLootPool[绣花小鞋/flower shoes] {{kind}{衣服} {unit}{双}{value}{sell}};
#var gLootPool[蝙蝠血甲/bianfuxue jia] {{kind}{衣服} {unit}{件}{value}{sell}};
#var gLootPool[黑色披风/heise pifeng] {{kind}{衣服} {unit}{件}{value}{sell}};
#var gLootPool[玄铁剑/xuantie sword]{{kind}{兵器} {unit}{把}{value}{reserve}};
#var gLootPool[武士刀/wushi dao]{{kind}{兵器} {unit}{把}{value}{reserve}};
#var gLootPool[铁轮/iron falun] {{kind}{兵器} {unit}{只}{value}{drop}};
#var gLootPool[钢杖/gangzhang] {{kind}{兵器} {unit}{把}{value}{drop}};
#var gLootPool[绣花绷架/xiuhua bengjia] {{kind}{兵器} {unit}{柄}{value}{drop}};
#var gLootPool[绣花针/xiuhua zhen] {{kind}{兵器} {unit}{串}{value}{sell}};
#var gLootPool[牛皮酒袋/jiudai]{{kind}{饮料} {unit}{个}{value}{reserve}};
#var gLootPool[酸梅汤/suanmei tang] {{kind}{饮料} {unit}{杯}{value}{reserve}};
#var gLootPool[青蛙腿/qingwa tui] {{kind}{食物} {unit}{块}{value}{sell}};
#var gLootPool[碎肉屑/sui rouxie] {{kind}{食物} {unit}{块}{value}{sell}};
#var gLootPool[嫩草/nen cao] {{kind}{食物} {unit}{片}{value}{sell}};
#var gLootPool[草籽/cao zi] {{kind}{饮料} {unit}{把}{value}{sell}};
#var gLootPool[金项链/golden necklace] {{kind}{兵器} {unit}{串}{value}{sell}};
#var gLootPool[金戒指/golden ring] {{kind}{兵器} {unit}{串}{value}{sell}};
你想一键捡起来 地图里面所有尸体、骨架、地上的 钱和宝石吗 ??
look;sync.Wait {get-all}
static/image/hrline/line3.png
busy检查
这两个用来处理busy的情况,绝大部分机器都离不开这两个检查。
## 别名 busy.Wait <回调代码>
检查角色是否处于 busy 状态,如果是,则等待 busy 状态结束后执行回调代码。
否则立即执行回调代码。
## 别名 busy.Halt <回调代码>
检查角色是否处于 busy 状态,如果是,则用 halt 解除 busy,解除成功后,执行回调代码。
否则立即执行回调代码。
static/image/hrline/line3.png
逍遥行
xiaoyao.GotoThen
xiaoyao.Query简写xyq
xiaoyao.Goto简写xy
这几个我想着就不用多说了,用PT的应该第一天都用上了逍遥行。
static/image/hrline/line3.png
千里通
path.WalkWalkStepsTraceList FinishBotStep
千里通大家应该也会经常用, 走路必备的神器!关于BotStep的使用, 可以参考这两篇攻略:
分享一个10w经验的明教小萌新PaoTin++成长之路 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)
Paotin++ 关于BotStep的应用于类似华山巡山任务场景的说明 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)
static/image/hrline/line3.png
事件驱动
event.Handle
event.Emit
event.Define
事件很好用,本身逻辑不难, 只是定义有一点点复杂, 是用PT的进阶的内容了, 掌握了事件,你就已经脱离了萌新阶段了,已经能写出很厉害的机器了。
【Paotin++】入门系列之五: 事件驱动编程 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)
static/image/hrline/line3.png
地图相关
map.FocusNPC 非常好用,大家看一下他的用法, 自动的找家贼,自动找任务物品、NPC 就用这个就行。
## 别名 map.FocusNPC <NPC 特征> <行为类型> <行为>
关注指定特征的 NPC,并当发现它时,呼叫相应的行为。
特征由一系列字段来描述,目前支持的字段有:
- id: ID
- name: 名字
- title:称号
- nick: 昵称
行为有两种类型:
- command: 指明行为是一个命令,例如 follow 或者 kill 之类,那么将以 NPC ID 为参数调用它。
- alias: 指明行为是一个别名,表明要做的事情比较复杂,那么将以 NPC 对象为参数调用它。
## 函数 map.Room.GetObjByName <名称> [<头衔>]
根据名称提取房间中的物品信息。
由于有时候无法正确区分 NPC、玩家和物品,因此本函数也可以用来查询 NPC 或玩家,
此时如果同时提供了头衔,则也会判断头衔是否匹配。
当然,你也可以只通过头衔来查询,只要保持名称留空即可。
## 函数 map.Room.GetObjByID <ID>
根据 ID 提取房间中的物品信息。
由于有时候无法正确区分 NPC、玩家和物品,因此本函数也可以用来查询 NPC 或玩家。
static/image/hrline/line3.png
存储
如何退出了游戏,但是变量依然存在呢? 就可以用这个功能把变量存在文件里面, 比如每周南国围猎的图, 就可以dump到文件里面,然后每次在比对的时候,可以再load出来,通过机器来比对。
## 别名 storage.Save <文件名> <变量名1> [...]
将由变量名列表所指定的变量及其值存储到指定的存储文件中。
## 别名 storage.Load <文件名> <变量名1> [...]
从指定的存储文件中加载变量。
存储文件中实际存储的变量可能更多一些,但本函数可以只加载其中一部分变量。
static/image/hrline/line3.png
服务器同步
如果想要保证前面的所有命令都已经被服务器正确的执行完, 那么就可以用这个命令,比如 要用pt提供的背包查询功能时候,可能就需要在i2 完之后,加上sync.Wait, 确保之前的命令都被系统处理完成并返回,此时背包的信息才是准确的
## 别名 sync.Wait <回调代码> [<同步符号>]
用来和服务器进行同步,参数说明如下:
1. 回调代码
回调代码会在与服务器同步之后执行。
2. 同步符号(可选)
同步符号参数用来对本次同步进行唯一标识,只能由大小写字母、数字、连字符、
下划线、小数点、斜线构成。
本参数为可选值,如果省略,则无法通过 sync.Ignore 取消回调
static/image/hrline/line3.png
UI
prompt.Set可以修改UI,增加一些信息。 大家直接试一试下面的命令就知道了。
prompt.Set {{job}{<169> 慕容仆人}{area}{铜官山}{room}{酒铺}{type}{<119> 红人}{stage}{线索 (50)}}
static/image/hrline/line3.png
计算
对变量进行加减运算,如果想要扣减,就用math.Incabc-3就行。
## 别名 math.Inc <变量名> [<增量值>]
将增量值叠加到变量原来的值之上。若变量值为空,则视同为 0。如增量值省略,则视同为 1。
static/image/hrline/line3.png
定时器
如果有个定时器是每隔12小时执行一次,那么如何写完就测试效果呢? 就用 xtt.Tick 就行, 这个定时器和普通的区别就是会立即执行一次
## 别名 xtt.Tick <ID> <代码> <间隔时间> [<触发次数>]
跟 #tick 功能类似,但是<font color="#ff0000">会立即执行一次代码</font>。<font color="#ff0000">对于间隔时间比较长的定时器来说尤其有用</font>。
可选的触发次数会导致定时器在次数达到限制后自动销毁。省略此参数时将不限制触发次数。
你也可以通过 Tick 别名来使用本别名。
这篇写的有点敷衍,后面都没有详细说明 case 发表于 2024-8-20 10:24 PM
这篇写的有点敷衍,后面都没有详细说明
看来哥们是看过我之前的帖子哈, 非常感谢捧场。
然后还想说的是这篇文章并没有任何敷衍。 Pt本身是个大宝藏,内置了非常多的好用的变量和别名, 但是也有一些是平时很少用到,或者根本用不到的。
这篇文章就是 把哪些我最常用的给大家展示出来, 大家有个概念,知道有这个东西就行了。 原理的东西其他的文章已经讲过, 这篇是应用层, 只要知道有这个玩意儿就行。 Pt的文档本身非常的完善, 用法可以直接HELP来查看。这个也符合这个系列的初心, 介绍PT最常用的20%的内容, 让各位同学能写出来80%的机器。
然后这个意见我还是虚心接受的, 有些内容我还是会再继续补充,比如再补充一下 我个人的使用的经验。 豆米兄,这个函数找不到呢,要手动载入哪个文件吗
#VARIABLE {gJobState} yua 发表于 2024-8-23 08:33 AM
豆米兄,这个函数找不到呢,要手动载入哪个文件吗
#VARIABLE {gJobState}
LM basic/cmds/jobquery;
执行完就有了
页:
[1]