From be0ce1c4d32b3b29c11db771ddf2024c3da29cce Mon Sep 17 00:00:00 2001 From: Aokromes Date: Thu, 16 Jun 2016 15:49:27 +0200 Subject: Scripts/Ulduar: Remove removed achievement Closes #17387 --- .../Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 33afada15fd..3a7d8547cc9 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -1366,17 +1366,6 @@ class spell_algalon_supermassive_fail : public SpellScriptLoader } }; -class achievement_he_feeds_on_your_tears : public AchievementCriteriaScript -{ - public: - achievement_he_feeds_on_your_tears() : AchievementCriteriaScript("achievement_he_feeds_on_your_tears") { } - - bool OnCheck(Player* /*source*/, Unit* target) override - { - return !target->GetAI()->GetData(DATA_HAS_FED_ON_TEARS); - } -}; - void AddSC_boss_algalon_the_observer() { new boss_algalon_the_observer(); @@ -1393,5 +1382,4 @@ void AddSC_boss_algalon_the_observer() new spell_algalon_cosmic_smash(); new spell_algalon_cosmic_smash_damage(); new spell_algalon_supermassive_fail(); - new achievement_he_feeds_on_your_tears(); } -- cgit v1.2.3 From 65eb88c8a5ef4f0d07c41b1177b2418903095028 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 17 Jun 2016 21:17:07 +0200 Subject: Core/Spells: Fixed monk spell Provoke Initial PR submitted by @Infamous-devel Closes #17384 --- sql/updates/world/6.x/2016_06_17_01_world.sql | 3 ++ src/server/scripts/Spells/spell_monk.cpp | 74 ++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 sql/updates/world/6.x/2016_06_17_01_world.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/6.x/2016_06_17_01_world.sql b/sql/updates/world/6.x/2016_06_17_01_world.sql new file mode 100644 index 00000000000..e5bc16000ce --- /dev/null +++ b/sql/updates/world/6.x/2016_06_17_01_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_provoke'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(115546,'spell_monk_provoke'); diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp index 904089bc451..e87a76c3e9f 100644 --- a/src/server/scripts/Spells/spell_monk.cpp +++ b/src/server/scripts/Spells/spell_monk.cpp @@ -28,12 +28,13 @@ enum MonkSpells { - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, - SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, - - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, + SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, + SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189, + SPELL_MONK_PROVOKE_AOE = 118635, + SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, }; // 117952 - Crackling Jade Lightning @@ -125,8 +126,69 @@ public: } }; +// 115546 - Provoke +class spell_monk_provoke : public SpellScriptLoader +{ +public: + spell_monk_provoke() : SpellScriptLoader("spell_monk_provoke") { } + + class spell_monk_provoke_SpellScript : public SpellScript + { + PrepareSpellScript(spell_monk_provoke_SpellScript); + + static uint32 const BlackOxStatusEntry = 61146; + + bool Validate(SpellInfo const* spellInfo) override + { + if (!(spellInfo->GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK)) // ensure GetExplTargetUnit() will return something meaningful during CheckCast + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_PROVOKE_AOE)) + return false; + return true; + } + + SpellCastResult CheckExplicitTarget() + { + if (GetExplTargetUnit()->GetEntry() != BlackOxStatusEntry) + { + SpellInfo const* singleTarget = sSpellMgr->AssertSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET); + SpellCastResult singleTargetExplicitResult = singleTarget->CheckExplicitTarget(GetCaster(), GetExplTargetUnit()); + if (singleTargetExplicitResult != SPELL_CAST_OK) + return singleTargetExplicitResult; + } + else if (GetExplTargetUnit()->GetOwnerGUID() != GetCaster()->GetGUID()) + return SPELL_FAILED_BAD_TARGETS; + + return SPELL_CAST_OK; + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (GetHitUnit()->GetEntry() != BlackOxStatusEntry) + GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_SINGLE_TARGET, true); + else + GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_AOE, true); + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_monk_provoke_SpellScript::CheckExplicitTarget); + OnEffectHitTarget += SpellEffectFn(spell_monk_provoke_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_monk_provoke_SpellScript(); + } +}; + void AddSC_monk_spell_scripts() { new spell_monk_crackling_jade_lightning(); new spell_monk_crackling_jade_lightning_knockback_proc_aura(); + new spell_monk_provoke(); } -- cgit v1.2.3 From 11ed9b0b63115812892903abba82a2d1684d69b9 Mon Sep 17 00:00:00 2001 From: P-Kito Date: Fri, 17 Jun 2016 21:26:51 +0200 Subject: Game/Unit: Update shapeshift forms enum to match SpellShapeshiftForm.dbc (#17407) --- src/server/game/Battlegrounds/Battleground.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 4 +- src/server/game/Entities/Unit/StatSystem.cpp | 4 +- src/server/game/Entities/Unit/Unit.cpp | 28 ++--- src/server/game/Entities/Unit/Unit.h | 65 +++++------ src/server/game/Spells/Auras/SpellAuraEffects.cpp | 129 +++++++++++----------- src/server/game/Spells/SpellMgr.cpp | 2 +- src/server/scripts/Spells/spell_druid.cpp | 8 +- 8 files changed, 121 insertions(+), 121 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index e96286692d2..8b5622331a8 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1870,7 +1870,7 @@ uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const if (itr->second.Team == Team) { Player* player = ObjectAccessor::FindPlayer(itr->first); - if (player && player->IsAlive() && !player->HasByteFlag(UNIT_FIELD_BYTES_2, 3, FORM_SPIRITOFREDEMPTION)) + if (player && player->IsAlive() && !player->HasByteFlag(UNIT_FIELD_BYTES_2, 3, FORM_SPIRIT_OF_REDEMPTION)) ++count; } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1aab9f001ed..d26ebcc9170 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20888,13 +20888,13 @@ void Player::InitDataForForm(bool reapplyMods) switch (form) { case FORM_GHOUL: - case FORM_CAT: + case FORM_CAT_FORM: { if (getPowerType() != POWER_ENERGY) setPowerType(POWER_ENERGY); break; } - case FORM_BEAR: + case FORM_BEAR_FORM: { if (getPowerType() != POWER_RAGE) setPowerType(POWER_RAGE); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 4fa79a91eee..397a4b993db 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -417,12 +417,12 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo if (Item* weapon = GetWeaponForAttack(BASE_ATTACK, true)) weaponSpeed = weapon->GetTemplate()->GetDelay() / 1000; - if (GetShapeshiftForm() == FORM_CAT) + if (GetShapeshiftForm() == FORM_CAT_FORM) { weaponMinDamage = weaponMinDamage / weaponSpeed; weaponMaxDamage = weaponMaxDamage / weaponSpeed; } - else if (GetShapeshiftForm() == FORM_BEAR) + else if (GetShapeshiftForm() == FORM_BEAR_FORM) { weaponMinDamage = weaponMinDamage / weaponSpeed + weaponMinDamage / 2.5; weaponMaxDamage = weaponMinDamage / weaponSpeed + weaponMaxDamage / 2.5; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8035b3411b7..87bdcf3692a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6254,10 +6254,10 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg switch (GetShapeshiftForm()) { case FORM_NONE: trigger_spell_id = 37344; break; - case FORM_CAT: trigger_spell_id = 37341; break; - case FORM_BEAR: trigger_spell_id = 37340; break; - case FORM_TREE: trigger_spell_id = 37342; break; - case FORM_MOONKIN: trigger_spell_id = 37343; break; + case FORM_CAT_FORM: trigger_spell_id = 37341; break; + case FORM_BEAR_FORM: trigger_spell_id = 37340; break; + case FORM_TREE_OF_LIFE: trigger_spell_id = 37342; break; + case FORM_MOONKIN_FORM: trigger_spell_id = 37343; break; default: return false; } @@ -6268,8 +6268,8 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg { switch (GetShapeshiftForm()) { - case FORM_CAT: trigger_spell_id = 67355; break; - case FORM_BEAR: trigger_spell_id = 67354; break; + case FORM_CAT_FORM: trigger_spell_id = 67355; break; + case FORM_BEAR_FORM: trigger_spell_id = 67354; break; default: return false; } @@ -10732,7 +10732,7 @@ void Unit::SetShapeshiftForm(ShapeshiftForm form) bool Unit::IsInFeralForm() const { ShapeshiftForm form = GetShapeshiftForm(); - return form == FORM_CAT || form == FORM_BEAR; + return form == FORM_CAT_FORM || form == FORM_BEAR_FORM; } bool Unit::IsInDisallowedMountForm() const @@ -13183,7 +13183,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) // restore for use at real death victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId); - // FORM_SPIRITOFREDEMPTION and related auras + // FORM_SPIRIT_OF_REDEMPTION and related auras victim->CastSpell(victim, 27827, true, NULL, aurEff); spiritOfRedemption = true; break; @@ -14271,7 +14271,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const { switch (form) { - case FORM_CAT: + case FORM_CAT_FORM: // Based on Hair color if (getRace() == RACE_NIGHTELF) { @@ -14419,7 +14419,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const return 892; else return 8571; - case FORM_BEAR: + case FORM_BEAR_FORM: // Based on Hair color if (getRace() == RACE_NIGHTELF) { @@ -14567,17 +14567,17 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const return 2281; else return 2289; - case FORM_FLIGHT: + case FORM_FLIGHT_FORM: if (Player::TeamForRace(getRace()) == ALLIANCE) return 20857; return 20872; - case FORM_FLIGHT_EPIC: + case FORM_FLIGHT_FORM_EPIC: if (Player::TeamForRace(getRace()) == ALLIANCE) return (getRace() == RACE_WORGEN ? 37729 : 21243); if (getRace() == RACE_TROLL) return 37730; return 21244; - case FORM_MOONKIN: + case FORM_MOONKIN_FORM: switch (getRace()) { case RACE_NIGHTELF: @@ -14592,7 +14592,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const break; } break; - case FORM_GHOSTWOLF: + case FORM_GHOST_WOLF: if (HasAura(58135)) //! Glyph of Arctic Wolf return 27312; default: diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 05149a4cd0a..48e7cb86fcf 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -260,37 +260,40 @@ enum UnitBytes1_Flags // high byte (3 from 0..3) of UNIT_FIELD_BYTES_2 enum ShapeshiftForm { - FORM_NONE = 0x00, - FORM_CAT = 0x01, - FORM_TREE = 0x02, - FORM_TRAVEL = 0x03, - FORM_AQUA = 0x04, - FORM_BEAR = 0x05, - FORM_AMBIENT = 0x06, - FORM_GHOUL = 0x07, - FORM_DIREBEAR = 0x08, // Removed in 4.0.1 - FORM_STEVES_GHOUL = 0x09, - FORM_THARONJA_SKELETON = 0x0A, - FORM_TEST_OF_STRENGTH = 0x0B, - FORM_BLB_PLAYER = 0x0C, - FORM_SHADOW_DANCE = 0x0D, - FORM_CREATUREBEAR = 0x0E, - FORM_CREATURECAT = 0x0F, - FORM_GHOSTWOLF = 0x10, - FORM_BATTLESTANCE = 0x11, - FORM_DEFENSIVESTANCE = 0x12, - FORM_BERSERKERSTANCE = 0x13, - FORM_TEST = 0x14, - FORM_ZOMBIE = 0x15, - FORM_METAMORPHOSIS = 0x16, - FORM_UNDEAD = 0x19, - FORM_MASTER_ANGLER = 0x1A, - FORM_FLIGHT_EPIC = 0x1B, - FORM_SHADOW = 0x1C, - FORM_FLIGHT = 0x1D, - FORM_STEALTH = 0x1E, - FORM_MOONKIN = 0x1F, - FORM_SPIRITOFREDEMPTION = 0x20 + FORM_NONE = 0, + FORM_CAT_FORM = 1, + FORM_TREE_OF_LIFE = 2, + FORM_TRAVEL_FORM = 3, + FORM_AQUATIC_FORM = 4, + FORM_BEAR_FORM = 5, + FORM_AMBIENT = 6, + FORM_GHOUL = 7, + FORM_DIRE_BEAR_FORM = 8, + FORM_CRANE_STANCE = 9, + FORM_THARONJA_SKELETON = 10, + FORM_DARKMOON_TEST_OF_STRENGTH = 11, + FORM_BLB_PLAYER = 12, + FORM_SHADOW_DANCE = 13, + FORM_CREATURE_BEAR = 14, + FORM_CREATURE_CAT = 15, + FORM_GHOST_WOLF = 16, + FORM_BATTLE_STANCE = 17, + FORM_DEFENSIVE_STANCE = 18, + FORM_BERSERKER_STANCE = 19, + FORM_SERPENT_STANCE = 20, + FORM_ZOMBIE = 21, + FORM_METAMORPHOSIS = 22, + FORM_OX_STANCE = 23, + FORM_TIGER_STANCE = 24, + FORM_UNDEAD = 25, + FORM_FRENZY = 26, + FORM_FLIGHT_FORM_EPIC = 27, + FORM_SHADOWFORM = 28, + FORM_FLIGHT_FORM = 29, + FORM_STEALTH = 30, + FORM_MOONKIN_FORM = 31, + FORM_SPIRIT_OF_REDEMPTION = 32, + FORM_GLADIATOR_STANCE = 33 }; // low byte (0 from 0..3) of UNIT_FIELD_BYTES_2 diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 34bd7e66ac2..f205ac03e01 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1275,40 +1275,40 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const switch (GetMiscValue()) { - case FORM_CAT: + case FORM_CAT_FORM: spellId = 3025; break; - case FORM_TREE: + case FORM_TREE_OF_LIFE: spellId = 34123; break; - case FORM_TRAVEL: + case FORM_TRAVEL_FORM: spellId = 5419; break; - case FORM_AQUA: + case FORM_AQUATIC_FORM: spellId = 5421; break; - case FORM_BEAR: + case FORM_BEAR_FORM: spellId = 1178; spellId2 = 21178; break; - case FORM_BATTLESTANCE: + case FORM_BATTLE_STANCE: spellId = 21156; break; - case FORM_DEFENSIVESTANCE: + case FORM_DEFENSIVE_STANCE: spellId = 7376; break; - case FORM_BERSERKERSTANCE: + case FORM_BERSERKER_STANCE: spellId = 7381; break; - case FORM_MOONKIN: + case FORM_MOONKIN_FORM: spellId = 24905; spellId2 = 24907; break; - case FORM_FLIGHT: + case FORM_FLIGHT_FORM: spellId = 33948; spellId2 = 34764; break; - case FORM_FLIGHT_EPIC: + case FORM_FLIGHT_FORM_EPIC: spellId = 40122; spellId2 = 40121; break; @@ -1316,21 +1316,19 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const spellId = 54817; spellId2 = 54879; break; - case FORM_SPIRITOFREDEMPTION: + case FORM_SPIRIT_OF_REDEMPTION: spellId = 27792; spellId2 = 27795; // must be second, this important at aura remove to prevent to early iterator invalidation. break; - case FORM_SHADOW: + case FORM_SHADOWFORM: spellId = 49868; break; - case FORM_GHOSTWOLF: + case FORM_GHOST_WOLF: spellId = 67116; break; case FORM_GHOUL: case FORM_AMBIENT: case FORM_STEALTH: - case FORM_CREATURECAT: - case FORM_CREATUREBEAR: break; default: break; @@ -1395,7 +1393,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const switch (GetMiscValue()) { - case FORM_CAT: + case FORM_CAT_FORM: // Savage Roar if (target->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, flag128(0, 0x10000000, 0))) target->CastSpell(target, 62071, true); @@ -1421,7 +1419,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const target->CastCustomSpell(target, 48420, &bp, NULL, NULL, true); } break; - case FORM_BEAR: + case FORM_BEAR_FORM: // Master Shapeshifter - Bear if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELLFAMILY_GENERIC, 2851, EFFECT_0)) { @@ -1429,7 +1427,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const target->CastCustomSpell(target, 48418, &bp, NULL, NULL, true); } break; - case FORM_MOONKIN: + case FORM_MOONKIN_FORM: // Master Shapeshifter - Moonkin if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELLFAMILY_GENERIC, 2851, EFFECT_0)) { @@ -1784,44 +1782,43 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo switch (form) { - case FORM_CAT: // 0x01 - case FORM_GHOUL: // 0x07 + case FORM_CAT_FORM: + case FORM_GHOUL: + case FORM_TIGER_STANCE: + case FORM_OX_STANCE: PowerType = POWER_ENERGY; break; - case FORM_BEAR: // 0x05 + case FORM_BEAR_FORM: - case FORM_BATTLESTANCE: // 0x11 - case FORM_DEFENSIVESTANCE: // 0x12 - case FORM_BERSERKERSTANCE: // 0x13 + case FORM_BATTLE_STANCE: + case FORM_DEFENSIVE_STANCE: + case FORM_BERSERKER_STANCE: PowerType = POWER_RAGE; break; - case FORM_TREE: // 0x02 - case FORM_TRAVEL: // 0x03 - case FORM_AQUA: // 0x04 - case FORM_AMBIENT: // 0x06 - - case FORM_STEVES_GHOUL: // 0x09 - case FORM_THARONJA_SKELETON: // 0x0A - case FORM_TEST_OF_STRENGTH: // 0x0B - case FORM_BLB_PLAYER: // 0x0C - case FORM_SHADOW_DANCE: // 0x0D - case FORM_CREATUREBEAR: // 0x0E - case FORM_CREATURECAT: // 0x0F - case FORM_GHOSTWOLF: // 0x10 - - case FORM_TEST: // 0x14 - case FORM_ZOMBIE: // 0x15 - case FORM_METAMORPHOSIS: // 0x16 - case FORM_UNDEAD: // 0x19 - case FORM_MASTER_ANGLER: // 0x1A - case FORM_FLIGHT_EPIC: // 0x1B - case FORM_SHADOW: // 0x1C - case FORM_FLIGHT: // 0x1D - case FORM_STEALTH: // 0x1E - case FORM_MOONKIN: // 0x1F - case FORM_SPIRITOFREDEMPTION: // 0x20 + case FORM_TREE_OF_LIFE: + case FORM_TRAVEL_FORM: + case FORM_AQUATIC_FORM: + case FORM_AMBIENT: + + case FORM_THARONJA_SKELETON: + case FORM_DARKMOON_TEST_OF_STRENGTH: + case FORM_BLB_PLAYER: + case FORM_SHADOW_DANCE: + case FORM_CRANE_STANCE: + case FORM_GHOST_WOLF: + + case FORM_SERPENT_STANCE: + case FORM_ZOMBIE: + case FORM_METAMORPHOSIS: + case FORM_UNDEAD: + case FORM_FLIGHT_FORM_EPIC: + case FORM_SHADOWFORM: + case FORM_FLIGHT_FORM: + case FORM_STEALTH: + case FORM_MOONKIN_FORM: + case FORM_SPIRIT_OF_REDEMPTION: break; default: TC_LOG_ERROR("spells", "Auras: Unknown Shapeshift Type: %u", GetMiscValue()); @@ -1834,14 +1831,14 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo // remove polymorph before changing display id to keep new display id switch (form) { - case FORM_CAT: - case FORM_TREE: - case FORM_TRAVEL: - case FORM_AQUA: - case FORM_BEAR: - case FORM_FLIGHT_EPIC: - case FORM_FLIGHT: - case FORM_MOONKIN: + case FORM_CAT_FORM: + case FORM_TREE_OF_LIFE: + case FORM_TRAVEL_FORM: + case FORM_AQUATIC_FORM: + case FORM_BEAR_FORM: + case FORM_FLIGHT_FORM_EPIC: + case FORM_FLIGHT_FORM: + case FORM_MOONKIN_FORM: { // remove movement affects target->RemoveMovementImpairingAuras(); @@ -1869,14 +1866,14 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo if (target->getPowerType() != PowerType) target->setPowerType(PowerType); - if (form == FORM_CAT || form == FORM_BEAR) + if (form == FORM_CAT_FORM || form == FORM_BEAR_FORM) { // get furor proc chance int32 FurorChance = 0; if (AuraEffect const* dummy = target->GetDummyAuraEffect(SPELLFAMILY_DRUID, 238, 0)) FurorChance = std::max(dummy->GetAmount(), 0); - if (form == FORM_CAT) + if (form == FORM_CAT_FORM) { int32 basePoints = std::min(oldPower, FurorChance); target->SetPower(POWER_ENERGY, 0); @@ -1919,19 +1916,19 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo switch (form) { // Nordrassil Harness - bonus - case FORM_BEAR: - case FORM_CAT: + case FORM_BEAR_FORM: + case FORM_CAT_FORM: if (AuraEffect* dummy = target->GetAuraEffect(37315, 0)) target->CastSpell(target, 37316, true, NULL, dummy); break; // Nordrassil Regalia - bonus - case FORM_MOONKIN: + case FORM_MOONKIN_FORM: if (AuraEffect* dummy = target->GetAuraEffect(37324, 0)) target->CastSpell(target, 37325, true, NULL, dummy); break; - case FORM_BATTLESTANCE: - case FORM_DEFENSIVESTANCE: - case FORM_BERSERKERSTANCE: + case FORM_BATTLE_STANCE: + case FORM_DEFENSIVE_STANCE: + case FORM_BERSERKER_STANCE: { int32 Rage_val = 0; // Stance mastery + Tactical mastery (both passive, and last have aura only in defense stance, but need apply at any stance switch) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index e99c4bd661f..4e9a6363e8d 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3385,7 +3385,7 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP; break; case 5420: // Tree of Life (Passive) - spellInfo->Stances = UI64LIT(1) << (FORM_TREE - 1); + spellInfo->Stances = UI64LIT(1) << (FORM_TREE_OF_LIFE - 1); break; case 49376: // Feral Charge (Cat Form) spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC; diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 4488561589f..d82e9920df2 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -74,7 +74,7 @@ class spell_dru_dash : public SpellScriptLoader void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { // do not set speed if not in cat form - if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT) + if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT_FORM) amount = 0; } @@ -767,7 +767,7 @@ class spell_dru_savage_roar : public SpellScriptLoader SpellCastResult CheckCast() { Unit* caster = GetCaster(); - if (caster->GetShapeshiftForm() != FORM_CAT) + if (caster->GetShapeshiftForm() != FORM_CAT_FORM) return SPELL_FAILED_ONLY_SHAPESHIFT; return SPELL_CAST_OK; @@ -889,7 +889,7 @@ class spell_dru_stampede : public SpellScriptLoader void HandleEffectCatProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - if (GetTarget()->GetShapeshiftForm() != FORM_CAT || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_CAT) + if (GetTarget()->GetShapeshiftForm() != FORM_CAT_FORM || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_CAT) return; GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_CAT_RANK_1, GetSpellInfo()->GetRank()), true, NULL, aurEff); @@ -899,7 +899,7 @@ class spell_dru_stampede : public SpellScriptLoader void HandleEffectBearProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - if (GetTarget()->GetShapeshiftForm() != FORM_BEAR || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_BEAR) + if (GetTarget()->GetShapeshiftForm() != FORM_BEAR_FORM || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_BEAR) return; GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_BAER_RANK_1, GetSpellInfo()->GetRank()), true, NULL, aurEff); -- cgit v1.2.3 From c5bad429e2ca0d58660922157655cbaec857e53e Mon Sep 17 00:00:00 2001 From: Kito Date: Sat, 18 Jun 2016 20:34:45 +0200 Subject: Scripts/Monk: Surging Mist * When glyphed and in stance will cast AOE ally selection heal * Else, cast normal heal on Explicit target --- sql/updates/world/6.x/2016_06_23_02_world.sql | 3 ++ src/server/scripts/Spells/spell_monk.cpp | 48 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 sql/updates/world/6.x/2016_06_23_02_world.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/6.x/2016_06_23_02_world.sql b/sql/updates/world/6.x/2016_06_23_02_world.sql new file mode 100644 index 00000000000..43f2c02dcf2 --- /dev/null +++ b/sql/updates/world/6.x/2016_06_23_02_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_surging_mist'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(116694,'spell_monk_surging_mist'); diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp index e87a76c3e9f..93ba174b1b6 100644 --- a/src/server/scripts/Spells/spell_monk.cpp +++ b/src/server/scripts/Spells/spell_monk.cpp @@ -32,9 +32,12 @@ enum MonkSpells SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, + SPELL_MONK_GLYPH_OF_SURGING_MIST = 120483, SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189, SPELL_MONK_PROVOKE_AOE = 118635, SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, + SPELL_MONK_SURGING_MIST_HEAL = 116995, + SPELL_MONK_SURGING_MIST_HEAL_GLYPHED = 123273, }; // 117952 - Crackling Jade Lightning @@ -186,9 +189,54 @@ public: } }; +// 116694 - Surging Mist +class spell_monk_surging_mist : public SpellScriptLoader +{ + public: + spell_monk_surging_mist() : SpellScriptLoader("spell_monk_surging_mist") { } + + class spell_monk_surging_mist_SpellScript : public SpellScript + { + PrepareSpellScript(spell_monk_surging_mist_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL_GLYPHED)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_GLYPH_OF_SURGING_MIST)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + if (caster->GetShapeshiftForm() == FORM_CRANE_STANCE && caster->HasAura(SPELL_MONK_GLYPH_OF_SURGING_MIST)) + caster->CastSpell(target, SPELL_MONK_SURGING_MIST_HEAL_GLYPHED, true); + else + caster->CastSpell(target, SPELL_MONK_SURGING_MIST_HEAL, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_monk_surging_mist_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_monk_surging_mist_SpellScript(); + } +}; + void AddSC_monk_spell_scripts() { new spell_monk_crackling_jade_lightning(); new spell_monk_crackling_jade_lightning_knockback_proc_aura(); new spell_monk_provoke(); + new spell_monk_surging_mist(); } -- cgit v1.2.3 From a515b73738c0cb21239711b166ac7a84801149b1 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 26 Jun 2016 19:52:41 +0200 Subject: Core/Spells: Fixed Glyph of Surging Mist --- sql/updates/world/6.x/2016_06_26_00_world.sql | 3 + src/server/scripts/Spells/spell_monk.cpp | 86 +++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 sql/updates/world/6.x/2016_06_26_00_world.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/6.x/2016_06_26_00_world.sql b/sql/updates/world/6.x/2016_06_26_00_world.sql new file mode 100644 index 00000000000..ead8bc25478 --- /dev/null +++ b/sql/updates/world/6.x/2016_06_26_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_surging_mist_glyphed'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(123273,'spell_monk_surging_mist_glyphed'); diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp index 93ba174b1b6..fd91db9216f 100644 --- a/src/server/scripts/Spells/spell_monk.cpp +++ b/src/server/scripts/Spells/spell_monk.cpp @@ -32,12 +32,11 @@ enum MonkSpells SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, - SPELL_MONK_GLYPH_OF_SURGING_MIST = 120483, SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189, SPELL_MONK_PROVOKE_AOE = 118635, + SPELL_MONK_SOOTHING_MIST = 115175, SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, SPELL_MONK_SURGING_MIST_HEAL = 116995, - SPELL_MONK_SURGING_MIST_HEAL_GLYPHED = 123273, }; // 117952 - Crackling Jade Lightning @@ -203,26 +202,26 @@ class spell_monk_surging_mist : public SpellScriptLoader { if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL)) return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL_GLYPHED)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_MONK_GLYPH_OF_SURGING_MIST)) - return false; return true; } + void SelectTarget(WorldObject*& target) + { + Unit* caster = GetCaster(); + if (caster->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MONK_SOOTHING_MIST) + if (Unit* soothingMistTarget = ObjectAccessor::GetUnit(*caster, caster->GetChannelObjectGuid())) + target = soothingMistTarget; + } + void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - Unit* caster = GetCaster(); - Unit* target = GetHitUnit(); - if (caster->GetShapeshiftForm() == FORM_CRANE_STANCE && caster->HasAura(SPELL_MONK_GLYPH_OF_SURGING_MIST)) - caster->CastSpell(target, SPELL_MONK_SURGING_MIST_HEAL_GLYPHED, true); - else - caster->CastSpell(target, SPELL_MONK_SURGING_MIST_HEAL, true); + GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_SURGING_MIST_HEAL, true); } void Register() override { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_monk_surging_mist_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_TARGET_ALLY); OnEffectHitTarget += SpellEffectFn(spell_monk_surging_mist_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -233,10 +232,73 @@ class spell_monk_surging_mist : public SpellScriptLoader } }; +// 123273 - Surging Mist (Glyphed) +class spell_monk_surging_mist_glyphed : public SpellScriptLoader +{ +public: + spell_monk_surging_mist_glyphed() : SpellScriptLoader("spell_monk_surging_mist_glyphed") { } + + class spell_monk_surging_mist_glyphed_SpellScript : public SpellScript + { + PrepareSpellScript(spell_monk_surging_mist_glyphed_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SOOTHING_MIST)) + return false; + return true; + } + + void SelectTarget(std::list& targets) + { + Unit* caster = GetCaster(); + if (caster->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MONK_SOOTHING_MIST) + { + targets.clear(); + if (Unit* soothingMistTarget = ObjectAccessor::GetUnit(*caster, caster->GetChannelObjectGuid())) + targets.push_back(soothingMistTarget); + } + else + { + targets.remove_if([caster](WorldObject* target) + { + return target->GetTypeId() != TYPEID_UNIT || !target->ToUnit()->IsInRaidWith(caster); + }); + targets.sort(Trinity::HealthPctOrderPred()); + if (!targets.empty()) + targets.resize(1); + } + + if (targets.empty()) + targets.push_back(caster); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_SURGING_MIST_HEAL, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_monk_surging_mist_glyphed_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnEffectHitTarget += SpellEffectFn(spell_monk_surging_mist_glyphed_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_monk_surging_mist_glyphed_SpellScript(); + } +}; + void AddSC_monk_spell_scripts() { new spell_monk_crackling_jade_lightning(); new spell_monk_crackling_jade_lightning_knockback_proc_aura(); new spell_monk_provoke(); new spell_monk_surging_mist(); + new spell_monk_surging_mist_glyphed(); } -- cgit v1.2.3 From ef396877ae68e6f71638b1da961a295131feb8da Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 1 Jul 2016 20:26:49 +0200 Subject: Core/Spells: Fixed spell range check Closes #17060 (cherry picked from commit e6a52d4aae9e8facc46c3b05e0560d540a928d73) --- src/server/game/Entities/Item/ItemTemplate.h | 1 + src/server/game/Entities/Unit/Unit.cpp | 8 +- src/server/game/Entities/Unit/Unit.h | 1 - src/server/game/Spells/Spell.cpp | 92 ++++++++++++++-------- .../EasternKingdoms/Karazhan/boss_moroes.cpp | 2 +- 5 files changed, 64 insertions(+), 40 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index d69f1c88845..76c129d325a 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -680,6 +680,7 @@ struct TC_GAME_API ItemTemplate uint32 GetScalingStatDistribution() const { return ExtendedData->ScalingStatDistribution; } uint32 GetDamageType() const { return ExtendedData->DamageType; } uint32 GetDelay() const { return ExtendedData->Delay; } + float GetRangedModRange() const { return ExtendedData->RangedModRange; } ItemBondingType GetBonding() const { return ItemBondingType(ExtendedData->Bonding); } char const* GetName(LocaleConstant locale) const; uint32 GetPageText() const { return ExtendedData->PageText; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f65449dbf74..c408d4390cd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -484,12 +484,6 @@ void Unit::resetAttackTimer(WeaponAttackType type) m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]); } -float Unit::GetMeleeReach() const -{ - float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; - return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; -} - bool Unit::IsWithinCombatRange(const Unit* obj, float dist2compare) const { if (!obj || !IsInMap(obj) || !IsInPhase(obj)) @@ -516,7 +510,7 @@ bool Unit::IsWithinMeleeRange(const Unit* obj, float dist) const float dz = GetPositionZMinusOffset() - obj->GetPositionZMinusOffset(); float distsq = dx*dx + dy*dy + dz*dz; - float sizefactor = GetMeleeReach() + obj->GetMeleeReach(); + float sizefactor = GetCombatReach() + obj->GetCombatReach() + 4.0f / 3.0f; float maxdist = dist + sizefactor; return distsq < maxdist * maxdist; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2ee0ea8873a..962d9549f2c 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1365,7 +1365,6 @@ class TC_GAME_API Unit : public WorldObject bool CanDualWield() const { return m_canDualWield; } virtual void SetCanDualWield(bool value) { m_canDualWield = value; } float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; } - float GetMeleeReach() const; bool IsWithinCombatRange(const Unit* obj, float dist2compare) const; bool IsWithinMeleeRange(const Unit* obj, float dist = MELEE_RANGE) const; void GetRandomContactPoint(const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax) const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a09d97b8e68..2b59926fa33 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5924,43 +5924,73 @@ SpellCastResult Spell::CheckRange(bool strict) if (!strict && m_casttime == 0) return SPELL_CAST_OK; - uint32 range_type = 0; + Unit* target = m_targets.GetUnitTarget(); + float minRange = 0.0f; + float maxRange = 0.0f; + float rangeMod = 0.0f; + if (strict && IsNextMeleeSwingSpell()) + maxRange = 100.0f; + else if (m_spellInfo->RangeEntry) + { + if (m_spellInfo->RangeEntry->Flags & SPELL_RANGE_MELEE) + { + rangeMod = m_caster->GetCombatReach() + 4.0f / 3.0f; + if (target) + rangeMod += target->GetCombatReach(); + else + rangeMod += m_caster->GetCombatReach(); - if (m_spellInfo->RangeEntry) - { - // check needed by 68766 51693 - both spells are cast on enemies and have 0 max range - // these are triggered by other spells - possibly we should omit range check in that case? - if (m_spellInfo->RangeEntry->ID == 1) - return SPELL_CAST_OK; + rangeMod = std::max(rangeMod, NOMINAL_MELEE_RANGE); + } + else + { + float meleeRange = 0.0f; + if (m_spellInfo->RangeEntry->Flags & SPELL_RANGE_RANGED) + { + meleeRange = m_caster->GetCombatReach() + 4.0f / 3.0f; + if (target) + meleeRange += target->GetCombatReach(); + else + meleeRange += m_caster->GetCombatReach(); + + meleeRange = std::max(meleeRange, NOMINAL_MELEE_RANGE); + } + + minRange = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo) + meleeRange; + maxRange = m_caster->GetSpellMaxRangeForTarget(target, m_spellInfo); - range_type = m_spellInfo->RangeEntry->Flags; + if (target || m_targets.GetCorpseTarget()) + { + rangeMod = m_caster->GetCombatReach(); + if (target) + rangeMod += target->GetCombatReach(); + + if (minRange > 0.0f && !(m_spellInfo->RangeEntry->Flags & SPELL_RANGE_RANGED)) + minRange += rangeMod; + } + } + + if (target && m_caster->isMoving() && target->isMoving() && !m_caster->IsWalking() && !target->IsWalking() && + (m_spellInfo->RangeEntry->Flags & SPELL_RANGE_MELEE || target->GetTypeId() == TYPEID_PLAYER)) + rangeMod += 5.0f / 3.0f; } - Unit* target = m_targets.GetUnitTarget(); - float max_range = m_caster->GetSpellMaxRangeForTarget(target, m_spellInfo); - float min_range = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo); + if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && m_caster->GetTypeId() == TYPEID_PLAYER) + if (Item* ranged = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK, true)) + maxRange *= ranged->GetTemplate()->GetRangedModRange() * 0.01f; if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, max_range, this); + modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, maxRange, this); + + maxRange += rangeMod; if (target && target != m_caster) { - if (range_type == SPELL_RANGE_MELEE) - { - // Because of lag, we can not check too strictly here. - if (!m_caster->IsWithinMeleeRange(target, max_range)) - return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; - } - else if (!m_caster->IsWithinCombatRange(target, max_range)) - return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; //0x5A; + if (!m_caster->IsInDist(target, maxRange)) + return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; - if (range_type == SPELL_RANGE_RANGED) - { - if (m_caster->IsWithinMeleeRange(target)) - return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_TOO_CLOSE : SPELL_FAILED_DONT_REPORT; - } - else if (min_range && m_caster->IsWithinCombatRange(target, min_range)) // skip this check if min_range = 0 - return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_TOO_CLOSE : SPELL_FAILED_DONT_REPORT; + if (minRange > 0.0f && m_caster->IsInDist(target, minRange)) + return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; if (m_caster->GetTypeId() == TYPEID_PLAYER && (m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc(static_cast(M_PI), target)) @@ -5969,10 +5999,10 @@ SpellCastResult Spell::CheckRange(bool strict) if (m_targets.HasDst() && !m_targets.HasTraj()) { - if (!m_caster->IsWithinDist3d(m_targets.GetDstPos(), max_range)) - return SPELL_FAILED_OUT_OF_RANGE; - if (min_range && m_caster->IsWithinDist3d(m_targets.GetDstPos(), min_range)) - return SPELL_FAILED_TOO_CLOSE; + if (!m_caster->IsInDist(m_targets.GetDstPos(), maxRange)) + return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; + if (minRange > 0.0f && m_caster->IsInDist(m_targets.GetDstPos(), minRange)) + return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; } return SPELL_CAST_OK; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index b87c836c2a4..84ee5cd97db 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -298,7 +298,7 @@ public: if (Blind_Timer <= diff) { std::list targets; - SelectTargetList(targets, 5, SELECT_TARGET_RANDOM, me->GetMeleeReach()*5, true); + SelectTargetList(targets, 5, SELECT_TARGET_RANDOM, me->GetCombatReach()*5, true); for (std::list::const_iterator i = targets.begin(); i != targets.end(); ++i) if (!me->IsWithinMeleeRange(*i)) { -- cgit v1.2.3 From 7ab514532164cfac50abc4f45cbefc6a39b21b6a Mon Sep 17 00:00:00 2001 From: DDuarte Date: Tue, 5 Jul 2016 11:21:50 +0100 Subject: Scripts/Commands: Remove unused argument of .cometome command (cherry picked from commit 1100fe60572b186eee98b6b7cbdccf5a2d67b7e1) # Conflicts: # sql/updates/world/3.3.5/2016_07_05_01_world.sql --- sql/updates/world/3.3.5/2016_07_05_02_world.sql | 1 + src/server/scripts/Commands/cs_misc.cpp | 10 +--------- 2 files changed, 2 insertions(+), 9 deletions(-) create mode 100644 sql/updates/world/3.3.5/2016_07_05_02_world.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/3.3.5/2016_07_05_02_world.sql b/sql/updates/world/3.3.5/2016_07_05_02_world.sql new file mode 100644 index 00000000000..2921c19b0c1 --- /dev/null +++ b/sql/updates/world/3.3.5/2016_07_05_02_world.sql @@ -0,0 +1 @@ +UPDATE `command` SET `help` = 'Syntax: .cometome\nMake selected creature come to your current location (new position not saved to DB).' WHERE `command`.`name` = 'cometome'; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 7ad80352995..31af42d0010 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2183,17 +2183,9 @@ public: } return true; } - /* - ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator - Without this function 3rd party scripting library will get linking errors (unresolved external) - when attempting to use the PointMovementGenerator - */ + static bool HandleComeToMeCommand(ChatHandler* handler, char const* args) { - char const* newFlagStr = strtok((char*)args, " "); - if (!newFlagStr) - return false; - Creature* caster = handler->getSelectedCreature(); if (!caster) { -- cgit v1.2.3 From b9ec8ae3282e55ede70e289106db07d5dc70532c Mon Sep 17 00:00:00 2001 From: DDuarte Date: Tue, 5 Jul 2016 11:55:29 +0100 Subject: Scripts/Commands: Fix build warning (cherry picked from commit 42028a18421f672a3292733cac73840c4e766089) --- src/server/scripts/Commands/cs_misc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 31af42d0010..5d1e26c0ee5 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2184,7 +2184,7 @@ public: return true; } - static bool HandleComeToMeCommand(ChatHandler* handler, char const* args) + static bool HandleComeToMeCommand(ChatHandler* handler, char const* /*args*/) { Creature* caster = handler->getSelectedCreature(); if (!caster) -- cgit v1.2.3 From 48f0f47dd2c83eeb4bceff53fdb7c94bc0ce5190 Mon Sep 17 00:00:00 2001 From: Ulduar Date: Tue, 5 Jul 2016 23:27:59 +0600 Subject: [6.x] Scripts/Spells: K'ure & Decimatus, SAI + spell scripts * Core/DB Add SAI for Decimatus. Add Decimatus SAI and Dark Siphon spell condition target. * Decimatus spell script for 169869. Decimatus Transformation Sickness. * Replace caster on target. Compiling fine! And then you never know what comes into head Blizzard. * Add three spell scripts. Add support spell scripts for 189549, 189512 and 189491. --- sql/updates/world/6.x/2016_06_11_00_world.sql | 33 ++++++ src/server/scripts/Spells/spell_generic.cpp | 162 ++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 sql/updates/world/6.x/2016_06_11_00_world.sql (limited to 'src/server/scripts') diff --git a/sql/updates/world/6.x/2016_06_11_00_world.sql b/sql/updates/world/6.x/2016_06_11_00_world.sql new file mode 100644 index 00000000000..e81a39afd96 --- /dev/null +++ b/sql/updates/world/6.x/2016_06_11_00_world.sql @@ -0,0 +1,33 @@ +-- Dark Siphon +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=0 AND `SourceEntry`=165059; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,165059,0,0,31,0,3,81556 ,0,0,"","Dark Siphon – Cast only on K'ure."); + +-- Decimatus SAI +SET @ENTRY := 81989; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,11,0,100,0,0,0,0,0,11,169869,34,0,0,0,0,1,0,0,0,0,0,0,0,"Decimatus - On Respawn - Cast Transformation Sickness on Self (Need Core Handler for Spell)"), +(@ENTRY,0,1,0,0,0,100,0,9000,11000,9000,11000,11,174011,0,0,0,0,0,5,0,0,0,0,0,0,0,"Decimatus - In Combat - Cast Neutralize - Need Core Handler."), +(@ENTRY,0,2,0,0,0,100,0,27000,27000,27000,27000,11,174016,1,0,0,0,0,1,0,0,0,0,0,0,0,"Decimatus - In Combat - Cast Decimate."); + +-- spell_gen_decimatus_transformation_sickness + DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_decimatus_transformation_sickness'; + INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES + (169869,'spell_gen_decimatus_transformation_sickness'); + +-- spell_gen_azgalor_rain_of_fire_hellfire_citadel + DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_azgalor_rain_of_fire_hellfire_citadel'; + INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES + (189549,'spell_gen_azgalor_rain_of_fire_hellfire_citadel'); + +-- spell_gen_mark_of_kazrogal_hellfire + DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_mark_of_kazrogal_hellfire'; + INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES + (189512,'spell_gen_mark_of_kazrogal_hellfire'); + +-- spell_gen_anetheron_summon_towering_infernal + DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_anetheron_summon_towering_infernal'; + INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES + (189491,'spell_gen_anetheron_summon_towering_infernal'); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index cf9ff3ef28b..f0ebfb23427 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -4228,6 +4228,164 @@ class spell_gen_clear_debuffs : public SpellScriptLoader } }; +// 169869 - Transformation Sickness +class spell_gen_decimatus_transformation_sickness : public SpellScriptLoader +{ +public: + spell_gen_decimatus_transformation_sickness() : SpellScriptLoader("spell_gen_decimatus_transformation_sickness") { } + + class spell_gen_decimatus_transformation_sickness_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_decimatus_transformation_sickness_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + target->SetHealth(target->CountPctFromMaxHealth(10)); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_decimatus_transformation_sickness_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_decimatus_transformation_sickness_SpellScript(); + } +}; + +// 189491 - Summon Towering Infernal. +class spell_gen_anetheron_summon_towering_infernal : public SpellScriptLoader +{ + public: + spell_gen_anetheron_summon_towering_infernal() : SpellScriptLoader("spell_gen_anetheron_summon_towering_infernal") { } + + class spell_gen_anetheron_summon_towering_infernal_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_anetheron_summon_towering_infernal_SpellScript); + + void HandleDummy(SpellEffIndex /* effIndex */) + { + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_anetheron_summon_towering_infernal_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_anetheron_summon_towering_infernal_SpellScript(); + } +}; + +enum KazrogalHellfireMark +{ + SPELL_MARK_OF_KAZROGAL_HELLFIRE = 189512, + SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE = 189515 +}; + +class MarkTargetHellfireFilter +{ + public: + bool operator()(WorldObject* target) const + { + if (Unit* unit = target->ToUnit()) + return unit->getPowerType() != POWER_MANA; + return false; + } +}; + +class spell_gen_mark_of_kazrogal_hellfire : public SpellScriptLoader +{ + public: + spell_gen_mark_of_kazrogal_hellfire() : SpellScriptLoader("spell_gen_mark_of_kazrogal_hellfire") { } + + class spell_gen_mark_of_kazrogal_hellfire_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_mark_of_kazrogal_hellfire_SpellScript); + + void FilterTargets(std::list& targets) + { + targets.remove_if(MarkTargetHellfireFilter()); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_mark_of_kazrogal_hellfire_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + class spell_gen_mark_of_kazrogal_hellfire_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_mark_of_kazrogal_hellfire_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE)) + return false; + return true; + } + + void OnPeriodic(AuraEffect const* aurEff) + { + Unit* target = GetTarget(); + + if (target->GetPower(POWER_MANA) == 0) + { + target->CastSpell(target, SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE, true, NULL, aurEff); + // Remove aura + SetDuration(0); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_mark_of_kazrogal_hellfire_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_POWER_BURN); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_mark_of_kazrogal_hellfire_SpellScript(); + } + + AuraScript* GetAuraScript() const override + { + return new spell_gen_mark_of_kazrogal_hellfire_AuraScript(); + } +}; + +class spell_gen_azgalor_rain_of_fire_hellfire_citadel : public SpellScriptLoader +{ + public: + spell_gen_azgalor_rain_of_fire_hellfire_citadel() : SpellScriptLoader("spell_gen_azgalor_rain_of_fire_hellfire_citadel") { } + + class spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript); + + void HandleDummy(SpellEffIndex /* effIndex */) + { + GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -4318,4 +4476,8 @@ void AddSC_generic_spell_scripts() new spell_gen_mixology_bonus(); new spell_gen_landmine_knockback_achievement(); new spell_gen_clear_debuffs(); + new spell_gen_decimatus_transformation_sickness(); + new spell_gen_anetheron_summon_towering_infernal(); + new spell_gen_mark_of_kazrogal_hellfire(); + new spell_gen_azgalor_rain_of_fire_hellfire_citadel(); } -- cgit v1.2.3