魔兽地图编辑器吧 关注:65,696贴子:3,845,931
  • 6回复贴,共1

用暴雪BlzAPI做魔龙枪,差点没被暴雪程序员气死

取消只看楼主收藏回复

魔龙枪的效果是增加单位射程。不想用科技,毕竟Dota还有双英雄等奇奇怪怪的模式,会影响所有拥有此科技的单位。JAPI不在考虑范围内,地图要在重制版单机运行的。那么如果用官方API,用的函数应该是BlzSetUnitWeaponRealField。


IP属地:上海1楼2020-06-13 10:40回复
    本以为这个挺简单,不就是这样吗?

    注意从1.31.1之后所有新函数参数中的下标都是从0开始的(甚至包括等级,这里一万句脏话)
    结果:

    咦?怎么没用?我的第一反应是,哦,这些实例函数有些域不能更改也是正常的,于是就没有管他。
    这是发生在一星期前的事情。


    IP属地:上海3楼2020-06-13 10:46
    回复
      2026-02-07 04:17:53
      广告
      不感兴趣
      开通SVIP免广告
      今天又回头搜一些增加射程的帖子,有的人提到JAPI竟然可以做到。那怎么就会有JAPI做得到而暴雪BlzAPI做不到的事情呢!会不会是1.31.0残留的Set和Get下标不一样的BUG?于是我随手一试:

      结果:

      果然如此,成功更改!
      由于物品掉落/出售那边减射程的代码还没有改,我手贱捡起放下捡起放下这个物品,看看会发生什么:

      果然一直增加......
      停!好像有什么不对,为什么第一次增加了一百多,第二次两百多,第四次直接增加到2500去了。


      IP属地:上海4楼2020-06-13 11:02
      回复
        复查了一下代码,没写错。
        于是计算了一下射程增加情况,680-550=130,940-680=260,1460-940=520,2500-1460=1040
        等比数列啊,魔兽还有这功能!
        得查一下,我这里传进去的参数是不是不对:

        确实没有问题,第一次680,第二次810,第三次940...


        IP属地:上海5楼2020-06-13 11:09
        回复
          仔细想了一下,从第二次开始,哪个940是怎么来的呢,明明传入的是810啊?
          940肯定来自680+260,那260哪里来的呢?
          真相只有一个,那就是260=810-550.
          原来你虽然传进去的是绝对值810,但是内部先计算了相对值,这里计算相对值又错误地用了武器1的值550,于是相对值=810-550=+260,然后让武器0增加了射程260,最后变成了940.
          这里用冰女验证了一下我的想法:

          虽然冰女只用武器0,但是武器1是有值的,她两个武器的射程又是不同的。
          830-600 = 230 = (600+130)-500


          IP属地:上海6楼2020-06-13 11:19
          回复
            那么好办了,我需要把对武器0的更新同步到武器1当中,特别是在Set之前。
            Set函数如果传入1改的实际上是武器0,那么改武器1传入2不就行了。于是,我这样写:

            结果可能你们已经猜到了,暴雪果然是一家惊喜连连的公司:

            没用!
            要么是做了入参校验,要么是在内部尝试获取武器2的时候异常抓住了直接返回。
            暴雪程序员你出来,我绝对不打死你。


            IP属地:上海7楼2020-06-13 11:33
            回复
              现在只能一不做二不休,又不是没办法了。这样实现反而更简单:

              测试了一下,perfect!
              其实对大部分单位而言传入的射程都是130或者其他错误的值。但是管他呢,it works. 而且和科技完美叠加。
              如果你以后看到了这样的代码,它就是对的,请不要感到奇怪;如果你想问怎么改武器1的值,那么这个艰巨而光荣的任务就交给你了!


              IP属地:上海9楼2020-06-13 12:01
              回复