npc_air_force_botsAI(Creature* pCreature) : ScriptedAI(pCreature) { m_pSpawnAssoc = nullptr; // find the correct spawnhandling for (uint8 i = 0; i < countof(m_aSpawnAssociations); ++i) { if (m_aSpawnAssociations[i].m_uiThisCreatureEntry == pCreature->GetEntry()) { m_pSpawnAssoc = &m_aSpawnAssociations[i]; break; } } if (!m_pSpawnAssoc) error_db_log("SD2: Creature template entry %u has ScriptName npc_air_force_bots, but it's not handled by that script", pCreature->GetEntry()); else { CreatureInfo const* spawnedTemplate = GetCreatureTemplateStore(m_pSpawnAssoc->m_uiSpawnedCreatureEntry); if (!spawnedTemplate) { error_db_log("SD2: Creature template entry %u does not exist in DB, which is required by npc_air_force_bots", m_pSpawnAssoc->m_uiSpawnedCreatureEntry); m_pSpawnAssoc = nullptr; return; } } }
void SystemMgr::LoadScriptTexts() { LoadOregonStrings(WorldDatabase, "script_texts", TEXT_SOURCE_RANGE, 1 + (TEXT_SOURCE_RANGE * 2)); QueryResult_AutoPtr Result = WorldDatabase.Query("SELECT entry, sound, type, language, emote FROM script_texts"); if (Result) { uint32 uiCount = 0; do { Field* pFields = Result->Fetch(); StringTextData pTemp; int32 iId = pFields[0].GetInt32(); pTemp.uiSoundId = pFields[1].GetUInt32(); pTemp.uiType = pFields[2].GetUInt32(); pTemp.uiLanguage = pFields[3].GetUInt32(); pTemp.uiEmote = pFields[4].GetUInt32(); if (iId >= 0) { error_db_log("OSCR: Entry %i in table script_texts is not a negative value.", iId); continue; } if (iId > TEXT_SOURCE_RANGE || iId <= TEXT_SOURCE_RANGE * 2) { error_db_log("OSCR: Entry %i in table script_texts is out of accepted entry range for table.", iId); continue; } if (pTemp.uiSoundId) { if (!GetSoundEntriesStore()->LookupEntry(pTemp.uiSoundId)) error_db_log("OSCR: Entry %i in table script_texts has soundId %u but sound does not exist.", iId, pTemp.uiSoundId); } if (!GetLanguageDescByID(pTemp.uiLanguage)) error_db_log("OSCR: Entry %i in table script_texts using Language %u but Language does not exist.", iId, pTemp.uiLanguage); if (pTemp.uiType > CHAT_TYPE_ZONE_YELL) error_db_log("OSCR: Entry %i in table script_texts has Type %u but this Chat Type does not exist.", iId, pTemp.uiType); m_mTextDataMap[iId] = pTemp; ++uiCount; } while (Result->NextRow()); outstring_log(">> Loaded %u additional Script Texts data.", uiCount); } else outstring_log(">> Loaded 0 additional Script Texts data. DB table script_texts is empty."); }
void SystemMgr::LoadScriptWaypoints() { // Drop Existing Waypoint list m_mPointMoveMap.clear(); uint64 uiCreatureCount = 0; // Load Waypoints QueryResult_AutoPtr Result = WorldDatabase.Query("SELECT COUNT(entry) FROM script_waypoint GROUP BY entry"); if (Result) uiCreatureCount = Result->GetRowCount(); Result = WorldDatabase.Query("SELECT entry, pointid, location_x, location_y, location_z, waittime FROM script_waypoint ORDER BY pointid"); if (Result) { uint32 uiNodeCount = 0; do { Field* pFields = Result->Fetch(); ScriptPointMove pTemp; pTemp.uiCreatureEntry = pFields[0].GetUInt32(); uint32 uiEntry = pTemp.uiCreatureEntry; pTemp.uiPointId = pFields[1].GetUInt32(); pTemp.fX = pFields[2].GetFloat(); pTemp.fY = pFields[3].GetFloat(); pTemp.fZ = pFields[4].GetFloat(); pTemp.uiWaitTime = pFields[5].GetUInt32(); CreatureInfo const* pCInfo = GetCreatureTemplateStore(pTemp.uiCreatureEntry); if (!pCInfo) { error_db_log("OSCR: DB table script_waypoint has waypoint for non-existant creature entry %u", pTemp.uiCreatureEntry); continue; } if (!pCInfo->ScriptID) error_db_log("OSCR: DB table script_waypoint has waypoint for creature entry %u, but creature does not have ScriptName defined and then useless.", pTemp.uiCreatureEntry); m_mPointMoveMap[uiEntry].push_back(pTemp); ++uiNodeCount; } while (Result->NextRow()); outstring_log(">> Loaded %u Script Waypoint nodes.", uiNodeCount); } else outstring_log(">> Loaded 0 Script Waypoints. DB table script_waypoint is empty."); }
bool GossipSelectWithCode_npc_guildmaster( Player *player, Creature *_creature, uint32 sender, uint32 action, const char* sCode ) { if(sender == GOSSIP_SENDER_MAIN) { if(action == ACTION_SELL_GUILDHOUSE) { int i = -1; try { //compare code if (strlen(sCode) + 1 == sizeof CODE_SELL) i = strcmp(CODE_SELL, sCode); } catch(char *str) {error_db_log(str);} if (i == 0) { //right code sellGuildhouse(player, _creature); } player->CLOSE_GOSSIP_MENU(); return true; } } return false; }
void Script::RegisterSelf() { // try to find scripts which try to use another script's allocated memory // that means didn't allocate memory for script for (uint16 i = 0; i < MAX_SCRIPTS; ++i) { // somebody forgot to allocate memory for a script by a method like this: newscript = new Script if (m_scripts[i] == this) { error_log("ScriptName: '%s' - Forgot to allocate memory, so this script and/or the script before that can't work.", Name.c_str()); // don't register it // and don't delete it because its memory is used for another script return; } } int id = GetScriptId(Name.c_str()); if (id) { m_scripts[id] = this; ++num_sc_scripts; } else { if (Name.find("example") == std::string::npos) error_db_log("TrinityScript: RegisterSelf, but script named %s does not have ScriptName assigned in database.",(this)->Name.c_str()); delete this; } }
//TODO: get rid of this many variables passed in function. void npc_escortAI::Start(bool bIsActiveAttacker, bool bRun, uint64 uiPlayerGUID, const Quest* pQuest, bool bInstantRespawn, bool bCanLoopPath) { if (m_creature->getVictim()) { error_log("SD2: EscortAI attempt to Start while in combat."); return; } if (HasEscortState(STATE_ESCORT_ESCORTING)) { error_log("SD2: EscortAI attempt to Start while already escorting."); return; } if (!WaypointList.empty()) WaypointList.clear(); FillPointMovementListForCreature(); if (WaypointList.empty()) { error_db_log("SD2: EscortAI Start with 0 waypoints (possible missing entry in script_waypoint)."); return; } //set variables m_bIsActiveAttacker = bIsActiveAttacker; m_bIsRunning = bRun; m_uiPlayerGUID = uiPlayerGUID; m_pQuestForEscort = pQuest; m_bCanInstantRespawn = bInstantRespawn; m_bCanReturnToStart = bCanLoopPath; if (m_bCanReturnToStart && m_bCanInstantRespawn) debug_log("SD2: EscortAI is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn."); if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { m_creature->GetMotionMaster()->MovementExpired(); m_creature->GetMotionMaster()->MoveIdle(); debug_log("SD2: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle."); } //disable npcflags m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); debug_log("SD2: EscortAI started with %u waypoints. ActiveAttacker = %d, Run = %d, PlayerGUID = %u", WaypointList.size(), m_bIsActiveAttacker, m_bIsRunning, m_uiPlayerGUID); CurrentWP = WaypointList.begin(); //Set initial speed if (m_bIsRunning) m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); AddEscortState(STATE_ESCORT_ESCORTING); JustStartedEscort(); }
void SystemMgr::LoadScriptWaypoints() { uint64 uiCreatureCount = 0; // Load Waypoints QueryResult* pResult = SD2Database.PQuery("SELECT COUNT(entry) FROM script_waypoint GROUP BY entry"); if (pResult) { uiCreatureCount = pResult->GetRowCount(); delete pResult; } outstring_log("SD2: Loading Script Waypoints for " UI64FMTD " creature(s)...", uiCreatureCount); pResult = SD2Database.PQuery("SELECT entry, pointid, location_x, location_y, location_z, waittime FROM script_waypoint ORDER BY entry, pointid"); if (pResult) { BarGoLink bar(pResult->GetRowCount()); uint32 uiNodeCount = 0; do { bar.step(); Field* pFields = pResult->Fetch(); uint32 uiEntry = pFields[0].GetUInt32(); int32 pathId = 1; // pFields[X].GetInt32(); uint32 pointId = pFields[1].GetUInt32(); uint32 delay = pFields[5].GetUInt32(); CreatureInfo const* pCInfo = GetCreatureTemplateStore(uiEntry); if (!pCInfo) { error_db_log("SD2: DB table script_waypoint has waypoint for nonexistent creature entry %u", uiEntry); continue; } if (AddWaypointFromExternal(uiEntry, pathId, pointId, pFields[2].GetFloat(), pFields[3].GetFloat(), pFields[4].GetFloat(), 100, delay)) m_pathInfo[uiEntry][pathId].lastWaypoint = pointId; ++uiNodeCount; } while (pResult->NextRow()); delete pResult; outstring_log(""); outstring_log(">> Loaded %u Script Waypoint nodes.", uiNodeCount); } else { BarGoLink bar(1); bar.step(); outstring_log(""); outstring_log(">> Loaded 0 Script Waypoints. DB table `script_waypoint` is empty."); } }
// TODO: get rid of this many variables passed in function. void npc_escortAI::Start(bool bRun, const Player* pPlayer, const Quest* pQuest, bool bInstantRespawn, bool bCanLoopPath) { if (m_creature->getVictim()) { script_error_log("EscortAI attempt to Start while in combat."); return; } if (HasEscortState(STATE_ESCORT_ESCORTING)) { script_error_log("EscortAI attempt to Start while already escorting."); return; } if (!WaypointList.empty()) WaypointList.clear(); FillPointMovementListForCreature(); if (WaypointList.empty()) { error_db_log("SD2: EscortAI Start with 0 waypoints (possible missing entry in script_waypoint)."); return; } // set variables m_bIsRunning = bRun; m_playerGuid = pPlayer ? pPlayer->GetObjectGuid() : ObjectGuid(); m_pQuestForEscort = pQuest; m_bCanInstantRespawn = bInstantRespawn; m_bCanReturnToStart = bCanLoopPath; if (m_bCanReturnToStart && m_bCanInstantRespawn) debug_log("SD2: EscortAI is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn."); if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { m_creature->GetMotionMaster()->MovementExpired(); m_creature->GetMotionMaster()->MoveIdle(); debug_log("SD2: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle."); } // disable npcflags m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); debug_log("SD2: EscortAI started with " SIZEFMTD " waypoints. Run = %d, PlayerGuid = %s", WaypointList.size(), m_bIsRunning, m_playerGuid.GetString().c_str()); CurrentWP = WaypointList.begin(); // Set initial speed m_creature->SetWalk(!m_bIsRunning); AddEscortState(STATE_ESCORT_ESCORTING); JustStartedEscort(); }
void npc_escortAI::Start(bool bAttack, bool bDefend, bool bRun, uint64 pGUID) { if (m_creature->isInCombat()) { debug_log("RSCR ERROR: EscortAI attempt to Start while in combat"); return; } if (IsBeingEscorted) { error_log("RSCR: EscortAI attempt to Start while already escorting"); return; } if (WaypointList.empty()) { error_db_log("RSCR: EscortAI Start with 0 waypoints (possible missing entry in script_waypoint)"); return; } if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { m_creature->GetMotionMaster()->MovementExpired(); m_creature->GetMotionMaster()->MoveIdle(); debug_log("RSCR: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle."); } Attack = bAttack; Defend = bDefend; bIsRunning = bRun; PlayerGUID = pGUID; //store original NpcFlags m_uiNpcFlags = m_creature->GetUInt32Value(UNIT_NPC_FLAGS); //remove them if any if (m_uiNpcFlags) m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); debug_log("RSCR: EscortAI started with %d waypoints. Attack = %d, Defend = %d, Run = %d, PlayerGUID = %d", WaypointList.size(), Attack, Defend, bIsRunning, PlayerGUID); CurrentWP = WaypointList.begin(); //Set initial speed if (bIsRunning) m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); else m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); //Start WP m_creature->GetMotionMaster()->MovePoint(CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z ); debug_log("RSCR: EscortAI Next WP is: %d, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z); IsBeingEscorted = true; ReconnectWP = false; Returning = false; IsOnHold = false; CombatMovement = true; }
void Script::RegisterSelf() { // try to find scripts which try to use another script's allocated memory // that means didn't allocate memory for script for (uint16 i = 0; i < MAX_SCRIPTS; ++i) { // somebody forgot to allocate memory for a script by a method like this: newscript = new Script if (m_scripts[i] == this) { error_log("ScriptName: '%s' - Forgot to allocate memory, so this script and/or the script before that can't work.", Name.c_str()); // don't register it // and don't delete it because its memory is used for another script return; } } int id = GetScriptId(Name.c_str()); if (id) { // try to find the script in assigned scripts bool IsExist = false; for (uint16 i = 0; i < MAX_SCRIPTS; ++i) { if (m_scripts[i]) { // if the assigned script's name and the new script's name is the same if (m_scripts[i]->Name == Name) { IsExist = true; break; } } } // if the script doesn't assigned -> assign it! if (!IsExist) { m_scripts[id] = this; ++num_sc_scripts; } // if the script is already assigned -> delete it! else { // @todo write a better error message than this one :) error_log("ScriptName: '%s' already assigned with the same ScriptName, so the script can't work.", Name.c_str()); delete this; } } else { if (Name.find("example") == std::string::npos) error_db_log("OSCR: RegisterSelf, but script named %s does not have ScriptName assigned in database.", (this)->Name.c_str()); delete this; } }
void Script::RegisterSelf() { int id = GetScriptId(Name.c_str()); if(id) { m_scripts[id] = this; ++num_sc_scripts; } else if(Name.find("example") == std::string::npos) { error_db_log("CRASH ALERT! RibonScript: RegisterSelf, but script named %s does not have ScriptName assigned in database.",(this)->Name.c_str()); delete this; } }
Creature* SummonGuard() { Creature* pSummoned = m_creature->SummonCreature(m_pSpawnAssoc->m_uiSpawnedCreatureEntry, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OOC_DESPAWN, 300000); if (pSummoned) m_spawnedGuid = pSummoned->GetObjectGuid(); else { error_db_log("SD2: npc_air_force_bots: wasn't able to spawn creature %u", m_pSpawnAssoc->m_uiSpawnedCreatureEntry); m_pSpawnAssoc = nullptr; } return pSummoned; }
void Script::RegisterSelf(bool bReportError) { int id = GetScriptId(Name.c_str()); if (id != 0) { m_scripts[id] = this; ++num_sc_scripts; } else { if (bReportError) error_db_log("脚本库: Script registering but ScriptName %s is not assigned in database.", (this)->Name.c_str()); m_scriptStorage.insert(std::make_pair(Name.c_str(), this)); } }
void Script::RegisterSelf(bool bReportError) { int id = GetScriptId(Name.c_str()); if (id != 0) { m_scripts[id] = this; ++num_sc_scripts; } else { if (bReportError) error_db_log("SD2: Script registering but ScriptName %s is not assigned in database. Script will not be used.", (this)->Name.c_str()); delete this; } }
void SystemMgr::LoadScriptTextsCustom() { outstring_log("TSCR: Loading Custom Texts..."); LoadTrinityStrings(WorldDatabase,"custom_texts",TEXT_SOURCE_RANGE*2,1+(TEXT_SOURCE_RANGE*3)); QueryResult_AutoPtr Result = WorldDatabase.PQuery("SELECT entry, sound, type, language, emote FROM custom_texts"); outstring_log("TSCR: Loading Custom Texts additional data..."); if (Result) { barGoLink bar(Result->GetRowCount()); uint32 uiCount = 0; do { bar.step(); Field* pFields = Result->Fetch(); StringTextData pTemp; int32 iId = pFields[0].GetInt32(); pTemp.uiSoundId = pFields[1].GetUInt32(); pTemp.uiType = pFields[2].GetUInt32(); pTemp.uiLanguage = pFields[3].GetUInt32(); pTemp.uiEmote = pFields[4].GetUInt32(); if (iId >= 0) { error_db_log("TSCR: Entry %i in table `custom_texts` is not a negative value.", iId); continue; } if (iId > TEXT_SOURCE_RANGE*2 || iId <= TEXT_SOURCE_RANGE*3) { error_db_log("TSCR: Entry %i in table `custom_texts` is out of accepted entry range for table.", iId); continue; } if (pTemp.uiSoundId) { if (!GetSoundEntriesStore()->LookupEntry(pTemp.uiSoundId)) error_db_log("TSCR: Entry %i in table `custom_texts` has soundId %u but sound does not exist.", iId, pTemp.uiSoundId); } if (!GetLanguageDescByID(pTemp.uiLanguage)) error_db_log("TSCR: Entry %i in table `custom_texts` using Language %u but Language does not exist.", iId, pTemp.uiLanguage); if (pTemp.uiType > CHAT_TYPE_ZONE_YELL) error_db_log("TSCR: Entry %i in table `custom_texts` has Type %u but this Chat Type does not exist.", iId, pTemp.uiType); m_mTextDataMap[iId] = pTemp; ++uiCount; } while (Result->NextRow()); outstring_log(""); outstring_log(">> Loaded %u additional Custom Texts data.", uiCount); } else { barGoLink bar(1); bar.step(); outstring_log(""); outstring_log(">> Loaded 0 additional Custom Texts data. DB table `custom_texts` is empty."); } }
void SystemMgr::LoadScriptWaypoints() { uint64 creatureCount = 0; // Load Waypoints QueryResult* result = WorldDatabase.PQuery("SELECT COUNT(entry) FROM script_waypoint GROUP BY entry"); if (result) { creatureCount = result->GetRowCount(); delete result; } outstring_log("SD2: Loading Script Waypoints for " UI64FMTD " creature(s)...", creatureCount); result = WorldDatabase.PQuery("SELECT entry, pathId, pointid, position_x, position_y, position_z, orientation, waittime, script_id FROM script_waypoint ORDER BY entry, pathId, pointid"); if (result) { BarGoLink bar(result->GetRowCount()); uint32 nodeCount = 0; do { bar.step(); Field* fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); CreatureInfo const* info = GetCreatureTemplateStore(entry); if (!info) { error_db_log("SD2: DB table script_waypoint has waypoint for nonexistent creature entry %u", entry); continue; } uint32 pathId = fields[1].GetUInt32(); uint32 pointId = fields[2].GetUInt32(); float position_x = fields[3].GetFloat(); float position_y = fields[4].GetFloat(); float position_z = fields[5].GetFloat(); float orientation = fields[6].GetFloat(); uint32 waitTime = fields[7].GetUInt32(); uint32 scriptId = fields[8].GetUInt32(); sWaypointMgr.AddExternalNode(entry, pathId, pointId, position_x, position_y, position_z, orientation, waitTime, scriptId); ++nodeCount; } while (result->NextRow()); delete result; outstring_log("\n>> Loaded %u Script Waypoint nodes.", nodeCount); } else { BarGoLink bar(1); bar.step(); outstring_log("\n>> Loaded 0 Script Waypoints. DB table `script_waypoint` is empty."); } }
void BossSpellWorker::LoadSpellTable() { debug_log("BSW: Loading table of spells boss %u difficulty %u", bossID , currentDifficulty); char query[MAX_QUERY_LEN]; sprintf(query, "SELECT entry, spellID_N10, spellID_N25, spellID_H10, spellID_H25, timerMin_N10, timerMin_N25, timerMin_H10, timerMin_H25, timerMax_N10, timerMax_N25, timerMax_H10, timerMax_H25, data1, data2, data3, data4, locData_x, locData_y, locData_z, varData, StageMask_N, StageMask_H, CastType, isVisualEffect, isBugged, textEntry FROM `boss_spell_table` WHERE entry = %u;\r\n", bossID); QueryResult_AutoPtr Result = WorldDatabase.PQuery(query); if (Result) { uint32 uiCount = 0; do { Field* pFields = Result->Fetch(); m_BossSpell[uiCount].id = uiCount; int32 bossEntry = pFields[0].GetInt32(); for (uint8 j = 0; j < DIFFICULTY_LEVELS; ++j) m_BossSpell[uiCount].m_uiSpellEntry[j] = pFields[1+j].GetUInt32(); for (uint8 j = 0; j < DIFFICULTY_LEVELS; ++j) m_BossSpell[uiCount].m_uiSpellTimerMin[j] = pFields[1+DIFFICULTY_LEVELS+j].GetUInt32(); for (uint8 j = 0; j < DIFFICULTY_LEVELS; ++j) m_BossSpell[uiCount].m_uiSpellTimerMax[j] = pFields[1+DIFFICULTY_LEVELS*2+j].GetUInt32(); for (uint8 j = 0; j < DIFFICULTY_LEVELS; ++j) m_BossSpell[uiCount].m_uiSpellData[j] = pFields[1+DIFFICULTY_LEVELS*3+j].GetUInt32(); m_BossSpell[uiCount].LocData.x = pFields[1+DIFFICULTY_LEVELS*4].GetFloat(); m_BossSpell[uiCount].LocData.y = pFields[2+DIFFICULTY_LEVELS*4].GetFloat(); m_BossSpell[uiCount].LocData.z = pFields[3+DIFFICULTY_LEVELS*4].GetFloat(); m_BossSpell[uiCount].varData = pFields[4+DIFFICULTY_LEVELS*4].GetInt32(); m_BossSpell[uiCount].StageMaskN = pFields[5+DIFFICULTY_LEVELS*4].GetUInt32(); m_BossSpell[uiCount].StageMaskH = pFields[6+DIFFICULTY_LEVELS*4].GetUInt32(); m_BossSpell[uiCount].m_CastTarget = getBSWCastType(pFields[7+DIFFICULTY_LEVELS*4].GetUInt8()); m_BossSpell[uiCount].m_IsVisualEffect = (pFields[8+DIFFICULTY_LEVELS*4].GetUInt8() == 0) ? false : true ; m_BossSpell[uiCount].m_IsBugged = (pFields[9+DIFFICULTY_LEVELS*4].GetUInt8() == 0) ? false : true ; m_BossSpell[uiCount].textEntry = pFields[10+DIFFICULTY_LEVELS*4].GetInt32(); if (bossEntry != bossID) error_db_log("BSW: Unknown error while load boss_spell_table"); ++uiCount; } while (Result->NextRow()); _bossSpellCount = uiCount; _fillEmptyDataField(); debug_log("BSW: Loaded %u boss spell data records for boss %u", uiCount, bossID); } else { error_db_log("BSW: Boss spell table for boss %u is empty.", bossID); _bossSpellCount = 0; }; }
void SystemMgr::LoadScriptTexts() { outstring_log("SD2: Loading Script Texts..."); LoadMangosStrings(SD2Database, "script_texts", TEXT_SOURCE_TEXT_START, TEXT_SOURCE_TEXT_END); QueryResult* pResult = SD2Database.PQuery("SELECT entry, sound, type, language, emote FROM script_texts WHERE entry BETWEEN %i AND %i", TEXT_SOURCE_GOSSIP_END, TEXT_SOURCE_TEXT_START); outstring_log("SD2: Loading Script Texts additional data..."); if (pResult) { BarGoLink bar(pResult->GetRowCount()); uint32 uiCount = 0; do { bar.step(); Field* pFields = pResult->Fetch(); StringTextData pTemp; int32 iId = pFields[0].GetInt32(); pTemp.uiSoundId = pFields[1].GetUInt32(); pTemp.uiType = pFields[2].GetUInt32(); pTemp.uiLanguage = pFields[3].GetUInt32(); pTemp.uiEmote = pFields[4].GetUInt32(); if (iId >= 0) { error_db_log("SD2: Entry %i in table `script_texts` is not a negative value.", iId); continue; } if (pTemp.uiSoundId) { if (!GetSoundEntriesStore()->LookupEntry(pTemp.uiSoundId)) error_db_log("SD2: Entry %i in table `script_texts` has soundId %u but sound does not exist.", iId, pTemp.uiSoundId); } if (!GetLanguageDescByID(pTemp.uiLanguage)) error_db_log("SD2: Entry %i in table `script_texts` using Language %u but Language does not exist.", iId, pTemp.uiLanguage); if (pTemp.uiType > CHAT_TYPE_ZONE_YELL) error_db_log("SD2: Entry %i in table `script_texts` has Type %u but this Chat Type does not exist.", iId, pTemp.uiType); m_mTextDataMap[iId] = pTemp; ++uiCount; } while (pResult->NextRow()); delete pResult; outstring_log(""); outstring_log(">> Loaded %u additional Script Texts data.", uiCount); } else { BarGoLink bar(1); bar.step(); outstring_log(""); outstring_log(">> Loaded 0 additional Script Texts data. DB table `script_texts` is empty."); } }
//TODO: get rid of this many variables passed in function. void npc_escortAI::Start(bool bIsActiveAttacker, bool bRun, uint64 uiPlayerGUID, const Quest* pQuest, bool bInstantRespawn, bool bCanLoopPath) { if (me->getVictim()) { error_log("TSCR ERROR: EscortAI attempt to Start while in combat."); return; } if (HasEscortState(STATE_ESCORT_ESCORTING)) { error_log("TSCR: EscortAI attempt to Start while already escorting."); return; } if(!ScriptWP) // sd2 never adds wp in script, but tc does { if (!WaypointList.empty()) WaypointList.clear(); FillPointMovementListForCreature(); } if (WaypointList.empty()) { error_db_log("TSCR: EscortAI Start with 0 waypoints (possible missing entry in script_waypoint for creature %u).", me->GetEntry()); return; } //set variables IsActiveAttacker = bIsActiveAttacker; IsRunning = bRun; PlayerGUID = uiPlayerGUID; QuestForEscort = pQuest; CanInstantRespawn = bInstantRespawn; CanReturnToStart = bCanLoopPath; if (CanReturnToStart && CanInstantRespawn) debug_log("TSCR: EscortAI is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn."); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { me->GetMotionMaster()->MoveIdle(); debug_log("TSCR: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle."); } //disable npcflags me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); debug_log("TSCR: EscortAI started with %u waypoints. ActiveAttacker = %d, Run = %d, PlayerGUID = %u", WaypointList.size(), IsActiveAttacker, IsRunning, PlayerGUID); CurrentWP = WaypointList.begin(); //Set initial speed if (IsRunning) me->SetWalk(false); else me->SetWalk(true); AddEscortState(STATE_ESCORT_ESCORTING); }
void SystemMgr::LoadScriptWaypoints() { // Drop Existing Waypoint list m_mPointMoveMap.clear(); uint64 uiCreatureCount = 0; // Load Waypoints QueryResult* pResult = SD2Database.PQuery("SELECT COUNT(entry) FROM script_waypoint GROUP BY entry"); if (pResult) { uiCreatureCount = pResult->GetRowCount(); delete pResult; } outstring_log("SD2: Loading Script Waypoints for " UI64FMTD " creature(s)...", uiCreatureCount); pResult = SD2Database.PQuery("SELECT entry, pointid, location_x, location_y, location_z, waittime FROM script_waypoint ORDER BY pointid"); if (pResult) { BarGoLink bar(pResult->GetRowCount()); uint32 uiNodeCount = 0; do { bar.step(); Field* pFields = pResult->Fetch(); ScriptPointMove pTemp; pTemp.uiCreatureEntry = pFields[0].GetUInt32(); uint32 uiEntry = pTemp.uiCreatureEntry; pTemp.uiPointId = pFields[1].GetUInt32(); pTemp.fX = pFields[2].GetFloat(); pTemp.fY = pFields[3].GetFloat(); pTemp.fZ = pFields[4].GetFloat(); pTemp.uiWaitTime = pFields[5].GetUInt32(); CreatureInfo const* pCInfo = GetCreatureTemplateStore(pTemp.uiCreatureEntry); if (!pCInfo) { error_db_log("SD2: DB table script_waypoint has waypoint for nonexistent creature entry %u", pTemp.uiCreatureEntry); continue; } if (!pCInfo->ScriptID) error_db_log("SD2: DB table script_waypoint has waypoint for creature entry %u, but creature does not have ScriptName defined and then useless.", pTemp.uiCreatureEntry); m_mPointMoveMap[uiEntry].push_back(pTemp); ++uiNodeCount; } while (pResult->NextRow()); delete pResult; // outstring_log(""); outstring_log(">> Loaded %u Script Waypoint nodes.", uiNodeCount); } else { BarGoLink bar(1); bar.step(); // outstring_log(""); outstring_log(">> Loaded 0 Script Waypoints. DB table `script_waypoint` is empty."); } }