new generic system

This commit is contained in:
Mister_Nebula 2020-12-23 22:43:05 +00:00
parent 3887dd962e
commit b44269fa86
22 changed files with 106 additions and 103 deletions

View File

@ -21,13 +21,7 @@ namespace QSB.ElevatorSync
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{
_elevators = Resources.FindObjectsOfTypeAll<Elevator>().ToList();
for (var id = 0; id < _elevators.Count; id++)
{
var qsbElevator = QSBWorldSync.GetWorldObject<QSBElevator>(id) ?? new QSBElevator();
qsbElevator.Init(_elevators[id], id);
QSBWorldSync.AddWorldObject(qsbElevator);
}
QSBWorldSync.Init<QSBElevator, Elevator>(ref _elevators);
}
public int GetId(Elevator elevator) => _elevators.IndexOf(elevator);

View File

@ -21,7 +21,7 @@ namespace QSB.ElevatorSync.Events
public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message)
{
var elevator = QSBWorldSync.GetWorldObject<QSBElevator>(message.ObjectId);
var elevator = QSBWorldSync.GetWorldObject<QSBElevator, Elevator>(message.ObjectId);
elevator?.RemoteCall(message.State);
}
}

View File

@ -4,7 +4,7 @@ using UnityEngine;
namespace QSB.ElevatorSync
{
public class QSBElevator : WorldObject
public class QSBElevator : WorldObject<Elevator>
{
private Elevator _elevator;
private Vector3 _startLocalPos;
@ -14,7 +14,7 @@ namespace QSB.ElevatorSync
private OWAudioSource _owAudioSourceOneShot;
private OWAudioSource _owAudioSourceLP;
public void Init(Elevator elevator, int id)
public override void Init(Elevator elevator, int id)
{
_elevator = elevator;
ObjectId = id;

View File

@ -22,7 +22,7 @@ namespace QSB.GeyserSync.Events
public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message)
{
var geyser = QSBWorldSync.GetWorldObject<QSBGeyser>(message.ObjectId);
var geyser = QSBWorldSync.GetWorldObject<QSBGeyser, GeyserController>(message.ObjectId);
geyser?.SetState(message.State);
}
}

View File

@ -18,16 +18,8 @@ namespace QSB.GeyserSync
QSBPatchManager.OnPatchType -= OnPatchType;
}
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{
var geyserControllers = Resources.FindObjectsOfTypeAll<GeyserController>();
for (var id = 0; id < geyserControllers.Length; id++)
{
var qsbGeyser = QSBWorldSync.GetWorldObject<QSBGeyser>(id) ?? new QSBGeyser();
qsbGeyser.Init(geyserControllers[id], id);
QSBWorldSync.AddWorldObject(qsbGeyser);
}
}
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
=> QSBWorldSync.Init<QSBGeyser, GeyserController>();
public void OnPatchType(QSBPatchTypes type)
{

View File

@ -1,20 +1,20 @@
using QSB.Events;
using QSB.WorldSync;
using QuantumUNET;
using UnityEngine;
namespace QSB.GeyserSync
{
public class QSBGeyser : WorldObject
public class QSBGeyser : WorldObject<GeyserController>
{
private GeyserController _geyserController;
public void Init(GeyserController geyserController, int id)
public override void Init(GeyserController geyserController, int id)
{
ObjectId = id;
_geyserController = geyserController;
geyserController.OnGeyserActivateEvent += () => HandleEvent(true);
geyserController.OnGeyserDeactivateEvent += () => HandleEvent(false);
_geyserController.OnGeyserActivateEvent += () => HandleEvent(true);
_geyserController.OnGeyserDeactivateEvent += () => HandleEvent(false);
}
private void HandleEvent(bool state)

View File

@ -22,7 +22,7 @@ namespace QSB.OrbSync.Events
public override void OnReceiveRemote(bool server, OrbSlotMessage message)
{
var orbSlot = QSBWorldSync.GetWorldObject<QSBOrbSlot>(message.SlotId);
var orbSlot = QSBWorldSync.GetWorldObject<QSBOrbSlot, NomaiInterfaceSlot>(message.SlotId);
orbSlot?.SetState(message.SlotState, message.OrbId);
}
}

View File

@ -15,15 +15,8 @@ namespace QSB.OrbSync
private void BuildOrbSlots()
{
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
var orbSlots = Resources.FindObjectsOfTypeAll<NomaiInterfaceSlot>();
for (var id = 0; id < orbSlots.Length; id++)
{
var qsbOrbSlot = QSBWorldSync.GetWorldObject<QSBOrbSlot>(id) ?? new QSBOrbSlot();
qsbOrbSlot.Init(orbSlots[id], id);
}
DebugLog.DebugWrite($"Finished orb slot build with {orbSlots.Length} slots.", MessageType.Success);
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot, NomaiInterfaceSlot>();
QSBWorldSync.Init<QSBOrbSlot, NomaiInterfaceSlot>();
}
public void BuildOrbs()

View File

@ -4,17 +4,16 @@ using QSB.WorldSync;
namespace QSB.OrbSync
{
public class QSBOrbSlot : WorldObject
public class QSBOrbSlot : WorldObject<NomaiInterfaceSlot>
{
public NomaiInterfaceSlot InterfaceSlot { get; private set; }
public bool Activated { get; private set; }
private bool _initialized;
public void Init(NomaiInterfaceSlot slot, int id)
public override void Init(NomaiInterfaceSlot slot, int id)
{
ObjectId = id;
InterfaceSlot = slot;
AttachedObject = slot;
_initialized = true;
QSBWorldSync.AddWorldObject(this);
}
@ -34,9 +33,9 @@ namespace QSB.OrbSync
return;
}
var occOrb = state ? QSBWorldSync.OldOrbList[orbId] : null;
InterfaceSlot.SetValue("_occupyingOrb", occOrb);
AttachedObject.SetValue("_occupyingOrb", occOrb);
var ev = state ? "OnSlotActivated" : "OnSlotDeactivated";
QSBWorldSync.RaiseEvent(InterfaceSlot, ev);
QSBWorldSync.RaiseEvent(AttachedObject, ev);
Activated = state;
}
}

View File

@ -28,7 +28,7 @@ namespace QSB.Player.Events
{
return;
}
var sector = QSBWorldSync.GetWorldObject<QSBSector>(message.ObjectId);
var sector = QSBWorldSync.GetWorldObject<QSBSector, Sector>(message.ObjectId);
if (sector == null)
{

View File

@ -206,10 +206,10 @@ namespace QSB
QSBPlayerManager.RemoveAllPlayers();
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
QSBWorldSync.RemoveWorldObjects<QSBElevator>();
QSBWorldSync.RemoveWorldObjects<QSBGeyser>();
QSBWorldSync.RemoveWorldObjects<QSBSector>();
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot, NomaiInterfaceSlot>();
QSBWorldSync.RemoveWorldObjects<QSBElevator, Elevator>();
QSBWorldSync.RemoveWorldObjects<QSBGeyser, GeyserController>();
QSBWorldSync.RemoveWorldObjects<QSBSector, Sector>();
QSBWorldSync.OrbSyncList.Clear();
QSBWorldSync.OldDialogueTrees.Clear();
@ -241,10 +241,10 @@ namespace QSB
DebugLog.ToConsole("Server stopped!", MessageType.Info);
QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove());
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
QSBWorldSync.RemoveWorldObjects<QSBElevator>();
QSBWorldSync.RemoveWorldObjects<QSBGeyser>();
QSBWorldSync.RemoveWorldObjects<QSBSector>();
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot, NomaiInterfaceSlot>();
QSBWorldSync.RemoveWorldObjects<QSBElevator, Elevator>();
QSBWorldSync.RemoveWorldObjects<QSBGeyser, GeyserController>();
QSBWorldSync.RemoveWorldObjects<QSBSector, Sector>();
base.OnStopServer();
}

View File

@ -28,8 +28,8 @@ namespace QSB.QuantumSync.Events
{
return;
}
var obj = QSBWorldSync.GetWorldObject<QSBSocketedQuantumObject>(message.ObjectId).AttachedObject;
var socket = QSBWorldSync.GetWorldObject<QSBQuantumSocket>(message.SocketId).AttachedSocket;
var obj = QSBWorldSync.GetWorldObject<QSBSocketedQuantumObject, SocketedQuantumObject>(message.ObjectId).AttachedObject;
var socket = QSBWorldSync.GetWorldObject<QSBQuantumSocket, QuantumSocket>(message.SocketId).AttachedSocket;
obj.GetType().GetMethod("MoveToSocket", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(obj, new object[] { socket });
obj.transform.localRotation = message.LocalRotation;
}

View File

@ -1,6 +1,14 @@
namespace QSB.QuantumSync
using QSB.WorldSync;
using UnityEngine;
namespace QSB.QuantumSync
{
internal class QSBMultiStateQuantumObject
public class QSBMultiStateQuantumObject : WorldObject<MultiStateQuantumObject>
{
public override void Init(MultiStateQuantumObject attachedObject, int id)
{
ObjectId = id;
AttachedObject = attachedObject;
}
}
}

View File

@ -3,11 +3,11 @@ using QSB.WorldSync;
namespace QSB.QuantumSync
{
internal class QSBQuantumSocket : WorldObject
internal class QSBQuantumSocket : WorldObject<QuantumSocket>
{
public QuantumSocket AttachedSocket { get; private set; }
public void Init(QuantumSocket quantumSocket, int id)
public override void Init(QuantumSocket quantumSocket, int id)
{
ObjectId = id;
AttachedSocket = quantumSocket;

View File

@ -2,11 +2,9 @@
namespace QSB.QuantumSync
{
internal class QSBSocketedQuantumObject : WorldObject
internal class QSBSocketedQuantumObject : WorldObject<SocketedQuantumObject>
{
public SocketedQuantumObject AttachedObject { get; private set; }
public void Init(SocketedQuantumObject quantumObject, int id)
public override void Init(SocketedQuantumObject quantumObject, int id)
{
ObjectId = id;
AttachedObject = quantumObject;

View File

@ -1,4 +1,5 @@
using QSB.WorldSync;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
@ -10,6 +11,7 @@ namespace QSB.QuantumSync
public static QuantumManager Instance { get; private set; }
private List<SocketedQuantumObject> _socketedQuantumObjects;
private List<MultiStateQuantumObject> _multiStateQuantumObjects;
private List<QuantumSocket> _quantumSockets;
public void Awake()
@ -18,26 +20,17 @@ namespace QSB.QuantumSync
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
}
public void OnDestroy() => QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{
_socketedQuantumObjects = Resources.FindObjectsOfTypeAll<SocketedQuantumObject>().ToList();
for (var id = 0; id < _socketedQuantumObjects.Count; id++)
{
var qsbSocketQuantumObj = QSBWorldSync.GetWorldObject<QSBSocketedQuantumObject>(id) ?? new QSBSocketedQuantumObject();
qsbSocketQuantumObj.Init(_socketedQuantumObjects[id], id);
QSBWorldSync.AddWorldObject(qsbSocketQuantumObj);
}
_quantumSockets = Resources.FindObjectsOfTypeAll<QuantumSocket>().ToList();
for (var id = 0; id < _quantumSockets.Count; id++)
{
var qsbQuantumSocket = QSBWorldSync.GetWorldObject<QSBQuantumSocket>(id) ?? new QSBQuantumSocket();
qsbQuantumSocket.Init(_quantumSockets[id], id);
QSBWorldSync.AddWorldObject(qsbQuantumSocket);
}
QSBWorldSync.Init<QSBSocketedQuantumObject, SocketedQuantumObject>(ref _socketedQuantumObjects);
QSBWorldSync.Init<QSBQuantumSocket, QuantumSocket>(ref _quantumSockets);
QSBWorldSync.Init<QSBMultiStateQuantumObject, MultiStateQuantumObject>(ref _multiStateQuantumObjects);
}
public int GetId(SocketedQuantumObject obj) => _socketedQuantumObjects.IndexOf(obj);
public int GetId(MultiStateQuantumObject obj) => _multiStateQuantumObjects.IndexOf(obj);
public int GetId(QuantumSocket obj) => _quantumSockets.IndexOf(obj);
}
}

View File

@ -3,18 +3,17 @@ using UnityEngine;
namespace QSB.SectorSync
{
public class QSBSector : WorldObject
public class QSBSector : WorldObject<Sector>
{
public Sector Sector { get; private set; }
public Sector.Name Type => Sector.GetName();
public string Name => Sector.name;
public Transform Transform => Sector.transform;
public Sector.Name Type => AttachedObject.GetName();
public string Name => AttachedObject.name;
public Transform Transform => AttachedObject.transform;
public Vector3 Position => Transform.position;
public void Init(Sector sector, int id)
public override void Init(Sector sector, int id)
{
Sector = sector;
ObjectId = id;
AttachedObject = sector;
}
}
}

View File

@ -29,11 +29,11 @@ namespace QSB.SectorSync
public void RebuildSectors()
{
DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Warning);
QSBWorldSync.RemoveWorldObjects<QSBSector>();
QSBWorldSync.RemoveWorldObjects<QSBSector, Sector>();
var sectors = Resources.FindObjectsOfTypeAll<Sector>().ToList();
for (var id = 0; id < sectors.Count; id++)
{
var qsbSector = QSBWorldSync.GetWorldObject<QSBSector>(id) ?? new QSBSector();
var qsbSector = QSBWorldSync.GetWorldObject<QSBSector, Sector>(id) ?? new QSBSector();
qsbSector.Init(sectors[id], id);
QSBWorldSync.AddWorldObject(qsbSector);
}
@ -43,7 +43,7 @@ namespace QSB.SectorSync
public QSBSector GetClosestSector(Transform trans) // trans rights \o/
{
return QSBWorldSync.GetWorldObjects<QSBSector>()
.Where(sector => sector.Sector != null
.Where(sector => sector.AttachedObject != null
&& !_sectorBlacklist.Contains(sector.Type)
&& sector.Transform.gameObject.activeInHierarchy)
.OrderBy(sector => Vector3.Distance(sector.Position, trans.position))

View File

@ -63,7 +63,7 @@ namespace QSB.TransformSync
DebugLog.ToConsole($"DisabledSocket is null for {AttachedNetId}! (ProbeLauncher null? : {Player.ProbeLauncher == null})", MessageType.Error);
return;
}
if (Player.GetState(State.ProbeActive) || ReferenceSector?.Sector == null)
if (Player.GetState(State.ProbeActive) || ReferenceSector?.AttachedObject == null)
{
return;
}

View File

@ -86,7 +86,7 @@ namespace QSB.TransformSync
{
if (HasAuthority) // If this script is attached to the client's own body on the client's side.
{
if (ReferenceSector == null || ReferenceSector.Sector == null)
if (ReferenceSector == null || ReferenceSector.AttachedObject == null)
{
DebugLog.ToConsole($"Error - ReferenceSector has null value for {Player.PlayerId}.{GetType().Name}", MessageType.Error);
return;

View File

@ -3,9 +3,11 @@ using QSB.OrbSync;
using QSB.TransformSync;
using QSB.Utility;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
namespace QSB.WorldSync
{
@ -17,36 +19,43 @@ namespace QSB.WorldSync
public static Dictionary<string, bool> DialogueConditions { get; } = new Dictionary<string, bool>();
public static List<FactReveal> ShipLogFacts { get; } = new List<FactReveal>();
private static readonly List<WorldObject> WorldObjects = new List<WorldObject>();
private static readonly List<object> WorldObjects = new List<object>();
public static void AddWorldObject(WorldObject worldObject)
public static void AddWorldObject(object worldObject)
{
if (WorldObjects.Contains(worldObject))
{
return;
}
DebugLog.DebugWrite($"adding {worldObject.GetType().Name}");
WorldObjects.Add(worldObject);
}
public static IEnumerable<T> GetWorldObjects<T>() => WorldObjects.OfType<T>();
public static T GetWorldObject<T>(int id) where T : WorldObject => GetWorldObjects<T>().FirstOrDefault(x => x.ObjectId == id);
public static T GetWorldObject<T, U>(int id) where T : WorldObject<U> where U : UnityEngine.Object
=> GetWorldObjects<T>().FirstOrDefault(x => x.ObjectId == id);
public static void RemoveWorldObjects<T>() where T : WorldObject => WorldObjects.RemoveAll(x => x.GetType() == typeof(T));
public static void RemoveWorldObjects<T, U>() where T : WorldObject<U> where U : UnityEngine.Object
=> WorldObjects.RemoveAll(x => x.GetType() == typeof(T));
public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state)
public static void Init<QSBType, BaseType>(ref List<BaseType> list)
where QSBType : WorldObject<BaseType>
where BaseType : UnityEngine.Object
=> list = Init<QSBType, BaseType>();
public static List<BaseType> Init<QSBType, BaseType>()
where QSBType : WorldObject<BaseType>
where BaseType : UnityEngine.Object
{
var slotList = GetWorldObjects<QSBOrbSlot>().ToList();
if (!slotList.Any())
var list = Resources.FindObjectsOfTypeAll<BaseType>().ToList();
for (var id = 0; id < list.Count; id++)
{
return;
}
var qsbSlot = slotList.First(x => x.InterfaceSlot == slot);
var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb);
if (orbSync.HasAuthority)
{
qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb));
var obj = GetWorldObject<QSBType, BaseType>(id) ?? (QSBType)Activator.CreateInstance(typeof(QSBType));
obj.Init(list[id], id);
AddWorldObject(obj);
}
return list;
}
public static void RaiseEvent(object instance, string eventName)
@ -64,6 +73,21 @@ namespace QSB.WorldSync
}
}
public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state)
{
var slotList = GetWorldObjects<QSBOrbSlot>().ToList();
if (!slotList.Any())
{
return;
}
var qsbSlot = slotList.First(x => x.AttachedObject == slot);
var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb);
if (orbSync.HasAuthority)
{
qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb));
}
}
public static void SetDialogueCondition(string name, bool state)
{
if (!QSBCore.IsServer)

View File

@ -1,7 +1,10 @@
namespace QSB.WorldSync
{
public class WorldObject
public abstract class WorldObject<T> where T : UnityEngine.Object
{
public int ObjectId { get; protected set; }
public T AttachedObject { get; protected set; }
public abstract void Init(T attachedObject, int id);
}
}