using instance id

This commit is contained in:
Aleksander Waage 2020-08-13 20:43:47 +02:00
parent 65c5c2cddd
commit d9aa3c8847
11 changed files with 54 additions and 37 deletions

View File

@ -10,14 +10,14 @@ namespace QSB.ElevatorSync
public override void SetupListener() public override void SetupListener()
{ {
GlobalMessenger<ElevatorDirection, string>.AddListener(EventNames.QSBStartLift, (direction, elevatorName) => SendEvent(CreateMessage(direction, elevatorName))); GlobalMessenger<int, ElevatorDirection>.AddListener(EventNames.QSBStartLift, (id, direction) => SendEvent(CreateMessage(id, direction)));
} }
private ElevatorMessage CreateMessage(ElevatorDirection direction, string elevatorName) => new ElevatorMessage private ElevatorMessage CreateMessage(int id, ElevatorDirection direction) => new ElevatorMessage
{ {
SenderId = PlayerRegistry.LocalPlayer.NetId, SenderId = PlayerRegistry.LocalPlayer.NetId,
Direction = direction, Direction = direction,
UniqueName = elevatorName Id = id
}; };
public override void OnReceiveRemote(ElevatorMessage message) public override void OnReceiveRemote(ElevatorMessage message)
@ -26,7 +26,7 @@ namespace QSB.ElevatorSync
{ {
return; return;
} }
WorldRegistry.GetObject<QSBElevator>(message.UniqueName).RemoteCall(message.Direction); WorldRegistry.GetObject<QSBElevator>(message.Id).RemoteCall(message.Direction);
} }
} }
} }

View File

@ -1,24 +1,34 @@
using UnityEngine; using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace QSB.ElevatorSync namespace QSB.ElevatorSync
{ {
public class ElevatorManager : MonoBehaviour public class ElevatorManager : MonoBehaviour
{ {
public static ElevatorManager Instance { get; private set; }
private List<Elevator> _elevators;
private void Awake() private void Awake()
{ {
QSB.Helper.Events.Subscribe<Elevator>(OWML.Common.Events.AfterAwake); Instance = this;
QSB.Helper.Events.Event += OnEvent;
LoadManager.OnCompleteSceneLoad += OnCompleteSceneLoad;
QSB.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(ElevatorPatches.StartLift)); QSB.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(ElevatorPatches.StartLift));
} }
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) private void OnCompleteSceneLoad(OWScene oldScene, OWScene newScene)
{ {
if (behaviour is Elevator elevator && ev == OWML.Common.Events.AfterAwake) _elevators = Resources.FindObjectsOfTypeAll<Elevator>().ToList();
for (var id = 0; id < _elevators.Count; id++)
{ {
var elevatorController = new QSBElevator(); var elevatorController = new QSBElevator();
elevatorController.Init(elevator); elevatorController.Init(_elevators[id], id);
} }
} }
public int GetId(Elevator elevator) => _elevators.IndexOf(elevator);
} }
} }

View File

@ -9,7 +9,8 @@ namespace QSB.ElevatorSync
{ {
var isGoingUp = __instance.GetValue<bool>("_goingToTheEnd"); var isGoingUp = __instance.GetValue<bool>("_goingToTheEnd");
var direction = isGoingUp ? ElevatorDirection.Up : ElevatorDirection.Down; var direction = isGoingUp ? ElevatorDirection.Up : ElevatorDirection.Down;
GlobalMessenger<ElevatorDirection, string>.FireEvent(EventNames.QSBStartLift, direction, __instance.name); var id = ElevatorManager.Instance.GetId(__instance);
GlobalMessenger<int, ElevatorDirection>.FireEvent(EventNames.QSBStartLift, id, direction);
} }
} }
} }

View File

@ -1,4 +1,5 @@
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using UnityEngine; using UnityEngine;
@ -6,8 +7,6 @@ namespace QSB.ElevatorSync
{ {
public class QSBElevator : WorldObject public class QSBElevator : WorldObject
{ {
public override string UniqueName => _elevator.name;
private Elevator _elevator; private Elevator _elevator;
private Vector3 _startLocalPos; private Vector3 _startLocalPos;
private Vector3 _endLocalPos; private Vector3 _endLocalPos;
@ -16,10 +15,16 @@ namespace QSB.ElevatorSync
private OWAudioSource _owAudioSourceOneShot; private OWAudioSource _owAudioSourceOneShot;
private OWAudioSource _owAudioSourceLP; private OWAudioSource _owAudioSourceLP;
public void Init(Elevator elevator) public void Init(Elevator elevator, int id)
{ {
WorldRegistry.WorldObjects.Add(this);
_elevator = elevator; _elevator = elevator;
Id = id;
WorldRegistry.WorldObjects.Add(this);
UnityHelper.Instance.RunWhen(() => _elevator.GetValue<SingleInteractionVolume>("_interactVolume") != null, InitValues);
}
private void InitValues()
{
_startLocalPos = _elevator.GetValue<Vector3>("_startLocalPos"); _startLocalPos = _elevator.GetValue<Vector3>("_startLocalPos");
_endLocalPos = _elevator.GetValue<Vector3>("_endLocalPos"); _endLocalPos = _elevator.GetValue<Vector3>("_endLocalPos");
_interactVolume = _elevator.GetValue<SingleInteractionVolume>("_interactVolume"); _interactVolume = _elevator.GetValue<SingleInteractionVolume>("_interactVolume");

View File

@ -10,13 +10,13 @@ namespace QSB.GeyserSync
public override void SetupListener() public override void SetupListener()
{ {
GlobalMessenger<string, bool>.AddListener(EventNames.QSBGeyserState, (name, state) => SendEvent(CreateMessage(name, state))); GlobalMessenger<int, bool>.AddListener(EventNames.QSBGeyserState, (id, state) => SendEvent(CreateMessage(id, state)));
} }
private GeyserMessage CreateMessage(string name, bool state) => new GeyserMessage private GeyserMessage CreateMessage(int id, bool state) => new GeyserMessage
{ {
SenderId = PlayerRegistry.LocalPlayer.NetId, SenderId = PlayerRegistry.LocalPlayer.NetId,
UniqueName = name, Id = id,
State = state State = state
}; };
@ -26,7 +26,7 @@ namespace QSB.GeyserSync
{ {
return; return;
} }
var geyser = WorldRegistry.GetObject<QSBGeyser>(message.UniqueName); var geyser = WorldRegistry.GetObject<QSBGeyser>(message.Id);
geyser.SetState(message.State); geyser.SetState(message.State);
} }
} }

View File

@ -10,16 +10,16 @@ namespace QSB.GeyserSync
{ {
Instance = this; Instance = this;
QSB.Helper.Events.Subscribe<GeyserController>(OWML.Common.Events.AfterAwake); LoadManager.OnCompleteSceneLoad += OnCompleteSceneLoad;
QSB.Helper.Events.Event += OnEvent;
} }
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) private void OnCompleteSceneLoad(OWScene oldScene, OWScene newScene)
{ {
if (behaviour is GeyserController geyserController && ev == OWML.Common.Events.AfterAwake) var geyserControllers = Resources.FindObjectsOfTypeAll<GeyserController>();
for (var id = 0; id < geyserControllers.Length; id++)
{ {
var geyser = new QSBGeyser(); var geyser = new QSBGeyser();
geyser.Init(geyserController); geyser.Init(geyserControllers[id], id);
} }
} }

View File

@ -6,12 +6,11 @@ namespace QSB.GeyserSync
{ {
public class QSBGeyser : WorldObject public class QSBGeyser : WorldObject
{ {
public override string UniqueName => _geyserController.name;
private GeyserController _geyserController; private GeyserController _geyserController;
public void Init(GeyserController geyserController) public void Init(GeyserController geyserController, int id)
{ {
Id = id;
WorldRegistry.WorldObjects.Add(this); WorldRegistry.WorldObjects.Add(this);
_geyserController = geyserController; _geyserController = geyserController;
@ -23,7 +22,7 @@ namespace QSB.GeyserSync
{ {
if (NetworkServer.active) if (NetworkServer.active)
{ {
GlobalMessenger<string, bool>.FireEvent(EventNames.QSBGeyserState, UniqueName, state); GlobalMessenger<int, bool>.FireEvent(EventNames.QSBGeyserState, Id, state);
} }
} }

View File

@ -83,7 +83,9 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.AnimationModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.AnimationModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.AudioModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Reference Include="UnityEngine.AudioModule">
<HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.AudioModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule"> <Reference Include="UnityEngine.CoreModule">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll</HintPath> <HintPath>$(GameDir)\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll</HintPath>

View File

@ -1,7 +1,7 @@
namespace QSB.WorldSync namespace QSB.WorldSync
{ {
public abstract class WorldObject public class WorldObject
{ {
public abstract string UniqueName { get; } public int Id { get; protected set; }
} }
} }

View File

@ -5,18 +5,18 @@ namespace QSB.WorldSync
{ {
public class WorldObjectMessage : PlayerMessage public class WorldObjectMessage : PlayerMessage
{ {
public string UniqueName { get; set; } public int Id { get; set; }
public override void Deserialize(NetworkReader reader) public override void Deserialize(NetworkReader reader)
{ {
base.Deserialize(reader); base.Deserialize(reader);
UniqueName = reader.ReadString(); Id = reader.ReadInt32();
} }
public override void Serialize(NetworkWriter writer) public override void Serialize(NetworkWriter writer)
{ {
base.Serialize(writer); base.Serialize(writer);
writer.Write(UniqueName); writer.Write(Id);
} }
} }
} }

View File

@ -7,9 +7,9 @@ namespace QSB.WorldSync
{ {
public static List<WorldObject> WorldObjects { get; } = new List<WorldObject>(); public static List<WorldObject> WorldObjects { get; } = new List<WorldObject>();
public static T GetObject<T>(string uniqueName) where T : WorldObject public static T GetObject<T>(int id) where T : WorldObject
{ {
return WorldObjects.OfType<T>().FirstOrDefault(x => x.UniqueName == uniqueName); return WorldObjects.OfType<T>().FirstOrDefault(x => x.Id == id);
} }
} }
} }