From 550940b4ab776525041aac6bb4580f929656cd49 Mon Sep 17 00:00:00 2001 From: Tschipp <11649893+Tschipp@users.noreply.github.com> Date: Thu, 25 Dec 2025 14:19:05 +0100 Subject: [PATCH] Fixed Sync Issue after Respawning #850 #845 #843 --- .gitignore | 3 +++ .../src/main/java/tschipp/carryon/CarryOnCommon.java | 4 ++++ .../carryon/common/carry/PlacementHandler.java | 3 ++- .../main/java/tschipp/carryon/CarryOnFabricMod.java | 2 +- .../java/tschipp/carryon/events/CommonEvents.java | 11 ++++------- .../tschipp/carryon/carry/CarryOnDataSyncHandler.java | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 461017f..57e856b 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ build eclipse run runs + +# vscode +.vscode/* \ No newline at end of file diff --git a/Common/src/main/java/tschipp/carryon/CarryOnCommon.java b/Common/src/main/java/tschipp/carryon/CarryOnCommon.java index 6fbfd1e..b3230f1 100644 --- a/Common/src/main/java/tschipp/carryon/CarryOnCommon.java +++ b/Common/src/main/java/tschipp/carryon/CarryOnCommon.java @@ -108,6 +108,10 @@ public class CarryOnCommon CarryOnData carry = CarryOnDataManager.getCarryData(player); if(carry.isCarrying()) { + // Dumb Fix to sync Carry Data after a respawn with KeepInventory, because we can't sync in the first tick. + if(player.tickCount == 1) + CarryOnDataManager.setCarryData(player, carry); + if(carry.getActiveScript().isPresent()) { String cmd = carry.getActiveScript().get().scriptEffects().commandLoop(); diff --git a/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java b/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java index 64b2860..8c1924d 100644 --- a/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java +++ b/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java @@ -22,6 +22,7 @@ package tschipp.carryon.common.carry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; @@ -288,7 +289,7 @@ public class PlacementHandler public static void placeCarriedOnDeath(ServerPlayer oldPlayer, ServerPlayer newPlayer, boolean died) { CarryOnData carry = CarryOnDataManager.getCarryData(oldPlayer); - if (((ServerLevel) oldPlayer.level()).getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || !died) { + if (oldPlayer.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || !died) { if (!carry.isCarrying(CarryType.PLAYER)) { CarryOnDataManager.setCarryData(newPlayer, carry); newPlayer.getInventory().setSelectedSlot(oldPlayer.getInventory().getSelectedSlot()); diff --git a/Fabric/src/main/java/tschipp/carryon/CarryOnFabricMod.java b/Fabric/src/main/java/tschipp/carryon/CarryOnFabricMod.java index 4506c4f..64d8076 100644 --- a/Fabric/src/main/java/tschipp/carryon/CarryOnFabricMod.java +++ b/Fabric/src/main/java/tschipp/carryon/CarryOnFabricMod.java @@ -43,7 +43,7 @@ public class CarryOnFabricMod implements ModInitializer { // the isAlive check avoids us syncing attachment data about dead players. Which causes a disconnect // player.tickCount > 0 avoids us syncing attachment data about players the instant they spawn. // Which also causes a disconnect as the player entity may not be synced yet. - return p.connection != null && player.isAlive() && player.tickCount > 0; + return p.connection != null && player.isAlive() && !p.isRemoved() && player.tickCount > 0; }) diff --git a/Fabric/src/main/java/tschipp/carryon/events/CommonEvents.java b/Fabric/src/main/java/tschipp/carryon/events/CommonEvents.java index fa828c8..f5fa54b 100644 --- a/Fabric/src/main/java/tschipp/carryon/events/CommonEvents.java +++ b/Fabric/src/main/java/tschipp/carryon/events/CommonEvents.java @@ -22,6 +22,7 @@ package tschipp.carryon.events; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; +import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.CommonLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; @@ -133,13 +134,9 @@ public class CommonEvents { CarryOnCommon.onCarryTick(player); }); - ServerLivingEntityEvents.AFTER_DEATH.register((entity, damageSource)->{ - if (!(entity instanceof ServerPlayer)) return; - var player = (ServerPlayer) entity; - var carry = CarryOnDataManager.getCarryData(player); - if (carry.isCarrying(CarryType.PLAYER) || !player.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY)) PlacementHandler.placeCarried(player); - }); - + ServerPlayerEvents.COPY_FROM.register(((oldPlayer, newPlayer, alive) -> { + PlacementHandler.placeCarriedOnDeath(oldPlayer, newPlayer, !alive); + })); PlayerBlockBreakEvents.BEFORE.register(((world, player, pos, state, blockEntity) -> { if(!CarryOnCommon.onTryBreakBlock(player)) diff --git a/NeoForge/src/main/java/tschipp/carryon/carry/CarryOnDataSyncHandler.java b/NeoForge/src/main/java/tschipp/carryon/carry/CarryOnDataSyncHandler.java index 3f9b4d7..77af9e8 100644 --- a/NeoForge/src/main/java/tschipp/carryon/carry/CarryOnDataSyncHandler.java +++ b/NeoForge/src/main/java/tschipp/carryon/carry/CarryOnDataSyncHandler.java @@ -24,7 +24,7 @@ public class CarryOnDataSyncHandler implements AttachmentSyncHandler