diff --git a/src/main/java/milkucha/trmt/TRMTForgeEvents.java b/src/main/java/milkucha/trmt/TRMTForgeEvents.java index 683e464b..ec6d62b3 100644 --- a/src/main/java/milkucha/trmt/TRMTForgeEvents.java +++ b/src/main/java/milkucha/trmt/TRMTForgeEvents.java @@ -21,6 +21,7 @@ import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.event.level.ChunkWatchEvent; import net.minecraftforge.event.server.ServerStartedEvent; import net.minecraftforge.event.server.ServerStoppedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -48,11 +49,15 @@ public static void onServerStopped(ServerStoppedEvent event) { @SubscribeEvent public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player) { - ErosionMapManager.getInstance().sendFullSyncToPlayer(player); TRMTNetwork.sendVersionCheck(player); } } + @SubscribeEvent + public static void onChunkWatch(ChunkWatchEvent.Watch event) { + ErosionMapManager.getInstance().sendChunkSyncToPlayer(event.getPlayer(), event.getPos()); + } + @SubscribeEvent public static void onBlockBreak(BlockEvent.BreakEvent event) { ErosionMapManager.getInstance().removeEntry(event.getPos()); diff --git a/src/main/java/milkucha/trmt/erosion/ErosionMapManager.java b/src/main/java/milkucha/trmt/erosion/ErosionMapManager.java index 63d356c4..86ccdb77 100644 --- a/src/main/java/milkucha/trmt/erosion/ErosionMapManager.java +++ b/src/main/java/milkucha/trmt/erosion/ErosionMapManager.java @@ -243,25 +243,24 @@ public Map getAllChunkMaps() { // --- Networking --- - public void sendFullSyncToPlayer(ServerPlayer player) { + public void sendChunkSyncToPlayer(ServerPlayer player, ChunkPos chunkPos) { if (state == null) return; - for (Map.Entry chunkEntry : state.getAllChunkMaps().entrySet()) { - ChunkPos chunkPos = chunkEntry.getKey(); - Map entries = chunkEntry.getValue().getEntries(); - if (entries.isEmpty()) continue; - - List payloadEntries = new ArrayList<>(entries.size()); - for (Map.Entry e : entries.entrySet()) { - payloadEntries.add(new TRMTNetwork.SyncChunkMessage.Entry( - e.getKey(), - e.getValue().getErosionStage(), - e.getValue().getWalkedOnCount(), - e.getValue().getThreshold(), - e.getValue().getLastTouchedGameTime() - )); - } - TRMTNetwork.sendSyncChunk(player, chunkPos.x, chunkPos.z, payloadEntries); + + ChunkErosionMap map = state.getChunkMap(chunkPos); + Map entries = map != null ? map.getEntries() : Collections.emptyMap(); + List payloadEntries = new ArrayList<>(entries.size()); + + for (Map.Entry e : entries.entrySet()) { + payloadEntries.add(new TRMTNetwork.SyncChunkMessage.Entry( + e.getKey(), + e.getValue().getErosionStage(), + e.getValue().getWalkedOnCount(), + e.getValue().getThreshold(), + e.getValue().getLastTouchedGameTime() + )); } + + TRMTNetwork.sendSyncChunk(player, chunkPos.x, chunkPos.z, payloadEntries); } private void broadcastStageUpdate(BlockPos pos, int stage, float walkedOnCount, float threshold, long lastTouchedGameTime) {