From c47e085172036e12fea7abc51ea1274a86bbbf76 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Tue, 2 Jul 2024 00:04:20 +0800 Subject: [PATCH] Fix death handling (#1398) --- .../core/server/management/PlayerListMixin.java | 13 ++++++++----- .../core/world/damagesource/CombatTrackerMixin.java | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java index 088bb69a..04e0e845 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java @@ -11,9 +11,11 @@ import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.server.ArclightServer; import io.izzel.arclight.common.mod.util.ArclightCaptures; +import io.izzel.arclight.common.mod.util.Blackhole; import io.izzel.arclight.mixin.Decorate; import io.izzel.arclight.mixin.DecorationOps; import io.izzel.arclight.mixin.Eject; +import io.izzel.arclight.mixin.Local; import net.minecraft.core.BlockPos; import net.minecraft.core.LayeredRegistryAccess; import net.minecraft.network.Connection; @@ -396,17 +398,18 @@ public ServerPlayer respawn(ServerPlayer playerIn, boolean flag, Entity.RemovalR } } - @Redirect(method = "respawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;teleport(DDDFF)V")) - private void arclight$respawnPackets(ServerGamePacketListenerImpl instance, double d, double e, double f, float g, float h) { - var player = instance.player; + @Decorate(method = "respawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;teleport(DDDFF)V")) + private void arclight$respawnPackets(ServerGamePacketListenerImpl instance, double d, double e, double f, float g, float h, @Local(ordinal = -1) ServerPlayer player) throws Throwable { player.connection.send(new ClientboundSetChunkCacheRadiusPacket(((WorldBridge) player.serverLevel()).bridge$spigotConfig().viewDistance)); player.connection.send(new ClientboundSetSimulationDistancePacket(((WorldBridge) player.serverLevel()).bridge$spigotConfig().simulationDistance)); ((ServerPlayNetHandlerBridge) player.connection).bridge$teleport(new Location(player.serverLevel().bridge$getWorld(), player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot())); + if (Blackhole.actuallyFalse()) { + DecorationOps.callsite().invoke(instance, d, e, f, g, h); + } } @Inject(method = "respawn", at = @At("RETURN")) private void arclight$postRespawn(ServerPlayer serverPlayer, boolean bl, Entity.RemovalReason removalReason, CallbackInfoReturnable cir) { - var location = arclight$loc; arclight$loc = null; arclight$respawnReason = null; var fromWorld = serverPlayer.serverLevel(); @@ -414,7 +417,7 @@ public ServerPlayer respawn(ServerPlayer playerIn, boolean flag, Entity.RemovalR this.sendAllPlayerInfo(newPlayer); newPlayer.onUpdateAbilities(); newPlayer.triggerDimensionChangeTriggers(fromWorld); - if (fromWorld != location.getWorld()) { + if (fromWorld != newPlayer.serverLevel()) { PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(((ServerPlayerEntityBridge) newPlayer).bridge$getBukkitEntity(), fromWorld.bridge$getWorld()); Bukkit.getPluginManager().callEvent(event); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/damagesource/CombatTrackerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/damagesource/CombatTrackerMixin.java index 1f8677e6..b74779fa 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/damagesource/CombatTrackerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/damagesource/CombatTrackerMixin.java @@ -26,7 +26,9 @@ public class CombatTrackerMixin implements CombatTrackerBridge { if (!this.entries.isEmpty()) { var entry = this.entries.get(this.entries.size() - 1); var deathMessage = ((CombatEntryBridge) (Object) entry).bridge$getDeathMessage(); - cir.setReturnValue(deathMessage); + if (deathMessage != null) { + cir.setReturnValue(deathMessage); + } } else { if (this.arclight$emptyComnent != null) { cir.setReturnValue(this.arclight$emptyComnent);