Vehicle synchronization for players
Not tested ... I hope it works 😬
This commit is contained in:
@ -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();
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user