public static void Postfix(WaterPark __instance) { PowerSource powerSource = __instance.gameObject.GetComponent <PowerSource>(); int numberOfShockers = __instance.items.FindAll((WaterParkItem item) => item.pickupable.GetTechType() == TechType.Shocker).Count; if (powerSource == null) { powerSource = __instance.gameObject.AddComponent <PowerSource>(); powerSource.maxPower = 100 * numberOfShockers; powerSource.power = PlayerPrefs.GetFloat($"PowerSource:{__instance.GetInstanceID()}", 0f); } else { powerSource.maxPower = 100 * numberOfShockers; } if (powerSource.GetPower() > powerSource.GetMaxPower()) { powerSource.power = powerSource.maxPower; } Config.PowerValues[$"PowerSource:{__instance.GetInstanceID()}"] = powerSource.GetPower(); }
public static void Postfix(WaterPark __instance) { List <WaterParkItem> powerCreatures = new List <WaterParkItem>(); float maxPower = 0; if (cachedItems.TryGetValue(__instance, out List <WaterParkItem> items) && items.Count == __instance.items.Count && cachedPowerCreatures.ContainsKey(__instance)) { powerCreatures.AddRange(cachedPowerCreatures[__instance]); foreach (var creature in cachedPowerCreatures[__instance]) { if (!creature.gameObject.TryGetComponent(out LiveMixin liveMixin) || !liveMixin.IsAlive()) { powerCreatures.Remove(creature); } } foreach (KeyValuePair <TechType, float> pair in Main.config.CreaturePowerGeneration) { List <WaterParkItem> creatures = __instance.items.FindAll((WaterParkItem item) => item.pickupable.GetTechType() == pair.Key) ?? new List <WaterParkItem>(); if (creatures.Count > 0) { maxPower += 500 * pair.Value * creatures.Count; } } cachedPowerCreatures[__instance] = powerCreatures; } else { foreach (KeyValuePair <TechType, float> pair in Main.config.CreaturePowerGeneration) { List <WaterParkItem> creatures = __instance.items.FindAll((WaterParkItem item) => item.pickupable.GetTechType() == pair.Key && (item.GetComponent <LiveMixin>()?.IsAlive() ?? false)) ?? new List <WaterParkItem>(); if (creatures.Count > 0) { maxPower += 500 * pair.Value * creatures.Count; powerCreatures.AddRange(creatures); } } cachedItems[__instance] = __instance.items; cachedPowerCreatures[__instance] = powerCreatures; } PowerSource powerSource = __instance?.itemsRoot?.gameObject?.GetComponent <PowerSource>(); if (powerSource is null) { powerSource = __instance?.itemsRoot?.gameObject?.AddComponent <PowerSource>(); powerSource.maxPower = maxPower; powerSource.power = Main.config.PowerValues.GetOrDefault($"PowerSource:{__instance.GetInstanceID()}", 0f); } else { if (powerSource.maxPower != maxPower) { powerSource.maxPower = maxPower; } if (powerSource.power > powerSource.maxPower) { powerSource.power = powerSource.maxPower; } Main.config.PowerValues[$"PowerSource:{__instance.GetInstanceID()}"] = powerSource.power; } timeSinceLastPositionCheck += Time.deltaTime; if (timeSinceLastPositionCheck > 0.5f) { foreach (WaterParkItem waterParkItem in __instance.items) { if (!__instance.IsPointInside(waterParkItem.transform.position)) { Vector3 position = waterParkItem.transform.position; __instance.EnsurePointIsInside(ref position); waterParkItem.transform.position = position; } } timeSinceLastPositionCheck = 0; } }