Vehicle synchronization for players

Not tested ... I hope it works 😬
This commit is contained in:
EntenKoeniq
2021-07-12 05:00:48 +02:00
parent 2d8f9b2a80
commit bc6761d265
2 changed files with 215 additions and 54 deletions

View File

@ -211,16 +211,26 @@ namespace CoopClient
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
FullSyncPlayer((FullSyncPlayerPacket)packet); FullSyncPlayer((FullSyncPlayerPacket)packet);
break; break;
case (byte)PacketTypes.FullSyncNpcPacket: case (byte)PacketTypes.FullSyncPlayerVehPacket:
packet = new FullSyncNpcPacket(); packet = new FullSyncPlayerVehPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
FullSyncNpc((FullSyncNpcPacket)packet); FullSyncPlayerVeh((FullSyncPlayerVehPacket)packet);
break; break;
case (byte)PacketTypes.LightSyncPlayerPacket: case (byte)PacketTypes.LightSyncPlayerPacket:
packet = new LightSyncPlayerPacket(); packet = new LightSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
LightSyncPlayer((LightSyncPlayerPacket)packet); LightSyncPlayer((LightSyncPlayerPacket)packet);
break; 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: case (byte)PacketTypes.FullSyncNpcVehPacket:
packet = new FullSyncNpcVehPacket(); packet = new FullSyncNpcVehPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
@ -249,6 +259,7 @@ namespace CoopClient
} }
#region GET #region GET
#region -- PLAYER --
private void PlayerConnect(PlayerConnectPacket packet) private void PlayerConnect(PlayerConnectPacket packet)
{ {
EntitiesPlayer player = new EntitiesPlayer() 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) private void FullSyncNpc(FullSyncNpcPacket packet)
{ {
if (Main.Npcs.ContainsKey(packet.ID)) 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) private void FullSyncNpcVeh(FullSyncNpcVehPacket packet)
{ {
if (Main.Npcs.ContainsKey(packet.ID)) if (Main.Npcs.ContainsKey(packet.ID))
@ -424,6 +484,7 @@ namespace CoopClient
}); });
} }
} }
#endregion // -- NPC --
#endregion #endregion
#region SEND #region SEND
@ -435,6 +496,8 @@ namespace CoopClient
NetOutgoingMessage outgoingMessage = Client.CreateMessage(); NetOutgoingMessage outgoingMessage = Client.CreateMessage();
if (FullPlayerSync) if (FullPlayerSync)
{
if (!player.IsInVehicle())
{ {
new FullSyncPlayerPacket() new FullSyncPlayerPacket()
{ {
@ -452,6 +515,28 @@ namespace CoopClient
}.PacketToNetOutGoingMessage(outgoingMessage); }.PacketToNetOutGoingMessage(outgoingMessage);
} }
else 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
{
if (!player.IsInVehicle())
{ {
new LightSyncPlayerPacket() new LightSyncPlayerPacket()
{ {
@ -466,6 +551,25 @@ namespace CoopClient
Flag = Util.GetPedFlags(player, false, true) Flag = Util.GetPedFlags(player, false, true)
}.PacketToNetOutGoingMessage(outgoingMessage); }.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); Client.SendMessage(outgoingMessage, NetDeliveryMethod.ReliableOrdered);
Client.FlushSendQueue(); Client.FlushSendQueue();

View File

@ -216,6 +216,18 @@ namespace CoopServer
message.SenderConnection.Disconnect(e.Message); message.SenderConnection.Disconnect(e.Message);
} }
break; 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: case (byte)PacketTypes.LightSyncPlayerPacket:
try try
{ {
@ -228,6 +240,18 @@ namespace CoopServer
message.SenderConnection.Disconnect(e.Message); message.SenderConnection.Disconnect(e.Message);
} }
break; 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: case (byte)PacketTypes.FullSyncNpcPacket:
if (MainSettings.NpcsAllowed) 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 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 // Return a list of players within range of ... but not the local one
private static List<NetConnection> GetAllInRange(LVector3 position, float range, NetConnection local) private static List<NetConnection> GetAllInRange(LVector3 position, float range, NetConnection local)
{ {
return new(MainNetServer.Connections.Where(e => e != local && Players[NetUtility.ToHexString(e.RemoteUniqueIdentifier)].Ped.IsInRangeOf(position, range))); 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 // Before we approve the connection, we must shake hands
private void GetHandshake(NetConnection local, HandshakePacket packet) private void GetHandshake(NetConnection local, HandshakePacket packet)
{ {
@ -487,9 +511,11 @@ namespace CoopServer
MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0); MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0);
} }
private static void FullSyncNpc(NetConnection local, FullSyncNpcPacket packet) private static void FullSyncPlayerVeh(FullSyncPlayerVehPacket packet)
{ {
List<NetConnection> playerList = GetAllInRange(packet.Position, 300f, local); Players[packet.Player].Ped.Position = packet.Position;
List<NetConnection> playerList = FilterAllLocal(packet.Player);
if (playerList.Count == 0) if (playerList.Count == 0)
{ {
return; return;
@ -515,9 +541,11 @@ namespace CoopServer
MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0); MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0);
} }
private static void FullSyncNpcVeh(NetConnection local, FullSyncNpcVehPacket packet) private static void LightSyncPlayerVeh(LightSyncPlayerVehPacket packet)
{ {
List<NetConnection> playerList = GetAllInRange(packet.Position, 300f, local); Players[packet.Player].Ped.Position = packet.Position;
List<NetConnection> playerList = FilterAllLocal(packet.Player);
if (playerList.Count == 0) if (playerList.Count == 0)
{ {
return; return;
@ -539,5 +567,34 @@ namespace CoopServer
packet.PacketToNetOutGoingMessage(outgoingMessage); packet.PacketToNetOutGoingMessage(outgoingMessage);
MainNetServer.SendMessage(outgoingMessage, targets ?? MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, 0); MainNetServer.SendMessage(outgoingMessage, targets ?? MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, 0);
} }
#endregion
#region -- NPC --
private static void FullSyncNpc(NetConnection local, FullSyncNpcPacket packet)
{
List<NetConnection> 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<NetConnection> 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
} }
} }