change some stuff aaaaa (extract out init code into QSBWorldSync)

This commit is contained in:
Mister_Nebula 2022-03-13 21:44:04 +00:00
parent ff001cc8c8
commit 9e166b34fe
9 changed files with 79 additions and 68 deletions

View File

@ -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);
}
}

View File

@ -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[]>
{
}

View File

@ -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)
{
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View 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();
}

View File

@ -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();
}

View File

@ -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

View File

@ -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
{