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); }
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); }
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)); }
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); }