仙五前修改吧 关注:145贴子:14,795
  • 76回复贴,共1

关于AddEquip卸载装备

只看楼主收藏回复

我们知道AddEquip可以在增加数量中填写负数来实现丢弃装备,但对于装备在玩家身上的装备则无能为力。


player.AddEquip(equip_id, num, hint, a4, a5)


我们一般用到的是3个参数,即equip_id(装备ID),num(增加装备的数量,如果为负数代表移除),hint(是否产生提示消息,1是0否)。
例如:player.AddEquip(2001, -1, 1)
表示移除一个“竹青”,并产生提示:“失去装备:竹青”。
a4和a5都应为lua中的bool值,a5的意义暂时没有研究,第五个参数在脚本中也从未出现。
a4的bool如果等价于true,那么此命令不会从玩家身上移除装备,否则可以。
例如:player.AddEquip(2001, -1, 1, true)
如果我们只有一个竹青且被夏侯装备着,那么仍然提示失去装备,但并不会。
例如:player.AddEquip(2001, -1, 1, false)
那么夏侯的装备会被扒下来去掉!


回复
1楼2018-07-12 17:32
    前面提到第五个参数没有在脚本中出现过,其实第四个参数也就出现过一次,那是楼兰的青丝衣支线:


    猜测第四个参数的功能有可能是脚本写到这里才临时加上去的。显然他们根本没有进行测试:
    写脚本的人根据习惯用1/0表示是/否,可惜他们在lua中都等价于true。所以这段代码完全达不到他们期望的效果。


    回复
    2楼2018-07-12 18:04
      这里详细介绍一下所谓的“等价于true”。
      如果某个值(不论类型)在分支判断语句中和true有一样的效果,那就是等价于true。可以用以下方法来测试:


      local x=0 --或者其他需要测试的值,比如空表{},空字符串"",bool类型的true,也可以是nil。
      if x then
      global.Print("It equals to true.")
      end


      如果屏幕中输出了语句,那么x就等价于true。在lua中,除了nil和false,其他的都应该等价于true,这一点可以从逆向的代码中看出来,也可以用网上的资料以及上面的代码来佐证。
      而且AddEquip的代码还把参数a4的布尔值取了反,所以事实上是:能把装备从玩家身上卸载下来<=>a4是false或者nil。


      回复
      3楼2018-07-12 18:11
        这玩意儿其实还可以卸载武器,卸载后玩家的武器栏也能是“未装备”,战斗中武器模型还是和卸载前的一样,不过一普攻就崩溃了(意料之中)。可能是这个原因,他们设定在合成系统里,原料不能从玩家身上扒下来,使得玩家可以利用这个漏洞省钱。


        回复
        4楼2018-07-12 18:14
          a5的意义也搞懂了。现在RemoveEquip的步骤如下:


          将所有装备迭代进行以下操作(顺序不知道是已装备的一定在前面还是不一定):
          先判断装备是否和给定id相同,如果不是,则进入下一个循环。
          再判断装备是否被玩家装备,如果是且前面的a4等价于true,则进入下一个循环。
          如果装备已被装备,则把这个装备卸载下来。
          判断装备是否贴符,如果是且前面的a5等价于true,则进入下一个循环。
          循环终止条件:所有装备已经找过,或者删除装备的数量已满。


          所以a5是表示是否要忽略掉贴符了的装备。在合成系统里我看到它不会忽略贴符的装备,但不会把玩家装备扒下来。


          顺便说一句,因为代码特性,即使你有多个相同的装备,删掉一个,也有可能先迭代到你装备了的那件,这时候会把它扒下来。


          收起回复
          5楼2018-07-12 18:44
            只要修改3个字节就能让被装备的合成原料消失,我会将它集成在新版的mod增强工具里面。
            不过需要提醒用户在战斗前装备好武器。


            收起回复
            6楼2018-07-12 21:20
              原来竟然是这样的机理。。。不过也是意料之中啊。
              这么看起来装备应该是一个对象了,那么两个同ID的装备看起来不是一条记录,而这个对象的属性应该还有“贴符”这个数组?


              回复(8)
              7楼2018-07-21 12:05


                回复(2)
                来自iPhone客户端8楼2018-07-22 00:31


                  回复(14)
                  9楼2018-07-22 08:15



                    第一个图是一些变量,我分析过的就改了名字,一般的四字节整数就直接存这里,第二个图是一些函数,也是四字节但是表示的是函数的地址,比如通过这里存储的地址可以找到ChangeHP的内容


                    当然这里的变量名都是我自己取的。


                    回复(8)
                    10楼2018-07-27 16:46
                      开放给lua的函数就和上面的函数画风不一样,他需要读取lua传过来的变量,还可能要把变量值返回到lua中,比如下面的是获取攻击力的lua函数 player.GetAtk(id)


                      先拿到lua的第一个参数也就是player的ID,然后通过一个全局的函数利用ID找到对应的player实体对象,再调用偏移196的成员函数,把结果返回给lua。如果手动mark一下,就能把196翻译为我们做过的标记


                      回复(10)
                      11楼2018-07-27 16:52


                        这是IDA对于player.Call的简单翻译——因为我是手写的汇编,所以很难翻译准确。大意是说player.Call有两个参数,一个是ID,用来获取player对象,一个是偏移offset,用来调用该对象的某个成员函数。此外对于部分函数比如属性加成,还有一个参数用来表示是哪个属性(需要传入成员函数的参数),所以lua参数还会更多,这里就不详细解释了。


                        下图是player.Get,就不用调用函数而是可以直接取值返回了,对于有些值比如修为,我们需要知道哪一系,所以还会有个参数;IDA翻译的代码其实不对,就不用管了。




                        回复(9)
                        12楼2018-07-27 17:19
                          寻仙往事新增的武器和合成书是咋修改的


                          回复(9)
                          来自Android客户端14楼2018-10-30 21:53
                            上面这个是原版雷咒脚本,下面是寻仙的,把a,b那一串复制过去插在哪里呢


                            收起回复
                            来自Android客户端15楼2018-11-01 17:44