Ejemplo n.º 1
0
        public void SpawnObject(ActivePoolData spawns, uint limit, ulong triggerFrom)
        {
            if (typeof(T).Name == "Quest")
            {
                SpawnQuestObject(spawns, limit, triggerFrom);
                return;
            }

            ulong lastDespawned = 0;
            int   count         = (int)(limit - spawns.GetActiveObjectCount(poolId));

            // If triggered from some object respawn this object is still marked as spawned
            // and also counted into m_SpawnedPoolAmount so we need increase count to be
            // spawned by 1
            if (triggerFrom != 0)
            {
                ++count;
            }

            // This will try to spawn the rest of pool, not guaranteed
            for (int i = 0; i < count; ++i)
            {
                PoolObject obj = RollOne(spawns, triggerFrom);
                if (obj == null)
                {
                    continue;
                }
                if (obj.guid == lastDespawned)
                {
                    continue;
                }

                if (obj.guid == triggerFrom)
                {
                    ReSpawn1Object(obj);
                    triggerFrom = 0;
                    continue;
                }
                spawns.ActivateObject <T>(obj.guid, poolId);
                Spawn1Object(obj);

                if (triggerFrom != 0)
                {
                    // One spawn one despawn no count increase
                    DespawnObject(spawns, triggerFrom);
                    lastDespawned = triggerFrom;
                    triggerFrom   = 0;
                }
            }
        }
Ejemplo n.º 2
0
        public void SpawnObject(ActivePoolData spawns, uint limit, ulong triggerFrom)
        {
            if (typeof(T).Name == "Quest")
            {
                SpawnQuestObject(spawns, limit, triggerFrom);
                return;
            }

            int count = (int)(limit - spawns.GetActiveObjectCount(poolId));

            // If triggered from some object respawn this object is still marked as spawned
            // and also counted into m_SpawnedPoolAmount so we need increase count to be
            // spawned by 1
            if (triggerFrom != 0)
            {
                ++count;
            }

            // This will try to spawn the rest of pool, not guaranteed
            if (count > 0)
            {
                List <PoolObject> rolledObjects = new List <PoolObject>();

                // roll objects to be spawned
                if (!ExplicitlyChanced.Empty())
                {
                    while (count != 0 && ExplicitlyChanced.Count > rolledObjects.Count)
                    {
                        --count;
                        float roll = (float)RandomHelper.randChance();

                        foreach (PoolObject obj in ExplicitlyChanced)
                        {
                            roll -= obj.chance;
                            // Triggering object is marked as spawned at this time and can be also rolled (respawn case)
                            // so this need explicit check for this case
                            if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject <T>(obj.guid)))
                            {
                                rolledObjects.Add(obj);
                                break;
                            }
                        }
                    }
                }
                else if (!EqualChanced.Empty())
                {
                    rolledObjects = EqualChanced;

                    for (var i = 0; i < rolledObjects.Count; ++i)
                    {
                        var obj = rolledObjects[i];
                        // remove most of the active objects so there is higher chance inactive ones are spawned
                        if (spawns.IsActiveObject <T>(obj.guid) && RandomHelper.URand(1, 4) != 1)
                        {
                            rolledObjects.Remove(obj);
                        }
                    }

                    rolledObjects.RandomResize((uint)count);
                }

                // try to spawn rolled objects
                foreach (PoolObject obj in rolledObjects)
                {
                    if (spawns.IsActiveObject <T>(obj.guid))
                    {
                        continue;
                    }

                    if (obj.guid == triggerFrom)
                    {
                        ReSpawn1Object(obj);
                        triggerFrom = 0;
                    }
                    else
                    {
                        spawns.ActivateObject <T>(obj.guid, poolId);
                        Spawn1Object(obj);
                    }
                }
            }

            // One spawn one despawn no count increase
            if (triggerFrom != 0)
            {
                DespawnObject(spawns, triggerFrom);
            }
        }