diff --git a/QSB/Animation/AnimationSync.cs b/QSB/Animation/AnimationSync.cs index aa94f7c2..10d9de63 100644 --- a/QSB/Animation/AnimationSync.cs +++ b/QSB/Animation/AnimationSync.cs @@ -30,6 +30,7 @@ namespace QSB.Animation public AnimatorMirror Mirror { get; private set; } public AnimationType CurrentType { get; set; } + public Animator VisibleAnimator => _bodyAnim; protected void Awake() { diff --git a/QSB/Animation/AnimatorMirror.cs b/QSB/Animation/AnimatorMirror.cs index bad6cfad..f94706bc 100644 --- a/QSB/Animation/AnimatorMirror.cs +++ b/QSB/Animation/AnimatorMirror.cs @@ -17,6 +17,18 @@ namespace QSB.Animation public void Init(Animator from, Animator to) { + if (from == null) + { + DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"from\".", MessageType.Error); + } + if (to == null) + { + DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"to\".", MessageType.Error); + } + if (to == null || from == null) + { + return; + } _from = from; _to = to; if (_from.runtimeAnimatorController == null) diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index 92517564..a9bd1f13 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -55,5 +55,7 @@ public static string QSBMoveToCarry = "QSBMoveToCarry"; public static string QSBStartStatue = "QSBStartStatue"; public static string QSBPlayerKick = "QSBPlayerKick"; + public static string QSBEnterPlatform = "QSBEnterPlatform"; + public static string QSBExitPlatform = "QSBExitPlatform"; } } \ No newline at end of file diff --git a/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs b/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs index cb03baab..64ab7725 100644 --- a/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs +++ b/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs @@ -1,5 +1,7 @@ using OWML.Common; using OWML.Utils; +using QSB.Animation; +using QSB.Events; using QSB.Player; using QSB.Utility; using System.Collections.Generic; @@ -10,7 +12,7 @@ namespace QSB.ItemSync { internal class CustomNomaiRemoteCameraPlatform : NomaiShared { - private static List s_platforms; + public static List CustomPlatformList; private static MaterialPropertyBlock s_matPropBlock; private static int s_propID_Fade; private static int s_propID_HeightMaskScale; @@ -137,6 +139,7 @@ namespace QSB.ItemSync private bool _anyoneStillOnPlatform; private bool _wasLocalInBounds; private CameraState _cameraState; + private Dictionary _playerToHologram = new Dictionary(); private void Awake() { @@ -177,11 +180,11 @@ namespace QSB.ItemSync private void Start() { - if (s_platforms == null) + if (CustomPlatformList == null) { - s_platforms = new List(32); + CustomPlatformList = new List(32); } - s_platforms.Add(this); + CustomPlatformList.Add(this); _playerCamera = Locator.GetPlayerCamera(); if (_socket != null) { @@ -202,9 +205,9 @@ namespace QSB.ItemSync var socket2 = _socket; socket2.OnSocketableDonePlacing -= OnSocketableDonePlacing; } - if (s_platforms != null) + if (CustomPlatformList != null) { - s_platforms.Remove(this); + CustomPlatformList.Remove(this); } } @@ -228,6 +231,11 @@ namespace QSB.ItemSync { OnLeaveBounds(); } + + if (_anyoneStillOnPlatform) + { + UpdateHologramTransforms(); + } } if (_platformActive) { @@ -261,7 +269,6 @@ namespace QSB.ItemSync _slavePlatform.UpdateRendererFade(); SwitchToRemoteCamera(); _hologramGroup.SetActive(true); - UpdateHologramTransforms(); _ambientAudioSource.FadeIn(3f, true, false, 1f); Locator.GetAudioMixer().MixRemoteCameraPlatform(_fadeInLength); _cameraState = CameraState.Connecting_FadeOut; @@ -270,7 +277,6 @@ namespace QSB.ItemSync case CameraState.Connecting_FadeOut: _slavePlatform._transitionFade = Mathf.MoveTowards(_slavePlatform._transitionFade, 0f, Time.deltaTime / _fadeInLength); _slavePlatform.UpdateRendererFade(); - UpdateHologramTransforms(); _slavePlatform._poolT = _poolT; _slavePlatform.UpdatePoolRenderer(); if (_slavePlatform._transitionFade == 0f) @@ -280,7 +286,6 @@ namespace QSB.ItemSync break; case CameraState.Connected: VerifySectorOccupancy(); - UpdateHologramTransforms(); _slavePlatform._poolT = _poolT; _slavePlatform.UpdatePoolRenderer(); break; @@ -404,6 +409,18 @@ namespace QSB.ItemSync var playerTransform = Locator.GetPlayerTransform(); _playerHologram.position = TransformPoint(playerTransform.position, this, _slavePlatform); _playerHologram.rotation = TransformRotation(playerTransform.rotation, this, _slavePlatform); + + foreach (var item in _playerToHologram) + { + if (!item.Value.activeInHierarchy) + { + continue; + } + var hologram = item.Value.transform.GetChild(0); + hologram.position = TransformPoint(item.Key.Body.transform.position, this, _slavePlatform); + hologram.rotation = TransformRotation(item.Key.Body.transform.rotation, this, _slavePlatform); + } + if (_sharedStone != null) { var transform = _sharedStone.transform; @@ -482,6 +499,7 @@ namespace QSB.ItemSync private void SwitchToRemoteCamera() { + QSBEventManager.FireEvent(EventNames.QSBEnterPlatform, CustomPlatformList.IndexOf(this)); GlobalMessenger.FireEvent("EnterNomaiRemoteCamera"); _slavePlatform.RevealFactID(); _slavePlatform._ownedCamera.Activate(this, _playerCamera); @@ -541,6 +559,7 @@ namespace QSB.ItemSync { _slavePlatform._darkZone.RemovePlayerFromZone(true); } + QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this)); GlobalMessenger.FireEvent("ExitNomaiRemoteCamera"); _slavePlatform._ownedCamera.Deactivate(); _slavePlatform._ownedCamera.SetImageEffectFade(0f); @@ -658,13 +677,13 @@ namespace QSB.ItemSync public static CustomNomaiRemoteCameraPlatform GetPlatform(NomaiRemoteCameraPlatform.ID platformID) { - if (s_platforms != null) + if (CustomPlatformList != null) { - for (var i = 0; i < s_platforms.Count; i++) + for (var i = 0; i < CustomPlatformList.Count; i++) { - if (s_platforms[i]._id == platformID) + if (CustomPlatformList[i]._id == platformID) { - return s_platforms[i]; + return CustomPlatformList[i]; } } } @@ -675,6 +694,41 @@ namespace QSB.ItemSync public bool IsPlatformActive() => _platformActive; + public void OnRemotePlayerEnter(uint playerId) + { + if (playerId == QSBPlayerManager.LocalPlayerId) + { + return; + } + var player = QSBPlayerManager.GetPlayer(playerId); + if (_playerToHologram.ContainsKey(player)) + { + _playerToHologram[player].SetActive(true); + return; + } + var hologramCopy = Instantiate(_playerHologram); + hologramCopy.parent = _playerHologram.parent; + Destroy(hologramCopy.GetChild(0).GetComponent()); + var mirror = hologramCopy.gameObject.AddComponent(); + if (player.AnimationSync.VisibleAnimator == null) + { + DebugLog.ToConsole($"Warning - {playerId}'s VisibleAnimator is null!", MessageType.Error); + } + mirror.Init(player.AnimationSync.VisibleAnimator, hologramCopy.GetChild(0).gameObject.GetComponent()); + _playerToHologram.Add(player, hologramCopy.gameObject); + _hologramGroup.SetActive(true); + hologramCopy.gameObject.SetActive(true); + } + + public void OnRemotePlayerExit(uint playerId) + { + if (playerId == QSBPlayerManager.LocalPlayerId) + { + return; + } + _playerToHologram[QSBPlayerManager.GetPlayer(playerId)].SetActive(false); + } + public enum CameraState { WaitingForPedestalContact, diff --git a/QSB/QuantumSync/EnterLeaveType.cs b/QSB/Player/EnterLeaveType.cs similarity index 52% rename from QSB/QuantumSync/EnterLeaveType.cs rename to QSB/Player/EnterLeaveType.cs index 30499205..8da3b34a 100644 --- a/QSB/QuantumSync/EnterLeaveType.cs +++ b/QSB/Player/EnterLeaveType.cs @@ -1,10 +1,12 @@ -namespace QSB.QuantumSync +namespace QSB.Player { public enum EnterLeaveType { EnterMoon = 0, ExitMoon = 1, EnterShrine = 2, - ExitShrine = 3 + ExitShrine = 3, + EnterPlatform = 4, + ExitPlatform = 5 } } diff --git a/QSB/QuantumSync/Events/EnterLeaveEvent.cs b/QSB/Player/Events/EnterLeaveEvent.cs similarity index 58% rename from QSB/QuantumSync/Events/EnterLeaveEvent.cs rename to QSB/Player/Events/EnterLeaveEvent.cs index 74b163c4..b3a5e26e 100644 --- a/QSB/QuantumSync/Events/EnterLeaveEvent.cs +++ b/QSB/Player/Events/EnterLeaveEvent.cs @@ -1,11 +1,12 @@ using QSB.Events; +using QSB.ItemSync; using QSB.Messaging; using QSB.Player; using QSB.Utility; -namespace QSB.QuantumSync.Events +namespace QSB.Player.Events { - internal class EnterLeaveEvent : QSBEvent> + internal class EnterLeaveEvent : QSBEvent { public override EventType Type => EventType.EnterLeave; @@ -15,6 +16,8 @@ namespace QSB.QuantumSync.Events GlobalMessenger.AddListener(EventNames.ExitQuantumMoon, () => Handler(EnterLeaveType.ExitMoon)); GlobalMessenger.AddListener(EventNames.QSBEnterShrine, () => Handler(EnterLeaveType.EnterShrine)); GlobalMessenger.AddListener(EventNames.QSBExitShrine, () => Handler(EnterLeaveType.ExitShrine)); + GlobalMessenger.AddListener(EventNames.QSBEnterPlatform, (int id) => Handler(EnterLeaveType.EnterPlatform, id)); + GlobalMessenger.AddListener(EventNames.QSBExitPlatform, (int id) => Handler(EnterLeaveType.ExitPlatform, id)); } public override void CloseListener() @@ -25,21 +28,22 @@ namespace QSB.QuantumSync.Events GlobalMessenger.RemoveListener(EventNames.QSBExitShrine, () => Handler(EnterLeaveType.ExitShrine)); } - private void Handler(EnterLeaveType type) => SendEvent(CreateMessage(type)); + private void Handler(EnterLeaveType type, int objectId = -1) => SendEvent(CreateMessage(type, objectId)); - private EnumMessage CreateMessage(EnterLeaveType type) => new EnumMessage + private EnterLeaveMessage CreateMessage(EnterLeaveType type, int objectId) => new EnterLeaveMessage { AboutId = LocalPlayerId, - Value = type + Type = type, + ObjectId = objectId }; - public override void OnReceiveLocal(bool server, EnumMessage message) + public override void OnReceiveLocal(bool server, EnterLeaveMessage message) => OnReceiveRemote(server, message); - public override void OnReceiveRemote(bool server, EnumMessage message) + public override void OnReceiveRemote(bool server, EnterLeaveMessage message) { var player = QSBPlayerManager.GetPlayer(message.FromId); - switch (message.Value) + switch (message.Type) { case EnterLeaveType.EnterMoon: player.IsInMoon = true; @@ -53,8 +57,16 @@ namespace QSB.QuantumSync.Events case EnterLeaveType.ExitShrine: player.IsInShrine = false; break; + case EnterLeaveType.EnterPlatform: + CustomNomaiRemoteCameraPlatform.CustomPlatformList[message.ObjectId] + .OnRemotePlayerEnter(message.AboutId); + break; + case EnterLeaveType.ExitPlatform: + CustomNomaiRemoteCameraPlatform.CustomPlatformList[message.ObjectId] + .OnRemotePlayerExit(message.AboutId); + break; default: - DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {message.Value}", OWML.Common.MessageType.Warning); + DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {message.Type}", OWML.Common.MessageType.Warning); break; } } diff --git a/QSB/Player/Events/EnterLeaveMessage.cs b/QSB/Player/Events/EnterLeaveMessage.cs new file mode 100644 index 00000000..efefcbf8 --- /dev/null +++ b/QSB/Player/Events/EnterLeaveMessage.cs @@ -0,0 +1,22 @@ +using QSB.WorldSync.Events; +using QuantumUNET.Transport; + +namespace QSB.Player.Events +{ + class EnterLeaveMessage : WorldObjectMessage + { + public EnterLeaveType Type { get; set; } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + Type = (EnterLeaveType)reader.ReadInt32(); + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write((int)Type); + } + } +} diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 8ca47046..f6fa82cc 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -168,6 +168,7 @@ + @@ -180,8 +181,8 @@ - - + +