Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/EnviroVegetationInstance.cs
2026-02-21 16:45:37 +08:00

351 lines
7.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[AddComponentMenu("Enviro/Vegetation Growth Instance")]
public class EnviroVegetationInstance : MonoBehaviour
{
[HideInInspector]
public int id;
public EnviroVegetationAge Age;
public EnviroVegetationSeasons Seasons;
public List<EnviroVegetationStage> GrowStages = new List<EnviroVegetationStage>();
public Vector3 minScale = new Vector3(0.1f, 0.1f, 0.1f);
public Vector3 maxScale = new Vector3(1f, 1f, 1f);
public float GrowSpeedMod = 1f;
public GameObject DeadPrefab;
public Color GizmoColor = new Color(255f, 0f, 0f, 255f);
public float GizmoSize = 0.5f;
private SeasonVariables.Seasons currentSeason;
private float ageInHours;
private float maxAgeInHours;
private int currentStage;
private GameObject currentVegetationObject;
private bool stay;
private bool reBirth;
private bool rescale = true;
private bool canGrow = true;
private bool shrink;
private void Start()
{
EnviroSky.instance.RegisterMe(this);
currentSeason = EnviroSky.instance.Seasons.currentSeasons;
maxAgeInHours = EnviroSky.instance.GetInHours(Age.maxAgeHours, Age.maxAgeDays, Age.maxAgeYears);
EnviroSky.instance.OnSeasonChanged += delegate
{
SetSeason();
};
if (Age.randomStartAge)
{
Age.startAgeinHours = Random.Range(0f, maxAgeInHours);
Age.randomStartAge = false;
}
Birth(0, Age.startAgeinHours);
}
private void OnEnable()
{
if (GrowStages.Count < 1)
{
Debug.LogError("Please setup GrowStages!");
base.enabled = false;
}
for (int i = 0; i < GrowStages.Count; i++)
{
if (GrowStages[i].GrowGameobjectAutumn == null || GrowStages[i].GrowGameobjectSpring == null || GrowStages[i].GrowGameobjectSummer == null || GrowStages[i].GrowGameobjectWinter == null)
{
Debug.LogError("One ore more GrowStages missing GrowPrefabs!");
base.enabled = false;
}
}
}
private void SetSeason()
{
currentSeason = EnviroSky.instance.Seasons.currentSeasons;
VegetationChange();
}
public void KeepVariablesClear()
{
GrowStages[0].minAgePercent = 0f;
for (int i = 0; i < GrowStages.Count; i++)
{
if (GrowStages[i].minAgePercent > 100f)
{
GrowStages[i].minAgePercent = 100f;
}
}
}
public void UpdateInstance()
{
if (reBirth)
{
Birth(0, 0f);
}
if (shrink)
{
ShrinkAndDeactivate();
}
if (canGrow)
{
UpdateGrowth();
}
}
public void UpdateGrowth()
{
ageInHours = EnviroSky.instance.currentTimeInHours - Age.birthdayInHours;
KeepVariablesClear();
if (stay)
{
return;
}
if (currentStage + 1 < GrowStages.Count)
{
if (maxAgeInHours * (GrowStages[currentStage + 1].minAgePercent / 100f) <= ageInHours && ageInHours > 0f)
{
currentStage++;
VegetationChange();
}
else if (GrowStages[currentStage].growAction == EnviroVegetationStage.GrowState.Grow)
{
CalculateScale();
}
}
else
{
if (stay)
{
return;
}
if (ageInHours > maxAgeInHours)
{
if (Age.Loop)
{
currentVegetationObject.SetActive(false);
if (DeadPrefab != null)
{
DeadPrefabLoop();
}
else
{
Birth(Age.LoopFromGrowStage, 0f);
}
}
else
{
stay = true;
}
}
else if (GrowStages[currentStage].growAction == EnviroVegetationStage.GrowState.Grow)
{
CalculateScale();
}
}
}
private void DeadPrefabLoop()
{
stay = true;
GameObject gameObject = Object.Instantiate(DeadPrefab, base.transform.position, base.transform.rotation);
gameObject.transform.localScale = currentVegetationObject.transform.localScale;
Birth(Age.LoopFromGrowStage, 0f);
stay = false;
}
private IEnumerator BirthColliders()
{
Collider[] colliders = currentVegetationObject.GetComponentsInChildren<Collider>();
for (int i = 0; i < colliders.Length; i++)
{
colliders[i].enabled = false;
}
yield return new WaitForSeconds(10f);
for (int j = 0; j < colliders.Length; j++)
{
colliders[j].enabled = true;
}
}
private void CalculateScale()
{
if (rescale)
{
currentVegetationObject.transform.localScale = minScale;
rescale = false;
}
float num = ageInHours / maxAgeInHours * GrowSpeedMod;
currentVegetationObject.transform.localScale = minScale + new Vector3(num, num, num);
if (currentVegetationObject.transform.localScale.y > maxScale.y)
{
currentVegetationObject.transform.localScale = maxScale;
}
if (currentVegetationObject.transform.localScale.y < minScale.y)
{
currentVegetationObject.transform.localScale = minScale;
}
}
public void Birth(int stage, float startAge)
{
Age.birthdayInHours = EnviroSky.instance.currentTimeInHours - startAge;
startAge = 0f;
ageInHours = 0f;
currentStage = stage;
rescale = true;
reBirth = false;
VegetationChange();
StartCoroutine(BirthColliders());
}
private void SeasonAction()
{
if (Seasons.seasonAction == EnviroVegetationSeasons.SeasonAction.SpawnDeadPrefab)
{
if (DeadPrefab != null)
{
GameObject gameObject = Object.Instantiate(DeadPrefab, base.transform.position, base.transform.rotation);
gameObject.transform.localScale = currentVegetationObject.transform.localScale;
}
currentVegetationObject.SetActive(false);
}
else if (Seasons.seasonAction == EnviroVegetationSeasons.SeasonAction.Deactivate)
{
shrink = true;
}
else if (Seasons.seasonAction == EnviroVegetationSeasons.SeasonAction.Destroy)
{
Object.Destroy(base.gameObject);
}
}
private void CheckSeason(bool update)
{
if (!update && canGrow)
{
SeasonAction();
canGrow = false;
}
else if (update && !canGrow)
{
canGrow = true;
reBirth = true;
}
else if (!update && !canGrow)
{
SeasonAction();
}
}
private void ShrinkAndDeactivate()
{
if (currentVegetationObject.transform.localScale.y > minScale.y)
{
currentVegetationObject.transform.localScale = new Vector3(currentVegetationObject.transform.localScale.x - 0.1f * Time.deltaTime, currentVegetationObject.transform.localScale.y - 0.1f * Time.deltaTime, currentVegetationObject.transform.localScale.z - 0.1f * Time.deltaTime);
return;
}
shrink = false;
currentVegetationObject.SetActive(false);
}
public void VegetationChange()
{
canGrow = true;
if (currentVegetationObject != null)
{
currentVegetationObject.SetActive(false);
}
switch (currentSeason)
{
case SeasonVariables.Seasons.Spring:
currentVegetationObject = GrowStages[currentStage].GrowGameobjectSpring;
CalculateScale();
currentVegetationObject.SetActive(true);
if (!Seasons.GrowInSpring)
{
CheckSeason(false);
}
else if (Seasons.GrowInSpring)
{
CheckSeason(true);
}
break;
case SeasonVariables.Seasons.Summer:
currentVegetationObject = GrowStages[currentStage].GrowGameobjectSummer;
CalculateScale();
currentVegetationObject.SetActive(true);
if (!Seasons.GrowInSummer)
{
CheckSeason(false);
}
else if (Seasons.GrowInSummer)
{
CheckSeason(true);
}
break;
case SeasonVariables.Seasons.Autumn:
currentVegetationObject = GrowStages[currentStage].GrowGameobjectAutumn;
CalculateScale();
currentVegetationObject.SetActive(true);
if (!Seasons.GrowInAutumn)
{
CheckSeason(false);
}
else if (Seasons.GrowInAutumn)
{
CheckSeason(true);
}
break;
case SeasonVariables.Seasons.Winter:
currentVegetationObject = GrowStages[currentStage].GrowGameobjectWinter;
CalculateScale();
currentVegetationObject.SetActive(true);
if (!Seasons.GrowInWinter)
{
CheckSeason(false);
}
else if (Seasons.GrowInWinter)
{
CheckSeason(true);
}
break;
}
}
private void LateUpdate()
{
if (GrowStages[currentStage].billboard && canGrow)
{
base.transform.rotation = Camera.main.transform.rotation;
}
}
private void OnDrawGizmos()
{
Gizmos.color = GizmoColor;
Gizmos.DrawCube(base.transform.position, new Vector3(GizmoSize, GizmoSize, GizmoSize));
}
}