aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/DataStores/DBCEnums.h3
-rw-r--r--src/server/game/Spells/SpellInfo.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp10
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp10
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp31
5 files changed, 46 insertions, 14 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 6e2c3806d8a..dc68d9fc594 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -2287,7 +2287,8 @@ enum SpellProcsPerMinuteModType
SPELL_PPM_MOD_SPEC = 4,
SPELL_PPM_MOD_RACE = 5,
SPELL_PPM_MOD_ITEM_LEVEL = 6,
- SPELL_PPM_MOD_BATTLEGROUND = 7
+ SPELL_PPM_MOD_BATTLEGROUND = 7,
+ SPELL_PPM_MOD_AURA = 8
};
constexpr std::size_t MAX_POWERS_PER_SPELL = 5;
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 3c6d3f6504e..4eaca9be938 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -4366,6 +4366,12 @@ float SpellInfo::CalcProcPPM(Unit* caster, int32 itemLevel) const
ppm *= 1.0f + mod->Coeff;
break;
}
+ case SPELL_PPM_MOD_AURA:
+ {
+ if (caster->HasAura(mod->Param))
+ ppm *= 1.0f + mod->Coeff;
+ break;
+ }
default:
break;
}
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index 1cdad52feb1..8eef765a5b0 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
@@ -41,11 +41,11 @@ DoorData const doorData[] =
DungeonEncounterData const encounters[] =
{
- { BOSS_GLUBTOK, {{ 1064 }} },
- { BOSS_HELIX_GEARBREAKER, {{ 1065 }} },
- { BOSS_FOE_REAPER_5000, {{ 1063 }} },
- { BOSS_ADMIRAL_RIPSNARL, {{ 1062 }} },
- { BOSS_CAPTAIN_COOKIE, {{ 1060 }} },
+ { BOSS_GLUBTOK, {{ 2976, 2981 }} },
+ { BOSS_HELIX_GEARBREAKER, {{ 2977, 2982 }} },
+ { BOSS_FOE_REAPER_5000, {{ 2975, 2980 }} },
+ { BOSS_ADMIRAL_RIPSNARL, {{ 2974, 2979 }} },
+ { BOSS_CAPTAIN_COOKIE, {{ 2973, 2978 }} },
{ BOSS_VANESSA_VANCLEEF, {{ 1081 }} }
};
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
index f586c3c50a4..065c65a3110 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
@@ -24,11 +24,11 @@
DungeonEncounterData const encounters[] =
{
- { DATA_COMMANDER, {{ 519 }} },
- { DATA_MAGUS_TELESTRA, {{ 520, 521, 2010 }} },
- { DATA_ANOMALUS, {{ 522, 523, 2009 }} },
- { DATA_ORMOROK, {{ 524, 525, 2012 }} },
- { DATA_KERISTRASZA, {{ 526, 527, 2011 }} }
+ { DATA_COMMANDER, {{ 519, 3017 }} },
+ { DATA_MAGUS_TELESTRA, {{ 2010 }} },
+ { DATA_ANOMALUS, {{ 2009 }} },
+ { DATA_ORMOROK, {{ 2012 }} },
+ { DATA_KERISTRASZA, {{ 2011 }} }
};
class instance_nexus : public InstanceMapScript
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 9a88a31425d..c8d37c85acd 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -1757,17 +1757,40 @@ class spell_sha_lava_surge : public AuraScript
return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_SURGE, SPELL_SHAMAN_IGNEOUS_POTENTIAL });
}
- bool CheckProcChance(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) const
+ bool CheckProcChance(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
{
- int32 procChance = aurEff->GetAmount();
+ Unit* caster = GetTarget();
+ float flameShocks = 0.0f;
+ auto work = [&, shaman = caster->GetGUID()](Unit const* target)
+ {
+ if (target->HasAuraEffect(SPELL_SHAMAN_FLAME_SHOCK, EFFECT_1, shaman))
+ flameShocks += 1.0f;
+ };
+ Trinity::UnitWorker worker(caster, work);
+ Cell::VisitAllObjects(caster, worker, 100.0f);
+
+ // Proc uptime is not supposed to scale with the number of applied flame shocks
+ _normalizedTicks += 1.0f / flameShocks;
+
+ // first 6 ticks after last proc fail to prevent overwriting
+ if (_normalizedTicks < 6.0f)
+ return false;
+
+ float procChance = aurEff->GetAmount();
if (AuraEffect const* igneousPotential = GetTarget()->GetAuraEffect(SPELL_SHAMAN_IGNEOUS_POTENTIAL, EFFECT_0))
procChance += igneousPotential->GetAmount();
- return roll_chance_i(procChance);
+ float missChance = std::max(100 - procChance, 0.0f) / 100.0f;
+
+ procChance = (1.0f - std::pow(missChance, _normalizedTicks)) * 100.0f;
+
+ return roll_chance_f(procChance);
}
void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/)
{
+ _normalizedTicks = 0.0f;
+
PreventDefaultAction();
GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_LAVA_SURGE, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
}
@@ -1777,6 +1800,8 @@ class spell_sha_lava_surge : public AuraScript
DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_lava_surge::CheckProcChance, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectProc += AuraEffectProcFn(spell_sha_lava_surge::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
}
+
+ float _normalizedTicks = 0.0f;
};
// 77762 - Lava Surge