找回密码
 注册
搜索
查看: 428|回复: 15

to 无法师兄

[复制链接]
门派:桃花岛
发表于 2018-11-29 00:13:26 | 显示全部楼层 |阅读模式


create_trigger_t('bags8','^(> )*你身上带着(\\D*)件东西\\(负重\\s*(\\d*)\\.\\d*\\%\\):','','checkBagsW')

function checkBagsW(n,l,w)
   local t = tonumber(w[3])
   Bag = Bag or {}
   Bag["ENCB"] = {}
   Bag["ENCB"].value = t

> 你身上带着三十六件东西(负重 61.26%):
-----------------------------------------------------
就是这个搞不懂,为啥ENCB是无效的值啊?

关于这个... 我连猜带蒙 做了一个猜想...

首先根据查的资料,  D是字符, d是数字, d是数字

所以第一个触发应该抓取到了三个变量 分别是字符1 数字2 数字3

然后... 我就开始蒙了

首先function checkbagsW 后面有 n,l,w
我猜测是把抓取的三个变量 按照顺序赋值给了 n l w

然后 local t = tonumber(w[3]) 这应该是把 w 数字进行数字化...  这里我就已经凌乱了 ... 因为如果是把w赋给t
w 说实话 是你三个变量中 最没用的那个 也就是 三十六,  61 , 26 三个变量中 26这个变量..

这里我首先猜测... 如果赋值用 l 会不会正确? ... 然后等我下一步继续瞎蒙吧...
门派:桃花岛
 楼主| 发表于 2018-11-29 00:14:24 | 显示全部楼层
【 气血 】 503 / 573 [ 97%] 【 内力 】 855 / 835 (+ 0)

  我们的总的目标,是把503、573、97、855、835这五个值都抓下来。根据我上面讲的理论,我们先考虑怎么来抓第一个503,也就是当前气血值。

  所谓杆子,在正则的世界里,我们应该理解为标志性的字符,换句话说,这个字符(或者这一组字符)在你所需要分析和判断的字符中,是唯一的。这种唯一性,是最容易被电脑认可的(因为电脑比较笨)。

  现在,很明显,上面的【 气血 】 和【 内力 】 具有非常好的唯一性。我们现在先用【 气血 】,把第一根电线杆,就竖在了【 气血 】的上面。

  我们现在要做的是——告诉电脑,在【 气血 】这个东西的后面,有一组数字,是我所需要的。

  那,这样写行吗?很坦白的告诉大家——不行。(表砸偶)那,为什么呢?大话西游里,紫霞仙子有说过这样一句,我猜中了开头,却没有猜中结局。电脑很笨的,你就告诉他,到哪里开始找什么,却不告诉他,哪里是结束,他就会乱来的。

  那,正确的说法是什么呢?——告诉电脑,在【 气血 】这个东西的后面(这是开始了),是一些空格(这个等下讲),在那些空格的后面,是我所需要的数字,在数字的后面,又是一些空格(这是结束,在这里又立一根结束的电线杆)再后面,我就不管了,你爱干什么就干什么吧。

  先说一下,上面突然冒出来的空格,是什么回事。对于我们来讲【 气血 】和503之间是没有什么存在的,但对于电脑来讲,这两者之间是存在有一些空格的,如果不把这个空格告诉电脑,他是又会犯傻的。

  好了,我们开始把刚才的话转成电脑语言。

^[>]*【 气血 】\s+(\d+)\s+.*$

  把上面这串东西输入到你的触发器的匹配,然后在发送中输入say %1,试一下,是不是可以得到你的当前气血值。

  唉……万事开头难呀。现在我们来一点一点解释上面那串鬼画符似的东西,是怎么回事。先说一下,我不会列出一张总表,让大家对照着看。我们基于碰到什么,就讲什么的原则,当然,第一次讲到了,第二次再遇到,就不会详细讲了。为了让大家能够看的清楚,我用红蓝双色把上面的代码分别标出了,代码是连在一起用,但作用是分别累加的。呃,可以这么理解,上面我说的每一句话,就是一小段代码的具体功能,加在一起,就达到了那个效果。

  告诉电脑——^[>]*——任何一样东西,总是有个开始,^代表的意思是从一行的最开头开始起,嗯,这么做的目的,是防止你做机器人的时候,别人在你前面say一些东西,把你的机器人破坏掉;虽然北侠的hp后的状态,在【 气血 】前是没有什么东西的,但有时候因为网络的原因,会有一个或者几个>出现,[>]*代表的意思是有0个或者几个>符号,*的意思是前面的那个东西出现0至无穷多次。是不是觉得有点乱,没关系,硬记住就可以,后面我们会继续提到。

  在【 气血 】这个东西的后面——【 气血 】——这个应该很好理解,就不解释了。

  是一些空格——\s+——在正则中,\s(注意,是小写的s)是表示空格(这个只能硬记,或者查表),但我们不知道确切有几个空格,所以,我们需要有一个符号来表示,前面字符的数量不确定,在这里,我们选择了+。也许,有人要问,为什么这里是+,上面是*。在这里简单说明一下,*代表的意思是——我不确定这东西是否会出现,也不确定这东西会出现几次,所以*代表的是0~N次的数量(就是说,可以没有,可以有许多,mud中的>的确也是这种情况没错吧。)+代表的意思是——我确定这东西肯定出现至少一次,但不确定会出现几次。现在明白*、+的区别了吧?

  在那些空格的后面,是我所需要的数字——(\d+)——在正则中,\d(注意,是小写的d)代表数字,+号我们刚才已经说了,是指这里可以出现至少一个到多个数字,()的作用和Zmud里是一样的,表示要取这部分的值。

  在数字的后面,又是一些空格——\s+——这跟上面是一样的。

  再后面,我就不管了,你爱干什么就干什么吧——.*$——.*的意思,是代表所有一切字符,$的意思是一行的结束。这两者加在一起的意思就是,对后面的东西不做要求了,随便吧。

  我想,经过上面这么详细的一点一点的分析下,大家如果都能看明白的话,至少说,对正则是应该不会太怕了。我写这么一大篇的目的,也只是希望让没有接触或者不敢接触正则的朋友,至少知道正则的脾气是怎么样的。至于具体的正则的学习,不是我这篇小小的文章能够教的了,大家在北侠搜“正则”,已经有人推荐了几篇文章,我有看过,也挺不错的。至少看起来比较专业。

  下面,给出我所写的抓这5个值的答案,大家试着用我上面讲的东西分析一下。

【 气血 】 503 / 573 [ 97%] 【 内力 】 855 / 835 (+ 0)

在匹配里输入^[>]*\s*【 气血 】\s+(\d+)\s+/\s+(\d+)\s+\[\s*(\d+)\%]\s+【 内力 】\s+(\d+)\s+./\s+(\d+)\s+.*$

在发送里输入say %1 %2 %3 %4 %5

门派:桃花岛
 楼主| 发表于 2018-11-29 03:09:20 | 显示全部楼层
对了 还有个可能性 我刚才做饭时候想到 ,

如果   local t = tonumber(w[3])

如果不能顺利拿到数据 或者w 取到的不是一个数字值
那么 t 就会被赋予一个 空值... trigger 测试下... 不过师兄师姐... 我从没用过mush 不知道能否真的做好这个实验



我等下做个简单的实验, 或者师兄师姐有时间可以先帮忙做下


^(> )*你身上带着(\\D*)件东西\\(负重\\s*(\\d*)\\.\\d*\\%\\):

返回一个   say %1 %2 %3

我们看看能取到什么样的数据... 再进行下一步测试
门派:桃花岛
发表于 2018-11-29 03:38:31 | 显示全部楼层
感觉像看天书一样 看来一阵风也是个程序大神 你好好研究 完事让我们受益先谢谢了
门派:桃花岛
 楼主| 发表于 2018-11-29 05:50:33 | 显示全部楼层
... 要不无法风师兄 你加一句

print (数值是 t)

看看可以看到数据不
门派:桃花岛
发表于 2018-11-29 11:57:46 | 显示全部楼层
学习了,谢谢!初步断定一阵风师弟是程序员出身的,桃花有福了,得靠你和无法师兄把mush ,lua 玩转了。
门派:桃花岛
 楼主| 发表于 2018-11-29 15:30:24 | 显示全部楼层
汗 真不是程序员... 真程序员就不需要摸索了...
门派:桃花岛
发表于 2018-11-29 18:40:12 | 显示全部楼层
作为桃花岛弟子很幸福 武器有师姐们给,程序有新来的程序员同学们真好
门派:桃花岛
 楼主| 发表于 2018-11-30 02:35:00 | 显示全部楼层
- -... 不知道无法风 师兄有空测试不... 我的id 级别太低... 貌似mush 也不太会用... 还没法测试
门派:桃花岛
发表于 2018-11-30 11:54:34 | 显示全部楼层
加油,无法师兄终于有帮手了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-9-19 04:18 , Processed in 0.049347 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表