From: 112batman <53775078+112batman@users.noreply.github.com> Date: Mon, 12 Apr 2021 20:53:14 +0000 (+0200) Subject: Add GameHostChange event (#277) X-Git-Tag: v1.4.0~12 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=fbd9f12f9e352a96821fe8e73c1c7e49b04d8961;p=rhonda%2Fimpostor.git Add GameHostChange event (#277) --- diff --git a/src/Impostor.Api/Events/Game/IGameHostChangedEvent.cs b/src/Impostor.Api/Events/Game/IGameHostChangedEvent.cs new file mode 100644 index 0000000..4470978 --- /dev/null +++ b/src/Impostor.Api/Events/Game/IGameHostChangedEvent.cs @@ -0,0 +1,11 @@ +using Impostor.Api.Net; + +namespace Impostor.Api.Events +{ + public interface IGameHostChangedEvent : IGameEvent + { + IClientPlayer PreviousHost { get; } + + IClientPlayer? NewHost { get; } + } +} diff --git a/src/Impostor.Plugins.Example/Handlers/GameEventListener.cs b/src/Impostor.Plugins.Example/Handlers/GameEventListener.cs index eabbdf1..0125a19 100644 --- a/src/Impostor.Plugins.Example/Handlers/GameEventListener.cs +++ b/src/Impostor.Plugins.Example/Handlers/GameEventListener.cs @@ -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 index 0000000..3aa00f2 --- /dev/null +++ b/src/Impostor.Server/Events/Game/GameHostChangedEvent.cs @@ -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; } + } +} diff --git a/src/Impostor.Server/Net/State/Game.State.cs b/src/Impostor.Server/Net/State/Game.State.cs index 9f9d904..a2105f1 100644 --- a/src/Impostor.Server/Net/State/Game.State.cs +++ b/src/Impostor.Server/Net/State/Game.State.cs @@ -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; } diff --git a/src/Impostor.Server/Net/State/Game.cs b/src/Impostor.Server/Net/State/Game.cs index 20f6c01..2d28eea 100644 --- a/src/Impostor.Server/Net/State/Game.cs +++ b/src/Impostor.Server/Net/State/Game.cs @@ -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)