From 5236223154ee8aa6e32b9bea5c5c7b25dabda84c Mon Sep 17 00:00:00 2001 From: Malcrom Date: Fri, 5 Nov 2021 22:44:18 -0300 Subject: [PATCH] fix(DB/Gossip): go_wind_stone to use db gossip and conditions (#8953) --- .../rev_1636050414423889017.sql | 47 ++ src/server/scripts/Kalimdor/zone_silithus.cpp | 525 ++++++------------ 2 files changed, 225 insertions(+), 347 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1636050414423889017.sql diff --git a/data/sql/updates/pending_db_world/rev_1636050414423889017.sql b/data/sql/updates/pending_db_world/rev_1636050414423889017.sql new file mode 100644 index 000000000..f029aacb8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1636050414423889017.sql @@ -0,0 +1,47 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1636050414423889017'); + +-- Condition for Wind Stone Gossip menu option +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (6540,6542,6543) AND `SourceEntry` IN (0,1,2,3,4) AND `SourceId`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 6540, 0, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 0 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6540, 1, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 1 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6540, 1, 0, 0, 2, 0, 20416, 1, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 1 if player has 1 of Crest of Beckoning: Fire. Item cannot be in bank.'), +(15, 6540, 2, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 2 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6540, 2, 0, 0, 2, 0, 20420, 1, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 2 if player has 1 of Crest of Beckoning: Water. Item cannot be in bank.'), +(15, 6540, 3, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 3 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6540, 3, 0, 0, 2, 0, 20419, 1, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 3 if player has 1 of Crest of Beckoning: Earth. Item cannot be in bank.'), +(15, 6540, 4, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 4 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6540, 4, 0, 0, 2, 0, 20418, 1, 0, 0, 0, 0, '', 'Show gossip menu 6540 option id 4 if player has 1 of Crest of Beckoning: Thunder. Item cannot be in bank.'), +(15, 6542, 0, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 0 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 0, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 0 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 1, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 1 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 1, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 1 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 1, 0, 0, 2, 0, 20432, 1, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 1 if player has 1 of Signet of Beckoning: Fire. Item cannot be in bank.'), +(15, 6542, 2, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 2 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 2, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 2 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 2, 0, 0, 2, 0, 20436, 1, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 2 if player has 1 of Signet of Beckoning: Water. Item cannot be in bank.'), +(15, 6542, 3, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 3 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 3, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 3 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 3, 0, 0, 2, 0, 20435, 1, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 3 if player has 1 of Signet of Beckoning: Earth. Item cannot be in bank.'), +(15, 6542, 4, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 4 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 4, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 4 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6542, 4, 0, 0, 2, 0, 20433, 1, 0, 0, 0, 0, '', 'Show gossip menu 6542 option id 4 if player has 1 of Signet of Beckoning: Thunder. Item cannot be in bank.'), +(15, 6543, 0, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 0 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 0, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 0 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 0, 0, 0, 1, 0, 24782, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 0 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 1, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 1 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 1, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 1 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 1, 0, 0, 1, 0, 24782, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 1 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 1, 0, 0, 2, 0, 20447, 1, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 1 if player has 1 of Scepter of Beckoning: Fire. Item cannot be in bank.'), +(15, 6543, 2, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 2 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 2, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 2 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 2, 0, 0, 1, 0, 24782, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 2 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 2, 0, 0, 2, 0, 20450, 1, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 2 if player has 1 of Scepter of Beckoning: Water. Item cannot be in bank.'), +(15, 6543, 3, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 3 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 3, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 3 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 3, 0, 0, 1, 0, 24782, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 3 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 3, 0, 0, 2, 0, 20449, 1, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 3 if player has 1 of Scepter of Beckoning: Earth. Item cannot be in bank.'), +(15, 6543, 4, 0, 0, 1, 0, 24746, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 4 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 4, 0, 0, 1, 0, 24748, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 4 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 4, 0, 0, 1, 0, 24782, 0, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 4 if target has aura Twilight Cultist Disguise (effect 0).'), +(15, 6543, 4, 0, 0, 2, 0, 20448, 1, 0, 0, 0, 0, '', 'Show gossip menu 6543 option id 4 if player has 1 of Scepter of Beckoning: Thunder. Item cannot be in bank.'); diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 0925a8132..ffbe0b053 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -36,6 +36,8 @@ EndContentData */ #include "ScriptMgr.h" #include "Spell.h" #include "SpellInfo.h" +#include "GameObject.h" +#include "GameObjectAI.h" /*#### # quest_a_pawn_on_the_eternal_board (Defines) @@ -958,374 +960,203 @@ public: ## go_wind_stone ###*/ -enum WSSpells +enum WindStone { - SPELL_PUNISHMENT = 24803, - SPELL_SPAWN_IN = 25035, - - AURA_TWILIGHT_SET = 24746, - AURA_MEDALLION = 24748, - AURA_RING = 24782, - + AURA_TWILIGHT_SET = 24746, + AURA_MEDALLION = 24748, + AURA_RING = 24782, + SPELL_PUNISHMENT = 24803, + SPELL_SPAWN_IN = 25035, SPELL_TEMPLAR_RANDOM = 24745, - SPELL_TEMPLAR_FIRE = 24747, - SPELL_TEMPLAR_AIR = 24757, - SPELL_TEMPLAR_EARTH = 24759, - SPELL_TEMPLAR_WATER = 24761, - - SPELL_DUKE_RANDOM = 24762, - SPELL_DUKE_FIRE = 24766, - SPELL_DUKE_AIR = 24769, - SPELL_DUKE_EARTH = 24771, - SPELL_DUKE_WATER = 24773, - - SPELL_ROYAL_RANDOM = 24785, - SPELL_ROYAL_FIRE = 24787, - SPELL_ROYAL_AIR = 24791, - SPELL_ROYAL_EARTH = 24792, - SPELL_ROYAL_WATER = 24793 + SPELL_TEMPLAR_FIRE = 24747, + SPELL_TEMPLAR_AIR = 24757, + SPELL_TEMPLAR_EARTH = 24759, + SPELL_TEMPLAR_WATER = 24761, + SPELL_DUKE_RANDOM = 24762, + SPELL_DUKE_FIRE = 24766, + SPELL_DUKE_AIR = 24769, + SPELL_DUKE_EARTH = 24771, + SPELL_DUKE_WATER = 24773, + SPELL_ROYAL_RANDOM = 24785, + SPELL_ROYAL_FIRE = 24787, + SPELL_ROYAL_AIR = 24791, + SPELL_ROYAL_EARTH = 24792, + SPELL_ROYAL_WATER = 24793, + GOSSIPID_LESSER_WS = 6540, + GOSSIPID_WS = 6542, + GOSSIPID_GREATER_WS = 6543, + NPC_TEMPLAR_FIRE = 15209, + NPC_TEMPLAR_WATER = 15211, + NPC_TEMPLAR_AIR = 15212, + NPC_TEMPLAR_EARTH = 15307, + NPC_DUKE_FIRE = 15206, + NPC_DUKE_WATER = 15207, + NPC_DUKE_EARTH = 15208, + NPC_DUKE_AIR = 15220, + NPC_ROYAL_FIRE = 15203, + NPC_ROYAL_AIR = 15204, + NPC_ROYAL_EARTH = 15205, + NPC_ROYAL_WATER = 15305, + SAY_ON_SPAWN_IN = 0 }; -enum WSGossip -{ - GOSSIPID_LESSER_WS = 6540, - GOSSIPID_WS = 6542, - GOSSIPID_GREATER_WS = 6543 -}; - -enum WSCreatures -{ - NPC_TEMPLAR_FIRE = 15209, - NPC_TEMPLAR_WATER = 15211, - NPC_TEMPLAR_AIR = 15212, - NPC_TEMPLAR_EARTH = 15307, - - NPC_DUKE_FIRE = 15206, - NPC_DUKE_WATER = 15207, - NPC_DUKE_EARTH = 15208, - NPC_DUKE_AIR = 15220, - - NPC_ROYAL_FIRE = 15203, - NPC_ROYAL_AIR = 15204, - NPC_ROYAL_EARTH = 15205, - NPC_ROYAL_WATER = 15305 -}; - -enum WSItems -{ - ITEM_TEMPLAR_FIRE = 20416, - ITEM_TEMPLAR_EARTH = 20419, - ITEM_TEMPLAR_WATER = 20420, - ITEM_TEMPLAR_AIR = 20418, - - ITEM_DUKE_FIRE = 20432, - ITEM_DUKE_EARTH = 20435, - ITEM_DUKE_WATER = 20436, - ITEM_DUKE_AIR = 20433, - - ITEM_ROYAL_FIRE = 20447, - ITEM_ROYAL_EARTH = 20449, - ITEM_ROYAL_WATER = 20450, - ITEM_ROYAL_AIR = 20448, -}; - -enum WS -{ - TEMPLAR = 0, - DUKE = 1, - ROYAL = 2, - - FIRE = 0x1, - WATER = 0x2, - EARTH = 0x4, - AIR = 0x8 -}; - -enum WSTexts -{ - SAY_TEMPLAR_AGGRO = 0, - SAY_DUKE_AGGRO = 0, - YELL_ROYAL_AGGRO = 0 -}; - -#define GOSSIP_TEMPLAR_RANDOM "I am no cultist, you monster! Come to me and face your destruction!" -#define GOSSIP_TEMPLAR_FIRE "Crimson Templar! I hold your signet! Heed my call!" -#define GOSSIP_TEMPLAR_EARTH "Earthen Templar! I hold your signet! Heed my call!" -#define GOSSIP_TEMPLAR_AIR "Hoary Templar! I hold your signet! Heed my call!" -#define GOSSIP_TEMPLAR_WATER "Azure Templar! I hold your signet! Heed my call!" - -#define GOSSIP_DUKE_RANDOM "You will listen to this, vile duke! I am not your Twilight's Hammer lapdog! I am here to challenge you! Come! Come, and meet your death..." -#define GOSSIP_DUKE_FIRE "Duke of Cynders! I hold your signet! Heed my call!" -#define GOSSIP_DUKE_EARTH "The Duke of Shards! I hold your signet! Heed my call!" -#define GOSSIP_DUKE_AIR "The Duke of Zephyrs! I hold your signet! Heed my call!" -#define GOSSIP_DUKE_WATER "The Duke of Fathoms! I hold your signet! Heed my call!" - -#define GOSSIP_ROYAL_RANDOM "The day of the judgement has come, fiend! I challenge you to battle!" -#define GOSSIP_ROYAL_FIRE "Prince Skaldrenox! I hold your signet! Heed my call!" -#define GOSSIP_ROYAL_EARTH "Baron Kazum! I hold your signet! Heed my call!" -#define GOSSIP_ROYAL_AIR "High Marshal Whirlaxis! I hold your signet! Heed my call!" -#define GOSSIP_ROYAL_WATER "Lord Skwol! I hold your signet! Heed my call!" - class go_wind_stone : public GameObjectScript { public: - go_wind_stone() : GameObjectScript("go_wind_stone") { } + go_wind_stone() : GameObjectScript("go_wind_stone") {} -private: - uint8 GetPlayerRank(Player* player) // For random summoning + struct go_wind_stoneAI : public GameObjectAI { - bool setAura = player->HasAura(AURA_TWILIGHT_SET, player->GetGUID()); - bool medallionAura = player->HasAura(AURA_MEDALLION, player->GetGUID()); - bool ringAura = player->HasAura(AURA_RING, player->GetGUID()); + go_wind_stoneAI(GameObject* go) : GameObjectAI(go) {} - if (setAura && medallionAura && ringAura) - return 3; - else if (setAura && medallionAura) - return 2; - else if (setAura) - return 1; - else - return 0; - } - - uint8 GetItems(Player* player, WS type) - { - uint8 result = 0x0; - - switch (type) + bool GossipHello(Player* player, bool reportUse) override { - case TEMPLAR: - { - if (player->HasItemCount(ITEM_TEMPLAR_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_TEMPLAR_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_TEMPLAR_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_TEMPLAR_AIR)) - result |= AIR; - break; - } - case DUKE: - { - if (player->HasItemCount(ITEM_DUKE_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_DUKE_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_DUKE_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_DUKE_AIR)) - result |= AIR; - break; - } - case ROYAL: - { - if (player->HasItemCount(ITEM_ROYAL_FIRE)) - result |= FIRE; - if (player->HasItemCount(ITEM_ROYAL_WATER)) - result |= WATER; - if (player->HasItemCount(ITEM_ROYAL_EARTH)) - result |= EARTH; - if (player->HasItemCount(ITEM_ROYAL_AIR)) - result |= AIR; - break; - } - default: - break; - } - return result; - } - - void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spellId) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - return; - SpellInfo const* spellInfoTrigger = sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell); - if (!spellInfoTrigger) - return; - Spell* spell = new Spell(player, spellInfoTrigger, TRIGGERED_NONE); - SpellCastResult result = spell->CheckCast(true); - delete spell; - if (result != SPELL_CAST_OK) - { - if (result == SPELL_FAILED_REAGENTS) + if (reportUse) { - std::string accountName; - AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName); - sBan->BanAccount(accountName, "0s", "Wind Stone exploit", "Server"); + uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); + bool _twilightSetAura = (player->HasAura(AURA_TWILIGHT_SET, player->GetGUID()) ? true : false); + bool _medallionAura = (player->HasAura(AURA_MEDALLION, player->GetGUID()) ? true : false); + bool _ringAura = (player->HasAura(AURA_RING, player->GetGUID()) ? true : false); + + switch (gossipId) + { + case GOSSIPID_LESSER_WS: + { + if (!_twilightSetAura) + go->CastSpell(player, SPELL_PUNISHMENT); + break; + } + case GOSSIPID_WS: + { + if (!_twilightSetAura || !_medallionAura) + go->CastSpell(player, SPELL_PUNISHMENT); + break; + } + case GOSSIPID_GREATER_WS: + { + if (!_twilightSetAura || !_medallionAura || !_ringAura) + go->CastSpell(player, SPELL_PUNISHMENT); + break; + } + default: + break; + } } - return; + return false; } - player->CastSpell(player, spellInfoTrigger->Id, false); - TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - M_PI, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); - summons->CastSpell(summons, SPELL_SPAWN_IN, false); - switch (summons->GetEntry()) + + bool GossipSelect(Player* player, uint32 sender, uint32 action) override { - case NPC_TEMPLAR_FIRE: - case NPC_TEMPLAR_WATER: - case NPC_TEMPLAR_AIR: - case NPC_TEMPLAR_EARTH: - summons->AI()->Talk(SAY_TEMPLAR_AGGRO); - break; + player->PlayerTalkClass->SendCloseGossip(); - case NPC_DUKE_FIRE: - case NPC_DUKE_WATER: - case NPC_DUKE_EARTH: - case NPC_DUKE_AIR: - summons->AI()->Talk(SAY_DUKE_AGGRO); - break; - case NPC_ROYAL_FIRE: - case NPC_ROYAL_AIR: - case NPC_ROYAL_EARTH: - case NPC_ROYAL_WATER: - summons->AI()->Talk(YELL_ROYAL_AGGRO); - break; + if (sender == GOSSIPID_LESSER_WS) + { + switch (action) + { + case 0: + SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); + break; + case 1: + SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); + break; + case 2: + SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); + break; + case 3: + SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); + break; + case 4: + SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); + break; + default: + break; + } + } + else if (sender == GOSSIPID_WS) + { + switch (action) + { + case 0: + SummonNPC(go, player, RAND(NPC_DUKE_WATER, NPC_DUKE_FIRE, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); + break; + case 1: + SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); + break; + case 2: + SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); + break; + case 3: + SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); + break; + case 4: + SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); + break; + default: + break; + } + } + else if (sender == GOSSIPID_GREATER_WS) + { + switch (action) + { + case 0: + SummonNPC(go, player, RAND(NPC_ROYAL_WATER, NPC_ROYAL_FIRE, NPC_ROYAL_EARTH, NPC_ROYAL_AIR), SPELL_ROYAL_RANDOM); + break; + case 1: + SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); + break; + case 2: + SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); + break; + case 3: + SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); + break; + case 4: + SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); + break; + default: + break; + } + } + return false; } - summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summons->SendMeleeAttackStart(player); - summons->CombatStart(player); - } -public: - bool OnGossipHello(Player* player, GameObject* go) override + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spellId) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!spellInfo) + return; + SpellInfo const* spellInfoTrigger = sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell); + if (!spellInfoTrigger) + return; + Spell* spell = new Spell(player, spellInfoTrigger, TRIGGERED_NONE); + SpellCastResult result = spell->CheckCast(true); + delete spell; + if (result != SPELL_CAST_OK) + { + if (result == SPELL_FAILED_REAGENTS) + { + std::string accountName; + AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName); + sBan->BanAccount(accountName, "0s", "Wind Stone exploit", "Server"); + } + return; + } + player->CastSpell(player, spellInfoTrigger->Id, false); + TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - M_PI, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); + summons->CastSpell(summons, SPELL_SPAWN_IN, false); + summons->AI()->Talk(SAY_ON_SPAWN_IN); + summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); + } + }; + + GameObjectAI* GetAI(GameObject* go) const { - uint8 rank = GetPlayerRank(player); - - uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); - switch (gossipId) - { - case GOSSIPID_LESSER_WS: - { - if (rank >= 1) // 1 or 2 or 3 - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - else - { - go->CastSpell(player, SPELL_PUNISHMENT); - break; - } - - uint8 item = GetItems(player, TEMPLAR); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_FIRE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_WATER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_EARTH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - break; - } - case GOSSIPID_WS: - { - if (rank >= 2) // 2 or 3 - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - else - { - go->CastSpell(player, SPELL_PUNISHMENT); - break; - } - - uint8 item = GetItems(player, DUKE); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_FIRE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_WATER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_EARTH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_DUKE_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - break; - } - case GOSSIPID_GREATER_WS: - { - if (rank == 3) // 3 - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - else - { - go->CastSpell(player, SPELL_PUNISHMENT); - break; - } - - uint8 item = GetItems(player, ROYAL); - if (item & FIRE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_FIRE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); - if (item & WATER) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_WATER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); - if (item & EARTH) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_EARTH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); - if (item & AIR) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ROYAL_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); - break; - } - default: - break; - } - - SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID()); - return true; + return new go_wind_stoneAI(go); } - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - player->PlayerTalkClass->SendCloseGossip(); - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR); - break; - - case GOSSIP_ACTION_INFO_DEF + 6: - SummonNPC(go, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 8: - SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR); - break; - - case GOSSIP_ACTION_INFO_DEF + 11: - SummonNPC(go, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM); - break; - case GOSSIP_ACTION_INFO_DEF + 12: - SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE); - break; - case GOSSIP_ACTION_INFO_DEF + 13: - SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER); - break; - case GOSSIP_ACTION_INFO_DEF + 14: - SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH); - break; - case GOSSIP_ACTION_INFO_DEF + 15: - SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR); - break; - - default: - break; - } - return true; - } }; void AddSC_silithus()