void CreatureLinkingMgr::LoadFromDB() { // Clear maps m_creatureLinkingMap.clear(); m_creatureLinkingGuidMap.clear(); m_eventTriggers.clear(); // master m_eventGuidTriggers.clear(); QueryResult* result = WorldDatabase.Query("SELECT entry, map, master_entry, flag, search_range FROM creature_linking_template"); uint32 count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(">> Table creature_linking_template is empty."); sLog.outString(); return; } BarGoLink bar((int)result->GetRowCount()); do { bar.step(); Field* fields = result->Fetch(); CreatureLinkingInfo tmp; uint32 entry = fields[0].GetUInt32(); tmp.mapId = fields[1].GetUInt32(); tmp.masterId = fields[2].GetUInt32(); tmp.linkingFlag = fields[3].GetUInt16(); tmp.searchRange = fields[4].GetUInt16(); tmp.masterDBGuid = 0; // Will be initialized for unique mobs later (only for spawning dependend) if (!IsLinkingEntryValid(entry, &tmp, true)) continue; // Store db-guid for master of whom pTmp is spawn dependend (only non-local bosses) if (tmp.searchRange == 0 && tmp.linkingFlag & (FLAG_CANT_SPAWN_IF_BOSS_DEAD | FLAG_CANT_SPAWN_IF_BOSS_ALIVE)) { if (QueryResult* guid_result = WorldDatabase.PQuery("SELECT guid FROM creature WHERE id=%u AND map=%u LIMIT 1", tmp.masterId, tmp.mapId)) { tmp.masterDBGuid = (*guid_result)[0].GetUInt32(); delete guid_result; } } ++count; // Add it to the map m_creatureLinkingMap.insert(CreatureLinkingMap::value_type(entry, tmp)); // Store master_entry m_eventTriggers.insert(tmp.masterId); } while (result->NextRow()); sLog.outString(); sLog.outString(">> Loaded creature linking for %u creature-entries", count); delete result; result = WorldDatabase.Query("SELECT guid, master_guid, flag FROM creature_linking"); count = 0; if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(">> Table creature_linking is empty."); sLog.outString(); return; } BarGoLink guidBar((int)result->GetRowCount()); do { guidBar.step(); Field* fields = result->Fetch(); CreatureLinkingInfo tmp; uint32 guid = fields[0].GetUInt32(); tmp.mapId = INVALID_MAP_ID; // some invalid value, this marks the guid-linking tmp.masterId = fields[1].GetUInt32(); tmp.linkingFlag = fields[2].GetUInt16(); tmp.masterDBGuid = tmp.masterId; tmp.searchRange = 0; if (!IsLinkingEntryValid(guid, &tmp, false)) continue; ++count; // Add it to the map m_creatureLinkingGuidMap.insert(CreatureLinkingMap::value_type(guid, tmp)); // Store master_guid m_eventGuidTriggers.insert(tmp.masterId); } while (result->NextRow()); sLog.outString(); sLog.outString(">> Loaded creature linking for %u creature-Guids", count); delete result; }
void CreatureLinkingMgr::LoadFromDB() { // Clear maps m_creatureLinkingMap.clear(); m_creatureLinkingGuidMap.clear(); m_eventTriggers.clear(); // master m_eventGuidTriggers.clear(); // Load `creature_linking_template` sLog.outString("> Loading table `creature_linking_template`"); uint32 count = 0; QueryResult* result = WorldDatabase.Query("SELECT entry, map, master_entry, flag, search_range FROM creature_linking_template"); if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(">> Table creature_linking_template is empty."); sLog.outString(); return; } else { BarGoLink bar((int)result->GetRowCount()); do { bar.step(); Field* fields = result->Fetch(); CreatureLinkingInfo tmp; uint32 entry = fields[0].GetUInt32(); tmp.mapId = fields[1].GetUInt32(); tmp.masterId = fields[2].GetUInt32(); tmp.linkingFlag = fields[3].GetUInt16(); tmp.searchRange = fields[4].GetUInt16(); tmp.masterDBGuid = 0; // Will be initialized for unique mobs in IsLinkingEntryValid (only for spawning dependend) if (!IsLinkingEntryValid(entry, &tmp, true)) continue; ++count; // Add it to the map m_creatureLinkingMap.insert(CreatureLinkingMap::value_type(entry, tmp)); // Store master_entry m_eventTriggers.insert(tmp.masterId); } while (result->NextRow()); sLog.outString(">> Loaded creature linking for %u creature-entries", count); sLog.outString(); delete result; } // Load `creature_linking` sLog.outString("> Loading table `creature_linking`"); count = 0; result = WorldDatabase.Query("SELECT guid, master_guid, flag FROM creature_linking"); if (!result) { BarGoLink bar(1); bar.step(); sLog.outString(">> Table creature_linking is empty."); sLog.outString(); return; } BarGoLink guidBar((int)result->GetRowCount()); do { guidBar.step(); Field* fields = result->Fetch(); CreatureLinkingInfo tmp; uint32 guid = fields[0].GetUInt32(); tmp.mapId = INVALID_MAP_ID; // some invalid value, this marks the guid-linking tmp.masterId = fields[1].GetUInt32(); tmp.linkingFlag = fields[2].GetUInt16(); tmp.masterDBGuid = tmp.masterId; tmp.searchRange = 0; if (!IsLinkingEntryValid(guid, &tmp, false)) continue; ++count; // Add it to the map m_creatureLinkingGuidMap.insert(CreatureLinkingMap::value_type(guid, tmp)); // Store master_guid m_eventGuidTriggers.insert(tmp.masterId); } while (result->NextRow()); sLog.outString(); sLog.outString(">> Loaded creature linking for %u creature-Guids", count); delete result; }