Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 1424|回复: 8

[命令方块] [CBL·pca]检测实体死前位置的新方法

[复制链接]
发表于 2015-10-18 18:25:06 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 pca006132 于 2016-1-10 19:24 编辑

废话
一直以来,检测实体的死前位置都是一件很麻烦的事情。常见的方法有:
配对——就是每个实体给一个编号,然后把指定编号的盔甲架tp到那个实体那里
这个方法虽然不太可能出错,因为那个盔甲架是肯定传送到指定的实体那里的,然而那个穷举数十分多。
检测掉落物——这个方法就是给生物一个装备,可能是不能显示的。然后该生物死后,那装备就会掉下,检测那个装备就代表检测那个生物死前的位置。
然而这个方法有极大的局限,比如说野生的生物,你需要更改他们的装备,就可能会令他们原本的装备失去。也不能够追踪其他实体种类。

有一天,我突然想弄这个,想了想,其实我们要做的东西其实很简单。
流程就是

选择实体?选择最近的从未选择过(这1游戏刻)的盔甲架并把其tp过来
(不停重复以上步骤直至所有实体都选择完)

那么剩下的不就是代表的实体"死了"的盔甲架吗?
虽然的确会有bug,比如一些会传送的实体,可能就不适合这个。还有当实体很靠近的时候可能会互相干扰,盔甲架可能到了旁边的实体也不一定,然而这其实根本就无关要紧,只要不是不能用就好了2333333333
(起码这个比一大堆穷举/只能检测生物的位置对我来说方便点吧23333)
—————分隔线—————
思路、原理分析
首先,我们用stats把指定实体和盔甲架的successcount储存到记分板,并且把其分数设置为0。
然后,我们execute指定实体execute该实体最近还没被选择的盔甲架tp到最近还没被选择过的指定实体
比如execute @e[type=!Player,score_time=1,score_time_min=1] ~ ~ ~ execute @e[c=1,type=ArmorStand,score_stats=0] ~ ~ ~ tp @e[c=1] @e[c=1,score_time=1,score_time_min=1,score_stats=0]
由于tp了之后,该实体和用以标记的盔甲架的successcount分数都会为1(execute的成功),所以之后就不会选择到它们

之后,我们就可以对stats分数为0的盔甲架为所欲为♂ (因为stats为0的盔甲架就代表了它是剩下的一个,没有任何配搭,代表它所标记的实体死了)

#其实这里有个假设的,我刚才忘记说明了2333333我是假设每个实体最近的盔甲架为其上1gt的位置,所以这东西是根据这个假设来运作的
如果那个实际情况违背了这个假设(比如会瞬移的实体),这样子这个系统就会出很大的bug
—————分隔线—————
例子
例子下载: http://pan.baidu.com/s/1o6N86Ps

这个例子是标记僵尸的,然而其他的实体也是能够标记的,只要不是末影人这类会传送的。
命令:
  1. scoreboard players add @e[type=Zombie] time 0
  2. execute @e[score_time=0,score_time_min=0] ~ ~ ~ summon ArmorStand ~ ~ ~ {CustomName:"Marker",Invisible:1b,NoGravity:1b,Invulnerable:1b}
  3. scoreboard players set @e[score_time=0,score_time_min=0] time 1
  4. scoreboard players set @e[type=!Player] stats 0
  5. execute @e[type=!Player] ~ ~ ~ stats entity @e[c=1,r=0,type=!Player] set SuccessCount @e[c=1,r=0,type=!Player] stats
  6. scoreboard players set @e[type=!Player] stats 0
  7. execute @e[type=!Player,score_time=1,score_time_min=1] ~ ~ ~ execute @e[c=1,type=ArmorStand,score_stats=0] ~ ~ ~ tp @e[c=1] @e[c=1,score_time=1,score_time_min=1,score_stats=0]
  8. scoreboard players set @e[score_stats=0,name=Marker] time -5
  9. execute @e[score_time=-5,type=ArmorStand] ~ ~ ~ /particle fireworksSpark ~ ~ ~ 0 0 0 1 50
  10. kill @e[score_time=-5,type=ArmorStand]
复制代码

首先,前三个命令都是为了标记新诞生的僵尸,并且让他们生成盔甲架的。我们先把所有僵尸的time分数+0(不改变分数,然而如果没有分数就会把分数变为0),然后让所有time分数为0的summon盔甲架,之后把他们的分数设置为1(让他们不会再生成盔甲架)。

之后的3个命令就是为了设置僵尸和盔甲架的stats
首先把stats分数设置为0(以免出现没有分数的情况),然后设置stats(每只僵尸和盔甲架的successcount设置给自己的stats分数里),最后把stats分数设置为0(因为上一个命令是成功的,所以他们的stats分数是1)

然后,那一个命令就是整个系统的核心了,详见上一个部分的解释 (虽然也说得不详细)

最后的三个指令,就是用来对那个stats分数为0的实体执行操作的
首先我们把stats分数为0的实体用time分数来标记,因为execute命令在他们身上执行了之后也是会让其分数变为1的
之后我们就执行一些指令(比如在这里就是用particle指令来告诉玩家这个盔甲架的主人死了)
最后就把那个没有主人的盔甲架杀死
—————分隔线—————
bug:
1.不能指定末影人这类会瞬移的实体,因为他们传送来传送去,这系统根本就不知道哪个盔甲架代表哪只末影人,于是那些位置就可能乱起来
2.不能跨世界指定,因为那盔甲架我并不能保证它能够过去那个世界(尤其是末地)
3.实体之间距离很接近的话,那个stats有可能会混乱(由于那个stats储存的分数是给最近的非玩家实体,太靠近可能会给错人,其原因应该是MC的特性吧。。。),于是那个盔甲架可能会传送到同一个实体那里。然而不用担心,等一会/实体之间的距离远了的话,这个bug就会自动消失。
4.玩家千万千万别打要标记的实体。。。。。。。无论是创造模式还是生存等都千万别打。。。。原因还是未知,可能就是MC的特性

—————分隔线—————
感谢~
感谢空白、乾坤、CBL诸位及新手群、TML的大家给我的鼓励与支持~
其实呢,这个最重要的用途并不是检测实体死前位置,而是配对实体啊23333
不知道有没有人发现呢:D
感谢我的浴室,让我想到这个脑洞
感谢所有朋友,催我赶工,不然的话可能就没有这东西了(毕竟懒癌已经晚期了)233333


来自群组: Command Block Logic

评分

参与人数 3人气 +3 金粒 +30 收起 理由
正价氟 + 1 + 10 刚研究出来你就发了
kongbaiyo + 1 + 20 屌极了
840196733mw + 1 很棒的作品!

查看全部评分

回复

使用道具 举报

发表于 2015-10-18 18:33:03 | 显示全部楼层
然而貌似实用性不大。。。
回复

使用道具 举报

发表于 2015-10-18 18:30:11 | 显示全部楼层
非常强的算法!
屎无前例的屌233

方便了很多系统的制作√
虽然看了好久才看懂233
回复

使用道具 举报

发表于 2015-10-18 18:34:47 | 显示全部楼层
沙发,以及终于做出来了,不过为什么看不大懂,还不够新手群说的详细
回复

使用道具 举报

发表于 2015-10-18 18:35:01 | 显示全部楼层
完了

我已经彻底看不懂了

想当年我还是研究这一块的一员呢
回复

使用道具 举报

发表于 2015-10-18 19:48:57 | 显示全部楼层
看懂了,然而你为什么要用僵尸举例子(不应该是!Player吗)
而且这样干实体不会卡爆电脑吗(增加了一倍诶…)而且给末影人配对会出很大的bug(强行占有别人的AS)
上面的朝 阳 区一定有一种被抛弃的赶脚2333333
所以bug还是太多
回复

使用道具 举报

 楼主| 发表于 2015-10-18 20:03:48 | 显示全部楼层
lzs1234 发表于 2015-10-18 19:48
看懂了,然而你为什么要用僵尸举例子(不应该是!Player吗)
而且这样干实体不会卡爆电脑吗(增加了一倍诶… ...

首先,因为我不想排除玩家和盔甲架所以就使用了僵尸作例子(主要原因是懒)
第二,不这样子的话是不可能锁定他的位置的,因为我们根本不知道他什么时候死
第三,除了你穷举以外,所有方法基本上都是会在这情况下失效的了,毕竟都tm会瞬移了还说什么位置2333
bug这东西嘛,说真的有两个都是Mojang的镬,毕竟这次选择器实在是太坑爹了,其实之前还发现了更多的,不过强行改好了而已
回复

使用道具 举报

发表于 2015-10-18 20:44:45 | 显示全部楼层
pca006132 发表于 2015-10-18 20:03
首先,因为我不想排除玩家和盔甲架所以就使用了僵尸作例子(主要原因是懒)
第二,不这样子的话是不可能锁 ...

所以只要有一个末影人就会乱……
回复

使用道具 举报

发表于 2015-10-18 20:41:25 | 显示全部楼层
pca006132 发表于 2015-10-18 20:03
首先,因为我不想排除玩家和盔甲架所以就使用了僵尸作例子(主要原因是懒)
第二,不这样子的话是不可能锁 ...

所以只要有一个末影人就会乱……

评分

参与人数 1金粒 +1 收起 理由
andylizi + 1 你回复了两次,已举报√ .

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2017-11-25 10:03 , Processed in 0.085459 second(s), 9 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

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