diff --git a/QSB/Animation/PlayerHeadRotationSync.cs b/QSB/Animation/PlayerHeadRotationSync.cs index 55a7061d..886a8077 100644 --- a/QSB/Animation/PlayerHeadRotationSync.cs +++ b/QSB/Animation/PlayerHeadRotationSync.cs @@ -6,15 +6,21 @@ namespace QSB.Animation { private Animator _attachedAnimator; private Transform _lookBase; + private bool _isSetUp; public void Init(Transform lookBase) { _attachedAnimator = GetComponent(); _lookBase = lookBase; + _isSetUp = true; } private void LateUpdate() { + if (!_isSetUp) + { + return; + } var bone = _attachedAnimator.GetBoneTransform(HumanBodyBones.Head); // Get the camera's local rotation with respect to the player body var lookLocalRotation = Quaternion.Inverse(_attachedAnimator.transform.rotation) * _lookBase.rotation; diff --git a/QSB/OrbSync/Events/OrbSlotEvent.cs b/QSB/OrbSync/Events/OrbSlotEvent.cs index 6baba2fb..0713a14a 100644 --- a/QSB/OrbSync/Events/OrbSlotEvent.cs +++ b/QSB/OrbSync/Events/OrbSlotEvent.cs @@ -5,28 +5,28 @@ using QSB.WorldSync.Events; namespace QSB.OrbSync.Events { - public class OrbSlotEvent : QSBEvent + public class OrbSlotEvent : QSBEvent { public override EventType Type => EventType.OrbSlot; - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBOrbSlot, Handler); + public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBOrbSlot, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBOrbSlot, Handler); + public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBOrbSlot, Handler); - private void Handler(int id, bool state) => SendEvent(CreateMessage(id, state)); + private void Handler(int slotId, int orbId, bool slotState) => SendEvent(CreateMessage(slotId, orbId, slotState)); - private BoolWorldObjectMessage CreateMessage(int id, bool state) => new BoolWorldObjectMessage + private OrbSlotMessage CreateMessage(int slotId, int orbId, bool slotState) => new OrbSlotMessage { AboutId = LocalPlayerId, - ObjectId = id, - State = state + SlotId = slotId, + OrbId = orbId, + SlotState = slotState }; - public override void OnReceiveRemote(BoolWorldObjectMessage message) + public override void OnReceiveRemote(OrbSlotMessage message) { - DebugLog.DebugWrite($"receive slot {message.ObjectId} to {message.State}"); - var orbSlot = WorldRegistry.GetObject(message.ObjectId); - orbSlot?.SetState(message.State); + var orbSlot = WorldRegistry.GetObject(message.SlotId); + orbSlot?.SetState(message.SlotState, message.OrbId); } } } \ No newline at end of file diff --git a/QSB/OrbSync/Events/OrbSlotMessage.cs b/QSB/OrbSync/Events/OrbSlotMessage.cs new file mode 100644 index 00000000..a61c2731 --- /dev/null +++ b/QSB/OrbSync/Events/OrbSlotMessage.cs @@ -0,0 +1,32 @@ +using QSB.Messaging; +using QuantumUNET; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.OrbSync.Events +{ + public class OrbSlotMessage : PlayerMessage + { + public int SlotId { get; set; } + public int OrbId { get; set; } + public bool SlotState { get; set; } + + public override void Deserialize(QSBNetworkReader reader) + { + base.Deserialize(reader); + SlotId = reader.ReadInt32(); + OrbId = reader.ReadInt32(); + SlotState = reader.ReadBoolean(); + } + + public override void Serialize(QSBNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(SlotId); + writer.Write(OrbId); + writer.Write(SlotState); + } + } +} diff --git a/QSB/OrbSync/Events/OrbUserEvent.cs b/QSB/OrbSync/Events/OrbUserEvent.cs index db2ca212..d9b9cf48 100644 --- a/QSB/OrbSync/Events/OrbUserEvent.cs +++ b/QSB/OrbSync/Events/OrbUserEvent.cs @@ -27,10 +27,6 @@ namespace QSB.OrbSync.Events public override void OnServerReceive(WorldObjectMessage message) { var fromPlayer = QSBNetworkServer.connections.First(x => x.GetPlayer().PlayerId == message.FromId); - foreach (var item in QSBNetworkServer.connections) - { - DebugLog.DebugWrite(item.GetPlayer().PlayerId.ToString()); - } if (WorldRegistry.OrbSyncList.Count == 0) { DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error); @@ -55,10 +51,8 @@ namespace QSB.OrbSync.Events } if (orbIdentity.ClientAuthorityOwner != null && orbIdentity.ClientAuthorityOwner != fromPlayer) { - DebugLog.DebugWrite($"Removed authority of orb {message.ObjectId} from {orbIdentity.ClientAuthorityOwner.GetPlayer().PlayerId}"); orbIdentity.RemoveClientAuthority(orbIdentity.ClientAuthorityOwner); } - DebugLog.DebugWrite($"Assigned authority of orb {message.ObjectId} to player {message.FromId}."); orbIdentity.AssignClientAuthority(fromPlayer); orb.enabled = true; } diff --git a/QSB/OrbSync/QSBOrbSlot.cs b/QSB/OrbSync/QSBOrbSlot.cs index f7b0987c..19eb5650 100644 --- a/QSB/OrbSync/QSBOrbSlot.cs +++ b/QSB/OrbSync/QSBOrbSlot.cs @@ -1,4 +1,5 @@ -using QSB.EventsCore; +using OWML.ModHelper.Events; +using QSB.EventsCore; using QSB.WorldSync; namespace QSB.OrbSync @@ -18,20 +19,22 @@ namespace QSB.OrbSync WorldRegistry.AddObject(this); } - public void HandleEvent(bool state) + public void HandleEvent(bool state, int orbId) { if (QSB.HasWokenUp) { - GlobalMessenger.FireEvent(EventNames.QSBOrbSlot, ObjectId, state); + GlobalMessenger.FireEvent(EventNames.QSBOrbSlot, ObjectId, orbId, state); } } - public void SetState(bool state) + public void SetState(bool state, int orbId) { if (!_initialized) { return; } + var occOrb = state ? WorldRegistry.OldOrbList[orbId] : null; + InterfaceSlot.SetValue("_occupyingOrb", occOrb); var ev = state ? "OnSlotActivated" : "OnSlotDeactivated"; WorldRegistry.RaiseEvent(InterfaceSlot, ev); Activated = state; diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index fb321ef5..09ccb927 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -150,6 +150,7 @@ + diff --git a/QSB/Utility/DebugActions.cs b/QSB/Utility/DebugActions.cs index 96f85616..360058c8 100644 --- a/QSB/Utility/DebugActions.cs +++ b/QSB/Utility/DebugActions.cs @@ -18,8 +18,6 @@ namespace QSB.Utility var warpCore = GameObject.Find("Prefab_NOM_WarpCoreVessel").GetComponent(); var socket = GameObject.Find("Interactibles_VesselBridge").GetComponentInChildren(); socket.PlaceIntoSocket(warpCore); - - GetComponent().SetPillarRaised(true, true); } private void Update() diff --git a/QSB/WorldSync/WorldRegistry.cs b/QSB/WorldSync/WorldRegistry.cs index f984b0ab..ce97f9f4 100644 --- a/QSB/WorldSync/WorldRegistry.cs +++ b/QSB/WorldSync/WorldRegistry.cs @@ -55,7 +55,7 @@ namespace QSB.WorldSync orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb); if (orbSync.HasAuthority) { - qsbSlot.HandleEvent(state); + qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb)); } } catch