Skip to content

Commit 7218d04

Browse files
authored
fix(invulnerable): 无敌模式不再被创造模式玩家绕过, 默认值改回开启 (#69)
#67 无敌模式对创造模式玩家无效: - 原版 Entity#isInvulnerableTo() 的条件含 !source.isCreativePlayer(), 创造模式攻击被显式放行 - 因此只 setInvulnerable(true) 挡不住创造模式玩家, 管理员在创造模式下测试即「无敌无效」 - PlayerListener 新增 EntityDamageEvent 监听: 无敌假人 + 直接造成伤害的创造模式玩家 -> 取消事件 - 虚空 / /kill 等原版就该绕过无敌的来源不受影响 #68 默认值与文档不符: - Feature.invulnerable 默认选项 false -> true - config.yml default-features.invulnerable false -> true, version 24 -> 25 - README 一直写「假人默认开启无敌模式」, 现让行为与文档一致 本地实机验证 (Purpur 26.3): 无该配置键时生成即 Invulnerable:1b; 创造模式攻击被挡; /kill 仍生效; 控制台 /damage 被挡。 Co-authored-by: EndlessPixel <EndlessPixel@users.noreply.github.com>
1 parent aacc67e commit 7218d04

4 files changed

Lines changed: 40 additions & 3 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ Changelog for FakePlayer CE. Version `fp.buildN` matches the git tag / GitHub Re
1010

1111
## fp.build14 - (Not published | 未发布)
1212

13+
## fp.build14 - (Not published | 未发布)
14+
15+
### English
16+
17+
- **Invincible mode now really blocks damage.** A fake player with `invulnerable` enabled could still be hurt by players in **creative mode**: vanilla explicitly lets creative attackers bypass invulnerability, so admins testing in creative saw the fake take damage even though the feature was on (`/fp config` showed `true`, and the entity flag was set correctly). Damage dealt by a creative-mode attacker to an invulnerable fake player is now cancelled; sources that are supposed to bypass invulnerability (the void, `/kill`) still work (#67).
18+
- **`invulnerable` is enabled by default again**, matching the documentation ("fake players spawn with invincible mode enabled by default"). It had silently defaulted to disabled since an upstream commit, which the changelog never recorded. `config.yml` bumped to 25 (#68).
19+
20+
### 中文
21+
22+
- **无敌模式现在真的免伤。** 开启 `invulnerable` 的假人此前仍会被**创造模式**玩家打伤:原版对创造模式攻击显式放行无敌判定,导致管理员在创造模式下测试时看到假人掉血——尽管特性确实开着(`/fp config` 显示 `true`,实体标记也已正确设置)。现在创造模式玩家对无敌假人造成的伤害会被取消;原版本就该绕过无敌的来源(虚空、`/kill`)仍然可用(#67)。
23+
- **`invulnerable` 默认值改回开启**,与文档「假人默认开启无敌模式」一致。此前默认关闭是上游某次提交悄悄改的,更新日志从未记录过。`config.yml` 版本提升至 25(#68)。
24+
1325
## fp.build13 - 2026-10-03
1426

1527
### English

‎fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/listener/PlayerListener.java‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import com.google.inject.Inject;
44
import com.google.inject.Singleton;
55
import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
6+
import org.bukkit.GameMode;
67
import org.bukkit.entity.Player;
78
import org.bukkit.event.EventHandler;
89
import org.bukkit.event.EventPriority;
910
import org.bukkit.event.Listener;
11+
import org.bukkit.event.entity.EntityDamageEvent;
1012
import org.bukkit.event.player.PlayerToggleSneakEvent;
1113
import org.jetbrains.annotations.NotNull;
1214

@@ -41,4 +43,27 @@ public void onSneak(@NotNull PlayerToggleSneakEvent event) {
4143
}
4244
}
4345

46+
/**
47+
* 无敌模式: 开启无敌的假人不应受到伤害, 包括创造模式玩家的攻击。
48+
* <p>原版 {@code Entity#isInvulnerableTo()} 的条件里带 {@code !source.isCreativePlayer()},
49+
* 即**创造模式玩家的攻击被显式放行** (方便在创造模式下打无敌实体)。因此只靠
50+
* {@link Player#setInvulnerable(boolean)} 的话, 管理员在创造模式下打假人依然会掉血,
51+
* 看起来就是「无敌模式无效」(实体标记其实已经设上了)。</p>
52+
* <p>这里只拦「直接造成伤害的创造模式玩家」; 原版本就该绕过无敌的来源
53+
* (虚空、{@code /kill} 等) 不受影响。</p>
54+
*/
55+
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
56+
public void onInvulnerableFakeDamaged(@NotNull EntityDamageEvent event) {
57+
if (!(event.getEntity() instanceof Player victim)
58+
|| !victim.isInvulnerable()
59+
|| !manager.isFake(victim)) {
60+
return;
61+
}
62+
63+
if (event.getDamageSource().getDirectEntity() instanceof Player damager
64+
&& damager.getGameMode() == GameMode.CREATIVE) {
65+
event.setCancelled(true);
66+
}
67+
}
68+
4469
}

‎fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Feature.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public enum Feature implements Translatable, Singletons {
4545
"fakeplayer.config.invulnerable",
4646
List.of(Permission.config),
4747
List.of("true", "false"),
48-
"false",
48+
"true",
4949
faker -> String.valueOf(faker.isInvulnerable()),
5050
(faker, value) -> faker.setInvulnerable(Boolean.parseBoolean(value))
5151
),

‎fakeplayer-core/src/main/resources/config.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
# DO NOT EDIT
1414
# 不要修改
15-
version: 24
15+
version: 25
1616

1717

1818
# ============================================================
@@ -211,7 +211,7 @@ default-features:
211211
pickup_items: true
212212
skin: true
213213
look_at_entity: false
214-
invulnerable: false
214+
invulnerable: true
215215
replenish: false
216216
replace_tools: false
217217
autofish: false

0 commit comments

Comments
 (0)