using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon.Common; public enum LightningRoundEffect { Thunder, LightningStrike, ThunderAndRain, MAX_EFFECTS } [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class LightningRoundEffectsController : UdonSharpBehaviour { [SerializeField] private AudioManager _AudioManager; [SerializeField] private Animator _Animator; [Space] [SerializeField] private GameObject _LightningBolt; [SerializeField] private ParticleSystem _LightningStrikeExplosion; [SerializeField] private LightningStrikeStation _LightningStrikeStation; [SerializeField] private ParticleSystem _PersonalRaincloud; [Space] [SerializeField] private GameObject _UmbrellaActivator; [SerializeField] private Umbrella _UmbrellaManager; [UdonSynced] private LightningRoundEffect _Effect = LightningRoundEffect.MAX_EFFECTS; private LightningRoundEffect _Effect_Cached = LightningRoundEffect.MAX_EFFECTS; public override void OnOwnershipTransferred(VRCPlayerApi Player) { Networking.SetOwner(Player, _LightningBolt.gameObject); Networking.SetOwner(Player, _LightningStrikeStation.gameObject); Networking.SetOwner(Player, _PersonalRaincloud.gameObject); Networking.SetOwner(Player, _UmbrellaActivator); Networking.SetOwner(Player, _UmbrellaManager.gameObject); base.OnOwnershipTransferred(Player); } public override void OnDeserialization(DeserializationResult Result) { _PlayLightningRoundAnimation_Synced(); base.OnDeserialization(Result); } public void Initialise() { _Effect = LightningRoundEffect.MAX_EFFECTS; _PlayLightningRoundAnimation_Synced(); RequestSerialization(); } public void PlayLightningRoundAnimation() { _Effect = LightningRoundEffect.LightningStrike;//(LightningRoundEffect)Random.Range(0, (int)LightningRoundEffect.MAX_EFFECTS); _PlayLightningRoundAnimation_Synced(); RequestSerialization(); } private void _PlayLightningRoundAnimation_Synced() { if (_Effect != _Effect_Cached) { _Effect_Cached = _Effect; switch (_Effect) { case LightningRoundEffect.Thunder: break; case LightningRoundEffect.LightningStrike: _ActivateLightningStrike(); break; case LightningRoundEffect.ThunderAndRain: _ActivateRainAndUmbrella(); break; default: // Deactivate everything and leave _Animator.SetBool("Lightning", false); _LightningBolt.SetActive(false); _DeactivateRainAndUmbrella(); _DeactivateLightningStrike(); return; } _AudioManager.PlayMusic(MusicEventType.LightningRound); _Animator.SetBool("Lightning", true); SendCustomEventDelayedSeconds(nameof(ResetLightningRoundAnimation), 10.0f); } } public void ResetLightningRoundAnimation() { _LightningBolt.SetActive(false); _Animator.SetBool("Lightning", false); } private void _ActivateLightningStrike() { _LightningBolt.SetActive(true); _LightningStrikeStation.gameObject.SetActive(true); VRCPlayerApi ActiveHost = Networking.GetOwner(gameObject); Vector3 Position = ActiveHost.GetPosition(); Quaternion Rotation = ActiveHost.GetRotation(); _LightningStrikeStation.transform.SetPositionAndRotation(Position, Rotation); _LightningBolt.transform.SetPositionAndRotation(Position, Rotation); _LightningStrikeExplosion.Play(); if (Networking.IsOwner(gameObject)) { _LightningStrikeStation.EnterStation(); } } private void _DeactivateLightningStrike() { _LightningBolt.SetActive(false); _LightningStrikeStation.gameObject.SetActive(false); _LightningStrikeExplosion.Stop(); } private void _ActivateRainAndUmbrella() { _UmbrellaActivator.SetActive(true); _UmbrellaManager.Respawn(); _PersonalRaincloud.Play(); } private void _DeactivateRainAndUmbrella() { _UmbrellaActivator.SetActive(false); _PersonalRaincloud.Stop(); } }