Files
netease-modsdk-wiki/docs/wiki/entities/disabling-team-damage.md
2025-03-20 11:52:46 +08:00

184 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 禁用团队伤害
category: 巧思案例
tags:
- 中级
mentions:
- SirLich
- solvedDev
- Joelant05
- MedicalJewel105
- Luthorius
- TCLynx
---
# 禁用团队伤害
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
若需禁用团队伤害(使玩家无法攻击队友),请为每位玩家分配带有队伍名称的标签(本教程将使用`team1``team2``team3``team4`作为示例)。
警告该方法在领域服Realms中**不可用**原因是领域服存在一个漏洞会导致行为包中修改后的player.json文件失效游戏会直接忽略这些修改该问题可能在后续版本中修复但在1.20.15版本中尚未解决。此问题也影响更早的Minecraft版本
现在将以下伤害感应器组件添加至你的`player.json`文件的`"components": {}`部分。查看注释以获取详细说明。
::: code-group
```json [BP/entities/player.json#components]
"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
::: code-group
```json [BP/entities/player.json#components]
//"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"
]
}
}
```
:::
::: code-group
```json [BP/entities/arrow.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"
]
}
}
```
:::
::: code-group
```mcfunction [BP/functions/wiki-apply_team.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
```
:::
::: code-group
```mcfunction [BP/functions/wiki-apply_damage.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的影响。