quantum-space-buddies/QSB/Player/JoinLeaveSingularity.cs

130 lines
3.6 KiB
C#
Raw Normal View History

2022-02-14 18:07:36 -08:00
using QSB.Utility;
2022-02-14 23:35:23 -08:00
using QSB.WorldSync;
using System.Linq;
2022-02-14 18:07:36 -08:00
using UnityEngine;
namespace QSB.Player
{
2022-02-14 22:51:09 -08:00
public class JoinLeaveSingularity : MonoBehaviour
2022-02-14 18:07:36 -08:00
{
public static void Create(PlayerInfo player, bool joining)
{
2022-02-15 21:07:46 -08:00
return;
2022-02-15 01:29:25 -08:00
var go = new GameObject(nameof(JoinLeaveSingularity));
go.SetActive(false);
var joinLeaveSingularity = go.AddComponent<JoinLeaveSingularity>();
2022-02-14 22:51:09 -08:00
joinLeaveSingularity._player = player;
joinLeaveSingularity._joining = joining;
2022-02-15 01:29:25 -08:00
go.SetActive(true);
2022-02-14 22:51:09 -08:00
}
2022-02-14 18:07:36 -08:00
2022-02-14 23:08:34 -08:00
private PlayerInfo _player;
private bool _joining;
2022-02-15 01:29:25 -08:00
private void Awake()
2022-02-14 22:51:09 -08:00
{
2022-02-15 01:29:25 -08:00
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;
#region fake player
2022-02-15 00:28:24 -08:00
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<Component>(true))
{
if (component is Behaviour behaviour)
{
behaviour.enabled = false;
}
else if (component is not (Transform or Renderer))
{
Destroy(component);
}
}
2022-02-14 23:35:23 -08:00
2022-02-15 00:28:24 -08:00
fakePlayer.SetActive(true);
2022-02-14 23:35:23 -08:00
2022-02-15 01:29:25 -08:00
#endregion
_player.SetVisible(false);
#region effect
2022-02-15 02:56:38 -08:00
var referenceEffect = QSBWorldSync.GetUnityObjects<GravityCannonController>().First()._warpEffect;
2022-02-15 00:28:24 -08:00
var effectGo = referenceEffect.gameObject.InstantiateInactive();
2022-02-14 22:51:09 -08:00
effectGo.transform.parent = transform;
2022-02-14 18:07:36 -08:00
effectGo.transform.localPosition = Vector3.zero;
effectGo.transform.localRotation = Quaternion.identity;
effectGo.transform.localScale = Vector3.one;
2022-02-15 00:28:24 -08:00
var effect = effectGo.GetComponent<SingularityWarpEffect>();
effect.enabled = true;
effect._warpedObjectGeometry = fakePlayer;
effect.OnWarpComplete += OnWarpComplete;
2022-02-14 23:35:23 -08:00
2022-02-15 00:28:24 -08:00
effect._singularity.enabled = true;
effect._singularity._startActive = false;
effect._singularity._muteSingularityEffectAudio = false;
2022-02-15 02:56:38 -08:00
effect._singularity._creationCurve = AnimationCurve.EaseInOut(0, 0, 1, 1);
effect._singularity._destructionCurve = AnimationCurve.EaseInOut(0, 1, 1, 0);
2022-02-14 22:51:09 -08:00
2022-02-15 02:46:31 -08:00
var renderer = effectGo.GetComponent<Renderer>();
renderer.material.SetFloat("_DistortFadeDist", 3);
renderer.material.SetFloat("_MassScale", _joining ? -1 : 1);
renderer.material.SetFloat("_MaxDistortRadius", 10);
renderer.transform.localScale = Vector3.one * 10;
renderer.material.SetFloat("_Radius", 1);
renderer.material.SetColor("_Color", _joining ? Color.white : Color.black);
2022-02-14 22:51:09 -08:00
2022-02-14 18:07:36 -08:00
effectGo.SetActive(true);
2022-02-15 00:28:24 -08:00
2022-02-15 01:29:25 -08:00
#endregion
2022-02-15 00:28:24 -08:00
2022-02-15 01:29:25 -08:00
Delay.RunNextFrame(() =>
2022-02-14 18:07:36 -08:00
{
2022-02-15 01:29:25 -08:00
if (_joining)
{
DebugLog.DebugWrite($"WARP IN {_player.TransformSync}");
2022-02-15 02:56:38 -08:00
effect.WarpObjectIn(0);
2022-02-15 01:29:25 -08:00
}
else
{
DebugLog.DebugWrite($"WARP OUT {_player.TransformSync}");
2022-02-15 02:56:38 -08:00
effect.WarpObjectOut(0);
2022-02-15 01:29:25 -08:00
}
});
2022-02-14 18:07:36 -08:00
}
2022-02-14 22:51:09 -08:00
2022-02-15 00:28:24 -08:00
private void Update()
{
2022-02-15 01:29:25 -08:00
if (!_player.Body)
2022-02-15 00:28:24 -08:00
{
enabled = false;
return;
}
2022-02-15 01:29:25 -08:00
transform.parent = _player.Body.transform.parent;
transform.localPosition = _player.Body.transform.localPosition;
transform.localRotation = _player.Body.transform.localRotation;
transform.localScale = _player.Body.transform.localScale;
2022-02-15 00:28:24 -08:00
}
2022-02-14 22:51:09 -08:00
private void OnWarpComplete()
{
DebugLog.DebugWrite($"WARP DONE {_player.TransformSync}");
Destroy(gameObject);
_player.SetVisible(true);
}
2022-02-14 18:07:36 -08:00
}
}