Skip to content

Commit

Permalink
fix(server): handle sockets better
Browse files Browse the repository at this point in the history
DanielMcAssey committed Jan 23, 2025
1 parent 2c76b19 commit fed656d
Showing 6 changed files with 63 additions and 39 deletions.
53 changes: 45 additions & 8 deletions GLOKON.Baiters.Core/BaitersServer.cs
Original file line number Diff line number Diff line change
@@ -160,7 +160,11 @@ public virtual void Setup()

public virtual async Task RunAsync(CancellationToken cancellationToken)
{
LobbyCode = options.CustomLobbyCode ?? GenerateLobbyCode();
if (!string.IsNullOrWhiteSpace(options.CustomLobbyCode))
{
LobbyCode = options.CustomLobbyCode;
}

_lobby = await SetupLobbyAsync(LobbyCode);
var ticksPerSecond = 1000 / options.Modifiers.TicksPerSecond;
IList<long> actorsToRemove = [];
@@ -432,19 +436,19 @@ public void SendMessage(string message, string color = MessageColour.Default, ul
}
}

public void SendPacket(Packet packet, DataChannel channel, ulong? steamId = null)
public void SendPacket(Packet packet, DataChannel channel, ulong? steamId = null, bool reliable = true)
{
byte[] data = packet.ToBytes();

if (steamId.HasValue)
{
Log.Verbose("Sending {0} packet on {1} to single player {2}", packet.Type, channel, steamId.Value);
SendPacketTo(data, channel, steamId.Value);
SendPacketTo(data, channel, steamId.Value, reliable);
}
else
{
Log.Verbose("Sending {0} packet on {1} to all players", packet.Type, channel);
SendPacketTo(data, channel);
SendPacketTo(data, channel, reliable);
}
}

@@ -548,7 +552,7 @@ internal virtual void LeavePlayer(ulong steamId, DisconnectReason reason = Disco
{
["user_id"] = (long)steamId,
["reason"] = (int)reason,
}, DataChannel.GameState);
}, DataChannel.GameState, reliable: false);

IList<long> actorsToRemove = [];
foreach (var actor in _actors.Where(actor => actor.Value.OwnerId == steamId))
@@ -599,6 +603,39 @@ internal void SendActorUpdate(long actorId, Actor actor, ulong? steamId = null)
}, DataChannel.ActorUpdate, steamId);
}

internal void SendActorAnimationUpdate(long actorId, Actor actor, ulong? steamId = null)
{
// TODO: Placeholder, Implement correctly
SendPacket(new("actor_animation_update")
{
["actor_id"] = actorId,
["data"] = new Dictionary<string, object>
{
["emote"] = "", // ??
["emote_state"] = "", // ??
["moving"] = 3, // 0: ?, 1: walk, 2: running, 3: sneaking
["diving"] = "",
["sitting"] = "",
["busy"] = false, // bool
["land"] = 0.0f, // float, ??
["talking"] = 0.0f, // float, ??
["recent_reel"] = 0.0f, // float, ??
["player_scale"] = 0.0f, // float, ??
["move_timescale"] = 1.25f, // float
["drunk_tier"] = 0f, // float, ??
["state"] = "", // ??
["mushroom"] = false, // true if mushroom jumping, false if not
["bobber_position"] = Vector3.Zero, // Vector3
["arm_value"] = "", // ??
["caught_item"] = "", // ??
["item_bend"] = 0.0f, // float, ??
["back_bend"] = 0.0f, // float, ??
["alert"] = false, // bool, ??
["wagging"] = false, // bool, ??
},
}, DataChannel.ActorUpdate, steamId, false);
}

internal void SendCanvas(long canvasId, IList<ChalkCanvasPoint> points, ulong? steamId = null, int? overrideColour = null)
{
SendPacket(new("chalk_packet")
@@ -610,7 +647,7 @@ internal void SendCanvas(long canvasId, IList<ChalkCanvasPoint> points, ulong? s

internal void SendHandshake(ulong? steamId = null)
{
SendPacket(new("handshake"), DataChannel.GameState, steamId);
SendPacket(new("handshake"), DataChannel.GameState, steamId, false);
}

internal void SendWebLobbyPacket(ulong? steamId = null)
@@ -637,9 +674,9 @@ internal void OnPlayerChat(ulong sender, ChatLog chatLog)

protected abstract void ReceivePackets();

protected abstract void SendPacketTo(byte[] data, DataChannel channel);
protected abstract void SendPacketTo(byte[] data, DataChannel channel, bool reliable);

protected abstract void SendPacketTo(byte[] data, DataChannel channel, ulong steamId);
protected abstract void SendPacketTo(byte[] data, DataChannel channel, ulong steamId, bool reliable);

protected bool CanSteamIdJoin(ulong steamId)
{
12 changes: 6 additions & 6 deletions GLOKON.Baiters.Core/NetworkMessageBaitersServer.cs
Original file line number Diff line number Diff line change
@@ -49,19 +49,19 @@ protected override void ReceivePackets()
}
}

protected override void SendPacketTo(byte[] data, DataChannel channel)
protected override void SendPacketTo(byte[] data, DataChannel channel, bool reliable)
{
foreach (var connection in _connections)
{
InternalSendPacket(connection.Key, connection.Value, data, channel);
InternalSendPacket(connection.Key, connection.Value, data, channel, reliable);
}
}

protected override void SendPacketTo(byte[] data, DataChannel channel, ulong steamId)
protected override void SendPacketTo(byte[] data, DataChannel channel, ulong steamId, bool reliable)
{
if (TryGetConnection(steamId, out var netIdentity))
{
InternalSendPacket(steamId, netIdentity, data, channel);
InternalSendPacket(steamId, netIdentity, data, channel, reliable);
}
}

@@ -84,9 +84,9 @@ private bool TryGetConnection(ulong steamId, out NetIdentity netIdentity)
}
}

private void InternalSendPacket(ulong steamId, NetIdentity netIdentity, byte[] data, DataChannel channel)
private void InternalSendPacket(ulong steamId, NetIdentity netIdentity, byte[] data, DataChannel channel, bool reliable)
{
if (SteamNetworkingMessages.SendMessageToUser(ref netIdentity, data, data.Length, (int)channel) != Result.OK)
if (SteamNetworkingMessages.SendMessageToUser(ref netIdentity, data, data.Length, (int)channel, reliable ? SendType.Reliable : SendType.Unreliable) != Result.OK)
{
Log.Error("Failed to send network message packet to {0}", steamId);
LeavePlayer(steamId);
12 changes: 6 additions & 6 deletions GLOKON.Baiters.Core/P2PBaitersServer.cs
Original file line number Diff line number Diff line change
@@ -65,22 +65,22 @@ protected override void ReceivePackets()
}


protected override void SendPacketTo(byte[] data, DataChannel channel)
protected override void SendPacketTo(byte[] data, DataChannel channel, bool reliable)
{
foreach (var player in Players)
{
InternalSendPacket(player.Key, data, channel);
InternalSendPacket(player.Key, data, channel, reliable);
}
}

protected override void SendPacketTo(byte[] data, DataChannel channel, ulong steamId)
protected override void SendPacketTo(byte[] data, DataChannel channel, ulong steamId, bool reliable)
{
InternalSendPacket(steamId, data, channel);
InternalSendPacket(steamId, data, channel, reliable);
}

private void InternalSendPacket(ulong steamId, byte[] data, DataChannel channel)
private void InternalSendPacket(ulong steamId, byte[] data, DataChannel channel, bool reliable)
{
if (!SteamNetworking.SendP2PPacket(steamId, data, data.Length, (int)channel))
if (!SteamNetworking.SendP2PPacket(steamId, data, data.Length, (int)channel, reliable ? P2PSend.Reliable : P2PSend.Unreliable))
{
Log.Error("Failed to send P2P packet to {0}", steamId);
LeavePlayer(steamId);
15 changes: 1 addition & 14 deletions GLOKON.Baiters.Core/Packets/Handlers/NewPlayerJoinHandler.cs
Original file line number Diff line number Diff line change
@@ -26,20 +26,7 @@ public void Handle(ulong sender, Packet data)
server.SendSystemMessage(string.Format("Use '{0}help' to find out what commands are available", commandPrefix), MessageColour.Success, sender);
}

Task.Run(async () =>
{
await SendChalkPacketsAsync(sender);

foreach (var actor in server.Actors)
{
server.SendActorUpdate(actor.Key, actor.Value, sender);
}

if (server.ServerActor.ActorId.HasValue)
{
server.SendActor(server.ServerActor.ActorId.Value, server.ServerActor, sender);
}
});
Task.Run(() => SendChalkPacketsAsync(sender));
}

private async Task SendChalkPacketsAsync(ulong steamId)
4 changes: 2 additions & 2 deletions GLOKON.Baiters.Core/SocketBaitersServer.cs
Original file line number Diff line number Diff line change
@@ -100,15 +100,15 @@ protected override void ReceivePackets()
_socketManager?.Receive();
}

protected override void SendPacketTo(byte[] data, DataChannel channel)
protected override void SendPacketTo(byte[] data, DataChannel channel, bool reliable)
{
foreach (var connection in _connections)
{
InternalSendPacket(connection.Key, connection.Value, data, channel);
}
}

protected override void SendPacketTo(byte[] data, DataChannel channel, ulong steamId)
protected override void SendPacketTo(byte[] data, DataChannel channel, ulong steamId, bool reliable)
{
if (_connections.TryGetValue(steamId, out var connection))
{
6 changes: 3 additions & 3 deletions GLOKON.Baiters.Server/packages.lock.json
Original file line number Diff line number Diff line change
@@ -29,9 +29,9 @@
},
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
"requested": "[8.0.11, )",
"resolved": "8.0.11",
"contentHash": "zk5lnZrYJgtuJG8L4v17Ej8rZ3PUcR2iweNV08BaO5LbYHIi2wNaVNcJoLxvqgQdnjLlKnCCfVGLDr6QHeAarQ=="
"requested": "[8.0.12, )",
"resolved": "8.0.12",
"contentHash": "FV4HnQ3JI15PHnJ5PGTbz+rYvrih42oLi/7UMIshNwCwUZhTq13UzrggtXk4ygrcMcN+4jsS6hhshx2p/Zd0ig=="
},
"Serilog": {
"type": "Direct",

0 comments on commit fed656d

Please sign in to comment.