diff options
author | Nay <dnpd.dd@gmail.com> | 2011-07-05 22:07:40 +0100 |
---|---|---|
committer | Nay <dnpd.dd@gmail.com> | 2011-07-05 22:07:40 +0100 |
commit | c572adea154244ebcfdb0fd55270533f95ae6f39 (patch) | |
tree | 98f7e48fd432ca1884897ecd76fd4808285ac28d /src | |
parent | 0059e2e21ba405e28bc6f59336df60ffd0d3bbc3 (diff) |
Scripts/Silithus: Fix Wind Stones gameobjects (fixes many quests in this zone). Closes #95
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 22 | ||||
-rw-r--r-- | src/server/scripts/Kalimdor/silithus.cpp | 356 |
2 files changed, 378 insertions, 0 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index e61781a2747..e2cdad9f266 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6016,6 +6016,28 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) caster->CastSpell(target, triggerSpellId, true, NULL, NULL, caster->GetGUID()); return; } + case 24745: // Summon Templar, Trigger + case 24747: // Summon Templar Fire, Trigger + case 24757: // Summon Templar Air, Trigger + case 24759: // Summon Templar Earth, Trigger + case 24761: // Summon Templar Water, Trigger + case 24762: // Summon Duke, Trigger + case 24766: // Summon Duke Fire, Trigger + case 24769: // Summon Duke Air, Trigger + case 24771: // Summon Duke Earth, Trigger + case 24773: // Summon Duke Water, Trigger + case 24785: // Summon Royal, Trigger + case 24787: // Summon Royal Fire, Trigger + case 24791: // Summon Royal Air, Trigger + case 24792: // Summon Royal Earth, Trigger + case 24793: // Summon Royal Water, Trigger + { + // All this spells trigger a spell that requires reagents; if the + // triggered spell is cast as "triggered", reagents are not consumed + if (caster) + caster->CastSpell(target, triggerSpellId, false); + return; + } } } diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp index 7baa2603b10..51fc3438387 100644 --- a/src/server/scripts/Kalimdor/silithus.cpp +++ b/src/server/scripts/Kalimdor/silithus.cpp @@ -1136,6 +1136,361 @@ public: }; +/*### +## go_wind_stone +###*/ + +enum WSSpells +{ + SPELL_PUNISHMENT = 24803, + SPELL_SPAWN_IN = 25035, + + AURA_TWILIGHT_SET = 24746, + AURA_MEDALLION = 24748, + AURA_RING = 24782, + + 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 +}; + +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") { } + + private: + uint8 GetPlayerRank(Player* player) // For random summoning + { + bool setAura = player->HasAura(AURA_TWILIGHT_SET); + bool medallionAura = player->HasAura(AURA_MEDALLION); + bool ringAura = player->HasAura(AURA_RING); + + 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) + { + case TEMPLAR: + { + if (player->HasItemCount(ITEM_TEMPLAR_FIRE, 1)) + result |= FIRE; + if (player->HasItemCount(ITEM_TEMPLAR_WATER, 1)) + result |= WATER; + if (player->HasItemCount(ITEM_TEMPLAR_EARTH, 1)) + result |= EARTH; + if (player->HasItemCount(ITEM_TEMPLAR_AIR, 1)) + result |= AIR; + break; + } + case DUKE: + { + if (player->HasItemCount(ITEM_DUKE_FIRE, 1)) + result |= FIRE; + if (player->HasItemCount(ITEM_DUKE_WATER, 1)) + result |= WATER; + if (player->HasItemCount(ITEM_DUKE_EARTH, 1)) + result |= EARTH; + if (player->HasItemCount(ITEM_DUKE_AIR, 1)) + result |= AIR; + break; + } + case ROYAL: + { + if (player->HasItemCount(ITEM_ROYAL_FIRE, 1)) + result |= FIRE; + if (player->HasItemCount(ITEM_ROYAL_WATER, 1)) + result |= WATER; + if (player->HasItemCount(ITEM_ROYAL_EARTH, 1)) + result |= EARTH; + if (player->HasItemCount(ITEM_ROYAL_AIR, 1)) + result |= AIR; + break; + } + default: + break; + } + return result; + } + + void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) + { + go->CastSpell(player, spell); + 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()) + { + case NPC_TEMPLAR_FIRE: + case NPC_TEMPLAR_WATER: + case NPC_TEMPLAR_AIR: + case NPC_TEMPLAR_EARTH: + summons->AI()->Talk(SAY_TEMPLAR_AGGRO); + break; + + 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; + } + summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summons->SendMeleeAttackStart(player); + summons->CombatStart(player); + } + + public: + bool OnGossipHello(Player* player, GameObject* go) + { + uint8 rank = GetPlayerRank(player); + + uint32 gossipId = go->GetGOInfo()->GetGossipMenuId(); + switch (gossipId) + { + case GOSSIPID_LESSER_WS: + { + if (rank >= 1) // 1 or 2 or 3 + player->ADD_GOSSIP_ITEM(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) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_FIRE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (item & WATER) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_WATER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + if (item & EARTH) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_EARTH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + if (item & AIR) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TEMPLAR_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + break; + } + case GOSSIPID_WS: + { + if (rank >= 2) // 2 or 3 + player->ADD_GOSSIP_ITEM(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) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUKE_FIRE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + if (item & WATER) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUKE_WATER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); + if (item & EARTH) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUKE_EARTH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); + if (item & AIR) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUKE_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); + break; + } + case GOSSIPID_GREATER_WS: + { + if (rank == 3) // 3 + player->ADD_GOSSIP_ITEM(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) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ROYAL_FIRE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); + if (item & WATER) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ROYAL_WATER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); + if (item & EARTH) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ROYAL_EARTH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); + if (item & AIR) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ROYAL_AIR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); + break; + } + default: + break; + } + + player->SEND_GOSSIP_MENU(player->GetGossipTextId(gossipId), go->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) + { + player->PlayerTalkClass->ClearMenus(); + 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() { new go_crystalline_tear(); @@ -1144,4 +1499,5 @@ void AddSC_silithus() new mob_qiraj_war_spawn(); new npc_highlord_demitrian(); new npcs_rutgar_and_frankal(); + new go_wind_stone(); } |