diff options
| author | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-07-18 23:16:22 +0200 |
|---|---|---|
| committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-07-18 23:16:22 +0200 |
| commit | ef8a08ee2c52cd00f64f0283a8862bace4e09b21 (patch) | |
| tree | 4662014166332ef13f1eb4e46161833e26ad56a0 | |
| parent | c401c342d1cf33247221ae6c70ad2b6626f39399 (diff) | |
| parent | 922fba3a13cbb8b177c39f3f262ab0a6c6466a9a (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
| -rw-r--r-- | sql/updates/world/2013_07_18_00_world_conditions.sql | 2 | ||||
| -rw-r--r-- | sql/updates/world/2013_07_18_01_world_koralon.sql | 15 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 2 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_arena.cpp | 88 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp | 165 |
5 files changed, 204 insertions, 68 deletions
diff --git a/sql/updates/world/2013_07_18_00_world_conditions.sql b/sql/updates/world/2013_07_18_00_world_conditions.sql new file mode 100644 index 00000000000..90a16d32fb3 --- /dev/null +++ b/sql/updates/world/2013_07_18_00_world_conditions.sql @@ -0,0 +1,2 @@ +-- Fix There's Something About the Squire +UPDATE `conditions` SET `ConditionTarget`=1 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=63126 AND `ConditionTypeOrReference`=9; diff --git a/sql/updates/world/2013_07_18_01_world_koralon.sql b/sql/updates/world/2013_07_18_01_world_koralon.sql new file mode 100644 index 00000000000..a67df5222ca --- /dev/null +++ b/sql/updates/world/2013_07_18_01_world_koralon.sql @@ -0,0 +1,15 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (66725,68161,66808,68160,66765,67333,66809,67331); +INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES +(66725, 'spell_koralon_meteor_fists'), +(68161, 'spell_koralon_meteor_fists'), +(66808, 'spell_flame_warder_meteor_fists'), +(68160, 'spell_flame_warder_meteor_fists'), +(66765, 'spell_koralon_meteor_fists_damage'), +(67333, 'spell_koralon_meteor_fists_damage'), +(66809, 'spell_koralon_meteor_fists_damage'), +(67331, 'spell_koralon_meteor_fists_damage'); + +DELETE FROM `spell_proc_event` WHERE `entry` IN (66808,68160); +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(66808,0,0,0,0,0,0x4,0,0,0,0), +(68160,0,0,0,0,0,0x4,0,0,0,0); 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(); } |
