diff --git a/GLOKON.Baiters.Core/BaitersServer.cs b/GLOKON.Baiters.Core/BaitersServer.cs index 124397c..9c0291f 100644 --- a/GLOKON.Baiters.Core/BaitersServer.cs +++ b/GLOKON.Baiters.Core/BaitersServer.cs @@ -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 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 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 + { + ["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 points, ulong? steamId = null, int? overrideColour = null) { SendPacket(new("chalk_packet") @@ -610,7 +647,7 @@ internal void SendCanvas(long canvasId, IList 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) { diff --git a/GLOKON.Baiters.Core/NetworkMessageBaitersServer.cs b/GLOKON.Baiters.Core/NetworkMessageBaitersServer.cs index 6355d26..b68d8d6 100644 --- a/GLOKON.Baiters.Core/NetworkMessageBaitersServer.cs +++ b/GLOKON.Baiters.Core/NetworkMessageBaitersServer.cs @@ -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); diff --git a/GLOKON.Baiters.Core/P2PBaitersServer.cs b/GLOKON.Baiters.Core/P2PBaitersServer.cs index 577f0f6..c713277 100644 --- a/GLOKON.Baiters.Core/P2PBaitersServer.cs +++ b/GLOKON.Baiters.Core/P2PBaitersServer.cs @@ -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); diff --git a/GLOKON.Baiters.Core/Packets/Handlers/NewPlayerJoinHandler.cs b/GLOKON.Baiters.Core/Packets/Handlers/NewPlayerJoinHandler.cs index 824bd24..3e6b8f1 100644 --- a/GLOKON.Baiters.Core/Packets/Handlers/NewPlayerJoinHandler.cs +++ b/GLOKON.Baiters.Core/Packets/Handlers/NewPlayerJoinHandler.cs @@ -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) diff --git a/GLOKON.Baiters.Core/SocketBaitersServer.cs b/GLOKON.Baiters.Core/SocketBaitersServer.cs index dc2d2b7..223d7a9 100644 --- a/GLOKON.Baiters.Core/SocketBaitersServer.cs +++ b/GLOKON.Baiters.Core/SocketBaitersServer.cs @@ -100,7 +100,7 @@ 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) { @@ -108,7 +108,7 @@ protected override void SendPacketTo(byte[] data, DataChannel 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)) { diff --git a/GLOKON.Baiters.Server/packages.lock.json b/GLOKON.Baiters.Server/packages.lock.json index d2a9bf8..8f5fa62 100644 --- a/GLOKON.Baiters.Server/packages.lock.json +++ b/GLOKON.Baiters.Server/packages.lock.json @@ -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",