From a6813149c8b245e22f96c393ab0c9bc10b00d118 Mon Sep 17 00:00:00 2001 From: Faq Date: Sat, 4 Aug 2012 22:20:50 +0300 Subject: Core/Spells: Only auras that has triggered spell should proc from fully absorbed damage. This is Tobmaps version, and looks much better than Chipsi code. #6410 --- src/server/game/Entities/Unit/Unit.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d65d717c236..6b426d04fd7 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14339,10 +14339,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; -- cgit v1.2.3 From 6df92dad615cd5459ba5bd2f659b7a432df4b6ff Mon Sep 17 00:00:00 2001 From: hexa- Date: Mon, 17 Sep 2012 02:13:36 +0200 Subject: Core/Calendar: Add TwoSide Interaction configuration option for Calendar Invites --- src/server/game/Handlers/CalendarHandler.cpp | 2 +- src/server/game/World/World.cpp | 1 + src/server/game/World/World.h | 1 + src/server/worldserver/worldserver.conf.dist | 8 ++++++++ 4 files changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index e83f0f55a44..b721e789268 100755 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -425,7 +425,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 ea74b6d06dd..f310934ac08 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -655,6 +655,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 a6cdd4742f6..8a1b3b4ae31 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -91,6 +91,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/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index ce65517298f..7e200e59046 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1209,6 +1209,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. -- cgit v1.2.3 From 8c4feb4c4e883053cc5e46b2bfcfb235ef3a6cf9 Mon Sep 17 00:00:00 2001 From: Shocker Date: Mon, 17 Sep 2012 03:54:31 +0300 Subject: Core/Battlegrounds: Use correct constant for groups iterator in BattlegroundQueue::RemovePlayer (same value, correct semantics) --- src/server/game/Battlegrounds/BattlegroundQueue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 85d41977d13..f36b4d49a35 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) { -- cgit v1.2.3 From 74aea5e055d1b116c4093be4b32a8bf9a76666c4 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 17 Sep 2012 11:49:25 +0200 Subject: Cosmetic: PLAYER__FIELD_KNOWN_TITLES --> PLAYER_FIELD_KNOWN_TITLES --- src/server/game/Achievements/AchievementMgr.cpp | 3 +-- src/server/game/DataStores/DBCStructure.h | 2 +- .../Entities/Object/Updates/UpdateFieldFlags.cpp | 12 ++++++------ .../game/Entities/Object/Updates/UpdateFields.h | 6 +++--- src/server/game/Entities/Player/Player.cpp | 22 +++++++++++----------- src/server/game/Entities/Player/Player.h | 2 +- 6 files changed, 23 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index dff155926de..93a3378c3c5 100755 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -628,8 +628,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) if (uint32 titleId = reward->titleId[Player::TeamForRace(GetPlayer()->getRace()) == ALLIANCE ? 0 : 1]) if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId)) - if (!GetPlayer()->HasTitle(titleEntry)) - GetPlayer()->SetTitle(titleEntry); + GetPlayer()->SetTitle(titleEntry); } while (achievementResult->NextRow()); } diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index ef949f43f49..e6437889e9b 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -645,7 +645,7 @@ struct CharTitlesEntry // 18 string flag, unused //char* name2[16]; // 19-34, unused // 35 string flag, unused - uint32 bit_index; // 36 used in PLAYER_CHOSEN_TITLE and 1<LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADSOCIALLIST), GetGUIDLow()); - // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES - // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded + // check PLAYER_CHOSEN_TITLE compatibility with PLAYER_FIELD_KNOWN_TITLES + // note: PLAYER_FIELD_KNOWN_TITLES updated at quest status loaded uint32 curTitle = fields[46].GetUInt32(); if (curTitle && !HasTitle(curTitle)) curTitle = 0; @@ -18713,7 +18713,7 @@ void Player::SaveToDB(bool create /*=false*/) ss.str(""); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) - ss << GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES + i) << ' '; + ss << GetUInt32Value(PLAYER_FIELD_KNOWN_TITLES + i) << ' '; stmt->setString(index++, ss.str()); stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, 2)); @@ -18824,7 +18824,7 @@ void Player::SaveToDB(bool create /*=false*/) ss.str(""); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) - ss << GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES + i) << ' '; + ss << GetUInt32Value(PLAYER_FIELD_KNOWN_TITLES + i) << ' '; stmt->setString(index++, ss.str()); stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, 2)); @@ -23619,7 +23619,7 @@ bool Player::HasTitle(uint32 bitIndex) uint32 fieldIndexOffset = bitIndex / 32; uint32 flag = 1 << (bitIndex % 32); - return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag); + return HasFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag); } void Player::SetTitle(CharTitlesEntry const* title, bool lost) @@ -23629,17 +23629,17 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) if (lost) { - if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) + if (!HasFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) return; - RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag); + RemoveFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag); } else { - if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) + if (HasFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) return; - SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag); + SetFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag); } WorldPacket data(SMSG_TITLE_EARNED, 4 + 4); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5637b3b5af0..b0f8eb132b3 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -402,7 +402,7 @@ enum PlayerFlags PLAYER_FLAGS_UNK31 = 0x80000000 }; -// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1< Date: Mon, 17 Sep 2012 12:04:35 +0200 Subject: Revert last change. Leaving UpdateField names "as is" --- src/server/game/DataStores/DBCStructure.h | 2 +- .../Entities/Object/Updates/UpdateFieldFlags.cpp | 12 ++++++------ .../game/Entities/Object/Updates/UpdateFields.h | 6 +++--- src/server/game/Entities/Player/Player.cpp | 22 +++++++++++----------- src/server/game/Entities/Player/Player.h | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index e6437889e9b..ef949f43f49 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -645,7 +645,7 @@ struct CharTitlesEntry // 18 string flag, unused //char* name2[16]; // 19-34, unused // 35 string flag, unused - uint32 bit_index; // 36 used in PLAYER_CHOSEN_TITLE and 1<LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADSOCIALLIST), GetGUIDLow()); - // check PLAYER_CHOSEN_TITLE compatibility with PLAYER_FIELD_KNOWN_TITLES - // note: PLAYER_FIELD_KNOWN_TITLES updated at quest status loaded + // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES + // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded uint32 curTitle = fields[46].GetUInt32(); if (curTitle && !HasTitle(curTitle)) curTitle = 0; @@ -18713,7 +18713,7 @@ void Player::SaveToDB(bool create /*=false*/) ss.str(""); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) - ss << GetUInt32Value(PLAYER_FIELD_KNOWN_TITLES + i) << ' '; + ss << GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES + i) << ' '; stmt->setString(index++, ss.str()); stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, 2)); @@ -18824,7 +18824,7 @@ void Player::SaveToDB(bool create /*=false*/) ss.str(""); for (uint32 i = 0; i < KNOWN_TITLES_SIZE*2; ++i) - ss << GetUInt32Value(PLAYER_FIELD_KNOWN_TITLES + i) << ' '; + ss << GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES + i) << ' '; stmt->setString(index++, ss.str()); stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, 2)); @@ -23619,7 +23619,7 @@ bool Player::HasTitle(uint32 bitIndex) uint32 fieldIndexOffset = bitIndex / 32; uint32 flag = 1 << (bitIndex % 32); - return HasFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag); + return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag); } void Player::SetTitle(CharTitlesEntry const* title, bool lost) @@ -23629,17 +23629,17 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) if (lost) { - if (!HasFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) + if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) return; - RemoveFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag); + RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag); } else { - if (HasFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) + if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag)) return; - SetFlag(PLAYER_FIELD_KNOWN_TITLES + fieldIndexOffset, flag); + SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag); } WorldPacket data(SMSG_TITLE_EARNED, 4 + 4); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b0f8eb132b3..5637b3b5af0 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -402,7 +402,7 @@ enum PlayerFlags PLAYER_FLAGS_UNK31 = 0x80000000 }; -// used for PLAYER_FIELD_KNOWN_TITLES field (uint64), (1< Date: Mon, 17 Sep 2012 12:04:50 +0200 Subject: Core/BG: Fix logical mistake in b8d55cc019f8ce3a936f9d805e6d762c60d28c5d. Making it again possible to leave arena queues when status is STATUS_WAIT_NONE. Closes #7749 --- src/server/game/Handlers/BattleGroundHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 72a6e0e1bec..3bae430ad2c 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -462,7 +462,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data) 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 -- cgit v1.2.3 From 3f6428613242c7cc8a2877b67a199616ab94181a Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 17 Sep 2012 12:08:26 -0400 Subject: Core/Spells: fix beacon of light proc thx (oMadMono) --- src/server/game/Entities/Unit/Unit.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7dc1afa9738..180ed98212e 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6653,24 +6653,33 @@ 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())) { - basepoints0 = damage; - victim->CastCustomSpell(beaconTarget, 53654, &basepoints0, NULL, NULL, true); + 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); return true; } } } - return false; + else + return false; } // Judgements of the Wise if (dummySpell->SpellIconID == 3017) -- cgit v1.2.3 From 2b9232dddc73a692b1c70c892787a40bde2097fd Mon Sep 17 00:00:00 2001 From: Warpten Date: Mon, 17 Sep 2012 18:17:23 +0200 Subject: Core/Spells: Fixed King of the Jungle. Closes #7098 --- .../2012_09_17_01_world_spell_script_names.sql | 5 + src/server/game/Entities/Unit/Unit.cpp | 24 - src/server/scripts/Spells/spell_druid.cpp | 569 ++++++++++++--------- 3 files changed, 319 insertions(+), 279 deletions(-) create mode 100644 sql/updates/world/2012_09_17_01_world_spell_script_names.sql (limited to 'src') diff --git a/sql/updates/world/2012_09_17_01_world_spell_script_names.sql b/sql/updates/world/2012_09_17_01_world_spell_script_names.sql new file mode 100644 index 00000000000..255c76e6b70 --- /dev/null +++ b/sql/updates/world/2012_09_17_01_world_spell_script_names.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (48492,48494,48495); +DELETE FROM `spell_script_names` WHERE `spell_id` IN(-5217, -5229); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(-5217, "spell_dru_tiger_s_fury"), +(-5229, "spell_dru_enrage"); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7dc1afa9738..98921f22bea 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6448,30 +6448,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: diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index b213f3df624..32a92da5e3a 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,115 @@ 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(); + } +}; + +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 +271,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 +386,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& targets) + void Register() { - if (!GetCaster()->ToPlayer()->GetGroup()) - { - targets.clear(); - targets.push_back(GetCaster()); - } - else - { - targets.remove(GetExplTargetUnit()); - std::list tempTargets; - for (std::list::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,64 +476,30 @@ class spell_dru_starfall_aoe : public SpellScriptLoader } }; -// 40121 - Swift Flight Form (Passive) -class spell_dru_swift_flight_passive : public SpellScriptLoader +class spell_dru_starfall_dummy : public SpellScriptLoader { public: - spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } + spell_dru_starfall_dummy() : SpellScriptLoader("spell_dru_starfall_dummy") { } - class spell_dru_swift_flight_passive_AuraScript : public AuraScript + class spell_dru_starfall_dummy_SpellScript : public SpellScript { - PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); + PrepareSpellScript(spell_dru_starfall_dummy_SpellScript); - bool Load() + void FilterTargets(std::list& targets) { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; + Trinity::Containers::RandomResizeList(targets, 2); } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + void HandleDummy(SpellEffIndex /*effIndex*/) { - if (Player* caster = GetCaster()->ToPlayer()) - if (caster->Has310Flyer(false)) - 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: - spell_dru_starfall_dummy() : SpellScriptLoader("spell_dru_starfall_dummy") { } - - class spell_dru_starfall_dummy_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_starfall_dummy_SpellScript); - - void FilterTargets(std::list& targets) - { - Trinity::Containers::RandomResizeList(targets, 2); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - // Shapeshifting into an animal form or mounting cancels the effect - if (caster->GetCreatureType() == CREATURE_TYPE_BEAST || caster->IsMounted()) - { - if (SpellInfo const* spellInfo = GetTriggeringSpell()) - caster->RemoveAurasDueToSpell(spellInfo->Id); - return; - } + Unit* caster = GetCaster(); + // Shapeshifting into an animal form or mounting cancels the effect + if (caster->GetCreatureType() == CREATURE_TYPE_BEAST || caster->IsMounted()) + { + if (SpellInfo const* spellInfo = GetTriggeringSpell()) + caster->RemoveAurasDueToSpell(spellInfo->Id); + return; + } // Any effect which causes you to lose control of your character will supress the starfall effect. if (caster->HasUnitState(UNIT_STATE_CONTROLLED)) @@ -378,128 +521,19 @@ 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 +class spell_dru_survival_instincts : public SpellScriptLoader { public: - spell_dru_savage_roar() : SpellScriptLoader("spell_dru_savage_roar") { } + spell_dru_survival_instincts() : SpellScriptLoader("spell_dru_survival_instincts") { } - class spell_dru_savage_roar_SpellScript : public SpellScript + class spell_dru_survival_instincts_SpellScript : public SpellScript { - PrepareSpellScript(spell_dru_savage_roar_SpellScript); + PrepareSpellScript(spell_dru_survival_instincts_SpellScript); SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (caster->GetShapeshiftForm() != FORM_CAT) + if (!caster->IsInFeralForm()) return SPELL_FAILED_ONLY_SHAPESHIFT; return SPELL_CAST_OK; @@ -507,17 +541,17 @@ class spell_dru_savage_roar : public SpellScriptLoader void Register() { - OnCheckCast += SpellCheckCastFn(spell_dru_savage_roar_SpellScript::CheckCast); + OnCheckCast += SpellCheckCastFn(spell_dru_survival_instincts_SpellScript::CheckCast); } }; - class spell_dru_savage_roar_AuraScript : public AuraScript + class spell_dru_survival_instincts_AuraScript : public AuraScript { - PrepareAuraScript(spell_dru_savage_roar_AuraScript); + PrepareAuraScript(spell_dru_survival_instincts_AuraScript); bool Validate(SpellInfo const* /*spell*/) { - if (!sSpellMgr->GetSpellInfo(DRUID_SAVAGE_ROAR)) + if (!sSpellMgr->GetSpellInfo(DRUID_SURVIVAL_INSTINCTS)) return false; return true; } @@ -525,138 +559,163 @@ class spell_dru_savage_roar : public SpellScriptLoader void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - target->CastSpell(target, DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID()); + int32 bp0 = target->CountPctFromMaxHealth(aurEff->GetAmount()); + target->CastCustomSpell(target, DRUID_SURVIVAL_INSTINCTS, &bp0, NULL, NULL, true); } void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - GetTarget()->RemoveAurasDueToSpell(DRUID_SAVAGE_ROAR); + GetTarget()->RemoveAurasDueToSpell(DRUID_SURVIVAL_INSTINCTS); } 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); + AfterEffectApply += AuraEffectApplyFn(spell_dru_survival_instincts_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_survival_instincts_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); } }; SpellScript* GetSpellScript() const { - return new spell_dru_savage_roar_SpellScript(); + return new spell_dru_survival_instincts_SpellScript(); } AuraScript* GetAuraScript() const { - return new spell_dru_savage_roar_AuraScript(); + return new spell_dru_survival_instincts_AuraScript(); } }; -class spell_dru_survival_instincts : public SpellScriptLoader +// 40121 - Swift Flight Form (Passive) +class spell_dru_swift_flight_passive : public SpellScriptLoader { public: - spell_dru_survival_instincts() : SpellScriptLoader("spell_dru_survival_instincts") { } + spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } - class spell_dru_survival_instincts_SpellScript : public SpellScript + class spell_dru_swift_flight_passive_AuraScript : public AuraScript { - PrepareSpellScript(spell_dru_survival_instincts_SpellScript); + PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); - SpellCastResult CheckCast() + bool Load() { - Unit* caster = GetCaster(); - if (!caster->IsInFeralForm()) - return SPELL_FAILED_ONLY_SHAPESHIFT; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - return SPELL_CAST_OK; + void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + { + if (Player* caster = GetCaster()->ToPlayer()) + if (caster->Has310Flyer(false)) + amount = 310; } void Register() { - OnCheckCast += SpellCheckCastFn(spell_dru_survival_instincts_SpellScript::CheckCast); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); } }; - class spell_dru_survival_instincts_AuraScript : public AuraScript + AuraScript* GetAuraScript() const { - PrepareAuraScript(spell_dru_survival_instincts_AuraScript); + return new spell_dru_swift_flight_passive_AuraScript(); + } +}; - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(DRUID_SURVIVAL_INSTINCTS)) - return false; - return true; - } +class spell_dru_tiger_s_fury : public SpellScriptLoader +{ + public: + spell_dru_tiger_s_fury() : SpellScriptLoader("spell_dru_tiger_s_fury") { } - void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - int32 bp0 = target->CountPctFromMaxHealth(aurEff->GetAmount()); - target->CastCustomSpell(target, DRUID_SURVIVAL_INSTINCTS, &bp0, NULL, NULL, true); - } + class spell_dru_tiger_s_fury_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_tiger_s_fury_SpellScript); - void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void OnHit() { - GetTarget()->RemoveAurasDueToSpell(DRUID_SURVIVAL_INSTINCTS); + 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); } void Register() { - AfterEffectApply += AuraEffectApplyFn(spell_dru_survival_instincts_AuraScript::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_survival_instincts_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + AfterHit += SpellHitFn(spell_dru_tiger_s_fury_SpellScript::OnHit); } }; SpellScript* GetSpellScript() const { - return new spell_dru_survival_instincts_SpellScript(); - } - - AuraScript* GetAuraScript() const - { - return new spell_dru_survival_instincts_AuraScript(); + return new spell_dru_tiger_s_fury_SpellScript(); } }; -class spell_dru_insect_swarm : public SpellScriptLoader +class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader { public: - spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } + spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } - class spell_dru_insect_swarm_AuraScript : public AuraScript + class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript { - PrepareAuraScript(spell_dru_insect_swarm_AuraScript); + PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); - 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 FilterTargets(std::list& targets) + { + if (!GetCaster()->ToPlayer()->GetGroup()) + { + targets.clear(); + targets.push_back(GetCaster()); + } + else + { + targets.remove(GetExplTargetUnit()); + std::list tempTargets; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith((*itr)->ToUnit())) + tempTargets.push_back((*itr)->ToUnit()); + + if (tempTargets.empty()) + { + targets.clear(); + FinishCast(SPELL_FAILED_DONT_REPORT); + return; + } + + Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets); + targets.clear(); + targets.push_back(target); + } } void Register() { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); } }; - AuraScript* GetAuraScript() const + SpellScript* GetSpellScript() const { - return new spell_dru_insect_swarm_AuraScript(); + return new spell_dru_t10_restoration_4p_bonus_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(); } -- cgit v1.2.3 From 2e5e8331f386c37ac06714a44a6d82f83361b34a Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 17 Sep 2012 13:56:12 -0400 Subject: Core/SmartAI: add SMART_ACTION_SET_HEALTH_REGEN (102). --- src/server/game/AI/SmartScripts/SmartScript.cpp | 6 ++++++ src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 1 + src/server/game/AI/SmartScripts/SmartScriptMgr.h | 8 +++++++- src/server/game/Entities/Creature/Creature.h | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index dbc6f6bae1a..6168489fd7d 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1965,6 +1965,12 @@ 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); + } 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 654cdee72c3..4e2c51e50c8 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 19aa6886ea0..cccf5c2ce10 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -485,8 +485,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 @@ -912,6 +913,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/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index abab3738ff7..b9fb5c8831c 100755 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -668,6 +668,7 @@ class Creature : public Unit, public GridObject, 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 { -- cgit v1.2.3 From cc86f567abc8c831aec5206cd398ab32f4eab387 Mon Sep 17 00:00:00 2001 From: Kandera Date: Mon, 17 Sep 2012 14:29:14 -0400 Subject: Core/SmartAI: fix SMART_ACTION_SET_FLY. was backwards :P --- src/server/game/AI/SmartScripts/SmartScript.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 6168489fd7d..6dd70790575 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: -- cgit v1.2.3 From 6ebc6b9a76d0a4576306d777b35ec1a37d3ec5da Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Mon, 17 Sep 2012 21:17:48 +0200 Subject: Core/SmartAI: Add missing break on 2e5e8331f386c37ac06714a44a6d82f83361b34a --- src/server/game/AI/SmartScripts/SmartScript.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 6dd70790575..db79925cc7f 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1970,6 +1970,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u 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()); -- cgit v1.2.3