diff options
-rw-r--r-- | sql/updates/world/master/2021_05_16_09_world_2018_01_07_03_world.sql | 10 | ||||
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 18 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_gobject.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_list.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 8 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp | 8 |
9 files changed, 45 insertions, 28 deletions
diff --git a/sql/updates/world/master/2021_05_16_09_world_2018_01_07_03_world.sql b/sql/updates/world/master/2021_05_16_09_world_2018_01_07_03_world.sql new file mode 100644 index 00000000000..418ba4c7b8a --- /dev/null +++ b/sql/updates/world/master/2021_05_16_09_world_2018_01_07_03_world.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `linked_respawn` WHERE `guid`=137752 AND `linkedguid`=137752 AND `linkType`=0; +UPDATE `trinity_string` SET `content_default`='NPC currently selected by player: +Name: %s +SpawnID: %s. +GUID: %s. +Entry: %u. +Faction: %u. +NPC Flags: %s. +DisplayID: %u (Native: %u).' WHERE `entry`=539; diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 831ddeb466a..bcdf801075c 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -216,7 +216,7 @@ void EscortAI::UpdateAI(uint32 diff) } // Check if player or any member of his group is within range - if (_despawnAtFar && HasEscortState(STATE_ESCORT_ESCORTING) && !_playerGUID.IsEmpty() && !me->GetVictim() && !HasEscortState(STATE_ESCORT_RETURNING)) + if (_despawnAtFar && HasEscortState(STATE_ESCORT_ESCORTING) && !_playerGUID.IsEmpty() && !me->IsEngaged() && !HasEscortState(STATE_ESCORT_RETURNING)) { if (_playerCheckTimer <= diff) { @@ -228,10 +228,13 @@ void EscortAI::UpdateAI(uint32 diff) if (CreatureData const* creatureData = me->GetCreatureData()) isEscort = (sWorld->getBoolConfig(CONFIG_RESPAWN_DYNAMIC_ESCORTNPC) && (creatureData->spawnGroupData->flags & SPAWNGROUP_FLAG_ESCORTQUESTNPC)); - if (_instantRespawn && !isEscort) - me->DespawnOrUnsummon(0, Seconds(1)); - else if (_instantRespawn && isEscort) - me->GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, me->GetSpawnId(), true); + if (_instantRespawn) + { + if (!isEscort) + me->DespawnOrUnsummon(0, 1s); + else + me->GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, me->GetSpawnId(), true); + } else me->DespawnOrUnsummon(); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 088cf8625ed..697015cfe3f 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3206,7 +3206,7 @@ void Map::Respawn(RespawnInfo* info, bool force, CharacterDatabaseTransaction db DoRespawn(type, spawnId, gridId); } -void Map::Respawn(RespawnVector& respawnData, bool force, CharacterDatabaseTransaction dbTrans) +void Map::Respawn(std::vector<RespawnInfo*>& respawnData, bool force, CharacterDatabaseTransaction dbTrans) { CharacterDatabaseTransaction trans = dbTrans ? dbTrans : CharacterDatabase.BeginTransaction(); for (RespawnInfo* info : respawnData) @@ -3242,13 +3242,13 @@ void Map::AddRespawnInfo(RespawnInfo& info, bool replace) ASSERT(success, "Insertion of respawn info with id (%u," UI64FMTD ") into spawn id map failed - state desync.", uint32(ri->type), ri->spawnId); } -static void PushRespawnInfoFrom(RespawnVector& data, RespawnInfoMap const& map, uint32 zoneId) +static void PushRespawnInfoFrom(std::vector<RespawnInfo*>& data, RespawnInfoMap const& map, uint32 zoneId) { for (auto const& pair : map) if (!zoneId || pair.second->zoneId == zoneId) data.push_back(pair.second); } -void Map::GetRespawnInfo(RespawnVector& respawnData, SpawnObjectTypeMask types, uint32 zoneId) const +void Map::GetRespawnInfo(std::vector<RespawnInfo*>& respawnData, SpawnObjectTypeMask types, uint32 zoneId) const { if (types & SPAWN_TYPEMASK_CREATURE) PushRespawnInfoFrom(respawnData, _creatureRespawnTimesBySpawnId, zoneId); @@ -3316,7 +3316,7 @@ void Map::RemoveRespawnTime(RespawnInfo* info, bool doRespawn, CharacterDatabase DeleteRespawnInfo(info); } -void Map::RemoveRespawnTime(RespawnVector& respawnData, bool doRespawn, CharacterDatabaseTransaction dbTrans) +void Map::RemoveRespawnTime(std::vector<RespawnInfo*>& respawnData, bool doRespawn, CharacterDatabaseTransaction dbTrans) { CharacterDatabaseTransaction trans = dbTrans ? dbTrans : CharacterDatabase.BeginTransaction(); for (RespawnInfo* info : respawnData) diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 54ee5f50b38..0c85a237771 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -293,7 +293,6 @@ typedef std::unordered_map<uint32 /*zoneId*/, ZoneDynamicInfo> ZoneDynamicInfoMa typedef boost::heap::fibonacci_heap<RespawnInfo*, boost::heap::compare<CompareRespawnInfo>> RespawnListContainer; typedef RespawnListContainer::handle_type RespawnListHandle; typedef std::unordered_map<ObjectGuid::LowType, RespawnInfo*> RespawnInfoMap; -typedef std::vector<RespawnInfo*> RespawnVector; struct RespawnInfo { SpawnObjectType type; @@ -787,11 +786,11 @@ class TC_GAME_API Map : public GridRefManager<NGridType> bool CheckRespawn(RespawnInfo* info); void DoRespawn(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 gridId); void Respawn(RespawnInfo* info, bool force = false, CharacterDatabaseTransaction dbTrans = nullptr); - void Respawn(RespawnVector& respawnData, bool force = false, CharacterDatabaseTransaction dbTrans = nullptr); + void Respawn(std::vector<RespawnInfo*>& respawnData, bool force = false, CharacterDatabaseTransaction dbTrans = nullptr); void AddRespawnInfo(RespawnInfo& info, bool replace = false); void DeleteRespawnInfo(); void DeleteRespawnInfo(RespawnInfo* info); - void DeleteRespawnInfo(RespawnVector& toDelete) + void DeleteRespawnInfo(std::vector<RespawnInfo*>& toDelete) { for (RespawnInfo* info : toDelete) DeleteRespawnInfo(info); @@ -799,7 +798,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType> } void DeleteRespawnInfo(SpawnObjectTypeMask types, uint32 zoneId = 0) { - RespawnVector v; + std::vector<RespawnInfo*> v; GetRespawnInfo(v, types, zoneId); if (!v.empty()) DeleteRespawnInfo(v); @@ -811,13 +810,18 @@ class TC_GAME_API Map : public GridRefManager<NGridType> } public: - void GetRespawnInfo(RespawnVector& respawnData, SpawnObjectTypeMask types, uint32 zoneId = 0) const; + void GetRespawnInfo(std::vector<RespawnInfo*>& respawnData, SpawnObjectTypeMask types, uint32 zoneId = 0) const; RespawnInfo* GetRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawnId) const; + void ForceRespawn(SpawnObjectType type, ObjectGuid::LowType spawnId) + { + if (RespawnInfo* info = GetRespawnInfo(type, spawnId)) + Respawn(info, true); + } void RemoveRespawnTime(RespawnInfo* info, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr); - void RemoveRespawnTime(RespawnVector& respawnData, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr); + void RemoveRespawnTime(std::vector<RespawnInfo*>& respawnData, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr); void RemoveRespawnTime(SpawnObjectTypeMask types = SPAWN_TYPEMASK_ALL, uint32 zoneId = 0, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr) { - RespawnVector v; + std::vector<RespawnInfo*> v; GetRespawnInfo(v, types, zoneId); if (!v.empty()) RemoveRespawnTime(v, doRespawn, dbTrans); diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 49be3e5668e..fe9e8a16c16 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -350,7 +350,7 @@ public: Player const* const player = handler->GetSession()->GetPlayer(); // force respawn to make sure we find something - player->GetMap()->RemoveRespawnTime(SPAWN_TYPE_GAMEOBJECT, guidLow, true); + player->GetMap()->ForceRespawn(SPAWN_TYPE_GAMEOBJECT, guidLow); GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow); if (!object) { diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 375041d106a..9bc96553784 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -692,7 +692,7 @@ public: if (*args) range = atoi((char*)args); - RespawnVector respawns; + std::vector<RespawnInfo*> respawns; LocaleConstant locale = handler->GetSession()->GetSessionDbcLocale(); char const* stringOverdue = sObjectMgr->GetTrinityString(LANG_LIST_RESPAWNS_OVERDUE, locale); char const* stringCreature = sObjectMgr->GetTrinityString(LANG_LIST_RESPAWNS_CREATURES, locale); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index c8fe798fcaf..c70567b1746 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1990,14 +1990,14 @@ public: Cell::VisitGridObjects(player, worker, player->GetGridActivationRange()); // Now handle any that had despawned, but had respawn time logged. - RespawnVector data; + std::vector<RespawnInfo*> data; player->GetMap()->GetRespawnInfo(data, SPAWN_TYPEMASK_ALL, 0); if (!data.empty()) { uint32 const gridId = Trinity::ComputeGridCoord(player->GetPositionX(), player->GetPositionY()).GetId(); for (RespawnInfo* info : data) if (info->gridId == gridId) - player->GetMap()->RemoveRespawnTime(info, true); + player->GetMap()->ForceRespawn(info->type, info->spawnId); } return true; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 5fdfaf812b4..48c13f9bf8b 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -606,7 +606,7 @@ public: if (!lowguid) return false; // force respawn to make sure we find something - handler->GetSession()->GetPlayer()->GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, lowguid, true); + handler->GetSession()->GetPlayer()->GetMap()->ForceRespawn(SPAWN_TYPE_CREATURE, lowguid); // then try to find it creature = handler->GetCreatureFromPlayerMapByDbGuid(lowguid); } @@ -822,7 +822,7 @@ public: uint32 mechanicImmuneMask = cInfo->MechanicImmuneMask; uint32 displayid = target->GetDisplayId(); uint32 nativeid = target->GetNativeDisplayId(); - uint32 Entry = target->GetEntry(); + uint32 entry = target->GetEntry(); int64 curRespawnDelay = target->GetRespawnCompatibilityMode() ? target->GetRespawnTimeEx() - GameTime::GetGameTime() : target->GetMap()->GetCreatureRespawnTime(target->GetSpawnId()) - GameTime::GetGameTime(); @@ -831,7 +831,7 @@ public: std::string curRespawnDelayStr = secsToTimeString(uint64(curRespawnDelay), true); std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true); - handler->PSendSysMessage(LANG_NPCINFO_CHAR, std::to_string(target->GetSpawnId()).c_str(), target->GetGUID().ToString().c_str(), faction, std::to_string(npcflags).c_str(), Entry, displayid, nativeid); + handler->PSendSysMessage(LANG_NPCINFO_CHAR, target->GetName().c_str(), std::to_string(target->GetSpawnId()).c_str(), target->GetGUID().ToString().c_str(), entry, faction, std::to_string(npcflags).c_str(), displayid, nativeid); if (target->GetCreatureData() && target->GetCreatureData()->spawnGroupData->groupId) { SpawnGroupTemplateData const* const groupData = target->GetCreatureData()->spawnGroupData; @@ -877,7 +877,7 @@ public: if (cInfo->flags_extra & flagsExtra[i].Value) handler->PSendSysMessage("%s (0x%X)", flagsExtra[i].Name, flagsExtra[i].Value); - handler->PSendSysMessage(LANG_NPCINFO_NPC_FLAGS, npcflags); + handler->PSendSysMessage(LANG_NPCINFO_NPC_FLAGS, target->m_unitData->NpcFlags[0]); for (uint8 i = 0; i < NPC_FLAG_COUNT; i++) if (npcflags & npcFlagTexts[i].Value) handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 02ac392f864..3030f3145a6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -478,7 +478,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript me->SetReactState(REACT_PASSIVE); } - void JustEngagedWith(Unit* target) override + void JustEnteredCombat(Unit* target) override { if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer())) { @@ -505,9 +505,9 @@ class npc_green_dragon_combat_trigger : public CreatureScript return target->GetTypeId() == TYPEID_PLAYER; } - void JustReachedHome() override + void JustExitedCombat() override { - _JustReachedHome(); + me->setActive(false); DoAction(ACTION_DEATH); } @@ -516,7 +516,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript if (action == ACTION_DEATH) { instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, NOT_STARTED); - me->m_Events.AddEvent(new ValithriaDespawner(me), me->m_Events.CalculateTime(5000)); + me->m_Events.AddEventAtOffset(new ValithriaDespawner(me), 5s); } } |