Add vehicle extras sync
This commit is contained in:
@ -12,7 +12,7 @@ namespace RageCoop.Client
|
||||
{
|
||||
internal static partial class Networking
|
||||
{
|
||||
|
||||
|
||||
|
||||
private static readonly AutoResetEvent _publicKeyReceived = new AutoResetEvent(false);
|
||||
|
||||
@ -68,90 +68,90 @@ namespace RageCoop.Client
|
||||
|
||||
break;
|
||||
case NetIncomingMessageType.Data:
|
||||
{
|
||||
if (message.LengthBytes == 0) break;
|
||||
var packetType = PacketType.Unknown;
|
||||
try
|
||||
{
|
||||
// Get packet type
|
||||
packetType = (PacketType)message.ReadByte();
|
||||
if (message.LengthBytes == 0) break;
|
||||
var packetType = PacketType.Unknown;
|
||||
try
|
||||
{
|
||||
// Get packet type
|
||||
packetType = (PacketType)message.ReadByte();
|
||||
switch (packetType)
|
||||
{
|
||||
case PacketType.Response:
|
||||
{
|
||||
var id = message.ReadInt32();
|
||||
if (PendingResponses.TryGetValue(id, out var callback))
|
||||
{
|
||||
callback((PacketType)message.ReadByte(), message);
|
||||
PendingResponses.Remove(id);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PacketType.Request:
|
||||
{
|
||||
var id = message.ReadInt32();
|
||||
var realType = (PacketType)message.ReadByte();
|
||||
if (RequestHandlers.TryGetValue(realType, out var handler))
|
||||
{
|
||||
var response = Peer.CreateMessage();
|
||||
response.Write((byte)PacketType.Response);
|
||||
response.Write(id);
|
||||
handler(message).Pack(response);
|
||||
Peer.SendMessage(response, ServerConnection, NetDeliveryMethod.ReliableOrdered,
|
||||
message.SequenceChannel);
|
||||
Peer.FlushSendQueue();
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Debug("Did not find a request handler of type: " + realType);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
HandlePacket(packetType, message, message.SenderConnection, ref _recycle);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
API.QueueAction(() =>
|
||||
{
|
||||
Notification.Show($"~r~~h~Packet Error {ex.Message}");
|
||||
return true;
|
||||
});
|
||||
Log.Error($"[{packetType}] {ex.Message}");
|
||||
Log.Error(ex);
|
||||
Peer.Shutdown($"Packet Error [{packetType}]");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NetIncomingMessageType.UnconnectedData:
|
||||
{
|
||||
var packetType = (PacketType)message.ReadByte();
|
||||
switch (packetType)
|
||||
{
|
||||
case PacketType.Response:
|
||||
{
|
||||
var id = message.ReadInt32();
|
||||
if (PendingResponses.TryGetValue(id, out var callback))
|
||||
case PacketType.HolePunch:
|
||||
{
|
||||
callback((PacketType)message.ReadByte(), message);
|
||||
PendingResponses.Remove(id);
|
||||
HolePunch.Punched(message.GetPacket<Packets.HolePunch>(), message.SenderEndPoint);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case PacketType.Request:
|
||||
{
|
||||
var id = message.ReadInt32();
|
||||
var realType = (PacketType)message.ReadByte();
|
||||
if (RequestHandlers.TryGetValue(realType, out var handler))
|
||||
case PacketType.PublicKeyResponse:
|
||||
{
|
||||
var response = Peer.CreateMessage();
|
||||
response.Write((byte)PacketType.Response);
|
||||
response.Write(id);
|
||||
handler(message).Pack(response);
|
||||
Peer.SendMessage(response, ServerConnection, NetDeliveryMethod.ReliableOrdered,
|
||||
message.SequenceChannel);
|
||||
Peer.FlushSendQueue();
|
||||
if (message.SenderEndPoint.ToString() != _targetServerEP.ToString() || !IsConnecting) break;
|
||||
var packet = message.GetPacket<Packets.PublicKeyResponse>();
|
||||
Security.SetServerPublicKey(packet.Modulus, packet.Exponent);
|
||||
_publicKeyReceived.Set();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Debug("Did not find a request handler of type: " + realType);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
HandlePacket(packetType, message, message.SenderConnection, ref _recycle);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
API.QueueAction(() =>
|
||||
{
|
||||
Notification.Show($"~r~~h~Packet Error {ex.Message}");
|
||||
return true;
|
||||
});
|
||||
Log.Error($"[{packetType}] {ex.Message}");
|
||||
Log.Error(ex);
|
||||
Peer.Shutdown($"Packet Error [{packetType}]");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NetIncomingMessageType.UnconnectedData:
|
||||
{
|
||||
var packetType = (PacketType)message.ReadByte();
|
||||
switch (packetType)
|
||||
{
|
||||
case PacketType.HolePunch:
|
||||
{
|
||||
HolePunch.Punched(message.GetPacket<Packets.HolePunch>(), message.SenderEndPoint);
|
||||
break;
|
||||
}
|
||||
case PacketType.PublicKeyResponse:
|
||||
{
|
||||
if (message.SenderEndPoint.ToString() != _targetServerEP.ToString() || !IsConnecting) break;
|
||||
var packet = message.GetPacket<Packets.PublicKeyResponse>();
|
||||
Security.SetServerPublicKey(packet.Modulus, packet.Exponent);
|
||||
_publicKeyReceived.Set();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NetIncomingMessageType.DebugMessage:
|
||||
case NetIncomingMessageType.ErrorMessage:
|
||||
case NetIncomingMessageType.WarningMessage:
|
||||
@ -199,62 +199,62 @@ namespace RageCoop.Client
|
||||
break;
|
||||
|
||||
case PacketType.ChatMessage:
|
||||
{
|
||||
var packet = new Packets.ChatMessage(b => Security.Decrypt(b));
|
||||
packet.Deserialize(msg);
|
||||
|
||||
API.QueueAction(() =>
|
||||
{
|
||||
MainChat.AddMessage(packet.Username, packet.Message);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
var packet = new Packets.ChatMessage(b => Security.Decrypt(b));
|
||||
packet.Deserialize(msg);
|
||||
|
||||
API.QueueAction(() =>
|
||||
{
|
||||
MainChat.AddMessage(packet.Username, packet.Message);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case PacketType.Voice:
|
||||
{
|
||||
if (Settings.Voice)
|
||||
{
|
||||
var packet = new Packets.Voice();
|
||||
packet.Deserialize(msg);
|
||||
if (Settings.Voice)
|
||||
{
|
||||
var packet = new Packets.Voice();
|
||||
packet.Deserialize(msg);
|
||||
|
||||
|
||||
var player = EntityPool.GetPedByID(packet.ID);
|
||||
player.IsSpeaking = true;
|
||||
player.LastSpeakingTime = Ticked;
|
||||
var player = EntityPool.GetPedByID(packet.ID);
|
||||
player.IsSpeaking = true;
|
||||
player.LastSpeakingTime = Ticked;
|
||||
|
||||
Voice.AddVoiceData(packet.Buffer, packet.Recorded);
|
||||
Voice.AddVoiceData(packet.Buffer, packet.Recorded);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PacketType.CustomEvent:
|
||||
{
|
||||
var packet = new Packets.CustomEvent();
|
||||
if (((CustomEventFlags)msg.PeekByte()).HasEventFlag(CustomEventFlags.Queued))
|
||||
{
|
||||
recycle = false;
|
||||
API.QueueAction(() =>
|
||||
var packet = new Packets.CustomEvent();
|
||||
if (((CustomEventFlags)msg.PeekByte()).HasEventFlag(CustomEventFlags.Queued))
|
||||
{
|
||||
recycle = false;
|
||||
API.QueueAction(() =>
|
||||
{
|
||||
packet.Deserialize(msg);
|
||||
API.Events.InvokeCustomEventReceived(packet);
|
||||
Peer.Recycle(msg);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
packet.Deserialize(msg);
|
||||
API.Events.InvokeCustomEventReceived(packet);
|
||||
Peer.Recycle(msg);
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
packet.Deserialize(msg);
|
||||
API.Events.InvokeCustomEventReceived(packet);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PacketType.FileTransferChunk:
|
||||
{
|
||||
var packet = new Packets.FileTransferChunk();
|
||||
packet.Deserialize(msg);
|
||||
DownloadManager.Write(packet.ID, packet.FileChunk);
|
||||
}
|
||||
{
|
||||
var packet = new Packets.FileTransferChunk();
|
||||
packet.Deserialize(msg);
|
||||
DownloadManager.Write(packet.ID, packet.FileChunk);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -300,7 +300,7 @@ namespace RageCoop.Client
|
||||
c.VehicleID = packet.VehicleID;
|
||||
c.Seat = packet.Seat;
|
||||
}
|
||||
|
||||
|
||||
if (c.IsAiming) c.AimCoords = packet.AimCoords;
|
||||
bool full = packet.Flags.HasPedFlag(PedDataFlags.IsFullSync);
|
||||
if (full)
|
||||
@ -349,6 +349,7 @@ namespace RageCoop.Client
|
||||
v.RadioStation = packet.RadioStation;
|
||||
v.LicensePlate = packet.LicensePlate;
|
||||
v.Livery = packet.Livery;
|
||||
v.ExtrasMask = packet.ExtrasMask;
|
||||
}
|
||||
v.SetLastSynced(full);
|
||||
}
|
||||
|
@ -136,6 +136,7 @@ namespace RageCoop.Client
|
||||
packet.LockStatus = veh.LockStatus;
|
||||
packet.LicensePlate = Call<string>(GET_VEHICLE_NUMBER_PLATE_TEXT, veh);
|
||||
packet.Livery = Call<int>(GET_VEHICLE_LIVERY, veh);
|
||||
packet.ExtrasMask = v.MainVehicle.GetVehicleExtras();
|
||||
packet.RadioStation = v.MainVehicle == LastV
|
||||
? Util.GetPlayerRadioIndex() : byte.MaxValue;
|
||||
if (packet.EngineHealth > v.LastEngineHealth) packet.Flags |= VehicleDataFlags.Repaired;
|
||||
|
@ -31,6 +31,7 @@ namespace RageCoop.Client
|
||||
internal string LicensePlate { get; set; }
|
||||
internal int Livery { get; set; } = -1;
|
||||
internal VehicleDataFlags Flags { get; set; }
|
||||
internal ushort ExtrasMask;
|
||||
|
||||
#endregion
|
||||
|
||||
@ -67,6 +68,7 @@ namespace RageCoop.Client
|
||||
#region PRIVATE
|
||||
|
||||
private (byte, byte) _lastVehicleColors;
|
||||
private ushort _lastExtras;
|
||||
private (int, int)[] _lastVehicleMods = Array.Empty<(int, int)>();
|
||||
private bool _lastHornActive;
|
||||
private bool _lastTransformed;
|
||||
|
@ -154,6 +154,16 @@ namespace RageCoop.Client
|
||||
|
||||
if (MainVehicle.Handle == V?.Handle && Util.GetPlayerRadioIndex() != RadioStation)
|
||||
Util.SetPlayerRadioIndex(MainVehicle.Handle, RadioStation);
|
||||
|
||||
if (_lastExtras != ExtrasMask)
|
||||
{
|
||||
for (int i = 1; i < 15; i++)
|
||||
{
|
||||
var on = (ExtrasMask & (ushort)(1 << i)) != 0;
|
||||
Call(SET_VEHICLE_EXTRA, MainVehicle.Handle, i, !on);
|
||||
}
|
||||
_lastExtras = ExtrasMask;
|
||||
}
|
||||
}
|
||||
|
||||
LastUpdated = Ticked;
|
||||
|
@ -58,6 +58,17 @@ namespace RageCoop.Client
|
||||
return result;
|
||||
}
|
||||
|
||||
public static ushort GetVehicleExtras(this Vehicle veh)
|
||||
{
|
||||
ushort result = 0;
|
||||
for (int i = 1; i < 15; i++)
|
||||
{
|
||||
if (Call<bool>(IS_VEHICLE_EXTRA_TURNED_ON, veh.Handle, i))
|
||||
result |= (ushort)(1 << i);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static VehicleDamageModel GetVehicleDamageModel(this Vehicle veh)
|
||||
{
|
||||
// Broken windows
|
||||
|
@ -99,6 +99,8 @@ namespace RageCoop.Core
|
||||
m.Write(LicensePlate);
|
||||
|
||||
m.Write((byte)(Livery + 1));
|
||||
|
||||
m.Write(ExtrasMask);
|
||||
}
|
||||
}
|
||||
|
||||
@ -170,6 +172,8 @@ namespace RageCoop.Core
|
||||
LicensePlate = m.ReadString();
|
||||
|
||||
Livery = m.ReadByte() - 1;
|
||||
|
||||
ExtrasMask = m.ReadUInt16();
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -198,6 +202,7 @@ namespace RageCoop.Core
|
||||
public byte RadioStation { get; set; } = 255;
|
||||
public string LicensePlate { get; set; }
|
||||
|
||||
public ushort ExtrasMask;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user