mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-28 22:13:23 +00:00
add client state
This commit is contained in:
parent
967718d234
commit
31f7557ba7
13
QSB/ClientServerStateSync/ClientState.cs
Normal file
13
QSB/ClientServerStateSync/ClientState.cs
Normal file
@ -0,0 +1,13 @@
|
||||
namespace QSB.ClientServerStateSync
|
||||
{
|
||||
public enum ClientState
|
||||
{
|
||||
NotLoaded,
|
||||
InTitleScreen,
|
||||
AliveInSolarSystem,
|
||||
DeadInSolarSystem,
|
||||
AliveInEye,
|
||||
WaitingForOthersToDieInSolarSystem,
|
||||
WaitingForOthersToReadyInSolarSystem
|
||||
}
|
||||
}
|
125
QSB/ClientServerStateSync/ClientStateManager.cs
Normal file
125
QSB/ClientServerStateSync/ClientStateManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
41
QSB/ClientServerStateSync/Events/ClientStateEvent.cs
Normal file
41
QSB/ClientServerStateSync/Events/ClientStateEvent.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
@ -83,5 +83,6 @@
|
||||
public static string QSBLaunchProbe = "QSBLaunchProbe";
|
||||
public static string QSBPlayerLaunchProbe = "QSBPlayerLaunchProbe";
|
||||
public static string QSBEndLoop = "QSBEndLoop";
|
||||
public static string QSBClientState = "QSBClientState";
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@
|
||||
ServerTime,
|
||||
StartStatue,
|
||||
EndLoop,
|
||||
ClientState,
|
||||
|
||||
/*
|
||||
* PLAYER EVENTS
|
||||
|
@ -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(),
|
||||
|
@ -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
|
||||
|
@ -90,6 +90,7 @@ namespace QSB.Player
|
||||
{
|
||||
player.UpdateStateObjects();
|
||||
}
|
||||
player.State = message.ClientState;
|
||||
}
|
||||
|
||||
public static IEnumerable<T> GetSyncObjects<T>() where T : PlayerSyncObject =>
|
||||
|
@ -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" />
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user