doumimi 发表于 2024-8-20 17:30:12

【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-20 18:40:57

本帖最后由 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-20 18:41:42

本帖最后由 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 22:24:40

这篇写的有点敷衍,后面都没有详细说明

doumimi 发表于 2024-8-21 10:44:44

case 发表于 2024-8-20 10:24 PM
这篇写的有点敷衍,后面都没有详细说明

看来哥们是看过我之前的帖子哈, 非常感谢捧场。

然后还想说的是这篇文章并没有任何敷衍。 Pt本身是个大宝藏,内置了非常多的好用的变量和别名, 但是也有一些是平时很少用到,或者根本用不到的。

这篇文章就是 把哪些我最常用的给大家展示出来, 大家有个概念,知道有这个东西就行了。 原理的东西其他的文章已经讲过, 这篇是应用层, 只要知道有这个玩意儿就行。 Pt的文档本身非常的完善, 用法可以直接HELP来查看。这个也符合这个系列的初心, 介绍PT最常用的20%的内容, 让各位同学能写出来80%的机器。

然后这个意见我还是虚心接受的, 有些内容我还是会再继续补充,比如再补充一下 我个人的使用的经验。

yua 发表于 2024-8-23 08:33:54

豆米兄,这个函数找不到呢,要手动载入哪个文件吗
#VARIABLE {gJobState}

doumimi 发表于 2024-8-23 10:11:38

yua 发表于 2024-8-23 08:33 AM
豆米兄,这个函数找不到呢,要手动载入哪个文件吗
#VARIABLE {gJobState}

LM basic/cmds/jobquery;

执行完就有了
页: [1]
查看完整版本: 【Paotin++】入门系列之三: 最常用内置变量,别名。