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 = 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) { 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 = 0; } } pGameEvent.description = fields[6].GetCppString(); } while( result->NextRow() ); delete result; sLog.outString(); sLog.outString( ">> Loaded %u game events", count ); } 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(); 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(); 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(); 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(); sLog.outString( ">> Loaded %u gameobjects in game events", count ); } 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 ); } 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 ) { barGoLink bar2(1); bar2.step(); sLog.outString(); sLog.outString(">> Loaded %u pools in game events", count ); } else { barGoLink bar2( (int)result->GetRowCount() ); do { Field *fields = result->Fetch(); bar2.step(); 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(); sLog.outString( ">> Loaded %u pools in game events", count ); delete result; } }
void GameEvent::LoadFromDB() { QueryResult *result = WorldDatabase.Query("SELECT MAX(`entry`) FROM `game_event`"); if( !result ) { sLog.outString(">> Table game_event is empty."); sLog.outString(); return; } else { Field *fields = result->Fetch(); max_event_id = fields[0].GetUInt16(); delete result; } mGameEvent.resize(max_event_id + 1); result = WorldDatabase.Query("SELECT `entry`,UNIX_TIMESTAMP(`start`),UNIX_TIMESTAMP(`end`),`occurence`,`length`,`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 { count++; Field *fields = result->Fetch(); bar.step(); uint16 event_id = fields[0].GetUInt16(); 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.description = fields[5].GetCppString(); } while( result->NextRow() ); sLog.outString(); sLog.outString( ">> Loaded %u game events", count ); delete result; mGameEventCreatureGuids.resize((max_event_id * 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 bar2(1); bar2.step(); sLog.outString(); sLog.outString(">> Loaded %u creatures in game events", count ); } else { barGoLink bar2( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar2.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); if(max_event_id + 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[max_event_id + event_id]; crelist.push_back(guid); } while( result->NextRow() ); sLog.outString(); sLog.outString( ">> Loaded %u creatures in game events", count ); delete result; } mGameEventGameobjectGuids.resize((max_event_id * 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 bar3(1); bar3.step(); sLog.outString(); sLog.outString(">> Loaded %u gameobjects in game events", count ); } else { barGoLink bar3( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar3.step(); uint32 guid = fields[0].GetUInt32(); int16 event_id = fields[1].GetInt16(); if(max_event_id + 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[max_event_id + event_id]; golist.push_back(guid); } while( result->NextRow() ); sLog.outString(); sLog.outString( ">> Loaded %u gameobjects in game events", count ); delete result; } mGameEventModelEquip.resize(max_event_id + 1); // 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 bar3(1); bar3.step(); sLog.outString(); sLog.outString(">> Loaded %u model/equipment changes in game events", count ); } else { barGoLink bar3( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar3.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; equiplist.push_back(std::pair<uint32, ModelEquip>(guid, newModelEquipSet)); } while( result->NextRow() ); sLog.outString(); sLog.outString( ">> Loaded %u model/equipment changes in game events", count ); delete result; } mGameEventQuests.resize(max_event_id + 1); // 0 1 2 result = WorldDatabase.Query("SELECT `id`,`quest`,`event` FROM `game_event_creature_quest`"); count = 0; if( !result ) { barGoLink bar3(1); bar3.step(); sLog.outString(); sLog.outString(">> Loaded %u quests additions in game events", count ); } else { barGoLink bar3( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar3.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() ); sLog.outString(); sLog.outString( ">> Loaded %u quests additions in game events", count ); delete result; } }
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 GameEvent::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,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 { ++count; Field *fields = result->Fetch(); bar.step(); uint16 event_id = fields[0].GetUInt16(); 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.description = fields[5].GetCppString(); } while( result->NextRow() ); sLog.outString(); sLog.outString( ">> Loaded %u game events", count ); delete result; 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 bar2(1); bar2.step(); sLog.outString(); sLog.outString(">> Loaded %u creatures in game events", count ); } else { barGoLink bar2( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar2.step(); 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 || 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() ); sLog.outString(); sLog.outString( ">> Loaded %u creatures in game events", count ); delete result; } 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 bar3(1); bar3.step(); sLog.outString(); sLog.outString(">> Loaded %u gameobjects in game events", count ); } else { barGoLink bar3( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar3.step(); 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 || 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() ); sLog.outString(); sLog.outString( ">> Loaded %u gameobjects in game events", count ); delete result; } 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 bar3(1); bar3.step(); sLog.outString(); sLog.outString(">> Loaded %u model/equipment changes in game events", count ); } else { barGoLink bar3( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar3.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(!objmgr.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() ); sLog.outString(); sLog.outString( ">> Loaded %u model/equipment changes in game events", count ); delete result; } mGameEventQuests.resize(mGameEvent.size()); // 0 1 2 result = WorldDatabase.Query("SELECT id, quest, event FROM game_event_creature_quest"); count = 0; if( !result ) { barGoLink bar3(1); bar3.step(); sLog.outString(); sLog.outString(">> Loaded %u quests additions in game events", count ); } else { barGoLink bar3( result->GetRowCount() ); do { Field *fields = result->Fetch(); bar3.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() ); sLog.outString(); sLog.outString( ">> Loaded %u quests additions in game events", count ); delete result; } }