Example #1
0
        /**
         * Either finds a free edict, or allocates a new one. Try to avoid reusing
         * an entity that was recently freed, because it can cause the client to
         * think the entity morphed into something else instead of being removed and
         * recreated, which can cause interpolated angles and bad trails.
         */
        public static edict_t G_Spawn()
        {
            int     i;
            edict_t e = null;

            for (i = (int)GameBase.maxclients.value + 1; i < GameBase.num_edicts; i++)
            {
                e = GameBase.g_edicts[i];

                // the first couple seconds of server time can involve a lot of
                // freeing and allocating, so relax the replacement policy
                if (!e.inuse && (e.freetime < 2 || GameBase.level.time - e.freetime > 0.5))
                {
                    e = GameBase.g_edicts[i] = new(i);
                    GameUtil.G_InitEdict(e, i);

                    return(e);
                }
            }

            if (i == GameBase.game.maxentities)
            {
                GameBase.gi.error("ED_Alloc: no free edicts");
            }

            e = GameBase.g_edicts[i] = new(i);
            GameBase.num_edicts++;
            GameUtil.G_InitEdict(e, i);

            return(e);
        }