mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-20 15:41:01 +00:00
change some stuff aaaaa (extract out init code into QSBWorldSync)
This commit is contained in:
parent
ff001cc8c8
commit
9e166b34fe
@ -1,4 +1,5 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using QSB.EchoesOfTheEye.AirlockSync.VariableSync;
|
||||
using QSB.EchoesOfTheEye.AirlockSync.WorldObjects;
|
||||
using QSB.WorldSync;
|
||||
using System.Threading;
|
||||
@ -10,5 +11,8 @@ internal class AirlockManager : WorldObjectManager
|
||||
public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem;
|
||||
public override bool DlcOnly => true;
|
||||
|
||||
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) => QSBWorldSync.Init<QSBGhostAirlock, GhostAirlock>();
|
||||
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct)
|
||||
{
|
||||
await QSBWorldSync.InitWithVariableSync<QSBGhostAirlock, GhostAirlock, AirlockVariableSyncer>(ct);
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
using QSB.Utility.VariableSync;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.EchoesOfTheEye.AirlockSync.VariableSync;
|
||||
|
||||
internal class AirlockVariableSyncer : WorldObjectVariableSyncer<Vector3[]>
|
||||
{
|
||||
}
|
@ -1,9 +1,12 @@
|
||||
using QSB.WorldSync;
|
||||
using QSB.EchoesOfTheEye.AirlockSync.VariableSync;
|
||||
using QSB.WorldSync;
|
||||
|
||||
namespace QSB.EchoesOfTheEye.AirlockSync.WorldObjects;
|
||||
|
||||
// will be implemented when eote
|
||||
internal class QSBGhostAirlock : WorldObject<GhostAirlock>
|
||||
internal class QSBGhostAirlock : VariableSyncedWorldObject<GhostAirlock, AirlockVariableSyncer>
|
||||
{
|
||||
public override void SendInitialState(uint to) { }
|
||||
public override void SendInitialState(uint to)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ using Mirror;
|
||||
using QSB.EchoesOfTheEye.EclipseDoors.VariableSync;
|
||||
using QSB.EchoesOfTheEye.EclipseDoors.WorldObjects;
|
||||
using QSB.Utility;
|
||||
using QSB.Utility.VariableSync;
|
||||
using QSB.WorldSync;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -23,28 +24,6 @@ internal class DoorManager : WorldObjectManager
|
||||
|
||||
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct)
|
||||
{
|
||||
Doors.Clear();
|
||||
Doors.AddRange(QSBWorldSync.GetUnityObjects<EclipseDoorController>().SortDeterministic());
|
||||
QSBWorldSync.Init<QSBEclipseDoorController, EclipseDoorController>();
|
||||
|
||||
var allDoors = QSBWorldSync.GetWorldObjects<QSBEclipseDoorController>().ToArray();
|
||||
|
||||
if (QSBCore.IsHost)
|
||||
{
|
||||
foreach (var item in allDoors)
|
||||
{
|
||||
var networkObject = Instantiate(QSBNetworkManager.singleton.DoorPrefab);
|
||||
networkObject.SpawnWithServerAuthority();
|
||||
}
|
||||
}
|
||||
|
||||
await UniTask.WaitUntil(() => EclipseDoorVariableSyncer.GetSpecificSyncers<EclipseDoorVariableSyncer>().Count == Doors.Count, cancellationToken: ct);
|
||||
|
||||
foreach (var item in allDoors)
|
||||
{
|
||||
var index = Doors.IndexOf(item.AttachedObject);
|
||||
var syncer = EclipseDoorVariableSyncer.GetSpecificSyncers<EclipseDoorVariableSyncer>()[index];
|
||||
item.SetSyncer(syncer);
|
||||
}
|
||||
await QSBWorldSync.InitWithVariableSync<QSBEclipseDoorController, EclipseDoorController, EclipseDoorVariableSyncer>(ct);
|
||||
}
|
||||
}
|
||||
|
@ -21,32 +21,8 @@ internal class EclipseElevatorManager : WorldObjectManager
|
||||
public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem;
|
||||
public override bool DlcOnly => true;
|
||||
|
||||
public static readonly List<EclipseElevatorController> Elevators = new();
|
||||
|
||||
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct)
|
||||
{
|
||||
Elevators.Clear();
|
||||
Elevators.AddRange(QSBWorldSync.GetUnityObjects<EclipseElevatorController>().SortDeterministic());
|
||||
QSBWorldSync.Init<QSBEclipseElevatorController, EclipseElevatorController>();
|
||||
|
||||
var allElevators = QSBWorldSync.GetWorldObjects<QSBEclipseElevatorController>().ToArray();
|
||||
|
||||
if (QSBCore.IsHost)
|
||||
{
|
||||
foreach (var item in allElevators)
|
||||
{
|
||||
var networkObject = Instantiate(QSBNetworkManager.singleton.ElevatorPrefab);
|
||||
networkObject.SpawnWithServerAuthority();
|
||||
}
|
||||
}
|
||||
|
||||
await UniTask.WaitUntil(() => EclipseDoorVariableSyncer.GetSpecificSyncers<EclipseElevatorVariableSyncer>().Count == Elevators.Count, cancellationToken: ct);
|
||||
|
||||
foreach (var item in allElevators)
|
||||
{
|
||||
var index = Elevators.IndexOf(item.AttachedObject);
|
||||
var syncer = EclipseDoorVariableSyncer.GetSpecificSyncers<EclipseElevatorVariableSyncer>()[index];
|
||||
item.SetSyncer(syncer);
|
||||
}
|
||||
await QSBWorldSync.InitWithVariableSync<QSBEclipseElevatorController, EclipseElevatorController, EclipseElevatorVariableSyncer>(ct);
|
||||
}
|
||||
}
|
||||
|
12
QSB/Utility/VariableSync/VariableSyncStorage.cs
Normal file
12
QSB/Utility/VariableSync/VariableSyncStorage.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace QSB.Utility.VariableSync;
|
||||
|
||||
public static class VariableSyncStorage
|
||||
{
|
||||
public static List<IWorldObjectVariableSyncer> _instances = new();
|
||||
|
||||
public static List<U> GetSpecificSyncers<U>()
|
||||
=> _instances.OfType<U>().ToList();
|
||||
}
|
@ -1,36 +1,27 @@
|
||||
using QSB.WorldSync;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace QSB.Utility.VariableSync;
|
||||
|
||||
public class WorldObjectVariableSyncer<T> : BaseVariableSyncer<T>, IWorldObjectVariableSyncer
|
||||
{
|
||||
private static List<BaseVariableSyncer<T>> _instances = new();
|
||||
|
||||
public IWorldObject AttachedWorldObject { get; private set; }
|
||||
|
||||
public static List<U> GetSpecificSyncers<U>()
|
||||
=> _instances.OfType<U>().ToList();
|
||||
|
||||
public void Init(IWorldObject worldObject)
|
||||
{
|
||||
AttachedWorldObject = worldObject;
|
||||
}
|
||||
=> AttachedWorldObject = worldObject;
|
||||
|
||||
public override void OnStartClient()
|
||||
{
|
||||
_instances.Add(this);
|
||||
VariableSyncStorage._instances.Add(this);
|
||||
DontDestroyOnLoad(this);
|
||||
base.OnStartClient();
|
||||
}
|
||||
|
||||
public override void OnStopClient()
|
||||
{
|
||||
_instances.Remove(this);
|
||||
// DontDestroyOnLoad simply moves a GO to a scene called "DontDestroyOnLoad"
|
||||
// so to undo it we can just move it back
|
||||
VariableSyncStorage._instances.Remove(this);
|
||||
// DontDestroyOnLoad moves GOs to the scene "DontDestroyOnLoad"
|
||||
// so to undo it we can just move them back
|
||||
SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetActiveScene());
|
||||
base.OnStopClient();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ using QSB.Messaging;
|
||||
using QSB.Player.TransformSync;
|
||||
using QSB.TriggerSync.WorldObjects;
|
||||
using QSB.Utility;
|
||||
using QSB.Utility.VariableSync;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@ -306,6 +307,38 @@ public static class QSBWorldSync
|
||||
}
|
||||
}
|
||||
|
||||
public static async UniTask InitWithVariableSync<TWorldObject, TUnityObject, TVariableSyncer>(CancellationToken ct)
|
||||
where TWorldObject : VariableSyncedWorldObject<TUnityObject, TVariableSyncer>, new()
|
||||
where TUnityObject : MonoBehaviour
|
||||
where TVariableSyncer : IWorldObjectVariableSyncer
|
||||
{
|
||||
DebugLog.DebugWrite($"InitWithVariableSync TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}, TVariableSyncer:{typeof(TVariableSyncer).Name}");
|
||||
|
||||
var unityObjects = new List<TUnityObject>();
|
||||
unityObjects.AddRange(GetUnityObjects<TUnityObject>().SortDeterministic());
|
||||
Init<TWorldObject, TUnityObject>();
|
||||
|
||||
var allWorldObjects = GetWorldObjects<TWorldObject>().ToArray();
|
||||
|
||||
if (QSBCore.IsHost)
|
||||
{
|
||||
foreach (var item in allWorldObjects)
|
||||
{
|
||||
var networkObject = UnityEngine.Object.Instantiate(QSBNetworkManager.singleton.ElevatorPrefab);
|
||||
networkObject.SpawnWithServerAuthority();
|
||||
}
|
||||
}
|
||||
|
||||
await UniTask.WaitUntil(() => VariableSyncStorage.GetSpecificSyncers<TVariableSyncer>().Count == unityObjects.Count, cancellationToken: ct);
|
||||
|
||||
foreach (var item in allWorldObjects)
|
||||
{
|
||||
var index = unityObjects.IndexOf(item.AttachedObject);
|
||||
var syncer = VariableSyncStorage.GetSpecificSyncers<TVariableSyncer>()[index];
|
||||
item.SetSyncer(syncer);
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddAndInit<TWorldObject, TUnityObject>(TWorldObject worldObject, TUnityObject unityObject)
|
||||
where TWorldObject : WorldObject<TUnityObject>
|
||||
where TUnityObject : MonoBehaviour
|
||||
|
@ -3,7 +3,7 @@ using UnityEngine;
|
||||
|
||||
namespace QSB.WorldSync;
|
||||
|
||||
internal abstract class VariableSyncedWorldObject<T, U> : WorldObject<T>
|
||||
public abstract class VariableSyncedWorldObject<T, U> : WorldObject<T>
|
||||
where T : MonoBehaviour
|
||||
where U : IWorldObjectVariableSyncer
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user