fix(DB/Gossip): go_wind_stone to use db gossip and conditions (#8953)

This commit is contained in:
Malcrom
2021-11-05 22:44:18 -03:00
committed by GitHub
parent c56ce966b2
commit 5236223154
2 changed files with 225 additions and 347 deletions
@@ -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.');
+178 -347
View File
@@ -36,6 +36,8 @@ EndContentData */
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "Spell.h" #include "Spell.h"
#include "SpellInfo.h" #include "SpellInfo.h"
#include "GameObject.h"
#include "GameObjectAI.h"
/*#### /*####
# quest_a_pawn_on_the_eternal_board (Defines) # quest_a_pawn_on_the_eternal_board (Defines)
@@ -958,374 +960,203 @@ public:
## go_wind_stone ## go_wind_stone
###*/ ###*/
enum WSSpells enum WindStone
{ {
SPELL_PUNISHMENT = 24803, AURA_TWILIGHT_SET = 24746,
SPELL_SPAWN_IN = 25035, AURA_MEDALLION = 24748,
AURA_RING = 24782,
AURA_TWILIGHT_SET = 24746, SPELL_PUNISHMENT = 24803,
AURA_MEDALLION = 24748, SPELL_SPAWN_IN = 25035,
AURA_RING = 24782,
SPELL_TEMPLAR_RANDOM = 24745, SPELL_TEMPLAR_RANDOM = 24745,
SPELL_TEMPLAR_FIRE = 24747, SPELL_TEMPLAR_FIRE = 24747,
SPELL_TEMPLAR_AIR = 24757, SPELL_TEMPLAR_AIR = 24757,
SPELL_TEMPLAR_EARTH = 24759, SPELL_TEMPLAR_EARTH = 24759,
SPELL_TEMPLAR_WATER = 24761, SPELL_TEMPLAR_WATER = 24761,
SPELL_DUKE_RANDOM = 24762,
SPELL_DUKE_RANDOM = 24762, SPELL_DUKE_FIRE = 24766,
SPELL_DUKE_FIRE = 24766, SPELL_DUKE_AIR = 24769,
SPELL_DUKE_AIR = 24769, SPELL_DUKE_EARTH = 24771,
SPELL_DUKE_EARTH = 24771, SPELL_DUKE_WATER = 24773,
SPELL_DUKE_WATER = 24773, SPELL_ROYAL_RANDOM = 24785,
SPELL_ROYAL_FIRE = 24787,
SPELL_ROYAL_RANDOM = 24785, SPELL_ROYAL_AIR = 24791,
SPELL_ROYAL_FIRE = 24787, SPELL_ROYAL_EARTH = 24792,
SPELL_ROYAL_AIR = 24791, SPELL_ROYAL_WATER = 24793,
SPELL_ROYAL_EARTH = 24792, GOSSIPID_LESSER_WS = 6540,
SPELL_ROYAL_WATER = 24793 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 class go_wind_stone : public GameObjectScript
{ {
public: public:
go_wind_stone() : GameObjectScript("go_wind_stone") { } go_wind_stone() : GameObjectScript("go_wind_stone") {}
private: struct go_wind_stoneAI : public GameObjectAI
uint8 GetPlayerRank(Player* player) // For random summoning
{ {
bool setAura = player->HasAura(AURA_TWILIGHT_SET, player->GetGUID()); go_wind_stoneAI(GameObject* go) : GameObjectAI(go) {}
bool medallionAura = player->HasAura(AURA_MEDALLION, player->GetGUID());
bool ringAura = player->HasAura(AURA_RING, player->GetGUID());
if (setAura && medallionAura && ringAura) bool GossipHello(Player* player, bool reportUse) override
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)
{ {
case TEMPLAR: if (reportUse)
{
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)
{ {
std::string accountName; uint32 gossipId = go->GetGOInfo()->GetGossipMenuId();
AccountMgr::GetName(player->GetSession()->GetAccountId(), accountName); bool _twilightSetAura = (player->HasAura(AURA_TWILIGHT_SET, player->GetGUID()) ? true : false);
sBan->BanAccount(accountName, "0s", "Wind Stone exploit", "Server"); 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); bool GossipSelect(Player* player, uint32 sender, uint32 action) override
summons->CastSpell(summons, SPELL_SPAWN_IN, false);
switch (summons->GetEntry())
{ {
case NPC_TEMPLAR_FIRE: player->PlayerTalkClass->SendCloseGossip();
case NPC_TEMPLAR_WATER:
case NPC_TEMPLAR_AIR:
case NPC_TEMPLAR_EARTH:
summons->AI()->Talk(SAY_TEMPLAR_AGGRO);
break;
case NPC_DUKE_FIRE: if (sender == GOSSIPID_LESSER_WS)
case NPC_DUKE_WATER: {
case NPC_DUKE_EARTH: switch (action)
case NPC_DUKE_AIR: {
summons->AI()->Talk(SAY_DUKE_AGGRO); case 0:
break; SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM);
case NPC_ROYAL_FIRE: break;
case NPC_ROYAL_AIR: case 1:
case NPC_ROYAL_EARTH: SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE);
case NPC_ROYAL_WATER: break;
summons->AI()->Talk(YELL_ROYAL_AGGRO); case 2:
break; 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: void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spellId)
bool OnGossipHello(Player* player, GameObject* go) override {
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); return new go_wind_stoneAI(go);
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;
} }
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() void AddSC_silithus()