找回密码
 点一下
查看: 2037|回复: 24

单位拥有某类型物品的原理是什么呢?

[复制链接]
发表于 2009-7-14 22:06:29 | 显示全部楼层 |阅读模式
今天凑巧帮别人做了个演示,是两个相同物品的合成,捡取一个判断身上是否有另一个然后执行,做法和我的物品叠加类似。而后做了三个相同物品的合成,用同样的方法加上了多重判断,按步就班的运行演示没有发现问题,但特殊情况下却运行不能:

让单位身上直接在2、3格放上物品,捡取的话,触发都不会运行,也就是说,第一层条件无法通过,然后第2格空出来,会执行一次捡取、删除、创建的小循环,同样不会合成,而第3格空出来以后,捡取就会合成。然后回过头去重新整理两个物品合成,发出同样存在该问题,先捡取一个,然后移到后面几格的位置,再捡取一个,触发器同样不会运行。

[trigger]
    事件
        单位 - 任意单位 获得物品
    条件
        ((触发单位) 拥有 ((被操作物品) 的类型)) 等于 TRUE
        (被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))
    动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                ((被操作物品) 的类型) 等于 攻击之爪 +3
            Then - 动作
                物品 - 删除 ((触发单位) 所持有的 ((被操作物品) 的类型))
                如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        ((触发单位) 拥有 ((被操作物品) 的类型)) 等于 TRUE
                        (被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))
                    Then - 动作
                        物品 - 删除 ((触发单位) 所持有的 ((被操作物品) 的类型))
                        物品 - 删除 (被操作物品)
                        英雄 - 创建 攻击之爪 +6 给 (触发单位)
                        游戏 - 对 (所有玩家) 发送文本信息: (你合成出了: + ((最后创建的物品) 的名字))
                        跳过剩余动作
                    Else - 动作
                        英雄 - 创建 攻击之爪 +3 给 (触发单位)
                        跳过剩余动作
            Else - 动作
                无动作
[/trigger]

同类物品合成(2件).w3x

11 KB, 下载次数: 13

同类物品合成(3件).w3x

13 KB, 下载次数: 10

发表于 2009-7-15 06:58:13 | 显示全部楼层
………………………………………………(意思(被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型)))
………………………………………………(意思:我觉得问题在这里。)
………………………………………………(意思:很有可能((触发单位) 所持有的 ((被操作物品) 的类型))得到的就是(被操作物品)而不是单位身上的另一个物品,应该算是魔兽的RPBug吧…………或者说是用法不太对?)
回复

使用道具 举报

 楼主| 发表于 2009-7-15 10:08:34 | 显示全部楼层
单位身上拥有某类型物品的运作方式可能是同样采用循环判断,对每一格物品进行判断,而如果问题出现在第一格的话,会因为判断的物品条件不会达成也就自动放弃了后面的判断。
回复

使用道具 举报

发表于 2009-7-15 10:24:36 | 显示全部楼层
先删除拾取的物品,再判断
回复

使用道具 举报

发表于 2009-7-15 13:35:40 | 显示全部楼层
条件错了。
WC3的判断是这样。物品获得的事件下,任何的判断都认为(被操作物品)已经被(触发单位)持有。
也就是说,单位是拿到物品后,才会进行触发判断。


(被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))

这句话有问题

懒的写,直接贴下我自己写的物品叠加,一直很稳定,应该能说明问题
[trigger]
NQZ WPDJ
    事件
        单位 - 任意单位 获得物品
    条件
        任一条件成立
            条件
                ((被操作物品) 的类型) 等于 生命石
                ((被操作物品) 的类型) 等于 智慧石
                ((被操作物品) 的类型) 等于 法术石
                ((被操作物品) 的类型) 等于 灵魂碎片
                ((被操作物品) 的类型) 等于 火腿
                ((被操作物品) 的类型) 等于 泉水
                ((被操作物品) 的类型) 等于 重生十字章
    动作
        设置循环整数B的值为 0
        For循环整数A从 1 到 6, 做动作
            Loop - 动作
                如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        (((触发单位) 物品栏第 循环整数A [R] 格的物品) 的类型) 等于 ((被操作物品) 的类型)
                    Then - 动作
                        设置循环整数B的值为 (循环整数B [R] + 1)
                    Else - 动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                循环整数B [R] 等于 2
            Then - 动作
                For循环整数A从 1 到 6, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                (((触发单位) 物品栏第 循环整数A [R] 格的物品) 的类型) 等于 ((被操作物品) 的类型)
                                ((触发单位) 物品栏第 循环整数A [R] 格的物品) 不等于 (被操作物品)
                            Then - 动作
                                物品 - 设置 ((触发单位) 物品栏第 循环整数A [R] 格的物品) 的使用次数为 ((((触发单位) 物品栏第 循环整数A [R] 格的物品) 的使用次数) + ((被操作物品) 的使用次数))
                            Else - 动作
                物品 - 删除 (被操作物品)
                设置循环整数B的值为 0
            Else - 动作
[/trigger]
我的代码里把循环B作为计数,计算包括(其实在身上但看不见的当前被操作物)在内的所有该类型物数量
如果本身就有,那就执行叠加计算

这个叠加代码还有个附的触发,是解决当物品全满的时候,购买/拾取时候的叠加问题。

我是图快,用循环A/B做的,当然建议用JASS或自定义来取代AB。
回复

使用道具 举报

发表于 2009-7-15 13:39:26 | 显示全部楼层
单位拥有的某类型物品
似乎bj里是循环1~6判断单位物品栏格位是否此物品类型
如果有的话,返回的是单位最前面的匹配的物品类型

所以自己写循环吧。。。。。。
回复

使用道具 举报

 楼主| 发表于 2009-7-15 18:58:53 | 显示全部楼层

回 4楼(niqize) 的帖子

感谢回复,你对这个条件的理解也有错误,这个判断是会成立的,而且是绝对会成立,但运行方式似乎存在某些不能理解的BUG,所以在以前我所做的物品叠加的演示中,我是添加了副触发的,而且可行性非常高,另外对于满物品捡取是不存在必要的判定的吧。

物品叠加.w3x

18 KB, 下载次数: 14

回复

使用道具 举报

发表于 2009-7-15 20:58:59 | 显示全部楼层

Re:回 4楼(niqize) 的帖子

引用第6楼551155于2009-07-15 18:58发表的 回 4楼(niqize) 的帖子 :
感谢回复,你对这个条件的理解也有错误,这个判断是会成立的,而且是绝对会成立,但运行方式似乎存在某些不能理解的BUG,所以在以前我所做的物品叠加的演示中,我是添加了副触发的,而且可行性非常高,另外对于满物品捡取是不存在必要的判定的吧。
可能我是记错了,曾经专门研究过这个。

至于满物品拾取,是需要的吧?

比如,身上带满物品,其中有药水5个(叠加),再遇到药水在地上,点击会提示物品已满。

这个必须要做触发来处理下吧,好让单位继续拾取
回复

使用道具 举报

发表于 2009-7-16 00:34:55 | 显示全部楼层
引用第2楼551155于2009-07-15 10:08发表的  :
单位身上拥有某类型物品的运作方式可能是同样采用循环判断,对每一格物品进行判断,而如果问题出现在第一格的话,会因为判断的物品条件不会达成也就自动放弃了后面的判断。
弱弱得问,你也有结论了,这个问题算解决了嘛?~
回复

使用道具 举报

发表于 2009-7-16 00:59:58 | 显示全部楼层
我稍微回忆一下以前的实验,原理可能是这样:

这是物品栏
[1] [2]
[3] [4]
[5] [6]

假设在空物品栏的状态下,拾取了攻击之爪+3(设为A),那就变成了
[A] [2]
[3] [4]
[5] [6]

这时候再拾取一个攻击之爪+3(设为B),那就是
[A] [B]
[3] [4]
[5] [6]

既然这种情况下,触发正常。那

条件1: ((触发单位) 拥有 ((被操作物品) 的类型)) 等于 TRUE
条件2: (被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))

就都满足了

显然第一种为TURE是自然的。
而第二种为TURE,其中 ((触发单位) 所持有的 ((被操作物品) 的类型))是一个物品栏循环。
如果是数组判断的话,肯定这条不成立,因为 B 不等于 A,但B等于B。
所以,假定((触发单位) 所持有的 ((被操作物品) 的类型))返回的是第一个找到的物品,那也就是A。

基于这个假设,再来验证

已知,在A更换位置后,这个触发就不成功了

例如
[B] [2]
[3] [A]
[5] [6]

为什么呢?

在运行条件一的时候,判断依然为TURE.
但按照先前的假设,运行到条件二,因为B是第一个,所以持有物品类型返回值是B,而B是等于B的,所以条件不成立,触发不运行

所以,根据正反推论,我的结论是

单位所持有的某类型物品的本质是,循环判断单位物品栏,返还第一个符合条件的物品。
回复

使用道具 举报

 楼主| 发表于 2009-7-16 12:03:29 | 显示全部楼层
这里有一个问题就是:拾取物品的时候,该物品是否就属于该单位物品。经过测试,是即时生效,所以其实我的第一条判断语句真的是多余的。至于第二条,跟据你推算的原理,的确是返回第一个物品,当B处于其它同类物品之前,先返回的就是B,那触发就不会运行,和你的结论完全相同。谢谢啦
回复

使用道具 举报

 楼主| 发表于 2009-7-16 12:14:13 | 显示全部楼层
跟据上述原理(返回第一个判断值),我做了一个更改,发现这样子就可以解决问题:

[trigger]
    事件
        单位 - 任意单位 获得物品
    条件
        ((被操作物品) 的使用次数) 大于 0
    动作
        单位 - 命令 (触发单位) 移动 (被操作物品) 到物品栏第 6 格
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                (被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))
            Then - 动作
                物品 - 设置 ((触发单位) 所持有的 ((被操作物品) 的类型)) 的使用次数为 ((((触发单位) 所持有的 ((被操作物品) 的类型)) 的使用次数) + ((被操作物品) 的使用次数))
                物品 - 删除 (被操作物品)
            Else - 动作
                无动作
[/trigger]

当捡取物品的时候,先会放在最后一格,这样子判断肯定是最未了,如果没有同类物品就无所谓,如果有的话,就会跟据返回值而自动调整,唯一的状态就是可能会直接放在第六格,这个只需要在捡取的时候,做一个独立的循环,找出前面最后一个空格,把物品移动回去就可以了。
回复

使用道具 举报

 楼主| 发表于 2009-7-16 12:19:59 | 显示全部楼层
不知道为什么,编辑总是页面出错,所以只好再发一帖了,不利用循环也可以,只是多添加一个条件和一个动作,两者相关。
[trigger]
    事件
        单位 - 任意单位 获得物品
    条件
        ((被操作物品) 的使用次数) 大于 0
        ((被操作物品) 的自定义值) 不等于 1
    动作
        单位 - 命令 (触发单位) 移动 (被操作物品) 到物品栏第 6 格
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                (被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))
            Then - 动作
                物品 - 设置 ((触发单位) 所持有的 ((被操作物品) 的类型)) 的使用次数为 ((((触发单位) 所持有的 ((被操作物品) 的类型)) 的使用次数) + ((被操作物品) 的使用次数))
                物品 - 删除 (被操作物品)
            Else - 动作
                物品 - 设置 (被操作物品) 的自定义值为 1
                英雄 - 把 (被操作物品) 给 (触发单位)

[/trigger]
回复

使用道具 举报

发表于 2009-7-16 12:43:22 | 显示全部楼层
引用第12楼551155于2009-07-16 12:19发表的  :
不知道为什么,编辑总是页面出错,所以只好再发一帖了,不利用循环也可以,只是多添加一个条件和一个动作,两者相关。
[trigger]
    事件
        单位 - 任意单位 获得物品
    条件
.......

这段代码是有问题的。

比如,我拾取了人生中第一个攻击之爪+3,自定值改为1;
然后我邪恶的把它扔在地上,但是我很快又获得了一个新的攻击之爪+3,它的自定值改为1;
好了,我突然悔改了,去捡回原先丢掉的攻击之爪+3

这下问题来了

我身上带的是自定义值=1的攻击之爪+3,被判断的对象也是自定义值=1

那么,你这个叠加就无法触发,条件不满足。



另外,最后一句给与物品应该是多余的,触发运行的时候,物品就已经被认为在它身上。


你做自定义值可能是考虑效率,以免做无意义的动作,但是,按照你一开始改写的触发,反而没这个问题。

即使不需要叠加,在第六格,移动到第六格,也看不出变化。

至于要解决,也比较简单。 加个IF (单位物品栏第6格物品 )不等于( 被操作物品 )就可以了。

但这个移动的做法也是欠妥当的,因为玩家可能整理物品栏,明明刚刚放在第三格,一下子又去第六格。

不排除有人和这个自动整理反复抗争。
回复

使用道具 举报

发表于 2009-7-16 12:49:17 | 显示全部楼层
引用第10楼551155于2009-07-16 12:03发表的  :
这里有一个问题就是:拾取物品的时候,该物品是否就属于该单位物品。经过测试,是即时生效,所以其实我的第一条判断语句真的是多余的。至于第二条,跟据你推算的原理,的确是返回第一个物品,当B处于其它同类物品之前,先返回的就是B,那触发就不会运行,和你的结论完全相同。谢谢啦
话说,我开始的说的也是对的。

拾取物品事件发生后,余下的条件和动作,都在认定当前物品已经放置在单位身上。

至于那句T,我是不常用的。XX物品=XX物品的类型,从中文上,很难理解什么意思。

当然,已经知道持有的物品类型的意思是,单位第一个该类型物品了。
回复

使用道具 举报

 楼主| 发表于 2009-7-16 13:01:15 | 显示全部楼层
是的,这个问题其实通过附属触发一样可以解决,就是丢弃事件,把某些必要的物品自定义值清0,而且像物品叠加的物品并不是那些需要升级的装备,所以自定义值基本上是不需要的。另外自定义值并非是为了效率,而是必须存在,否则会造成无限循环。

至于最后的一步给予单位物品,其真实的效果就是:把物品放在单位身上原本应该存在的位置,但依然无法避免和原来处于物品栏6中的物品相突而无法回到原来的位置。这个问题可以通过保存变量的方式解决,但这样就涉及到了变量,而这个物品合成的触发最大的特点是可以直接移植而且方便有效。
回复

使用道具 举报

 楼主| 发表于 2009-7-16 13:06:01 | 显示全部楼层
不过该演示暂时还无法通过无变量单触发解决两个以上同类物品的叠加问题(其实是想到把物品通过中转物品栏进行中转而后再合成),这个等晚点再说了。
回复

使用道具 举报

发表于 2009-7-16 13:08:27 | 显示全部楼层
引用第15楼551155于2009-07-16 13:01发表的  :
是的,这个问题其实通过附属触发一样可以解决,就是丢弃事件,把某些必要的物品自定义值清0,而且像物品叠加的物品并不是那些需要升级的装备,所以自定义值基本上是不需要的。另外自定义值并非是为了效率,而是必须存在,否则会造成无限循环。

至于最后的一步给予单位物品,其真实的效果就是:把物品放在单位身上原本应该存在的位置,但依然无法避免和原来处于物品栏6中的物品相突而无法回到原来的位置。这个问题可以通过保存变量的方式解决,但这样就涉及到了变量,而这个物品合成的触发最大的特点是可以直接移植而且方便有效。
无限循环的问题,我漏了

但用IF 第六个物品 不等于 被操作物 比自定义值简单。

另外,不方便移植的问题应该不存在

比如,我写的叠加触发(见某楼),就没有用变量,就一个触发,复制粘贴,也没有附属触发。

另外,开启[自动创建变量]选项后,即使复制有全局变量的触发,也十分简易吧。
回复

使用道具 举报

发表于 2009-7-16 13:13:23 | 显示全部楼层
引用第16楼551155于2009-07-16 13:06发表的  :
不过该演示暂时还无法通过无变量单触发解决两个以上同类物品的叠加问题(其实是想到把物品通过中转物品栏进行中转而后再合成),这个等晚点再说了。
不妨稍微详细说下。
还有,我那个问题(单机有效/网络无效)还没有任何头绪,LZ有什么看法么?
回复

使用道具 举报

发表于 2009-7-16 13:31:23 | 显示全部楼层
楼主快点搞定这里啦!
http://bbs.islga.org/read.php?tid=14454
虽说一年过去了,但我还是很想看完这教程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-7-22 00:15 , Processed in 0.147390 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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