From bc6761d2657488da381528e4e014c3cee40b1c40 Mon Sep 17 00:00:00 2001 From: EntenKoeniq <81123713+EntenKoeniq@users.noreply.github.com> Date: Mon, 12 Jul 2021 05:00:48 +0200 Subject: [PATCH] Vehicle synchronization for players MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Not tested ... I hope it works 😬 --- Client/Networking.cs | 202 ++++++++++++++++++++++++++++++++----------- Server/Server.cs | 67 ++++++++++++-- 2 files changed, 215 insertions(+), 54 deletions(-) diff --git a/Client/Networking.cs b/Client/Networking.cs index 3b4d70c..68618fe 100644 --- a/Client/Networking.cs +++ b/Client/Networking.cs @@ -211,16 +211,26 @@ namespace CoopClient packet.NetIncomingMessageToPacket(message); FullSyncPlayer((FullSyncPlayerPacket)packet); break; - case (byte)PacketTypes.FullSyncNpcPacket: - packet = new FullSyncNpcPacket(); + case (byte)PacketTypes.FullSyncPlayerVehPacket: + packet = new FullSyncPlayerVehPacket(); packet.NetIncomingMessageToPacket(message); - FullSyncNpc((FullSyncNpcPacket)packet); + FullSyncPlayerVeh((FullSyncPlayerVehPacket)packet); break; case (byte)PacketTypes.LightSyncPlayerPacket: packet = new LightSyncPlayerPacket(); packet.NetIncomingMessageToPacket(message); LightSyncPlayer((LightSyncPlayerPacket)packet); break; + case (byte)PacketTypes.LightSyncPlayerVehPacket: + packet = new LightSyncPlayerVehPacket(); + packet.NetIncomingMessageToPacket(message); + LightSyncPlayerVeh((LightSyncPlayerVehPacket)packet); + break; + case (byte)PacketTypes.FullSyncNpcPacket: + packet = new FullSyncNpcPacket(); + packet.NetIncomingMessageToPacket(message); + FullSyncNpc((FullSyncNpcPacket)packet); + break; case (byte)PacketTypes.FullSyncNpcVehPacket: packet = new FullSyncNpcVehPacket(); packet.NetIncomingMessageToPacket(message); @@ -249,6 +259,7 @@ namespace CoopClient } #region GET + #region -- PLAYER -- private void PlayerConnect(PlayerConnectPacket packet) { EntitiesPlayer player = new EntitiesPlayer() @@ -305,6 +316,77 @@ namespace CoopClient } } + private void FullSyncPlayerVeh(FullSyncPlayerVehPacket packet) + { + if (Main.Players.ContainsKey(packet.Player)) + { + EntitiesPlayer player = Main.Players[packet.Player]; + player.ModelHash = packet.ModelHash; + player.Props = packet.Props; + player.Health = packet.Health; + player.Position = packet.Position.ToVector(); + player.VehicleModelHash = packet.VehModelHash; + player.VehicleSeatIndex = packet.VehSeatIndex; + player.VehiclePosition = packet.VehPosition.ToVector(); + player.VehicleRotation = packet.VehRotation.ToQuaternion(); + player.VehicleVelocity = packet.VehVelocity.ToVector(); + player.VehicleSpeed = packet.VehSpeed; + player.VehicleSteeringAngle = packet.VehSteeringAngle; + player.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0; + player.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0; + player.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0; + player.VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0; + player.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0; + } + } + + private void LightSyncPlayer(LightSyncPlayerPacket packet) + { + if (Main.Players.ContainsKey(packet.Player)) + { + EntitiesPlayer player = Main.Players[packet.Player]; + player.Health = packet.Health; + player.Position = packet.Position.ToVector(); + player.Rotation = packet.Rotation.ToVector(); + player.Velocity = packet.Velocity.ToVector(); + player.Speed = packet.Speed; + player.CurrentWeaponHash = packet.CurrentWeaponHash; + player.AimCoords = packet.AimCoords.ToVector(); + player.LastSyncWasFull = (packet.Flag.Value & (byte)PedDataFlags.LastSyncWasFull) > 0; + player.IsAiming = (packet.Flag.Value & (byte)PedDataFlags.IsAiming) > 0; + player.IsShooting = (packet.Flag.Value & (byte)PedDataFlags.IsShooting) > 0; + player.IsReloading = (packet.Flag.Value & (byte)PedDataFlags.IsReloading) > 0; + player.IsJumping = (packet.Flag.Value & (byte)PedDataFlags.IsJumping) > 0; + player.IsRagdoll = (packet.Flag.Value & (byte)PedDataFlags.IsRagdoll) > 0; + player.IsOnFire = (packet.Flag.Value & (byte)PedDataFlags.IsOnFire) > 0; + } + } + + private void LightSyncPlayerVeh(LightSyncPlayerVehPacket packet) + { + if (Main.Players.ContainsKey(packet.Player)) + { + EntitiesPlayer player = Main.Players[packet.Player]; + player.ModelHash = packet.ModelHash; + player.Health = packet.Health; + player.Position = packet.Position.ToVector(); + player.VehicleModelHash = packet.VehModelHash; + player.VehicleSeatIndex = packet.VehSeatIndex; + player.VehiclePosition = packet.VehPosition.ToVector(); + player.VehicleRotation = packet.VehRotation.ToQuaternion(); + player.VehicleVelocity = packet.VehVelocity.ToVector(); + player.VehicleSpeed = packet.VehSpeed; + player.VehicleSteeringAngle = packet.VehSteeringAngle; + player.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0; + player.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0; + player.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0; + player.VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0; + player.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0; + } + } + #endregion // -- PLAYER -- + + #region -- NPC -- private void FullSyncNpc(FullSyncNpcPacket packet) { if (Main.Npcs.ContainsKey(packet.ID)) @@ -355,28 +437,6 @@ namespace CoopClient } } - private void LightSyncPlayer(LightSyncPlayerPacket packet) - { - if (Main.Players.ContainsKey(packet.Player)) - { - EntitiesPlayer player = Main.Players[packet.Player]; - player.Health = packet.Health; - player.Position = packet.Position.ToVector(); - player.Rotation = packet.Rotation.ToVector(); - player.Velocity = packet.Velocity.ToVector(); - player.Speed = packet.Speed; - player.CurrentWeaponHash = packet.CurrentWeaponHash; - player.AimCoords = packet.AimCoords.ToVector(); - player.LastSyncWasFull = (packet.Flag.Value & (byte)PedDataFlags.LastSyncWasFull) > 0; - player.IsAiming = (packet.Flag.Value & (byte)PedDataFlags.IsAiming) > 0; - player.IsShooting = (packet.Flag.Value & (byte)PedDataFlags.IsShooting) > 0; - player.IsReloading = (packet.Flag.Value & (byte)PedDataFlags.IsReloading) > 0; - player.IsJumping = (packet.Flag.Value & (byte)PedDataFlags.IsJumping) > 0; - player.IsRagdoll = (packet.Flag.Value & (byte)PedDataFlags.IsRagdoll) > 0; - player.IsOnFire = (packet.Flag.Value & (byte)PedDataFlags.IsOnFire) > 0; - } - } - private void FullSyncNpcVeh(FullSyncNpcVehPacket packet) { if (Main.Npcs.ContainsKey(packet.ID)) @@ -424,6 +484,7 @@ namespace CoopClient }); } } + #endregion // -- NPC -- #endregion #region SEND @@ -436,35 +497,78 @@ namespace CoopClient if (FullPlayerSync) { - new FullSyncPlayerPacket() + if (!player.IsInVehicle()) { - Player = Main.LocalPlayerID, - ModelHash = player.Model.Hash, - Props = Util.GetPedProps(player), - Health = player.Health, - Position = player.Position.ToLVector(), - Rotation = player.Rotation.ToLVector(), - Velocity = player.Velocity.ToLVector(), - Speed = Util.GetPedSpeed(player), - AimCoords = Util.GetPedAimCoords(player, false).ToLVector(), - CurrentWeaponHash = (int)player.Weapons.Current.Hash, - Flag = Util.GetPedFlags(player, true, true) - }.PacketToNetOutGoingMessage(outgoingMessage); + new FullSyncPlayerPacket() + { + Player = Main.LocalPlayerID, + ModelHash = player.Model.Hash, + Props = Util.GetPedProps(player), + Health = player.Health, + Position = player.Position.ToLVector(), + Rotation = player.Rotation.ToLVector(), + Velocity = player.Velocity.ToLVector(), + Speed = Util.GetPedSpeed(player), + AimCoords = Util.GetPedAimCoords(player, false).ToLVector(), + CurrentWeaponHash = (int)player.Weapons.Current.Hash, + Flag = Util.GetPedFlags(player, true, true) + }.PacketToNetOutGoingMessage(outgoingMessage); + } + else + { + new FullSyncPlayerVehPacket() + { + Player = Main.LocalPlayerID, + ModelHash = player.Model.Hash, + Props = Util.GetPedProps(player), + Health = player.Health, + Position = player.Position.ToLVector(), + VehModelHash = player.CurrentVehicle.Model.Hash, + VehSeatIndex = (int)player.SeatIndex, + VehPosition = player.CurrentVehicle.Position.ToLVector(), + VehRotation = player.CurrentVehicle.Quaternion.ToLQuaternion(), + VehVelocity = player.CurrentVehicle.Velocity.ToLVector(), + VehSpeed = player.CurrentVehicle.Speed, + VehSteeringAngle = player.CurrentVehicle.SteeringAngle, + Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, true) + }.PacketToNetOutGoingMessage(outgoingMessage); + } } else { - new LightSyncPlayerPacket() + if (!player.IsInVehicle()) { - Player = Main.LocalPlayerID, - Health = player.Health, - Position = player.Position.ToLVector(), - Rotation = player.Rotation.ToLVector(), - Velocity = player.Velocity.ToLVector(), - Speed = Util.GetPedSpeed(player), - AimCoords = Util.GetPedAimCoords(player, false).ToLVector(), - CurrentWeaponHash = (int)player.Weapons.Current.Hash, - Flag = Util.GetPedFlags(player, false, true) - }.PacketToNetOutGoingMessage(outgoingMessage); + new LightSyncPlayerPacket() + { + Player = Main.LocalPlayerID, + Health = player.Health, + Position = player.Position.ToLVector(), + Rotation = player.Rotation.ToLVector(), + Velocity = player.Velocity.ToLVector(), + Speed = Util.GetPedSpeed(player), + AimCoords = Util.GetPedAimCoords(player, false).ToLVector(), + CurrentWeaponHash = (int)player.Weapons.Current.Hash, + Flag = Util.GetPedFlags(player, false, true) + }.PacketToNetOutGoingMessage(outgoingMessage); + } + else + { + new LightSyncPlayerVehPacket() + { + Player = Main.LocalPlayerID, + ModelHash = player.Model.Hash, + Health = player.Health, + Position = player.Position.ToLVector(), + VehModelHash = player.CurrentVehicle.Model.Hash, + VehSeatIndex = (int)player.SeatIndex, + VehPosition = player.CurrentVehicle.Position.ToLVector(), + VehRotation = player.CurrentVehicle.Quaternion.ToLQuaternion(), + VehVelocity = player.CurrentVehicle.Velocity.ToLVector(), + VehSpeed = player.CurrentVehicle.Speed, + VehSteeringAngle = player.CurrentVehicle.SteeringAngle, + Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, false) + }.PacketToNetOutGoingMessage(outgoingMessage); + } } Client.SendMessage(outgoingMessage, NetDeliveryMethod.ReliableOrdered); diff --git a/Server/Server.cs b/Server/Server.cs index 716dc65..077ba6a 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -216,6 +216,18 @@ namespace CoopServer message.SenderConnection.Disconnect(e.Message); } break; + case (byte)PacketTypes.FullSyncPlayerVehPacket: + try + { + packet = new FullSyncPlayerVehPacket(); + packet.NetIncomingMessageToPacket(message); + FullSyncPlayerVeh((FullSyncPlayerVehPacket)packet); + } + catch (Exception e) + { + message.SenderConnection.Disconnect(e.Message); + } + break; case (byte)PacketTypes.LightSyncPlayerPacket: try { @@ -228,6 +240,18 @@ namespace CoopServer message.SenderConnection.Disconnect(e.Message); } break; + case (byte)PacketTypes.LightSyncPlayerVehPacket: + try + { + packet = new LightSyncPlayerVehPacket(); + packet.NetIncomingMessageToPacket(message); + LightSyncPlayerVeh((LightSyncPlayerVehPacket)packet); + } + catch (Exception e) + { + message.SenderConnection.Disconnect(e.Message); + } + break; case (byte)PacketTypes.FullSyncNpcPacket: if (MainSettings.NpcsAllowed) { @@ -318,13 +342,13 @@ namespace CoopServer { return new(MainNetServer.Connections.FindAll(e => Players[NetUtility.ToHexString(e.RemoteUniqueIdentifier)].Ped.IsInRangeOf(position, range))); } - // Return a list of players within range of ... but not the local one private static List GetAllInRange(LVector3 position, float range, NetConnection local) { return new(MainNetServer.Connections.Where(e => e != local && Players[NetUtility.ToHexString(e.RemoteUniqueIdentifier)].Ped.IsInRangeOf(position, range))); } + #region -- PLAYER -- // Before we approve the connection, we must shake hands private void GetHandshake(NetConnection local, HandshakePacket packet) { @@ -487,9 +511,11 @@ namespace CoopServer MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0); } - private static void FullSyncNpc(NetConnection local, FullSyncNpcPacket packet) + private static void FullSyncPlayerVeh(FullSyncPlayerVehPacket packet) { - List playerList = GetAllInRange(packet.Position, 300f, local); + Players[packet.Player].Ped.Position = packet.Position; + + List playerList = FilterAllLocal(packet.Player); if (playerList.Count == 0) { return; @@ -515,9 +541,11 @@ namespace CoopServer MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0); } - private static void FullSyncNpcVeh(NetConnection local, FullSyncNpcVehPacket packet) + private static void LightSyncPlayerVeh(LightSyncPlayerVehPacket packet) { - List playerList = GetAllInRange(packet.Position, 300f, local); + Players[packet.Player].Ped.Position = packet.Position; + + List playerList = FilterAllLocal(packet.Player); if (playerList.Count == 0) { return; @@ -539,5 +567,34 @@ namespace CoopServer packet.PacketToNetOutGoingMessage(outgoingMessage); MainNetServer.SendMessage(outgoingMessage, targets ?? MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, 0); } + #endregion + + #region -- NPC -- + private static void FullSyncNpc(NetConnection local, FullSyncNpcPacket packet) + { + List playerList = GetAllInRange(packet.Position, 300f, local); + if (playerList.Count == 0) + { + return; + } + + NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); + packet.PacketToNetOutGoingMessage(outgoingMessage); + MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0); + } + + private static void FullSyncNpcVeh(NetConnection local, FullSyncNpcVehPacket packet) + { + List playerList = GetAllInRange(packet.Position, 300f, local); + if (playerList.Count == 0) + { + return; + } + + NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); + packet.PacketToNetOutGoingMessage(outgoingMessage); + MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0); + } + #endregion } }