diff options
Diffstat (limited to 'src/server')
| -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();  }  | 
