local FieldAbsorb = MoveEvent()
function FieldAbsorb.onStepIn(player, item, position, fromPosition)
-- Validate player
if not player or not player:isPlayer() then
return true
end
-- Field type configuration table (more maintainable than if/else chains)
local fieldConfig = {
-- Poison fields
[1490] = {type = CONDITION_POISON, tick = 3000, cycles = 100, initDmg = 0, startVal = 5, effect = CONST_ME_GREEN_RINGS},
[1496] = {type = CONDITION_POISON, tick = 3000, cycles = 100, initDmg = 0, startVal = 5, effect = CONST_ME_GREEN_RINGS},
[1503] = {type = CONDITION_POISON, tick = 3000, cycles = 100, initDmg = 0, startVal = 5, effect = CONST_ME_GREEN_RINGS},
-- Big fire fields
[1487] = {type = CONDITION_FIRE, tick = 8000, cycles = 70, initDmg = 20, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1492] = {type = CONDITION_FIRE, tick = 8000, cycles = 70, initDmg = 20, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1500] = {type = CONDITION_FIRE, tick = 8000, cycles = 70, initDmg = 20, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1423] = {type = CONDITION_FIRE, tick = 8000, cycles = 70, initDmg = 20, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
-- Small fire fields
[1488] = {type = CONDITION_FIRE, tick = 8000, cycles = 50, initDmg = 10, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1493] = {type = CONDITION_FIRE, tick = 8000, cycles = 50, initDmg = 10, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1501] = {type = CONDITION_FIRE, tick = 8000, cycles = 50, initDmg = 10, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1424] = {type = CONDITION_FIRE, tick = 8000, cycles = 50, initDmg = 10, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
[1425] = {type = CONDITION_FIRE, tick = 8000, cycles = 50, initDmg = 10, startVal = 10, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_HITBYFIRE},
-- Energy fields
[1491] = {type = CONDITION_ENERGY, tick = 10000, cycles = 25, initDmg = 30, startVal = 25, combat = COMBAT_ENERGYDAMAGE, effect = CONST_ME_HITBYENERGY},
[1495] = {type = CONDITION_ENERGY, tick = 10000, cycles = 25, initDmg = 30, startVal = 25, combat = COMBAT_ENERGYDAMAGE, effect = CONST_ME_HITBYENERGY},
[1504] = {type = CONDITION_ENERGY, tick = 10000, cycles = 25, initDmg = 30, startVal = 25, combat = COMBAT_ENERGYDAMAGE, effect = CONST_ME_HITBYENERGY}
}
-- Get field configuration
local config = fieldConfig[item:getId()]
if not config then
return true
end
-- Calculate damage reduction based on player's resistances
local damageReduction = 0
-- NEW: Use player:getAttribute() instead of inventory scanning
if config.type == CONDITION_POISON then
damageReduction = player:getAttribute(ATTR_EARTH_REDUCTION) + player:getAttribute(ATTR_ELEMENTAL_REDUCTION)
elseif config.type == CONDITION_FIRE then
damageReduction = player:getAttribute(ATTR_FIRE_REDUCTION) + player:getAttribute(ATTR_ELEMENTAL_REDUCTION)
elseif config.type == CONDITION_ENERGY then
damageReduction = player:getAttribute(ATTR_ENERGY_REDUCTION) + player:getAttribute(ATTR_ELEMENTAL_REDUCTION)
end
-- Apply damage reduction
local finalInitDmg = math.ceil(config.initDmg * (1 - damageReduction / 100))
local finalStartVal = math.ceil(config.startVal * (1 - damageReduction / 100))
-- Apply initial damage/effect
if config.combat then
doTargetCombat(0, player, config.combat, -finalInitDmg, -finalInitDmg, config.effect, true, false, false)
else
player:getPosition():sendMagicEffect(config.effect)
end
-- Create and apply condition
local condition = Condition(config.type)
-- Type-specific parameters
if config.type == CONDITION_FIRE then
local condition = Condition(CONDITION_FIRE)
condition:setParameter(CONDITION_PARAM_DELAYED, true)
condition:addDamage(6, 8000, -finalStartVal)
player:addCondition(condition)
elseif config.type == CONDITION_POISON then
local condition = Condition(CONDITION_POISON)
condition:setParameter(CONDITION_PARAM_DELAYED, true)
condition:setParameter(CONDITION_PARAM_MINVALUE, 70) -- Minimum damage
condition:setParameter(CONDITION_PARAM_MAXVALUE, 100) -- Maximum damage
condition:setParameter(CONDITION_PARAM_STARTVALUE, -finalStartVal) -- Starting damage
condition:setParameter(CONDITION_PARAM_TICKINTERVAL, 4000) -- 5 seconds interval
condition:setParameter(CONDITION_PARAM_FORCEUPDATE, true)
condition:setParameter(CONDITION_PARAM_DURATION, 240000) -- 240 seconds (4 minutes)
player:addCondition(condition)
elseif config.type == CONDITION_ENERGY then
local condition = Condition(CONDITION_ENERGY)
condition:setParameter(CONDITION_PARAM_DELAYED, true)
condition:addDamage(0, 10000, -finalStartVal)
player:addCondition(condition)
end
return true
end
-- Register all field types
FieldAbsorb:id(1490, 1496, 1503) -- Poison fields
FieldAbsorb:id(1487, 1492, 1500, 1423) -- Big fire fields
FieldAbsorb:id(1488, 1493, 1501, 1424, 1425) -- Small fire fields
FieldAbsorb:id(1491, 1495, 1504) -- Energy fields
FieldAbsorb:register()