r2mods/ilspy_dump/ror2_csproj/RoR2/MeridianEventTriggerInterac...

1274 lines
38 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using AK.Wwise;
using EntityStates;
using EntityStates.FalseSonBoss;
using RoR2.CharacterSpeech;
using RoR2.Networking;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace RoR2;
[RequireComponent(typeof(EntityStateMachine))]
public class MeridianEventTriggerInteraction : NetworkBehaviour, IDisplayNameProvider
{
public enum RingFallingState
{
None,
OuterRingFalling,
MiddleRingFalling
}
public class MeridianEventBaseState : EntityState
{
protected MeridianEventTriggerInteraction meridianEventTriggerInteraction => instance;
}
public class MeridianEventStart : MeridianEventBaseState
{
public static event Action OnMeridianEventStart;
public override void OnEnter()
{
base.OnEnter();
MeridianEventStart.OnMeridianEventStart?.Invoke();
base.meridianEventTriggerInteraction.EventPPVolume.SetActive(value: true);
base.meridianEventTriggerInteraction.HandleNodeGateActivation(0);
if (NetworkServer.active)
{
base.meridianEventTriggerInteraction.CallRpcSetEventMaterials();
}
base.meridianEventTriggerInteraction.SetEventObjects();
base.meridianEventTriggerInteraction.isHeadRotating = true;
outer.SetNextState(new Phase1());
}
}
public class FSBFEncounterBaseState : EntityState
{
protected ChildLocator childLocator;
protected MeridianEventTriggerInteraction meridianEventTriggerInteraction => instance;
public override void OnEnter()
{
base.OnEnter();
childLocator = GetComponent<ChildLocator>();
}
public override void OnExit()
{
base.OnExit();
}
public void KillAllMonsters()
{
if (!NetworkServer.active)
{
return;
}
foreach (TeamComponent item in new List<TeamComponent>(TeamComponent.GetTeamMembers(TeamIndex.Monster)))
{
if ((bool)item)
{
HealthComponent component = item.GetComponent<HealthComponent>();
if ((bool)component)
{
component.Suicide();
}
}
}
}
}
public abstract class FSBFPhaseBaseState : FSBFEncounterBaseState
{
[NonSerialized]
public static bool readyToSpawnNextBossBody;
[SerializeField]
public float durationBeforeEnablingCombatEncounter;
[SerializeField]
public float durationBeforeRingsSpawn;
[SerializeField]
public GameObject speechControllerPrefab;
[SerializeField]
public GameObject spawnVFX;
protected ScriptedCombatEncounter phaseScriptedCombatEncounter;
protected GameObject phaseControllerObject;
protected GameObject phaseControllerSubObjectContainer;
protected BossGroup phaseBossGroup;
private bool hasSpawned;
private bool spawnedNextState;
private const float minimumDurationPerPhase = 2f;
private Run.FixedTimeStamp healthBarShowTime = Run.FixedTimeStamp.positiveInfinity;
protected abstract EntityState nextState { get; }
protected abstract string phaseControllerChildString { get; }
protected virtual float healthBarShowDelay => 0f;
public override void OnEnter()
{
base.OnEnter();
if (!base.meridianEventTriggerInteraction.isFirstPhase)
{
speechControllerPrefab = base.meridianEventTriggerInteraction.falseSonBoss1PhaseSpeechController;
base.meridianEventTriggerInteraction.isFirstPhase = true;
}
else if (!base.meridianEventTriggerInteraction.isFinalPhase)
{
speechControllerPrefab = base.meridianEventTriggerInteraction.falseSonBossEarlySpeechController;
}
else
{
speechControllerPrefab = base.meridianEventTriggerInteraction.falseSonBossLateSpeechController;
}
if ((bool)childLocator)
{
phaseControllerObject = childLocator.FindChild(phaseControllerChildString).gameObject;
if ((bool)phaseControllerObject)
{
phaseScriptedCombatEncounter = phaseControllerObject.GetComponent<ScriptedCombatEncounter>();
phaseBossGroup = phaseControllerObject.GetComponent<BossGroup>();
}
}
healthBarShowTime = Run.FixedTimeStamp.now + healthBarShowDelay;
if ((bool)DirectorCore.instance)
{
CombatDirector[] components = DirectorCore.instance.GetComponents<CombatDirector>();
for (int i = 0; i < components.Length; i++)
{
components[i].enabled = false;
}
}
if (NetworkServer.active && (object)phaseScriptedCombatEncounter != null)
{
phaseScriptedCombatEncounter.combatSquad.onMemberAddedServer += OnMemberAddedServer;
}
}
public override void OnExit()
{
if (NetworkServer.active)
{
if ((object)phaseScriptedCombatEncounter != null)
{
phaseScriptedCombatEncounter.combatSquad.onMemberAddedServer -= OnMemberAddedServer;
}
if ((bool)phaseControllerSubObjectContainer)
{
phaseControllerSubObjectContainer.SetActive(value: false);
}
}
if ((bool)phaseBossGroup)
{
phaseBossGroup.shouldDisplayHealthBarOnHud = false;
}
base.OnExit();
}
public override void FixedUpdate()
{
base.FixedUpdate();
phaseBossGroup.shouldDisplayHealthBarOnHud = healthBarShowTime.hasPassed;
if (!hasSpawned && readyToSpawnNextBossBody && base.fixedAge > durationBeforeEnablingCombatEncounter)
{
BeginEncounter();
}
else if (hasSpawned && readyToSpawnNextBossBody && !spawnedNextState && base.fixedAge > 2f + durationBeforeEnablingCombatEncounter && (bool)phaseScriptedCombatEncounter && phaseScriptedCombatEncounter.combatSquad.memberCount == 0)
{
spawnedNextState = true;
outer.SetNextState(nextState);
}
}
protected void BeginEncounter()
{
readyToSpawnNextBossBody = false;
hasSpawned = true;
PreEncounterBegin();
if (NetworkServer.active)
{
phaseScriptedCombatEncounter.BeginEncounter();
}
}
protected virtual void PreEncounterBegin()
{
}
protected virtual void OnMemberAddedServer(CharacterMaster master)
{
if ((bool)speechControllerPrefab)
{
UnityEngine.Object.Instantiate(speechControllerPrefab, master.transform).GetComponent<CharacterSpeechController>().characterMaster = master;
}
}
}
public class Phase1 : FSBFPhaseBaseState
{
private bool spawnedEntryFX;
private bool lightningStarted;
protected override string phaseControllerChildString => "Phase1";
protected override EntityState nextState => new Phase2();
public override void FixedUpdate()
{
base.FixedUpdate();
if (base.fixedAge > 15f && !lightningStarted)
{
lightningStarted = true;
base.meridianEventTriggerInteraction.arenaGeode3.SetActive(value: true);
base.meridianEventTriggerInteraction.arenaGeode4.SetActive(value: true);
}
if (!spawnedEntryFX && base.fixedAge > base.meridianEventTriggerInteraction.additionalEntryVFXDelay + durationBeforeEnablingCombatEncounter)
{
spawnedEntryFX = true;
SetPlayersInvulnerable(b: false);
EffectManager.SpawnEffect(base.meridianEventTriggerInteraction.falseSonEntryFX, new EffectData
{
origin = base.meridianEventTriggerInteraction.falseSonEntryFXPosition.position
}, transmit: false);
base.meridianEventTriggerInteraction.musicPhaseNone.SetActive(value: false);
base.meridianEventTriggerInteraction.musicPhaseOne.SetActive(value: true);
}
if (spawnedEntryFX && base.meridianEventTriggerInteraction.meridianColumnsGameObject.activeInHierarchy && !base.meridianEventTriggerInteraction.meridianPlayableColumns.activeInHierarchy && base.fixedAge > base.meridianEventTriggerInteraction.additionalEntryVFXDelay + durationBeforeEnablingCombatEncounter + 3f)
{
base.meridianEventTriggerInteraction.meridianColumnsGameObject.SetActive(value: false);
base.meridianEventTriggerInteraction.meridianPlayableColumns.SetActive(value: true);
}
}
public override void OnEnter()
{
base.meridianEventTriggerInteraction.onFalseSonAppearance.SetActive(value: true);
base.meridianEventTriggerInteraction.HandleNodeGateActivation(0);
durationBeforeEnablingCombatEncounter = 7f;
KillAllMonsters();
base.OnEnter();
FSBFPhaseBaseState.readyToSpawnNextBossBody = true;
Util.PlaySound("Play_boss_falseson_VO_spawn", base.gameObject);
base.meridianEventTriggerInteraction.Boundary1.SetActive(value: true);
if (NetworkServer.active)
{
SetPlayersInvulnerable(b: true);
}
}
protected override void OnMemberAddedServer(CharacterMaster master)
{
base.OnMemberAddedServer(master);
}
}
public class Phase2 : FSBFPhaseBaseState
{
private bool startRingsFalling;
protected override string phaseControllerChildString => "Phase2";
protected override EntityState nextState => new Phase3();
public override void FixedUpdate()
{
base.FixedUpdate();
if (base.fixedAge > durationBeforeRingsSpawn && !startRingsFalling)
{
base.meridianEventTriggerInteraction.Boundary1.SetActive(value: false);
base.meridianEventTriggerInteraction.Boundary2.SetActive(value: true);
base.meridianEventTriggerInteraction.StartOuterRingFalling();
base.meridianEventTriggerInteraction.arenaGeode3.SetActive(value: false);
startRingsFalling = true;
}
}
public override void OnEnter()
{
base.meridianEventTriggerInteraction.onEnteringPhase2.SetActive(value: true);
base.meridianEventTriggerInteraction.HandleNodeGateActivation(1);
base.meridianEventTriggerInteraction.phase2CombatDirector.SetActive(value: true);
durationBeforeEnablingCombatEncounter = 1f;
durationBeforeRingsSpawn = 1.75f;
childLocator = GetComponent<ChildLocator>();
phaseControllerObject = childLocator.FindChild(phaseControllerChildString).gameObject;
Util.PlaySound("Play_boss_falseson_VO_spawn", base.gameObject);
Util.PlaySound("Play_boss_falseson_VO_anger", base.gameObject);
base.OnEnter();
SetPlayersInvulnerable(b: false);
}
public override void OnExit()
{
base.meridianEventTriggerInteraction.isFinalPhase = true;
base.meridianEventTriggerInteraction.phase2CombatDirector.SetActive(value: false);
KillAllMonsters();
base.OnExit();
}
protected override void OnMemberAddedServer(CharacterMaster master)
{
base.OnMemberAddedServer(master);
}
}
public class Phase3 : FSBFPhaseBaseState
{
private bool startRingsFalling;
protected override string phaseControllerChildString => "Phase3";
protected override EntityState nextState => new MeridianEventCleared();
public override void FixedUpdate()
{
base.FixedUpdate();
if (base.fixedAge > durationBeforeRingsSpawn && !startRingsFalling)
{
base.meridianEventTriggerInteraction.Boundary2.SetActive(value: false);
base.meridianEventTriggerInteraction.Boundary3.SetActive(value: true);
base.meridianEventTriggerInteraction.StartMiddleRingFalling();
base.meridianEventTriggerInteraction.arenaGeode4.SetActive(value: false);
startRingsFalling = true;
}
}
public override void OnEnter()
{
speechControllerPrefab = base.meridianEventTriggerInteraction.falseSonBossLateSpeechController;
if (NetworkServer.active)
{
LightningStormController.SetStormStrikePattern(base.meridianEventTriggerInteraction.bossLightningStrikePattern);
LightningStormController.SetStormActive(b: true);
}
base.meridianEventTriggerInteraction.onEnteringPhase3.SetActive(value: true);
base.meridianEventTriggerInteraction.HandleNodeGateActivation(2);
durationBeforeEnablingCombatEncounter = 1f;
durationBeforeRingsSpawn = 1.75f;
childLocator = GetComponent<ChildLocator>();
phaseControllerObject = childLocator.FindChild(phaseControllerChildString).gameObject;
GoldTitanManager.onGoldTitanSpawned += IsAurelionitePresent;
Util.PlaySound("Play_boss_falseson_VO_spawn", base.gameObject);
base.OnEnter();
}
public override void OnExit()
{
base.OnExit();
GoldTitanManager.onGoldTitanSpawned -= IsAurelionitePresent;
}
protected override void OnMemberAddedServer(CharacterMaster master)
{
base.OnMemberAddedServer(master);
}
private void IsAurelionitePresent()
{
instance.isGoldTitanSpawned = true;
}
}
public class MeridianEventCleared : MeridianEventBaseState
{
public override void OnEnter()
{
base.OnEnter();
base.meridianEventTriggerInteraction.EventCompletePPVolume.SetActive(value: true);
base.meridianEventTriggerInteraction.EventPPVolume.SetActive(value: false);
base.meridianEventTriggerInteraction.shrineModel.SetActive(value: true);
base.meridianEventTriggerInteraction.shrine.GetComponent<ShrineRebirthController>().stateMachine.SetNextStateToMain();
base.meridianEventTriggerInteraction.finalPillars.SetActive(value: true);
base.meridianEventTriggerInteraction.meridianRain.SetActive(value: false);
base.meridianEventTriggerInteraction.meridianStormCloud.SetActive(value: false);
base.meridianEventTriggerInteraction.eventClearedVFX.SetActive(value: true);
base.meridianEventTriggerInteraction.arenaGeode1.SetActive(value: false);
base.meridianEventTriggerInteraction.arenaGeode2.SetActive(value: false);
base.meridianEventTriggerInteraction.bossFightAMB.Stop(base.gameObject);
base.meridianEventTriggerInteraction.bossDefeatAMB.Post(base.gameObject);
Util.PlaySound("Play_env_meridian_level_cleared", base.gameObject);
if (!NetworkServer.active)
{
return;
}
GameObject[] destinationPortals = base.meridianEventTriggerInteraction.destinationPortals;
for (int i = 0; i < destinationPortals.Length; i++)
{
destinationPortals[i].SetActive(value: true);
}
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if (!(instance == null))
{
CharacterBody body = instance.master.GetBody();
if (!(body == null))
{
Util.CleanseBody(body, removeDebuffs: true, removeBuffs: false, removeCooldownBuffs: false, removeDots: false, removeStun: false, removeNearbyProjectiles: false);
}
}
}
}
}
[HideInInspector]
public static Transform bossTransform;
public string contextToken = "MERIDIAN_EVENTTRIGGER_CONTEXT";
public string displayNameToken = "MERIDIAN_EVENTTRIGGER_NAME";
public int minimumNumberToSpawnPerMonsterType;
public int maximumNumberToSpawnBeforeSkipping;
public GameObject eventGateStateObject;
public GameObject eventGateStatePhase2Object;
public GameObject eventGateStatePhase3Object;
public CombatDirector combatDirectorWave1;
public CombatDirector combatDirectorWave2;
public SceneExitController sceneExitController;
[Header("Post Process Volumes")]
public GameObject EventPPVolume;
public GameObject EventCompletePPVolume;
public GameObject AfterEventCompletePPVolume;
[Header("Destination Portals")]
public GameObject[] destinationPortals;
[Header("Colossus Head")]
public GameObject colossusHead;
public Transform colossusHeadFinalPosition;
public float colossusHeadDuration = 420f;
private bool isHeadRotating;
[Header("False Son Core")]
public GameObject falseSonCore;
[Header("Game Objects to Modify")]
public GameObjectsToModify[] gameObjectsToModify;
[Header("Event Objects to Toggle")]
public GameObject[] eventGameObjectsToToggle;
[Header("Cleaered Objects to Toggle")]
public GameObject[] clearedGameObjectsToToggle;
[Header("False Son Boss Encounter")]
public ScriptedCombatEncounter falseSonBossEncounter;
public BossGroup falseSonBossGroup;
public CombatDirector combatDirector;
[Header("Teleport Locs")]
public GameObject playerTPLoc1;
public GameObject playerTPLoc2;
public GameObject playerTPLoc3;
public GameObject playerTPLoc4;
private GameObject[] playerTPLocs = new GameObject[4];
[Header("Cutscene")]
public GameObject cutsceneCamera;
public AK.Wwise.Event startSceneAMB;
public AK.Wwise.Event bossFightAMB;
public AK.Wwise.Event bossDefeatAMB;
[Header("Boss Music Phases")]
public GameObject musicPhaseNone;
public GameObject musicPhaseOne;
public GameObject musicPhaseTwo;
public GameObject musicPhaseThree;
public GameObject musicPhaseBossDead;
[Header("Arena Setup")]
public GameObject lightningStorm;
public GameObject fog;
public GameObject sceneBoundsOld;
public GameObject sceneBoundsNew;
public GameObject meridianColumnsGameObject;
public GameObject meridianPlayableColumns;
public LightningStrikePattern bossLightningStrikePattern;
[Header("Phase 1 Spawn FX Data")]
[SerializeField]
[HideInInspector]
public GameObject falseSonEntryFX;
[SerializeField]
public Transform falseSonEntryFXPosition;
[SerializeField]
public float additionalEntryVFXDelay;
[Header("In-Scene Phase Transition VFX - should automatically disable itself")]
public GameObject onFalseSonAppearance;
public GameObject onEnteringPhase2;
public GameObject onEnteringPhase3;
[Space(20f)]
public float ringFallOffTime = 50f;
[HideInInspector]
public int ringFallingState;
private int localRingFallingState;
[Header("Rings Locs")]
public GameObject ringPiece1;
public GameObject ringPiece2;
public GameObject ringPiece3;
public GameObject ringPiece4;
public GameObject ringPiece5;
public GameObject ringPiece6;
public GameObject ringPiece7;
public GameObject ringPiece8;
public GameObject ringPiece9;
public GameObject ringPiece10;
public GameObject ringPiece1FinalPosition;
public GameObject ringPiece2FinalPosition;
public GameObject ringPiece3FinalPosition;
public GameObject ringPiece4FinalPosition;
public GameObject ringPiece5FinalPosition;
public GameObject ringPiece6FinalPosition;
public GameObject ringPiece7FinalPosition;
public GameObject ringPiece8FinalPosition;
public GameObject ringPiece9FinalPosition;
public GameObject ringPiece10FinalPosition;
[Header("Arena Finale")]
public GameObject shrine;
public GameObject shrineModel;
public GameObject finalPillars;
public GameObject eventClearedVFX;
public GameObject meridianRain;
public GameObject meridianStormCloud;
[Header("Geode System")]
public GameObject arenaGeode1;
public GameObject arenaGeode2;
public GameObject arenaGeode3;
public GameObject arenaGeode4;
[Header("Boss Bounds System")]
public GameObject Boundary1;
public GameObject Boundary2;
public GameObject Boundary3;
[Header("Boss Dialogue Prefabs")]
public GameObject falseSonBossEarlySpeechController;
public GameObject falseSonBossLateSpeechController;
public GameObject falseSonBoss1PhaseSpeechController;
[HideInInspector]
public bool isFirstPhase;
[HideInInspector]
public bool isFinalPhase;
[HideInInspector]
public bool isGoldTitanSpawned;
[Header("Monster Waves Combat Director Prefabs")]
public GameObject phase2CombatDirector;
private EntityStateMachine mainStateMachine;
private bool triggerEventClear;
[SyncVar(hook = "Client_HandleStartMeridianEvent")]
public bool isTriggered;
private static int kRpcRpcTeleportWithLocalAuthority;
private static int kRpcRpcOnFalseSonDefeated;
private static int kRpcRpcSetEventMaterials;
public static MeridianEventTriggerInteraction instance { get; private set; }
protected MeridianEventTriggerInteraction eventTriggerInteraction { get; private set; }
public bool NetworkisTriggered
{
get
{
return isTriggered;
}
[param: In]
set
{
if (NetworkServer.localClientActive && !base.syncVarHookGuard)
{
base.syncVarHookGuard = true;
Client_HandleStartMeridianEvent(value);
base.syncVarHookGuard = false;
}
SetSyncVar(value, ref isTriggered, 1u);
}
}
public static event Action<MeridianEventTriggerInteraction> onDefeatedServerGlobal;
public static event Action<MeridianEventTriggerInteraction, Interactor> onActivated;
public static event Action onInstanceChangedGlobal;
public string GetContextString(Interactor activator)
{
return Language.GetString(contextToken);
}
public override int GetNetworkChannel()
{
return QosChannelIndex.defaultReliable.intVal;
}
public Interactability GetInteractability(Interactor activator)
{
if (isTriggered)
{
return Interactability.Disabled;
}
return Interactability.Available;
}
public string GetDisplayName()
{
return Language.GetString(displayNameToken);
}
public bool ShouldIgnoreSpherecastForInteractibility(Interactor activator)
{
return false;
}
public bool ShouldShowOnScanner()
{
return !isTriggered;
}
private void Start()
{
eventTriggerInteraction = GetComponent<MeridianEventTriggerInteraction>();
}
public void OnEnable()
{
instance = SingletonHelper.Assign(instance, this);
MeridianEventTriggerInteraction.onInstanceChangedGlobal?.Invoke();
if (falseSonEntryFX == null)
{
AsyncOperationHandle<GameObject> asyncOperationHandle = LegacyResourcesAPI.LoadAsync<GameObject>("FalseSonBoss/FalseSonBossAppearVFX");
asyncOperationHandle.Completed += delegate(AsyncOperationHandle<GameObject> result)
{
falseSonEntryFX = result.Result;
};
}
}
public void OnDisable()
{
instance = SingletonHelper.Unassign(instance, this);
MeridianEventTriggerInteraction.onInstanceChangedGlobal?.Invoke();
}
[Server]
public override void OnStartServer()
{
if (!NetworkServer.active)
{
Debug.LogWarning("[Server] function 'System.Void RoR2.MeridianEventTriggerInteraction::OnStartServer()' called on client");
return;
}
base.OnStartServer();
startSceneAMB.Post(base.gameObject);
}
public void OnTriggerEnter(Collider other)
{
if (NetworkServer.active && !isTriggered && other.TryGetComponent<CharacterBody>(out var component) && component.isPlayerControlled)
{
HandleInitializeMeridianEvent();
}
}
public static void SetPlayersInvulnerable(bool b)
{
if (!NetworkServer.active)
{
return;
}
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if (instance == null)
{
continue;
}
CharacterBody body = instance.master.GetBody();
if (!(body == null))
{
if (b)
{
body.AddTimedBuff(DLC2Content.Buffs.HiddenRejectAllDamage, 1.5f);
}
else if (body.HasBuff(DLC2Content.Buffs.HiddenRejectAllDamage))
{
body.RemoveBuff(DLC2Content.Buffs.HiddenRejectAllDamage);
}
}
}
}
[Server]
private void HandleInitializeMeridianEvent()
{
if (!NetworkServer.active)
{
Debug.LogWarning("[Server] function 'System.Void RoR2.MeridianEventTriggerInteraction::HandleInitializeMeridianEvent()' called on client");
return;
}
LightningStormController.SetStormActive(b: false);
combatDirector.enabled = false;
playerTPLocs[0] = playerTPLoc1;
playerTPLocs[1] = playerTPLoc2;
playerTPLocs[2] = playerTPLoc3;
playerTPLocs[3] = playerTPLoc4;
int num = 0;
int num2 = 0;
int count = PlayerCharacterMasterController.instances.Count;
bool flag = count > 4;
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if (instance == null)
{
continue;
}
Vector3 vector;
Quaternion rotation;
if (flag)
{
int num3 = playerTPLocs.Length - 1;
float num4 = (float)num2 / (float)(count - 1) * (float)num3;
int num5 = Mathf.Clamp(Mathf.FloorToInt(num4), 0, num3 - 1);
float t = num4 - (float)num5;
Transform obj = playerTPLocs[num5].transform;
Transform transform = playerTPLocs[num5 + 1].transform;
vector = Vector3.Lerp(obj.position, transform.position, t);
rotation = Quaternion.Lerp(obj.rotation, transform.rotation, t);
}
else
{
int num6 = num2;
if (playerTPLocs[num6] == null)
{
num6 = num;
}
Transform obj2 = playerTPLocs[num6].transform;
vector = obj2.position;
rotation = obj2.rotation;
}
CharacterBody body = instance.master.GetBody();
if (!(body == null))
{
body.currentVehicle?.EjectPassenger();
if (Util.HasEffectiveAuthority(body.gameObject))
{
TeleportHelper.TeleportBody(body, vector);
}
else
{
CallRpcTeleportWithLocalAuthority(body.gameObject, vector, rotation);
}
num2++;
}
}
NetworkisTriggered = true;
}
[ClientRpc]
private void RpcTeleportWithLocalAuthority(GameObject playerObject, Vector3 position, Quaternion rotation)
{
if (Util.HasEffectiveAuthority(playerObject))
{
CharacterBody component = playerObject.GetComponent<CharacterBody>();
if (component == null)
{
Debug.LogWarning("Received RPCTeleport request but the game object doesn't have a CharacterBody! " + playerObject.name, playerObject);
}
else
{
TeleportHelper.TeleportBody(component, position);
}
}
}
[Client]
private void Client_HandleStartMeridianEvent(bool newValue)
{
if (!NetworkClient.active)
{
Debug.LogWarning("[Client] function 'System.Void RoR2.MeridianEventTriggerInteraction::Client_HandleStartMeridianEvent(System.Boolean)' called on server");
return;
}
NetworkisTriggered = newValue;
HandleStartMeridianEvent();
}
private void HandleStartMeridianEvent()
{
fog.SetActive(value: true);
sceneBoundsOld.SetActive(value: false);
sceneBoundsNew.SetActive(value: true);
startSceneAMB.Stop(base.gameObject);
bossFightAMB.Post(base.gameObject);
musicPhaseNone.SetActive(value: true);
cutsceneCamera.SetActive(value: true);
Util.PlaySound("Play_env_meridian_activate_boss_cutscene", base.gameObject);
LocalUser firstLocalUser = LocalUserManager.GetFirstLocalUser();
if (firstLocalUser != null && firstLocalUser.cachedBody != null)
{
string bodyName = BodyCatalog.GetBodyName(firstLocalUser.cachedBody.bodyIndex);
firstLocalUser.userProfile.HasAchievement(bodyName.Substring(0, bodyName.Length - 4) + "ClearMeridianEvent");
}
mainStateMachine.SetNextState(new MeridianEventStart());
}
private IEnumerator RotateHead()
{
float timeElapsed = 0f;
while (timeElapsed < colossusHeadDuration)
{
colossusHead.transform.rotation = Quaternion.Lerp(colossusHead.transform.rotation, colossusHeadFinalPosition.rotation, timeElapsed / colossusHeadDuration);
ringPiece1.transform.rotation = Quaternion.Lerp(ringPiece1.transform.rotation, ringPiece1FinalPosition.transform.rotation, timeElapsed / (colossusHeadDuration - 20f));
ringPiece2.transform.rotation = Quaternion.Lerp(ringPiece2.transform.rotation, ringPiece2FinalPosition.transform.rotation, timeElapsed / (colossusHeadDuration - 22f));
ringPiece3.transform.rotation = Quaternion.Lerp(ringPiece3.transform.rotation, ringPiece3FinalPosition.transform.rotation, timeElapsed / (colossusHeadDuration - 25f));
ringPiece4.transform.rotation = Quaternion.Lerp(ringPiece4.transform.rotation, ringPiece4FinalPosition.transform.rotation, timeElapsed / (colossusHeadDuration - 26f));
ringPiece5.transform.rotation = Quaternion.Lerp(ringPiece5.transform.rotation, ringPiece5FinalPosition.transform.rotation, timeElapsed / (colossusHeadDuration - 19f));
ringPiece1.transform.position = Vector3.Lerp(ringPiece1.transform.position, ringPiece1FinalPosition.transform.position, timeElapsed / (colossusHeadDuration - 20f));
ringPiece2.transform.position = Vector3.Lerp(ringPiece2.transform.position, ringPiece2FinalPosition.transform.position, timeElapsed / (colossusHeadDuration - 22f));
ringPiece3.transform.position = Vector3.Lerp(ringPiece3.transform.position, ringPiece3FinalPosition.transform.position, timeElapsed / (colossusHeadDuration - 25f));
ringPiece4.transform.position = Vector3.Lerp(ringPiece4.transform.position, ringPiece4FinalPosition.transform.position, timeElapsed / (colossusHeadDuration - 26f));
ringPiece5.transform.position = Vector3.Lerp(ringPiece5.transform.position, ringPiece5FinalPosition.transform.position, timeElapsed / (colossusHeadDuration - 19f));
ringPiece6.transform.rotation = Quaternion.Lerp(ringPiece6.transform.rotation, ringPiece6FinalPosition.transform.rotation, timeElapsed / colossusHeadDuration);
ringPiece7.transform.rotation = Quaternion.Lerp(ringPiece7.transform.rotation, ringPiece7FinalPosition.transform.rotation, timeElapsed / colossusHeadDuration);
ringPiece8.transform.rotation = Quaternion.Lerp(ringPiece8.transform.rotation, ringPiece8FinalPosition.transform.rotation, timeElapsed / colossusHeadDuration);
ringPiece9.transform.rotation = Quaternion.Lerp(ringPiece9.transform.rotation, ringPiece9FinalPosition.transform.rotation, timeElapsed / colossusHeadDuration);
ringPiece10.transform.rotation = Quaternion.Lerp(ringPiece10.transform.rotation, ringPiece10FinalPosition.transform.rotation, timeElapsed / colossusHeadDuration);
ringPiece6.transform.position = Vector3.Lerp(ringPiece6.transform.position, ringPiece6FinalPosition.transform.position, timeElapsed / colossusHeadDuration);
ringPiece7.transform.position = Vector3.Lerp(ringPiece7.transform.position, ringPiece7FinalPosition.transform.position, timeElapsed / colossusHeadDuration);
ringPiece8.transform.position = Vector3.Lerp(ringPiece8.transform.position, ringPiece8FinalPosition.transform.position, timeElapsed / colossusHeadDuration);
ringPiece9.transform.position = Vector3.Lerp(ringPiece9.transform.position, ringPiece9FinalPosition.transform.position, timeElapsed / colossusHeadDuration);
ringPiece10.transform.position = Vector3.Lerp(ringPiece10.transform.position, ringPiece10FinalPosition.transform.position, timeElapsed / colossusHeadDuration);
timeElapsed += Time.deltaTime;
yield return null;
}
}
private void StartOuterRingFalling()
{
ringFallingState = Mathf.Max(1, ringFallingState);
Util.PlaySound("Play_env_meridian_level_ring_fall", base.gameObject);
}
private void StartMiddleRingFalling()
{
ringFallingState = Mathf.Max(2, ringFallingState);
Util.PlaySound("Play_env_meridian_level_ring_fall", base.gameObject);
}
private IEnumerator OuterRingFalling()
{
float timeElapsed = 0f;
while (timeElapsed < ringFallOffTime)
{
ringPiece6.transform.position = Vector3.Lerp(ringPiece6.transform.position, ringPiece6.transform.position - new Vector3(0f, 100f, 0f), timeElapsed / ringFallOffTime);
ringPiece7.transform.position = Vector3.Lerp(ringPiece7.transform.position, ringPiece7.transform.position - new Vector3(0f, 230f, 0f), timeElapsed / ringFallOffTime);
ringPiece8.transform.position = Vector3.Lerp(ringPiece8.transform.position, ringPiece8.transform.position - new Vector3(0f, 120f, 0f), timeElapsed / ringFallOffTime);
ringPiece9.transform.position = Vector3.Lerp(ringPiece9.transform.position, ringPiece9.transform.position - new Vector3(0f, 350f, 0f), timeElapsed / ringFallOffTime);
ringPiece10.transform.position = Vector3.Lerp(ringPiece10.transform.position, ringPiece10.transform.position - new Vector3(0f, 130f, 0f), timeElapsed / ringFallOffTime);
timeElapsed += Time.deltaTime;
yield return null;
}
ringPiece6.SetActive(value: false);
ringPiece7.SetActive(value: false);
ringPiece8.SetActive(value: false);
ringPiece9.SetActive(value: false);
ringPiece10.SetActive(value: false);
}
private IEnumerator MiddleRingFalling()
{
float timeElapsed = 0f;
while (timeElapsed < ringFallOffTime)
{
ringPiece1.transform.position = Vector3.Lerp(ringPiece1.transform.position, ringPiece1.transform.position - new Vector3(0f, 120f, 0f), timeElapsed / ringFallOffTime);
ringPiece2.transform.position = Vector3.Lerp(ringPiece2.transform.position, ringPiece2.transform.position - new Vector3(0f, 110f, 0f), timeElapsed / ringFallOffTime);
ringPiece3.transform.position = Vector3.Lerp(ringPiece3.transform.position, ringPiece3.transform.position - new Vector3(0f, 350f, 0f), timeElapsed / ringFallOffTime);
ringPiece4.transform.position = Vector3.Lerp(ringPiece4.transform.position, ringPiece4.transform.position - new Vector3(0f, 130f, 0f), timeElapsed / ringFallOffTime);
ringPiece5.transform.position = Vector3.Lerp(ringPiece5.transform.position, ringPiece5.transform.position - new Vector3(0f, 470f, 0f), timeElapsed / ringFallOffTime);
timeElapsed += Time.deltaTime;
yield return null;
}
ringPiece1.SetActive(value: false);
ringPiece2.SetActive(value: false);
ringPiece3.SetActive(value: false);
ringPiece4.SetActive(value: false);
ringPiece5.SetActive(value: false);
}
public void TriggerEventClear()
{
triggerEventClear = true;
}
public void Update()
{
if (isHeadRotating)
{
StartCoroutine(RotateHead());
cutsceneCamera.SetActive(value: true);
isHeadRotating = false;
}
if (ringFallingState > localRingFallingState)
{
if (ringFallingState == 1)
{
StartCoroutine(OuterRingFalling());
}
else if (ringFallingState == 2)
{
StartCoroutine(MiddleRingFalling());
}
localRingFallingState = ringFallingState;
}
if (triggerEventClear && NetworkServer.active)
{
CallRpcOnFalseSonDefeated();
triggerEventClear = false;
}
}
private void Awake()
{
mainStateMachine = EntityStateMachine.FindByCustomName(base.gameObject, "Main");
if (NetworkServer.active)
{
SkyJumpDeathState.falseSonDeathEvent += TriggerEventClear;
}
GameObject[] array = destinationPortals;
for (int i = 0; i < array.Length; i++)
{
array[i].SetActive(value: false);
}
}
[ClientRpc]
private void RpcOnFalseSonDefeated()
{
EventCompletePPVolume.SetActive(value: true);
EventPPVolume.SetActive(value: false);
if (AfterEventCompletePPVolume != null)
{
AfterEventCompletePPVolume.SetActive(value: true);
}
SetIdleMaterials();
SetClearedObjects();
}
private void Wave1OnDefeatedServer()
{
combatDirectorWave2.enabled = true;
combatDirectorWave2.currentSpawnTarget = base.gameObject;
combatDirectorWave2.monsterCredit += (int)(600f * Mathf.Pow(Run.instance.compensatedDifficultyCoefficient, 0.5f));
}
private void Wave2OnDefeatedServer()
{
mainStateMachine.SetNextState(new MeridianEventCleared());
}
private void SetEventObjects()
{
for (int i = 0; i < eventGameObjectsToToggle.Length; i++)
{
if (!(eventGameObjectsToToggle[i] == null))
{
bool activeInHierarchy = eventGameObjectsToToggle[i].activeInHierarchy;
eventGameObjectsToToggle[i].SetActive(!activeInHierarchy);
}
}
}
private void HandleNodeGateActivation(int currentState)
{
eventGateStateObject.SetActive(currentState <= 0);
eventGateStatePhase2Object.SetActive(currentState <= 1);
eventGateStatePhase3Object.SetActive(currentState <= 2);
}
private void SetClearedObjects()
{
for (int i = 0; i < clearedGameObjectsToToggle.Length; i++)
{
if (!(clearedGameObjectsToToggle[i] == null))
{
bool activeInHierarchy = clearedGameObjectsToToggle[i].activeInHierarchy;
clearedGameObjectsToToggle[i].SetActive(!activeInHierarchy);
}
}
}
[ClientRpc]
private void RpcSetEventMaterials()
{
for (int i = 0; i < gameObjectsToModify.Length; i++)
{
GameObject[] objects = gameObjectsToModify[i].objects;
foreach (GameObject gameObject in objects)
{
if (!(gameObject == null) && gameObject.TryGetComponent<Renderer>(out var component))
{
component.material = gameObjectsToModify[i].eventMaterial;
}
}
}
}
private void SetIdleMaterials()
{
for (int i = 0; i < gameObjectsToModify.Length; i++)
{
GameObject[] objects = gameObjectsToModify[i].objects;
foreach (GameObject gameObject in objects)
{
if (!(gameObject == null))
{
gameObject.GetComponent<Renderer>().material = gameObjectsToModify[i].idleMaterial;
}
}
}
}
private void UNetVersion()
{
}
protected static void InvokeRpcRpcTeleportWithLocalAuthority(NetworkBehaviour obj, NetworkReader reader)
{
if (!NetworkClient.active)
{
Debug.LogError("RPC RpcTeleportWithLocalAuthority called on server.");
}
else
{
((MeridianEventTriggerInteraction)obj).RpcTeleportWithLocalAuthority(reader.ReadGameObject(), reader.ReadVector3(), reader.ReadQuaternion());
}
}
protected static void InvokeRpcRpcOnFalseSonDefeated(NetworkBehaviour obj, NetworkReader reader)
{
if (!NetworkClient.active)
{
Debug.LogError("RPC RpcOnFalseSonDefeated called on server.");
}
else
{
((MeridianEventTriggerInteraction)obj).RpcOnFalseSonDefeated();
}
}
protected static void InvokeRpcRpcSetEventMaterials(NetworkBehaviour obj, NetworkReader reader)
{
if (!NetworkClient.active)
{
Debug.LogError("RPC RpcSetEventMaterials called on server.");
}
else
{
((MeridianEventTriggerInteraction)obj).RpcSetEventMaterials();
}
}
public void CallRpcTeleportWithLocalAuthority(GameObject playerObject, Vector3 position, Quaternion rotation)
{
if (!NetworkServer.active)
{
Debug.LogError("RPC Function RpcTeleportWithLocalAuthority called on client.");
return;
}
NetworkWriter networkWriter = new NetworkWriter();
networkWriter.Write((short)0);
networkWriter.Write((short)2);
networkWriter.WritePackedUInt32((uint)kRpcRpcTeleportWithLocalAuthority);
networkWriter.Write(GetComponent<NetworkIdentity>().netId);
networkWriter.Write(playerObject);
networkWriter.Write(position);
networkWriter.Write(rotation);
SendRPCInternal(networkWriter, 0, "RpcTeleportWithLocalAuthority");
}
public void CallRpcOnFalseSonDefeated()
{
if (!NetworkServer.active)
{
Debug.LogError("RPC Function RpcOnFalseSonDefeated called on client.");
return;
}
NetworkWriter networkWriter = new NetworkWriter();
networkWriter.Write((short)0);
networkWriter.Write((short)2);
networkWriter.WritePackedUInt32((uint)kRpcRpcOnFalseSonDefeated);
networkWriter.Write(GetComponent<NetworkIdentity>().netId);
SendRPCInternal(networkWriter, 0, "RpcOnFalseSonDefeated");
}
public void CallRpcSetEventMaterials()
{
if (!NetworkServer.active)
{
Debug.LogError("RPC Function RpcSetEventMaterials called on client.");
return;
}
NetworkWriter networkWriter = new NetworkWriter();
networkWriter.Write((short)0);
networkWriter.Write((short)2);
networkWriter.WritePackedUInt32((uint)kRpcRpcSetEventMaterials);
networkWriter.Write(GetComponent<NetworkIdentity>().netId);
SendRPCInternal(networkWriter, 0, "RpcSetEventMaterials");
}
static MeridianEventTriggerInteraction()
{
kRpcRpcTeleportWithLocalAuthority = -40849326;
NetworkBehaviour.RegisterRpcDelegate(typeof(MeridianEventTriggerInteraction), kRpcRpcTeleportWithLocalAuthority, InvokeRpcRpcTeleportWithLocalAuthority);
kRpcRpcOnFalseSonDefeated = 1048548329;
NetworkBehaviour.RegisterRpcDelegate(typeof(MeridianEventTriggerInteraction), kRpcRpcOnFalseSonDefeated, InvokeRpcRpcOnFalseSonDefeated);
kRpcRpcSetEventMaterials = 1585739;
NetworkBehaviour.RegisterRpcDelegate(typeof(MeridianEventTriggerInteraction), kRpcRpcSetEventMaterials, InvokeRpcRpcSetEventMaterials);
NetworkCRC.RegisterBehaviour("MeridianEventTriggerInteraction", 0);
}
public override bool OnSerialize(NetworkWriter writer, bool forceAll)
{
if (forceAll)
{
writer.Write(isTriggered);
return true;
}
bool flag = false;
if ((base.syncVarDirtyBits & (true ? 1u : 0u)) != 0)
{
if (!flag)
{
writer.WritePackedUInt32(base.syncVarDirtyBits);
flag = true;
}
writer.Write(isTriggered);
}
if (!flag)
{
writer.WritePackedUInt32(base.syncVarDirtyBits);
}
return flag;
}
public override void OnDeserialize(NetworkReader reader, bool initialState)
{
if (initialState)
{
isTriggered = reader.ReadBoolean();
return;
}
int num = (int)reader.ReadPackedUInt32();
if (((uint)num & (true ? 1u : 0u)) != 0)
{
Client_HandleStartMeridianEvent(reader.ReadBoolean());
}
}
public override void PreStartClient()
{
}
}