private void Awake()
    {
        m_Singleton = this;

        foreach (var herbivoreType in m_DisabledTypes)
        {
            Debug.Log("Note that " + herbivoreType + " is disabled.", this);
        }
    }
    private void ValidateHerbivoreCount()
    {
        Debug.Assert(HerbivoreMinimum <= HerbivoreLimit);

        while (CurrentHerbivoreCount > HerbivoreLimit)
        {
            KillHerbivore(m_Herbivores[EnumHelper.GetRandomEnum <HerbivoreType>()].First());
        }
        while (CurrentHerbivoreCount < HerbivoreMinimum)
        {
            var pos = Random.insideUnitSphere * CreatureSpawnExtent;
            SpawnHerbivore(pos, Quaternion.identity, HerbivoreFactory.GetRandomSpawnableIndividualType());
        }
    }
    public GameObject SpawnHerbivore(Vector3 pos, Quaternion rot, HerbivoreType type)
    {
        var herb = HerbivoreFactory.InstantiateHerbivore(pos, rot, type);

        herb.transform.SetParent(transform);
        NetworkServer.Spawn(herb.gameObject);

        if (!m_Herbivores.ContainsKey(type))
        {
            m_Herbivores.Add(type, new HashSet <HerbivoreBase>());
        }

        m_Herbivores[type].Add(herb);
        OctreeManager.Get(OctreeType.Herbivore).Add(herb.transform);
        return(herb.gameObject);
    }
    private void Start()
    {
        NetworkServer.SpawnObjects();
        if (!NetworkManager.singleton || !(DayClock)FindObjectOfType(typeof(DayClock)))
        {
            return;
        }
        if (!isServer)
        {
            return;
        }

        Player_ID.OnPlayerSetupComplete += OnPlayerJoined;
        NetworkServer.Spawn(gameObject);

        m_Nodules.SpawnNoduleController = (p, r, t) =>
        {
            var nod = NoduleFactory.InstantiateNodule(p, r, t);
            NetworkServer.Spawn(nod.gameObject);
            return(nod);
        };

        DataStore.OnDataChange += OnDataChange;

        var ssDataMap = DataStore.GetAllData();

        DataMap =
            ssDataMap.Select(kvp => new KeyValuePair <Data, string>((Data)Enum.Parse(typeof(Data), kvp.Key), kvp.Value))
            .ToDictionary(x => x.Key, x => x.Value);

        HerbivoreMinimum = DataStore.GetInt(Data.EcoHerbivoreMinimum);
        CarnivoreMinimum = DataStore.GetInt(Data.EcoCarnivoreMinimum);

        InitialFGLColonycount = DataStore.GetInt(Data.EcoInitialFGLColonyCount);
        InitialHerbivoreCount = DataStore.GetInt(Data.EcoInitialHerbivoreCount);
        InitialCarnivoreCount = DataStore.GetInt(Data.EcoInitialCarnivoreCount);

        NoduleLimit    = DataStore.GetInt(Data.EcoNoduleLimit);
        HerbivoreLimit = DataStore.GetInt(Data.EcoHerbivoreLimit);
        CarnivoreLimit = DataStore.GetInt(Data.EcoCarnivoreLimit);

        CreatureSpawnExtent    = DataStore.GetFloat(Data.EcoCreatureSpawnExtent);
        WorldExtent            = DataStore.GetFloat(Data.EcoWorldExtent);
        PlantSpawnExtentBuffer = DataStore.GetFloat(Data.EcoPlantSpawnExtentBuffer);

        Creature.PredationAllowed = DataStore.Get(Data.EcoPredation) == "on";

        DiscoverChildren();

        for (var i = 0; i < InitialFGLColonycount; i++)
        {
            var pos = Random.insideUnitSphere * (WorldExtent - PlantSpawnExtentBuffer);
            Debug.Log("Note that plant spawning is deactivated");
            //SpawnPlant(pos, Quaternion.identity, PlantType.FloatGrassLargeColony);
        }

        for (var i = 0; i < InitialHerbivoreCount; i++)
        {
            var pos = Random.insideUnitSphere * CreatureSpawnExtent;
            SpawnHerbivore(pos, Quaternion.identity, HerbivoreFactory.GetRandomSpawnableIndividualType());
        }

        for (var i = 0; i < InitialCarnivoreCount; i++)
        {
            var pos = Random.insideUnitSphere * CreatureSpawnExtent;
            SpawnCarnivore(pos, Quaternion.identity, EnumHelper.GetRandomEnum <CarnivoreType>());
        }

        InvokeRepeating("SyncCounts", SYNC_COUNTS_RATE, SYNC_COUNTS_RATE);
    }