diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 9 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 1 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 8 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 3 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/BattlegroundQueue.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 62 | ||||
-rwxr-xr-x | src/server/game/Handlers/BattleGroundHandler.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Handlers/CalendarHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 1 | ||||
-rwxr-xr-x | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_druid.cpp | 765 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 8 |
13 files changed, 471 insertions, 394 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index dbc6f6bae1a..db79925cc7f 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1268,7 +1268,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly ? true : false); + CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly ? false : true); break; } case SMART_ACTION_SET_RUN: @@ -1965,6 +1965,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } + case SMART_ACTION_SET_HEALTH_REGEN: + { + if (!me || me->GetTypeId() != TYPEID_UNIT) + break; + me->setRegeneratingHealth(e.action.setHealthRegen.regenHealth ? true : false); + break; + } default: sLog->outError(LOG_FILTER_SQL, "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index b391df283ab..f14c8df1fb9 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -905,6 +905,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_GO_SET_LOOT_STATE: case SMART_ACTION_SEND_TARGET_TO_TARGET: case SMART_ACTION_SET_HOME_POS: + case SMART_ACTION_SET_HEALTH_REGEN: break; default: sLog->outError(LOG_FILTER_SQL, "SmartAIMgr: Not handled action_type(%u), event_type(%u), Entry %d SourceType %u Event %u, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 91e7cc3e5a4..f9bd194411c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -486,8 +486,9 @@ enum SMART_ACTION SMART_ACTION_GO_SET_LOOT_STATE = 99, // state SMART_ACTION_SEND_TARGET_TO_TARGET = 100, // id SMART_ACTION_SET_HOME_POS = 101, // none + SMART_ACTION_SET_HEALTH_REGEN = 102, // 0/1 - SMART_ACTION_END = 102 + SMART_ACTION_END = 103 }; struct SmartAction @@ -913,6 +914,11 @@ struct SmartAction uint32 angle; } setRangedMovement; + struct + { + uint32 regenHealth; + } setHealthRegen; + //! Note for any new future actions //! All parameters must have type uint32 diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index e2b5a7d81bc..5bb9b4a0a11 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -715,8 +715,7 @@ void AchievementMgr<Player>::LoadFromDB(PreparedQueryResult achievementResult, P if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) if (uint32 titleId = reward->titleId[Player::TeamForRace(GetOwner()->getRace()) == ALLIANCE ? 0 : 1]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) - if (!GetOwner()->HasTitle(titleEntry)) - GetOwner()->SetTitle(titleEntry); + GetOwner()->SetTitle(titleEntry); } while (achievementResult->NextRow()); diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 7e7502b0538..902dac04e32 100755 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -309,7 +309,7 @@ void BattlegroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount) { //we must check premade and normal team's queue - because when players from premade are joining bg, //they leave groupinfo so we can't use its players size to find out index - for (uint32 j = index; j < BG_QUEUE_GROUP_TYPES_COUNT; j += BG_QUEUE_NORMAL_ALLIANCE) + for (uint32 j = index; j < BG_QUEUE_GROUP_TYPES_COUNT; j += BG_TEAMS_COUNT) { for (group_itr_tmp = m_QueuedGroups[bracket_id_tmp][j].begin(); group_itr_tmp != m_QueuedGroups[bracket_id_tmp][j].end(); ++group_itr_tmp) { diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 43a26ca947b..db3c423e6b6 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -663,6 +663,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature bool hasInvolvedQuest(uint32 quest_id) const; bool isRegeneratingHealth() { return m_regenHealth; } + void setRegeneratingHealth(bool regenHealth) { m_regenHealth = regenHealth; } virtual uint8 GetPetAutoSpellSize() const { return MAX_SPELL_CHARM; } virtual uint32 GetPetAutoSpellOnPos(uint8 pos) const { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 84299d87eb7..2cd395a1877 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6220,30 +6220,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere basepoints0 = CalculatePctN(int32(damage), triggerAmount); break; } - // King of the Jungle - else if (dummySpell->SpellIconID == 2850) - { - // Effect 0 - mod damage while having Enrage - if (effIndex == 0) - { - if (!(procSpell->SpellFamilyFlags[0] & 0x00080000) || procSpell->SpellIconID != 961) - return false; - triggered_spell_id = 51185; - basepoints0 = triggerAmount; - target = this; - break; - } - // Effect 1 - Tiger's Fury restore energy - else if (effIndex == 1) - { - if (!(procSpell->SpellFamilyFlags[2] & 0x00000800) || procSpell->SpellIconID != 1181) - return false; - triggered_spell_id = 51178; - basepoints0 = triggerAmount; - target = this; - break; - } - } break; } case SPELLFAMILY_ROGUE: @@ -6361,17 +6337,27 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Light's Beacon - Beacon of Light if (dummySpell->Id == 53651) { - // Get target of beacon of light - if (Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster()) + if (this->GetTypeId() != TYPEID_PLAYER) + return false; + // Check Party/Raid Group + if (Group *group = this->ToPlayer()->GetGroup()) { - // do not proc when target of beacon of light is healed - if (beaconTarget == this) - return false; - // check if it was heal by paladin which casted this beacon of light - if (beaconTarget->GetAura(53563, victim->GetGUID())) + for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { - if (beaconTarget->IsWithinLOSInMap(victim)) + Player* Member = itr->getSource(); + + // check if it was heal by paladin which casted this beacon of light + if (Aura const * aura = Member->GetAura(53563, victim->GetGUID())) { + Unit* beaconTarget = Member; + + // do not proc when target of beacon of light is healed + if (beaconTarget == this) + return false; + + basepoints0 = int32(damage); + triggered_spell_id = 53652; + victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, NULL, NULL, true, 0, triggeredByAura); int32 percent = 0; switch (procSpell->Id) { @@ -6392,7 +6378,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere } } } - return false; + else + return false; } // Judgements of the Wise if (dummySpell->SpellIconID == 3017) @@ -13463,10 +13450,17 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u continue; ProcTriggeredData triggerData(itr->second->GetBase()); // Defensive procs are active on absorbs (so absorption effects are not a hindrance) - bool active = (damage > 0) || (procExtra & (PROC_EX_ABSORB|PROC_EX_BLOCK) && isVictim); + bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim); if (isVictim) procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY; + SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo(); + + // only auras that has triggered spell should proc from fully absorbed damage + if (procExtra & PROC_EX_ABSORB && isVictim) + if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell) + active = true; + if (!IsTriggeredAtSpellProcEvent(target, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, active, triggerData.spellProcEvent)) continue; diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 9a67c37d709..a834c7bedc9 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -535,7 +535,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId); break; case 0: // leave queue - if (bg->isArena() && bg->GetStatus() != STATUS_WAIT_QUEUE) + if (bg->isArena() && bg->GetStatus() > STATUS_WAIT_QUEUE) return; // if player leaves rated arena match before match start, it is counted as he played but he lost diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index b207547147c..d1209eead22 100755 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -431,7 +431,7 @@ void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) return; } - if (_player->GetTeam() != team) + if (_player->GetTeam() != team && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR)) { SendCalendarCommandResult(CALENDAR_ERROR_NOT_ALLIED); return; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 703b158d6a3..b424214510a 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -656,6 +656,7 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_REALM_ZONE] = ConfigMgr::GetIntDefault("RealmZone", REALM_ZONE_DEVELOPMENT); m_bool_configs[CONFIG_ALLOW_TWO_SIDE_ACCOUNTS] = ConfigMgr::GetBoolDefault("AllowTwoSide.Accounts", true); + m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR]= ConfigMgr::GetBoolDefault("AllowTwoSide.Interaction.Calendar", false); m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT] = ConfigMgr::GetBoolDefault("AllowTwoSide.Interaction.Chat", false); m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL] = ConfigMgr::GetBoolDefault("AllowTwoSide.Interaction.Channel", false); m_bool_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP] = ConfigMgr::GetBoolDefault("AllowTwoSide.Interaction.Group", false); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 5a8c7cc879c..708bdeef2c6 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -100,6 +100,7 @@ enum WorldBoolConfigs CONFIG_GRID_UNLOAD, CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, CONFIG_ALLOW_TWO_SIDE_ACCOUNTS, + CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR, CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT, CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL, CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index cdfb62bd55c..6dfdf74b86f 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -34,6 +34,36 @@ enum DruidSpells DRUID_SURVIVAL_INSTINCTS = 50322, DRUID_SAVAGE_ROAR = 62071, SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950, + SPELL_KING_OF_THE_JUNGLE = 48492, + SPELL_TIGER_S_FURY_ENERGIZE = 51178, + SPELL_ENRAGE_MOD_DAMAGE = 51185, +}; + +class spell_dru_enrage : public SpellScriptLoader +{ + public: + spell_dru_enrage() : SpellScriptLoader("spell_dru_enrage") { } + + class spell_dru_enrage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_enrage_SpellScript); + + void OnHit() + { + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_KING_OF_THE_JUNGLE, EFFECT_0)) + GetHitUnit()->CastCustomSpell(SPELL_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_dru_enrage_SpellScript::OnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_enrage_SpellScript(); + } }; // 54846 Glyph of Starfire @@ -88,6 +118,239 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader } }; +class spell_dru_insect_swarm : public SpellScriptLoader +{ + public: + spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } + + class spell_dru_insect_swarm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_insect_swarm_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + { + if (Unit* caster = GetCaster()) + if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) + amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_insect_swarm_AuraScript(); + } +}; + +enum EclipseSpells +{ + SPELL_DRUID_WRATH = 5176, + SPELL_DRUID_STARFIRE = 2912, + SPELL_DRUID_STARSURGE = 78674, + SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE = 89265, + SPELL_DRUID_STARSURGE_ENERGIZE = 86605, + SPELL_DRUID_LUNAR_ECLIPSE_MARKER = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar) + SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) + SPELL_DRUID_SOLAR_ECLIPSE = 48517, + SPELL_DRUID_LUNAR_ECLIPSE = 48518, + TALENT_TREE_BALANCE = 752, +}; + +// Wrath, Starfire, and Starsurge +class spell_dru_eclipse_energize : public SpellScriptLoader +{ +public: + spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { } + + class spell_dru_eclipse_energize_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); + + int32 energizeAmount; + + bool Load() + { + if (GetCaster()->GetTypeId() != TYPEID_PLAYER) + return false; + + if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) + return false; + + energizeAmount = 0; + + return true; + } + + void HandleEnergize(SpellEffIndex effIndex) + { + Player* caster = GetCaster()->ToPlayer(); + + // No boomy, no deal. + if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_BALANCE) + return; + + switch(GetSpellInfo()->Id) + { + case SPELL_DRUID_WRATH: + { + energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 + // If we are set to fill the lunar side or we've just logged in with 0 power.. + if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + caster->CastSpell(caster,SPELL_DRUID_LUNAR_ECLIPSE_MARKER,true); + } + // The energizing effect brought us out of the solar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); + break; + } + case SPELL_DRUID_STARFIRE: + { + energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 + // If we are set to fill the solar side or we've just logged in with 0 power.. + if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); + } + // The energizing effect brought us out of the lunar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); + break; + } + case SPELL_DRUID_STARSURGE: + { + // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) + if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + || caster->GetPower(POWER_ECLIPSE) == 0) + { + energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 + caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + + // If the energize was due to 0 power, cast the eclipse marker aura + if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) + caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); + } + else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + { + energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 + caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + } + // The energizing effect brought us out of the lunar eclipse, remove the aura + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); + // The energizing effect brought us out of the solar eclipse, remove the aura + else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); + break; + } + } + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_eclipse_energize_SpellScript; + } +}; + +class spell_dru_lifebloom : public SpellScriptLoader +{ + public: + spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } + + class spell_dru_lifebloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_lifebloom_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_FINAL_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_ENERGIZE)) + return false; + return true; + } + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + // final heal + int32 stack = GetStackAmount(); + int32 healAmount = aurEff->GetAmount(); + if (Unit* caster = GetCaster()) + { + healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, stack); + healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, stack); + + GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); + + // restore mana + int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2; + caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); + return; + } + + GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); + } + + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* target = GetUnitOwner()) + { + if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) + { + // final heal + int32 healAmount = aurEff->GetAmount(); + if (Unit* caster = GetCaster()) + { + healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); + healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); + target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); + + // restore mana + int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2; + caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, NULL, GetCasterGUID()); + return; + } + + target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); + } + } + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_lifebloom_AuraScript(); + } +}; + // 69366 - Moonkin Form passive class spell_dru_moonkin_form_passive : public SpellScriptLoader { @@ -132,6 +395,34 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader } }; +class spell_dru_predatory_strikes : public SpellScriptLoader +{ + public: + spell_dru_predatory_strikes() : SpellScriptLoader("spell_dru_predatory_strikes") { } + + class spell_dru_predatory_strikes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_predatory_strikes_AuraScript); + + void UpdateAmount(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* target = GetTarget()->ToPlayer()) + target->UpdateAttackPowerAndDamage(); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_predatory_strikes_AuraScript(); + } +}; + // 33851 - Primal Tenacity class spell_dru_primal_tenacity : public SpellScriptLoader { @@ -219,57 +510,67 @@ class spell_dru_savage_defense : public SpellScriptLoader } }; -class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader +class spell_dru_savage_roar : public SpellScriptLoader { public: - spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } + spell_dru_savage_roar() : SpellScriptLoader("spell_dru_savage_roar") { } - class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript + class spell_dru_savage_roar_SpellScript : public SpellScript { - PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); + PrepareSpellScript(spell_dru_savage_roar_SpellScript); - bool Load() + SpellCastResult CheckCast() { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; + Unit* caster = GetCaster(); + if (caster->GetShapeshiftForm() != FORM_CAT) + return SPELL_FAILED_ONLY_SHAPESHIFT; + + return SPELL_CAST_OK; } - void FilterTargets(std::list<WorldObject*>& targets) + void Register() { - if (!GetCaster()->ToPlayer()->GetGroup()) - { - targets.clear(); - targets.push_back(GetCaster()); - } - else - { - targets.remove(GetExplTargetUnit()); - std::list<Unit*> tempTargets; - for (std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith((*itr)->ToUnit())) - tempTargets.push_back((*itr)->ToUnit()); + OnCheckCast += SpellCheckCastFn(spell_dru_savage_roar_SpellScript::CheckCast); + } + }; - if (tempTargets.empty()) - { - targets.clear(); - FinishCast(SPELL_FAILED_DONT_REPORT); - return; - } + class spell_dru_savage_roar_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_savage_roar_AuraScript); - Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets); - targets.clear(); - targets.push_back(target); - } + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(DRUID_SAVAGE_ROAR)) + return false; + return true; + } + + void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID()); + } + + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(DRUID_SAVAGE_ROAR); } void Register() { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + AfterEffectApply += AuraEffectApplyFn(spell_dru_savage_roar_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_savage_roar_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; SpellScript* GetSpellScript() const { - return new spell_dru_t10_restoration_4p_bonus_SpellScript(); + return new spell_dru_savage_roar_SpellScript(); + } + + AuraScript* GetAuraScript() const + { + return new spell_dru_savage_roar_AuraScript(); } }; @@ -299,40 +600,6 @@ class spell_dru_starfall_aoe : public SpellScriptLoader } }; -// 40121 - Swift Flight Form (Passive) -class spell_dru_swift_flight_passive : public SpellScriptLoader -{ - public: - spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } - - class spell_dru_swift_flight_passive_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - if (Player* caster = GetCaster()->ToPlayer()) - if (caster->GetSkillValue(SKILL_RIDING) >= 375) - amount = 310; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_swift_flight_passive_AuraScript(); - } -}; - class spell_dru_starfall_dummy : public SpellScriptLoader { public: @@ -378,179 +645,6 @@ class spell_dru_starfall_dummy : public SpellScriptLoader } }; -class spell_dru_lifebloom : public SpellScriptLoader -{ - public: - spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } - - class spell_dru_lifebloom_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_lifebloom_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_FINAL_HEAL)) - return false; - if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_ENERGIZE)) - return false; - return true; - } - - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - // final heal - int32 stack = GetStackAmount(); - int32 healAmount = aurEff->GetAmount(); - if (Unit* caster = GetCaster()) - { - healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, stack); - healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, stack); - - GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); - - // restore mana - int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2; - caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); - return; - } - - GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* target = GetUnitOwner()) - { - if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) - { - // final heal - int32 healAmount = aurEff->GetAmount(); - if (Unit* caster = GetCaster()) - { - healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); - healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); - target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); - - // restore mana - int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2; - caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, NULL, GetCasterGUID()); - return; - } - - target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); - } - } - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_lifebloom_AuraScript(); - } -}; - -class spell_dru_predatory_strikes : public SpellScriptLoader -{ - public: - spell_dru_predatory_strikes() : SpellScriptLoader("spell_dru_predatory_strikes") { } - - class spell_dru_predatory_strikes_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_predatory_strikes_AuraScript); - - void UpdateAmount(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* target = GetTarget()->ToPlayer()) - target->UpdateAttackPowerAndDamage(); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_predatory_strikes_AuraScript(); - } -}; - -class spell_dru_savage_roar : public SpellScriptLoader -{ - public: - spell_dru_savage_roar() : SpellScriptLoader("spell_dru_savage_roar") { } - - class spell_dru_savage_roar_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_savage_roar_SpellScript); - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->GetShapeshiftForm() != FORM_CAT) - return SPELL_FAILED_ONLY_SHAPESHIFT; - - return SPELL_CAST_OK; - } - - void Register() - { - OnCheckCast += SpellCheckCastFn(spell_dru_savage_roar_SpellScript::CheckCast); - } - }; - - class spell_dru_savage_roar_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_savage_roar_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(DRUID_SAVAGE_ROAR)) - return false; - return true; - } - - void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->CastSpell(target, DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID()); - } - - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(DRUID_SAVAGE_ROAR); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_savage_roar_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_savage_roar_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_savage_roar_SpellScript(); - } - - AuraScript* GetAuraScript() const - { - return new spell_dru_savage_roar_AuraScript(); - } -}; - class spell_dru_survival_instincts : public SpellScriptLoader { public: @@ -616,172 +710,137 @@ class spell_dru_survival_instincts : public SpellScriptLoader } }; -class spell_dru_insect_swarm : public SpellScriptLoader +// 40121 - Swift Flight Form (Passive) +class spell_dru_swift_flight_passive : public SpellScriptLoader { public: - spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } + spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } - class spell_dru_insect_swarm_AuraScript : public AuraScript + class spell_dru_swift_flight_passive_AuraScript : public AuraScript { - PrepareAuraScript(spell_dru_insect_swarm_AuraScript); + PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); - void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + bool Load() { - if (Unit* caster = GetCaster()) - if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) - amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + { + if (Player* caster = GetCaster()->ToPlayer()) + if (caster->GetSkillValue(SKILL_RIDING) >= 375) + amount = 310; } void Register() { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); } }; AuraScript* GetAuraScript() const { - return new spell_dru_insect_swarm_AuraScript(); + return new spell_dru_swift_flight_passive_AuraScript(); } }; -enum EclipseSpells +class spell_dru_tiger_s_fury : public SpellScriptLoader { - SPELL_DRUID_WRATH = 5176, - SPELL_DRUID_STARFIRE = 2912, - SPELL_DRUID_STARSURGE = 78674, - SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE = 89265, - SPELL_DRUID_STARSURGE_ENERGIZE = 86605, - SPELL_DRUID_LUNAR_ECLIPSE_MARKER = 67484, // Will make the yellow arrow on eclipse bar point to the blue side (lunar) - SPELL_DRUID_SOLAR_ECLIPSE_MARKER = 67483, // Will make the yellow arrow on eclipse bar point to the yellow side (solar) - SPELL_DRUID_SOLAR_ECLIPSE = 48517, - SPELL_DRUID_LUNAR_ECLIPSE = 48518, - TALENT_TREE_BALANCE = 752, -}; - -// Wrath, Starfire, and Starsurge -class spell_dru_eclipse_energize : public SpellScriptLoader -{ -public: - spell_dru_eclipse_energize() : SpellScriptLoader("spell_dru_eclipse_energize") { } - - class spell_dru_eclipse_energize_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_eclipse_energize_SpellScript); - - int32 energizeAmount; + public: + spell_dru_tiger_s_fury() : SpellScriptLoader("spell_dru_tiger_s_fury") { } - bool Load() + class spell_dru_tiger_s_fury_SpellScript : public SpellScript { - if (GetCaster()->GetTypeId() != TYPEID_PLAYER) - return false; + PrepareSpellScript(spell_dru_tiger_s_fury_SpellScript); - if (GetCaster()->ToPlayer()->getClass() != CLASS_DRUID) - return false; + void OnHit() + { + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_KING_OF_THE_JUNGLE, EFFECT_1)) + GetHitUnit()->CastCustomSpell(SPELL_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); + } - energizeAmount = 0; + void Register() + { + AfterHit += SpellHitFn(spell_dru_tiger_s_fury_SpellScript::OnHit); + } + }; - return true; + SpellScript* GetSpellScript() const + { + return new spell_dru_tiger_s_fury_SpellScript(); } +}; - void HandleEnergize(SpellEffIndex effIndex) +class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } + + class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript { - Player* caster = GetCaster()->ToPlayer(); + PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); - // No boomy, no deal. - if (caster->GetPrimaryTalentTree(caster->GetActiveSpec()) != TALENT_TREE_BALANCE) - return; + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - switch(GetSpellInfo()->Id) + void FilterTargets(std::list<WorldObject*>& targets) { - case SPELL_DRUID_WRATH: - { - energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -13 - // If we are set to fill the lunar side or we've just logged in with 0 power.. - if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) - { - caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); - // If the energize was due to 0 power, cast the eclipse marker aura - if (!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - caster->CastSpell(caster,SPELL_DRUID_LUNAR_ECLIPSE_MARKER,true); - } - // The energizing effect brought us out of the solar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) - caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); - break; - } - case SPELL_DRUID_STARFIRE: + if (!GetCaster()->ToPlayer()->GetGroup()) { - energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 20 - // If we are set to fill the solar side or we've just logged in with 0 power.. - if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) - { - caster->CastCustomSpell(caster,SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE,&energizeAmount,0,0,true); - // If the energize was due to 0 power, cast the eclipse marker aura - if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); - } - // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) - caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); - break; + targets.clear(); + targets.push_back(GetCaster()); } - case SPELL_DRUID_STARSURGE: + else { - // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) - if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) - { - energizeAmount = GetSpellInfo()->Effects[effIndex].BasePoints; // 15 - caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + targets.remove(GetExplTargetUnit()); + std::list<Unit*> tempTargets; + for (std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith((*itr)->ToUnit())) + tempTargets.push_back((*itr)->ToUnit()); - // If the energize was due to 0 power, cast the eclipse marker aura - if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - caster->CastSpell(caster,SPELL_DRUID_SOLAR_ECLIPSE_MARKER,true); - } - else if (!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) + if (tempTargets.empty()) { - energizeAmount = -GetSpellInfo()->Effects[effIndex].BasePoints; // -15 - caster->CastCustomSpell(caster,SPELL_DRUID_STARSURGE_ENERGIZE,&energizeAmount,0,0,true); + targets.clear(); + FinishCast(SPELL_FAILED_DONT_REPORT); + return; } - // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) - caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); - // The energizing effect brought us out of the solar eclipse, remove the aura - else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) - caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); - break; + + Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets); + targets.clear(); + targets.push_back(target); } } - } - void Register() + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const { - OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); + return new spell_dru_t10_restoration_4p_bonus_SpellScript(); } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_eclipse_energize_SpellScript; - } }; void AddSC_druid_spell_scripts() { + new spell_dru_enrage(); new spell_dru_glyph_of_starfire(); + new spell_dru_insect_swarm(); + new spell_dru_lifebloom(); new spell_dru_moonkin_form_passive(); + new spell_dru_predatory_strikes(); new spell_dru_primal_tenacity(); new spell_dru_savage_defense(); - new spell_dru_t10_restoration_4p_bonus(); + new spell_dru_savage_roar(); new spell_dru_starfall_aoe(); - new spell_dru_swift_flight_passive(); new spell_dru_starfall_dummy(); - new spell_dru_lifebloom(); - new spell_dru_predatory_strikes(); - new spell_dru_savage_roar(); new spell_dru_survival_instincts(); - new spell_dru_insect_swarm(); + new spell_dru_swift_flight_passive(); + new spell_dru_tiger_s_fury(); + new spell_dru_t10_restoration_4p_bonus(); new spell_dru_eclipse_energize(); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index ec6d60863dd..6e9d40b6fe8 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1201,6 +1201,14 @@ Warden.BanDuration = 86400 AllowTwoSide.Accounts = 1 # +# AllowTwoSide.Interaction.Calendar +# Description: Allow calendar invites between factions. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +AllowTwoSide.Interaction.Calendar = 0 + +# # AllowTwoSide.Interaction.Chat # Description: Allow say chat between factions. # Default: 0 - (Disabled) |