Add vehicle extras sync

This commit is contained in:
Sardelka9515
2023-03-20 18:05:14 +08:00
parent 5f1aadbdb5
commit 6f2c0077cb
6 changed files with 142 additions and 112 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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
}
}