92 lines
3.1 KiB
C#
92 lines
3.1 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using UnityEngine;
|
|
|
|
namespace KCM.Packets.Game.GameBuilding
|
|
{
|
|
public class BuildingRemovePacket : Packet
|
|
{
|
|
public override ushort packetId => (ushort)KCM.Enums.Packets.BuildingRemove;
|
|
|
|
// Flag to prevent infinite loop when removing buildings from packet
|
|
public static bool isProcessingPacket = false;
|
|
|
|
public Guid guid { get; set; }
|
|
|
|
public override void HandlePacketClient()
|
|
{
|
|
if (clientId == KCClient.client.Id) return;
|
|
|
|
Main.helper.Log($"Received building remove packet for guid {guid} from {player.name}");
|
|
|
|
// Try to find the building in the player who owns it
|
|
Building building = player.inst.GetBuilding(guid);
|
|
|
|
if (building == null)
|
|
{
|
|
// Try to find it in any player's buildings
|
|
foreach (var kcp in Main.kCPlayers.Values)
|
|
{
|
|
building = kcp.inst.GetBuilding(guid);
|
|
if (building != null) break;
|
|
}
|
|
}
|
|
|
|
if (building == null)
|
|
{
|
|
Main.helper.Log($"Building with guid {guid} not found on client, may already be removed.");
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
Main.helper.Log($"Removing building {building.UniqueName} at {building.transform.position}");
|
|
|
|
// Set flag to prevent sending packet back
|
|
isProcessingPacket = true;
|
|
|
|
// Set Player.inst to the correct player for this building
|
|
// This ensures the removal modifies the correct player's job lists
|
|
Player originalPlayer = Player.inst;
|
|
Player correctPlayer = Main.GetPlayerByBuilding(building);
|
|
if (correctPlayer != null)
|
|
{
|
|
Player.inst = correctPlayer;
|
|
}
|
|
|
|
// Use reflection to call the Remove method from the game assembly
|
|
MethodInfo removeMethod = typeof(Building).GetMethod("Remove", BindingFlags.Public | BindingFlags.Instance);
|
|
if (removeMethod != null)
|
|
{
|
|
removeMethod.Invoke(building, null);
|
|
}
|
|
else
|
|
{
|
|
// Fallback: destroy the building GameObject directly
|
|
Main.helper.Log("Remove method not found, using Destroy fallback");
|
|
building.destroyedWhileInPlay = true;
|
|
UnityEngine.Object.Destroy(building.gameObject);
|
|
}
|
|
|
|
// Restore original Player.inst
|
|
Player.inst = originalPlayer;
|
|
isProcessingPacket = false;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
isProcessingPacket = false;
|
|
Main.helper.Log($"Error removing building: {e.Message}");
|
|
Main.helper.Log(e.StackTrace);
|
|
}
|
|
}
|
|
|
|
public override void HandlePacketServer()
|
|
{
|
|
// Forward the remove packet to all other clients
|
|
SendToAll(clientId);
|
|
}
|
|
}
|
|
}
|
|
|
|
|