From 7384da50e32c1c954c125182ad75fa04edc1388d Mon Sep 17 00:00:00 2001 From: Dominik Panek <33105114+psychoo102@users.noreply.github.com> Date: Fri, 29 Nov 2024 21:19:00 +0100 Subject: [PATCH] Fix for vehicle damage sync problems --- .../Sync/VehicleDamageSyncPacketHandler.cs | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/SlipeServer.Server/PacketHandling/Handlers/Vehicle/Sync/VehicleDamageSyncPacketHandler.cs b/SlipeServer.Server/PacketHandling/Handlers/Vehicle/Sync/VehicleDamageSyncPacketHandler.cs index 205322c4..28830b50 100644 --- a/SlipeServer.Server/PacketHandling/Handlers/Vehicle/Sync/VehicleDamageSyncPacketHandler.cs +++ b/SlipeServer.Server/PacketHandling/Handlers/Vehicle/Sync/VehicleDamageSyncPacketHandler.cs @@ -14,6 +14,11 @@ public class VehicleDamageSyncPacketHandler : IPacketHandler PacketId.PACKET_ID_VEHICLE_DAMAGE_SYNC; + + private readonly int MAX_DOORS = 6; + private readonly int MAX_WHEELS = 4; + private readonly int MAX_PANELS = 6; + private readonly int MAX_LIGHTS = 16; public VehicleDamageSyncPacketHandler( ISyncHandlerMiddleware middleware, @@ -26,10 +31,8 @@ IElementCollection elementCollection public void HandlePacket(IClient client, VehicleDamageSyncPacket packet) { - var otherPlayers = this.middleware.GetPlayersToSyncTo(client.Player, packet); - packet.SendTo(otherPlayers); - var player = client.Player; + bool isChanged = false; var vehicle = this.elementCollection.Get(packet.VehicleId) as Elements.Vehicle; @@ -39,20 +42,42 @@ public void HandlePacket(IClient client, VehicleDamageSyncPacket packet) { foreach (var door in Enum.GetValues()) if (packet.DoorStates[(int)door] != null) + { vehicle.SetDoorState(door, (VehicleDoorState)packet.DoorStates[(int)door]!); + isChanged = true; + } foreach (var wheel in Enum.GetValues()) if (packet.WheelStates[(int)wheel] != null) + { vehicle.SetWheelState(wheel, (VehicleWheelState)packet.WheelStates[(int)wheel]!); + isChanged = true; + } foreach (var panel in Enum.GetValues()) if (packet.PanelStates[(int)panel] != null) + { vehicle.SetPanelState(panel, (VehiclePanelState)packet.PanelStates[(int)panel]!); + isChanged = true; + } foreach (var light in Enum.GetValues()) if (packet.LightStates[(int)light] != null) + { vehicle.SetLightState(light, (VehicleLightState)packet.LightStates[(int)light]!); + isChanged = true; + } }); + if (isChanged) + { + var syncPacket = new VehicleDamageSyncPacket() { VehicleId = vehicle.Id, }; + for (int i = 0; i < this.MAX_DOORS; i++) syncPacket.DoorStates[i] = vehicle.Damage.Doors[i]; + for (int i = 0; i < this.MAX_WHEELS; i++) syncPacket.WheelStates[i] = vehicle.Damage.Wheels[i]; + for (int i = 0; i< this.MAX_PANELS; i++) syncPacket.PanelStates[i] = vehicle.Damage.Panels[i]; + for (int i = 0; i< this.MAX_LIGHTS; i++) syncPacket.LightStates[i] = vehicle.Damage.Lights[i]; + var otherPlayers = this.middleware.GetPlayersToSyncTo(client.Player, syncPacket); + syncPacket.SendTo(otherPlayers); + } } } }