--- /dev/null
+using Impostor.Api.Net;
+
+namespace Impostor.Api.Events
+{
+ public interface IGameHostChangedEvent : IGameEvent
+ {
+ IClientPlayer PreviousHost { get; }
+
+ IClientPlayer? NewHost { get; }
+ }
+}
_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)
{
--- /dev/null
+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; }
+ }
+}
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;
return true;
}
- // Host migration.
- if (HostId == playerId)
- {
- await MigrateHost();
- }
-
if (isBan)
{
BanIp(player.Client.Connection.EndPoint.Address);
if (host == null)
{
- await EndAsync();
return;
}
return _players.TryGetValue(clientId, out var clientPlayer) ? clientPlayer : null;
}
- public ValueTask EndAsync()
- {
- return _gameManager.RemoveAsync(Code);
- }
-
internal async ValueTask StartedAsync()
{
if (GameState == GameStates.Starting)