禁用队友伤害
intermediate
领域服限制
此方法在领域服中无效,原因是领域服存在一个漏洞:行为包中修改的player.json文件不会被游戏读取,而是直接被忽略。
这个问题可能在未来的版本中被修复,但在1.20.15版本中仍未解决。此问题同样影响旧版Minecraft。
来自玩家的伤害
若要禁用队友伤害(使玩家无法伤害同队成员),需要为每个队友分配一个带有队伍名称的标签(本示例将使用team1、team2、team3和team4)。
然后将以下伤害感应器组件添加到player.json的"components": {}中。代码注释提供了详细说明。
BP/entities/player.json > minecraft:entity > 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": "no" // 若当前攻击交互满足任意过滤条件,则不会造成伤害
}
]
}来自抛射物的伤害
由于抛射物实体使用的过滤器较为原始,需要采用完全不同的方法实现此功能。
该方法涉及:
- 标签
- 计时器
- 条件伤害
- 函数
BP/entities/player.json
json
"components": {
"minecraft:timer": { // 用于通过事件为附近未标记的抛射物分配队伍
"time": [0, 0],
"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": { // ...进而触发事件
"triggers": { // 移除该标签以确保伤害只生效一次
"cause": "projectile",
"deals_damage": true,
"on_damage": {
"filters": {
"test": "has_tag",
"value": "damage"
},
"event": "wiki:stop_damage"
}
}
}
},
"events": {
"wiki:projectile_team": { // 此函数将根据玩家队伍标签
"queue_command": { // 为抛射物分配对应标签
"command": ["function wiki-apply_team"]
}
},
"wiki:stop_damage": { // 用于移除伤害标签的事件
"queue_command": {
"command": ["tag @s remove damage"]
}
}
}BP/functions/wiki-apply_team.mcfunction
execute as @s[tag=team1] at @s run tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team1
execute as @s[tag=team2] at @s run tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team2
execute as @s[tag=team3] at @s run tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team3
execute as @s[tag=team4] at @s run tag @e[rm=0,r=1,c=1,type=arrow,tag=] add team4BP/entities/arrow.json
json
"components": {
"minecraft:projectile": {
"on_hit": { // 命中时触发事件...
"definition_event": {
"affect_projectile": true,
"event_trigger": {
"event": "wiki:hit",
"target": "self"
}
},
"remove_on_hit": {}
}
}
},
"events": {
"wiki:hit": { // ...该事件执行函数
"queue_command": { // 为不同队伍的玩家添加伤害标签!
"command": ["function wiki-apply_damage"]
}
}
}BP/functions/wiki-apply_damage.mcfunction
execute as @s[tag=team1] at @s run tag @p[rm=0,r=1,tag=!team1] add damage
execute as @s[tag=team2] at @s run tag @p[rm=0,r=1,tag=!team2] add damage
execute as @s[tag=team3] at @s run tag @p[rm=0,r=1,tag=!team3] add damage
execute as @s[tag=team4] at @s run tag @p[rm=0,r=1,tag=!team4] add damage修改arrow.json时,请注意组件分组的影响。






