磨砺
1.求一个原版指令,使得生物之间互相敌对,例如将5个骷髅和5个僵尸分为两个阵营,然后让这两个阵营对打
要求:使用原版指令,越简单越好,条数不限
版本:适用于1.12.2和1.14.3,如果指令不同时兼容这两个版本请分别给出适用指令
2.求一个原版指令,使得指南针指向某个实体,类似于dream的猎人游戏
要求:使用原版指令,越简单越好,条数不限
版本:适用于1.12.2和1.16.5,如果指令不同时兼容这两个版本请分别给出适用指令

喜欢红石的芙兰
本帖最后由 喜欢红石的芙兰 于 2022-2-20 16:15 编辑

第二个问题
对于1.16.5
  1. execute as @e[limit=1,tag=qwq] at @s run setworldspawn ~ ~ ~
复制代码

原理是把世界出生点设置到一个有“qwq”这个tag实体处,这样指南针就能一直指向了。
对于1.12.2
  1. execute @e[name=qwq] ~ ~ ~ setworldspawn ~ ~ ~
复制代码

原理是把世界出生点设置到一个叫“qwq”的实体处,这样指南针就能一直指向了,这个版本没/tag,只好用name或者计分板来标记被追踪的实体了。

以上命令都是放进循环命令方块,保持开启。
不过这个思路也存在一定的问题,就是每个玩家的出生点都需要用/spawnpoint命令来设置,不然全重生到被追踪的生物处了。


mc天栋





郁离子
对于1,https://www.mcbbs.net/thread-966902-1-1.html 是一个数据包,可以参考其指令

喜欢红石的芙兰
本帖最后由 喜欢红石的芙兰 于 2022-2-20 17:47 编辑

第一个问题
由于生物仇恨目标只能有一个,比较棘手,我的想法是:
先创建2个队伍,用来放要对打的双方团体
  1. /team add team1
  2. /team add team2
复制代码
然后把要对打的双方团体加入队伍(以一方是骷髅,一方是僵尸为例),加入队伍的指令可以循环执行,或者先把对打双方生成好,然后就执行一次。
  1. /team join team1 @e[type=minecraft:skeleton]
复制代码
  1. /team join team2 @e[type=minecraft:zombie]
复制代码
然后就是仇恨的设定,因为不是一个打一个这么简单,所以我想的是,队伍1的成员先随机围攻队伍2中的某个成员,队伍2该成员死亡后,仇恨再转移到队伍2的另一个随机成员,队伍2的仇恨设定同理。
仇恨设定的办法是用雪球,比如要让甲“恨”乙,那就在甲头上召唤一个Owner是乙的UUID的雪球,雪球打到甲,甲就会去锤乙了,当然实体要是僵尸骷髅铁傀儡之类的,毕竟总不能让物品展示框去锤掉落物吧。

召唤雪球的指令,特定时刻(见下文)执行(fromTeam2这个tag表示“来自”队伍2的雪球)
  1. /execute as @e[team=team1] at @s run summon snowball ~ ~3 ~ {Tags:["fromTeam2"]}
复制代码
  1. /execute as @e[team=team2] at @s run summon snowball ~ ~3 ~ {Tags:["fromTeam1"]}
复制代码

选择围攻对象,加上tag,如果围攻对象存在,不执行;不存在,随机抓一个加上tag准备来挨打(random1这个tag表示team1里面被围攻的那个)。
  1. /execute unless entity @e[tag=random1] run tag @e[team=team1,limit=1,sort=random] add random1
复制代码
  1. /execute unless entity @e[tag=random2] run tag @e[team=team2,limit=1,sort=random] add random2
复制代码

让被围攻对象被另一队的所有成员仇恨,本质是调整雪球的Owner,所以要循环执行,1.14UUID的格式是高低位,所以有L和M,比较麻烦
  1. /execute as @e[tag=fromTeam2] run data modify entity @s Owner.L set from @e[limit=1,tag=random2] UUIDLeast
复制代码
  1. /execute as @e[tag=fromTeam2] run data modify entity @s Owner.M set from @e[limit=1,tag=random2] UUIDMost
复制代码
  1. /execute as @e[tag=fromTeam1] run data modify entity @s Owner.L set from @e[limit=1,tag=random1] UUIDLeast
复制代码
  1. /execute as @e[tag=fromTeam1] run data modify entity @s Owner.M set from @e[limit=1,tag=random1] UUIDMost
复制代码

雪球成功砸到仇恨就锁定了。不过还需要注意的是,召唤雪球肯定不能一直召唤,所以是特定时刻召唤。也就是,当被围攻对象死亡,需要转移仇恨时,召唤一次雪球,实现这个的话需要在加tag的循环命令方块前面放置连锁条件制约的命令方块,加tag的指令成功执行,就转移仇恨,是这么个逻辑。

以上指令适用于1.14,1.12没有/tag没有/data,我想不到可行的办法

应该不是最好的办法,我只能想到这样子了

ArmorRush
本帖最后由 ArmorRush 于 2022-2-20 19:29 编辑

循环命令方块操作,通过召唤雪球让有标签A的生物与标签B的生物敌对:
execute at @e[tag=A] run summon minecraft:snowball ~ ~2 ~ {Tags: ["temp"]}
execute as @e[type=minecraft:snowball,tag=temp] run data modify entity @s owner.M set from entity @e[limit=1,tag=B] UUIDMost
execute as @e[type=minecraft:snowball,tag=temp] run data modify entity @s owner.L set from entity @e[limit=1,tag=B] UUIDLeast
生成有标签A的骷髅:
  1. /summon skeleton ~ ~1 ~ {Tags:["A"]}
复制代码

参考了更改怪的AI,更改他的攻击目标 - 原版问答 - Minecraft(我的世界)中文论坛 - (mcbbs.net)


zzkklep
另外,关于第一个问题的补充,Java版的僵尸实际上和猪人有共通的特性——即当僵尸受伤的时候会将附近游荡(无目标)的僵尸的目标设定为伤害来源。
题外话,基岩版可以直接利用TargetID这个属性修改仇恨

TheDevilCard
首先你这个是举例子 给具体指令应该不顶用
下面先阐述原理
/summon minecraft:snowball ~ ~1 ~ {"uuid"}
具体的生物有具体的标签 不同类型的调用也不一样 这个自己找一下
这个uuid是你召唤这个要被吸引仇恨实体的uuid  假设为a
把这个召唤到要对打的B生物头顶 收到雪球伤害
然后这样生物b就会判定为a攻击了自己 所以他俩就会打架

第二个 首先 要明白指南针指向世界出生点
那么之需要套用execute 已该实体为目标 设置世界出生点