From 9c8e22eec59e12b1678cbf3d48ee60f486d8ba93 Mon Sep 17 00:00:00 2001 From: Dr-J Date: Sat, 21 Feb 2015 23:46:34 +0000 Subject: [PATCH 1/8] DB/Achivement: Dinner Impossible Thanks to @Joshiwald for fixing core to check db criteria for this achievement type to make this work properly, now achievement is only rewarded when a great feast has been laid in all 5 specified battlegrounds by player. --- sql/updates/world/2015_02_21_00_world.sql | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 sql/updates/world/2015_02_21_00_world.sql diff --git a/sql/updates/world/2015_02_21_00_world.sql b/sql/updates/world/2015_02_21_00_world.sql new file mode 100644 index 00000000000..7e71235703c --- /dev/null +++ b/sql/updates/world/2015_02_21_00_world.sql @@ -0,0 +1,9 @@ +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` in(6626,6627,6628,6629,6630); + +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(6626, 20, 30, 0, ''), -- Alterac Valley +(6627, 20, 529, 0, ''), -- Arathi Basin +(6628, 20, 489, 0, ''), -- Warsong Glutch +(6629, 20, 607, 0, ''), -- Strand of the Ancients +(6630, 20, 566, 0, ''); -- Eye of the Storm + From 8c8ca2ab8de4ced62b1bc9205c8bc72c9b3c8012 Mon Sep 17 00:00:00 2001 From: click Date: Sun, 22 Feb 2015 01:20:26 +0100 Subject: [PATCH 2/8] Core/Log: Change periodic spell notificiations to DEBUG-level and set it as a unique logging-mechanism named "spell.periodic" --- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 14 +++++++------- src/server/worldserver/worldserver.conf.dist | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e5b8cd111bc..c267e560005 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5924,7 +5924,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const caster->CalcAbsorbResist(target, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, GetSpellInfo()); - TC_LOG_INFO("spells", "PeriodicTick: %s attacked %s for %u dmg inflicted by %u absorb is %u", + TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s attacked %s for %u dmg inflicted by %u absorb is %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb); caster->DealDamageMods(target, damage, &absorb); @@ -5979,7 +5979,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()) * caster->SpellDamagePctDone(target, m_spellInfo, DOT); else damage = std::max(int32(damage * GetDonePct()), 0); - + damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); // Calculate armor mitigation @@ -6016,7 +6016,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c if (target->GetHealth() < damage) damage = uint32(target->GetHealth()); - TC_LOG_INFO("spells", "PeriodicTick: %s health leech of %s for %u dmg inflicted by %u abs is %u", + TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s health leech of %s for %u dmg inflicted by %u abs is %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb); caster->SendSpellNonMeleeDamageLog(target, GetId(), damage, GetSpellInfo()->GetSchoolMask(), absorb, resist, false, 0, crit); @@ -6160,7 +6160,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const if (crit) damage = caster->SpellCriticalHealingBonus(m_spellInfo, damage, target); - TC_LOG_INFO("spells", "PeriodicTick: %s heal of %s for %u health inflicted by %u", + TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s heal of %s for %u health inflicted by %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId()); uint32 absorb = 0; @@ -6231,7 +6231,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con drainAmount = maxmana; } - TC_LOG_INFO("spells", "PeriodicTick: %s power leech of %s for %u dmg inflicted by %u", + TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s power leech of %s for %u dmg inflicted by %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), drainAmount, GetId()); // resilience reduce mana draining effect at spell crit damage reduction (added in 2.4) @@ -6292,7 +6292,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const // ignore negative values (can be result apply spellmods to aura damage uint32 amount = std::max(m_amount, 0) * target->GetMaxPower(powerType) /100; - TC_LOG_INFO("spells", "PeriodicTick: %s energize %s for %u dmg inflicted by %u", + TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId()); SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false); @@ -6330,7 +6330,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false); target->SendPeriodicAuraLog(&pInfo); - TC_LOG_INFO("spells", "PeriodicTick: %s energize %s for %u dmg inflicted by %u", + TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId()); int32 gain = target->ModifyPower(powerType, amount); diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 010c73779bc..ecb5824b1c5 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -3213,6 +3213,7 @@ Logger.sql.sql=5,Console DBErrors #Logger.scripts.ai=3,Console Server #Logger.server.authserver=3,Console Server #Logger.spells=3,Console Server +#Logger.spells.periodic=3,Console Server #Logger.sql.dev=3,Console Server #Logger.sql.driver=3,Console Server #Logger.warden=3,Console Server From cffef1e80d853ca55887f19b94380b47e45b039e Mon Sep 17 00:00:00 2001 From: click Date: Sun, 22 Feb 2015 01:28:47 +0100 Subject: [PATCH 3/8] Core/Log: Move a few PetHandler INFO-notifications over to DEBUG-level --- src/server/game/Handlers/PetHandler.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 0fcaa47a5e2..684b4abb2aa 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -70,7 +70,7 @@ void WorldSession::HandlePetAction(WorldPacket& recvData) // used also for charmed creature Unit* pet = ObjectAccessor::GetUnit(*_player, guid1); - TC_LOG_INFO("network", "HandlePetAction: %s - flag: %u, spellid: %u, target: %s.", guid1.ToString().c_str(), uint32(flag), spellid, guid2.ToString().c_str()); + TC_LOG_DEBUG("network", "HandlePetAction: %s - flag: %u, spellid: %u, target: %s.", guid1.ToString().c_str(), uint32(flag), spellid, guid2.ToString().c_str()); if (!pet) { @@ -398,7 +398,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe void WorldSession::HandlePetNameQuery(WorldPacket& recvData) { - TC_LOG_INFO("network", "HandlePetNameQuery. CMSG_PET_NAME_QUERY"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_NAME_QUERY"); uint32 petnumber; ObjectGuid petguid; @@ -465,7 +465,7 @@ bool WorldSession::CheckStableMaster(ObjectGuid guid) void WorldSession::HandlePetSetAction(WorldPacket& recvData) { - TC_LOG_INFO("network", "HandlePetSetAction. CMSG_PET_SET_ACTION"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_SET_ACTION"); ObjectGuid petguid; uint8 count; @@ -545,7 +545,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData) uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data[i]); uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]); - TC_LOG_INFO("network", "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X", + TC_LOG_DEBUG("network", "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X", _player->GetName().c_str(), position[i], spell_id, uint32(act_state)); //if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add @@ -582,7 +582,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData) void WorldSession::HandlePetRename(WorldPacket& recvData) { - TC_LOG_INFO("network", "HandlePetRename. CMSG_PET_RENAME"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_RENAME"); ObjectGuid petguid; uint8 isdeclined; @@ -670,7 +670,7 @@ void WorldSession::HandlePetAbandon(WorldPacket& recvData) { ObjectGuid guid; recvData >> guid; //pet guid - TC_LOG_INFO("network", "HandlePetAbandon. CMSG_PET_ABANDON %s", guid.ToString().c_str()); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_ABANDON %s", guid.ToString().c_str()); if (!_player->IsInWorld()) return; @@ -696,7 +696,7 @@ void WorldSession::HandlePetAbandon(WorldPacket& recvData) void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) { - TC_LOG_INFO("network", "CMSG_PET_SPELL_AUTOCAST"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_SPELL_AUTOCAST"); ObjectGuid guid; uint32 spellid; uint8 state; //1 for on, 0 for off @@ -744,7 +744,7 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket) void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) { - TC_LOG_DEBUG("network", "WORLD: CMSG_PET_CAST_SPELL"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_CAST_SPELL"); ObjectGuid guid; uint8 castCount; @@ -846,7 +846,7 @@ void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, Dec void WorldSession::HandlePetLearnTalent(WorldPacket& recvData) { - TC_LOG_DEBUG("network", "WORLD: CMSG_PET_LEARN_TALENT"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_LEARN_TALENT"); ObjectGuid guid; uint32 talentId, requestedRank; @@ -858,7 +858,7 @@ void WorldSession::HandlePetLearnTalent(WorldPacket& recvData) void WorldSession::HandleLearnPreviewTalentsPet(WorldPacket& recvData) { - TC_LOG_DEBUG("network", "CMSG_LEARN_PREVIEW_TALENTS_PET"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_LEARN_PREVIEW_TALENTS_PET"); ObjectGuid guid; recvData >> guid; From a6505dd46a00c80b195cc924ed42e4174deb19b7 Mon Sep 17 00:00:00 2001 From: Duarte Duarte Date: Sun, 22 Feb 2015 05:49:39 +0000 Subject: [PATCH 4/8] Merge pull request #14103 from Epicurus4/6.x Added a player searcher (cherry picked from commit b7052d2ed735dca233b91c32f762b4156543aa97) --- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 5 +++++ src/server/game/AI/ScriptedAI/ScriptedCreature.h | 1 + src/server/game/Entities/Object/Object.cpp | 7 +++++++ src/server/game/Entities/Object/Object.h | 1 + 4 files changed, 14 insertions(+) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index b00a24129c3..135a0fcee93 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -663,3 +663,8 @@ void GetGameObjectListWithEntryInGrid(std::list& list, WorldObject* { source->GetGameObjectListWithEntryInGrid(list, entry, maxSearchRange); } + +void GetPlayerListInGrid(std::list& list, WorldObject* source, float maxSearchRange) +{ + source->GetPlayerListInGrid(list, maxSearchRange); +} diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index cff628a847e..1a4c3064a59 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -425,5 +425,6 @@ Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float m GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange); void GetCreatureListWithEntryInGrid(std::list& list, WorldObject* source, uint32 entry, float maxSearchRange); void GetGameObjectListWithEntryInGrid(std::list& list, WorldObject* source, uint32 entry, float maxSearchRange); +void GetPlayerListInGrid(std::list& list, WorldObject* source, float maxSearchRange); #endif // SCRIPTEDCREATURE_H_ diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index b5bcbfd221f..53ec842b053 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2255,6 +2255,13 @@ void WorldObject::GetCreatureListWithEntryInGrid(std::list& creatureL cell.Visit(pair, visitor, *(this->GetMap()), *this, maxSearchRange); } +void WorldObject::GetPlayerListInGrid(std::list& playerList, float maxSearchRange) const +{ + Trinity::AnyPlayerInObjectRangeCheck checker(this, maxSearchRange); + Trinity::PlayerListSearcher searcher(this, playerList, checker); + this->VisitNearbyWorldObject(maxSearchRange, searcher); +} + /* namespace Trinity { diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 2aa1704f7d2..c48d8ff4d18 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -683,6 +683,7 @@ class WorldObject : public Object, public WorldLocation void GetGameObjectListWithEntryInGrid(std::list& lList, uint32 uiEntry, float fMaxSearchRange) const; void GetCreatureListWithEntryInGrid(std::list& lList, uint32 uiEntry, float fMaxSearchRange) const; + void GetPlayerListInGrid(std::list& lList, float fMaxSearchRange) const; void DestroyForNearbyPlayers(); virtual void UpdateObjectVisibility(bool forced = true); From 958999ff5cc779e81b9a23789f84c292d79d1341 Mon Sep 17 00:00:00 2001 From: Duarte Duarte Date: Sun, 15 Feb 2015 14:56:12 +0000 Subject: [PATCH 5/8] Core/Server: Catch exceptions in int main() The exceptions is rethrown on debug mode. Ref Coverity CID 1010213, 1022574, 1227501, 1227502, 1227503, 1227504, 1227505, 1254536 and 1254612 (cherry picked from commit e68ca82d4d039a401d03de145111b0a738bb9dd7) Conflicts: src/server/bnetserver/Main.cpp --- src/server/authserver/Main.cpp | 20 +++++++++++++++++++- src/server/worldserver/Main.cpp | 22 ++++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index cd58ec2bf68..c57f8254d9c 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -58,7 +58,7 @@ boost::asio::deadline_timer _dbPingTimer(_ioService); uint32 _dbPingInterval; LoginDatabaseWorkerPool LoginDatabase; -int main(int argc, char** argv) +int mainImpl(int argc, char** argv) { std::string configFile = _TRINITY_REALM_CONFIG; auto vm = GetConsoleArguments(argc, argv, configFile); @@ -144,6 +144,24 @@ int main(int argc, char** argv) return 0; } +/// Launch the Trinity server +extern int main(int argc, char** argv) +{ + try + { + return mainImpl(argc, argv); + } + catch (std::exception& ex) + { + std::cerr << "Top-level exception caught:" << ex.what() << "\n"; + +#ifndef NDEBUG // rethrow exception for the debugger + throw; +#else + return 1; +#endif + } +} /// Initialize connection to the database bool StartDB() diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 7b47dba8759..06d8775440a 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -92,8 +92,7 @@ void ShutdownCLIThread(std::thread* cliThread); void ShutdownThreadPool(std::vector& threadPool); variables_map GetConsoleArguments(int argc, char** argv, std::string& cfg_file, std::string& cfg_service); -/// Launch the Trinity server -extern int main(int argc, char** argv) +int mainImpl(int argc, char** argv) { std::string configFile = _TRINITY_CORE_CONFIG; std::string configService; @@ -289,6 +288,25 @@ extern int main(int argc, char** argv) return World::GetExitCode(); } +/// Launch the Trinity server +extern int main(int argc, char** argv) +{ + try + { + return mainImpl(argc, argv); + } + catch (std::exception& ex) + { + std::cerr << "Top-level exception caught:" << ex.what() << "\n"; + +#ifndef NDEBUG // rethrow exception for the debugger + throw; +#else + return 1; +#endif + } +} + void ShutdownCLIThread(std::thread* cliThread) { if (cliThread != nullptr) From 2fe888546366ad73410458b00882187806cde02d Mon Sep 17 00:00:00 2001 From: Duarte Duarte Date: Sun, 15 Feb 2015 15:01:36 +0000 Subject: [PATCH 6/8] Core/Spells: Fix a float division issue in EffectLeapBack Ref Coverity CID 1227511 (cherry picked from commit 709275eecbbe073cd9b9170debfcef476ef66a6c) Conflicts: src/server/game/Spells/SpellEffects.cpp --- src/server/game/Spells/SpellEffects.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 651f28d3590..d2f2951aac1 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4819,8 +4819,8 @@ void Spell::EffectLeapBack(SpellEffIndex effIndex) if (!unitTarget) return; - float speedxy = float(m_spellInfo->Effects[effIndex].MiscValue)/10; - float speedz = float(damage/10); + float speedxy = m_spellInfo->Effects[effIndex].MiscValue / 10.f; + float speedz = damage/ 10.f; //1891: Disengage m_caster->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891); } From 092e61cd3d66bde739d98974ca64b3aace7f099b Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sun, 22 Feb 2015 10:25:11 +0100 Subject: [PATCH 7/8] DB/Creature: Skettis Waypoints 1 By Kittnz, closes #14203 --- sql/updates/world/2015_02_22_00_world.sql | 809 ++++++++++++++++++++++ 1 file changed, 809 insertions(+) create mode 100644 sql/updates/world/2015_02_22_00_world.sql diff --git a/sql/updates/world/2015_02_22_00_world.sql b/sql/updates/world/2015_02_22_00_world.sql new file mode 100644 index 00000000000..fef42379e0b --- /dev/null +++ b/sql/updates/world/2015_02_22_00_world.sql @@ -0,0 +1,809 @@ +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132553; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3852.509,`position_y`=3183.065,`position_z`=439.9884 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3852.509,3183.065,439.9884,0,0,0,0,100,0), +(@PATH,2,-3819.889,3184.794,439.9884,0,0,0,0,100,0), +(@PATH,3,-3782.827,3181.228,439.9884,0,0,0,0,100,0), +(@PATH,4,-3750.342,3182.072,439.9884,0,0,0,0,100,0), +(@PATH,5,-3722.763,3185.583,439.9884,0,0,0,0,100,0), +(@PATH,6,-3686.632,3214.135,439.9884,0,0,0,0,100,0), +(@PATH,7,-3656.386,3240.646,439.9884,0,0,0,0,100,0), +(@PATH,8,-3626.851,3272.052,439.9884,0,0,0,0,100,0), +(@PATH,9,-3614.448,3315.655,439.9884,0,0,0,0,100,0), +(@PATH,10,-3607.889,3352.559,439.9884,0,0,0,0,100,0), +(@PATH,11,-3585.032,3376.603,439.9884,0,0,0,0,100,0), +(@PATH,12,-3587.389,3402.663,439.9884,0,0,0,0,100,0), +(@PATH,13,-3579.043,3438.117,439.9884,0,0,0,0,100,0), +(@PATH,14,-3548.228,3462.314,439.9884,0,0,0,0,100,0), +(@PATH,15,-3537.522,3491.375,439.9884,0,0,0,0,100,0), +(@PATH,16,-3536.816,3529.879,439.9884,0,0,0,0,100,0), +(@PATH,17,-3531.781,3565.558,439.9884,0,0,0,0,100,0), +(@PATH,18,-3534.733,3584.761,439.9884,0,0,0,0,100,0), +(@PATH,19,-3540.309,3619.033,439.9884,0,0,0,0,100,0), +(@PATH,20,-3548.71,3648.066,439.9884,0,0,0,0,100,0), +(@PATH,21,-3565.15,3673.789,439.9884,0,0,0,0,100,0), +(@PATH,22,-3593.257,3700.032,439.9884,0,0,0,0,100,0), +(@PATH,23,-3629.609,3714.834,439.9884,0,0,0,0,100,0), +(@PATH,24,-3663.73,3728.198,439.9884,0,0,0,0,100,0), +(@PATH,25,-3699.584,3743.161,439.9884,0,0,0,0,100,0), +(@PATH,26,-3730.971,3758.693,439.9884,0,0,0,0,100,0), +(@PATH,27,-3763.805,3764.051,439.9884,0,0,0,0,100,0), +(@PATH,28,-3796.277,3791.6,439.9884,0,0,0,0,100,0), +(@PATH,29,-3829.475,3825.91,439.9884,0,0,0,0,100,0), +(@PATH,30,-3866.195,3833.057,439.9884,0,0,0,0,100,0), +(@PATH,31,-3901.688,3854.476,439.9884,0,0,0,0,100,0), +(@PATH,32,-3932.767,3851.711,439.9884,0,0,0,0,100,0), +(@PATH,33,-3965.585,3849.424,439.9884,0,0,0,0,100,0), +(@PATH,34,-3999.315,3846.842,439.9884,0,0,0,0,100,0), +(@PATH,35,-4034.047,3812.782,439.9884,0,0,0,0,100,0), +(@PATH,36,-4053.754,3766.908,439.9884,0,0,0,0,100,0), +(@PATH,37,-4065.977,3737.402,439.9884,0,0,0,0,100,0), +(@PATH,38,-4097.885,3717.781,439.9884,0,0,0,0,100,0), +(@PATH,39,-4102.042,3680.511,439.9884,0,0,0,0,100,0), +(@PATH,40,-4104.036,3655.926,439.9884,0,0,0,0,100,0), +(@PATH,41,-4101.168,3611.585,439.9884,0,0,0,0,100,0), +(@PATH,42,-4102.894,3574.591,439.9884,0,0,0,0,100,0), +(@PATH,43,-4103.932,3544.913,439.9884,0,0,0,0,100,0), +(@PATH,44,-4104.642,3508.564,439.9884,0,0,0,0,100,0), +(@PATH,45,-4106.799,3476.665,439.9884,0,0,0,0,100,0), +(@PATH,46,-4107.433,3449.932,439.9884,0,0,0,0,100,0), +(@PATH,47,-4104.114,3418.243,439.9884,0,0,0,0,100,0), +(@PATH,48,-4089.375,3376.191,439.9884,0,0,0,0,100,0), +(@PATH,49,-4055.623,3343.717,446.405,0,0,0,0,100,0), +(@PATH,50,-4011.469,3341.788,448.6551,0,0,0,0,100,0), +(@PATH,51,-3975.74,3311.974,446.6827,0,0,0,0,100,0), +(@PATH,52,-3947.277,3278.158,445.544,0,0,0,0,100,0), +(@PATH,53,-3922.814,3246.151,445.7939,0,0,0,0,100,0), +(@PATH,54,-3886.357,3212.919,439.9884,0,0,0,0,100,0); +-- 0x1C393042401682C000002B0003B619B4 .go -3852.509 3183.065 439.9884 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 86115; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3844.01,`position_y`=3755.452,`position_z`=357.5598 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3844.01,3755.452,357.5598,0,0,0,0,100,0), +(@PATH,2,-3852.51,3791.215,357.0599,0,0,0,0,100,0), +(@PATH,3,-3890.182,3810.264,355.8931,0,0,0,0,100,0), +(@PATH,4,-3916.092,3784.685,356.5043,0,0,0,0,100,0), +(@PATH,5,-3923.033,3754.531,361.0602,0,0,0,0,100,0), +(@PATH,6,-3922.995,3732.825,381.1874,0,0,0,0,100,0), +(@PATH,7,-3926.192,3702.992,389.9645,0,0,0,0,100,0), +(@PATH,8,-3920.217,3670.407,389.9645,0,0,0,0,100,0), +(@PATH,9,-3902.139,3652.927,389.9645,0,0,0,0,100,0), +(@PATH,10,-3881.576,3654.323,389.9645,0,0,0,0,100,0), +(@PATH,11,-3865.405,3672.89,381.4647,0,0,0,0,100,0), +(@PATH,12,-3862.587,3682.567,374.4212,0,0,0,0,100,0), +(@PATH,13,-3856.335,3709.221,366.0322,0,0,0,0,100,0); +-- 0x1C393042401682C000002C00003804ED .go -3844.01 3755.452 357.5598 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 79017; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3712.47,`position_y`=3449.822,`position_z`=329.5283 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3712.47,3449.822,329.5283,0,0,0,0,100,0), +(@PATH,2,-3692.213,3483.701,323.2226,0,0,0,0,100,0), +(@PATH,3,-3682.306,3518.447,319.0838,0,0,0,0,100,0), +(@PATH,4,-3686.292,3551.121,328.0282,0,0,0,0,100,0), +(@PATH,5,-3704.019,3589.462,327.0838,0,0,0,0,100,0), +(@PATH,6,-3720.923,3618.094,323.1671,0,0,0,0,100,0), +(@PATH,7,-3746.331,3629.958,322.9449,0,0,0,0,100,0), +(@PATH,8,-3788.036,3651.199,328.056,0,0,0,0,100,0), +(@PATH,9,-3829.155,3656.951,343.6671,0,0,0,0,100,0), +(@PATH,10,-3864.913,3641.72,343.6671,0,0,0,0,100,0), +(@PATH,11,-3899.767,3634.007,334.5004,0,0,0,0,100,0), +(@PATH,12,-3932.793,3625.805,327.7227,0,0,0,0,100,0), +(@PATH,13,-3965.984,3604.831,323.5561,0,0,0,0,100,0), +(@PATH,14,-3994.316,3568.82,324.0004,0,0,0,0,100,0), +(@PATH,15,-4020.807,3533.474,321.6671,0,0,0,0,100,0), +(@PATH,16,-4017.46,3505.427,320.4171,0,0,0,0,100,0), +(@PATH,17,-4012.915,3469.437,318.2504,0,0,0,0,100,0), +(@PATH,18,-4008.829,3443.473,322.9727,0,0,0,0,100,0), +(@PATH,19,-3987.128,3409.836,320.0283,0,0,0,0,100,0), +(@PATH,20,-3956.549,3381.68,323.2782,0,0,0,0,100,0), +(@PATH,21,-3917.093,3373.904,324.1949,0,0,0,0,100,0), +(@PATH,22,-3879.394,3373.863,331.1393,0,0,0,0,100,0), +(@PATH,23,-3846.889,3379.781,335.556,0,0,0,0,100,0), +(@PATH,24,-3815.72,3383.242,336.0282,0,0,0,0,100,0), +(@PATH,25,-3785.73,3387.147,333.7504,0,0,0,0,100,0), +(@PATH,26,-3745.971,3412.045,331.7226,0,0,0,0,100,0); +-- 0x1C393042401682C00000D80000384658 .go -3712.47 3449.822 329.5283 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132567; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3800.044,`position_y`=3329.872,`position_z`=342.0992 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3800.044,3329.872,342.0992,0,0,0,0,100,0), +(@PATH,2,-3820.034,3366.339,344.5435,0,0,0,0,100,0), +(@PATH,3,-3848.72,3382.158,349.6544,0,0,0,0,100,0), +(@PATH,4,-3866.445,3399.19,356.9323,0,0,0,0,100,0), +(@PATH,5,-3892.608,3428.64,364.4878,0,0,0,0,100,0), +(@PATH,6,-3875.494,3457.741,364.4878,0,0,0,0,100,0), +(@PATH,7,-3846.305,3462.793,364.4878,0,0,0,0,100,0), +(@PATH,8,-3835.524,3455.278,363.4879,0,0,0,0,100,0), +(@PATH,9,-3826.342,3432.901,363.4879,0,0,0,0,100,0), +(@PATH,10,-3833.529,3403.362,349.9602,0,0,0,0,100,0), +(@PATH,11,-3849.905,3384.756,348.2379,0,0,0,0,100,0), +(@PATH,12,-3869.018,3342.68,345.9046,0,0,0,0,100,0), +(@PATH,13,-3866.873,3308.942,344.5435,0,0,0,0,100,0), +(@PATH,14,-3833.351,3299.779,344.5435,0,0,0,0,100,0); +-- 0x1C393042401682C00000D80000389A53 .go -3800.044 3329.872 342.0992 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132557; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4027.127,`position_y`=3236.136,`position_z`=342.3879 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-4027.127,3236.136,342.3879,0,0,0,0,100,0), +(@PATH,2,-4050.725,3247.826,342.3879,0,0,0,0,100,0), +(@PATH,3,-4074.902,3254.402,339.4433,0,0,0,0,100,0), +(@PATH,4,-4099.817,3279.177,340.388,0,0,0,0,100,0), +(@PATH,5,-4090.614,3300.566,342.3879,0,0,0,0,100,0), +(@PATH,6,-4066.256,3322.034,342.3879,0,0,0,0,100,0), +(@PATH,7,-4034.025,3315.976,340.4436,0,0,0,0,100,0), +(@PATH,8,-4000.627,3300.234,340.7216,0,0,0,0,100,0), +(@PATH,9,-3962.779,3269.458,342.3879,0,0,0,0,100,0), +(@PATH,10,-3932.333,3241.691,350.61,0,0,0,0,100,0), +(@PATH,11,-3924.384,3214.195,353.11,0,0,0,0,100,0), +(@PATH,12,-3948.188,3192.575,352.915,0,0,0,0,100,0), +(@PATH,13,-3975.502,3190.098,351.4991,0,0,0,0,100,0), +(@PATH,14,-4002.08,3217.684,348.0821,0,0,0,0,100,0); +-- 0x1C393042401682C00000D800003947B4 .go -4027.127 3236.136 342.3879 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 86099; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3617.656,`position_y`=3768.498,`position_z`=321.4414 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3617.656,3768.498,321.4414,0,0,0,0,100,0), +(@PATH,2,-3621.72,3753.039,319.025,0,0,0,0,100,0), +(@PATH,3,-3619.644,3727.897,309.8305,0,0,0,0,100,0), +(@PATH,4,-3627.178,3681.108,308.5527,0,0,0,0,100,0), +(@PATH,5,-3656.429,3650.599,304.2195,0,0,0,0,100,0), +(@PATH,6,-3696.808,3638.603,303.0528,0,0,0,0,100,0), +(@PATH,7,-3734.566,3654.597,302.6361,0,0,0,0,100,0), +(@PATH,8,-3766.324,3670.245,301.1362,0,0,0,0,100,0), +(@PATH,9,-3799.271,3684.971,303.1361,0,0,0,0,100,0), +(@PATH,10,-3832.15,3705.031,308.4691,0,0,0,0,100,0), +(@PATH,11,-3868.131,3721.502,318.4415,0,0,0,0,100,0), +(@PATH,12,-3909.399,3735.214,328.5527,0,0,0,0,100,0), +(@PATH,13,-3931.017,3766.784,334.3581,0,0,0,0,100,0), +(@PATH,14,-3917.445,3807.967,334.4695,0,0,0,0,100,0), +(@PATH,15,-3890.349,3823.759,327.1638,0,0,0,0,100,0), +(@PATH,16,-3849.03,3819.391,319.025,0,0,0,0,100,0), +(@PATH,17,-3822.998,3781.306,314.3583,0,0,0,0,100,0), +(@PATH,18,-3792.191,3762.3,302.9972,0,0,0,0,100,0), +(@PATH,19,-3753.88,3777.921,300.1917,0,0,0,0,100,0), +(@PATH,20,-3738.559,3813.297,304.1084,0,0,0,0,100,0), +(@PATH,21,-3707.912,3826.754,304.9972,0,0,0,0,100,0), +(@PATH,22,-3666.76,3801.158,304.9972,0,0,0,0,100,0), +(@PATH,23,-3632.452,3787.691,313.8025,0,0,0,0,100,0); +-- 0x1C393042401682C00000D800003950AB .go -3617.656 3768.498 321.4414 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132562; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3740.354,`position_y`=3781.2,`position_z`=318.1236 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3740.354,3781.2,318.1236,0,0,0,0,100,0), +(@PATH,2,-3733.342,3800.063,318.5958,0,0,0,0,100,0), +(@PATH,3,-3700.761,3815.838,314.9293,0,0,0,0,100,0), +(@PATH,4,-3684.377,3790.57,311.3183,0,0,0,0,100,0), +(@PATH,5,-3673.302,3755.679,311.3183,0,0,0,0,100,0), +(@PATH,6,-3654.191,3733.858,317.7345,0,0,0,0,100,0), +(@PATH,7,-3627.812,3735.349,321.0125,0,0,0,0,100,0), +(@PATH,8,-3620.85,3745.508,318.7352,0,0,0,0,100,0), +(@PATH,9,-3616.733,3766.586,318.0404,0,0,0,0,100,0), +(@PATH,10,-3633.59,3782.3,318.1792,0,0,0,0,100,0), +(@PATH,11,-3666.707,3773.215,316.2348,0,0,0,0,100,0), +(@PATH,12,-3699.968,3755.006,317.2626,0,0,0,0,100,0), +(@PATH,13,-3728.831,3766.574,318.1514,0,0,0,0,100,0); +-- 0x1C393042401682C00000D800003955EA .go -3740.354 3781.2 318.1236 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132558; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3889.631,`position_y`=3647.446,`position_z`=379.841 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3889.631,3647.446,379.841,0,0,0,0,100,0), +(@PATH,2,-3867.698,3661.597,374.2303,0,0,0,0,100,0), +(@PATH,3,-3829.105,3657.187,352.5638,0,0,0,0,100,0), +(@PATH,4,-3781.735,3660.671,339.2026,0,0,0,0,100,0), +(@PATH,5,-3733.907,3659.38,326.0082,0,0,0,0,100,0), +(@PATH,6,-3700.169,3654.304,306.0638,0,0,0,0,100,0), +(@PATH,7,-3666.533,3646.272,305.6747,0,0,0,0,100,0), +(@PATH,8,-3633.503,3666.819,305.6747,0,0,0,0,100,0), +(@PATH,9,-3615.833,3700.001,308.675,0,0,0,0,100,0), +(@PATH,10,-3612.93,3733.396,310.8136,0,0,0,0,100,0), +(@PATH,11,-3620.4,3766.181,312.2859,0,0,0,0,100,0), +(@PATH,12,-3633.891,3791.979,308.6469,0,0,0,0,100,0), +(@PATH,13,-3672.738,3787.063,303.5358,0,0,0,0,100,0), +(@PATH,14,-3699.661,3766.161,308.3416,0,0,0,0,100,0), +(@PATH,15,-3722.004,3734.262,307.3692,0,0,0,0,100,0), +(@PATH,16,-3758.981,3700.716,303.9804,0,0,0,0,100,0), +(@PATH,17,-3780.951,3669.244,307.3969,0,0,0,0,100,0), +(@PATH,18,-3823.718,3662.368,306.5638,0,0,0,0,100,0), +(@PATH,19,-3855.767,3696.363,309.2023,0,0,0,0,100,0), +(@PATH,20,-3888.813,3716.222,313.5079,0,0,0,0,100,0), +(@PATH,21,-3922.735,3736.949,316.8968,0,0,0,0,100,0), +(@PATH,22,-3932.095,3764.875,321.5081,0,0,0,0,100,0), +(@PATH,23,-3910.485,3799.088,334.758,0,0,0,0,100,0), +(@PATH,24,-3868.099,3812.761,342.1745,0,0,0,0,100,0), +(@PATH,25,-3842.411,3793.997,354.0078,0,0,0,0,100,0), +(@PATH,26,-3820.221,3754.304,346.8967,0,0,0,0,100,0), +(@PATH,27,-3833.732,3709.265,337.0357,0,0,0,0,100,0), +(@PATH,28,-3851.1,3670.116,337.0357,0,0,0,0,100,0), +(@PATH,29,-3880.107,3634.346,337.0357,0,0,0,0,100,0), +(@PATH,30,-3922.091,3616.533,325.3135,0,0,0,0,100,0), +(@PATH,31,-3965.485,3605.971,311.0912,0,0,0,0,100,0), +(@PATH,32,-3990.204,3580.163,305.9802,0,0,0,0,100,0), +(@PATH,33,-4011.796,3540.719,305.9802,0,0,0,0,100,0), +(@PATH,34,-4011.68,3508.126,305.9802,0,0,0,0,100,0), +(@PATH,35,-3987.115,3486.282,305.9802,0,0,0,0,100,0), +(@PATH,36,-3945.38,3469.3,318.369,0,0,0,0,100,0), +(@PATH,37,-3915.382,3492.937,334.7857,0,0,0,0,100,0), +(@PATH,38,-3903.774,3531.629,345.4246,0,0,0,0,100,0), +(@PATH,39,-3920.156,3565.949,365.369,0,0,0,0,100,0), +(@PATH,40,-3933.356,3594.115,376.4244,0,0,0,0,100,0), +(@PATH,41,-3912.393,3631.522,376.4244,0,0,0,0,100,0); +-- 0x1C393042401682C00000D8000039560D .go -3889.631 3647.446 379.841 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 86116; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3876.833,`position_y`=3314.512,`position_z`=379.5609 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3876.833,3314.512,379.5609,0,0,0,0,100,0), +(@PATH,2,-3886.097,3325.345,379.5609,0,0,0,0,100,0), +(@PATH,3,-3911.672,3347.092,379.5609,0,0,0,0,100,0), +(@PATH,4,-3945.02,3355.806,379.5609,0,0,0,0,100,0), +(@PATH,5,-3972.972,3374.654,379.5609,0,0,0,0,100,0), +(@PATH,6,-4009.497,3393.97,379.5609,0,0,0,0,100,0), +(@PATH,7,-4038.995,3394.833,379.5609,0,0,0,0,100,0), +(@PATH,8,-4084.306,3383.78,379.5609,0,0,0,0,100,0), +(@PATH,9,-4114.101,3348.398,379.5609,0,0,0,0,100,0), +(@PATH,10,-4121.285,3315.157,359.6998,0,0,0,0,100,0), +(@PATH,11,-4133.357,3269.041,344.6721,0,0,0,0,100,0), +(@PATH,12,-4127.872,3224.243,336.2553,0,0,0,0,100,0), +(@PATH,13,-4088.58,3195.296,338.8943,0,0,0,0,100,0), +(@PATH,14,-4068.468,3153.282,341.0054,0,0,0,0,100,0), +(@PATH,15,-4070.876,3123.454,342.6997,0,0,0,0,100,0), +(@PATH,16,-4097.591,3094.782,347.3387,0,0,0,0,100,0), +(@PATH,17,-4122.666,3063.981,348.1721,0,0,0,0,100,0), +(@PATH,18,-4162.276,3056.197,349.6165,0,0,0,0,100,0), +(@PATH,19,-4202.113,3083.117,358.5054,0,0,0,0,100,0), +(@PATH,20,-4214.216,3116.871,357.2553,0,0,0,0,100,0), +(@PATH,21,-4193.599,3157.323,355.2832,0,0,0,0,100,0), +(@PATH,22,-4155.592,3185.045,347.0332,0,0,0,0,100,0), +(@PATH,23,-4111.882,3181.491,345.0887,0,0,0,0,100,0), +(@PATH,24,-4062.104,3179.68,348.9498,0,0,0,0,100,0), +(@PATH,25,-4020.427,3179.234,361.4219,0,0,0,0,100,0), +(@PATH,26,-3982.672,3180.415,363.0051,0,0,0,0,100,0), +(@PATH,27,-3951.448,3159.866,363.561,0,0,0,0,100,0), +(@PATH,28,-3937.524,3133.349,370.6444,0,0,0,0,100,0), +(@PATH,29,-3931.404,3105.327,376.0884,0,0,0,0,100,0), +(@PATH,30,-3933.873,3066.744,379.5609,0,0,0,0,100,0), +(@PATH,31,-3940.64,3017.597,385.5607,0,0,0,0,100,0), +(@PATH,32,-3962.612,2986.642,387.3109,0,0,0,0,100,0), +(@PATH,33,-3987.704,2976.624,388.1721,0,0,0,0,100,0), +(@PATH,34,-4028.228,2974.074,379.5609,0,0,0,0,100,0), +(@PATH,35,-4068.643,2997.102,369.2554,0,0,0,0,100,0), +(@PATH,36,-4093.04,3026.769,367.2279,0,0,0,0,100,0), +(@PATH,37,-4081.151,3058.765,357.4498,0,0,0,0,100,0), +(@PATH,38,-4050.25,3086.566,362.8388,0,0,0,0,100,0), +(@PATH,39,-4009.628,3109.691,361.9498,0,0,0,0,100,0), +(@PATH,40,-3962.259,3115.2,365.2273,0,0,0,0,100,0), +(@PATH,41,-3931.493,3131.271,371.1159,0,0,0,0,100,0), +(@PATH,42,-3901.853,3157.168,376.1166,0,0,0,0,100,0), +(@PATH,43,-3882.195,3190.008,374.5609,0,0,0,0,100,0), +(@PATH,44,-3907.507,3233.704,369.0056,0,0,0,0,100,0), +(@PATH,45,-3930.386,3264.117,346.8111,0,0,0,0,100,0), +(@PATH,46,-3952.398,3305.412,329.4775,0,0,0,0,100,0), +(@PATH,47,-3949.958,3344.656,317.033,0,0,0,0,100,0), +(@PATH,48,-3933.078,3390.3,316.2833,0,0,0,0,100,0), +(@PATH,49,-3924.384,3438.506,320.0887,0,0,0,0,100,0), +(@PATH,50,-3908.001,3480.083,321.7832,0,0,0,0,100,0), +(@PATH,51,-3881.964,3513.231,323.2551,0,0,0,0,100,0), +(@PATH,52,-3844.591,3536.472,335.8942,0,0,0,0,100,0), +(@PATH,53,-3822.905,3535.266,339.8388,0,0,0,0,100,0), +(@PATH,54,-3792.544,3507.122,337.1997,0,0,0,0,100,0), +(@PATH,55,-3760.572,3487.132,351.5052,0,0,0,0,100,0), +(@PATH,56,-3744.966,3453.418,364.5887,0,0,0,0,100,0), +(@PATH,57,-3744.307,3416.908,367.4221,0,0,0,0,100,0), +(@PATH,58,-3740.536,3368.536,367.0887,0,0,0,0,100,0), +(@PATH,59,-3734.622,3321.623,379.5609,0,0,0,0,100,0), +(@PATH,60,-3731.181,3282.171,379.5609,0,0,0,0,100,0), +(@PATH,61,-3694.877,3249.842,379.5609,0,0,0,0,100,0), +(@PATH,62,-3655.565,3261.063,379.5609,0,0,0,0,100,0), +(@PATH,63,-3641.669,3284.071,367.7832,0,0,0,0,100,0), +(@PATH,64,-3641.303,3315.587,364.9221,0,0,0,0,100,0), +(@PATH,65,-3654.031,3343.666,369.4221,0,0,0,0,100,0), +(@PATH,66,-3680.551,3352.762,367.6165,0,0,0,0,100,0), +(@PATH,67,-3714.793,3358.927,363.9776,0,0,0,0,100,0), +(@PATH,68,-3753.792,3357.834,379.5609,0,0,0,0,100,0), +(@PATH,69,-3787.513,3323.292,384.7554,0,0,0,0,100,0), +(@PATH,70,-3817.402,3284.448,390.9497,0,0,0,0,100,0), +(@PATH,71,-3855.805,3289.496,379.5609,0,0,0,0,100,0); +-- 0x1C393042401682C00000D80000395FE7 .go -3876.833 3314.512 379.5609 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132564; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3811.575,`position_y`=3318.012,`position_z`=350.0489 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3811.575,3318.012,350.0489,0,0,0,0,100,0), +(@PATH,2,-3839.544,3360.737,346.5213,0,0,0,0,100,0), +(@PATH,3,-3844.532,3382.859,327.4657,0,0,0,0,100,0), +(@PATH,4,-3824.744,3421.51,330.4099,0,0,0,0,100,0), +(@PATH,5,-3815.863,3458.307,331.2989,0,0,0,0,100,0), +(@PATH,6,-3810.683,3497.717,331.2989,0,0,0,0,100,0), +(@PATH,7,-3813.658,3530.778,320.3824,0,0,0,0,100,0), +(@PATH,8,-3816.187,3562.303,309.2156,0,0,0,0,100,0), +(@PATH,9,-3807.29,3592.113,304.2435,0,0,0,0,100,0), +(@PATH,10,-3785.319,3618.569,304.2435,0,0,0,0,100,0), +(@PATH,11,-3745.147,3632.447,304.2435,0,0,0,0,100,0), +(@PATH,12,-3709.023,3627.542,304.2435,0,0,0,0,100,0), +(@PATH,13,-3675.768,3604.466,304.2435,0,0,0,0,100,0), +(@PATH,14,-3671.146,3576.667,304.2435,0,0,0,0,100,0), +(@PATH,15,-3681.459,3543.929,304.2435,0,0,0,0,100,0), +(@PATH,16,-3683.946,3516.303,304.2435,0,0,0,0,100,0), +(@PATH,17,-3690.97,3482.81,304.2435,0,0,0,0,100,0), +(@PATH,18,-3718.609,3446.152,304.2435,0,0,0,0,100,0), +(@PATH,19,-3752.872,3415.494,304.2435,0,0,0,0,100,0), +(@PATH,20,-3787.441,3393.248,306.6046,0,0,0,0,100,0), +(@PATH,21,-3819.708,3391.489,304.2435,0,0,0,0,100,0), +(@PATH,22,-3843.183,3389.003,306.9379,0,0,0,0,100,0), +(@PATH,23,-3878.647,3381.219,308.4658,0,0,0,0,100,0), +(@PATH,24,-3917.604,3385.046,313.9101,0,0,0,0,100,0), +(@PATH,25,-3948.888,3388.875,314.6601,0,0,0,0,100,0), +(@PATH,26,-3981.859,3411.407,311.4101,0,0,0,0,100,0), +(@PATH,27,-4006.548,3451.265,312.8823,0,0,0,0,100,0), +(@PATH,28,-4013.026,3483.869,313.6044,0,0,0,0,100,0), +(@PATH,29,-4007.704,3522.086,312.9934,0,0,0,0,100,0), +(@PATH,30,-3979.958,3551.535,309.1602,0,0,0,0,100,0), +(@PATH,31,-3949.836,3557.036,311.2711,0,0,0,0,100,0), +(@PATH,32,-3916.583,3556.782,310.1602,0,0,0,0,100,0), +(@PATH,33,-3878.491,3547.684,308.91,0,0,0,0,100,0), +(@PATH,34,-3848.358,3529.306,308.3823,0,0,0,0,100,0), +(@PATH,35,-3810.661,3519.969,310.9657,0,0,0,0,100,0), +(@PATH,36,-3788.128,3509.623,314.0764,0,0,0,0,100,0), +(@PATH,37,-3746.377,3484.105,314.4373,0,0,0,0,100,0), +(@PATH,38,-3720.415,3453.266,311.1879,0,0,0,0,100,0), +(@PATH,39,-3711.39,3414.835,316.1873,0,0,0,0,100,0), +(@PATH,40,-3695.241,3382.754,310.2711,0,0,0,0,100,0), +(@PATH,41,-3690.628,3349.262,309.5486,0,0,0,0,100,0), +(@PATH,42,-3707.501,3320.029,317.0488,0,0,0,0,100,0), +(@PATH,43,-3743.783,3305.247,330.9655,0,0,0,0,100,0), +(@PATH,44,-3787.108,3314.23,339.9933,0,0,0,0,100,0); +-- 0x1C393042401682C00000D80000397863 .go -3811.575 3318.012 350.0489 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132554; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4096.788,`position_y`=3033.959,`position_z`=360.6063 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-4096.788,3033.959,360.6063,0,0,0,0,100,0), +(@PATH,2,-4104.214,3041.3,359.5785,0,0,0,0,100,0), +(@PATH,3,-4125.444,3052.258,358.9676,0,0,0,0,100,0), +(@PATH,4,-4159.867,3033.596,358.9952,0,0,0,0,100,0), +(@PATH,5,-4186.089,3020.478,361.662,0,0,0,0,100,0), +(@PATH,6,-4216.206,3023.308,363.8009,0,0,0,0,100,0), +(@PATH,7,-4219.776,3049.481,362.9398,0,0,0,0,100,0), +(@PATH,8,-4205.974,3076.206,360.8285,0,0,0,0,100,0), +(@PATH,9,-4175.602,3071.705,356.4121,0,0,0,0,100,0), +(@PATH,10,-4149.558,3039.067,356.4121,0,0,0,0,100,0), +(@PATH,11,-4139.287,3016.167,361.1343,0,0,0,0,100,0), +(@PATH,12,-4115.834,2995.427,363.3842,0,0,0,0,100,0), +(@PATH,13,-4089.456,3009.014,362.3842,0,0,0,0,100,0); +-- 0x1C393042401682C00000D80000397B33 .go -4096.788 3033.959 360.6063 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 83238; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3740.354,`position_y`=3781.2,`position_z`=318.1236 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3740.354,3781.2,318.1236,0,0,0,0,100,0), +(@PATH,2,-3733.342,3800.063,318.5958,0,0,0,0,100,0), +(@PATH,3,-3700.761,3815.838,314.9293,0,0,0,0,100,0), +(@PATH,4,-3684.377,3790.57,311.3183,0,0,0,0,100,0), +(@PATH,5,-3673.302,3755.679,311.3183,0,0,0,0,100,0), +(@PATH,6,-3654.191,3733.858,317.7345,0,0,0,0,100,0), +(@PATH,7,-3627.812,3735.349,321.0125,0,0,0,0,100,0), +(@PATH,8,-3620.85,3745.508,318.7352,0,0,0,0,100,0), +(@PATH,9,-3616.733,3766.586,318.0404,0,0,0,0,100,0), +(@PATH,10,-3633.59,3782.3,318.1792,0,0,0,0,100,0), +(@PATH,11,-3666.707,3773.215,316.2348,0,0,0,0,100,0), +(@PATH,12,-3699.968,3755.006,317.2626,0,0,0,0,100,0), +(@PATH,13,-3728.831,3766.574,318.1514,0,0,0,0,100,0); +-- 0x1C393042401682C00000D800003989DF .go -3740.354 3781.2 318.1236 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132566; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3671.494,`position_y`=3402.642,`position_z`=324.4617 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3671.494,3402.642,324.4617,0,0,0,0,100,0), +(@PATH,2,-3675.101,3400.796,324.5731,0,0,0,0,100,0), +(@PATH,3,-3695.996,3378.851,323.7954,0,0,0,0,100,0), +(@PATH,4,-3677.757,3333.374,329.4622,0,0,0,0,100,0), +(@PATH,5,-3671.793,3306.185,341.9066,0,0,0,0,100,0), +(@PATH,6,-3691.331,3277.393,341.9066,0,0,0,0,100,0), +(@PATH,7,-3714.71,3287.554,341.9066,0,0,0,0,100,0), +(@PATH,8,-3715.633,3314.267,336.4897,0,0,0,0,100,0), +(@PATH,9,-3681.489,3340.859,327.934,0,0,0,0,100,0), +(@PATH,10,-3648.484,3360.056,326.1562,0,0,0,0,100,0), +(@PATH,11,-3641.23,3384.09,325.4897,0,0,0,0,100,0), +(@PATH,12,-3655.433,3406.725,325.0451,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE000039182E .go -3671.494 3402.642 324.4617 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132556; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4209.313,`position_y`=3165.873,`position_z`=345.6776 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-4209.313,3165.873,345.6776,0,0,0,0,100,0), +(@PATH,2,-4209.917,3166.669,345.6776,0,0,0,0,100,0), +(@PATH,3,-4214.472,3180.67,347.2502,0,0,0,0,100,0), +(@PATH,4,-4216.52,3213.613,345.6775,0,0,0,0,100,0), +(@PATH,5,-4208.682,3255.884,339.0109,0,0,0,0,100,0), +(@PATH,6,-4189.062,3300.134,333.0109,0,0,0,0,100,0), +(@PATH,7,-4149.259,3324.875,328.7887,0,0,0,0,100,0), +(@PATH,8,-4108.452,3350.17,317.011,0,0,0,0,100,0), +(@PATH,9,-4062.702,3352.578,312.0665,0,0,0,0,100,0), +(@PATH,10,-4014.43,3348.026,315.1498,0,0,0,0,100,0), +(@PATH,11,-3986.476,3375.022,322.1496,0,0,0,0,100,0), +(@PATH,12,-3981.146,3423.131,315.4276,0,0,0,0,100,0), +(@PATH,13,-3984.354,3463.035,318.9552,0,0,0,0,100,0), +(@PATH,14,-3983.076,3512.558,312.2053,0,0,0,0,100,0), +(@PATH,15,-3966.213,3540.754,323.3442,0,0,0,0,100,0), +(@PATH,16,-3949.22,3584.559,328.372,0,0,0,0,100,0), +(@PATH,17,-3913.326,3616.715,336.8163,0,0,0,0,100,0), +(@PATH,18,-3871.808,3634.682,342.0666,0,0,0,0,100,0), +(@PATH,19,-3845.71,3666.634,355.0107,0,0,0,0,100,0), +(@PATH,20,-3851.377,3715.548,351.7607,0,0,0,0,100,0), +(@PATH,21,-3821.307,3750.763,351.2052,0,0,0,0,100,0), +(@PATH,22,-3795.161,3777.228,334.7328,0,0,0,0,100,0), +(@PATH,23,-3763.429,3800.694,324.3996,0,0,0,0,100,0), +(@PATH,24,-3732.729,3778.102,316.9553,0,0,0,0,100,0), +(@PATH,25,-3699.662,3753.815,315.6498,0,0,0,0,100,0), +(@PATH,26,-3666.87,3741.209,315.7607,0,0,0,0,100,0), +(@PATH,27,-3634.06,3717.237,319.2329,0,0,0,0,100,0), +(@PATH,28,-3613.867,3678.084,317.8165,0,0,0,0,100,0), +(@PATH,29,-3622.779,3632.821,322.9277,0,0,0,0,100,0), +(@PATH,30,-3620.368,3590.816,320.0942,0,0,0,0,100,0), +(@PATH,31,-3625.737,3551.353,323.3442,0,0,0,0,100,0), +(@PATH,32,-3626.56,3508.485,328.3718,0,0,0,0,100,0), +(@PATH,33,-3652.823,3477.152,326.2332,0,0,0,0,100,0), +(@PATH,34,-3666.577,3433.208,328.844,0,0,0,0,100,0), +(@PATH,35,-3689.016,3394.729,323.7608,0,0,0,0,100,0), +(@PATH,36,-3716.738,3363.748,323.2885,0,0,0,0,100,0), +(@PATH,37,-3754.879,3351.833,332.8161,0,0,0,0,100,0), +(@PATH,38,-3795.422,3366.06,336.0938,0,0,0,0,100,0), +(@PATH,39,-3839.274,3378.524,336.0663,0,0,0,0,100,0), +(@PATH,40,-3884.272,3383.12,331.8162,0,0,0,0,100,0), +(@PATH,41,-3923.974,3361.845,329.0664,0,0,0,0,100,0), +(@PATH,42,-3938.367,3317.121,327.0108,0,0,0,0,100,0), +(@PATH,43,-3970.304,3289.182,332.4276,0,0,0,0,100,0), +(@PATH,44,-4001.49,3256,340.0942,0,0,0,0,100,0), +(@PATH,45,-4017.281,3211.053,337.8997,0,0,0,0,100,0), +(@PATH,46,-4034.001,3168.051,336.3162,0,0,0,0,100,0), +(@PATH,47,-4060.109,3128.304,345.6775,0,0,0,0,100,0), +(@PATH,48,-4089.788,3088.067,342.4553,0,0,0,0,100,0), +(@PATH,49,-4130.021,3082.164,339.8998,0,0,0,0,100,0), +(@PATH,50,-4161.369,3103.56,345.6775,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE0000391BB1 .go -4209.313 3165.873 345.6776 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132565; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3700.187,`position_y`=3268.531,`position_z`=332.5694 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3700.187,3268.531,332.5694,0,0,0,0,100,0), +(@PATH,2,-3712.445,3309.058,332.5694,0,0,0,0,100,0), +(@PATH,3,-3731.05,3347.229,317.6805,0,0,0,0,100,0), +(@PATH,4,-3716.804,3386.164,312.5971,0,0,0,0,100,0), +(@PATH,5,-3714.796,3416.085,310.3194,0,0,0,0,100,0), +(@PATH,6,-3726.431,3460.464,311.0414,0,0,0,0,100,0), +(@PATH,7,-3753.865,3482.538,314.9584,0,0,0,0,100,0), +(@PATH,8,-3788.998,3508.942,314.9305,0,0,0,0,100,0), +(@PATH,9,-3824.704,3524.107,309.9028,0,0,0,0,100,0), +(@PATH,10,-3848.736,3512.536,316.0972,0,0,0,0,100,0), +(@PATH,11,-3888.76,3485.173,326.2916,0,0,0,0,100,0), +(@PATH,12,-3912.334,3450.138,334.236,0,0,0,0,100,0), +(@PATH,13,-3915.319,3410.722,336.7916,0,0,0,0,100,0), +(@PATH,14,-3881.387,3385.134,337.5138,0,0,0,0,100,0), +(@PATH,15,-3847.486,3374.93,332.5694,0,0,0,0,100,0), +(@PATH,16,-3805.386,3361.039,326.6804,0,0,0,0,100,0), +(@PATH,17,-3773.776,3364.174,321.6806,0,0,0,0,100,0), +(@PATH,18,-3746.576,3378.93,320.8195,0,0,0,0,100,0), +(@PATH,19,-3711.678,3399.851,324.7638,0,0,0,0,100,0), +(@PATH,20,-3677.318,3417.94,324.6248,0,0,0,0,100,0), +(@PATH,21,-3633.113,3400.247,323.4301,0,0,0,0,100,0), +(@PATH,22,-3626.553,3376.975,323.0689,0,0,0,0,100,0), +(@PATH,23,-3616.881,3334.872,332.5694,0,0,0,0,100,0), +(@PATH,24,-3627.39,3296.557,332.5694,0,0,0,0,100,0), +(@PATH,25,-3664.143,3265.263,332.5694,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE0000391D86 .go -3700.187 3268.531 332.5694 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132555; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3910.414,`position_y`=2965.875,`position_z`=390.4576 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3910.414,2965.875,390.4576,0,0,0,0,100,0), +(@PATH,2,-3933.329,2966.657,390.4576,0,0,0,0,100,0), +(@PATH,3,-3954.885,2975.502,382.291,0,0,0,0,100,0), +(@PATH,4,-3963.788,3013.65,381.3741,0,0,0,0,100,0), +(@PATH,5,-3969.197,3050.419,375.9853,0,0,0,0,100,0), +(@PATH,6,-3984.531,3090.169,372.0131,0,0,0,0,100,0), +(@PATH,7,-3972.277,3135.571,367.5407,0,0,0,0,100,0), +(@PATH,8,-3947.474,3178.757,362.0132,0,0,0,0,100,0), +(@PATH,9,-3930.654,3222.331,346.0132,0,0,0,0,100,0), +(@PATH,10,-3944.785,3269.054,337.6526,0,0,0,0,100,0), +(@PATH,11,-3988.984,3283.474,328.0133,0,0,0,0,100,0), +(@PATH,12,-4020.175,3305.831,332.7634,0,0,0,0,100,0), +(@PATH,13,-4043.304,3338.783,339.9855,0,0,0,0,100,0), +(@PATH,14,-4076.572,3375.872,343.2631,0,0,0,0,100,0), +(@PATH,15,-4067.485,3424.765,347.1243,0,0,0,0,100,0), +(@PATH,16,-4037.804,3458.173,351.3187,0,0,0,0,100,0), +(@PATH,17,-4007.092,3452.119,341.2909,0,0,0,0,100,0), +(@PATH,18,-3969.205,3437.343,334.1797,0,0,0,0,100,0), +(@PATH,19,-3932.203,3431.731,332.2077,0,0,0,0,100,0), +(@PATH,20,-3896.705,3421.381,327.7629,0,0,0,0,100,0), +(@PATH,21,-3871.978,3389.38,331.041,0,0,0,0,100,0), +(@PATH,22,-3827.513,3390.714,332.2075,0,0,0,0,100,0), +(@PATH,23,-3802.128,3368.306,336.7633,0,0,0,0,100,0), +(@PATH,24,-3790.874,3332.89,343.6242,0,0,0,0,100,0), +(@PATH,25,-3808.656,3291.044,352.0409,0,0,0,0,100,0), +(@PATH,26,-3817.205,3243.875,361.9853,0,0,0,0,100,0), +(@PATH,27,-3841.924,3206.913,365.2077,0,0,0,0,100,0), +(@PATH,28,-3882.906,3183.564,363.3185,0,0,0,0,100,0), +(@PATH,29,-3903.045,3142.097,372.3742,0,0,0,0,100,0), +(@PATH,30,-3883.694,3111.339,382.5131,0,0,0,0,100,0), +(@PATH,31,-3856.857,3076.734,390.4576,0,0,0,0,100,0), +(@PATH,32,-3843.808,3035.878,390.4576,0,0,0,0,100,0), +(@PATH,33,-3833.452,2993.256,390.4576,0,0,0,0,100,0), +(@PATH,34,-3866.545,2965.673,390.4576,0,0,0,0,100,0), +(@PATH,35,-3910.414,2965.875,390.4576,0,0,0,0,100,0), +(@PATH,36,-3933.329,2966.657,390.4576,0,0,0,0,100,0), +(@PATH,37,-3954.885,2975.502,382.291,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE0000393AF6 .go -3910.414 2965.875 390.4576 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 132560; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4210.051,`position_y`=3036.035,`position_z`=359.2715 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-4210.051,3036.035,359.2715,0,0,0,0,100,0), +(@PATH,2,-4197.814,3024.344,366.188,0,0,0,0,100,0), +(@PATH,3,-4166.595,3015.782,353.327,0,0,0,0,100,0), +(@PATH,4,-4119.361,3000.518,350.3828,0,0,0,0,100,0), +(@PATH,5,-4078.058,3004.437,346.7713,0,0,0,0,100,0), +(@PATH,6,-4047.495,3033.212,346.8269,0,0,0,0,100,0), +(@PATH,7,-4037.817,3075.937,350.9382,0,0,0,0,100,0), +(@PATH,8,-4037.221,3122.487,345.1326,0,0,0,0,100,0), +(@PATH,9,-4020.077,3150.257,329.8825,0,0,0,0,100,0), +(@PATH,10,-3983.114,3172.777,330.1326,0,0,0,0,100,0), +(@PATH,11,-3945.796,3163.176,338.4935,0,0,0,0,100,0), +(@PATH,12,-3906.744,3138.077,347.0493,0,0,0,0,100,0), +(@PATH,13,-3872.958,3116.541,357.4377,0,0,0,0,100,0), +(@PATH,14,-3857.695,3086.127,367.6046,0,0,0,0,100,0), +(@PATH,15,-3866.051,3043.046,372.1045,0,0,0,0,100,0), +(@PATH,16,-3902.363,3025,374.7159,0,0,0,0,100,0), +(@PATH,17,-3939.945,3047.438,368.138,0,0,0,0,100,0), +(@PATH,18,-3976.81,3075.321,357.9659,0,0,0,0,100,0), +(@PATH,19,-4015.781,3101.057,352.3272,0,0,0,0,100,0), +(@PATH,20,-4057.297,3120.64,344.0215,0,0,0,0,100,0), +(@PATH,21,-4093.992,3151.9,340.0216,0,0,0,0,100,0), +(@PATH,22,-4133.575,3148.626,338.077,0,0,0,0,100,0), +(@PATH,23,-4161.596,3113.013,348.6326,0,0,0,0,100,0), +(@PATH,24,-4193.336,3081.118,359.2715,0,0,0,0,100,0), +(@PATH,25,-4214.105,3060.078,359.2715,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE0000393F44 .go -4210.051 3036.035 359.2715 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 86117; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3894.564,`position_y`=3430.655,`position_z`=372.4708 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3894.564,3430.655,372.4708,0,0,0,0,100,0), +(@PATH,2,-3857.21,3447.031,372.4708,0,0,0,0,100,0), +(@PATH,3,-3823.56,3471.693,372.4708,0,0,0,0,100,0), +(@PATH,4,-3784.599,3479.697,372.4708,0,0,0,0,100,0), +(@PATH,5,-3742.468,3490.947,353.0265,0,0,0,0,100,0), +(@PATH,6,-3709.652,3520.501,345.0263,0,0,0,0,100,0), +(@PATH,7,-3664.314,3533.171,334.0263,0,0,0,0,100,0), +(@PATH,8,-3616.403,3539.115,323.9706,0,0,0,0,100,0), +(@PATH,9,-3582.801,3553.028,325.193,0,0,0,0,100,0), +(@PATH,10,-3589.008,3587.388,329.9429,0,0,0,0,100,0), +(@PATH,11,-3636.932,3603.025,325.1376,0,0,0,0,100,0), +(@PATH,12,-3663.247,3624.526,321.2208,0,0,0,0,100,0), +(@PATH,13,-3704.071,3625.825,318.6652,0,0,0,0,100,0), +(@PATH,14,-3750.566,3629.281,322.7488,0,0,0,0,100,0), +(@PATH,15,-3785.251,3646.629,322.5265,0,0,0,0,100,0), +(@PATH,16,-3821.648,3660.992,332.4431,0,0,0,0,100,0), +(@PATH,17,-3844.523,3693.082,347.1931,0,0,0,0,100,0), +(@PATH,18,-3873.079,3712.225,349.1932,0,0,0,0,100,0), +(@PATH,19,-3903.724,3693.448,347.4153,0,0,0,0,100,0), +(@PATH,20,-3935.185,3680.15,346.9429,0,0,0,0,100,0), +(@PATH,21,-3961.531,3655.501,345.2486,0,0,0,0,100,0), +(@PATH,22,-3966.79,3606.822,348.2763,0,0,0,0,100,0), +(@PATH,23,-3973.929,3571.161,341.0261,0,0,0,0,100,0), +(@PATH,24,-3980.9,3522.605,335.8875,0,0,0,0,100,0), +(@PATH,25,-4004.451,3487.919,317.9431,0,0,0,0,100,0), +(@PATH,26,-4001.448,3441.261,334.3042,0,0,0,0,100,0), +(@PATH,27,-3966.929,3406.75,330.5819,0,0,0,0,100,0), +(@PATH,28,-3922.993,3396.193,351.9707,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE00003946C7 .go -3894.564 3430.655 372.4708 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 86131; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3884.442,`position_y`=3113.831,`position_z`=389.185 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3884.442,3113.831,389.185,0,0,0,0,100,0), +(@PATH,2,-3869.677,3093.181,392.3522,0,0,0,0,100,0), +(@PATH,3,-3876.115,3078.8,392.3522,0,0,0,0,100,0), +(@PATH,4,-3900.006,3066.922,392.3522,0,0,0,0,100,0), +(@PATH,5,-3934.172,3083.277,392.3522,0,0,0,0,100,0), +(@PATH,6,-3942.406,3108.275,392.3522,0,0,0,0,100,0), +(@PATH,7,-3955.406,3132.591,392.3522,0,0,0,0,100,0), +(@PATH,8,-3983.802,3151.235,400.1577,0,0,0,0,100,0), +(@PATH,9,-4018.729,3167.318,408.8244,0,0,0,0,100,0), +(@PATH,10,-4048.56,3146.723,397.5466,0,0,0,0,100,0), +(@PATH,11,-4034.677,3106.917,375.3246,0,0,0,0,100,0), +(@PATH,12,-3999.241,3105.82,364.3524,0,0,0,0,100,0), +(@PATH,13,-3976.743,3112.321,363.4634,0,0,0,0,100,0), +(@PATH,14,-3934.065,3120.998,373.4079,0,0,0,0,100,0), +(@PATH,15,-3904.763,3124.439,386.7683,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE0000394785 .go -3884.442 3113.831 389.185 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 83237; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3620.779,`position_y`=3761.98,`position_z`=319.1757 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-3620.779,3761.98,319.1757,0,0,0,0,100,0), +(@PATH,2,-3621.137,3762.914,319.1757,0,0,0,0,100,0), +(@PATH,3,-3621.72,3753.039,319.025,0,0,0,0,100,0), +(@PATH,4,-3619.644,3727.897,309.8305,0,0,0,0,100,0), +(@PATH,5,-3627.178,3681.108,308.5527,0,0,0,0,100,0), +(@PATH,6,-3656.429,3650.599,304.2195,0,0,0,0,100,0), +(@PATH,7,-3696.808,3638.603,303.0528,0,0,0,0,100,0), +(@PATH,8,-3734.566,3654.597,302.6361,0,0,0,0,100,0), +(@PATH,9,-3766.324,3670.245,301.1362,0,0,0,0,100,0), +(@PATH,10,-3799.271,3684.971,303.1361,0,0,0,0,100,0), +(@PATH,11,-3832.15,3705.031,308.4691,0,0,0,0,100,0), +(@PATH,12,-3868.131,3721.502,318.4415,0,0,0,0,100,0), +(@PATH,13,-3909.399,3735.214,328.5527,0,0,0,0,100,0), +(@PATH,14,-3931.017,3766.784,334.3581,0,0,0,0,100,0), +(@PATH,15,-3917.445,3807.967,334.4695,0,0,0,0,100,0), +(@PATH,16,-3890.349,3823.759,327.1638,0,0,0,0,100,0), +(@PATH,17,-3849.03,3819.391,319.025,0,0,0,0,100,0), +(@PATH,18,-3822.998,3781.306,314.3583,0,0,0,0,100,0), +(@PATH,19,-3792.191,3762.3,302.9972,0,0,0,0,100,0), +(@PATH,20,-3753.88,3777.921,300.1917,0,0,0,0,100,0), +(@PATH,21,-3738.559,3813.297,304.1084,0,0,0,0,100,0), +(@PATH,22,-3707.912,3826.754,304.9972,0,0,0,0,100,0), +(@PATH,23,-3666.76,3801.158,304.9972,0,0,0,0,100,0), +(@PATH,24,-3632.452,3787.691,313.8025,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE00003981C1 .go -3620.779 3761.98 319.1757 + +-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT' +SET @NPC := 86133; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4210.051,`position_y`=3036.035,`position_z`=359.2715 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-4210.051,3036.035,359.2715,0,0,0,0,100,0), +(@PATH,2,-4197.814,3024.344,366.188,0,0,0,0,100,0), +(@PATH,3,-4166.595,3015.782,353.327,0,0,0,0,100,0), +(@PATH,4,-4119.361,3000.518,350.3828,0,0,0,0,100,0), +(@PATH,5,-4078.058,3004.437,346.7713,0,0,0,0,100,0), +(@PATH,6,-4047.495,3033.212,346.8269,0,0,0,0,100,0), +(@PATH,7,-4037.817,3075.937,350.9382,0,0,0,0,100,0), +(@PATH,8,-4037.221,3122.487,345.1326,0,0,0,0,100,0), +(@PATH,9,-4020.077,3150.257,329.8825,0,0,0,0,100,0), +(@PATH,10,-3983.114,3172.777,330.1326,0,0,0,0,100,0), +(@PATH,11,-3945.796,3163.176,338.4935,0,0,0,0,100,0), +(@PATH,12,-3906.744,3138.077,347.0493,0,0,0,0,100,0), +(@PATH,13,-3872.958,3116.541,357.4377,0,0,0,0,100,0), +(@PATH,14,-3857.695,3086.127,367.6046,0,0,0,0,100,0), +(@PATH,15,-3866.051,3043.046,372.1045,0,0,0,0,100,0), +(@PATH,16,-3902.363,3025,374.7159,0,0,0,0,100,0), +(@PATH,17,-3939.945,3047.438,368.138,0,0,0,0,100,0), +(@PATH,18,-3976.81,3075.321,357.9659,0,0,0,0,100,0), +(@PATH,19,-4015.781,3101.057,352.3272,0,0,0,0,100,0), +(@PATH,20,-4057.297,3120.64,344.0215,0,0,0,0,100,0), +(@PATH,21,-4093.992,3151.9,340.0216,0,0,0,0,100,0), +(@PATH,22,-4133.575,3148.626,338.077,0,0,0,0,100,0), +(@PATH,23,-4161.596,3113.013,348.6326,0,0,0,0,100,0), +(@PATH,24,-4193.336,3081.118,359.2715,0,0,0,0,100,0), +(@PATH,25,-4214.105,3060.078,359.2715,0,0,0,0,100,0); +-- 0x1C393042401682C00000DE00003985F0 .go -4210.051 3036.035 359.2715 + +UPDATE `waypoint_data` SET `move_type`=1 WHERE `id` IN (132553 * 10, 86115 * 10, 79017 * 10, 132567 * 10, 132557 * 10, 86099 * 10, 132562 * 10, 132558 * 10, 86116 * 10, 132564 * 10, 132554 * 10, 83238 * 10, 132566 * 10, 132556 * 10, 132565 * 10, 132555 * 10, 132560 * 10, 86117 * 10, 86131 * 10, 83237 * 10, 86133 * 10); + +-- Pathing for Bonechewer Devastator Entry: 16772 'TDB FORMAT' +SET @NPC := 57784; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2979.448,`position_y`=3526.724,`position_z`=-5.101617 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-2979.448,3526.724,-5.101617,0,0,0,0,100,0), +(@PATH,2,-2986.465,3536.819,-4.151853,0,0,0,0,100,0), +(@PATH,3,-2999.478,3533.506,-2.088938,0,0,0,0,100,0), +(@PATH,4,-3001.169,3532.58,-1.651159,0,0,0,0,100,0), +(@PATH,5,-3001.333,3532.634,-1.814128,0,0,0,0,100,0), +(@PATH,6,-2988.259,3537.786,-3.722197,0,0,0,0,100,0), +(@PATH,7,-2983.174,3532.755,-5.044437,0,0,0,0,100,0), +(@PATH,8,-2984.85,3516.351,-3.515834,0,0,0,0,100,0); +-- 0x1C393042401061000000DE0000397551 .go -2979.448 3526.724 -5.101617 From 61ba5e4f34211c2f0f286e70d8ace37714ca3c56 Mon Sep 17 00:00:00 2001 From: joschiwald Date: Mon, 23 Feb 2015 01:22:41 +0100 Subject: [PATCH 8/8] Core/Achievements: pick more changes from 4.3.4/6.x branch, required after abee9046a6d92e2f0ba9de9c97ce6304c2fcb883 --- sql/updates/world/2015_02_23_00_world.sql | 4 + .../game/Achievements/AchievementMgr.cpp | 1073 ++++++++++------- src/server/game/Achievements/AchievementMgr.h | 8 +- 3 files changed, 664 insertions(+), 421 deletions(-) create mode 100644 sql/updates/world/2015_02_23_00_world.sql diff --git a/sql/updates/world/2015_02_23_00_world.sql b/sql/updates/world/2015_02_23_00_world.sql new file mode 100644 index 00000000000..c84da7b2c84 --- /dev/null +++ b/sql/updates/world/2015_02_23_00_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (6847, 7849); +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES +(6847, 12, 0, 0, ''), +(7849, 12, 1, 0, ''); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index de8c9606c9b..4f4302f823c 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -55,6 +55,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: @@ -700,37 +701,37 @@ void AchievementMgr::CheckAllAchievementCriteria() } static const uint32 achievIdByArenaSlot[MAX_ARENA_SLOT] = { 1057, 1107, 1108 }; -static const uint32 achievIdForDungeon[][4] = -{ - // ach_cr_id, is_dungeon, is_raid, is_heroic_dungeon - { 321, true, true, true }, - { 916, false, true, false }, - { 917, false, true, false }, - { 918, true, false, false }, - { 2219, false, false, true }, - { 0, false, false, false } -}; /** * this function will be called whenever the user might have done a criteria relevant action */ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/) { - TC_LOG_DEBUG("achievement", "AchievementMgr::UpdateAchievementCriteria(%u, %u, %u)", type, miscValue1, miscValue2); + if (type >= ACHIEVEMENT_CRITERIA_TYPE_TOTAL) + { + TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: Wrong criteria type %u", type); + return; + } // disable for gamemasters with GM-mode enabled if (m_player->IsGameMaster()) + { + TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: [Player %s GM mode on] %s, %s (%u), %u, %u" + , m_player->GetName().c_str(), m_player->GetGUID().ToString().c_str(), AchievementGlobalMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2); return; + } + + TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: %s, %s (%u), %u, %u" + , m_player->GetGUID().ToString().c_str(), AchievementGlobalMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2); AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type); - for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i) + for (AchievementCriteriaEntry const* achievementCriteria : achievementCriteriaList) { - AchievementCriteriaEntry const* achievementCriteria = (*i); AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->referredAchievement); if (!achievement) continue; - if (!CanUpdateCriteria(achievementCriteria, achievement)) + if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, unit)) continue; switch (type) @@ -751,28 +752,49 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui { // std. case: increment at 1 case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: + case ACHIEVEMENT_CRITERIA_TYPE_DEATH: + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: + case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: + case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: + case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: + case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: + case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: + case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL: - case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION: - case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED: case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN: + case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS: case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; // std case: increment at miscvalue1 + case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: + case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: + case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS: case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD: @@ -780,14 +802,19 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: - case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:/* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS: /* FIXME: for online player only currently */ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); break; + // std case: increment at miscvalue2 + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: + SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); + break; // std case: high value at miscvalue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ @@ -795,45 +822,27 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST); break; + // std. case: set at 1 + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: + case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: + case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: + case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_SET); + break; // specialized cases - case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId()) - continue; - - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - if (achievementCriteria->kill_creature.creatureID != miscValue1) - continue; - - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); - break; case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel()); break; case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: - // update at loading or specific skill update - if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID) - continue; if (uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID)) SetCriteriaProgress(achievementCriteria, skillvalue); break; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: - // update at loading or specific skill update - if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID) - continue; if (uint32 maxSkillvalue = GetPlayer()->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID)) SetCriteriaProgress(achievementCriteria, maxSkillvalue); break; @@ -847,7 +856,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY: { time_t nextDailyResetTime = sWorld->GetNextDailyQuestsResetTime(); - CriteriaProgress *progress = GetCriteriaProgress(achievementCriteria); + CriteriaProgress const* progress = GetCriteriaProgress(achievementCriteria); if (!miscValue1) // Login case. { @@ -876,10 +885,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui } case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: { - // speedup for non-login case - if (miscValue1 && miscValue1 != achievementCriteria->complete_quests_in_zone.zoneID) - continue; - uint32 counter = 0; const RewardedQuestSet &rewQuests = GetPlayer()->getRewardedQuests(); @@ -892,186 +897,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, counter); break; } - case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - if (GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID) - continue; - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - if (GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID) - continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_DEATH: - { - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - // skip wrong arena achievements, if not achievIdByArenaSlot then normal total death counter - bool notfit = false; - for (int j = 0; j < MAX_ARENA_SLOT; ++j) - { - if (achievIdByArenaSlot[j] == achievement->ID) - { - Battleground* bg = GetPlayer()->GetBattleground(); - if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j) - notfit = true; - - break; - } - } - if (notfit) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - } - case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: - { - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - - Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId()); - if (!map || !map->IsDungeon()) - continue; - - // search case - bool found = false; - for (int j = 0; achievIdForDungeon[j][0]; ++j) - { - if (achievIdForDungeon[j][0] == achievement->ID) - { - if (map->IsRaid()) - { - // if raid accepted (ignore difficulty) - if (!achievIdForDungeon[j][2]) - break; // for - } - else if (GetPlayer()->GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL) - { - // dungeon in normal mode accepted - if (!achievIdForDungeon[j][1]) - break; // for - } - else - { - // dungeon in heroic mode accepted - if (!achievIdForDungeon[j][3]) - break; // for - } - - found = true; - break; // for - } - } - if (!found) - continue; - - //FIXME: work only for instances where max == min for players - if (map->ToInstanceMap()->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit) - continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - } - case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - if (miscValue1 != achievementCriteria->killed_by_creature.creatureEntry) - continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - - // if team check required: must kill by opposition faction - if (achievement->ID == 318 && miscValue2 == GetPlayer()->GetTeam()) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - // miscvalue1 is the ingame fallheight*100 as stored in dbc SetCriteriaProgress(achievementCriteria, miscValue1); break; - case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - if (miscValue2 != achievementCriteria->death_from.type) - continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: - // if miscvalues != 0, it contains the questID. - if (miscValue1) - { - if (miscValue1 != achievementCriteria->complete_quest.questID) - continue; - } - else - { - // login case. - if (!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID)) - continue; - } - - SetCriteriaProgress(achievementCriteria, 1); - break; - case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: - case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: - if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: - case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: - if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: - if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID) - continue; - - if (GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID)) - SetCriteriaProgress(achievementCriteria, 1); - break; - case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: - // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored) - // miscvalue2=count of item loot - if (!miscValue1 || !miscValue2) - continue; - if (miscValue1 != achievementCriteria->loot_type.lootType) - continue; - - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: - // speedup for non-login case - if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1) - continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); - break; case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: - if (!miscValue1) // no update at login - continue; - // additional requirements if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE) { @@ -1087,64 +917,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; - case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - - if (achievementCriteria->use_item.itemID != miscValue1) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: - // You _have_ to loot that item, just owning it when logging in does _not_ count! - if (!miscValue1) - continue; - if (miscValue1 != achievementCriteria->own_item.itemID) - continue; - SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: - { - WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference); - if (!worldOverlayEntry) - break; - - bool matchFound = false; - for (int j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j) - { - uint32 area_id = worldOverlayEntry->areatableID[j]; - if (!area_id) // array have 0 only in empty tail - break; - - int32 exploreFlag = GetAreaFlagByAreaID(area_id); - if (exploreFlag < 0) - continue; - - uint32 playerIndexOffset = uint32(exploreFlag) / 32; - uint32 mask = 1<< (uint32(exploreFlag) % 32); - - if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask) - { - matchFound = true; - break; - } - } - - if (matchFound) - SetCriteriaProgress(achievementCriteria, 1); - break; - } case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: SetCriteriaProgress(achievementCriteria, GetPlayer()->GetBankBagSlotCount()); break; case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: { - // skip faction check only at loading - if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID) - continue; - int32 reputation = GetPlayer()->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID); if (reputation > 0) SetCriteriaProgress(achievementCriteria, reputation); @@ -1153,102 +930,23 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetExaltedFactionCount()); break; - case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: - // skip for login case - if (!miscValue1) - continue; - SetCriteriaProgress(achievementCriteria, 1); - break; - case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: - // miscvalue1 = itemid - // miscvalue2 = itemSlot - if (!miscValue1) - continue; - - if (miscValue2 != achievementCriteria->equip_epic_item.itemSlot) - continue; - - SetCriteriaProgress(achievementCriteria, 1); - break; case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: { - // miscvalue1 = itemid - // miscvalue2 = diced value - if (!miscValue1) - continue; - if (miscValue2 != achievementCriteria->roll_greed_on_loot.rollValue) - continue; - - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscValue1); - if (!pProto) + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1); + if (!proto) continue; // check item level via achievement_criteria_data AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria); - if (!data || !data->Meets(GetPlayer(), nullptr, pProto->ItemLevel)) + if (!data || !data->Meets(GetPlayer(), nullptr, proto->ItemLevel)) continue; SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; } - case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: - // miscvalue1 = emote - if (!miscValue1) - continue; - if (miscValue1 != achievementCriteria->do_emote.emoteID) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: - case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: - if (!miscValue1) - continue; - - if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP) - { - if (GetPlayer()->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value) - continue; - - // map specific case (BG in fact) expected player targeted damage/heal - if (!unit || unit->GetTypeId() != TYPEID_PLAYER) - continue; - } - - SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: - // miscvalue1 = item_id - if (!miscValue1) - continue; - if (miscValue1 != achievementCriteria->equip_item.itemID) - continue; - - SetCriteriaProgress(achievementCriteria, 1); - break; - case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: - // miscvalue1 = go entry - if (!miscValue1) - continue; - if (miscValue1 != achievementCriteria->use_gameobject.goEntry) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: - if (!miscValue1) - continue; - if (miscValue1 != achievementCriteria->fish_in_gameobject.goEntry) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: { - if (miscValue1 && miscValue1 != achievementCriteria->learn_skillline_spell.skillLine) - continue; - uint32 spellCount = 0; for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin(); spellIter != GetPlayer()->GetSpellMap().end(); @@ -1273,23 +971,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetVisibleFactionCount()); break; - case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: - case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: - { - // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case - if (!miscValue1) - continue; - ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1); - if (!proto || proto->Quality < ITEM_QUALITY_EPIC) - continue; - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - } case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: { - if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_line.skillLine) - continue; - uint32 spellCount = 0; for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin(); spellIter != GetPlayer()->GetSpellMap().end(); @@ -1306,18 +989,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL: SetCriteriaProgress(achievementCriteria, GetPlayer()->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS)); break; - case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: - if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: - if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED: SetCriteriaProgress(achievementCriteria, GetPlayer()->GetMoney(), PROGRESS_HIGHEST); break; @@ -1325,26 +996,14 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (!miscValue1) { uint32 points = 0; - for (CompletedAchievementMap::iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) - if (AchievementEntry const* pAchievement = sAchievementMgr->GetAchievement(itr->first)) - points += pAchievement->points; + for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr) + if (AchievementEntry const* completedAchievements = sAchievementMgr->GetAchievement(itr->first)) + points += completedAchievements->points; SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET); } else SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); break; - case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: - if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; - case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: - if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID) - continue; - - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: { uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype; @@ -1356,7 +1015,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST); } - else // login case + else // login case { for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot) { @@ -1372,7 +1031,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } } - break; } case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING: @@ -1386,7 +1044,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST); } - else // login case + else // login case { for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot) { @@ -1408,11 +1066,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } - case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA - // Check map id requirement - if (miscValue1 == achievementCriteria->win_arena.mapID) - SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); - break; // std case: not exist in DBC, not triggered in code as result case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: @@ -1976,18 +1629,53 @@ bool AchievementMgr::HasAchieved(uint32 achievementId) const return m_completedAchievements.find(achievementId) != m_completedAchievements.end(); } -bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement) +bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit) { - if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, NULL)) + if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, nullptr)) + { + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Disabled", + criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); return false; + } if (achievement->mapID != -1 && GetPlayer()->GetMapId() != uint32(achievement->mapID)) + { + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s Achievement %u) Wrong map", + criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType), achievement->ID); return false; + } if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && GetPlayer()->GetTeam() != HORDE) || (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeam() != ALLIANCE)) + { + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s Achievement %u) Wrong faction", + criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType), achievement->ID); + return false; + } + + if (!RequirementsSatisfied(criteria, achievement, miscValue1, miscValue2, unit)) + { + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Requirements not satisfied", + criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); + return false; + } + + if (!ConditionsSatisfied(criteria)) + { + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Conditions not satisfied", + criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); + return false; + } + + // don't update already completed criteria + if (IsCompletedCriteria(criteria, achievement)) return false; + return true; +} + +bool AchievementMgr::ConditionsSatisfied(AchievementCriteriaEntry const* criteria) const +{ for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i) { if (!criteria->additionalRequirements[i].additionalRequirement_type) @@ -2008,13 +1696,558 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, } } - // don't update already completed criteria - if (IsCompletedCriteria(criteria, achievement)) - return false; + return true; +} + +bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit) const +{ + switch (AchievementCriteriaTypes(achievementCriteria->requiredType)) + { + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: + case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: + case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: + case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: + case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS: + case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: + case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD: + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING: + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: + case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: + case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: + case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL: + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS: + case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: + case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: + case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST: + case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED: + case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED: + case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN: + case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS: + case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: + if (!miscValue1) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING: + case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION: + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION: + case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: + case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED: + case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: + break; + + // specialized cases + case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: + if (!miscValue1) + return false; + if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId()) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: + if (!miscValue1) + return false; + if (achievementCriteria->kill_creature.creatureID != miscValue1) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: + if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: + if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: + if (miscValue1 && miscValue1 != achievementCriteria->complete_quests_in_zone.zoneID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: + if (!miscValue1) + return false; + if (GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: + if (!miscValue1) + return false; + if (GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH: + if (!miscValue1) + return false; + for (uint8 j = 0; j < MAX_ARENA_SLOT; ++j) + { + if (achievIdByArenaSlot[j] == achievement->ID) + { + Battleground* bg = GetPlayer()->GetBattleground(); + if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j) + return false; + break; + } + } + break; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: + { + if (!miscValue1) + return false; + + Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId()); + if (!map || !map->IsDungeon()) + return false; + + //FIXME: work only for instances where max == min for players + if (map->ToInstanceMap()->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit) + return false; + break; + } + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: + if (!miscValue1) + return false; + if (miscValue1 != achievementCriteria->killed_by_creature.creatureEntry) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: + if (!miscValue1) + return false; + // if team check required: must kill by opposition faction + if (achievement->ID == 318 && miscValue2 == GetPlayer()->GetTeam()) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: + if (!miscValue1) + return false; + if (miscValue2 != achievementCriteria->death_from.type) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: + // if miscvalues != 0, it contains the questID. + if (miscValue1) + { + if (miscValue1 != achievementCriteria->complete_quest.questID) + return false; + } + else + { + // login case. + if (!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID)) + return false; + } + break; + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: + if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: + case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: + if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: + if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID) + return false; + if (!GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID)) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: + // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored) + // miscvalue2=count of item loot + if (!miscValue1 || !miscValue2) + return false; + if (miscValue1 != achievementCriteria->loot_type.lootType) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: + if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: + if (!miscValue1) + return false; + if (achievementCriteria->use_item.itemID != miscValue1) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: + if (!miscValue1) + return false; + if (miscValue1 != achievementCriteria->own_item.itemID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: + { + WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference); + if (!worldOverlayEntry) + return false; + + bool matchFound = false; + for (int j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j) + { + uint32 area_id = worldOverlayEntry->areatableID[j]; + if (!area_id) // array have 0 only in empty tail + break; + + int32 exploreFlag = GetAreaFlagByAreaID(area_id); + if (exploreFlag < 0) + continue; + + uint32 playerIndexOffset = uint32(exploreFlag) / 32; + uint32 mask = 1 << (uint32(exploreFlag) % 32); + + if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask) + { + matchFound = true; + break; + } + } + + if (!matchFound) + return false; + break; + } + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: + if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: + // miscvalue1 = itemid + // miscvalue2 = itemSlot + if (!miscValue1) + return false; + if (miscValue2 != achievementCriteria->equip_epic_item.itemSlot) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: + // miscvalue1 = itemid + // miscvalue2 = diced value + if (!miscValue1) + return false; + if (miscValue2 != achievementCriteria->roll_greed_on_loot.rollValue) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: + // miscvalue1 = emote + if (!miscValue1) + return false; + if (miscValue1 != achievementCriteria->do_emote.emoteID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: + case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: + if (!miscValue1) + return false; + + if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP) + { + if (GetPlayer()->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value) + return false; + + // map specific case (BG in fact) expected player targeted damage/heal + if (!unit || unit->GetTypeId() != TYPEID_PLAYER) + return false; + } + break; + case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: + if (!miscValue1) + return false; + if (miscValue1 != achievementCriteria->equip_item.itemID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: + if (!miscValue1) + return false; + if (miscValue1 != achievementCriteria->use_gameobject.goEntry) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: + if (!miscValue1) + return false; + if (miscValue1 != achievementCriteria->fish_in_gameobject.goEntry) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: + if (miscValue1 && miscValue1 != achievementCriteria->learn_skillline_spell.skillLine) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: + case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: + { + if (!miscValue1) + return false; + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1); + if (!proto || proto->Quality < ITEM_QUALITY_EPIC) + return false; + break; + } + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: + if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_line.skillLine) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: + if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: + if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: + if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID) + return false; + break; + case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: + if (miscValue1 != achievementCriteria->win_arena.mapID) + return false; + break; + default: + break; + } return true; } +char const* AchievementGlobalMgr::GetCriteriaTypeString(uint32 type) +{ + return GetCriteriaTypeString(AchievementCriteriaTypes(type)); +} + +char const* AchievementGlobalMgr::GetCriteriaTypeString(AchievementCriteriaTypes type) +{ + switch (type) + { + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: + return "KILL_CREATURE"; + case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: + return "TYPE_WIN_BG"; + case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: + return "REACH_LEVEL"; + case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: + return "REACH_SKILL_LEVEL"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: + return "COMPLETE_ACHIEVEMENT"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT: + return "COMPLETE_QUEST_COUNT"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY: + return "COMPLETE_DAILY_QUEST_DAILY"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE: + return "COMPLETE_QUESTS_IN_ZONE"; + case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: + return "DAMAGE_DONE"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: + return "COMPLETE_DAILY_QUEST"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: + return "COMPLETE_BATTLEGROUND"; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: + return "DEATH_AT_MAP"; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH: + return "DEATH"; + case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON: + return "DEATH_IN_DUNGEON"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: + return "COMPLETE_RAID"; + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: + return "KILLED_BY_CREATURE"; + case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: + return "KILLED_BY_PLAYER"; + case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: + return "FALL_WITHOUT_DYING"; + case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM: + return "DEATHS_FROM"; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: + return "COMPLETE_QUEST"; + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: + return "BE_SPELL_TARGET"; + case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: + return "CAST_SPELL"; + case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + return "BG_OBJECTIVE_CAPTURE"; + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: + return "HONORABLE_KILL_AT_AREA"; + case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: + return "WIN_ARENA"; + case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA: + return "PLAY_ARENA"; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: + return "LEARN_SPELL"; + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: + return "HONORABLE_KILL"; + case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: + return "OWN_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: + return "WIN_RATED_ARENA"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: + return "HIGHEST_TEAM_RATING"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING: + return "HIGHEST_PERSONAL_RATING"; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: + return "LEARN_SKILL_LEVEL"; + case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: + return "USE_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: + return "LOOT_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: + return "EXPLORE_AREA"; + case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: + return "OWN_RANK"; + case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: + return "BUY_BANK_SLOT"; + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: + return "GAIN_REPUTATION"; + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: + return "GAIN_EXALTED_REPUTATION"; + case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: + return "VISIT_BARBER_SHOP"; + case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: + return "EQUIP_EPIC_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: + return "ROLL_NEED_ON_LOOT"; + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: + return "GREED_ON_LOOT"; + case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS: + return "HK_CLASS"; + case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE: + return "HK_RACE"; + case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: + return "DO_EMOTE"; + case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: + return "HEALING_DONE"; + case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: + return "GET_KILLING_BLOWS"; + case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: + return "EQUIP_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: + return "MONEY_FROM_VENDORS"; + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS: + return "GOLD_SPENT_FOR_TALENTS"; + case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS: + return "NUMBER_OF_TALENT_RESETS"; + case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD: + return "MONEY_FROM_QUEST_REWARD"; + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING: + return "GOLD_SPENT_FOR_TRAVELLING"; + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: + return "GOLD_SPENT_AT_BARBER"; + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: + return "GOLD_SPENT_FOR_MAIL"; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: + return "LOOT_MONEY"; + case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: + return "USE_GAMEOBJECT"; + case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: + return "BE_SPELL_TARGET2"; + case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: + return "SPECIAL_PVP_KILL"; + case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: + return "FISH_IN_GAMEOBJECT"; + case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: + return "ON_LOGIN"; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: + return "LEARN_SKILLLINE_SPELLS"; + case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: + return "WIN_DUEL"; + case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL: + return "LOSE_DUEL"; + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: + return "KILL_CREATURE_TYPE"; + case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS: + return "GOLD_EARNED_BY_AUCTIONS"; + case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION: + return "CREATE_AUCTION"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: + return "HIGHEST_AUCTION_BID"; + case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: + return "WON_AUCTIONS"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: + return "HIGHEST_AUCTION_SOLD"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED: + return "HIGHEST_GOLD_VALUE_OWNED"; + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION: + return "GAIN_REVERED_REPUTATION"; + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION: + return "GAIN_HONORED_REPUTATION"; + case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: + return "KNOWN_FACTIONS"; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: + return "LOOT_EPIC_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: + return "RECEIVE_EPIC_ITEM"; + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: + return "ROLL_NEED"; + case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: + return "ROLL_GREED"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: + return "HIGHEST_HEALTH"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER: + return "HIGHEST_POWER"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT: + return "HIGHEST_STAT"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: + return "HIGHEST_SPELLPOWER"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR: + return "HIGHEST_ARMOR"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING: + return "HIGHEST_RATING"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: + return "HIT_DEALT"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: + return "HIT_RECEIVED"; + case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: + return "TOTAL_DAMAGE_RECEIVED"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST: + return "HIGHEST_HEAL_CAST"; + case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: + return "TOTAL_HEALING_RECEIVED"; + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED: + return "HIGHEST_HEALING_RECEIVED"; + case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED: + return "QUEST_ABANDONED"; + case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN: + return "FLIGHT_PATHS_TAKEN"; + case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: + return "LOOT_TYPE"; + case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: + return "CAST_SPELL2"; + case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: + return "LEARN_SKILL_LINE"; + case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL: + return "EARN_HONORABLE_KILL"; + case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS: + return "ACCEPTED_SUMMONINGS"; + case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: + return "EARN_ACHIEVEMENT_POINTS"; + case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: + return "USE_LFD_TO_GROUP_WITH_PLAYERS"; + } + return "MISSING_TYPE"; +} + //========================================================== void AchievementGlobalMgr::LoadAchievementCriteriaList() { diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index f8869757e50..078229ea4c8 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -293,9 +293,12 @@ class AchievementMgr void CompletedCriteriaFor(AchievementEntry const* achievement); bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement); bool IsCompletedAchievement(AchievementEntry const* entry); - bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement); + bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit); void BuildAllDataPacket(WorldPacket* data) const; + bool ConditionsSatisfied(AchievementCriteriaEntry const* criteria) const; + bool RequirementsSatisfied(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit) const; + Player* m_player; CriteriaProgressMap m_criteriaProgress; CompletedAchievementMap m_completedAchievements; @@ -309,6 +312,9 @@ class AchievementGlobalMgr ~AchievementGlobalMgr() { } public: + static char const* GetCriteriaTypeString(AchievementCriteriaTypes type); + static char const* GetCriteriaTypeString(uint32 type); + static AchievementGlobalMgr* instance() { static AchievementGlobalMgr instance;