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

104 lines
2.9 KiB
C#
Raw Normal View History

using Cysharp.Threading.Tasks;
2022-02-16 23:45:54 -08:00
using QSB.Player.TransformSync;
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
{
public static class JoinLeaveSingularity
2022-02-14 18:07:36 -08:00
{
public static async UniTaskVoid Create(PlayerInfo player, bool joining)
2022-02-14 18:07:36 -08:00
{
2022-02-16 23:45:54 -08:00
if (!player.IsLocalPlayer)
{
return;
}
2022-02-14 23:08:34 -08:00
2022-02-16 23:45:54 -08:00
if (joining)
{
2022-02-16 23:45:54 -08:00
if (PlayerTransformSync.LocalInstance == null ||
player.PlayerId < QSBPlayerManager.LocalPlayerId)
{
return;
}
await UniTask.WaitUntil(() => player.TransformSync.IsValid && player.TransformSync.ReferenceTransform);
}
2022-02-15 01:29:25 -08:00
2022-02-16 23:45:54 -08:00
DebugLog.DebugWrite($"WARP {player.TransformSync}");
player.SetVisible(false);
var go = new GameObject(nameof(JoinLeaveSingularity));
go.transform.parent = player.TransformSync.ReferenceTransform;
go.transform.localPosition = player.TransformSync.transform.position;
go.transform.localRotation = player.TransformSync.transform.rotation;
2022-02-15 01:29:25 -08:00
#region fake player
player.SetVisible(true);
var fakePlayer = player.Body.transform.Find("REMOTE_Traveller_HEA_Player_v2")
.gameObject.InstantiateInactive();
fakePlayer.transform.SetParent(go.transform, false);
2022-02-15 00:28:24 -08:00
fakePlayer.SetActive(true);
player.SetVisible(false);
2022-02-14 23:35:23 -08:00
2022-02-15 01:29:25 -08:00
#endregion
#region effect
var effectGo = QSBWorldSync.GetUnityObjects<GravityCannonController>().First()._warpEffect
.gameObject.InstantiateInactive();
effectGo.transform.parent = go.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;
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);
2022-02-15 02:46:31 -08:00
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
await UniTask.WaitForEndOfFrame();
2022-02-14 22:51:09 -08:00
effect.OnWarpComplete += () =>
2022-02-15 00:28:24 -08:00
{
DebugLog.DebugWrite($"WARP DONE {player.TransformSync}");
2022-02-15 00:28:24 -08:00
Object.Destroy(go);
2022-02-14 22:51:09 -08:00
player.SetVisible(true);
};
if (joining)
{
DebugLog.DebugWrite($"WARP IN {player.TransformSync}");
effect.WarpObjectIn(0);
}
else
{
DebugLog.DebugWrite($"WARP OUT {player.TransformSync}");
effect.WarpObjectOut(0);
}
2022-02-14 22:51:09 -08:00
}
2022-02-14 18:07:36 -08:00
}
}