不动要塞

有关于落地物品事件的其他问题
版本1.12+     主要是单机,最好支持多人
之前需要
          1.检测有特定lore且在地面上的物品,例如检测lore或者名称为“扔到地上变成宝箱”的箱子物品掉落物
          2.在该物品处生成有内容的容器,例如在该物品处生成一个有颗钻石的箱子
          3.应当删除该掉落物


在前面大神的帮助下成功实现:http://www.mcbbs.net/thread-773909-1-1.html   
  1. /scoreboard players tag @e add sc {Item:{id:"minecraft:chest",Count:1b,tag:{display:{Name:"扔到地上生成箱子"}}},OnGround:1b}

  2. /execute @e[tag=sc] ~ ~ ~ /setblock ~ ~ ~ chest 0 keep {Items:[{Slot:0b,id:"minecraft:diamond",Count:1b}]}

  3. /kill @e[tag=sc,type=Item]
复制代码
但是,我发现,出现一个生成箱子的事件,会把其他没有生成箱子的物品也删掉


在非整格高的上面(比如雪,地毯,半砖)上不视为落地,不生成宝箱
我使用条件,虽然不会出现没生成宝箱就刷掉物品的情况,但还是会出现上面的
出现一个生成箱子事件,就删除物品
应该如何解决?



还有,放在展示框里也会被视为放在地上,且不会被删掉物品,能无限刷宝箱


=====================================================================================
因此,有这两个问题需要帮助:
        1:需要解决刷一个宝箱,会删掉其他没刷宝箱的物品的问题(主要问题)
        2:有办法解决在半砖上不能生成的问题吗(会需要像手榴弹,扔出物品爆炸,不然会出现扔到地毯                        上不爆炸的尴尬情况
        2:展示框里的物品也能出事件的问题(如果不能解决,我只能指定一个不能放展示区的地方,专门用来                   开箱)


ruhuasiyu
因为你setblock 后面是 keep,也就是说如果当前位置不是空气的话不放置方块
如果想要替换的话改成replace即可,但是注意到这样会将雪层和半砖一类的都替换掉
如果你的本意不是,你就需要指明你的意思了

展示框的问题你把第一条 @e 改成 @e[type=item] 即可,限定只有掉落物才检测。

pineapple_
你为什么要用keep
何replace而不为呢


坚持keep?瞎[和谐]乱嵌套execute大法好

  1. /scoreboard players tag @e add sc {Item:{id:"minecraft:chest",Count:1b,tag:{display:{Name:"扔到地上生成箱子"}}},OnGround:1b}

  2. /execute @e[tag=sc] ~ ~ ~ /execute @s[tag=!scc] ~ ~ ~ setblock ~ ~ ~ chest 0 keep {Items:[{Slot:0b,id:"minecraft:diamond",Count:1b}]}

  3. 可以和你之前一样使用制约模式(可以改成不用制约模式的,但是既然你用了我就不改了)
  4. /execute @e[tag=sc] ~ ~ ~ kill @s[tag=!scc]

  5. /scoreboard players tag @e[tag=sc] add scc

复制代码

pineapple_
我可能没看明白你这个
你到底是想不想在半转上生成

不动要塞
pineapple_ 发表于 2018-1-2 12:39
我可能没看明白你这个
你到底是想不想在半转上生成

想在半砖上生成,可以在检测物品落地的情况下,生成在如何东西上吗

⊙v⊙
笑出声...把展示框给忽视了
毕竟replace有破坏地形的可能。所以用keep也能理解

那么如果想保留keep。可以这样
保留你现在用的指令,同时

建立一个名为cd的dummy类计分板。之后,
一个紫cb,给所有@e[type=item,tag=sc]的实体+1分

另一个紫cb连着条件绿cb
紫:execute @e[type,tag,score_cd_min=5] ~ ~ ~ detect ~ ~1 ~ air 0 setblock ~ ~1 ~ chest 0 keep {...}
条件绿:kill @e[type,tag...,score_cd_min=5}

所以就是...
当掉落物落在正常地表时,根据你之前的命令会被set成箱子。
当落在比如半砖地毯等东西,且掉落物所在位置的头顶为空气时,也就是在半砖/地毯的y轴+1位置set箱子。

其实你可以一贴问完的...

不动要塞
⊙v⊙ 发表于 2018-1-2 13:51
笑出声...把展示框给忽视了
毕竟replace有破坏地形的可能。所以用keep也能理解

这样做,无论扔在哪都是生成在空中,离地面一格啊


  1. 1——
  2. execute @e[type=item,tag=sc,score_cd_min=5] ~ ~ ~ detect ~ ~1 ~ air 0 setblock ~ ~1 ~ chest 0 keep {Items:[{Slot:0b,id:"minecraft:diamond",Count:1b}]}
  3. 2——
  4. kill @e[type=item,tag=sc,score_cd_min=5]
  5. 3——
  6. scoreboard players tag @e[type=item] add sc {Item:{id:"minecraft:chest",tag:{display:{Name:"扔到地上生成箱子"}}},OnGround:1b}
  7. 4——
  8. /scoreboard players add @e[type=item,tag=sc] cd 1
复制代码



⊙v⊙
不动要塞 发表于 2018-1-1 20:39
这样做,无论扔在哪都是生成在空中,离地面一格啊

这么说,你后面列出的3个问题
第一个是发生在第二个的基础上。
而第二个,那个setblock指令后面可以改为replace,但是会有破坏地形的可能。可以保留keep。但是要添加我前面提到的那些,注意,是添加...
然后第三个问题,如楼上所说,@e选择器补上type就是了。

反正我试的时候没有问题,丢地上在当前y轴生成
丢半砖/上在y+1生成。

不过其实还会遇上其他问题的,毕竟问题根源就是setblock如果是多人模式,怕是到时候到处都是空箱子
(在多人模式下玩原版命令就要想很多东西,还有很多限制...所以还不如一个插件来得轻松快捷)

所以我的建议其实是检测到掉落物之后生成一个头戴箱子的隐形实体(也可以不戴...)
要点是通过loottable掉落指定/随机物品...
也就是用summon取代setblock...