static bool Prefix(Planetbase.SolarFlare __instance, ref float timeStep) { if (Multiplayer.Client == null) { return(true); } Player?simulationOwner = Multiplayer.Client.SimulationManager.GetSimulationOwner(); if (simulationOwner == null || simulationOwner.Value != Multiplayer.Client.LocalPlayer) { return(false); // Player isn't the simulation owner } Type solarFlareType = __instance.GetType(); FieldInfo mSolarFlareInProgress = Reflection.GetPrivateFieldOrThrow(solarFlareType, "mSolarFlareInProgress", true); bool solarFlareInProgress = (bool)Reflection.GetInstanceFieldValue(__instance, mSolarFlareInProgress); if (solarFlareInProgress) { FieldInfo mTimeInfo = Reflection.GetPrivateFieldOrThrow(solarFlareType, "mTime", true); FieldInfo mSolarFlareTimeInfo = Reflection.GetPrivateFieldOrThrow(solarFlareType, "mSolarFlareTime", true); MethodInfo onEndInfo = Reflection.GetPrivateMethodOrThrow(solarFlareType, "onEnd", true); float mTime = (float)Reflection.GetInstanceFieldValue(__instance, mTimeInfo) + timeStep; Reflection.SetInstanceFieldValue(__instance, mTimeInfo, mTime); float mSolarFlareTime = (float)Reflection.GetInstanceFieldValue(__instance, mSolarFlareTimeInfo); if (mTime > mSolarFlareTime) { // End solar flare Reflection.InvokeInstanceMethod(__instance, onEndInfo, new object[] { }); } } else { // Create a new solar flare MethodInfo updateDetectionInfo = Reflection.GetPrivateMethodOrThrow(solarFlareType, "updateDetection", true); MethodInfo decideNextSolarFlareInfo = Reflection.GetPrivateMethodOrThrow(solarFlareType, "decideNextSolarFlare", true); FieldInfo mTimeToNextSolarFlareInfo = Reflection.GetPrivateFieldOrThrow(solarFlareType, "mTimeToNextSolarFlare", true); float mTimeToNextSolarFlare = (float)Reflection.GetInstanceFieldValue(__instance, mTimeToNextSolarFlareInfo); Reflection.InvokeInstanceMethod(__instance, updateDetectionInfo, new object[] { mTimeToNextSolarFlare, timeStep }); mTimeToNextSolarFlare -= timeStep; Reflection.SetInstanceFieldValue(__instance, mTimeToNextSolarFlareInfo, mTimeToNextSolarFlare); if (mTimeToNextSolarFlare < 0f && Singleton <EnvironmentManager> .getInstance().getTimeOfDay() < 0.25f && !Singleton <DisasterManager> .getInstance().anyInProgress()) { // Trigger solar flare __instance.trigger(); Reflection.InvokeInstanceMethod(__instance, decideNextSolarFlareInfo, new object[] { }); } } return(false); }
static bool Prefix(Planetbase.SolarFlare __instance) { if (Multiplayer.Client == null) { return(true); } Player?simulationOwner = Multiplayer.Client.SimulationManager.GetSimulationOwner(); if (simulationOwner == null || simulationOwner.Value != Multiplayer.Client.LocalPlayer) { return(false); // Player isn't the simulation owner } PlanetbaseMultiplayer.Client.Environment.DisasterManager disasterManager = Multiplayer.Client.DisasterManager; disasterManager.EndDisaster(); return(false); }
static bool Prefix(Planetbase.SolarFlare __instance) { if (Multiplayer.Client == null) { return(true); } Player?simulationOwner = Multiplayer.Client.SimulationManager.GetSimulationOwner(); if (simulationOwner == null || simulationOwner.Value != Multiplayer.Client.LocalPlayer) { return(false); // Player isn't the simulation owner } PlanetbaseMultiplayer.Client.Environment.DisasterManager disasterManager = Multiplayer.Client.DisasterManager; float disasterLength = UnityEngine.Random.Range(90f, 180f); float currentTime = 0f; disasterManager.CreateDisaster(DisasterType.SolarFlare, disasterLength, currentTime); return(false); }