黑茶RGO
版本:1.19.4
如题,比如如何让玩家拿着石剑攻击生物和其他玩家时被攻击的玩家获得10秒的凋零效果,尽量包含被横扫到的玩家和生物。

无敌三脚猫
可以写一个进度,像这样
  1. {
  2.     "criteria": {
  3.         "asdfaesd": {
  4.             "trigger": "player_hurt_entity",
  5.             "conditions": {
  6.                 "player": {
  7.                     "equipment": {
  8.                         "mainhand": {
  9.                             "item": "minecraft:stone_sword"
  10.                         }
  11.                     }
  12.                 }
  13.             }
  14.         }
  15.     },
  16.     "rewards": {
  17.         "function": "buff:stone_sword"
  18.     }
  19. }
复制代码
我们假设这个进度的命名空间id叫buff:stone_sword,触发的函数也叫buff:stone_sword,那函数就写成
  1. advancement revoke @s only buff:stone_sword
  2. effect give @e[distance=..6,nbt={HurtTime:10s}] minecraft:wither 10
复制代码
可以包含被横扫的生物,实际上,这个写法其实完全不能检测哪些生物被玩家用石剑砍了,就算玩家主手石剑,副手用弓射了一发也一样能触发

dh381
本帖最后由 dh381 于 2023-3-23 00:00 编辑
  1. {
  2.     "criteria": {
  3.         "asdfaesd": {
  4.             "trigger": "player_hurt_entity",
  5.             "conditions": {
  6.                 "player": {
  7.                     "equipment": {
  8.                         "mainhand": {
  9.                             "item": "minecraft:stone_sword"
  10.                         }
  11.                     }
  12.                 },
  13.                 "damage": {
  14.                     "type": {
  15.                        "is_projectile": false
  16.                     }
  17.                 }
  18.             }
  19.         }
  20.     },
  21.     "rewards": {
  22.         "function": "buff:stone_sword"
  23.     }
  24. }
复制代码

这样写进度可以检查伤害来源,就能避免拿弓射也触发进度,然后函数部分可以照抄楼上的方法了

黑茶RGO
本帖最后由 黑茶RGO 于 2023-3-23 00:24 编辑
dh381 发表于 2023-3-22 23:50
这样写进度可以检查伤害来源,就能避免拿弓射也触发进度,然后函数部分可以照抄楼上的方法了
...

那除了避免弓箭伤害,如何防止砍怪的瞬间周围没被砍的怪物被火烧,以及掉岩浆时也中凋零。以及这样能否让拿着石剑的玩家砍其他玩家时也会施加凋零buff

Muggle2077
本帖最后由 Muggle2077 于 2023-3-23 19:53 编辑

方法一:检测玩家近战攻击实体,然后用视线追踪找到被攻击的实体。

方法二:所有受伤实体用 execute on attacker 选择攻击者并检测其是否符合条件。

方法三:给实体分配 UID 并将 UID 转换为二进制,用标签存储在实体上。使用进度检测玩家攻击具有某个标签的实体。在具有 minecraft:ick 标签的函数中将检测结果转换回十进制并与实体的 UID 进行比较,确定被攻击的实体。

dh381
本帖最后由 dh381 于 2023-3-23 22:37 编辑
黑茶RGO 发表于 2023-3-23 00:06
那除了避免弓箭伤害,如何防止砍怪的瞬间周围没被砍的怪物被火烧,以及掉岩浆时也中凋零。以及这样能否让 ...

那就需要改成这样,这样的进度可以排除弹射物,火焰和药水的伤害,另外这个进度判据本身就可以判断玩家之间攻击
  1. {
  2.     "criteria": {
  3.         "asdfaesd": {
  4.             "trigger": "player_hurt_entity",
  5.             "conditions": {
  6.                 "player": {
  7.                     "equipment": {
  8.                         "mainhand": {
  9.                             "item": "minecraft:stone_sword"
  10.                         }
  11.                     }
  12.                 },
  13.                 "damage": {
  14.                     "type": {
  15.                        "is_projectile":false,
  16.                        "is_fire":false,
  17.                        "is_magic":false
  18.                     }
  19.                 }
  20.             }
  21.         }
  22.     },
  23.     "rewards": {
  24.         "function": "buff:stone_sword"
  25.     }
  26. }
复制代码

无敌三脚猫
本帖最后由 无敌三脚猫 于 2023-3-23 22:55 编辑
dh381 发表于 2023-3-23 22:35
那就需要改成这样,这样的进度可以排除弹射物,火焰和药水的伤害,另外这个进度判据本身就可以判断玩家之 ...

我昨天就这么写了,不过damage的type里无论写什么都没有用,不知道为啥
而且damage的direct_entity也没有用,不然用direct_entity也能判断是不是弓箭射的

无敌三脚猫
本帖最后由 无敌三脚猫 于 2023-3-26 10:51 编辑
dh381 发表于 2023-3-22 18:24
那就需要改成这样,这样的进度可以排除弹射物,火焰和药水的伤害,另外这个进度判据本身就可以判断玩家之 ...

原来"is_projectile":false之类的内容只在玩家远离受害者时生效,远距离射击时才不会触发触发这个进度
我之前在测试时一直是近距离射击导致触发这个进度,所以以为这个写法没用
mojangの奇妙逻辑

不对,看错了,是有一定距离才会设置正确地设置direct_entityhttps://bugs.mojang.com/browse/MC-137427
也不对,为什么我的direct_entity还是检测不了,算了当我没说
其实,你这个写法也不满足“防止砍怪的瞬间周围没被砍的怪物被火烧,以及掉岩浆时也中凋零”,就算damage的type能用,跟后面的指令也没有关系,还是会有刚好在同一时刻受伤的实体被指令选中