Exemple #1
0
    void Update()
    {
        if (nextUpdate > Time.time)
        {
            return;
        }

        nextUpdate = Time.time + 1;

        willRemove = new List <Callipso.GameSession>();

        int c = sessions.Count;

        for (int i = 0; i < c; i++)
        {
            if (sessions[i].isStarted && !sessions[i].killed)
            {
                List <Map.CreatureSpawn> cSpawns = MapLoader.maps[sessions[i].map].creatureSpawns;
                ushort lSpawns = (ushort)cSpawns.Count;

                for (ushort a = 0; a < lSpawns; a++)
                { // Spawn creatures
                    if (sessions[i].creatureSpawns[a] < Time.time)
                    {
                        sessions[i].creatureSpawns[a] = Time.time + cSpawns[a].spawnTime;

                        if (sessions[i].creatures.FindAll(x => x.spawner == a).Count < cSpawns [a].spawnCount)
                        {
                            MobileAgent creature = AISpawner.SpawnCreature(cSpawns[a].GetSpawnObject(), sessions[i]);
                            creature.spawner = a;
                            sessions[i].creatures.Add(creature);

                            /*
                             *  FIND A NON BLOCKED POSITION
                             * */

                            bool found = false;
                            for (int s = 0; s < 10; s++)
                            {
                                Vector3 tPos = cSpawns [a].spawnPoint + new Vector3(Random.Range(-cSpawns[a].spawnRange / 2, cSpawns[a].spawnRange / 2), 0, Random.Range(-cSpawns[a].spawnRange / 2, cSpawns[a].spawnRange / 2));
                                if (tPos.x <= 0 || tPos.x >= MapLoader.maps[sessions[i].map].mapSize || tPos.z <= 0 || tPos.z >= MapLoader.maps[sessions[i].map].mapSize)
                                {
                                    continue;
                                }

                                if (MapLoader.isPositionBlocked(sessions[i].map, tPos))
                                {
                                    continue;
                                }

                                creature.transform.position = tPos;
                                found = true;
                            }

                            if (!found)
                            {
                                creature.transform.position = cSpawns[a].spawnPoint;
                            }
                        }
                    }
                }
            }

            if (sessions[i].time < Time.time)
            {
                if (sessions[i].killed)
                {
                    willRemove.Add(sessions[i]);
                }

                if (sessions[i].isStarted)
                {
                    sessions[i].round++;

                    if (sessions[i].round > MapLoader.maps[sessions[i].map].roundCount)
                    {
                        // Game is over
                        sessions[i].Kill(!sessions [i].killed);
                    }
                    else
                    {
                        sessions[i].Start();
                    }
                }
                else
                {
                    if (sessions[i].agents.Count < MapLoader.maps [sessions[i].map].minPlayers)
                    {
                        sessions[i].time       = Time.time + MapLoader.maps[sessions[i].map].lobbyTime;
                        sessions[i].canAddBots = true;
                    }
                    else
                    {
                        sessions[i].Start();
                    }
                }
            }
        }

        c = willRemove.Count;
        for (int i = 0; i < c; i++)
        {
            sessions.Remove(willRemove[i]); // Remove the session from list;
        }
        c = sessions.Count;
        for (int i = 0; i < c; i++)
        {
            sessions[i].Update();
        }
    }