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