Make syncing go brr
This commit is contained in:
parent
1f001c03b7
commit
3b2c3adf35
@ -81,9 +81,11 @@ namespace NeonTea.Quakeball.Networking.Instances {
|
|||||||
Players[jump.PlayerId].Controlled.Jump();
|
Players[jump.PlayerId].Controlled.Jump();
|
||||||
} else if (packet is PlayerSyncPacket) {
|
} else if (packet is PlayerSyncPacket) {
|
||||||
PlayerSyncPacket syncPckt = (PlayerSyncPacket)packet;
|
PlayerSyncPacket syncPckt = (PlayerSyncPacket)packet;
|
||||||
|
if (syncPckt.Unsynced || syncPckt.PlayerId != LocalPlayer.Id) {
|
||||||
Players[syncPckt.PlayerId].Controlled.ProcessSyncPacket(syncPckt);
|
Players[syncPckt.PlayerId].Controlled.ProcessSyncPacket(syncPckt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleUpdatePlayer(PlayerUpdatePckt pckt) {
|
private void HandleUpdatePlayer(PlayerUpdatePckt pckt) {
|
||||||
if (pckt.PlayerId == LocalPlayer.Id) {
|
if (pckt.PlayerId == LocalPlayer.Id) {
|
||||||
|
@ -92,7 +92,9 @@ namespace NeonTea.Quakeball.Networking.Instances {
|
|||||||
PlayerSyncPacket syncPckt = (PlayerSyncPacket)packet;
|
PlayerSyncPacket syncPckt = (PlayerSyncPacket)packet;
|
||||||
if (Players[conn.uid].Controlled != null) {
|
if (Players[conn.uid].Controlled != null) {
|
||||||
syncPckt.PlayerId = conn.uid;
|
syncPckt.PlayerId = conn.uid;
|
||||||
Players[conn.uid].Controlled.ProcessSyncPacket(syncPckt);
|
if (!Players[conn.uid].Controlled.ProcessSyncPacket(syncPckt)) {
|
||||||
|
Players[conn.uid].Unsynced = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ namespace NeonTea.Quakeball.Networking {
|
|||||||
public class NetPlayer {
|
public class NetPlayer {
|
||||||
public ulong Id;
|
public ulong Id;
|
||||||
public Player Controlled;
|
public Player Controlled;
|
||||||
|
public bool Unsynced = false;
|
||||||
|
|
||||||
public NetPlayer(ulong id, Player obj = null) {
|
public NetPlayer(ulong id, Player obj = null) {
|
||||||
Id = id;
|
Id = id;
|
||||||
|
@ -39,7 +39,7 @@ namespace NeonTea.Quakeball.Networking.Packets {
|
|||||||
|
|
||||||
public class MultipleSyncsPckt : Packet {
|
public class MultipleSyncsPckt : Packet {
|
||||||
|
|
||||||
public List<PlayerSyncPacket> Updates = new List<PlayerSyncPacket>();
|
public List<PlayerSyncPacket> Syncs = new List<PlayerSyncPacket>();
|
||||||
|
|
||||||
public MultipleSyncsPckt() { }
|
public MultipleSyncsPckt() { }
|
||||||
|
|
||||||
@ -48,23 +48,23 @@ namespace NeonTea.Quakeball.Networking.Packets {
|
|||||||
if (p.Controlled == null) {
|
if (p.Controlled == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//Updates.Add(p.Controlled.CreatePacket(p.Id));
|
Syncs.Add(p.Controlled.CreateSyncPacket(p.Id, p.Unsynced));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Read(ByteBuffer buffer) {
|
public override void Read(ByteBuffer buffer) {
|
||||||
Updates.Clear();
|
Syncs.Clear();
|
||||||
int count = buffer.ReadInt();
|
int count = buffer.ReadInt();
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
PlayerSyncPacket pckt = new PlayerSyncPacket();
|
PlayerSyncPacket pckt = new PlayerSyncPacket();
|
||||||
pckt.Read(buffer);
|
pckt.Read(buffer);
|
||||||
Updates.Add(pckt);
|
Syncs.Add(pckt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write(ByteBuffer buffer) {
|
public override void Write(ByteBuffer buffer) {
|
||||||
buffer.Write(Updates.Count);
|
buffer.Write(Syncs.Count);
|
||||||
foreach (PlayerSyncPacket p in Updates) {
|
foreach (PlayerSyncPacket p in Syncs) {
|
||||||
p.Write(buffer);
|
p.Write(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,25 +55,29 @@ namespace NeonTea.Quakeball.Networking.Packets {
|
|||||||
|
|
||||||
public class PlayerSyncPacket : Packet {
|
public class PlayerSyncPacket : Packet {
|
||||||
public ulong PlayerId;
|
public ulong PlayerId;
|
||||||
|
public bool Unsynced;
|
||||||
|
|
||||||
public Vector3 Location;
|
public Vector3 Location;
|
||||||
public Vector3 GroundVelocity;
|
public Vector3 GroundVelocity;
|
||||||
|
|
||||||
public PlayerSyncPacket() { }
|
public PlayerSyncPacket() { }
|
||||||
public PlayerSyncPacket(ulong id, Vector3 location, Vector3 groundVelocity) {
|
public PlayerSyncPacket(ulong id, bool unsynced, Vector3 location, Vector3 groundVelocity) {
|
||||||
PlayerId = id;
|
PlayerId = id;
|
||||||
|
Unsynced = unsynced;
|
||||||
Location = location;
|
Location = location;
|
||||||
GroundVelocity = groundVelocity;
|
GroundVelocity = groundVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Read(ByteBuffer buffer) {
|
public override void Read(ByteBuffer buffer) {
|
||||||
PlayerId = buffer.ReadULong();
|
PlayerId = buffer.ReadULong();
|
||||||
|
Unsynced = buffer.ReadBool();
|
||||||
Location = buffer.ReadVector3();
|
Location = buffer.ReadVector3();
|
||||||
GroundVelocity = buffer.ReadVector3();
|
GroundVelocity = buffer.ReadVector3();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write(ByteBuffer buffer) {
|
public override void Write(ByteBuffer buffer) {
|
||||||
buffer.ReadULong();
|
buffer.Write(PlayerId);
|
||||||
|
buffer.Write(Unsynced);
|
||||||
buffer.Write(Location);
|
buffer.Write(Location);
|
||||||
buffer.Write(GroundVelocity);
|
buffer.Write(GroundVelocity);
|
||||||
}
|
}
|
||||||
|
@ -75,12 +75,12 @@ namespace NeonTea.Quakeball.Players {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Creates a PlayerSyncPacket representing this Player's position and velocity, for sending to the server.</summary>
|
/// <summary>Creates a PlayerSyncPacket representing this Player's position and velocity, for sending to the server.</summary>
|
||||||
public PlayerSyncPacket CreateSyncPacket(ulong id = 0) {
|
public PlayerSyncPacket CreateSyncPacket(ulong id = 0, bool unsynced = false) {
|
||||||
return new PlayerSyncPacket(id, transform.position, GroundVelocity);
|
return new PlayerSyncPacket(id, unsynced, transform.position, GroundVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Applies the sync packet, checking it for cheatiness if shouldApply is false.</summary>
|
/// <summary>Applies the sync packet, checking it for cheatiness if shouldApply is false.</summary>
|
||||||
public void ProcessSyncPacket(PlayerSyncPacket syncPckt, bool shouldApplyWithoutInspection = true) {
|
public bool ProcessSyncPacket(PlayerSyncPacket syncPckt, bool shouldApplyWithoutInspection = true) {
|
||||||
bool ShouldApply = shouldApplyWithoutInspection;
|
bool ShouldApply = shouldApplyWithoutInspection;
|
||||||
if (!shouldApplyWithoutInspection) {
|
if (!shouldApplyWithoutInspection) {
|
||||||
// TODO: Gaze into the crystal ball to determine the nefariousness level of the packet and update ShouldApply accordingly.
|
// TODO: Gaze into the crystal ball to determine the nefariousness level of the packet and update ShouldApply accordingly.
|
||||||
@ -89,6 +89,7 @@ namespace NeonTea.Quakeball.Players {
|
|||||||
transform.position = syncPckt.Location;
|
transform.position = syncPckt.Location;
|
||||||
GroundVelocity = syncPckt.Location;
|
GroundVelocity = syncPckt.Location;
|
||||||
}
|
}
|
||||||
|
return ShouldApply;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>The normal of the ground below the player. If there is no ground, it's <c>Vector3.up</c> by default.</summary>
|
/// <summary>The normal of the ground below the player. If there is no ground, it's <c>Vector3.up</c> by default.</summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user