add client state

This commit is contained in:
Mister_Nebula 2021-08-08 19:57:58 +01:00
parent 967718d234
commit 31f7557ba7
12 changed files with 194 additions and 1 deletions

View File

@ -0,0 +1,13 @@
namespace QSB.ClientServerStateSync
{
public enum ClientState
{
NotLoaded,
InTitleScreen,
AliveInSolarSystem,
DeadInSolarSystem,
AliveInEye,
WaitingForOthersToDieInSolarSystem,
WaitingForOthersToReadyInSolarSystem
}
}

View File

@ -0,0 +1,125 @@
using QSB.Events;
using QSB.Player;
using QSB.Player.TransformSync;
using QSB.Utility;
using UnityEngine;
namespace QSB.ClientServerStateSync
{
class ClientStateManager : MonoBehaviour
{
public static ClientStateManager Instance { get; private set; }
public event ChangeStateEvent OnChangeState;
public delegate void ChangeStateEvent(ClientState newState);
private void Awake()
=> Instance = this;
private void Start()
{
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => QSBEventManager.FireEvent(EventNames.QSBClientState, ForceGetCurrentState()));
}
public void ChangeClientState(ClientState newState)
{
if (QSBPlayerManager.LocalPlayer.State == newState)
{
return;
}
DebugLog.DebugWrite($"CHANGE CLIENT STATE FROM {QSBPlayerManager.LocalPlayer.State} to {newState}");
QSBPlayerManager.LocalPlayer.State = newState;
OnChangeState?.Invoke(newState);
}
private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool inUniverse)
{
var serverState = ServerStateManager.Instance.GetServerState();
if (QSBCore.IsHost)
{
if (newScene == OWScene.SolarSystem && oldScene != OWScene.SolarSystem)
{
DebugLog.DebugWrite($"Server is loading SolarSystem just after creating server.");
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.AliveInSolarSystem);
}
if (newScene == OWScene.SolarSystem && oldScene == OWScene.SolarSystem)
{
DebugLog.DebugWrite($"Server is reloading SolarSystem");
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.WaitingForOthersToReadyInSolarSystem);
}
if (newScene == OWScene.TitleScreen)
{
DebugLog.DebugWrite($"Server has gone back to title screen");
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.InTitleScreen);
}
}
else
{
if (newScene == OWScene.SolarSystem && oldScene != OWScene.SolarSystem && serverState != ServerState.AwaitingPlayConfirmation)
{
DebugLog.DebugWrite($"Client is loading SolarSystem just after connecting.");
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.AliveInSolarSystem);
}
if (newScene == OWScene.SolarSystem && oldScene == OWScene.SolarSystem)
{
DebugLog.DebugWrite($"Client is reloading SolarSystem");
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.WaitingForOthersToReadyInSolarSystem);
}
if (serverState == ServerState.WaitingForDeath)
{
DebugLog.DebugWrite($"Client loaded new scene while server is waiting for all players to die");
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.WaitingForOthersToReadyInSolarSystem);
}
}
}
public void OnDeath()
{
var currentScene = QSBSceneManager.CurrentScene;
if (currentScene == OWScene.SolarSystem)
{
QSBEventManager.FireEvent(EventNames.QSBClientState, ClientState.DeadInSolarSystem);
}
else if (currentScene == OWScene.EyeOfTheUniverse)
{
DebugLog.ToConsole($"Error - You died in the Eye? HOW DID YOU DO THAT?!", OWML.Common.MessageType.Error);
}
else
{
// whaaaaaaaaa
DebugLog.ToConsole($"Error - You died... in a menu? In the credits? In any case, you should never see this. :P", OWML.Common.MessageType.Error);
}
}
private ClientState ForceGetCurrentState()
{
var currentScene = LoadManager.GetCurrentScene();
var lastScene = LoadManager.GetPreviousScene();
if (currentScene == OWScene.TitleScreen || currentScene == OWScene.Credits_Fast || currentScene == OWScene.Credits_Final)
{
return ClientState.InTitleScreen;
}
// cant join while dead...
if (currentScene == OWScene.SolarSystem)
{
return ClientState.AliveInSolarSystem;
}
if (currentScene == OWScene.EyeOfTheUniverse)
{
return ClientState.AliveInEye;
}
return ClientState.NotLoaded;
}
}
}

View File

@ -0,0 +1,41 @@
using QSB.Events;
using QSB.Messaging;
using QSB.Player;
using QSB.Utility;
namespace QSB.ClientServerStateSync.Events
{
internal class ClientStateEvent : QSBEvent<EnumMessage<ClientState>>
{
public override EventType Type => EventType.ClientState;
public override void SetupListener()
=> GlobalMessenger<ClientState>.AddListener(EventNames.QSBClientState, Handler);
public override void CloseListener()
=> GlobalMessenger<ClientState>.RemoveListener(EventNames.QSBClientState, Handler);
private void Handler(ClientState state) => SendEvent(CreateMessage(state));
private EnumMessage<ClientState> CreateMessage(ClientState state) => new EnumMessage<ClientState>
{
AboutId = LocalPlayerId,
EnumValue = state
};
public override void OnReceiveLocal(bool server, EnumMessage<ClientState> message)
=> ClientStateManager.Instance.ChangeClientState(message.EnumValue);
public override void OnReceiveRemote(bool server, EnumMessage<ClientState> message)
{
DebugLog.DebugWrite($"Remote receive id:{message.AboutId} state:{message.EnumValue}");
if (message.AboutId == uint.MaxValue)
{
DebugLog.DebugWrite($"Error - ID is uint.MaxValue!", OWML.Common.MessageType.Error);
return;
}
var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.State = message.EnumValue;
}
}
}

View File

@ -1,4 +1,5 @@
using QSB.Events;
using QSB.ClientServerStateSync;
using QSB.Events;
using QSB.Player;
using QSB.Utility;
@ -25,6 +26,7 @@ namespace QSB.DeathSync.Events
DebugLog.DebugWrite($"RECEIVE LOCAL PLAYER DEATH");
var player = QSBPlayerManager.GetPlayer(message.AboutId);
RespawnManager.Instance.OnPlayerDeath(player);
ClientStateManager.Instance.OnDeath();
}
public override void OnReceiveRemote(bool server, PlayerDeathMessage message)

View File

@ -83,5 +83,6 @@
public static string QSBLaunchProbe = "QSBLaunchProbe";
public static string QSBPlayerLaunchProbe = "QSBPlayerLaunchProbe";
public static string QSBEndLoop = "QSBEndLoop";
public static string QSBClientState = "QSBClientState";
}
}

View File

@ -6,6 +6,7 @@
ServerTime,
StartStatue,
EndLoop,
ClientState,
/*
* PLAYER EVENTS

View File

@ -14,6 +14,7 @@ using QSB.Player.Events;
using QSB.ProbeSync.Events;
using QSB.QuantumSync.Events;
using QSB.RoastingSync.Events;
using QSB.ClientServerStateSync.Events;
using QSB.ShipSync.Events;
using QSB.ShipSync.Events.Component;
using QSB.ShipSync.Events.Hull;
@ -63,6 +64,7 @@ namespace QSB.Events
new PlayerRetrieveProbeEvent(),
new PlayerLaunchProbeEvent(),
new EndLoopEvent(),
new ClientStateEvent(),
// World Objects
new ElevatorEvent(),
new GeyserEvent(),

View File

@ -58,6 +58,7 @@ namespace QSB.Player
public bool IsInShrine; // TODO : move into PlayerStates?
public IQSBQuantumObject EntangledObject;
public bool IsDead { get; set; }
public ClientState State { get; set; }
// Local only
public PlayerProbeLauncher LocalProbeLauncher

View File

@ -90,6 +90,7 @@ namespace QSB.Player
{
player.UpdateStateObjects();
}
player.State = message.ClientState;
}
public static IEnumerable<T> GetSyncObjects<T>() where T : PlayerSyncObject =>

View File

@ -132,6 +132,8 @@
<Compile Include="CampfireSync\Events\CampfireStateEvent.cs" />
<Compile Include="CampfireSync\Patches\CampfirePatches.cs" />
<Compile Include="CampfireSync\WorldObjects\QSBCampfire.cs" />
<Compile Include="ClientServerStateSync\ClientStateManager.cs" />
<Compile Include="ClientServerStateSync\Events\ClientStateEvent.cs" />
<Compile Include="ConversationSync\Events\DialogueConditionEvent.cs" />
<Compile Include="ConversationSync\Events\DialogueConditionMessage.cs" />
<Compile Include="ConversationSync\Events\ConversationEvent.cs" />
@ -160,6 +162,7 @@
<Compile Include="FrequencySync\Events\IdentifyFrequencyEvent.cs" />
<Compile Include="FrequencySync\Events\IdentifySignalEvent.cs" />
<Compile Include="FrequencySync\Patches\FrequencyPatches.cs" />
<Compile Include="ClientServerStateSync\ClientState.cs" />
<Compile Include="GeyserSync\Patches\GeyserPatches.cs" />
<Compile Include="Inputs\Patches\InputPatches.cs" />
<Compile Include="Instruments\QSBCamera\CameraController.cs" />

View File

@ -17,6 +17,7 @@ using QSB.Player.TransformSync;
using QSB.PoolSync;
using QSB.QuantumSync;
using QSB.SectorSync;
using QSB.ClientServerStateSync;
using QSB.ShipSync;
using QSB.StatueSync;
using QSB.TimeSync;

View File

@ -11,6 +11,7 @@ using QSB.Player;
using QSB.Player.TransformSync;
using QSB.PoolSync;
using QSB.ProbeSync.TransformSync;
using QSB.ClientServerStateSync;
using QSB.ShipSync.TransformSync;
using QSB.TimeSync;
using QSB.Utility;
@ -151,6 +152,7 @@ namespace QSB
QSBEventManager.Init();
gameObject.AddComponent<RespawnOnDeath>();
gameObject.AddComponent<ClientStateManager>();
if (QSBSceneManager.IsInUniverse)
{