aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2012-10-23 14:16:05 +0200
committerSpp <spp@jorge.gr>2012-10-23 14:16:05 +0200
commit60d4343d8e8183e170ec833b43ec1254d5752c80 (patch)
tree718b83fa9d886610bb281785d6a19b3ea0d5ba4a /src/server/scripts
parentb73a5f32b07c227abc9c03a3348bf6d786107c30 (diff)
parent663db1cee3ab9bd3de76f210bc7c178f4991953e (diff)
Merge branch 'master' into 4.3.4
Conflicts: src/server/game/Spells/Spell.cpp src/server/shared/Logging/Appender.h
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt1
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp134
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/blasted_lands.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp2
-rw-r--r--src/server/scripts/Kalimdor/silithus.cpp24
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp103
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp21
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h3
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp2
-rw-r--r--src/server/scripts/Northrend/storm_peaks.cpp2
-rw-r--r--src/server/scripts/Outland/netherstorm.cpp10
-rw-r--r--src/server/scripts/Outland/zangarmarsh.cpp2
-rw-r--r--src/server/scripts/World/go_scripts.cpp18
-rw-r--r--src/server/scripts/World/npc_taxi.cpp4
-rw-r--r--src/server/scripts/World/npcs_special.cpp2
19 files changed, 248 insertions, 92 deletions
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index 177b3a479f5..a65324a9f42 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -27,6 +27,7 @@ set(scripts_STAT_SRCS
Commands/cs_honor.cpp
Commands/cs_instance.cpp
Commands/cs_learn.cpp
+ Commands/cs_lfg.cpp
Commands/cs_list.cpp
Commands/cs_lookup.cpp
Commands/cs_message.cpp
diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
new file mode 100644
index 00000000000..45ecc4e4721
--- /dev/null
+++ b/src/server/scripts/Commands/cs_lfg.cpp
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "Chat.h"
+#include "LFGMgr.h"
+#include "Group.h"
+
+void GetPlayerInfo(ChatHandler* handler, Player* player)
+{
+ if (!player)
+ return;
+
+ uint64 guid = player->GetGUID();
+ LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(guid);
+
+ char const * const state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ handler->PSendSysMessage(LANG_LFG_PLAYER_INFO, player->GetName(),
+ state, uint8(dungeons.size()), sLFGMgr->ConcatenateDungeons(dungeons).c_str(),
+ sLFGMgr->GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str());
+}
+
+class lfg_commandscript : public CommandScript
+{
+public:
+ lfg_commandscript() : CommandScript("lfg_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand lfgCommandTable[] =
+ {
+ { "player", SEC_GAMEMASTER, false, &HandleLfgPlayerInfoCommand, "", NULL },
+ { "group", SEC_GAMEMASTER, false, &HandleLfgGroupInfoCommand, "", NULL },
+ { "queue", SEC_GAMEMASTER, false, &HandleLfgQueueInfoCommand, "", NULL },
+ { "clean", SEC_ADMINISTRATOR, false, &HandleLfgCleanCommand, "", NULL },
+ { "options", SEC_ADMINISTRATOR, false, &HandleLfgOptionsCommand, "", NULL },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "lfg", SEC_GAMEMASTER, false, NULL, "", lfgCommandTable },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleLfgPlayerInfoCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = NULL;
+ std::string playerName;
+ if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName))
+ return false;
+
+ GetPlayerInfo(handler, target);
+ return true;
+ }
+
+ static bool HandleLfgGroupInfoCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = NULL;
+ std::string playerName;
+ if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName))
+ return false;
+
+ Group* grp = target->GetGroup();
+ if (!grp)
+ {
+ handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, playerName.c_str());
+ return true;
+ }
+
+ uint64 guid = grp->GetGUID();
+ char const * const state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(),
+ state, sLFGMgr->GetDungeon(guid));
+
+ for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
+ GetPlayerInfo(handler, itr->getSource());
+
+ return true;
+ }
+
+ static bool HandleLfgOptionsCommand(ChatHandler* handler, char const* args)
+ {
+ int32 options = -1;
+ if (char* str = strtok((char*)args, " "))
+ {
+ int32 tmp = atoi(str);
+ if (tmp > -1)
+ options = tmp;
+ }
+
+ if (options != -1)
+ {
+ sLFGMgr->SetOptions(options);
+ handler->PSendSysMessage(LANG_LFG_OPTIONS_CHANGED);
+ }
+ handler->PSendSysMessage(LANG_LFG_OPTIONS, sLFGMgr->GetOptions());
+ return true;
+ }
+
+ static bool HandleLfgQueueInfoCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->SendSysMessage(sLFGMgr->DumpQueueInfo().c_str());
+ return true;
+ }
+
+ static bool HandleLfgCleanCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->PSendSysMessage(LANG_LFG_CLEAN);
+ sLFGMgr->Clean();
+ return true;
+ }
+};
+
+void AddSC_lfg_commandscript()
+{
+ new lfg_commandscript();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
index 7286466d335..263897edfad 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
@@ -546,7 +546,7 @@ public:
if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 &&
!player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
- player->HasItemCount(ITEM_SULFURON_INGOT, 1))
+ player->HasItemCount(ITEM_SULFURON_INGOT))
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
}
diff --git a/src/server/scripts/EasternKingdoms/blasted_lands.cpp b/src/server/scripts/EasternKingdoms/blasted_lands.cpp
index 3d8e68dfbf8..75109f3a2f6 100644
--- a/src/server/scripts/EasternKingdoms/blasted_lands.cpp
+++ b/src/server/scripts/EasternKingdoms/blasted_lands.cpp
@@ -60,7 +60,7 @@ public:
bool OnGossipHello(Player* player, Creature* creature)
{
- if (player->GetQuestStatus(3628) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(10757, 1))
+ if (player->GetQuestStatus(3628) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(10757))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_USHER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
index ee7ef383603..48dd847b190 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
@@ -236,7 +236,7 @@ public:
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
// Only let them get item if Azgalor is dead.
- if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS, 1))
+ if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(907, creature->GetGUID());
return true;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
index ee8c4d1bae1..bed3cde6fa4 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
@@ -388,13 +388,13 @@ public:
if (creature->isQuestGiver())
player->PrepareQuestMenu(creature->GetGUID());
- if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(ITEM_CHRONO_BEACON, 1))
+ if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(ITEM_CHRONO_BEACON))
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_OBTAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(10000, creature->GetGUID());
return true;
}
- else if (player->GetQuestRewardStatus(QUEST_OPENING_PORTAL) && !player->HasItemCount(ITEM_CHRONO_BEACON, 1))
+ else if (player->GetQuestRewardStatus(QUEST_OPENING_PORTAL) && !player->HasItemCount(ITEM_CHRONO_BEACON))
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_OBTAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(10001, creature->GetGUID());
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
index 3690e87354d..0158d470ef9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
@@ -79,7 +79,7 @@ public:
player->PrepareQuestMenu(creature->GetGUID());
InstanceScript* instance = creature->GetInstanceScript();
- if (instance && instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS, 1))
+ if (instance && instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE)
diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp
index 1fe945b06d4..570c95a0737 100644
--- a/src/server/scripts/Kalimdor/silithus.cpp
+++ b/src/server/scripts/Kalimdor/silithus.cpp
@@ -366,37 +366,37 @@ class go_wind_stone : public GameObjectScript
{
case TEMPLAR:
{
- if (player->HasItemCount(ITEM_TEMPLAR_FIRE, 1))
+ if (player->HasItemCount(ITEM_TEMPLAR_FIRE))
result |= FIRE;
- if (player->HasItemCount(ITEM_TEMPLAR_WATER, 1))
+ if (player->HasItemCount(ITEM_TEMPLAR_WATER))
result |= WATER;
- if (player->HasItemCount(ITEM_TEMPLAR_EARTH, 1))
+ if (player->HasItemCount(ITEM_TEMPLAR_EARTH))
result |= EARTH;
- if (player->HasItemCount(ITEM_TEMPLAR_AIR, 1))
+ if (player->HasItemCount(ITEM_TEMPLAR_AIR))
result |= AIR;
break;
}
case DUKE:
{
- if (player->HasItemCount(ITEM_DUKE_FIRE, 1))
+ if (player->HasItemCount(ITEM_DUKE_FIRE))
result |= FIRE;
- if (player->HasItemCount(ITEM_DUKE_WATER, 1))
+ if (player->HasItemCount(ITEM_DUKE_WATER))
result |= WATER;
- if (player->HasItemCount(ITEM_DUKE_EARTH, 1))
+ if (player->HasItemCount(ITEM_DUKE_EARTH))
result |= EARTH;
- if (player->HasItemCount(ITEM_DUKE_AIR, 1))
+ if (player->HasItemCount(ITEM_DUKE_AIR))
result |= AIR;
break;
}
case ROYAL:
{
- if (player->HasItemCount(ITEM_ROYAL_FIRE, 1))
+ if (player->HasItemCount(ITEM_ROYAL_FIRE))
result |= FIRE;
- if (player->HasItemCount(ITEM_ROYAL_WATER, 1))
+ if (player->HasItemCount(ITEM_ROYAL_WATER))
result |= WATER;
- if (player->HasItemCount(ITEM_ROYAL_EARTH, 1))
+ if (player->HasItemCount(ITEM_ROYAL_EARTH))
result |= EARTH;
- if (player->HasItemCount(ITEM_ROYAL_AIR, 1))
+ if (player->HasItemCount(ITEM_ROYAL_AIR))
result |= AIR;
break;
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 2fe97f3fb50..9aa2ccbee9d 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -112,6 +112,8 @@ enum Spells
SPELL_SUMMON_EXIT_PORTALS = 74805, // Custom spell created in spell_dbc.
SPELL_TWILIGHT_MENDING = 75509,
SPELL_TWILIGHT_REALM = 74807,
+ SPELL_DUSK_SHROUD = 75476,
+ SPELL_TWILIGHT_PRECISION = 78243,
SPELL_COPY_DAMAGE = 74810 // Aura not found in DBCs.
};
@@ -225,19 +227,24 @@ struct generic_halionAI : public BossAI
{
generic_halionAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId), _canEvade(false) { }
- void EnterCombat(Unit* /*who*/)
+ void EnterCombat(Unit* who)
{
- Talk(SAY_AGGRO);
- _EnterCombat();
+ BossAI::EnterCombat(who);
_canEvade = false;
- events.Reset();
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
+ events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
+ }
+
+ void Reset()
+ {
+ _canEvade = false;
+ BossAI::Reset();
}
void EnterEvadeMode()
{
+ BossAI::EnterEvadeMode();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _EnterEvadeMode();
}
void ExecuteEvent(uint32 const eventId)
@@ -248,6 +255,10 @@ struct generic_halionAI : public BossAI
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
break;
+ case EVENT_TAIL_LASH:
+ DoCastAOE(SPELL_TAIL_LASH);
+ events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
+ break;
}
}
@@ -296,52 +307,54 @@ class boss_halion : public CreatureScript
struct boss_halionAI : public generic_halionAI
{
- boss_halionAI(Creature* creature) : generic_halionAI(creature, DATA_HALION) { }
+ boss_halionAI(Creature* creature) : generic_halionAI(creature, DATA_HALION)
+ {
+ me->SetHomePosition(HalionSpawnPos);
+ }
void Reset()
{
generic_halionAI::Reset();
me->SetReactState(REACT_DEFENSIVE);
-
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
-
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_PHASING);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->AddAura(SPELL_TWILIGHT_PRECISION, me);
}
void EnterEvadeMode()
{
// Phase 1: We always can evade. Phase 2 & 3: We can evade if and only if the controller tells us to.
- // Controller has absolute priority over the phasemask.
if ((events.GetPhaseMask() & PHASE_ONE_MASK) || _canEvade)
generic_halionAI::EnterEvadeMode();
}
void EnterCombat(Unit* who)
{
+ Talk(SAY_AGGRO);
+
+ events.Reset();
+ events.SetPhase(PHASE_ONE);
+
generic_halionAI::EnterCombat(who);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
instance->SetBossState(DATA_HALION, IN_PROGRESS);
- events.SetPhase(PHASE_ONE);
- events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 10000);
+ events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5000);
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 12000));
events.ScheduleEvent(EVENT_METEOR_STRIKE, urand(20000, 25000));
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, urand(15000, 18000));
- events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_ONE);
}
- void JustDied(Unit* /*killer*/)
+ void JustDied(Unit* killer)
{
- _JustDied();
+ BossAI::JustDied(killer);
Talk(SAY_DEATH);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
me->Kill(controller);
@@ -389,21 +402,15 @@ class boss_halion : public CreatureScript
switch (eventId)
{
case EVENT_ACTIVATE_FIREWALL:
- {
- // Flame ring is activated 10 seconds after starting encounter, DOOR_TYPE_ROOM is only instant.
+ // Flame ring is activated 5 seconds after starting encounter, DOOR_TYPE_ROOM is only instant.
for (uint8 i = DATA_FLAME_RING; i <= DATA_TWILIGHT_FLAME_RING; ++i)
if (GameObject* flameRing = ObjectAccessor::GetGameObject(*me, instance->GetData64(i)))
instance->HandleGameObject(instance->GetData64(DATA_FLAME_RING), false, flameRing);
break;
- }
case EVENT_FLAME_BREATH:
DoCast(me, SPELL_FLAME_BREATH);
events.ScheduleEvent(EVENT_FLAME_BREATH, 25000);
break;
- case EVENT_TAIL_LASH:
- DoCastAOE(SPELL_TAIL_LASH);
- events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
- break;
case EVENT_METEOR_STRIKE:
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_TWILIGHT_REALM))
@@ -465,29 +472,32 @@ class boss_twilight_halion : public CreatureScript
if (!halion)
return;
- // We use explicit targeting here to avoid conditions + SPELL_ATTR6_CANT_TARGET_SELF.
// Using AddAura because no spell cast packet in sniffs.
- halion->AddAura(SPELL_COPY_DAMAGE, me);
+ halion->AddAura(SPELL_COPY_DAMAGE, me); // We use explicit targeting here to avoid conditions + SPELL_ATTR6_CANT_TARGET_SELF.
me->AddAura(SPELL_COPY_DAMAGE, halion);
+ me->AddAura(SPELL_DUSK_SHROUD, me);
me->SetHealth(halion->GetHealth());
me->SetPhaseMask(0x20, true);
me->SetReactState(REACT_AGGRESSIVE);
+ }
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2);
-
+ void EnterCombat(Unit* who)
+ {
events.Reset();
events.SetPhase(PHASE_TWO);
+
+ generic_halionAI::EnterCombat(who);
+
events.ScheduleEvent(EVENT_DARK_BREATH, urand(10000, 15000));
events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000);
- events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
- }
- void EnterEvadeMode()
- {
- // We don't care about evading, we will be despawned.
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2);
}
+ // Never evade
+ void EnterEvadeMode() { }
+
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
@@ -564,10 +574,6 @@ class boss_twilight_halion : public CreatureScript
DoCast(target, SPELL_SOUL_CONSUMPTION);
events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000);
break;
- case EVENT_TAIL_LASH:
- DoCastAOE(SPELL_TAIL_LASH);
- events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
- break;
default:
generic_halionAI::ExecuteEvent(eventId);
break;
@@ -1185,10 +1191,19 @@ class npc_living_inferno : public CreatureScript
{
npc_living_infernoAI(Creature* creature) : ScriptedAI(creature) { }
- void JustSummoned(Creature* /*summoner*/)
+ void IsSummonedBy(Unit* /*summoner*/)
{
me->SetInCombatWithZone();
- DoCast(me, SPELL_BLAZING_AURA);
+ me->CastSpell(me, SPELL_BLAZING_AURA, true);
+
+ if (InstanceScript* instance = me->GetInstanceScript())
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
+ controller->AI()->JustSummoned(me);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ me->DespawnOrUnsummon(1);
}
};
@@ -1219,6 +1234,18 @@ class npc_living_ember : public CreatureScript
_hasEnraged = false;
}
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ if (InstanceScript* instance = me->GetInstanceScript())
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
+ controller->AI()->JustSummoned(me);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ me->DespawnOrUnsummon(1);
+ }
+
void UpdateAI(uint32 const diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
index a6b50467538..bf48132b2b2 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
@@ -45,7 +45,6 @@ class instance_ruby_sanctum : public InstanceMapScript
OrbCarrierGUID = 0;
OrbRotationFocusGUID = 0;
HalionControllerGUID = 0;
- CombatStalkerGUID = 0;
CrystalChannelTargetGUID = 0;
XerestraszaGUID = 0;
BaltharusSharedHealth = 0;
@@ -56,6 +55,13 @@ class instance_ruby_sanctum : public InstanceMapScript
memset(BurningTreeGUID, 0, 4 * sizeof(uint64));
}
+ void OnPlayerEnter(Player* /*player*/)
+ {
+ if (!GetData64(DATA_HALION_CONTROLLER) && GetBossState(DATA_HALION) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
+ if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos))
+ halionController->AI()->DoAction(ACTION_INTRO_HALION);
+ }
+
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
@@ -84,9 +90,6 @@ class instance_ruby_sanctum : public InstanceMapScript
case NPC_ORB_ROTATION_FOCUS:
OrbRotationFocusGUID = creature->GetGUID();
break;
- case NPC_COMBAT_STALKER:
- CombatStalkerGUID = creature->GetGUID();
- break;
case NPC_BALTHARUS_TARGET:
CrystalChannelTargetGUID = creature->GetGUID();
break;
@@ -195,8 +198,6 @@ class instance_ruby_sanctum : public InstanceMapScript
return FlameRingGUID;
case DATA_TWILIGHT_FLAME_RING:
return TwilightFlameRingGUID;
- case DATA_COMBAT_STALKER:
- return CombatStalkerGUID;
default:
break;
}
@@ -207,14 +208,7 @@ class instance_ruby_sanctum : public InstanceMapScript
bool SetBossState(uint32 type, EncounterState state)
{
if (!InstanceScript::SetBossState(type, state))
- {
- // Summon Halion on instance loading if conditions are met. Without those lines,
- // InstanceScript::SetBossState returns false, thus preventing the switch from being called.
- if (type == DATA_HALION && state != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE && !GetData64(DATA_HALION_CONTROLLER))
- if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos))
- halionController->AI()->DoAction(ACTION_INTRO_HALION);
return false;
- }
switch (type)
{
@@ -353,7 +347,6 @@ class instance_ruby_sanctum : public InstanceMapScript
uint64 BurningTreeGUID[4];
uint64 FlameRingGUID;
uint64 TwilightFlameRingGUID;
- uint64 CombatStalkerGUID;
uint32 BaltharusSharedHealth;
};
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
index 7eb1b73721c..47a55f9035f 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
@@ -52,7 +52,6 @@ enum DataTypes
DATA_BURNING_TREE_4 = 16,
DATA_FLAME_RING = 17,
DATA_TWILIGHT_FLAME_RING = 18,
- DATA_COMBAT_STALKER = 19,
};
enum SharedActions
@@ -97,7 +96,7 @@ enum CreaturesIds
NPC_METEOR_STRIKE_FLAME = 40055,
NPC_COMBUSTION = 40001,
NPC_CONSUMPTION = 40135,
- NPC_COMBAT_STALKER = 40151,
+ NPC_COMBAT_STALKER = 40151, // Seen in sniffs but not used, so no wonder.
// Xerestrasza
NPC_XERESTRASZA = 40429,
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 28595571a2f..f00369fd9e2 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -32,7 +32,7 @@
#define GOSSIP_ITEM_ETERNOS1 "I want to fly on the wings of the Bronze Flight"
#define GOSSIP_ITEM_ETERNOS2 "What abilities do Amber Drakes have?"
-#define HAS_ESSENCE(a) ((a)->HasItemCount(ITEM_EMERALD_ESSENCE, 1) || (a)->HasItemCount(ITEM_AMBER_ESSENCE, 1) || (a)->HasItemCount(ITEM_RUBY_ESSENCE, 1))
+#define HAS_ESSENCE(a) ((a)->HasItemCount(ITEM_EMERALD_ESSENCE) || (a)->HasItemCount(ITEM_AMBER_ESSENCE) || (a)->HasItemCount(ITEM_RUBY_ESSENCE))
enum GossipNPCs
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index a075b480d04..89d2f752721 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -978,7 +978,7 @@ class go_celestial_planetarium_access : public GameObjectScript
if (!lock->Index[i])
continue;
- if (player->HasItemCount(lock->Index[i], 1))
+ if (player->HasItemCount(lock->Index[i]))
{
hasKey = true;
break;
diff --git a/src/server/scripts/Northrend/storm_peaks.cpp b/src/server/scripts/Northrend/storm_peaks.cpp
index fc4f2785990..1733af17580 100644
--- a/src/server/scripts/Northrend/storm_peaks.cpp
+++ b/src/server/scripts/Northrend/storm_peaks.cpp
@@ -19,6 +19,8 @@
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
#include "Vehicle.h"
#include "CombatAI.h"
diff --git a/src/server/scripts/Outland/netherstorm.cpp b/src/server/scripts/Outland/netherstorm.cpp
index 480275c42bd..8533491c15f 100644
--- a/src/server/scripts/Outland/netherstorm.cpp
+++ b/src/server/scripts/Outland/netherstorm.cpp
@@ -323,22 +323,22 @@ public:
{
case 3726: //b'naar
if ((player->GetQuestStatus(10299) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10329) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29366, 1))
+ player->HasItemCount(29366))
manaforge = player->SummonCreature(ENTRY_BNAAR_C_CONSOLE, 2918.95f, 4189.98f, 161.88f, 0.34f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
break;
case 3730: //coruu
if ((player->GetQuestStatus(10321) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10330) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29396, 1))
+ player->HasItemCount(29396))
manaforge = player->SummonCreature(ENTRY_CORUU_C_CONSOLE, 2426.77f, 2750.38f, 133.24f, 2.14f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
break;
case 3734: //duro
if ((player->GetQuestStatus(10322) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10338) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29397, 1))
+ player->HasItemCount(29397))
manaforge = player->SummonCreature(ENTRY_DURO_C_CONSOLE, 2976.48f, 2183.29f, 163.20f, 1.85f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
break;
case 3722: //ara
if ((player->GetQuestStatus(10323) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10365) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29411, 1))
+ player->HasItemCount(29411))
manaforge = player->SummonCreature(ENTRY_ARA_C_CONSOLE, 4013.71f, 4028.76f, 192.10f, 1.25f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
break;
}
@@ -704,7 +704,7 @@ public:
if (creature->isQuestGiver())
player->PrepareQuestMenu(creature->GetGUID());
- if (player->GetQuestStatus(QUEST_ON_NETHERY_WINGS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(29778, 1))
+ if (player->GetQuestStatus(QUEST_ON_NETHERY_WINGS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(29778))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
diff --git a/src/server/scripts/Outland/zangarmarsh.cpp b/src/server/scripts/Outland/zangarmarsh.cpp
index aa51b532c27..a48866a2f83 100644
--- a/src/server/scripts/Outland/zangarmarsh.cpp
+++ b/src/server/scripts/Outland/zangarmarsh.cpp
@@ -249,7 +249,7 @@ public:
break;
case GOSSIP_ACTION_INFO_DEF + 2:
{
- if (!player->HasItemCount(24573, 1))
+ if (!player->HasItemCount(24573))
{
ItemPosCountVec dest;
uint32 itemId = 24573;
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index 2a5d58122ed..ddb0044a888 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -677,28 +677,28 @@ public:
switch (go->GetEntry())
{
case MATRIX_PUNCHOGRAPH_3005_A:
- if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD, 1))
+ if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD))
{
player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true);
player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true);
}
break;
case MATRIX_PUNCHOGRAPH_3005_B:
- if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD, 1))
+ if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD))
{
player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true);
player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true);
}
break;
case MATRIX_PUNCHOGRAPH_3005_C:
- if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD, 1))
+ if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD))
{
player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true);
player->CastSpell(player, SPELL_RED_PUNCH_CARD, true);
}
break;
case MATRIX_PUNCHOGRAPH_3005_D:
- if (player->HasItemCount(ITEM_RED_PUNCH_CARD, 1))
+ if (player->HasItemCount(ITEM_RED_PUNCH_CARD))
{
player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true);
player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true);
@@ -884,7 +884,7 @@ public:
bool OnGossipHello(Player* player, GameObject* /*go*/)
{
- if (player->HasItemCount(ITEM_CUERGOS_KEY, 1))
+ if (player->HasItemCount(ITEM_CUERGOS_KEY))
return false;
player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true);
@@ -910,7 +910,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go)
{
- if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK, 1))
+ if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK))
return false;
go->SummonCreature(NPC_IMAGE_WIND_TRADER, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
@@ -998,7 +998,7 @@ class go_soulwell : public GameObjectScript
return true;
// Don't try to add a stone if we already have one.
- if (player->HasItemCount(_stoneId, 1))
+ if (player->HasItemCount(_stoneId))
{
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(_stoneSpell))
Spell::SendCastResult(player, spell, 0, SPELL_FAILED_TOO_MANY_OF_ITEM);
@@ -1007,7 +1007,7 @@ class go_soulwell : public GameObjectScript
owner->CastSpell(player, _stoneSpell, true);
// Item has to actually be created to remove a charge on the well.
- if (player->HasItemCount(_stoneId, 1))
+ if (player->HasItemCount(_stoneId))
go->AddUse();
return false;
@@ -1158,7 +1158,7 @@ public:
go->CastSpell(target, SPELL_INDISPOSED_III);
}
go->CastSpell(player, SPELL_INDISPOSED);
- if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER, 1))
+ if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER))
go->CastSpell(player, SPELL_CREATE_AMBERSEEDS);
return true;
}
diff --git a/src/server/scripts/World/npc_taxi.cpp b/src/server/scripts/World/npc_taxi.cpp
index 6241978fbd2..efdd4da73d6 100644
--- a/src/server/scripts/World/npc_taxi.cpp
+++ b/src/server/scripts/World/npc_taxi.cpp
@@ -77,7 +77,7 @@ public:
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SUSURRUS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
break;
case 20903: // Netherstorm - Protectorate Nether Drake
- if (player->GetQuestStatus(10438) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(29778, 1))
+ if (player->GetQuestStatus(10438) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(29778))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_NETHER_DRAKE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
break;
case 18725: // Old Hillsbrad Foothills - Brazen
@@ -203,7 +203,7 @@ public:
player->ActivateTaxiPathTo(627); //TaxiPath 627 (possibly 627+628(152->153->154->155))
break;
case GOSSIP_ACTION_INFO_DEF + 2:
- if (!player->HasItemCount(25853, 1))
+ if (!player->HasItemCount(25853))
player->SEND_GOSSIP_MENU(9780, creature->GetGUID());
else
{
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index f7363f2fb0a..fc8b718655c 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -1268,7 +1268,7 @@ public:
if (player->GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(player) && player->getLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_HELLO_ROGUE3, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_LEARNDUALSPEC);
- if (player->getClass() == CLASS_ROGUE && player->getLevel() >= 24 && !player->HasItemCount(17126, 1) && !player->GetQuestRewardStatus(6681))
+ if (player->getClass() == CLASS_ROGUE && player->getLevel() >= 24 && !player->HasItemCount(17126) && !player->GetQuestRewardStatus(6681))
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_ROGUE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
player->SEND_GOSSIP_MENU(5996, creature->GetGUID());