diff --git a/QSB/Player/JoinLeaveSingularity.cs b/QSB/Player/JoinLeaveSingularity.cs index def6701a..587c86f7 100644 --- a/QSB/Player/JoinLeaveSingularity.cs +++ b/QSB/Player/JoinLeaveSingularity.cs @@ -1,5 +1,7 @@ using QSB.Utility; using QSB.WorldSync; +using System; +using System.Collections; using System.Linq; using UnityEngine; @@ -9,83 +11,109 @@ namespace QSB.Player { public static void Create(PlayerInfo player, bool joining) { - var go = new GameObject(nameof(JoinLeaveSingularity)); - go.SetActive(false); - var joinLeaveSingularity = go.AddComponent(); + var joinLeaveSingularity = new GameObject(nameof(JoinLeaveSingularity)) + .AddComponent(); joinLeaveSingularity._player = player; joinLeaveSingularity._joining = joining; - go.SetActive(true); } private PlayerInfo _player; private bool _joining; - private SingularityWarpEffect _effect; - - private void Awake() + private SingularityWarpEffect CreateEffect() { - DebugLog.DebugWrite($"WARP {_player.TransformSync}"); + var fakePlayer = _player.Body.InstantiateInactive(); + fakePlayer.transform.parent = transform; + fakePlayer.transform.localPosition = Vector3.zero; + fakePlayer.transform.localRotation = Quaternion.identity; + fakePlayer.transform.localScale = Vector3.one; + foreach (var component in fakePlayer.GetComponentsInChildren(true)) + { + if (component is Behaviour behaviour) + { + behaviour.enabled = false; + } + else if (component is not (Transform or Renderer)) + { + Destroy(component); + } + } - var playerGo = _player.Body; - transform.parent = playerGo.transform.parent; - transform.localPosition = playerGo.transform.localPosition; - transform.localRotation = playerGo.transform.localRotation; - transform.localScale = playerGo.transform.localScale; + fakePlayer.SetActive(true); - var fakePlayerGo = _player.Body.transform.Find("REMOTE_Traveller_HEA_Player_v2") - .gameObject.InstantiateInactive(); - fakePlayerGo.transform.parent = transform; - fakePlayerGo.transform.localPosition = Vector3.zero; - fakePlayerGo.transform.localRotation = Quaternion.identity; - fakePlayerGo.transform.localScale = Vector3.one; - fakePlayerGo.SetActive(true); - - var effectGo = QSBWorldSync.GetUnityObjects().First()._warpEffect - .gameObject.InstantiateInactive(); + var referenceEffect = _joining ? + QSBWorldSync.GetUnityObjects().First()._warpEffect : + QSBWorldSync.GetUnityObjects().First()._warpEffect; + var effectGo = referenceEffect.gameObject.InstantiateInactive(); effectGo.transform.parent = transform; effectGo.transform.localPosition = Vector3.zero; effectGo.transform.localRotation = Quaternion.identity; effectGo.transform.localScale = Vector3.one; - _effect = effectGo.GetComponent(); - _effect.enabled = true; - _effect._singularity.enabled = true; + var effect = effectGo.GetComponent(); + effect.enabled = true; + effect._warpedObjectGeometry = fakePlayer; + effect.OnWarpComplete += OnWarpComplete; - _effect._singularity._startActive = false; - _effect._singularity._muteSingularityEffectAudio = false; - // var curve = AnimationCurve.EaseInOut(0, 0, .2f, 1); - // _effect._singularity._creationCurve = curve; - // _effect._singularity._destructionCurve = curve; + effect._singularity.enabled = true; + effect._singularity._startActive = false; + effect._singularity._muteSingularityEffectAudio = false; + effect._singularity._creationCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); + effect._singularity._destructionCurve = AnimationCurve.EaseInOut(0, 1, 1, 0); - var renderer = effectGo.GetComponent(); + // var renderer = effectGo.GetComponent(); // renderer.SetMaterialProperty(Shader.PropertyToID("_DistortFadeDist"), 3); // renderer.SetMaterialProperty(Shader.PropertyToID("_MassScale"), _joining ? -1 : 1); // renderer.SetMaterialProperty(Shader.PropertyToID("_MaxDistortRadius"), 10); // renderer.SetMaterialProperty(Shader.PropertyToID("_Radius"), 1); - renderer.SetColor(_joining ? Color.white * 2 : Color.black); + // renderer.SetColor(_joining ? Color.white : Color.black); - _effect._warpedObjectGeometry = fakePlayerGo; - _effect.OnWarpComplete += OnWarpComplete; effectGo.SetActive(true); + + return effect; } - private void Start() + private IEnumerator Start() { + DebugLog.DebugWrite($"WARP {_player.TransformSync}"); + + transform.parent = _player.Body.transform.parent; + transform.localPosition = _player.Body.transform.localPosition; + transform.localRotation = _player.Body.transform.localRotation; + transform.localScale = _player.Body.transform.localScale; + + var effect = CreateEffect(); _player.SetVisible(false); + yield return new WaitForSeconds(1); const float length = 1; if (_joining) { DebugLog.DebugWrite($"WARP IN {_player.TransformSync}"); - _effect.WarpObjectIn(length); + effect.WarpObjectIn(length); } else { DebugLog.DebugWrite($"WARP OUT {_player.TransformSync}"); - _effect.WarpObjectOut(length); + effect.WarpObjectOut(length); } } + private void Update() + { + var playerGo = _player.Body; + if (!playerGo) + { + enabled = false; + return; + } + + transform.parent = playerGo.transform.parent; + transform.localPosition = playerGo.transform.localPosition; + transform.localRotation = playerGo.transform.localRotation; + transform.localScale = playerGo.transform.localScale; + } + private void OnWarpComplete() { DebugLog.DebugWrite($"WARP DONE {_player.TransformSync}"); @@ -94,5 +122,10 @@ namespace QSB.Player _player.SetVisible(true); } + + private void OnRenderObject() + { + Popcron.Gizmos.Cube(transform.position, transform.rotation, Vector3.one * 3, Color.cyan); + } } } diff --git a/QSB/Player/Messages/PlayerJoinMessage.cs b/QSB/Player/Messages/PlayerJoinMessage.cs index b86b7c26..dc9f5159 100644 --- a/QSB/Player/Messages/PlayerJoinMessage.cs +++ b/QSB/Player/Messages/PlayerJoinMessage.cs @@ -76,9 +76,6 @@ namespace QSB.Player.Messages player.Name = PlayerName; DebugLog.ToAll($"{player.Name} joined!", MessageType.Info); DebugLog.DebugWrite($"{player.Name} joined. id:{player.PlayerId}, qsbVersion:{QSBVersion}, gameVersion:{GameVersion}, dlcInstalled:{DlcInstalled}", MessageType.Info); - - Delay.RunWhen(() => player.TransformSync.IsValid && player.TransformSync.ReferenceTransform, - () => JoinLeaveSingularity.Create(player, true)); } public override void OnReceiveLocal() diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 8ec40f5d..cac808ff 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -44,6 +44,12 @@ namespace QSB.Player.TransformSync base.OnStartClient(); QSBPlayerManager.OnAddPlayer?.Invoke(Player); DebugLog.DebugWrite($"Create Player : id<{Player.PlayerId}>", MessageType.Info); + + if (!isLocalPlayer) + { + Delay.RunWhen(() => IsValid && ReferenceTransform, + () => JoinLeaveSingularity.Create(Player, true)); + } } public override void OnStartLocalPlayer() => LocalInstance = this;