mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-20 15:41:01 +00:00
supports multiple elevators (if they have unique names) (#160)
This commit is contained in:
parent
904b40504b
commit
a44e563001
@ -5,7 +5,7 @@ namespace QSB.ElevatorSync
|
||||
{
|
||||
public class ElevatorController : MonoBehaviour
|
||||
{
|
||||
public static ElevatorController Instance { get; private set; }
|
||||
public string ElevatorName => _elevator.name;
|
||||
|
||||
private Elevator _elevator;
|
||||
private Vector3 _startLocalPos;
|
||||
@ -15,27 +15,15 @@ namespace QSB.ElevatorSync
|
||||
private OWAudioSource _owAudioSourceOneShot;
|
||||
private OWAudioSource _owAudioSourceLP;
|
||||
|
||||
private void Awake()
|
||||
public void Init(Elevator elevator)
|
||||
{
|
||||
Instance = this;
|
||||
|
||||
QSB.Helper.Events.Subscribe<Elevator>(OWML.Common.Events.AfterAwake);
|
||||
QSB.Helper.Events.Event += OnEvent;
|
||||
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(ElevatorPatches.StartLift));
|
||||
}
|
||||
|
||||
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
|
||||
{
|
||||
if (behaviour is Elevator elevator && ev == OWML.Common.Events.AfterAwake)
|
||||
{
|
||||
_elevator = elevator;
|
||||
_startLocalPos = _elevator.GetValue<Vector3>("_startLocalPos");
|
||||
_endLocalPos = _elevator.GetValue<Vector3>("_endLocalPos");
|
||||
_interactVolume = _elevator.GetValue<SingleInteractionVolume>("_interactVolume");
|
||||
_owAudioSourceOneShot = _elevator.GetValue<OWAudioSource>("_owAudioSourceOneShot");
|
||||
_owAudioSourceLP = _elevator.GetValue<OWAudioSource>("_owAudioSourceLP");
|
||||
}
|
||||
PlayerRegistry.ElevatorControllers.Add(this);
|
||||
_elevator = elevator;
|
||||
_startLocalPos = _elevator.GetValue<Vector3>("_startLocalPos");
|
||||
_endLocalPos = _elevator.GetValue<Vector3>("_endLocalPos");
|
||||
_interactVolume = _elevator.GetValue<SingleInteractionVolume>("_interactVolume");
|
||||
_owAudioSourceOneShot = _elevator.GetValue<OWAudioSource>("_owAudioSourceOneShot");
|
||||
_owAudioSourceLP = _elevator.GetValue<OWAudioSource>("_owAudioSourceLP");
|
||||
}
|
||||
|
||||
public void RemoteCall(ElevatorDirection direction)
|
||||
|
@ -9,13 +9,14 @@ namespace QSB.ElevatorSync
|
||||
|
||||
public override void SetupListener()
|
||||
{
|
||||
GlobalMessenger<ElevatorDirection>.AddListener(EventNames.QSBStartLift, direction => SendEvent(CreateMessage(direction)));
|
||||
GlobalMessenger<ElevatorDirection, string>.AddListener(EventNames.QSBStartLift, (direction, elevatorName) => SendEvent(CreateMessage(direction, elevatorName)));
|
||||
}
|
||||
|
||||
private ElevatorMessage CreateMessage(ElevatorDirection direction) => new ElevatorMessage
|
||||
private ElevatorMessage CreateMessage(ElevatorDirection direction, string elevatorName) => new ElevatorMessage
|
||||
{
|
||||
SenderId = PlayerRegistry.LocalPlayer.NetId,
|
||||
Direction = direction
|
||||
Direction = direction,
|
||||
ElevatorName = elevatorName
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ElevatorMessage message)
|
||||
@ -24,7 +25,7 @@ namespace QSB.ElevatorSync
|
||||
{
|
||||
return;
|
||||
}
|
||||
ElevatorController.Instance.RemoteCall(message.Direction);
|
||||
PlayerRegistry.GetElevatorController(message.ElevatorName).RemoteCall(message.Direction);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
24
QSB/ElevatorSync/ElevatorManager.cs
Normal file
24
QSB/ElevatorSync/ElevatorManager.cs
Normal file
@ -0,0 +1,24 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.ElevatorSync
|
||||
{
|
||||
public class ElevatorManager : MonoBehaviour
|
||||
{
|
||||
private void Awake()
|
||||
{
|
||||
QSB.Helper.Events.Subscribe<Elevator>(OWML.Common.Events.AfterAwake);
|
||||
QSB.Helper.Events.Event += OnEvent;
|
||||
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(ElevatorPatches.StartLift));
|
||||
}
|
||||
|
||||
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
|
||||
{
|
||||
if (behaviour is Elevator elevator && ev == OWML.Common.Events.AfterAwake)
|
||||
{
|
||||
var elevatorController = gameObject.AddComponent<ElevatorController>();
|
||||
elevatorController.Init(elevator);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -6,17 +6,20 @@ namespace QSB.ElevatorSync
|
||||
public class ElevatorMessage : PlayerMessage
|
||||
{
|
||||
public ElevatorDirection Direction { get; set; }
|
||||
public string ElevatorName { get; set; }
|
||||
|
||||
public override void Deserialize(NetworkReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
Direction = (ElevatorDirection)reader.ReadInt32();
|
||||
ElevatorName = reader.ReadString();
|
||||
}
|
||||
|
||||
public override void Serialize(NetworkWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write((int)Direction);
|
||||
writer.Write(ElevatorName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ namespace QSB.ElevatorSync
|
||||
{
|
||||
var isGoingUp = __instance.GetValue<bool>("_goingToTheEnd");
|
||||
var direction = isGoingUp ? ElevatorDirection.Up : ElevatorDirection.Down;
|
||||
GlobalMessenger<ElevatorDirection>.FireEvent(EventNames.QSBStartLift, direction);
|
||||
GlobalMessenger<ElevatorDirection, string>.FireEvent(EventNames.QSBStartLift, direction, __instance.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Linq;
|
||||
using QSB.TransformSync;
|
||||
using QSB.Animation;
|
||||
using QSB.ElevatorSync;
|
||||
using QSB.Messaging;
|
||||
|
||||
namespace QSB
|
||||
@ -15,6 +16,8 @@ namespace QSB
|
||||
public static List<TransformSync.TransformSync> LocalTransformSyncs => TransformSyncs.Where(t => t != null && t.hasAuthority).ToList();
|
||||
public static List<AnimationSync> AnimationSyncs { get; } = new List<AnimationSync>();
|
||||
|
||||
public static List<ElevatorController> ElevatorControllers { get; } = new List<ElevatorController>();
|
||||
|
||||
public static PlayerInfo CreatePlayer(uint id)
|
||||
{
|
||||
if (PlayerExists(id))
|
||||
@ -64,5 +67,10 @@ namespace QSB
|
||||
return AnimationSyncs.FirstOrDefault(x => x != null && x.netId.Value == id);
|
||||
}
|
||||
|
||||
public static ElevatorController GetElevatorController(string name)
|
||||
{
|
||||
return ElevatorControllers.FirstOrDefault(x => x != null && x.ElevatorName == name);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ namespace QSB
|
||||
gameObject.AddComponent<NetworkManagerHUD>();
|
||||
gameObject.AddComponent<DebugActions>();
|
||||
gameObject.AddComponent<UnityHelper>();
|
||||
gameObject.AddComponent<ElevatorController>();
|
||||
gameObject.AddComponent<ElevatorManager>();
|
||||
|
||||
GlobalMessenger.AddListener(EventNames.RestartTimeLoop, OnLoopStart);
|
||||
GlobalMessenger.AddListener(EventNames.WakeUp, OnWakeUp);
|
||||
|
@ -120,6 +120,7 @@
|
||||
<Compile Include="ElevatorSync\ElevatorDirection.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorController.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorEvent.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorManager.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorMessage.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorPatches.cs" />
|
||||
<Compile Include="Events\EventNames.cs" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user