mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-30 21:57:01 +01:00
Scripts/Silithus: Fix Wind Stones gameobjects (fixes many quests in this zone). Closes #95
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user