public static bool Radiate(RadiatePlayerInRange __instance)
        {
            bool flag = GameModeUtils.HasRadiation() && (NoDamageConsoleCommand.main == null || !NoDamageConsoleCommand.main.GetNoDamageCheat());

            PlayerDistanceTracker tracker = (PlayerDistanceTracker)AccessTools.Field(typeof(RadiatePlayerInRange), "tracker").GetValue(__instance);
            float distanceToPlayer        = GetDistance(tracker);

            if (radiated = distanceToPlayer <= __instance.radiateRadius && flag && __instance.radiateRadius > 0f)
            {
                float num  = Mathf.Clamp01(1f - distanceToPlayer / __instance.radiateRadius);
                float num2 = num;
                if (Inventory.main.equipment.GetCount(TechType.RadiationSuit) > 0)
                {
                    num -= num2 * 0.5f;
                }
                if (Inventory.main.equipment.GetCount(TechType.RadiationHelmet) > 0)
                {
                    num -= num2 * 0.23f * 2f;
                }
                if (Inventory.main.equipment.GetCount(TechType.RadiationGloves) > 0)
                {
                    num -= num2 * 0.23f;
                }
                num = Mathf.Clamp01(num);
                Player.main.SetRadiationAmount(num);
            }
            else
            {
                Player.main.SetRadiationAmount(0f);
            }

            return(false);
        }
Пример #2
0
        public static bool DoDamage(DamagePlayerInRadius __instance)
        {
            // If this isn't radiation damage, don't handle
            if (__instance.damageType != DamageType.Radiation)
            {
                return(true);
            }

            if (__instance.enabled && __instance.gameObject.activeInHierarchy && __instance.damageRadius > 0f)
            {
                PlayerDistanceTracker tracker = (PlayerDistanceTracker)AccessTools.Field(typeof(DamagePlayerInRadius), "tracker").GetValue(__instance);
                float distanceToPlayer        = GetDistance(tracker);

                if (distanceToPlayer <= __instance.damageRadius)
                {
                    float radiationAmount = Player.main.radiationAmount;
                    if (radiationAmount == 0f)
                    {
                        return(false);
                    }
                    Player.main.GetComponent <LiveMixin>().TakeDamage(__instance.damageAmount, __instance.transform.position, __instance.damageType, null);
                }
            }

            return(false);
        }
Пример #3
0
        private static float GetDistance(PlayerDistanceTracker tracker)
        {
            // If the object is null, ship hasn't exploded yet or radius is too small
            if (!RadiationUtils.isSurfaceRadiationActive())
            {
                return(tracker.distanceToPlayer);
            }

            // How deep the player is
            float playerDepth    = Math.Max(0, -Player.main.transform.position.y);
            float radiationDepth = RadiationUtils.getRadiationDepth();

            // If they are deeper than the radiation, return
            if (playerDepth > radiationDepth)
            {
                return(tracker.distanceToPlayer);
            }

            // When radiation is fixed, avoid a "long tail-off" near the surface
            if (RadiationUtils.isRadiationFixed())
            {
                if (radiationDepth <= 15)
                {
                    return(tracker.distanceToPlayer);
                }
            }

            // A % of how close they are to getting out of radiation
            float playerRadiationStrength = playerDepth / radiationDepth;

            //ErrorMessage.AddMessage("Player: " + playerDepth + "   RadDepth: " + radiationDepth + "   RadStr: " + playerRadiationStrength + "   Dist: " + Math.Min(tracker.distanceToPlayer, tracker.maxDistance * playerRadiationStrength));

            return(Math.Min(tracker.distanceToPlayer, tracker.maxDistance * playerRadiationStrength));
        }
Пример #4
0
        private void Awake()
        {
            RadiationTrigger = new GameObject("RadiationTrigger");

            RadiationTrigger.transform.SetParent(transform, false);

            playerDistanceTracker = RadiationTrigger.EnsureComponent <PlayerDistanceTracker>();
            radiatePlayerInRange  = RadiationTrigger.EnsureComponent <RadiatePlayerInRange>();
            damagePlayerInRadius  = RadiationTrigger.EnsureComponent <DamagePlayerInRadius>();
        }
        private void Awake()
        {
            Debug.Log($"Awake({GetInstanceID()})");

            var sphereCollider = gameObject.AddComponent <SphereCollider>();

            sphereCollider.isTrigger = true;
            sphereCollider.radius    = radiateRadius;

            tracker             = gameObject.EnsureComponent <PlayerDistanceTracker>();
            tracker.maxDistance = 15f;
        }
        private static float GetDistance(PlayerDistanceTracker tracker)
        {
            // If the object is null, ship hasn't exploded yet or radius is too small
            if (!RadiationUtils.GetSurfaceRadiationActive())
            {
                return(tracker.distanceToPlayer);
            }

            // How deep the player is
            float playerDepth    = Math.Max(0, -Player.main.transform.position.y);
            float radiationDepth = RadiationUtils.GetRadiationDepth();

            // If they are deeper than the radiation, return
            if (playerDepth > radiationDepth)
            {
                return(tracker.distanceToPlayer);
            }

            // A % of how close they are to getting out of radiation
            float playerRadiationStrength = playerDepth / radiationDepth;

            return(Math.Min(tracker.distanceToPlayer, tracker.maxDistance * playerRadiationStrength));
        }
        public static bool DoDamage(DamagePlayerInRadius __instance)
        {
            // If this isn't radiation damage, don't handle
            if (__instance.damageType != DamageType.Radiation)
            {
                return(true);
            }

            if (__instance.enabled && __instance.gameObject.activeInHierarchy && __instance.damageRadius > 0f)
            {
                PlayerDistanceTracker tracker = (PlayerDistanceTracker)AccessTools.Field(typeof(DamagePlayerInRadius), "tracker").GetValue(__instance);
                float distanceToPlayer        = GetDistance(tracker);

                if (distanceToPlayer <= __instance.damageRadius)
                {
                    if (__instance.doDebug)
                    {
                        Debug.Log(string.Concat(new object[]
                        {
                            __instance.gameObject.name,
                            ".DamagePlayerInRadius() - dist/damageRadius: ",
                            distanceToPlayer,
                            "/",
                            __instance.damageRadius,
                            " => damageAmount: ",
                            __instance.damageAmount
                        }));
                    }

                    float radiationAmount = Player.main.radiationAmount;
                    if (radiationAmount == 0f)
                    {
                        return(false);
                    }

                    if (__instance.doDebug)
                    {
                        Debug.Log(string.Concat(new object[]
                        {
                            "TakeDamage: ",
                            __instance.damageAmount,
                            " ",
                            __instance.damageType.ToString()
                        }));
                    }
                    Player.main.GetComponent <LiveMixin>().TakeDamage(__instance.damageAmount, __instance.transform.position, __instance.damageType, null);
                }
                else if (__instance.doDebug)
                {
                    Debug.Log(string.Concat(new object[]
                    {
                        __instance.gameObject.name,
                        ".DamagePlayerInRadius() - dist/damageRadius: ",
                        distanceToPlayer,
                        "/",
                        __instance.damageRadius,
                        " => no damage"
                    }));
                }
            }

            return(false);
        }