From eab7931f526255186f580fcac972982d41466b2d Mon Sep 17 00:00:00 2001 From: devbeni Date: Sun, 14 Dec 2025 10:52:39 +0100 Subject: [PATCH] Fix: Add position sync for villagers and duplicate check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add position property to AddVillagerPacket - Teleport villager to correct position on client - Add duplicate guid check to prevent double villager creation - Send position from Main.cs hook 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- Main.cs | 1 + Packets/Game/GamePlayer/AddVillagerPacket.cs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/Main.cs b/Main.cs index f574754..4125245 100644 --- a/Main.cs +++ b/Main.cs @@ -780,6 +780,7 @@ namespace KCM new AddVillagerPacket() { guid = __result.guid, + position = pos, // Include villager spawn position }.Send(); } catch (Exception e) diff --git a/Packets/Game/GamePlayer/AddVillagerPacket.cs b/Packets/Game/GamePlayer/AddVillagerPacket.cs index ae6d450..25708c9 100644 --- a/Packets/Game/GamePlayer/AddVillagerPacket.cs +++ b/Packets/Game/GamePlayer/AddVillagerPacket.cs @@ -12,6 +12,7 @@ namespace KCM.Packets.Game.GamePlayer public override ushort packetId => (ushort)Enums.Packets.AddVillager; public Guid guid { get; set; } + public Vector3 position { get; set; } public override void HandlePacketClient() { @@ -19,11 +20,25 @@ namespace KCM.Packets.Game.GamePlayer { if (KCClient.client.Id == clientId) return; + // Check for duplicate villager by guid + var existingVillager = player.inst.Workers.data.FirstOrDefault(v => v != null && v.guid == guid); + if (existingVillager != null) + { + Main.helper.Log($"Villager with guid {guid} already exists, skipping duplicate"); + return; + } + Main.helper.Log("Received add villager packet from " + player.name + $"({player.id})"); Villager v = Villager.CreateVillager(); v.guid = guid; + // Set villager position + if (position != Vector3.zero) + { + v.TeleportTo(position); + } + player.inst.Workers.Add(v); player.inst.Homeless.Add(v); @@ -31,6 +46,7 @@ namespace KCM.Packets.Game.GamePlayer catch (Exception e) { Main.helper.Log("Error handling add villager packet: " + e.Message); + Main.helper.Log(e.StackTrace); } }