]> git.deb.at Git - rhonda/impostor.git/commitdiff
Added kick/ban
authorAeonLucid <aeonlucid@gmail.com>
Sun, 20 Sep 2020 22:39:02 +0000 (00:39 +0200)
committerAeonLucid <aeonlucid@gmail.com>
Sun, 20 Sep 2020 22:39:02 +0000 (00:39 +0200)
src/AmongUs.Server/Net/Client.cs
src/AmongUs.Server/Net/Game.cs

index 273e564f9a5cbb2a1102caedc2e4be7840dd0336..c4bfe14df85b5bf968bb5f0043e13ff82d483856 100644 (file)
@@ -149,7 +149,6 @@ namespace AmongUs.Server.Net
                     break;
                 }
                 
-                // 101A39EC
                 case RequestFlag.RemoveGame:
                     break;
                 
@@ -221,6 +220,20 @@ namespace AmongUs.Server.Net
                     Player.Game.HandleAlterGame(message, Player, isPublic);
                     break;
                 }
+
+                case RequestFlag.KickPlayer:
+                {
+                    if (!IsPacketAllowed(message, true))
+                    {
+                        return;
+                    }
+
+                    var playerId = message.ReadPackedInt32();
+                    var isBan = message.ReadBoolean();
+
+                    Player.Game.HandleKickPlayer(playerId, isBan);
+                    break;
+                }
                 
                 default:
                     Logger.Warning("Server received unknown flag {0}.", flag);
index ea346500b67c5f07ad22834a70864c46373003fe..6fdfee7cfaf72eb631384c3dc2ff9064aedd9ad6 100644 (file)
@@ -160,17 +160,28 @@ namespace AmongUs.Server.Net
 
             using (var packet = MessageWriter.Get(SendOption.Reliable))
             {
-                packet.StartMessage((byte) RequestFlag.RemovePlayer);
-                packet.Write(Code);
-                packet.Write(playerId);
-                packet.Write(HostId);
-                packet.Write(reason);
-                packet.EndMessage();
-                
+                WriteRemovePlayerMessage(packet, false, playerId, reason);
                 SendToAllExcept(packet, player);
             }
         }
 
+        public void HandleKickPlayer(int playerId, bool isBan)
+        {
+            using (var message = MessageWriter.Get(SendOption.Reliable))
+            {
+                WriteKickPlayerMessage(message, false, playerId, isBan);
+                SendToAllExcept(message, null);
+                
+                if (_players.TryRemove(playerId, out var player))
+                {
+                    player.Game = null;
+                }
+                
+                WriteRemovePlayerMessage(message, true, playerId, 0);
+                SendToAllExcept(message, player);
+            }
+        }
+        
         private void HandleJoinGameNew(ClientPlayer player)
         {
             Logger.Verbose("[{0}] Player joined.", CodeStr);
@@ -197,12 +208,12 @@ namespace AmongUs.Server.Net
 
             using (var message = MessageWriter.Get(SendOption.Reliable))
             {
-                WriteJoinedGameMessage(message, player, false);
+                WriteJoinedGameMessage(message, false, player);
                 WriteAlterGameMessage(message, false);
                 
                 player.Client.Send(message);
 
-                BroadcastJoinMessage(message, player, true);
+                BroadcastJoinMessage(message, true, player);
             }
         }
 
@@ -217,7 +228,7 @@ namespace AmongUs.Server.Net
                 {
                     foreach (var (_, player) in _players.Where(x => x.Value != sender))
                     {
-                        WriteJoinedGameMessage(message, player, true);
+                        WriteJoinedGameMessage(message, true, player);
                         WriteAlterGameMessage(message, false);
                         player.Client.Send(message);
                     }
@@ -246,14 +257,29 @@ namespace AmongUs.Server.Net
 
             using (var packet = MessageWriter.Get(SendOption.Reliable))
             {
-                WriteWaitForHostMessage(packet, sender, false);
+                WriteWaitForHostMessage(packet, false, sender);
                 sender.Client.Send(packet);
 
-                BroadcastJoinMessage(packet, sender, true);
+                BroadcastJoinMessage(packet, true, sender);
             }
         }
 
-        private void WriteJoinedGameMessage(MessageWriter message, ClientPlayer player, bool clear)
+        private void WriteRemovePlayerMessage(MessageWriter message, bool clear, int playerId, byte reason)
+        {
+            if (clear)
+            {
+                message.Clear(SendOption.Reliable);
+            }
+            
+            message.StartMessage((byte) RequestFlag.RemovePlayer);
+            message.Write(Code);
+            message.Write(playerId);
+            message.Write(HostId);
+            message.Write(reason);
+            message.EndMessage();
+        }
+        
+        private void WriteJoinedGameMessage(MessageWriter message, bool clear, ClientPlayer player)
         {
             if (clear)
             {
@@ -288,7 +314,21 @@ namespace AmongUs.Server.Net
             message.EndMessage();
         }
 
-        private void WriteWaitForHostMessage(MessageWriter message, ClientPlayer player, bool clear)
+        private void WriteKickPlayerMessage(MessageWriter message, bool clear, int playerId, bool isBan)
+        {
+            if (clear)
+            {
+                message.Clear(SendOption.Reliable);
+            }
+            
+            message.StartMessage((byte) RequestFlag.KickPlayer);
+            message.Write(Code);
+            message.WritePacked(playerId);
+            message.Write(isBan);
+            message.EndMessage();
+        }
+        
+        private void WriteWaitForHostMessage(MessageWriter message, bool clear, ClientPlayer player)
         {
             if (clear)
             {
@@ -301,7 +341,7 @@ namespace AmongUs.Server.Net
             message.EndMessage();
         }
         
-        private void BroadcastJoinMessage(MessageWriter message, ClientPlayer player, bool clear)
+        private void BroadcastJoinMessage(MessageWriter message, bool clear, ClientPlayer player)
         {
             if (clear)
             {