using Impostor.Api.Net.Inner.Objects;
+using Impostor.Api.Net.Inner.Objects.GameManager;
using Impostor.Api.Net.Inner.Objects.ShipStatus;
namespace Impostor.Api.Net.Inner
/// </summary>
public interface IGameNet
{
+ IInnerGameManager? GameManager { get; }
+
IInnerLobbyBehaviour? LobbyBehaviour { get; }
IInnerGameData? GameData { get; }
-namespace Impostor.Api.Net.Inner.Objects.GameManager;
+using Impostor.Api.Net.Inner.Objects.GameManager.Logic.HideAndSeek;
-internal interface IInnerHideAndSeekManager
+namespace Impostor.Api.Net.Inner.Objects.GameManager;
+
+public interface IInnerHideAndSeekManager
{
-
+ ILogicGameFlowHnS LogicFlowHnS { get; }
}
--- /dev/null
+namespace Impostor.Api.Net.Inner.Objects.GameManager.Logic.HideAndSeek;
+
+public interface ILogicGameFlowHnS
+{
+ float CurrentFinalHideTime { get; }
+
+ float CurrentHideTime { get; }
+}
using System.Threading.Tasks;
using Impostor.Api.Net;
using Impostor.Api.Net.Custom;
+using Impostor.Api.Net.Inner;
using Impostor.Api.Net.Inner.Objects.GameManager;
using Impostor.Server.Net.Inner.Objects.GameManager.Logic;
using Impostor.Server.Net.State;
internal abstract class InnerGameManager : InnerNetObject, IInnerGameManager
{
private readonly ILogger<InnerGameManager> _logger;
+ private readonly List<GameLogicComponent> _logicComponents = new();
public InnerGameManager(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerGameManager> logger) : base(customMessageManager, game)
{
Components.Add(this);
}
- protected readonly List<GameLogicComponent> LogicComponents = new();
-
public LogicGameFlow LogicFlow { get; protected init; } = null!;
public LogicMinigame LogicMinigame { get; protected init; } = null!;
protected T AddGameLogic<T>(T logic)
where T : GameLogicComponent
{
- LogicComponents.Add(logic);
+ _logicComponents.Add(logic);
return logic;
}
- internal int? GetGameLogicTag<T>(T logic)
+ /// <summary>
+ /// Finds the tag of the registered <see cref="GameLogicComponent"/>.
+ /// </summary>
+ /// <param name="logic">Instance to search for.</param>
+ /// <typeparam name="T">Intance type to search for.</typeparam>
+ /// <returns>Tag of the registered <see cref="GameLogicComponent"/>, or -1 if not found.</returns>
+ internal int GetGameLogicTag<T>(T logic)
where T : GameLogicComponent
{
- for (var i = 0; i < LogicComponents.Count; i++)
+ return _logicComponents.IndexOf(logic);
+ }
+
+ public override ValueTask<bool> HandleRpcAsync(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader)
+ {
+ foreach (var logicComponent in _logicComponents)
{
- var component = LogicComponents[i];
- if (component == logic)
- {
- return i;
- }
+ logicComponent.HandleRPC(call, reader);
}
- return null;
+ return ValueTask.FromResult(true);
}
public override ValueTask<bool> SerializeAsync(IMessageWriter writer, bool initialState)
{
var innerReader = reader.ReadMessage();
var tag = (int)innerReader.Tag;
- if (tag < 0 || tag > this.LogicComponents.Count)
+ if (tag < 0 || tag > this._logicComponents.Count)
{
_logger.LogError("Out of bounds in DeserializeAsync of InnerGameManager");
continue;
}
- this.LogicComponents[tag].Deserialize(innerReader, initialState);
+ this._logicComponents[tag].Deserialize(innerReader, initialState);
}
return ValueTask.CompletedTask;
--- /dev/null
+using Impostor.Api.Net.Inner.Objects.GameManager;
+using Impostor.Api.Net.Inner.Objects.GameManager.Logic.HideAndSeek;
+
+namespace Impostor.Server.Net.Inner.Objects.GameManager;
+
+internal partial class InnerHideAndSeekManager
+{
+ ILogicGameFlowHnS IInnerHideAndSeekManager.LogicFlowHnS => LogicFlowHnS;
+}
namespace Impostor.Server.Net.Inner.Objects.GameManager;
-internal class InnerHideAndSeekManager : InnerGameManager, IInnerHideAndSeekManager
+internal partial class InnerHideAndSeekManager : InnerGameManager, IInnerHideAndSeekManager
{
public InnerHideAndSeekManager(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerGameManager> logger) : base(customMessageManager, game, logger)
{
- LogicMusic = AddGameLogic(new LogicHnSMusic(this));
- LogicMinigame = AddGameLogic(new LogicMinigameHnS(this));
- LogicFlowHnS = new LogicGameFlowHnS(this);
+ LogicMusic = AddGameLogic(new LogicHnSMusic());
+ LogicMinigame = AddGameLogic(new LogicMinigameHnS());
+ LogicFlowHnS = new LogicGameFlowHnS();
LogicFlow = AddGameLogic(LogicFlowHnS);
LogicUsables = AddGameLogic(new LogicUsablesHnS());
- LogicRoleSelection = AddGameLogic(new LogicRoleSelectionHnS(this));
- LogicOptionsHnS = new LogicOptionsHnS(this, game);
+ LogicRoleSelection = AddGameLogic(new LogicRoleSelectionHnS());
+ LogicOptionsHnS = new LogicOptionsHnS(game);
LogicOptions = AddGameLogic(this.LogicOptionsHnS);
- LogicDangerLevel = AddGameLogic(new LogicHnSDangerLevel(this));
- LogicPing = AddGameLogic(new LogicPingsHnS(this));
- LogicDeathPopup = AddGameLogic(new LogicHnSDeathPopup(this));
+ LogicDangerLevel = AddGameLogic(new LogicHnSDangerLevel());
+ LogicPing = AddGameLogic(new LogicPingsHnS());
+ LogicDeathPopup = AddGameLogic(new LogicHnSDeathPopup());
}
public LogicHnSMusic LogicMusic { get; private set; }
{
public InnerNormalGameManager(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerGameManager> logger) : base(customMessageManager, game, logger)
{
- LogicFlow = AddGameLogic(new LogicGameFlowNormal(this));
- LogicMinigame = AddGameLogic(new LogicMinigame(this));
- LogicRoleSelection = AddGameLogic(new LogicRoleSelectionNormal(this));
- LogicUsables = AddGameLogic(new LogicUsablesBasic(this));
- LogicOptions = AddGameLogic(new LogicOptionsNormal(this, game));
+ LogicFlow = AddGameLogic(new LogicGameFlowNormal());
+ LogicMinigame = AddGameLogic(new LogicMinigame());
+ LogicRoleSelection = AddGameLogic(new LogicRoleSelectionNormal());
+ LogicUsables = AddGameLogic(new LogicUsablesBasic());
+ LogicOptions = AddGameLogic(new LogicOptionsNormal(game));
}
}
-using Impostor.Api.Net.Inner;
-using Impostor.Api.Net.Inner.Objects;
+using System;
+using Impostor.Api.Net.Inner;
namespace Impostor.Server.Net.Inner.Objects.GameManager.Logic;
internal abstract class GameLogicComponent
{
- public virtual void OnPlayerDisconnect(IInnerPlayerControl pc)
+ public virtual void HandleRPC(RpcCalls callId, IMessageReader reader)
{
+ throw new NotImplementedException($"Unhandled RpcCall {callId}");
}
- public virtual void HandleRPC(RpcCalls callId, IMessageReader reader)
+ public virtual bool Serialize(IMessageWriter writer, bool initialState)
{
+ throw new NotImplementedException();
}
- public abstract bool Serialize(IMessageWriter writer, bool initialState);
-
- public abstract void Deserialize(IMessageReader reader, bool initialState);
+ public virtual void Deserialize(IMessageReader reader, bool initialState)
+ {
+ throw new NotImplementedException();
+ }
}
-namespace Impostor.Server.Net.Inner.Objects.GameManager.Logic.HideAndSeek;
+using Impostor.Api.Net.Inner.Objects.GameManager.Logic.HideAndSeek;
-internal class LogicGameFlowHnS : LogicGameFlow
-{
- private float currentFinalHideTime;
- private float currentHideTime;
-
- public LogicGameFlowHnS(InnerHideAndSeekManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- throw new System.NotImplementedException();
- }
+namespace Impostor.Server.Net.Inner.Objects.GameManager.Logic.HideAndSeek;
+internal class LogicGameFlowHnS : LogicGameFlow, ILogicGameFlowHnS
+{
public override void Deserialize(IMessageReader reader, bool initialState)
{
var num = reader.ReadSingle();
- currentFinalHideTime = reader.ReadSingle();
- currentHideTime = num;
+ CurrentFinalHideTime = reader.ReadSingle();
+ CurrentHideTime = num;
}
+
+ public float CurrentFinalHideTime { get; private set; }
+
+ public float CurrentHideTime { get; private set; }
}
internal class LogicHnSDangerLevel : GameLogicComponent
{
- public LogicHnSDangerLevel(InnerHideAndSeekManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicHnSDeathPopup : GameLogicComponent
{
- public LogicHnSDeathPopup(InnerHideAndSeekManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicHnSMusic : GameLogicComponent
{
- public LogicHnSMusic(InnerHideAndSeekManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicMinigameHnS : LogicMinigame
{
- public LogicMinigameHnS(InnerHideAndSeekManager gameManager) : base(gameManager)
- {
- }
}
internal class LogicOptionsHnS : LogicOptions
{
- public LogicOptionsHnS(InnerHideAndSeekManager gameManager, Game game) : base(game)
+ public LogicOptionsHnS(Game game) : base(game)
{
}
}
internal class LogicPingsHnS : GameLogicComponent
{
- public LogicPingsHnS(InnerHideAndSeekManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicRoleSelectionHnS : LogicRoleSelection
{
- public LogicRoleSelectionHnS(InnerHideAndSeekManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicUsablesHnS : LogicUsables
{
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicMinigame : GameLogicComponent
{
- public LogicMinigame(InnerGameManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicGameFlowNormal : LogicGameFlow
{
- public LogicGameFlowNormal(InnerNormalGameManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicOptionsNormal : LogicOptions
{
- public LogicOptionsNormal(InnerNormalGameManager gameManager, Game game) : base(game)
+ public LogicOptionsNormal(Game game) : base(game)
{
}
}
internal class LogicRoleSelectionNormal : LogicRoleSelection
{
- public LogicRoleSelectionNormal(InnerNormalGameManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
internal class LogicUsablesBasic : LogicUsables
{
- public LogicUsablesBasic(InnerNormalGameManager gameManager)
- {
- }
-
- public override bool Serialize(IMessageWriter writer, bool initialState)
- {
- return false;
- }
-
- public override void Deserialize(IMessageReader reader, bool initialState)
- {
- }
}
using System.Threading.Tasks;
using Impostor.Api;
using Impostor.Api.Games;
-using Impostor.Api.Innersloth.GameOptions;
using Impostor.Api.Net;
using Impostor.Api.Net.Inner;
using Impostor.Api.Net.Messages;
using Impostor.Hazel;
using Impostor.Server.Net.Inner;
-using Impostor.Server.Net.Inner.Objects.GameManager;
namespace Impostor.Server.Net.State
{
throw new ImpostorException("Attempted to change settings when the host was not spawned.");
}
- var gameManager = FindObjectByType<InnerGameManager>();
- if (gameManager == null)
+ if (GameNet.GameManager == null)
{
throw new ImpostorException("Attempted to change options when the game manager was not spawned.");
}
- var gameOptionsTag = gameManager.GetGameLogicTag(gameManager.LogicOptions);
- if (gameOptionsTag == null)
+ var gameOptionsTag = GameNet.GameManager.GetGameLogicTag(GameNet.GameManager.LogicOptions);
+ if (gameOptionsTag == -1)
{
throw new ImpostorException("Attempted to change options when the LogicOptions was not spawned.");
}
Code.Serialize(writer);
writer.StartMessage(GameDataTag.DataFlag);
- writer.WritePacked(gameManager.NetId);
+ writer.WritePacked(GameNet.GameManager.NetId);
writer.StartMessage((byte)gameOptionsTag);
- GameOptionsFactory.Serialize(writer, Options);
+ GameNet.GameManager.LogicOptions.Serialize(writer, false);
writer.EndMessage();
writer.EndMessage();
return default;
}
- public T? FindObjectByType<T>()
- where T : IInnerNetObject
- {
- foreach (var netObject in _allObjects)
- {
- if (netObject is T result)
- {
- return result;
- }
- }
-
- return default;
- }
-
public async ValueTask<bool> HandleGameDataAsync(IMessageReader parent, ClientPlayer sender, bool toPlayer)
{
// Find target player.
{
switch (netObj)
{
+ case InnerGameManager innerGameManager:
+ {
+ GameNet.GameManager = innerGameManager;
+ break;
+ }
+
case InnerLobbyBehaviour lobby:
{
GameNet.LobbyBehaviour = lobby;
using Impostor.Api.Net.Inner;
using Impostor.Api.Net.Inner.Objects;
+using Impostor.Api.Net.Inner.Objects.GameManager;
using Impostor.Api.Net.Inner.Objects.ShipStatus;
namespace Impostor.Server.Net.State
/// <inheritdoc />
internal partial class GameNet : IGameNet
{
+ IInnerGameManager? IGameNet.GameManager => GameManager;
+
IInnerLobbyBehaviour? IGameNet.LobbyBehaviour => LobbyBehaviour;
IInnerGameData? IGameNet.GameData => GameData;
using Impostor.Server.Net.Inner.Objects;
using Impostor.Server.Net.Inner.Objects.Components;
+using Impostor.Server.Net.Inner.Objects.GameManager;
using Impostor.Server.Net.Inner.Objects.ShipStatus;
namespace Impostor.Server.Net.State
{
internal partial class GameNet
{
+ public InnerGameManager? GameManager { get; internal set; }
+
public InnerLobbyBehaviour? LobbyBehaviour { get; internal set; }
public InnerGameData? GameData { get; internal set; }