void GameEventMgr::LoadFromDB() { { QueryResult* result = WorldDatabase.Query("SELECT MAX(entry) FROM game_event"); if (!result) { sLog.outString(">> Table game_event is empty."); sLog.outString(); return; } Field* fields = result->Fetch(); uint32 max_event_id = fields[0].GetUInt16(); delete result; mGameEvent.resize(max_event_id + 1); } QueryResult* result = WorldDatabase.Query("SELECT entry,UNIX_TIMESTAMP(start_time),UNIX_TIMESTAMP(end_time),occurence,length,holiday,linkedTo,description FROM game_event"); if (!result) { mGameEvent.clear(); sLog.outString(">> Table game_event is empty!"); sLog.outString(); return; } uint32 count = 0; { BarGoLink bar(result->GetRowCount()); do { Field* fields = result->Fetch(); bar.step(); uint16 event_id = fields[0].GetUInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.", event_id); continue; } GameEventData& pGameEvent = mGameEvent[event_id]; uint64 starttime = fields[1].GetUInt64(); pGameEvent.start = time_t(starttime); uint64 endtime = fields[2].GetUInt64(); pGameEvent.end = time_t(endtime); pGameEvent.occurence = fields[3].GetUInt32(); pGameEvent.length = fields[4].GetUInt32(); pGameEvent.holiday_id = HolidayIds(fields[5].GetUInt32()); pGameEvent.linkedTo = fields[6].GetUInt32(); pGameEvent.description = fields[7].GetCppString(); if (pGameEvent.occurence == 0) { sLog.outBasic("Event %u (%s) disabled", event_id, pGameEvent.description.c_str()); pGameEvent.start = time_t(FAR_FUTURE); pGameEvent.occurence = pGameEvent.length; } if (pGameEvent.length == 0) // length>0 is validity check { sLog.outErrorDb("`game_event` game event id (%i) have length 0 and can't be used.", event_id); pGameEvent.start = time_t(FAR_FUTURE); } if (pGameEvent.occurence < pGameEvent.length) // occurence < length is useless. This also asserts that occurence > 0! { sLog.outErrorDb("`game_event` game event id (%i) has occurence %u < length %u and can't be used.", event_id, pGameEvent.occurence, pGameEvent.length); pGameEvent.start = time_t(FAR_FUTURE); } ++count; } while (result->NextRow()); delete result; for (uint16 itr = 1; itr < mGameEvent.size(); ++itr) { if (mGameEvent[itr].isValid() && mGameEvent[itr].linkedTo != 0 && (mGameEvent[itr].linkedTo >= mGameEvent.size() || mGameEvent[itr].linkedTo < 0 || !mGameEvent[mGameEvent[itr].linkedTo].isValid())) { sLog.outErrorDb("`game_event` game event id (%i) is Linked to invalid event %u", itr, mGameEvent[itr].linkedTo); mGameEvent[itr].linkedTo = 0; } } sLog.outString(); sLog.outString(">> Loaded %u game events", count); } std::map<uint16, int16> pool2event; // for check unique spawn event associated with pool std::map<uint32, int16> creature2event; // for check unique spawn event associated with creature std::map<uint32, int16> go2event; // for check unique spawn event associated with gameobject // list only positive event top pools, filled at creature/gameobject loading mGameEventSpawnPoolIds.resize(mGameEvent.size()); mGameEventCreatureGuids.resize(mGameEvent.size() * 2 - 1); // 1 2 result = WorldDatabase.Query("SELECT creature.guid, game_event_creature.event " "FROM creature JOIN game_event_creature ON creature.guid = game_event_creature.guid"); count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u creatures in game events", count); } else { BarGoLink bar(result->GetRowCount()); do { Field* fields = result->Fetch(); bar.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event_creature` game event id (%i) not allowed", event_id); continue; } if (!IsValidEvent(std::abs(event_id))) { sLog.outErrorDb("`game_event_creature` game event id (%i) not exist in `game_event`", event_id); continue; } int32 internal_event_id = mGameEvent.size() + event_id - 1; ++count; // spawn objects at event can be grouped in pools and then affected pools have stricter requirements for this case if (event_id > 0) { creature2event[guid] = event_id; // not list explicitly creatures from pools in event creature list if (uint16 topPoolId = sPoolMgr.IsPartOfTopPool<Creature>(guid)) { int16& eventRef = pool2event[topPoolId]; if (eventRef != 0) { if (eventRef != event_id) sLog.outErrorDb("`game_event_creature` have creature (GUID: %u) for event %i from pool or subpool of pool (ID: %u) but pool have already content from event %i. Pool don't must have content for different events!", guid, event_id, topPoolId, eventRef); } else { eventRef = event_id; mGameEventSpawnPoolIds[event_id].push_back(topPoolId); sPoolMgr.RemoveAutoSpawnForPool(topPoolId); } continue; } } GuidList& crelist = mGameEventCreatureGuids[internal_event_id]; crelist.push_back(guid); } while (result->NextRow()); delete result; sLog.outString(); sLog.outString(">> Loaded %u creatures in game events", count); } mGameEventGameobjectGuids.resize(mGameEvent.size() * 2 - 1); // 1 2 result = WorldDatabase.Query("SELECT gameobject.guid, game_event_gameobject.event " "FROM gameobject JOIN game_event_gameobject ON gameobject.guid=game_event_gameobject.guid"); count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u gameobjects in game events", count); } else { BarGoLink bar(result->GetRowCount()); do { Field* fields = result->Fetch(); bar.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event_gameobject` game event id (%i) not allowed", event_id); continue; } if (!IsValidEvent(std::abs(event_id))) { sLog.outErrorDb("`game_event_gameobject` game event id (%i) not exist in `game_event`", event_id); continue; } int32 internal_event_id = mGameEvent.size() + event_id - 1; ++count; // spawn objects at event can be grouped in pools and then affected pools have stricter requirements for this case if (event_id > 0) { go2event[guid] = event_id; // not list explicitly gameobjects from pools in event gameobject list if (uint16 topPoolId = sPoolMgr.IsPartOfTopPool<GameObject>(guid)) { int16& eventRef = pool2event[topPoolId]; if (eventRef != 0) { if (eventRef != event_id) sLog.outErrorDb("`game_event_gameobject` have gameobject (GUID: %u) for event %i from pool or subpool of pool (ID: %u) but pool have already content from event %i. Pool don't must have content for different events!", guid, event_id, topPoolId, eventRef); } else { eventRef = event_id; mGameEventSpawnPoolIds[event_id].push_back(topPoolId); sPoolMgr.RemoveAutoSpawnForPool(topPoolId); } continue; } } GuidList& golist = mGameEventGameobjectGuids[internal_event_id]; golist.push_back(guid); } while (result->NextRow()); delete result; sLog.outString(); sLog.outString(">> Loaded %u gameobjects in game events", count); } // now recheck that all eventPools linked with events after our skip pools with parents for (std::map<uint16, int16>::const_iterator itr = pool2event.begin(); itr != pool2event.end(); ++itr) { uint16 pool_id = itr->first; int16 event_id = itr->second; sPoolMgr.CheckEventLinkAndReport(pool_id, event_id, creature2event, go2event); } mGameEventCreatureData.resize(mGameEvent.size()); // 0 1 2 result = WorldDatabase.Query("SELECT creature.guid, game_event_creature_data.event, game_event_creature_data.modelid," // 3 4 "game_event_creature_data.equipment_id, game_event_creature_data.entry_id, " // 5 6 "game_event_creature_data.spell_start, game_event_creature_data.spell_end " "FROM creature JOIN game_event_creature_data ON creature.guid=game_event_creature_data.guid"); count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u creature reactions at game events", count); } else { BarGoLink bar(result->GetRowCount()); do { Field* fields = result->Fetch(); bar.step(); uint32 guid = fields[0].GetUInt32(); uint16 event_id = fields[1].GetUInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event_creature_data` game event id (%i) is reserved and can't be used." , event_id); continue; } if (!IsValidEvent(event_id)) { sLog.outErrorDb("`game_event_creature_data` game event id (%u) not exist in `game_event`", event_id); continue; } ++count; GameEventCreatureDataList& equiplist = mGameEventCreatureData[event_id]; GameEventCreatureData newData; newData.modelid = fields[2].GetUInt32(); newData.equipment_id = fields[3].GetUInt32(); newData.entry_id = fields[4].GetUInt32(); newData.spell_id_start = fields[5].GetUInt32(); newData.spell_id_end = fields[6].GetUInt32(); if (newData.equipment_id && !sObjectMgr.GetEquipmentInfo(newData.equipment_id)) { sLog.outErrorDb("Table `game_event_creature_data` have creature (Guid: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", guid, newData.equipment_id); newData.equipment_id = 0; } if (newData.entry_id && !ObjectMgr::GetCreatureTemplate(newData.entry_id)) { sLog.outErrorDb("Table `game_event_creature_data` have creature (Guid: %u) with event time entry %u not found in table `creature_template`, set to no 0.", guid, newData.entry_id); newData.entry_id = 0; } if (newData.spell_id_start && !sSpellTemplate.LookupEntry<SpellEntry>(newData.spell_id_start)) { sLog.outErrorDb("Table `game_event_creature_data` have creature (Guid: %u) with nonexistent spell_start %u, set to no start spell.", guid, newData.spell_id_start); newData.spell_id_start = 0; } if (newData.spell_id_end && !sSpellTemplate.LookupEntry<SpellEntry>(newData.spell_id_end)) { sLog.outErrorDb("Table `game_event_creature_data` have creature (Guid: %u) with nonexistent spell_end %u, set to no end spell.", guid, newData.spell_id_end); newData.spell_id_end = 0; } equiplist.push_back(GameEventCreatureDataPair(guid, newData)); mGameEventCreatureDataPerGuid.insert(GameEventCreatureDataPerGuidMap::value_type(guid, event_id)); } while (result->NextRow()); delete result; sLog.outString(); sLog.outString(">> Loaded %u creature reactions at game events", count); } mGameEventQuests.resize(mGameEvent.size()); result = WorldDatabase.Query("SELECT quest, event FROM game_event_quest"); count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u quests additions in game events", count); } else { BarGoLink bar(result->GetRowCount()); do { Field* fields = result->Fetch(); bar.step(); uint32 quest = fields[0].GetUInt32(); uint16 event_id = fields[1].GetUInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event_quest` game event id (%i) is reserved and can't be used.", event_id); continue; } if (!IsValidEvent(event_id)) { sLog.outErrorDb("`game_event_quest` game event id (%u) not exist in `game_event`", event_id); continue; } const Quest* pQuest = sObjectMgr.GetQuestTemplate(quest); if (!pQuest) { sLog.outErrorDb("Table `game_event_quest` contain entry for quest %u (event %u) but this quest does not exist. Skipping.", quest, event_id); continue; } // disable any event specific quest (for cases where creature is spawned, but event not active). const_cast<Quest*>(pQuest)->SetQuestActiveState(false); ++count; QuestList& questlist = mGameEventQuests[event_id]; questlist.push_back(quest); } while (result->NextRow()); delete result; sLog.outString(); sLog.outString(">> Loaded %u quest additions in game events", count); } mGameEventMails.resize(mGameEvent.size() * 2 - 1); result = WorldDatabase.Query("SELECT event, raceMask, quest, mailTemplateId, senderEntry FROM game_event_mail"); count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u start/end game event mails", count); } else { BarGoLink bar(result->GetRowCount()); do { Field* fields = result->Fetch(); bar.step(); uint16 event_id = fields[0].GetUInt16(); GameEventMail mail; mail.raceMask = fields[1].GetUInt32(); mail.questId = fields[2].GetUInt32(); mail.mailTemplateId = fields[3].GetUInt32(); mail.senderEntry = fields[4].GetUInt32(); if (event_id == 0) { sLog.outErrorDb("`game_event_mail` game event id (%i) not allowed", event_id); continue; } if (!IsValidEvent(event_id)) { sLog.outErrorDb("`game_event_mail` game event id (%u) not exist in `game_event`", event_id); continue; } int32 internal_event_id = mGameEvent.size() + event_id - 1; if (!(mail.raceMask & RACEMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Table `game_event_mail` have raceMask (%u) requirement for game event %i that not include any player races, ignoring.", mail.raceMask, event_id); continue; } if (mail.questId && !sObjectMgr.GetQuestTemplate(mail.questId)) { sLog.outErrorDb("Table `game_event_mail` have nonexistent quest (%u) requirement for game event %i, ignoring.", mail.questId, event_id); continue; } if (!sMailTemplateStore.LookupEntry(mail.mailTemplateId)) { sLog.outErrorDb("Table `game_event_mail` have invalid mailTemplateId (%u) for game event %i that invalid not include any player races, ignoring.", mail.mailTemplateId, event_id); continue; } if (!ObjectMgr::GetCreatureTemplate(mail.senderEntry)) { sLog.outErrorDb("Table `game_event_mail` have nonexistent sender creature entry (%u) for game event %i that invalid not include any player races, ignoring.", mail.senderEntry, event_id); continue; } ++count; MailList& maillist = mGameEventMails[internal_event_id]; maillist.push_back(mail); } while (result->NextRow()); delete result; sLog.outString(); sLog.outString(">> Loaded %u start/end game event mails", count); } }
void GameEventMgr::LoadFromDB() { // Clean event_saves from CharacterDB Log.Notice("GameEventMgr", "Start cleaning event_save"); { const char* cleanEventSaveQuery = "DELETE FROM event_save WHERE state<>4"; CharacterDatabase.Execute(cleanEventSaveQuery); } // Loading event_names { const char* loadAllEventsQuery = "SELECT entry, UNIX_TIMESTAMP(start_time), UNIX_TIMESTAMP(end_time), occurence,\ length, holiday, description, world_event, announce\ FROM event_names WHERE entry > 0"; QueryResult* result = WorldDatabase.Query(loadAllEventsQuery); if (!result) { //mGameEvent.clear(); Log.Error("GameEventMgr", "Query failed: %s", loadAllEventsQuery); return; } uint32 pCount = 0; do { Field* field = result->Fetch(); EventNamesQueryResult dbResult; dbResult.entry = field[0].GetUInt32(); dbResult.start_time = field[1].GetUInt32(); dbResult.end_time = field[2].GetUInt32(); dbResult.occurence = field[3].GetUInt32(); dbResult.length = field[4].GetUInt32(); dbResult.holiday_id = HolidayIds(field[5].GetUInt32()); dbResult.description = field[6].GetString(); dbResult.world_event = GameEventState(field[7].GetUInt8()); dbResult.announce = field[8].GetUInt8(); GameEvent gameEvent = GameEvent(dbResult); //if (gameEvent.isValid()) //{ mGameEvents.insert(std::make_pair(dbResult.entry, new GameEvent(dbResult))); Log.Debug("GameEventMgr", "%s, Entry: %u, State: %u, Holiday: %u loaded", dbResult.description.c_str(), dbResult.entry, dbResult.world_event, dbResult.holiday_id); ++pCount; //} //else //{ // Log.Debug("GameEventMgr", "%s game event Entry: %u isn't a world event and has length = 0, thus it can't be used.", dbResult.description.c_str(), dbResult.entry); //} } while (result->NextRow()); delete result; Log.Success("GameEventMgr", "%u events loaded from table event_names", pCount); } // Loading event_saves from CharacterDB Log.Notice("GameEventMgr", "Start loading event_save"); { const char* loadEventSaveQuery = "SELECT event_entry, state, next_start FROM event_save"; bool success = false; QueryResult* result = CharacterDatabase.Query(&success, loadEventSaveQuery); if (!success) { Log.Error("GameEventMgr", "Query failed: %s", loadEventSaveQuery); return; } uint32 pCount = 0; if (result) { do { Field* field = result->Fetch(); uint32 event_id = field[0].GetUInt8(); auto gameEvent = GetEventById(event_id); if (gameEvent == nullptr) { Log.Error("GameEventMgr", "Could not find event for event_save entry %u", event_id); continue; } gameEvent->state = (GameEventState)(field[1].GetUInt8()); gameEvent->nextstart = time_t(field[2].GetUInt32()); ++pCount; } while (result->NextRow()); delete result; } Log.Success("GameEventMgr", "Loaded %u saved events loaded from table event_saves", pCount); } // Loading event_creature from WorldDB Log.Notice("GameEventMgr", "Start loading game event creature spawns"); { const char* loadEventCreatureSpawnsQuery = "SELECT event_entry, id, entry, map, position_x, position_y, position_z, \ orientation, movetype, displayid, faction, flags, bytes0, bytes1, bytes2, \ emote_state, npc_respawn_link, channel_spell, channel_target_sqlid, \ channel_target_sqlid_creature, standstate, death_state, mountdisplayid, \ slot1item, slot2item, slot3item, CanFly, phase, waypoint_group \ FROM event_creature_spawns"; bool success = false; QueryResult* result = WorldDatabase.Query(&success, loadEventCreatureSpawnsQuery); if (!success) { Log.Error("GameEventMgr", "Query failed: %s", loadEventCreatureSpawnsQuery); return; } uint32 pCount = 0; if (result) { do { Field* field = result->Fetch(); uint32 event_id = field[0].GetUInt32(); auto gameEvent = GetEventById(event_id); if (gameEvent == nullptr) { Log.Error("GameEventMgr", "Could not find event for event_creature_spawns entry %u", event_id); continue; } EventCreatureSpawnsQueryResult dbResult; dbResult.event_entry = field[0].GetUInt32(); dbResult.id = field[1].GetUInt32(); dbResult.entry = field[2].GetUInt32(); auto creature_info = sMySQLStore.GetCreatureInfo(dbResult.entry); if (creature_info == nullptr) { Log.Error("GameEventMgr", "Could not create CreatureSpawn for invalid entry %u (missing in table creature_names)", dbResult.entry); continue; } dbResult.map_id = field[3].GetUInt16(); dbResult.position_x = field[4].GetFloat(); dbResult.position_y = field[5].GetFloat(); dbResult.position_z = field[6].GetFloat(); dbResult.orientation = field[7].GetFloat(); dbResult.movetype = field[8].GetUInt8(); dbResult.displayid = field[9].GetUInt32(); dbResult.faction = field[10].GetUInt32(); dbResult.flags = field[11].GetUInt32(); dbResult.bytes0 = field[12].GetUInt32(); dbResult.bytes1 = field[13].GetUInt32(); dbResult.bytes2 = field[14].GetUInt32(); dbResult.emote_state = field[15].GetUInt16(); dbResult.npc_respawn_link = field[16].GetUInt32(); dbResult.channel_spell = field[17].GetUInt32(); dbResult.channel_target_sqlid = field[18].GetUInt32(); dbResult.channel_target_sqlid_creature = field[19].GetUInt32(); dbResult.standstate = field[20].GetUInt8(); dbResult.death_state = field[21].GetUInt8(); dbResult.mountdisplayid = field[22].GetUInt32(); dbResult.slot1item = field[23].GetUInt32(); dbResult.slot2item = field[24].GetUInt32(); dbResult.slot3item = field[25].GetUInt32(); dbResult.CanFly = field[26].GetUInt16(); dbResult.phase = field[27].GetUInt32(); dbResult.waypoint_group = field[28].GetUInt32(); gameEvent->npc_data.push_back(dbResult); ++pCount; //mNPCGuidList.insert(NPCGuidList::value_type(event_id, id)); } while (result->NextRow()); delete result; } Log.Success("GameEventMgr", "%u creature spawns for %u events from table event_creature_spawns loaded.", pCount, mGameEvents.size()); } // Loading event_gameobject from WorldDB Log.Notice("GameEventMgr", "Start loading game event gameobject spawns"); { const char* loadEventGameobjectSpawnsQuery = "SELECT event_entry, id, entry, map, position_x, position_y, \ position_z, facing, orientation1, orientation2, orientation3, \ orientation4, state, flags, faction, scale, respawnNpcLink, phase, \ overrides FROM event_gameobject_spawns"; bool success = false; QueryResult* result = WorldDatabase.Query(&success, loadEventGameobjectSpawnsQuery); if (!success) { Log.Error("GameEventMgr", "Query failed: %s", loadEventGameobjectSpawnsQuery); return; } uint32 pCount = 0; if (result) { do { Field* field = result->Fetch(); uint32 event_id = field[0].GetUInt32(); auto gameEvent = GetEventById(event_id); if (gameEvent == nullptr) { Log.Error("GameEventMgr", "Could not find event for event_gameobject_spawns entry %u", event_id); continue; } EventGameObjectSpawnsQueryResult dbResult; dbResult.event_entry = field[0].GetUInt32(); dbResult.id = field[1].GetUInt32(); dbResult.entry = field[2].GetUInt32(); auto gameobject_info = sMySQLStore.GetGameObjectInfo(dbResult.entry); if (gameobject_info == nullptr) { Log.Error("GameEventMgr", "Could not create GameobjectSpawn for invalid entry %u (missing in table gameobject_names)", dbResult.entry); continue; } dbResult.map_id = field[3].GetUInt32(); dbResult.position_x = field[4].GetFloat(); dbResult.position_y = field[5].GetFloat(); dbResult.position_z = field[6].GetFloat(); dbResult.facing = field[7].GetFloat(); dbResult.orientation1 = field[8].GetFloat(); dbResult.orientation2 = field[9].GetFloat(); dbResult.orientation3 = field[10].GetFloat(); dbResult.orientation4 = field[11].GetFloat(); dbResult.state = field[12].GetUInt32(); dbResult.flags = field[13].GetUInt32(); dbResult.faction = field[14].GetUInt32(); dbResult.scale = field[15].GetFloat(); dbResult.stateNpcLink = field[16].GetFloat(); dbResult.phase = field[17].GetUInt32(); dbResult.overrides = field[18].GetUInt32(); gameEvent->gameobject_data.push_back(dbResult); ++pCount; //mGOBGuidList.insert(GOBGuidList::value_type(event_id, id)); } while (result->NextRow()); delete result; } Log.Success("GameEventMgr", "%u gameobject spawns for %u events from table event_gameobject_spawns loaded.", pCount, mGameEvents.size()); } StartArenaEvents(); }
void GameEventMgr::LoadFromDB() { { QueryResult *result = WorldDatabase.Query("SELECT MAX(entry) FROM game_event"); if ( !result ) { sLog.outString(">> Table game_event is empty."); sLog.outString(); return; } Field *fields = result->Fetch(); uint32 max_event_id = fields[0].GetUInt16(); delete result; mGameEvent.resize(max_event_id+1); } QueryResult *result = WorldDatabase.Query("SELECT entry,UNIX_TIMESTAMP(start_time),UNIX_TIMESTAMP(end_time),occurence,length,holiday,description FROM game_event"); if ( !result ) { mGameEvent.clear(); sLog.outString(">> Table game_event is empty!"); sLog.outString(); return; } uint32 count = 0; { barGoLink bar( (int)result->GetRowCount() ); do { ++count; Field *fields = result->Fetch(); bar.step(); uint16 event_id = fields[0].GetUInt16(); if (event_id==0) { sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id); continue; } GameEventData& pGameEvent = mGameEvent[event_id]; uint64 starttime = fields[1].GetUInt64(); pGameEvent.start = time_t(starttime); uint64 endtime = fields[2].GetUInt64(); pGameEvent.end = time_t(endtime); pGameEvent.occurence = fields[3].GetUInt32(); pGameEvent.length = fields[4].GetUInt32(); pGameEvent.holiday_id = HolidayIds(fields[5].GetUInt32()); if (pGameEvent.length==0) // length>0 is validity check { sLog.outErrorDb("`game_event` game event id (%i) have length 0 and can't be used.",event_id); continue; } if (pGameEvent.holiday_id != HOLIDAY_NONE) { if (!sHolidaysStore.LookupEntry(pGameEvent.holiday_id)) { sLog.outErrorDb("`game_event` game event id (%i) have not existed holiday id %u.",event_id,pGameEvent.holiday_id); pGameEvent.holiday_id = HOLIDAY_NONE; } } pGameEvent.description = fields[6].GetCppString(); } while( result->NextRow() ); delete result; sLog.outString(); sLog.outString( ">> Loaded %u game events", count ); } std::map<uint16,int16> pool2event; // for check unique spawn event associated with pool std::map<uint32,int16> creature2event; // for check unique spawn event associated with creature std::map<uint32,int16> go2event; // for check unique spawn event associated with gameobject // list only positive event top pools, filled at creature/gameobject loading mGameEventSpawnPoolIds.resize(mGameEvent.size()); mGameEventCreatureGuids.resize(mGameEvent.size()*2-1); // 1 2 result = WorldDatabase.Query("SELECT creature.guid, game_event_creature.event " "FROM creature JOIN game_event_creature ON creature.guid = game_event_creature.guid"); count = 0; if ( !result ) { barGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u creatures in game events", count ); } else { barGoLink bar( (int)result->GetRowCount() ); do { Field *fields = result->Fetch(); bar.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event_creature` game event id (%i) not allowed",event_id); continue; } int32 internal_event_id = mGameEvent.size() + event_id - 1; if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventCreatureGuids.size()) { sLog.outErrorDb("`game_event_creature` game event id (%i) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; // spawn objects at event can be grouped in pools and then affected pools have stricter requirements for this case if (event_id > 0) { creature2event[guid] = event_id; // not list explicitly creatures from pools in event creature list if (uint16 topPoolId = sPoolMgr.IsPartOfTopPool<Creature>(guid)) { int16& eventRef = pool2event[topPoolId]; if (eventRef != 0) { if (eventRef != event_id) sLog.outErrorDb("`game_event_creature` have creature (GUID: %u) for event %i from pool or subpool of pool (ID: %u) but pool have already content from event %i. Pool don't must have content for different events!", guid, event_id, topPoolId, eventRef); } else { eventRef = event_id; mGameEventSpawnPoolIds[event_id].push_back(topPoolId); sPoolMgr.RemoveAutoSpawnForPool(topPoolId); } continue; } } GuidList& crelist = mGameEventCreatureGuids[internal_event_id]; crelist.push_back(guid); } while( result->NextRow() ); delete result; sLog.outString(); sLog.outString( ">> Loaded %u creatures in game events", count ); } mGameEventGameobjectGuids.resize(mGameEvent.size()*2-1); // 1 2 result = WorldDatabase.Query("SELECT gameobject.guid, game_event_gameobject.event " "FROM gameobject JOIN game_event_gameobject ON gameobject.guid=game_event_gameobject.guid"); count = 0; if ( !result ) { barGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u gameobjects in game events", count ); } else { barGoLink bar( (int)result->GetRowCount() ); do { Field *fields = result->Fetch(); bar.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); if (event_id == 0) { sLog.outErrorDb("`game_event_gameobject` game event id (%i) not allowed",event_id); continue; } int32 internal_event_id = mGameEvent.size() + event_id - 1; if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventGameobjectGuids.size()) { sLog.outErrorDb("`game_event_gameobject` game event id (%i) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; // spawn objects at event can be grouped in pools and then affected pools have stricter requirements for this case if (event_id > 0) { go2event[guid] = event_id; // not list explicitly gameobjects from pools in event gameobject list if (uint16 topPoolId = sPoolMgr.IsPartOfTopPool<GameObject>(guid)) { int16& eventRef = pool2event[topPoolId]; if (eventRef != 0) { if (eventRef != event_id) sLog.outErrorDb("`game_event_gameobject` have gameobject (GUID: %u) for event %i from pool or subpool of pool (ID: %u) but pool have already content from event %i. Pool don't must have content for different events!", guid, event_id, topPoolId, eventRef); } else { eventRef = event_id; mGameEventSpawnPoolIds[event_id].push_back(topPoolId); sPoolMgr.RemoveAutoSpawnForPool(topPoolId); } continue; } } GuidList& golist = mGameEventGameobjectGuids[internal_event_id]; golist.push_back(guid); } while( result->NextRow() ); delete result; sLog.outString(); sLog.outString( ">> Loaded %u gameobjects in game events", count ); } // now recheck that all eventPools linked with events after our skip pools with parents for(std::map<uint16,int16>::const_iterator itr = pool2event.begin(); itr != pool2event.end(); ++itr) { uint16 pool_id = itr->first; int16 event_id = itr->second; sPoolMgr.CheckEventLinkAndReport(pool_id, event_id, creature2event, go2event); } mGameEventModelEquip.resize(mGameEvent.size()); // 0 1 2 result = WorldDatabase.Query("SELECT creature.guid, game_event_model_equip.event, game_event_model_equip.modelid," // 3 "game_event_model_equip.equipment_id " "FROM creature JOIN game_event_model_equip ON creature.guid=game_event_model_equip.guid"); count = 0; if ( !result ) { barGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u model/equipment changes in game events", count ); } else { barGoLink bar( (int)result->GetRowCount() ); do { Field *fields = result->Fetch(); bar.step(); uint32 guid = fields[0].GetUInt32(); uint16 event_id = fields[1].GetUInt16(); if (event_id >= mGameEventModelEquip.size()) { sLog.outErrorDb("`game_event_model_equip` game event id (%u) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; ModelEquipList& equiplist = mGameEventModelEquip[event_id]; ModelEquip newModelEquipSet; newModelEquipSet.modelid = fields[2].GetUInt32(); newModelEquipSet.equipment_id = fields[3].GetUInt32(); newModelEquipSet.equipement_id_prev = 0; newModelEquipSet.modelid_prev = 0; if (newModelEquipSet.equipment_id > 0) { if (!sObjectMgr.GetEquipmentInfo(newModelEquipSet.equipment_id)) { sLog.outErrorDb("Table `game_event_model_equip` have creature (Guid: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", guid, newModelEquipSet.equipment_id); continue; } } equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet)); } while( result->NextRow() ); delete result; sLog.outString(); sLog.outString( ">> Loaded %u model/equipment changes in game events", count ); } mGameEventQuests.resize(mGameEvent.size()); // 0 1 2 result = WorldDatabase.Query("SELECT id, quest, event FROM game_event_creature_quest"); count = 0; if ( !result ) { barGoLink bar(1); bar.step(); sLog.outString(); sLog.outString(">> Loaded %u quests additions in game events", count ); } else { barGoLink bar( (int)result->GetRowCount() ); do { Field *fields = result->Fetch(); bar.step(); uint32 id = fields[0].GetUInt32(); uint32 quest = fields[1].GetUInt32(); uint16 event_id = fields[2].GetUInt16(); if (event_id >= mGameEventQuests.size()) { sLog.outErrorDb("`game_event_creature_quest` game event id (%u) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; QuestRelList& questlist = mGameEventQuests[event_id]; questlist.push_back(QuestRelation(id, quest)); } while( result->NextRow() ); delete result; sLog.outString(); sLog.outString( ">> Loaded %u quests additions in game events", count ); } }
void GameEventMgr::LoadFromDB() { { QueryResult *result = WorldDatabase.Query("SELECT MAX(entry) FROM game_event"); if( !result ) { sLog.outString(">> Table game_event is empty."); sLog.outString(); return; } Field *fields = result->Fetch(); uint32 max_event_id = fields[0].GetUInt16(); delete result; mGameEvent.resize(max_event_id+1); } QueryResult *result = WorldDatabase.Query("SELECT entry,UNIX_TIMESTAMP(start_time),UNIX_TIMESTAMP(end_time),occurence,length,holiday,description FROM game_event"); if( !result ) { mGameEvent.clear(); sLog.outString(">> Table game_event is empty!"); return; } uint32 count = 0; { do { ++count; Field *fields = result->Fetch(); uint16 event_id = fields[0].GetUInt16(); if(event_id==0) { sLog.outErrorDb("`game_event` game event id (%i) is reserved and can't be used.",event_id); continue; } GameEventData& pGameEvent = mGameEvent[event_id]; uint64 starttime = fields[1].GetUInt64(); pGameEvent.start = time_t(starttime); uint64 endtime = fields[2].GetUInt64(); pGameEvent.end = time_t(endtime); pGameEvent.occurence = fields[3].GetUInt32(); pGameEvent.length = fields[4].GetUInt32(); pGameEvent.holiday_id = HolidayIds(fields[5].GetUInt32()); if(pGameEvent.length==0) // length>0 is validity check { sLog.outErrorDb("`game_event` game event id (%i) have length 0 and can't be used.",event_id); continue; } if(pGameEvent.holiday_id != HOLIDAY_NONE) { if(!sHolidaysStore.LookupEntry(pGameEvent.holiday_id)) { sLog.outErrorDb("`game_event` game event id (%i) have not existed holiday id %u.",event_id,pGameEvent.holiday_id); pGameEvent.holiday_id = HOLIDAY_NONE; } } pGameEvent.description = fields[6].GetCppString(); } while( result->NextRow() ); delete result; sLog.outString( ">> Loaded %u game events", count ); } mGameEventCreatureGuids.resize(mGameEvent.size()*2-1); // 1 2 result = WorldDatabase.Query("SELECT creature_spawns.guid, game_event_creature.event " "FROM creature_spawns JOIN game_event_creature ON creature_spawns.guid = game_event_creature.guid"); count = 0; if( !result ) { sLog.outString(">> Loaded %u creatures in game events", count ); } else { do { Field *fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); int32 internal_event_id = mGameEvent.size() + event_id - 1; if(internal_event_id < 0 || (size_t)internal_event_id >= mGameEventCreatureGuids.size()) { sLog.outErrorDb("`game_event_creature` game event id (%i) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; GuidList& crelist = mGameEventCreatureGuids[internal_event_id]; crelist.push_back(guid); } while( result->NextRow() ); delete result; sLog.outString( ">> Loaded %u creatures in game events", count ); } mGameEventGameobjectGuids.resize(mGameEvent.size()*2-1); // 1 2 result = WorldDatabase.Query("SELECT gameobject_spawns.guid, game_event_gameobject.event " "FROM gameobject_spawns JOIN game_event_gameobject ON gameobject_spawns.guid=game_event_gameobject.guid"); count = 0; if( !result ) { sLog.outString(">> Loaded %u gameobjects in game events", count ); } else { do { Field *fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); int32 internal_event_id = mGameEvent.size() + event_id - 1; if(internal_event_id < 0 || (size_t)internal_event_id >= mGameEventGameobjectGuids.size()) { sLog.outErrorDb("`game_event_gameobject` game event id (%i) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; GuidList& golist = mGameEventGameobjectGuids[internal_event_id]; golist.push_back(guid); } while( result->NextRow() ); delete result; sLog.outString( ">> Loaded %u gameobjects in game events", count ); } mGameEventModelEquip.resize(mGameEvent.size()); // 0 1 2 result = WorldDatabase.Query("SELECT creature_spawns.guid, game_event_model_equip.event, game_event_model_equip.modelid," // 3 "game_event_model_equip.equipment_id " "FROM creature_spawns JOIN game_event_model_equip ON creature_spawns.guid=game_event_model_equip.guid"); count = 0; if( !result ) { sLog.outString(">> Loaded %u model/equipment changes in game events", count ); } else { do { Field *fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); uint16 event_id = fields[1].GetUInt16(); if(event_id >= mGameEventModelEquip.size()) { sLog.outErrorDb("`game_event_model_equip` game event id (%u) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; ModelEquipList& equiplist = mGameEventModelEquip[event_id]; ModelEquip newModelEquipSet; newModelEquipSet.modelid = fields[2].GetUInt32(); newModelEquipSet.equipment_id = fields[3].GetUInt32(); newModelEquipSet.equipement_id_prev = 0; newModelEquipSet.modelid_prev = 0; if(newModelEquipSet.equipment_id > 0) { if(!sObjectMgr.GetEquipmentInfo(newModelEquipSet.equipment_id)) { sLog.outErrorDb("Table `game_event_model_equip` have creature (Guid: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", guid, newModelEquipSet.equipment_id); continue; } } equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet)); } while( result->NextRow() ); delete result; sLog.outString( ">> Loaded %u model/equipment changes in game events", count ); } mGameEventQuests.resize(mGameEvent.size()); // 0 1 2 result = WorldDatabase.Query("SELECT id, quest, event FROM game_event_creature_quest"); count = 0; if( !result ) { sLog.outString(">> Loaded %u quests additions in game events", count ); } else { do { Field *fields = result->Fetch(); uint32 id = fields[0].GetUInt32(); uint32 quest = fields[1].GetUInt32(); uint16 event_id = fields[2].GetUInt16(); if(event_id >= mGameEventQuests.size()) { sLog.outErrorDb("`game_event_creature_quest` game event id (%u) is out of range compared to max event id in `game_event`",event_id); continue; } ++count; QuestRelList& questlist = mGameEventQuests[event_id]; questlist.push_back(QuestRelation(id, quest)); } while( result->NextRow() ); delete result; sLog.outString( ">> Loaded %u quests additions in game events", count ); } mGameEventPoolIds.resize(mGameEvent.size()*2-1); // 1 2 result = WorldDatabase.Query("SELECT pool_template.entry, game_event_pool.event " "FROM pool_template JOIN game_event_pool ON pool_template.entry = game_event_pool.pool_entry"); count = 0; if( !result ) { sLog.outString(">> Loaded %u pools in game events", count ); } else { do { Field *fields = result->Fetch(); uint32 entry = fields[0].GetUInt16(); int16 event_id = fields[1].GetInt16(); int32 internal_event_id = mGameEvent.size() + event_id - 1; if (internal_event_id < 0 || (size_t)internal_event_id >= mGameEventPoolIds.size()) { sLog.outErrorDb("`game_event_pool` game event id (%i) is out of range compared to max event id in `game_event`",event_id); continue; } if (!sPoolMgr.CheckPool(entry)) { sLog.outErrorDb("Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry); continue; } ++count; IdList& poollist = mGameEventPoolIds[internal_event_id]; poollist.push_back(entry); } while( result->NextRow() ); sLog.outString( ">> Loaded %u pools in game events", count ); delete result; } }