void PoolGroup<Quest>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 triggerFrom) { TC_LOG_DEBUG(LOG_FILTER_POOLSYS, "PoolGroup<Quest>: Spawning pool %u", poolId); // load state from db if (!triggerFrom) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_POOL_QUEST_SAVE); stmt->setUInt32(0, poolId); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { do { uint32 questId = result->Fetch()[0].GetUInt32(); spawns.ActivateObject<Quest>(questId, poolId); PoolObject tempObj(questId, 0.0f); Spawn1Object(&tempObj); --limit; } while (result->NextRow() && limit); return; } } ActivePoolObjects currentQuests = spawns.GetActiveQuests(); ActivePoolObjects newQuests; // always try to select different quests for (PoolObjectList::iterator itr = EqualChanced.begin(); itr != EqualChanced.end(); ++itr) { if (spawns.IsActiveObject<Quest>(itr->guid)) continue; newQuests.insert(itr->guid); } // clear the pool DespawnObject(spawns); // recycle minimal amount of quests if possible count is lower than limit if (limit > newQuests.size() && !currentQuests.empty()) { do { uint32 questId = Trinity::Containers::SelectRandomContainerElement(currentQuests); newQuests.insert(questId); currentQuests.erase(questId); } while (newQuests.size() < limit && !currentQuests.empty()); // failsafe } if (newQuests.empty()) return; // activate <limit> random quests do { uint32 questId = Trinity::Containers::SelectRandomContainerElement(newQuests); spawns.ActivateObject<Quest>(questId, poolId); PoolObject tempObj(questId, 0.0f); Spawn1Object(&tempObj); newQuests.erase(questId); --limit; } while (limit && !newQuests.empty()); // if we are here it means the pool is initialized at startup and did not have previous saved state if (!triggerFrom) sPoolMgr->SaveQuestsToDB(); }
void PoolGroup<Quest>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 triggerFrom) { sLog.outDebug("PoolGroup<Quest>: Spawning pool %u", poolId); // load state from db if (!triggerFrom) { QueryResult result = CharacterDatabase.PQuery("SELECT quest_id FROM pool_quest_save WHERE pool_id = %u", poolId); if (result) { do { uint32 questId = result->Fetch()[0].GetUInt32(); spawns.ActivateObject<Quest>(questId, poolId); PoolObject tempObj(questId, 0.0f); Spawn1Object(&tempObj); --limit; } while (result->NextRow() && limit); return; } } ActivePoolObjects currentQuests = spawns.GetActiveQuests(); ActivePoolObjects newQuests; // always try to select different quests for (PoolObjectList::iterator itr = EqualChanced.begin(); itr != EqualChanced.end(); ++itr) { if (spawns.IsActiveObject<Quest>(itr->guid)) continue; newQuests.insert(itr->guid); } // clear the pool DespawnObject(spawns); // recycle minimal amount of quests if possible count is lower than limit if (limit > newQuests.size() && !currentQuests.empty()) { do { ActivePoolObjects::iterator itr = currentQuests.begin(); std::advance(itr, urand(0, currentQuests.size()-1)); newQuests.insert(*itr); currentQuests.erase(*itr); } while (newQuests.size() < limit && !currentQuests.empty()); // failsafe } if (newQuests.empty()) return; // activate <limit> random quests do { ActivePoolObjects::iterator itr = newQuests.begin(); std::advance(itr, urand(0, newQuests.size()-1)); spawns.ActivateObject<Quest>(*itr, poolId); PoolObject tempObj(*itr, 0.0f); Spawn1Object(&tempObj); newQuests.erase(itr); --limit; } while (limit && newQuests.size()); // if we are here it means the pool is initialized at startup and did not have previous saved state if (!triggerFrom) sPoolMgr.SaveQuestsToDB(); }