From 89586ad8dffa9958371dbd015c0aca355844c42e Mon Sep 17 00:00:00 2001 From: devbeni Date: Sun, 14 Dec 2025 11:39:03 +0100 Subject: [PATCH] Fix: Remove TeleportTo calls that break villager AI/movement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove post-load villager TeleportTo refresh (breaks pathfinding) - Remove periodic villager position sync (TeleportTo interrupts movement) - Keep ClearVillagerPositionCache for API compatibility The TeleportTo calls were resetting villager AI state and preventing them from continuing their movement/work. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- LoadSaveOverrides/MultiplayerSaveContainer.cs | 23 ------- Main.cs | 60 +------------------ 2 files changed, 1 insertion(+), 82 deletions(-) diff --git a/LoadSaveOverrides/MultiplayerSaveContainer.cs b/LoadSaveOverrides/MultiplayerSaveContainer.cs index d24e038..0731e9d 100644 --- a/LoadSaveOverrides/MultiplayerSaveContainer.cs +++ b/LoadSaveOverrides/MultiplayerSaveContainer.cs @@ -295,29 +295,6 @@ namespace KCM.LoadSaveOverrides } } - // Fix 2: Refresh all villagers to fix stuck AI - Main.helper.Log("Refreshing villager states..."); - foreach (var kcPlayer in Main.kCPlayers.Values) - { - if (kcPlayer.inst == null) continue; - - for (int i = 0; i < kcPlayer.inst.Workers.Count; i++) - { - var villager = kcPlayer.inst.Workers.data[i]; - if (villager == null) continue; - - try - { - // Teleport to current position to reset pathfinding - villager.TeleportTo(villager.Pos); - } - catch (Exception e) - { - Main.helper.Log($"Error refreshing villager: {e.Message}"); - } - } - } - Main.helper.Log("Post-load multiplayer fixes complete."); return obj; diff --git a/Main.cs b/Main.cs index 1c28bb0..943d11f 100644 --- a/Main.cs +++ b/Main.cs @@ -182,75 +182,17 @@ namespace KCM #endregion public static int FixedUpdateInterval = 0; - private static Dictionary lastVillagerPositions = new Dictionary(); public static void ClearVillagerPositionCache() { - lastVillagerPositions.Clear(); + // Kept for API compatibility with LobbyManager } private void FixedUpdate() { - // Periodic villager position sync from server to clients - // Sync every 150 frames (~3 seconds at 50 FPS) to reduce bandwidth - if (KCServer.IsRunning && KCClient.client.IsConnected && FixedUpdateInterval % 150 == 0) - { - try - { - SyncVillagerPositions(); - } - catch (Exception e) - { - helper.Log($"Error in villager sync: {e.Message}"); - } - } - FixedUpdateInterval++; } - private void SyncVillagerPositions() - { - // Only sync villagers that have moved significantly - const float movementThreshold = 0.5f; - - foreach (var kcPlayer in kCPlayers.Values) - { - if (kcPlayer.inst == null) continue; - - for (int i = 0; i < kcPlayer.inst.Workers.Count; i++) - { - var villager = kcPlayer.inst.Workers.data[i]; - if (villager == null) continue; - - Vector3 currentPos = villager.Pos; - Vector3 lastPos; - - bool shouldSync = false; - if (!lastVillagerPositions.TryGetValue(villager.guid, out lastPos)) - { - // First time seeing this villager - lastVillagerPositions[villager.guid] = currentPos; - shouldSync = true; - } - else if (Vector3.Distance(currentPos, lastPos) > movementThreshold) - { - // Villager has moved significantly - lastVillagerPositions[villager.guid] = currentPos; - shouldSync = true; - } - - if (shouldSync) - { - new Packets.Game.GameVillager.VillagerTeleportTo() - { - guid = villager.guid, - pos = currentPos - }.SendToAll(KCClient.client.Id); - } - } - } - } - #region "TransitionTo" public static void TransitionTo(MenuState state) {