Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/Classes/ModStore.lua
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,11 @@ function ModStoreClass:HasMod(modType, cfg, ...)
end

function ModStoreClass:GetCondition(var, cfg, noMod)
return self.conditions[var] or (self.parent and self.parent:GetCondition(var, cfg, true)) or (not noMod and self:Flag(cfg, conditionName[var]))
if (cfg and cfg.overrideCond and cfg.overrideCond[var] ~= nil) then
return cfg.overrideCond[var]
else
return self.conditions[var] or (self.parent and self.parent:GetCondition(var, cfg, true)) or (not noMod and self:Flag(cfg, conditionName[var]))
end
end

function ModStoreClass:GetMultiplier(var, cfg, noMod)
Expand Down
8 changes: 4 additions & 4 deletions src/Data/ModCache.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5057,7 +5057,7 @@ c["Leech Life 20% slower"]={{[1]={flags=0,keywordFlags=0,name="LifeLeechRate",ty
c["Leech Life 25% faster"]={{[1]={flags=0,keywordFlags=0,name="LifeLeechRate",type="INC",value=25}},nil}
c["Leech Life 5% slower"]={{[1]={flags=0,keywordFlags=0,name="LifeLeechRate",type="INC",value=-5}},nil}
c["Leech from Critical Hits is instant"]={{[1]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="InstantLifeLeech",type="BASE",value=100},[2]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="InstantManaLeech",type="BASE",value=100},[3]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="InstantEnergyShieldLeech",type="BASE",value=100}},nil}
c["Leech recovers based on Chaos Damage as well as Physical Damage"]={nil,"Leech recovers based on Chaos Damage as well as Physical Damage "}
c["Leech recovers based on Chaos Damage as well as Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="LifeLeechBasedOnChaosDamage",type="FLAG",value=true},[2]={flags=0,keywordFlags=0,name="ManaLeechBasedOnChaosDamage",type="FLAG",value=true},[3]={flags=0,keywordFlags=0,name="EnergyShieldLeechBasedOnChaosDamage",type="FLAG",value=true}},nil}
c["Leeches 0.1% of Physical Damage as Life"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageLifeLeech",type="BASE",value=0.1}},nil}
c["Leeches 1% of maximum Life when you Cast a Spell"]={nil,"Leeches 1% of maximum Life when you Cast a Spell "}
c["Leeches 10% of Physical Damage as Life"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageLifeLeech",type="BASE",value=10}},nil}
Expand Down Expand Up @@ -5089,8 +5089,8 @@ c["Life Leech effects are not removed when Unreserved Life is Filled"]={{[1]={fl
c["Life Leech from your Hits also applies to your Companion"]={nil,"Life Leech from your Hits also applies to your Companion "}
c["Life Leech is Converted to Energy Shield Leech"]={{[1]={flags=0,keywordFlags=0,name="GhostReaver",type="FLAG",value=true}},nil}
c["Life Leech is Instant"]={{[1]={flags=0,keywordFlags=0,name="InstantLifeLeech",type="BASE",value=100}},nil}
c["Life Leech recovers based on your Chaos damage instead of Physical damage"]={nil,"Life Leech recovers based on your Chaos damage instead of Physical damage "}
c["Life Leech recovers based on your Elemental damage as well as Physical damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalAsElementalDamageLifeLeech",type="FLAG",value=true}},nil}
c["Life Leech recovers based on your Chaos damage instead of Physical damage"]={{[1]={flags=0,keywordFlags=0,name="LifeLeechBasedOnChaosDamage",type="FLAG",value=true},[2]={flags=0,keywordFlags=0,name="Condition:NoLifeLeechFromPhysicalDamage",type="FLAG",value=true}},nil}
c["Life Leech recovers based on your Elemental damage as well as Physical damage"]={{[1]={flags=0,keywordFlags=0,name="LifeLeechBasedOnElementalDamage",type="FLAG",value=true}},nil}
c["Life Leeched from Empowered Attacks is Instant"]={nil,"Life Leeched from Empowered Attacks is Instant "}
c["Life Recharges"]={nil,"Life Recharges "}
c["Life Recharges instead of Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShieldRechargeAppliesToLife",type="FLAG",value=true}},nil}
Expand Down Expand Up @@ -5142,7 +5142,7 @@ c["Mana Flasks gain 0.1 charges per Second"]={{[1]={flags=0,keywordFlags=0,name=
c["Mana Flasks gain 0.22 charges per Second"]={{[1]={flags=0,keywordFlags=0,name="ManaFlaskChargesGenerated",type="BASE",value=0.22}},nil}
c["Mana Flasks gain 0.25 charges per Second"]={{[1]={flags=0,keywordFlags=0,name="ManaFlaskChargesGenerated",type="BASE",value=0.25}},nil}
c["Mana Flasks used while on Low Mana apply Recovery Instantly"]={{[1]={[1]={type="Condition",var="LowMana"},flags=0,keywordFlags=0,name="ManaFlaskInstantRecovery",type="BASE",value=100}},nil}
c["Mana Leech recovers based on Elemental Damage Types instead of Physical Damage"]={nil,"Mana Leech recovers based on Elemental Damage Types instead of Physical Damage "}
c["Mana Leech recovers based on Elemental Damage Types instead of Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="ManaLeechBasedOnElementalDamage",type="FLAG",value=true},[2]={flags=0,keywordFlags=0,name="Condition:NoManaLeechFromPhysicalDamage",type="FLAG",value=true}},nil}
c["Mana Recovery from Regeneration is not applied"]={{[1]={flags=0,keywordFlags=0,name="UnaffectedByManaRegen",type="FLAG",value=true}},nil}
c["Mana Recovery other than Regeneration cannot Recover Mana"]={nil,"Mana Recovery other than Regeneration cannot Recover Mana "}
c["Mark Skills have 10% increased Use Speed"]={{}," Use Speed "}
Expand Down
67 changes: 51 additions & 16 deletions src/Modules/CalcOffence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3693,25 +3693,60 @@ function calcs.offence(env, actor, activeSkill)
local lifeLeech = 0
local energyShieldLeech = 0
local manaLeech = 0
if skillFlags.mine or skillFlags.trap or skillFlags.totem then
lifeLeech = skillModList:Sum("BASE", cfg, "DamageLifeLeechToPlayer")
else
if skillModList:Flag(nil, "LifeLeechBasedOnChaosDamage") then
if damageType == "Chaos" then
lifeLeech = skillModList:Sum("BASE", cfg, "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech") + enemyDB:Sum("BASE", cfg, "SelfDamageLifeLeech") / 100

-- Determine base leech value according to resource (using function to avoid repetition)
---@param resource string "Life" | "Mana" | "EnergyShield"
---@param dmgType string "Physical" | "Cold" | "Fire" | "Lightning" | "Chaos"
---@return number
local function getBaseLeech(resource, dmgType)
local leech = 0
if (not skillModList:Flag(cfg, "Condition:No" .. resource .. "LeechFrom" .. dmgType .. "Damage" )) and not (isElemental[dmgType] and skillModList:Flag(cfg, "No" .. resource .. "LeechFromElementalDamage" )) then
-- Check if converted physical leech (most PoE2 leech is physical only by default)
local convertModName, convertFlag
if isElemental[dmgType] and skillModList:Flag(cfg, resource .. "LeechBasedOnElementalDamage") then
convertFlag = resource .. "LeechBasedOnElementalDamage"
convertModName = "ElementalDamage" .. resource .. "Leech"
elseif skillModList:Flag(cfg, resource .. "LeechBasedOn".. dmgType .. "Damage") then
convertFlag = resource .. "LeechBasedOn" .. dmgType .. "Damage"
convertModName = dmgType .. "Damage" .. resource .. "Leech"
end
else
if pass == 1 and damageType == "Physical" and skillModList:Flag(nil, "PhysicalAsElementalDamageLifeLeech") then
skillModList:NewMod("ElementalDamageLifeLeech", "BASE", skillModList:Sum("BASE", cfg, "PhysicalDamageLifeLeech"), "Mystic Harvest")
if convertModName and convertFlag then
local tempCfg = copyTable(cfg, true)
tempCfg.overrideCond = { ["No" .. resource .. "LeechFromPhysicalDamage"] = false } -- Need to force Condition to `false`, to calculate original phys leech values
local physLeechMods = skillModList:Tabulate("BASE", tempCfg , "PhysicalDamage" .. resource .. "Leech")
for _, entry in ipairs(physLeechMods) do
-- Add new leech mods for that damage type with the same conditions, source, etc.
local newMod = copyTable(entry.mod)
newMod.name = convertModName
-- Tags that specifically disable Physical Damage leech need to be removed
local hasNoPhysLeech, tagIndex = modLib.hasTag(newMod, { type = "Condition", var = "No" .. resource .. "LeechFromPhysicalDamage", neg = true })
if hasNoPhysLeech then
t_remove(newMod, tagIndex)
end
if not skillModList:ReplaceModInternal(newMod) then -- using `ReplaceModInternal` instead of `ReplaceMod`, so I don't have to unpack the mod first
skillModList:AddMod(newMod)
end
end
end
leech = skillModList:Sum("BASE", cfg, "Damage" .. resource .. "Leech", dmgType.."Damage" .. resource .. "Leech", isElemental[dmgType] and "ElementalDamage" .. resource .. "Leech" or nil) + enemyDB:Sum("BASE", cfg, "SelfDamage" .. resource .. "Leech") / 100
elseif skillModList:Flag(cfg, "Condition:No" .. resource .. "LeechFrom" .. dmgType .. "Damage" ) then
-- dmgType leech should not apply, but still needs to exist for possible conversion so adding additional condition tag instead
local noLeechFlagTag = { type = "Condition", var = "No" .. resource .. "LeechFrom" .. dmgType .. "Damage", neg = true }
for _, entry in ipairs(skillModList:Tabulate("BASE", cfg, dmgType .. "Damage" .. resource .. "Leech")) do
if not modLib.hasTag(entry.mod, noLeechFlagTag) then
t_insert(entry.mod, noLeechFlagTag )
end
end
lifeLeech = skillModList:Sum("BASE", cfg, "DamageLeech", "DamageLifeLeech", damageType.."DamageLifeLeech", isElemental[damageType] and "ElementalDamageLifeLeech" or nil) + enemyDB:Sum("BASE", cfg, "SelfDamageLifeLeech") / 100
end
energyShieldLeech = skillModList:Sum("BASE", cfg, "DamageEnergyShieldLeech", damageType.."DamageEnergyShieldLeech", isElemental[damageType] and "ElementalDamageEnergyShieldLeech" or nil) + enemyDB:Sum("BASE", cfg, "SelfDamageEnergyShieldLeech") / 100
if pass == 1 and damageType == "Physical" and skillModList:Flag(nil, "PhysicalAsAllDamageManaLeech") then
skillModList:NewMod("ElementalDamageManaLeech", "BASE", skillModList:Sum("BASE", cfg, "PhysicalDamageLifeLeech"), "Ravenous Doubts")
skillModList:NewMod("ChaosDamageManaLeech", "BASE", skillModList:Sum("BASE", cfg, "PhysicalDamageLifeLeech"), "Ravenous Doubts")
end
manaLeech = skillModList:Sum("BASE", cfg, "DamageLeech", "DamageManaLeech", damageType.."DamageManaLeech", isElemental[damageType] and "ElementalDamageManaLeech" or nil) + enemyDB:Sum("BASE", cfg, "SelfDamageManaLeech") / 100
return leech and leech or 0
end

if skillFlags.mine or skillFlags.trap or skillFlags.totem then
lifeLeech = skillModList:Sum("BASE", cfg, "DamageLifeLeechToPlayer")
else
lifeLeech = getBaseLeech("Life", damageType)
energyShieldLeech = getBaseLeech("EnergyShield", damageType)
manaLeech = getBaseLeech("Mana", damageType)
end

if ghostReaver and not noLifeLeech then
Expand Down
6 changes: 6 additions & 0 deletions src/Modules/CalcSections.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,7 @@ return {
{ label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon2" },
{ label = "Totem modifiers", flag = "totem", modName = { "DamageLifeLeechToPlayer" }, modType = "BASE", cfg = "skill" },
{ label = "Enemy modifiers", modName = { "SelfDamageLifeLeech" }, modType = "BASE", enemy = true },
{ label = "Leech Conversion", modName = { "LifeLeechBasedOnPhysicalDamage", "LifeLeechBasedOnColdDamage", "LifeLeechBasedOnFireDamage", "LifeLeechBasedOnLightningDamage", "LifeLeechBasedOnElementalDamage", "LifeLeechBasedOnChaosDamage", "Condition:NoLifeLeechFromPhysicalDamage", "Condition:NoLifeLeechFromColdDamage", "Condition:NoLifeLeechFromFireDamage", "Condition:NoLifeLeechFromLightningDamage", "Condition:NoLifeLeechFromElementalDamage", "Condition:NoLifeLeechFromChaosDamage" }, cfg = "skill" },
}, },
{ label = "Life Leech per Hit", flagList = { "leechLife", "showAverage" }, { format = "{1:output:LifeLeechPerHit}",
{ breakdown = "LifeLeech" },
Expand All @@ -1109,6 +1110,7 @@ return {
{ label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon2" },
{ label = "Totem modifiers", flag = "totem", modName = { "DamageLifeLeechToPlayer" }, modType = "BASE", cfg = "skill" },
{ label = "Enemy modifiers", modName = { "SelfDamageLifeLeech" }, modType = "BASE", enemy = true },
{ label = "Leech Conversion", modName = { "LifeLeechBasedOnPhysicalDamage", "LifeLeechBasedOnColdDamage", "LifeLeechBasedOnFireDamage", "LifeLeechBasedOnLightningDamage", "LifeLeechBasedOnElementalDamage", "LifeLeechBasedOnChaosDamage", "Condition:NoLifeLeechFromPhysicalDamage", "Condition:NoLifeLeechFromColdDamage", "Condition:NoLifeLeechFromFireDamage", "Condition:NoLifeLeechFromLightningDamage", "Condition:NoLifeLeechFromElementalDamage", "Condition:NoLifeLeechFromChaosDamage" }, cfg = "skill" },
}, },
{ label = "Life Gain Rate", notFlag = "showAverage", haveOutput = "LifeOnHitRate", { format = "{1:output:LifeOnHitRate}",
{ label = "Player modifiers", notFlag = "attack", modName = "LifeOnHit", modType = "BASE", cfg = "skill" },
Expand Down Expand Up @@ -1136,6 +1138,7 @@ return {
{ label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon2" },
{ label = "Totem modifiers", flag = "totem", modName = { "DamageEnergyShieldLeechToPlayer" }, modType = "BASE", cfg = "skill" },
{ label = "Enemy modifiers", modName = { "SelfDamageEnergyShieldLeech" }, modType = "BASE", enemy = true },
{ label = "Leech Conversion", modName = { "EnergyShieldLeechBasedOnPhysicalDamage", "EnergyShieldLeechBasedOnColdDamage", "EnergyShieldLeechBasedOnFireDamage", "EnergyShieldLeechBasedOnLightningDamage", "EnergyShieldLeechBasedOnElementalDamage", "EnergyShieldLeechBasedOnChaosDamage", "Condition:NoEnergyShieldLeechFromPhysicalDamage", "Condition:NoEnergyShieldLeechFromColdDamage", "Condition:NoEnergyShieldLeechFromFireDamage", "Condition:NoEnergyShieldLeechFromLightningDamage", "Condition:NoEnergyShieldLeechFromElementalDamage", "Condition:NoEnergyShieldLeechFromChaosDamage" }, cfg = "skill" },
}, },
{ label = "ES Leech per Hit", flagList = { "leechES", "showAverage" }, { format = "{1:output:EnergyShieldLeechPerHit}",
{ breakdown = "EnergyShieldLeech" },
Expand All @@ -1144,6 +1147,7 @@ return {
{ label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon2" },
{ label = "Totem modifiers", flag = "totem", modName = { "DamageEnergyShieldLeechToPlayer" }, modType = "BASE", cfg = "skill" },
{ label = "Enemy modifiers", modName = { "SelfDamageEnergyShieldLeech" }, modType = "BASE", enemy = true },
{ label = "Leech Conversion", modName = { "EnergyShieldLeechBasedOnPhysicalDamage", "EnergyShieldLeechBasedOnColdDamage", "EnergyShieldLeechBasedOnFireDamage", "EnergyShieldLeechBasedOnLightningDamage", "EnergyShieldLeechBasedOnElementalDamage", "EnergyShieldLeechBasedOnChaosDamage", "Condition:NoEnergyShieldLeechFromPhysicalDamage", "Condition:NoEnergyShieldLeechFromColdDamage", "Condition:NoEnergyShieldLeechFromFireDamage", "Condition:NoEnergyShieldLeechFromLightningDamage", "Condition:NoEnergyShieldLeechFromElementalDamage", "Condition:NoEnergyShieldLeechFromChaosDamage" }, cfg = "skill" },
}, },
{ label = "ES Gain Rate", notFlag = "showAverage", haveOutput = "EnergyShieldOnHitRate", { format = "{1:output:EnergyShieldOnHitRate}",
{ label = "Player modifiers", notFlag = "attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "skill" },
Expand All @@ -1170,13 +1174,15 @@ return {
{ label = "Main Hand", flag = "weapon1Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon1" },
{ label = "Off Hand", flag = "weapon2Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon2" },
{ label = "Enemy modifiers", modName = { "SelfDamageManaLeech" }, modType = "BASE", cfg = "skill", enemy = true },
{ label = "Leech Conversion", modName = { "ManaLeechBasedOnPhysicalDamage", "ManaLeechBasedOnColdDamage", "ManaLeechBasedOnFireDamage", "ManaLeechBasedOnLightningDamage", "ManaLeechBasedOnElementalDamage", "ManaLeechBasedOnChaosDamage", "Condition:NoManaLeechFromPhysicalDamage", "Condition:NoManaLeechFromColdDamage", "Condition:NoManaLeechFromFireDamage", "Condition:NoManaLeechFromLightningDamage", "Condition:NoManaLeechFromElementalDamage", "Condition:NoManaLeechFromChaosDamage" }, cfg = "skill" },
}, },
{ label = "Mana Leech per Hit", flagList = { "leechMana", "showAverage" }, { format = "{1:output:ManaLeechPerHit}",
{ breakdown = "ManaLeech" },
{ label = "Player modifiers", notFlag = "attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "skill" },
{ label = "Main Hand", flag = "weapon1Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon1" },
{ label = "Off Hand", flag = "weapon2Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon2" },
{ label = "Enemy modifiers", modName = { "SelfDamageManaLeech" }, modType = "BASE", enemy = true },
{ label = "Leech Conversion", modName = { "ManaLeechBasedOnPhysicalDamage", "ManaLeechBasedOnColdDamage", "ManaLeechBasedOnFireDamage", "ManaLeechBasedOnLightningDamage", "ManaLeechBasedOnElementalDamage", "ManaLeechBasedOnChaosDamage", "Condition:NoManaLeechFromPhysicalDamage", "Condition:NoManaLeechFromColdDamage", "Condition:NoManaLeechFromFireDamage", "Condition:NoManaLeechFromLightningDamage", "Condition:NoManaLeechFromElementalDamage", "Condition:NoManaLeechFromChaosDamage" }, cfg = "skill" },
}, },
{ label = "Mana Gain Rate", notFlag = "showAverage", haveOutput = "ManaOnHitRate", { format = "{1:output:ManaOnHitRate}",
{ label = "Player modifiers", notFlag = "attack", modName = "ManaOnHit", modType = "BASE", cfg = "skill" },
Expand Down
Loading