aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/scripts/Commands/cs_arena.cpp88
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp165
3 files changed, 187 insertions, 68 deletions
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 4666971923d..5cbad8c6ebc 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -719,6 +719,8 @@ class ObjectMgr
* If the player is online, the name is retrieved immediately otherwise
* a database query is done.
*
+ * @remark Use sWorld->GetCharacterNameData because it doesn't require a database query when player is offline
+ *
* @param guid player full guid
* @param name returned name
*
diff --git a/src/server/scripts/Commands/cs_arena.cpp b/src/server/scripts/Commands/cs_arena.cpp
index b6a1b27b830..4dbdab25747 100644
--- a/src/server/scripts/Commands/cs_arena.cpp
+++ b/src/server/scripts/Commands/cs_arena.cpp
@@ -70,9 +70,11 @@ public:
char* name = handler->extractQuotedArg(tailStr);
if (!name)
return false;
+
char* typeStr = strtok(NULL, "");
if (!typeStr)
return false;
+
int8 type = atoi(typeStr);
if (sArenaTeamMgr->GetArenaTeamByName(name))
{
@@ -90,18 +92,18 @@ public:
return false;
}
- ArenaTeam* Arena = new ArenaTeam();
+ ArenaTeam* arena = new ArenaTeam();
- if (!Arena->Create(target->GetGUID(), type, name, 4293102085, 101, 4293253939, 4, 4284049911))
+ if (!arena->Create(target->GetGUID(), type, name, 4293102085, 101, 4293253939, 4, 4284049911))
{
- delete Arena;
+ delete arena;
handler->SendSysMessage(LANG_BAD_VALUE);
handler->SetSentErrorMessage(true);
return false;
}
- sArenaTeamMgr->AddArenaTeam(Arena);
- handler->PSendSysMessage(LANG_ARENA_CREATE, Arena->GetName().c_str(), Arena->GetId(), Arena->GetType(), Arena->GetCaptain());
+ sArenaTeamMgr->AddArenaTeam(arena);
+ handler->PSendSysMessage(LANG_ARENA_CREATE, arena->GetName().c_str(), arena->GetId(), arena->GetType(), arena->GetCaptain());
}
else
{
@@ -109,6 +111,7 @@ public:
handler->SetSentErrorMessage(true);
return false;
}
+
return true;
}
@@ -121,29 +124,32 @@ public:
if (!teamId)
return false;
- ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamById(teamId);
+ ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamById(teamId);
- if (!Arena)
+ if (!arena)
{
handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_FOUND, teamId);
handler->SetSentErrorMessage(true);
return false;
}
- if (Arena->IsFighting())
+ if (arena->IsFighting())
{
handler->SendSysMessage(LANG_ARENA_ERROR_COMBAT);
handler->SetSentErrorMessage(true);
return false;
}
- std::string name = Arena->GetName();
- Arena->Disband();
+
+ std::string name = arena->GetName();
+ arena->Disband();
if (handler->GetSession())
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "GameMaster: %s [GUID: %u] disbanded arena team type: %u [Id: %u].",
- handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), Arena->GetType(), teamId);
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), arena->GetType(), teamId);
else
- TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: disbanded arena team type: %u [Id: %u].", Arena->GetType(), teamId);
- delete(Arena);
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: disbanded arena team type: %u [Id: %u].", arena->GetType(), teamId);
+
+ delete(arena);
+
handler->PSendSysMessage(LANG_ARENA_DISBAND, name.c_str(), teamId);
return true;
}
@@ -171,8 +177,8 @@ public:
return false;
}
- ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamByName(oldArenaStr);
- if (!Arena)
+ ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamByName(oldArenaStr);
+ if (!arena)
{
handler->PSendSysMessage(LANG_AREAN_ERROR_NAME_NOT_FOUND, oldArenaStr);
handler->SetSentErrorMessage(true);
@@ -186,25 +192,27 @@ public:
return false;
}
- if (Arena->IsFighting())
+ if (arena->IsFighting())
{
handler->SendSysMessage(LANG_ARENA_ERROR_COMBAT);
handler->SetSentErrorMessage(true);
return false;
}
- if (!Arena->SetName(newArenaStr))
+ if (!arena->SetName(newArenaStr))
{
handler->SendSysMessage(LANG_BAD_VALUE);
handler->SetSentErrorMessage(true);
return false;
}
- handler->PSendSysMessage(LANG_ARENA_RENAME, Arena->GetId(), oldArenaStr, newArenaStr);
+
+ handler->PSendSysMessage(LANG_ARENA_RENAME, arena->GetId(), oldArenaStr, newArenaStr);
if (handler->GetSession())
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "GameMaster: %s [GUID: %u] rename arena team \"%s\"[Id: %u] to \"%s\"",
- handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), oldArenaStr, Arena->GetId(), newArenaStr);
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), oldArenaStr, arena->GetId(), newArenaStr);
else
- TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: rename arena team \"%s\"[Id: %u] to \"%s\"", oldArenaStr, Arena->GetId(), newArenaStr);
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: rename arena team \"%s\"[Id: %u] to \"%s\"", oldArenaStr, arena->GetId(), newArenaStr);
+
return true;
}
@@ -265,17 +273,23 @@ public:
return false;
}
- std::string oldCaptainName;
- sObjectMgr->GetPlayerNameByGUID(arena->GetCaptain(), oldCaptainName);
arena->SetCaptain(targetGuid);
- handler->PSendSysMessage(LANG_ARENA_CAPTAIN, arena->GetName().c_str(), arena->GetId(), oldCaptainName.c_str(), target->GetName().c_str());
+ CharacterNameData const* oldCaptainNameData = sWorld->GetCharacterNameData(GUID_LOPART(arena->GetCaptain()));
+ if (!oldCaptainNameData)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_ARENA_CAPTAIN, arena->GetName().c_str(), arena->GetId(), oldCaptainNameData->m_name.c_str(), target->GetName().c_str());
if (handler->GetSession())
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "GameMaster: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team \"%s\"[Id: %u]",
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), target->GetName().c_str(), target->GetGUIDLow(), arena->GetName().c_str(), arena->GetId());
else
TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: promoted player: %s [GUID: %u] to leader of arena team \"%s\"[Id: %u]",
target->GetName().c_str(), target->GetGUIDLow(), arena->GetName().c_str(), arena->GetId());
+
return true;
}
@@ -288,20 +302,19 @@ public:
if (!teamId)
return false;
- ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamById(teamId);
+ ArenaTeam* arena = sArenaTeamMgr->GetArenaTeamById(teamId);
- if (!Arena)
+ if (!arena)
{
handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_FOUND, teamId);
handler->SetSentErrorMessage(true);
return false;
}
- handler->PSendSysMessage(LANG_ARENA_INFO_HEADER, Arena->GetName().c_str(), Arena->GetId(), Arena->GetRating(), Arena->GetType(), Arena->GetType());
- for (ArenaTeam::MemberList::iterator itr = Arena->m_membersBegin(); itr != Arena->m_membersEnd(); ++itr)
- {
- handler->PSendSysMessage(LANG_ARENA_INFO_MEMBERS, itr->Name.c_str(), GUID_LOPART(itr->Guid), itr->PersonalRating, (Arena->GetCaptain() == itr->Guid ? "- Captain" : ""));
- }
+ handler->PSendSysMessage(LANG_ARENA_INFO_HEADER, arena->GetName().c_str(), arena->GetId(), arena->GetRating(), arena->GetType(), arena->GetType());
+ for (ArenaTeam::MemberList::iterator itr = arena->m_membersBegin(); itr != arena->m_membersEnd(); ++itr)
+ handler->PSendSysMessage(LANG_ARENA_INFO_MEMBERS, itr->Name.c_str(), GUID_LOPART(itr->Guid), itr->PersonalRating, (arena->GetCaptain() == itr->Guid ? "- Captain" : ""));
+
return true;
}
@@ -322,17 +335,16 @@ public:
ArenaTeamMgr::ArenaTeamContainer::const_iterator i = sArenaTeamMgr->GetArenaTeamMapBegin();
for (; i != sArenaTeamMgr->GetArenaTeamMapEnd(); ++i)
{
- ArenaTeam* Arena = i->second;
+ ArenaTeam* arena = i->second;
- if (Utf8FitTo(Arena->GetName(), wnamepart))
+ if (Utf8FitTo(arena->GetName(), wnamepart))
{
if (handler->GetSession())
- handler->PSendSysMessage(LANG_ARENA_LOOKUP, Arena->GetName().c_str(), Arena->GetId(), Arena->GetType(), Arena->GetType());
-
- if (!found)
- found = true;
-
- continue;
+ {
+ handler->PSendSysMessage(LANG_ARENA_LOOKUP, arena->GetName().c_str(), arena->GetId(), arena->GetType(), arena->GetType());
+ found = true;
+ continue;
+ }
}
}
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
index f259fbf2b78..ad65fcc83fd 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
@@ -17,6 +17,8 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellAuraEffects.h"
+#include "SpellScript.h"
#include "vault_of_archavon.h"
enum Events
@@ -24,14 +26,12 @@ enum Events
// Koralon
EVENT_BURNING_BREATH = 1,
EVENT_BURNING_FURY = 2,
- EVENT_FLAME_CINDER_A = 3,
- EVENT_METEOR_FISTS_A = 4,
- EVENT_METEOR_FISTS_B = 5,
+ EVENT_FLAME_CINDER = 3,
+ EVENT_METEOR_FISTS = 4,
// Flame Warder
- EVENT_FW_LAVA_BIRST = 6,
- EVENT_FW_METEOR_FISTS_A = 7,
- EVENT_FW_METEOR_FISTS_B = 8,
+ EVENT_FW_LAVA_BIRST = 5,
+ EVENT_FW_METEOR_FISTS = 6
};
enum Spells
@@ -41,13 +41,13 @@ enum Spells
SPELL_BURNING_FURY = 66721,
SPELL_FLAME_CINDER_A = 66684,
SPELL_FLAME_CINDER_B = 66681, // don't know the real relation to SPELL_FLAME_CINDER_A atm.
- SPELL_METEOR_FISTS_A = 66725,
- SPELL_METEOR_FISTS_B = 67333,
+ SPELL_METEOR_FISTS = 66725,
+ SPELL_METEOR_FISTS_DAMAGE = 66765,
// Spells Flame Warder
SPELL_FW_LAVA_BIRST = 66813,
- SPELL_FW_METEOR_FISTS_A = 66808,
- SPELL_FW_METEOR_FISTS_B = 67331,
+ SPELL_FW_METEOR_FISTS = 66808,
+ SPELL_FW_METEOR_FISTS_DAMAGE = 66809
};
class boss_koralon : public CreatureScript
@@ -67,8 +67,8 @@ class boss_koralon : public CreatureScript
events.ScheduleEvent(EVENT_BURNING_FURY, 20000); /// @todo check timer
events.ScheduleEvent(EVENT_BURNING_BREATH, 15000); // 1st after 15sec, then every 45sec
- events.ScheduleEvent(EVENT_METEOR_FISTS_A, 75000); // 1st after 75sec, then every 45sec
- events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); /// @todo check timer
+ events.ScheduleEvent(EVENT_METEOR_FISTS, 75000); // 1st after 75sec, then every 45sec
+ events.ScheduleEvent(EVENT_FLAME_CINDER, 30000); /// @todo check timer
_EnterCombat();
}
@@ -95,17 +95,13 @@ class boss_koralon : public CreatureScript
DoCast(me, SPELL_BURNING_BREATH);
events.ScheduleEvent(EVENT_BURNING_BREATH, 45000);
break;
- case EVENT_METEOR_FISTS_A:
- DoCast(me, SPELL_METEOR_FISTS_A);
- events.ScheduleEvent(EVENT_METEOR_FISTS_B, 1500);
+ case EVENT_METEOR_FISTS:
+ DoCast(me, SPELL_METEOR_FISTS);
+ events.ScheduleEvent(EVENT_METEOR_FISTS, 45000);
break;
- case EVENT_METEOR_FISTS_B:
- DoCast(me, SPELL_METEOR_FISTS_B);
- events.ScheduleEvent(EVENT_METEOR_FISTS_A, 45000);
- break;
- case EVENT_FLAME_CINDER_A:
+ case EVENT_FLAME_CINDER:
DoCast(me, SPELL_FLAME_CINDER_A);
- events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000);
+ events.ScheduleEvent(EVENT_FLAME_CINDER, 30000);
break;
default:
break;
@@ -123,7 +119,7 @@ class boss_koralon : public CreatureScript
};
/*######
-## Mob Flame Warder
+## Npc Flame Warder
######*/
class npc_flame_warder : public CreatureScript
{
@@ -146,7 +142,7 @@ class npc_flame_warder : public CreatureScript
DoZoneInCombat();
events.ScheduleEvent(EVENT_FW_LAVA_BIRST, 5000);
- events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 10000);
+ events.ScheduleEvent(EVENT_FW_METEOR_FISTS, 10000);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -164,13 +160,9 @@ class npc_flame_warder : public CreatureScript
DoCastVictim(SPELL_FW_LAVA_BIRST);
events.ScheduleEvent(EVENT_FW_LAVA_BIRST, 15000);
break;
- case EVENT_FW_METEOR_FISTS_A:
- DoCast(me, SPELL_FW_METEOR_FISTS_A);
- events.ScheduleEvent(EVENT_FW_METEOR_FISTS_B, 1500);
- break;
- case EVENT_FW_METEOR_FISTS_B:
- DoCast(me, SPELL_FW_METEOR_FISTS_B);
- events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 20000);
+ case EVENT_FW_METEOR_FISTS:
+ DoCast(me, SPELL_FW_METEOR_FISTS);
+ events.ScheduleEvent(EVENT_FW_METEOR_FISTS, 20000);
break;
default:
break;
@@ -190,8 +182,121 @@ class npc_flame_warder : public CreatureScript
}
};
+class spell_koralon_meteor_fists : public SpellScriptLoader
+{
+ public:
+ spell_koralon_meteor_fists() : SpellScriptLoader("spell_koralon_meteor_fists") { }
+
+ class spell_koralon_meteor_fists_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_koralon_meteor_fists_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_METEOR_FISTS_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, true, NULL, aurEff);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_koralon_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_koralon_meteor_fists_AuraScript();
+ }
+};
+
+class spell_koralon_meteor_fists_damage : public SpellScriptLoader
+{
+ public:
+ spell_koralon_meteor_fists_damage() : SpellScriptLoader("spell_koralon_meteor_fists_damage") { }
+
+ class spell_koralon_meteor_fists_damage_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_koralon_meteor_fists_damage_SpellScript);
+
+ bool Load() OVERRIDE
+ {
+ _chainTargets = 0;
+ return true;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ _chainTargets = targets.size();
+ }
+
+ void CalculateSplitDamage()
+ {
+ if (_chainTargets)
+ SetHitDamage(GetHitDamage() / (_chainTargets + 1));
+ }
+
+ void Register() OVERRIDE
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_koralon_meteor_fists_damage_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_TARGET_ENEMY);
+ OnHit += SpellHitFn(spell_koralon_meteor_fists_damage_SpellScript::CalculateSplitDamage);
+ }
+
+ private:
+ uint8 _chainTargets;
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_koralon_meteor_fists_damage_SpellScript();
+ }
+};
+
+class spell_flame_warder_meteor_fists : public SpellScriptLoader
+{
+ public:
+ spell_flame_warder_meteor_fists() : SpellScriptLoader("spell_flame_warder_meteor_fists") { }
+
+ class spell_flame_warder_meteor_fists_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_flame_warder_meteor_fists_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_FW_METEOR_FISTS_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, true, NULL, aurEff);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_flame_warder_meteor_fists_AuraScript::TriggerFists, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_flame_warder_meteor_fists_AuraScript();
+ }
+};
+
void AddSC_boss_koralon()
{
new boss_koralon();
new npc_flame_warder();
+ new spell_koralon_meteor_fists();
+ new spell_koralon_meteor_fists_damage();
+ new spell_flame_warder_meteor_fists();
}