mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-11 06:40:39 +00:00
add server state
This commit is contained in:
parent
31f7557ba7
commit
11c167dd6a
30
QSB/ClientServerStateSync/Events/ServerStateEvent.cs
Normal file
30
QSB/ClientServerStateSync/Events/ServerStateEvent.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
using QSB.Events;
|
||||||
|
using QSB.Messaging;
|
||||||
|
|
||||||
|
namespace QSB.ClientServerStateSync.Events
|
||||||
|
{
|
||||||
|
internal class ServerStateEvent : QSBEvent<EnumMessage<ServerState>>
|
||||||
|
{
|
||||||
|
public override EventType Type => EventType.ServerState;
|
||||||
|
|
||||||
|
public override void SetupListener()
|
||||||
|
=> GlobalMessenger<ServerState>.AddListener(EventNames.QSBServerState, Handler);
|
||||||
|
|
||||||
|
public override void CloseListener()
|
||||||
|
=> GlobalMessenger<ServerState>.RemoveListener(EventNames.QSBServerState, Handler);
|
||||||
|
|
||||||
|
private void Handler(ServerState state) => SendEvent(CreateMessage(state));
|
||||||
|
|
||||||
|
private EnumMessage<ServerState> CreateMessage(ServerState state) => new EnumMessage<ServerState>
|
||||||
|
{
|
||||||
|
AboutId = LocalPlayerId,
|
||||||
|
EnumValue = state
|
||||||
|
};
|
||||||
|
|
||||||
|
public override void OnReceiveLocal(bool server, EnumMessage<ServerState> message)
|
||||||
|
=> OnReceiveRemote(server, message);
|
||||||
|
|
||||||
|
public override void OnReceiveRemote(bool server, EnumMessage<ServerState> message)
|
||||||
|
=> ServerStateManager.Instance.ChangeServerState(message.EnumValue);
|
||||||
|
}
|
||||||
|
}
|
26
QSB/ClientServerStateSync/ServerState.cs
Normal file
26
QSB/ClientServerStateSync/ServerState.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
namespace QSB.ClientServerStateSync
|
||||||
|
{
|
||||||
|
public enum ServerState
|
||||||
|
{
|
||||||
|
// When in menus
|
||||||
|
NotLoaded,
|
||||||
|
|
||||||
|
// When in any credits
|
||||||
|
Credits,
|
||||||
|
|
||||||
|
// For normal play in SolarSystem
|
||||||
|
InSolarSystem,
|
||||||
|
|
||||||
|
// For normal play in EyeOfTheUniverse
|
||||||
|
InEye,
|
||||||
|
|
||||||
|
// At end of loop, waiting for everyone to be ready to reload the scene
|
||||||
|
WaitingForDeath,
|
||||||
|
|
||||||
|
// At start of loop, waiting for everybody to be ready to start playing
|
||||||
|
AwaitingPlayConfirmation,
|
||||||
|
|
||||||
|
// When the statue has been activated
|
||||||
|
InStatueCutscene
|
||||||
|
}
|
||||||
|
}
|
126
QSB/ClientServerStateSync/ServerStateManager.cs
Normal file
126
QSB/ClientServerStateSync/ServerStateManager.cs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
using QSB.Events;
|
||||||
|
using QSB.Player;
|
||||||
|
using QSB.Player.TransformSync;
|
||||||
|
using QSB.Utility;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace QSB.ClientServerStateSync
|
||||||
|
{
|
||||||
|
class ServerStateManager : MonoBehaviour
|
||||||
|
{
|
||||||
|
public static ServerStateManager Instance { get; private set; }
|
||||||
|
|
||||||
|
public event ChangeStateEvent OnChangeState;
|
||||||
|
public delegate void ChangeStateEvent(ServerState newState);
|
||||||
|
|
||||||
|
private ServerState _currentState;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
=> Instance = this;
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
if (!QSBCore.IsHost)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
|
||||||
|
GlobalMessenger.AddListener("TriggerSupernova", OnTriggerSupernova);
|
||||||
|
|
||||||
|
QSBCore.UnityEvents.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => QSBEventManager.FireEvent(EventNames.QSBServerState, ForceGetCurrentState()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChangeServerState(ServerState newState)
|
||||||
|
{
|
||||||
|
if (_currentState == newState)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DebugLog.DebugWrite($"CHANGE SERVER STATE FROM {_currentState} to {newState}");
|
||||||
|
_currentState = newState;
|
||||||
|
OnChangeState?.Invoke(newState);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerState GetServerState()
|
||||||
|
=> _currentState;
|
||||||
|
|
||||||
|
private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool inUniverse)
|
||||||
|
{
|
||||||
|
switch (newScene)
|
||||||
|
{
|
||||||
|
case OWScene.Credits_Fast:
|
||||||
|
case OWScene.Credits_Final:
|
||||||
|
case OWScene.PostCreditsScene:
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.Credits);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWScene.TitleScreen:
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.NotLoaded);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWScene.SolarSystem:
|
||||||
|
if (oldScene == OWScene.SolarSystem)
|
||||||
|
{
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.AwaitingPlayConfirmation);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.InSolarSystem);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWScene.EyeOfTheUniverse:
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.AwaitingPlayConfirmation);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OWScene.None:
|
||||||
|
case OWScene.Undefined:
|
||||||
|
default:
|
||||||
|
DebugLog.ToConsole($"Warning - newScene is {newScene}!", OWML.Common.MessageType.Warning);
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.NotLoaded);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTriggerSupernova()
|
||||||
|
{
|
||||||
|
DebugLog.DebugWrite($"TriggerSupernova");
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.WaitingForDeath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServerState ForceGetCurrentState()
|
||||||
|
{
|
||||||
|
var currentScene = LoadManager.GetCurrentScene();
|
||||||
|
var lastScene = LoadManager.GetPreviousScene();
|
||||||
|
|
||||||
|
switch (currentScene)
|
||||||
|
{
|
||||||
|
case OWScene.SolarSystem:
|
||||||
|
return ServerState.InSolarSystem;
|
||||||
|
case OWScene.EyeOfTheUniverse:
|
||||||
|
return ServerState.InEye;
|
||||||
|
default:
|
||||||
|
return ServerState.NotLoaded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (!QSBCore.IsHost)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_currentState == ServerState.AwaitingPlayConfirmation)
|
||||||
|
{
|
||||||
|
if (QSBPlayerManager.PlayerList.All(x => x.State == ClientState.WaitingForOthersToReadyInSolarSystem))
|
||||||
|
{
|
||||||
|
DebugLog.DebugWrite($"All ready!!");
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBStartLoop);
|
||||||
|
QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.InSolarSystem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -83,6 +83,7 @@
|
|||||||
public static string QSBLaunchProbe = "QSBLaunchProbe";
|
public static string QSBLaunchProbe = "QSBLaunchProbe";
|
||||||
public static string QSBPlayerLaunchProbe = "QSBPlayerLaunchProbe";
|
public static string QSBPlayerLaunchProbe = "QSBPlayerLaunchProbe";
|
||||||
public static string QSBEndLoop = "QSBEndLoop";
|
public static string QSBEndLoop = "QSBEndLoop";
|
||||||
|
public static string QSBServerState = "QSBServerState";
|
||||||
public static string QSBClientState = "QSBClientState";
|
public static string QSBClientState = "QSBClientState";
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,6 +6,7 @@
|
|||||||
ServerTime,
|
ServerTime,
|
||||||
StartStatue,
|
StartStatue,
|
||||||
EndLoop,
|
EndLoop,
|
||||||
|
ServerState,
|
||||||
ClientState,
|
ClientState,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -64,6 +64,7 @@ namespace QSB.Events
|
|||||||
new PlayerRetrieveProbeEvent(),
|
new PlayerRetrieveProbeEvent(),
|
||||||
new PlayerLaunchProbeEvent(),
|
new PlayerLaunchProbeEvent(),
|
||||||
new EndLoopEvent(),
|
new EndLoopEvent(),
|
||||||
|
new ServerStateEvent(),
|
||||||
new ClientStateEvent(),
|
new ClientStateEvent(),
|
||||||
// World Objects
|
// World Objects
|
||||||
new ElevatorEvent(),
|
new ElevatorEvent(),
|
||||||
|
@ -256,6 +256,9 @@
|
|||||||
<Compile Include="QuantumSync\Patches\QuantumVisibilityPatches.cs" />
|
<Compile Include="QuantumSync\Patches\QuantumVisibilityPatches.cs" />
|
||||||
<Compile Include="QuantumSync\Patches\ServerQuantumPatches.cs" />
|
<Compile Include="QuantumSync\Patches\ServerQuantumPatches.cs" />
|
||||||
<Compile Include="SectorSync\TargetType.cs" />
|
<Compile Include="SectorSync\TargetType.cs" />
|
||||||
|
<Compile Include="ClientServerStateSync\Events\ServerStateEvent.cs" />
|
||||||
|
<Compile Include="ClientServerStateSync\ServerState.cs" />
|
||||||
|
<Compile Include="ClientServerStateSync\ServerStateManager.cs" />
|
||||||
<Compile Include="ShipSync\ComponentType.cs" />
|
<Compile Include="ShipSync\ComponentType.cs" />
|
||||||
<Compile Include="ShipSync\Events\Component\ComponentDamagedEvent.cs" />
|
<Compile Include="ShipSync\Events\Component\ComponentDamagedEvent.cs" />
|
||||||
<Compile Include="ShipSync\Events\Component\ComponentRepairedEvent.cs" />
|
<Compile Include="ShipSync\Events\Component\ComponentRepairedEvent.cs" />
|
||||||
|
@ -152,6 +152,7 @@ namespace QSB
|
|||||||
QSBEventManager.Init();
|
QSBEventManager.Init();
|
||||||
|
|
||||||
gameObject.AddComponent<RespawnOnDeath>();
|
gameObject.AddComponent<RespawnOnDeath>();
|
||||||
|
gameObject.AddComponent<ServerStateManager>();
|
||||||
gameObject.AddComponent<ClientStateManager>();
|
gameObject.AddComponent<ClientStateManager>();
|
||||||
|
|
||||||
if (QSBSceneManager.IsInUniverse)
|
if (QSBSceneManager.IsInUniverse)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user