aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp54
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp150
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp17
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h2
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp10
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp2
7 files changed, 125 insertions, 118 deletions
diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
index 747d84de9c5..d1662f3a97c 100644
--- a/src/server/scripts/Commands/cs_lfg.cpp
+++ b/src/server/scripts/Commands/cs_lfg.cpp
@@ -19,7 +19,9 @@
#include "Chat.h"
#include "Language.h"
#include "LFGMgr.h"
+#include "ObjectMgr.h"
#include "Group.h"
+#include "GroupMgr.h"
#include "Player.h"
void GetPlayerInfo(ChatHandler* handler, Player* player)
@@ -74,25 +76,55 @@ public:
static bool HandleLfgGroupInfoCommand(ChatHandler* handler, char const* args)
{
- Player* target = NULL;
- std::string playerName;
- if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName))
+ Player* playerTarget;
+ ObjectGuid guidTarget;
+ std::string nameTarget;
+
+ ObjectGuid parseGUID(HIGHGUID_PLAYER, uint32(atoul(args)));
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
+ {
+ playerTarget = ObjectAccessor::FindPlayer(parseGUID);
+ guidTarget = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
return false;
- Group* grp = target->GetGroup();
- if (!grp)
+ Group* groupTarget = NULL;
+
+ if (playerTarget)
+ groupTarget = playerTarget->GetGroup();
+ else
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
+ stmt->setUInt32(0, guidTarget.GetCounter());
+ PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
+ if (resultGroup)
+ groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
+ }
+ if (!groupTarget)
{
- handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, playerName.c_str());
- return true;
+ handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, nameTarget.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
}
- ObjectGuid guid = grp->GetGUID();
+ ObjectGuid guid = groupTarget->GetGUID();
std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid));
- handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(),
+ handler->PSendSysMessage(LANG_LFG_GROUP_INFO, groupTarget->isLFGGroup(),
state.c_str(), sLFGMgr->GetDungeon(guid));
- for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
- GetPlayerInfo(handler, itr->GetSource());
+ Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
+
+ for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ Group::MemberSlot const& slot = *itr;
+ Player* p = ObjectAccessor::FindPlayer((*itr).guid);
+ if (p)
+ GetPlayerInfo(handler, p);
+ else
+ handler->PSendSysMessage("%s is offline.", slot.name.c_str());
+ }
return true;
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
index 0311ed61c6a..ecda065fda9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
@@ -32,8 +32,7 @@ enum Spells
SPELL_CURSE_OF_EXERTION = 52772,
SPELL_TIME_WARP = 52766, //Time slows down, reducing attack, casting and movement speed by 70% for 6 sec.
SPELL_TIME_STOP = 58848, //Stops time in a 50 yard sphere for 2 sec.
- SPELL_WOUNDING_STRIKE = 52771, //Used only on the tank
- H_SPELL_WOUNDING_STRIKE = 58830
+ SPELL_WOUNDING_STRIKE = 52771 //Used only on the tank
};
enum Yells
@@ -45,109 +44,78 @@ enum Yells
SAY_DEATH = 4
};
-class boss_epoch : public CreatureScript
+enum Events
{
-public:
- boss_epoch() : CreatureScript("boss_epoch") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_epochAI>(creature);
- }
-
- struct boss_epochAI : public ScriptedAI
- {
- boss_epochAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
-
- void Initialize()
- {
- uiStep = 1;
- uiStepTimer = 26000;
- uiCurseOfExertionTimer = 9300;
- uiTimeWarpTimer = 25300;
- uiTimeStopTimer = 21300;
- uiWoundingStrikeTimer = 5300;
- }
-
- uint8 uiStep;
-
- uint32 uiStepTimer;
- uint32 uiWoundingStrikeTimer;
- uint32 uiTimeWarpTimer;
- uint32 uiTimeStopTimer;
- uint32 uiCurseOfExertionTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
-
- instance->SetBossState(DATA_EPOCH, NOT_STARTED);
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ EVENT_CURSE_OF_EXERTION = 1,
+ EVENT_TIME_WARP,
+ EVENT_TIME_STOP,
+ EVENT_WOUNDING_STRIKE
+};
- instance->SetBossState(DATA_EPOCH, IN_PROGRESS);
- }
+class boss_epoch : public CreatureScript
+{
+ public:
+ boss_epoch() : CreatureScript("boss_epoch") { }
- void UpdateAI(uint32 diff) override
+ struct boss_epochAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ boss_epochAI(Creature* creature) : BossAI(creature, DATA_EPOCH) { }
- if (uiCurseOfExertionTimer < diff)
+ void EnterCombat(Unit* /*who*/) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_CURSE_OF_EXERTION);
- uiCurseOfExertionTimer = 9300;
- } else uiCurseOfExertionTimer -= diff;
+ Talk(SAY_AGGRO);
+ _EnterCombat();
- if (uiWoundingStrikeTimer < diff)
- {
- DoCastVictim(SPELL_WOUNDING_STRIKE);
- uiWoundingStrikeTimer = 5300;
- } else uiWoundingStrikeTimer -= diff;
+ events.ScheduleEvent(EVENT_CURSE_OF_EXERTION, 9300);
+ events.ScheduleEvent(EVENT_TIME_WARP, 25300);
+ events.ScheduleEvent(EVENT_TIME_STOP, 21300);
+ events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 5300);
+ }
- if (uiTimeStopTimer < diff)
+ void ExecuteEvent(uint32 eventId) override
{
- DoCastAOE(SPELL_TIME_STOP);
- uiTimeStopTimer = 21300;
- } else uiTimeStopTimer -= diff;
-
- if (uiTimeWarpTimer < diff)
+ switch (eventId)
+ {
+ case EVENT_CURSE_OF_EXERTION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_CURSE_OF_EXERTION);
+ events.ScheduleEvent(EVENT_CURSE_OF_EXERTION, 9300);
+ break;
+ case EVENT_TIME_WARP:
+ Talk(SAY_TIME_WARP);
+ DoCastAOE(SPELL_TIME_WARP);
+ events.ScheduleEvent(EVENT_TIME_WARP, 25300);
+ break;
+ case EVENT_TIME_STOP:
+ DoCastAOE(SPELL_TIME_STOP);
+ events.ScheduleEvent(EVENT_TIME_STOP, 21300);
+ break;
+ case EVENT_WOUNDING_STRIKE:
+ DoCastVictim(SPELL_WOUNDING_STRIKE);
+ events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 5300);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
{
- Talk(SAY_TIME_WARP);
- DoCastAOE(SPELL_TIME_WARP);
- uiTimeWarpTimer = 25300;
- } else uiTimeWarpTimer -= diff;
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
-
- instance->SetBossState(DATA_EPOCH, DONE);
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+ };
- void KilledUnit(Unit* victim) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Talk(SAY_SLAY);
+ return GetInstanceAI<boss_epochAI>(creature);
}
- };
-
};
void AddSC_boss_epoch()
diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index d5ff4c45d09..bb17de4fd6a 100644
--- a/src/server/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
@@ -88,12 +88,20 @@ public:
DoCast(me, SPELL_KODO_KOMBO_DESPAWN_BUFF, true);
me->UpdateEntry(NPC_TAMED_KODO);
+ me->CombatStop();
+ me->DeleteThreatList();
+ me->SetSpeed(MOVE_RUN, 0.6f, true);
me->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, me->GetFollowAngle());
+ me->setActive(true);
}
}
else if (spell->Id == SPELL_KODO_KOMBO_GOSSIP)
{
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveIdle();
+ me->setActive(false);
me->DespawnOrUnsummon(60000);
}
}
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
index 1e2ca666378..6233c7e8953 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -330,7 +330,7 @@ public:
DespawnDwarf();
- instance->SetBossState(DATA_BRANN_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_TRIBUNAL_OF_AGES, NOT_STARTED);
}
}
@@ -362,8 +362,10 @@ public:
break;
case 13:
Talk(SAY_EVENT_INTRO_1);
+ instance->SetBossState(DATA_TRIBUNAL_OF_AGES, IN_PROGRESS);
SetEscortPaused(true);
JumpToNextStep(20000);
+ // @todo: There should be a pause here and a gossip should start the next step.
break;
case 17:
Talk(SAY_EVENT_INTRO_2);
@@ -421,9 +423,9 @@ public:
Start();
}
- void DamageTaken(Unit* /*done_by*/, uint32 & /*damage*/) override
+ void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
{
- if (brannSparklinNews)
+ if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) == IN_PROGRESS)
brannSparklinNews = false;
}
@@ -442,9 +444,8 @@ public:
switch (uiStep)
{
case 1:
- if (instance->GetBossState(DATA_BRANN_EVENT) != NOT_STARTED)
+ if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) != NOT_STARTED)
return;
- instance->SetBossState(DATA_BRANN_EVENT, IN_PROGRESS);
bIsBattle = false;
Talk(SAY_ESCORT_START);
SetRun(true);
@@ -582,7 +583,7 @@ public:
break;
case 29:
Talk(SAY_EVENT_END_02);
- instance->SetBossState(DATA_BRANN_EVENT, DONE);
+ instance->SetBossState(DATA_TRIBUNAL_OF_AGES, DONE);
me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true);
JumpToNextStep(5500);
break;
@@ -715,9 +716,7 @@ public:
class achievement_brann_spankin_new : public AchievementCriteriaScript
{
public:
- achievement_brann_spankin_new() : AchievementCriteriaScript("achievement_brann_spankin_new")
- {
- }
+ achievement_brann_spankin_new() : AchievementCriteriaScript("achievement_brann_spankin_new") { }
bool OnCheck(Player* /*player*/, Unit* target) override
{
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
index 2ed47b42bbc..df56aadfe22 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
@@ -28,7 +28,7 @@ enum DataTypes
// Encounter States/Boss GUIDs
DATA_KRYSTALLUS = 0,
DATA_MAIDEN_OF_GRIEF = 1,
- DATA_BRANN_EVENT = 2,
+ DATA_TRIBUNAL_OF_AGES = 2,
DATA_SJONNIR = 3,
// Additional data
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
index a70d1ff3a0d..c67e31c4cc0 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
@@ -23,8 +23,8 @@
DoorData const doorData[] =
{
- { GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_SJONNIR_DOOR, DATA_TRIBUNAL_OF_AGES, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_halls_of_stone : public InstanceMapScript
@@ -90,7 +90,7 @@ class instance_halls_of_stone : public InstanceMapScript
case GO_TRIBUNAL_CHEST:
case GO_TRIBUNAL_CHEST_HERO:
TribunalChestGUID = go->GetGUID();
- if (GetBossState(DATA_BRANN_EVENT) == DONE)
+ if (GetBossState(DATA_TRIBUNAL_OF_AGES) == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_TRIBUNAL_SKY_FLOOR:
@@ -156,7 +156,7 @@ class instance_halls_of_stone : public InstanceMapScript
switch (type)
{
- case DATA_BRANN_EVENT:
+ case DATA_TRIBUNAL_OF_AGES:
if (state == DONE)
{
if (GameObject* go = instance->GetGameObject(TribunalChestGUID))
@@ -178,7 +178,7 @@ class instance_halls_of_stone : public InstanceMapScript
switch (bossId)
{
case DATA_SJONNIR:
- if (GetBossState(DATA_BRANN_EVENT) != DONE)
+ if (GetBossState(DATA_TRIBUNAL_OF_AGES) != DONE)
return false;
break;
default:
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 4aea36e3fe7..280a94aa21f 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -1706,7 +1706,7 @@ public:
break;
}
creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->AI()->Talk(SAY_1);
+ creature->AI()->Talk(SAY_1, player);
ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;