Skip to content

禁用团队伤害

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

若需禁用团队伤害(使玩家无法攻击队友),请为每位玩家分配带有队伍名称的标签(本教程将使用team1team2team3team4作为示例)。 警告:该方法在领域服(Realms)中不可用,原因是领域服存在一个漏洞会导致行为包中修改后的player.json文件失效,游戏会直接忽略这些修改(该问题可能在后续版本中修复,但在1.20.15版本中尚未解决。此问题也影响更早的Minecraft版本)。

现在将以下伤害感应器组件添加至你的player.json文件的"components": {}部分。查看注释以获取详细说明。

json
"minecraft:damage_sensor":{
   "triggers":[
      { //若已有伤害感应器组件,只需将此对象复制到"triggers"数组中
         "on_damage":{
            "filters":{
               "any_of":[
                  {
                     "all_of":[
                        { "test":"has_tag", "value":"team1" }, //该玩家是否拥有此标签?
                        { "test":"has_tag", "subject":"other", "value":"team1" } //被攻击实体是否拥有此标签?
                     ]
                  },
                  {
                     "all_of":[ //以下为重复结构,为每个队伍添加相同配置
                        { "test":"has_tag", "value":"team2" },
                        { "test":"has_tag", "subject":"other", "value":"team2" }
                     ]
                  },
                  {
                     "all_of":[
                        { "test":"has_tag", "value":"team3" },
                        { "test":"has_tag", "subject":"other", "value":"team3" }
                     ]
                  },
                  {
                     "all_of":[
                        { "test":"has_tag", "value":"team4" },
                        { "test":"has_tag", "subject":"other", "value":"team4" }
                     ]
                  },
                  {
                     "all_of":[
                        { "test":"has_tag", "value":"team5" },
                        { "test":"has_tag", "subject":"other", "value":"team5" }
                     ]
                  }
               ]
            }
         },
         "deals_damage":false //若任意过滤器条件满足,本次攻击将不会造成伤害
      }
   ]
}

抛射物处理

由于抛射物实体使用的原始滤镜系统,实现此功能需要完全不同的方法。该方案需要以下组件:

  • 标签(Tags)
  • 周期性检测(Ticking)
  • 条件伤害(Hurt on Condition)
  • 函数(Functions)
json
//"components"部分
"minecraft:timer": { //用于通过事件给附近未标记的抛射物添加队伍标签
   "time": [
      0.0,
      0.1
   ],
   "looping": true,
   "time_down_event": {
      "event": "wiki:projectile_team",
      "target": "self"
   }
},
"minecraft:hurt_on_condition": { //使抛射物无法直接造成伤害
   "damage_conditions": [        //改为通过标签系统触发伤害
      {
         "filters": {
            "test": "has_tag",
            "value": "damage"
         },
         "cause": "projectile",
         "damage_per_tick": 4
      }
   ]
},
"minecraft:damage_sensor": {     //触发事件来移除damage标签
   "triggers": {                 //确保伤害只生效一次
      "cause": "projectile",
      "deals_damage": true,
      "on_damage": {
         "filters": {
            "test": "has_tag",
            "value": "damage"
         },
         "event": "wiki:stop_damage"
      }
   }
}

//"events"部分
"wiki:projectile_team": {  //根据玩家队伍标签应用对应的抛射物标签
   "run_command": {
      "command": [
         "function wiki-apply_team"
      ]
   }
},
"wiki:stop_damage": {      //移除damage标签的事件
   "run_command": {
      "command": [
         "tag @s remove damage"
      ]
   }
}
json
//"components"部分
"on_hit": {               //击中时触发事件...
   "definition_event": {
      "affect_projectile": true,
      "event_trigger": {
         "event": "wiki:hit",
         "target": "self"
      }
   },
   "remove_on_hit": {}
}

//"events"部分
"wiki:hit": {             //...执行函数,为不同队伍玩家添加damage标签
   "run_command": {
      "command": [
         "function wiki-apply_damage"
      ]
   }
}
mcfunction
execute @s[tag=team1] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team1
execute @s[tag=team2] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team2
execute @s[tag=team3] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team3
execute @s[tag=team4] ~ ~ ~ tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team4
mcfunction
execute @s[tag=team1] ~ ~ ~ tag @p[rm=0,r=1,tag=!team1] add damage
execute @s[tag=team2] ~ ~ ~ tag @p[rm=0,r=1,tag=!team2] add damage
execute @s[tag=team3] ~ ~ ~ tag @p[rm=0,r=1,tag=!team3] add damage
execute @s[tag=team4] ~ ~ ~ tag @p[rm=0,r=1,tag=!team4] add damage

注意:若修改arrow.json文件,请仔细考虑组件分组(component groups)的影响。