Files
Nitrox/NitroxClient/GameLogic/Spawning/Metadata/Processor/WaterParkCreatureMetadataProcessor.cs
2025-07-06 00:23:46 +02:00

56 lines
2.9 KiB
C#

using NitroxClient.GameLogic.Spawning.Metadata.Processor.Abstract;
using NitroxClient.MonoBehaviours;
using NitroxModel.DataStructures.GameLogic.Entities.Metadata;
using UnityEngine;
namespace NitroxClient.GameLogic.Spawning.Metadata.Processor;
public class WaterParkCreatureMetadataProcessor : EntityMetadataProcessor<WaterParkCreatureMetadata>
{
public override void ProcessMetadata(GameObject gameObject, WaterParkCreatureMetadata metadata)
{
if (!gameObject.TryGetComponent(out WaterParkCreature waterParkCreature))
{
Log.Error($"[{nameof(WaterParkCreatureMetadataProcessor)}] Could not find {nameof(WaterParkCreature)} on {gameObject.name}");
return;
}
if (waterParkCreature.currentWaterPark)
{
// MatureTime is important for fishes that are already in a WaterPark, to calculate the right age
waterParkCreature.matureTime = metadata.MatureTime;
double startTime = metadata.MatureTime - waterParkCreature.data.growingPeriod;
waterParkCreature.age = Mathf.InverseLerp((float)startTime, (float)metadata.MatureTime, DayNightCycle.main.timePassedAsFloat);
waterParkCreature.timeNextBreed = metadata.TimeNextBreed;
}
else
{
// Age is the only important constant for fishes that are in an item state
waterParkCreature.matureTime = -1;
waterParkCreature.age = metadata.Age;
waterParkCreature.timeNextBreed = -1;
}
// Scaling according to WaterParkCreature.ManagedUpdate
waterParkCreature.transform.localScale = Mathf.Lerp(waterParkCreature.data.initialSize, waterParkCreature.data.maxSize, waterParkCreature.age) * Vector3.one;
waterParkCreature.isMature = waterParkCreature.age == 1f;
waterParkCreature.bornInside = metadata.BornInside;
// This field is not serialized but is always the exact same so it's supposedly recomputed but it would break with our system
// (calculation from WaterParkCreature.ManagedUpdate)
waterParkCreature.breedInterval = waterParkCreature.data.growingPeriod * 0.5f;
// While being fully loaded, the base is inactive and coroutines shouldn't be started (they'll throw an exception)
// To avoid, that we postpone their execution to 1 more second which is enough because time is frozen during initial sync
// This is the mating condition from WaterParkCreature.ManagedUpdate to postpone mating
if (Multiplayer.Main && !Multiplayer.Main.InitialSyncCompleted && waterParkCreature.currentWaterPark && waterParkCreature.GetCanBreed() &&
waterParkCreature.timeNextBreed != -1 && DayNightCycle.main.timePassedAsFloat > waterParkCreature.timeNextBreed)
{
waterParkCreature.timeNextBreed = DayNightCycle.main.timePassedAsFloat + 1;
}
waterParkCreature.OnProtoDeserialize(null);
}
}