]> git.deb.at Git - rhonda/impostor.git/commitdiff
Add GameHostChange event (#277)
author112batman <53775078+112batman@users.noreply.github.com>
Mon, 12 Apr 2021 20:53:14 +0000 (22:53 +0200)
committerGitHub <noreply@github.com>
Mon, 12 Apr 2021 20:53:14 +0000 (20:53 +0000)
src/Impostor.Api/Events/Game/IGameHostChangedEvent.cs [new file with mode: 0644]
src/Impostor.Plugins.Example/Handlers/GameEventListener.cs
src/Impostor.Server/Events/Game/GameHostChangedEvent.cs [new file with mode: 0644]
src/Impostor.Server/Net/State/Game.State.cs
src/Impostor.Server/Net/State/Game.cs

diff --git a/src/Impostor.Api/Events/Game/IGameHostChangedEvent.cs b/src/Impostor.Api/Events/Game/IGameHostChangedEvent.cs
new file mode 100644 (file)
index 0000000..4470978
--- /dev/null
@@ -0,0 +1,11 @@
+using Impostor.Api.Net;
+
+namespace Impostor.Api.Events
+{
+    public interface IGameHostChangedEvent : IGameEvent
+    {
+        IClientPlayer PreviousHost { get; }
+
+        IClientPlayer? NewHost { get; }
+    }
+}
index eabbdf149d71960c192bc22cb24d95f1ce4f053d..0125a19a1121d556e032485f6ff4f0485d635928 100644 (file)
@@ -49,6 +49,17 @@ namespace Impostor.Plugins.Example.Handlers
             _logger.LogInformation("Game {code} > destroyed", e.Game.Code);
         }
 
+        [EventListener]
+        public void OnGameHostChanged(IGameHostChangedEvent e)
+        {
+            _logger.LogInformation(
+                "Game {code} > changed host from {previous} to {new}",
+                e.Game.Code,
+                e.PreviousHost.Character?.PlayerInfo.PlayerName,
+                e.NewHost != null ? e.NewHost.Character?.PlayerInfo.PlayerName : "none"
+            );
+        }
+
         [EventListener]
         public void OnPlayerJoined(IGamePlayerJoinedEvent e)
         {
diff --git a/src/Impostor.Server/Events/Game/GameHostChangedEvent.cs b/src/Impostor.Server/Events/Game/GameHostChangedEvent.cs
new file mode 100644 (file)
index 0000000..3aa00f2
--- /dev/null
@@ -0,0 +1,22 @@
+using Impostor.Api.Events;
+using Impostor.Api.Games;
+using Impostor.Api.Net;
+
+namespace Impostor.Server.Events
+{
+    public class GameHostChangedEvent : IGameHostChangedEvent
+    {
+        public GameHostChangedEvent(IGame game, IClientPlayer previousHost, IClientPlayer? newHost)
+        {
+            Game = game;
+            PreviousHost = previousHost;
+            NewHost = newHost;
+        }
+
+        public IGame Game { get; }
+
+        public IClientPlayer PreviousHost { get; }
+
+        public IClientPlayer? NewHost { get; }
+    }
+}
index 9f9d90473a9aa9ff8e9a22379e68ac0cd2e24c26..a2105f1465a0c1bf7b6ace99a266b3172b34909f 100644 (file)
@@ -50,8 +50,15 @@ namespace Impostor.Server.Net.State
 
             player.Client.Player = null;
 
+            // Host migration.
+            if (HostId == playerId)
+            {
+                await MigrateHost();
+                await _eventManager.CallAsync(new GameHostChangedEvent(this, player, Host));
+            }
+
             // Game is empty, remove it.
-            if (_players.IsEmpty)
+            if (_players.IsEmpty || Host == null)
             {
                 GameState = GameStates.Destroyed;
 
@@ -60,12 +67,6 @@ namespace Impostor.Server.Net.State
                 return true;
             }
 
-            // Host migration.
-            if (HostId == playerId)
-            {
-                await MigrateHost();
-            }
-
             if (isBan)
             {
                 BanIp(player.Client.Connection.EndPoint.Address);
@@ -97,7 +98,6 @@ namespace Impostor.Server.Net.State
 
             if (host == null)
             {
-                await EndAsync();
                 return;
             }
 
index 20f6c01b2c5e143d220d18267c02c7ee26678d5a..2d28eeadde1433cabddcb8a08e519a97dfe50ff2 100644 (file)
@@ -96,11 +96,6 @@ namespace Impostor.Server.Net.State
             return _players.TryGetValue(clientId, out var clientPlayer) ? clientPlayer : null;
         }
 
-        public ValueTask EndAsync()
-        {
-            return _gameManager.RemoveAsync(Code);
-        }
-
         internal async ValueTask StartedAsync()
         {
             if (GameState == GameStates.Starting)