【Paotin++】入门系列之四: 最常用内置函数
本帖最后由 doumimi 于 2024-8-23 04:44 PM 编辑系列贴目录: 【Paotin++】入门系列之一: 客户端基础 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)
这篇给大家介绍一下PaoTin++客户端最常用的一些函数。
还是那句话,PT本身是个大宝藏,里面包含了3万行代码, 而且文档也非常的丰富。 大家可以没事多看看HELP paotin。本文章分为两节介绍,一部分函数是跟游戏相关的,一部分是pt 对tt语法的增强xtintin部分。
游戏相关
一、 背包管理
这几个方法可以查询【物品/穿戴/手持/金钱】等方面的内容。 为了保证数据的准确性,请执行这些函数之前,执行一次 i2。并且通过sync.Wait 等待i2 执行完成。
## 函数 char.backpack.Query <范围> <ID 或名称>
查询角色是否携带有某样物品。如果有,则返回 ID 和名称;否则返回空串。
查询范围:
Item: 所有物品(但不包括包袱里的内容)
Wear: 穿戴
Wield: 手持的装备(武器或盾牌)
Equip: 携带的装备
Autoload: Autoload 的装备
ItemID: id 命令看到的数据
Cash: 金钱
## 函数 char.backpack.Has <范围> <ID 或名称>
查询角色是否携带有某样物品。如果有,则返回真,否则返回假。
查询范围参见 HELP char.backpack.Query。
## 函数 char.backpack.Amount <范围> <名称或/和 ID>
查询角色是否携带有某样物品。如果有,则返回其数量,否则返回 0。
查询范围参见 HELP char.backpack.Query。
应用场景:
1. 做任务的时候,判断武器和装备是否都穿上了。
2. 需要购买,或者交钱的时候,判断是否带钱。 或者身上的钱太多了,影响负重、害怕丢失的时候,可以去钱庄存钱。
3. 检查关键道具,比如火折,香蕉,石子,四宝,酒袋,干粮 带了没有。
例子:
okLog @char.backpack.Amount{Item;coin}
47
okLog @char.backpack.Amount{Item;gold}
1
okLog @char.backpack.Amount{Item;干粮}
83
okLog @char.backpack.Query{Wield;shield}
百战之盾/<font color="#ff0000">左手</font>/shield
okLog @char.backpack.Query{Wield;shutong gun}
熟铜棍/<font color="#ff0000">右手</font>/shutong gun
补充说明
1. 通常Amount能代替Has方法。
2. 在查询Wield 带了什么武器的时候,会返回武器是在左手或者右手。
3. 同样功能也可以通过 #var char.Item #var char.Wield #var char.Cash 来实现。具体 这里面有提到。
二、 角色解析
判断角色的状态,是否在战斗中,是否繁忙
## 函数 char.IsBusy
如果角色正忙,则返回真,否则返回假。无参数。
## 函数 char.IsIdle
如果角色不忙,则返回真,否则返回假。无参数。
## 函数 char.InCombat
如果角色正处于战斗中,则返回真,否则返回假。无参数。应用场景:
1. 是否在战斗: 我有个简陋的战斗模块,每隔0.3秒,判断一下,如果战斗中,就根据状态,选择自动pfm,自动recover,还是要send quit.
2. 是否busy: 做一些任务的时候,有时候会busy, 如果直接进行下面的逻辑,肯定是没法处理的。 这时候就需要判断一下是否busy,如果busy,就可能需要 先不执行下面的逻辑, 等待几秒后再retry.
三、 技能模块
判断技能等级、技能上线、以及当前jifa的技能。
## 函数 char.SkillLimit [<技能名称>]
如果指定了技能名称,则返回该技能所能达到的技能上限。
如果没有指定或者技能不存在,则返回本人的武功技能上限。
如果技能上限获取失败,默认值为基本内功的上限,如果基本内功上限也没有获取到,则默认为 1。
## 函数 char.SkillLevel <技能中文名称>
返回该技能的当前等级。没学会的技能等级为 0。
## 函数 char.GetJifaSkill <混合参数>
提供技能激发情况查询。
共分为三种情况:
1,输入参数为基本技能,输出对应的特殊技能名称。如果未激发则为空
2,输入参数为特殊技能,输出对应的基本技能名称。结果可能为多个。如果未激发则为空
3,输入参数为激发类型,则输出对应的基本技能名称。又分为以下两种情形:
(1),输入参数为常用拳脚或者常用兵器,则输出相应的基本技能名称。
由于存在互备的情形,因此结果是一个字符串列表,可能包含多个技能名称
(2),其它内功、躲闪、招架及武功种类,则输出对应的特殊技能名称
## 函数 char.SkillJifaLevel <技能中文名称>
返回技能激发等级,数据来自 jifa/enable 命令。
如果技能未被激发,那么分两种情况:
1. 如果输入的技能名称为基本功夫,则取 jifa 数据。 如果 jifa 数据取不到,则取技能当前等级的一半。
2. 如果输入的技能名称为特殊功夫,则取技能的当前等级。应用场景:
1. 通常在 打坐、吐纳、练习领悟、学习 的机器的时候使用。
例子:
okLog @char.GetJifaSkill{基本内功}
混天气功
okLog @char.SkillJifaLevel{基本内功}
305
okLog @char.SkillLevel{基本内功}
192.02
okLog @char.SkillLimit{基本内功}
197
四、 宝石管理
可以对宝石的名称、id、code进行转换
## 函数 gem.NameToID <宝石中文名>
将宝石的中文名转换成背包中的英文 ID。
## 函数 gem.NameToCode <宝石中文名>
将宝石的中文名转换成锦囊中的英文序号。
## 函数 gem.CodeToName <宝石序号>
将锦囊中的宝石序号转换成中文名。
## 函数 gem.CodeToNameB <宝石序号>
将锦囊中的宝石序号转换成漂亮的中文名。应用场景:
1. 自动合宝石的机器。
2. 自动交易宝石的机器。
3. 计算宝石价值的机器。
例子:
okLog @gem.NameToID{火☆ 玄冰}
huo bing
okLog @gem.NameToCode{火☆ 玄冰}
B6A
okLog @gem.CodeToName{B6A}
火☆玄冰
okLog @gem.CodeToNameB{B6A}
火☆ 玄冰
XTintin相关
xtintin是对于tintin语法的增强, 是完全基于tintin的原始语法的。对于一些操作进行了封装,编程了很多好用的函数。
1. 这部分只需要大致了解即可, 最好需要用的时候当做手册来查询,平时也很难全部记住。
2. 如果你对tintin的语法很熟练,这些函数其实完全不用也没关系, 看个人的习惯。
HELP xtintin !
一、math
math 提供了非常多数学方面的运算。大家可以通过HELP math来查看.我对于这些方法都加了简单的注释,大家应该一看就懂。
lib/xtintin 模块的 math.Sum 求和
lib/xtintin 模块的 math.Min 求最小值
lib/xtintin 模块的 math.Max 求最大值
lib/xtintin 模块的 math.Int 求整,四舍五入
lib/xtintin 模块的 math.Inc 别名, 增、减操作
lib/xtintin 模块的 math.Avg 求平均值
lib/xtintin 模块的 math.Abs 求绝对值
lib/xtintin 模块的 math.Sign 取符号
lib/xtintin 模块的 math.Root 开根
lib/xtintin 模块的 math.Eval 通用计算
lib/xtintin 模块的 math.Ceil 向上取整
lib/xtintin 模块的 math.Power幂
lib/xtintin 模块的 math.Floor向下取整
lib/xtintin 模块的 math.Random取 %1 %2 中间的一个随机值
lib/xtintin 模块的 math.ParseCN 将汉字转化为数字
例子:
okLog @math.Int{4.5}
5
okLog @math.Int{4.4}
4
okLog @math.Avg{4;5;6}
5
okLog @math.Min{1;2;3}
1
okLog @math.Max{1;2;3}
3
okLog @math.Eval{123 + 45 / 5}
132
okLog @math.ParseCN{一百五十六}
156补充说明:
1. @math.Eval 是一个通用的计算模块, 大家如果不想记太多的函数的话,就记这一个也可以,已经能完成绝大多数的操作了, 比如求平均,就自己加一加,然后再除以个数。
2. @math.ParseCN 也非常好用, 他会将一个汉字变成数字,在mud游戏中很多地方都可能遇到。 具体看下上面的例子就明白了。
二、 字符串
str模块提供了非常多的字符串相关的操作, 下面是 我经常会用到的。
str.Trim 去掉空格
str.ToLower 转换成小写
str.ToUpper 转换成大写
str.Split 把字符串分割开
str.Replace 替换字符
str.Left 按照<b><font color="#ff0000">宽度</font></b>截取字符串左边的内容,
str.Right 按照<b><font color="#ff0000">宽度</font></b>截取字符串右边的内容,
str.Sub 从左开始截取,截取指定<b><font color="#ff0000">宽度</font></b>
例子:
okLog @str.Trim{你好 };
你好
okLog @str.Len{你好}
4
okLog @str.ToLower{ABCD};
abcd
okLog @str.ToUpper{abcd};
ABCD
okLog @str.Split{扬州的武庙;的}
扬州;武庙
okLog @str.Replace{11111aaaa2222;a;b}
11111bbbb2222
okLog @str.Left{123456789;5}
12345
okLog @str.Right{123456789;5}
56789
okLog @str.Sub{123456789;3;3}
456
okLog @str.Sub{你好;2;2}特别说明:1. 字符有Len求长度, 以及Width求显示宽度, 然后截取的那三个函数,都是按照宽度来截取的。 汉字是2个宽度, 所以如果有汉字,或者】这种中文全角符号,那么需要特殊考虑.
三、列表
在看列表之前,请先看一下HELPDataType,在tintin中,所有的数据结构,都可以看成是字符串, 所以表格,列表,都可以看成是字符串。
注意,由于 TinTin++ 自身语法的缺陷,字符串列表的第一个元素只能是简单字符串,不能是列表、字符串列表、表格,其余元素不受此限制。
普通列表可以用 @list 相关的方法 , 如果是字符串列表是 可以用@slist以及@list的所有方法.
PS: 我感觉Tintin本身的list的功能已经很好用了。 那些 基本的 add, find, delete, create, size ,sort, order, get 等方法我个人更习惯用tintin原生的。
这里比较推荐一个 Reverse方法,可能会经常用到。
#list temp create {a;b;c;d}; okLog @list.Reverse{$temp};
{1}{d}{2}{c}{3}{b}{4}{a}
#list temp create {11;2};#list temp <b>order</b>;#var temp;
#VARIABLE {temp}
{
{1} {2}
{2} {11}
}
#list temp create {11;2};#list temp <b>sort</b>;#var temp;
#VARIABLE {temp}
{
{1} {11}
{2} {2}
}
四、集合Set
集合真的是太厉害了!
Pt用list实现了集合set的功能, 集合的特性就是里面的所有元素都不重复, 也就是说, 你往一个set里面加入 1,2,2,3,3,4那么最终集合中的元素会是 1,2,3,4 。重复的2和3都被过滤掉了。集合的方法特别多, 简单的 create、 add、 size 之类的就不细说了。 重点说三个,交集, 并集, 以及Diff
先定义两个列表
#var temp {@set.Create{1;2;3;4;5;1;2;3}};
#var temp2 {@set.Create{4;4;5;5;6;6;7;7;8}};
#VARIABLE {temp}
{
{1} {1}
{2} {2}
{3} {3}
{4} {4}
{5} {5}
}
#VARIABLE {temp2}
{
{1} {4}
{2} {5}
{3} {6}
{4} {7}
{5} {8}
}
取并集
#var temp3 {@set.Union{{$temp};{$temp2}}};
#VARIABLE {temp3}
{
{1} {1}
{2} {2}
{3} {3}
{4} {4}
{5} {5}
{6} {6}
{7} {7}
{8} {8}
}
取交集
#var temp4 {@set.Intersection{{$temp};{$temp2}}};
#VARIABLE {temp4}
{
{1} {4}
{2} {5}
}
取A-B差集
#VARIABLE {temp5}
{
{1} {1}
{2} {2}
{3} {3}
}
应用场景:
[*]偷学
[*]经书、乱序 等其他需要进行一些文字对比的地方。
五、转换
fp系列函数的主要功能就是对列表或者表格进行 转换、过滤。 掌握了之后写代码会非常的优雅。
lib/xtintin 模块的 fp.Map 遍历表格,进行内容转换
lib/xtintin 模块的 fp.MapIf 遍历表格,根据条件,进行内容转化
lib/xtintin 模块的 fp.Select 遍历字符串列表,根据条件过滤
lib/xtintin 模块的 fp.Filter 遍历表格,根据条件过滤
lib/xtintin 模块的 fp.Transform 遍历字符串列表,转换Item
lib/xtintin 模块的 fp.FilterMap 遍历表格,既过滤,又转换
lib/xtintin 模块的 fp.TransformIf 遍历字符串列表, 根据条件,对于内容进行转换。
lib/xtintin 模块的 fp.SelectTransform 遍历字符串列表, 既过滤,又转换
例子:
#var temp {a;b;c;d;5;6;7};
okLog {@fp.<font color="#ff0000">Transform</font>{{$temp};gan che to VALUE}};
{gan che to a;gan che to b;gan che to c;gan che to d;gan che to 5;gan che to 6;gan che to 7}
okLog {@fp.<font color="#ff0000">TransformIf</font>{{$temp};{"VALUE" == "%d"};{gan che to VALUE}}};
{a;b;c;d;gan che to 5;gan che to 6;gan che to 7}
#var temp {
{扬州} {{name}{扬州}{area}{yes}}
{当铺} {{name}{当铺}{area}{no}}
};
#VARIABLE {temp}
{
{当铺}
{
{area} {no}
{name} {当铺}
}
{扬州}
{
{area} {yes}
{name} {扬州}
}
}
#var temp2 {@fp.<font color="#ff0000">Filter</font>{{$temp};{"VALUE" == "yes"}}};
#VARIABLE {temp2}
{
{扬州}
{
{area} {yes}
{name} {扬州}
}
}
特别说明:1. 可以看到上面例子中给了两个功能,一个是将字符串进行转换, 一个是对表格类型的数据进行过滤。 都只用了一行函数就完成了整个操作。 非常非常的优雅。 如果自己实现通过遍历也是可以的,就是可能要5、6行代码才行。
2. 这个系列的函数虽然看着很多,但是只要记住核心的功能就是进行转化和过滤就行。 Map和transform对应转化,Filter和select对应过滤。 分别对应了表格和字符串列表的方法。
六、路径
路径相关的函数也经常会用到,毕竟mud里面最重要的就是赶路
## 函数 path.Reverse <路径>
给出路径对应的反向路径。
## 函数 path.Long <路径>
返回长版本的路径。路径中的每个方向命令都会被扩展成完整的单词。
## 函数 path.Short <路径>
返回长版本的路径。路径中的每个方向命令都会被简化。应用场景:1. 所有跟路线有关的场景,尤其是固定路线, 比如推车,巡山等都可能用到。
例子:
#var temp {west;east;north;south};
okLog @path.<font color="#ff0000">Short</font>{$temp};
w;e;n;s
#var temp {w;e;n;s}
okLog @path.<font color="#ff0000">Long</font>{$temp};
west;east;north;south
#var temp {w;e;n;s;north};
okLog @path.<font color="#ff0000">Reverse</font>{$temp};
south;n;s;w;e
七、其他
剩下一个我经常用的函数就是时间,非常简单,直接给个例子
okLog @time.FormatNow{} 获得了100颗天木;
2024-08-23 16:29:06 获得了100颗天木
好了,暂时就到这里了,之后遇见好用的函数,还会回来补充到帖子里面。 顶 普及贴,赞一个
页:
[1]