static bool Prefix(Planetbase.Blizzard __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      blizzardType        = __instance.GetType();
            FieldInfo mBlizzardInProgress = Reflection.GetPrivateFieldOrThrow(blizzardType, "mBlizzardInProgress", true);
            bool      blizzardInProgress  = (bool)Reflection.GetInstanceFieldValue(__instance, mBlizzardInProgress);

            if (blizzardInProgress)
            {
                FieldInfo  mTimeInfo         = Reflection.GetPrivateFieldOrThrow(blizzardType, "mTime", true);
                FieldInfo  mBlizzardTimeInfo = Reflection.GetPrivateFieldOrThrow(blizzardType, "mBlizzardTime", true);
                MethodInfo onEndInfo         = Reflection.GetPrivateMethodOrThrow(blizzardType, "onEnd", true);

                float mTime = (float)Reflection.GetInstanceFieldValue(__instance, mTimeInfo) + timeStep;
                Reflection.SetInstanceFieldValue(__instance, mTimeInfo, mTime);
                float mBlizzardTime = (float)Reflection.GetInstanceFieldValue(__instance, mBlizzardTimeInfo);

                if (mTime > mBlizzardTime)
                {
                    // End blizzard
                    Reflection.InvokeInstanceMethod(__instance, onEndInfo, new object[] { });
                }
            }
            else
            {
                // Create a new blizzard
                MethodInfo updateDetectionInfo     = Reflection.GetPrivateMethodOrThrow(blizzardType, "updateDetection", true);
                MethodInfo decideNextBlizzardInfo  = Reflection.GetPrivateMethodOrThrow(blizzardType, "decideNextBlizzard", true);
                FieldInfo  mTimeToNextBlizzardInfo = Reflection.GetPrivateFieldOrThrow(blizzardType, "mTimeToNextBlizzard", true);
                float      mTimeToNextBlizzard     = (float)Reflection.GetInstanceFieldValue(__instance, mTimeToNextBlizzardInfo);

                Reflection.InvokeInstanceMethod(__instance, updateDetectionInfo, new object[] { mTimeToNextBlizzard, timeStep });
                mTimeToNextBlizzard -= timeStep;
                Reflection.SetInstanceFieldValue(__instance, mTimeToNextBlizzardInfo, mTimeToNextBlizzard);
                if (mTimeToNextBlizzard < 0f)
                {
                    // Trigger blizzard
                    __instance.trigger();
                    Reflection.InvokeInstanceMethod(__instance, decideNextBlizzardInfo, new object[] { });
                }
            }

            return(false);
        }
示例#2
0
        static bool Prefix(Planetbase.Blizzard __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;
        }
示例#3
0
        static bool Prefix(Planetbase.Blizzard __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(135f, 270f);
            float currentTime    = 0f;

            disasterManager.CreateDisaster(DisasterType.Blizzard, disasterLength, currentTime);

            return(false);
        }