• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Elemental Damage

peteralto

Member
Joined
Nov 1, 2020
Messages
93
Solutions
1
Reaction score
17
I'm trying to use an weapon elemental damage script. However, even setting the minimum and maximum value, the damage obtained is much lower.

In the example is with minimum 100 maximum 130, but it ends up hitting 40-50, using ice element in dragon. I imagine there's something wrong with the formula.

weapons/scripts/
Lua:
local DamageTypes = {
    -- [1] = {DamageType = COMBAT_HOLYDAMAGE, DamageEffect = CONST_ANI_HOLY},
    [2] = {DamageType = COMBAT_FIREDAMAGE, DamageEffect = CONST_ANI_FIRE},
    [3] = {DamageType = COMBAT_DEATHDAMAGE, DamageEffect = CONST_ANI_DEATH},
    [4] = {DamageType = COMBAT_POISONDAMAGE, DamageEffect = CONST_ANI_POISON},
    [5] = {DamageType = COMBAT_ENERGYDAMAGE, DamageEffect = CONST_ANI_ENERGY},
    [6] = {DamageType = COMBAT_EARTHDAMAGE, DamageEffect = CONST_ANI_EARTH},
    [7] = {DamageType = COMBAT_ICEDAMAGE, DamageEffect = CONST_ANI_ICE}
}

DamageTypeWand = {
    values = true, -- If this is set to true then it will use the min and max values. If set to false the wand will use the formula
    
    -- Damage Values min/max
    wandMinDam = 100,
    wandMaxDam = 130,
    
    -- Damage Formula
    formula = {
        wandMinDam = function(level, maglevel) return -((level / 5) + (maglevel * 1.4) + 8) end,
        wandMaxDam = function(level, maglevel) return -((level / 5) + (maglevel * 2.2) + 14) end,
    }
}

function onGetFormulaValues(player, level, maglevel)
    if DamageTypeWand.values == true then
        min = -(DamageTypeWand.wandMinDam)
        max = -(DamageTypeWand.wandMaxDam)
    else
        min = DamageTypeWand.formula.wandMinDam(level, maglevel)
        max = DamageTypeWand.formula.wandMaxDam(level, maglevel)
    end
    return min, max
end
 
local combat = {}
for k, dam_Table in pairs(DamageTypes) do
    combat[k] = Combat()
    combat[k]:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)
    combat[k]:setParameter(COMBAT_PARAM_BLOCKSHIELD, 1)
    combat[k]:setParameter(COMBAT_PARAM_TYPE, dam_Table.DamageType)
    combat[k]:setParameter(COMBAT_PARAM_DISTANCEEFFECT, dam_Table.DamageEffect)   
    
    -- _G Is used to manually define 'onGetFormulaValues' in this loop in doesnt seem to be able to find the function.
    _G['onGetFormulaValues' .. k] = onGetFormulaValues
    combat[k]:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues" .. k)
end
 
function onUseWeapon(player, var)
    local value = player:getStorageValue(10009)
    local combatUse = combat[value]
    if not combatUse then
        return true
    end
    return combatUse:execute(player, var)
end
 
Solution
XML:
<wand id="30123" level="200" mana="15" script="elemental_wand.lua" >
        <vocation name="Druid" />
</wand>
This took me an embarassingly long time to figure out.

It was the BLOCKSHIELD and BLOCKARMOR attributes that were lowering the damage.
I also 'fixed' the _G issue.

Lua:
local DamageTypes = {
    [1] = {DamageType = COMBAT_HOLYDAMAGE, DamageEffect = CONST_ANI_HOLY},
    [2] = {DamageType = COMBAT_FIREDAMAGE, DamageEffect = CONST_ANI_FIRE},
    [3] = {DamageType = COMBAT_DEATHDAMAGE, DamageEffect = CONST_ANI_DEATH},
    [4] = {DamageType = COMBAT_POISONDAMAGE, DamageEffect = CONST_ANI_POISON},
    [5] = {DamageType = COMBAT_ENERGYDAMAGE, DamageEffect = CONST_ANI_ENERGY},
    [6] =...
I'm trying to use an weapon elemental damage script. However, even setting the minimum and maximum value, the damage obtained is much lower.

In the example is with minimum 100 maximum 130, but it ends up hitting 40-50, using ice element in dragon. I imagine there's something wrong with the formula.

weapons/scripts/
Lua:
local DamageTypes = {
    -- [1] = {DamageType = COMBAT_HOLYDAMAGE, DamageEffect = CONST_ANI_HOLY},
    [2] = {DamageType = COMBAT_FIREDAMAGE, DamageEffect = CONST_ANI_FIRE},
    [3] = {DamageType = COMBAT_DEATHDAMAGE, DamageEffect = CONST_ANI_DEATH},
    [4] = {DamageType = COMBAT_POISONDAMAGE, DamageEffect = CONST_ANI_POISON},
    [5] = {DamageType = COMBAT_ENERGYDAMAGE, DamageEffect = CONST_ANI_ENERGY},
    [6] = {DamageType = COMBAT_EARTHDAMAGE, DamageEffect = CONST_ANI_EARTH},
    [7] = {DamageType = COMBAT_ICEDAMAGE, DamageEffect = CONST_ANI_ICE}
}

DamageTypeWand = {
    values = true, -- If this is set to true then it will use the min and max values. If set to false the wand will use the formula
   
    -- Damage Values min/max
    wandMinDam = 100,
    wandMaxDam = 130,
   
    -- Damage Formula
    formula = {
        wandMinDam = function(level, maglevel) return -((level / 5) + (maglevel * 1.4) + 8) end,
        wandMaxDam = function(level, maglevel) return -((level / 5) + (maglevel * 2.2) + 14) end,
    }
}

function onGetFormulaValues(player, level, maglevel)
    if DamageTypeWand.values == true then
        min = -(DamageTypeWand.wandMinDam)
        max = -(DamageTypeWand.wandMaxDam)
    else
        min = DamageTypeWand.formula.wandMinDam(level, maglevel)
        max = DamageTypeWand.formula.wandMaxDam(level, maglevel)
    end
    return min, max
end
 
local combat = {}
for k, dam_Table in pairs(DamageTypes) do
    combat[k] = Combat()
    combat[k]:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)
    combat[k]:setParameter(COMBAT_PARAM_BLOCKSHIELD, 1)
    combat[k]:setParameter(COMBAT_PARAM_TYPE, dam_Table.DamageType)
    combat[k]:setParameter(COMBAT_PARAM_DISTANCEEFFECT, dam_Table.DamageEffect)  
   
    -- _G Is used to manually define 'onGetFormulaValues' in this loop in doesnt seem to be able to find the function.
    _G['onGetFormulaValues' .. k] = onGetFormulaValues
    combat[k]:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues" .. k)
end
 
function onUseWeapon(player, var)
    local value = player:getStorageValue(10009)
    local combatUse = combat[value]
    if not combatUse then
        return true
    end
    return combatUse:execute(player, var)
end
maybe it's because your dragon has high ice protection
 
That's not the problem. He should even take more damage.

XML:
    <elements>
        <element earthPercent="80"/>
        <element energyPercent="20"/>
        <element icePercent="-10"/>
    </elements>
Try adding some prints, and figure out what's going wrong.

Lua:
function onGetFormulaValues(player, level, maglevel)
    if DamageTypeWand.values == true then
        print("Using values")
        min = -(DamageTypeWand.wandMinDam)
        max = -(DamageTypeWand.wandMaxDam)
    else
        print("Using formula")
        min = DamageTypeWand.formula.wandMinDam(level, maglevel)
        max = DamageTypeWand.formula.wandMaxDam(level, maglevel)
    end
    print(min, max)
    return min, max
end
 
Try adding some prints, and figure out what's going wrong.

Lua:
function onGetFormulaValues(player, level, maglevel)
    if DamageTypeWand.values == true then
        print("Using values")
        min = -(DamageTypeWand.wandMinDam)
        max = -(DamageTypeWand.wandMaxDam)
    else
        print("Using formula")
        min = DamageTypeWand.formula.wandMinDam(level, maglevel)
        max = DamageTypeWand.formula.wandMaxDam(level, maglevel)
    end
    print(min, max)
    return min, max
end

elemental.png

 
XML:
<wand id="30123" level="200" mana="15" script="elemental_wand.lua" >
        <vocation name="Druid" />
</wand>
This took me an embarassingly long time to figure out.

It was the BLOCKSHIELD and BLOCKARMOR attributes that were lowering the damage.
I also 'fixed' the _G issue.

Lua:
local DamageTypes = {
    [1] = {DamageType = COMBAT_HOLYDAMAGE, DamageEffect = CONST_ANI_HOLY},
    [2] = {DamageType = COMBAT_FIREDAMAGE, DamageEffect = CONST_ANI_FIRE},
    [3] = {DamageType = COMBAT_DEATHDAMAGE, DamageEffect = CONST_ANI_DEATH},
    [4] = {DamageType = COMBAT_POISONDAMAGE, DamageEffect = CONST_ANI_POISON},
    [5] = {DamageType = COMBAT_ENERGYDAMAGE, DamageEffect = CONST_ANI_ENERGY},
    [6] = {DamageType = COMBAT_EARTHDAMAGE, DamageEffect = CONST_ANI_EARTH},
    [7] = {DamageType = COMBAT_ICEDAMAGE, DamageEffect = CONST_ANI_ICE}
}

DamageTypeWand = {
    values = true, -- If this is set to true then it will use the min and max values. If set to false the wand will use the formula
   
    -- Damage Values min/max
    wandMinDam = -100,
    wandMaxDam = -130,
   
    -- Damage Formula
    formula = {
        wandMinDam = function(level, magicLevel) return -((level / 5) + (magicLevel * 1.4) + 8) end,
        wandMaxDam = function(level, magicLevel) return -((level / 5) + (magicLevel * 2.2) + 14) end,
    }
}
 
local combat = {}
for k, dam_Table in pairs(DamageTypes) do
    combat[k] = Combat()
    --combat[k]:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)
    --combat[k]:setParameter(COMBAT_PARAM_BLOCKSHIELD, 1)
    combat[k]:setParameter(COMBAT_PARAM_TYPE, dam_Table.DamageType)
    combat[k]:setParameter(COMBAT_PARAM_DISTANCEEFFECT, dam_Table.DamageEffect)  
   
    function onGetFormulaValues(player, level, maglevel)
        if DamageTypeWand.values == true then
            print("Using values")
            min = DamageTypeWand.wandMinDam
            max = DamageTypeWand.wandMaxDam
        else
            print("Using formula")
            min = DamageTypeWand.formula.wandMinDam(level, maglevel)
            max = DamageTypeWand.formula.wandMaxDam(level, maglevel)
        end
        print(min, max)
        return min, max
    end
    combat[k]:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
end
 
function onUseWeapon(player, var)
    local value = player:getStorageValue(10009)
    local combatUse = combat[value]
    if not combatUse then
        return true
    end
    return combatUse:execute(player, var)
end
 
Last edited:
Solution
This took me an embarassingly long time to figure out.

It was the BLOCKSHIELD and BLOCKARMOR attributes that were lowering the damage.
I also 'fixed' the _G issue.

Lua:
local DamageTypes = {
    [1] = {DamageType = COMBAT_HOLYDAMAGE, DamageEffect = CONST_ANI_HOLY},
    [2] = {DamageType = COMBAT_FIREDAMAGE, DamageEffect = CONST_ANI_FIRE},
    [3] = {DamageType = COMBAT_DEATHDAMAGE, DamageEffect = CONST_ANI_DEATH},
    [4] = {DamageType = COMBAT_POISONDAMAGE, DamageEffect = CONST_ANI_POISON},
    [5] = {DamageType = COMBAT_ENERGYDAMAGE, DamageEffect = CONST_ANI_ENERGY},
    [6] = {DamageType = COMBAT_EARTHDAMAGE, DamageEffect = CONST_ANI_EARTH},
    [7] = {DamageType = COMBAT_ICEDAMAGE, DamageEffect = CONST_ANI_ICE}
}

DamageTypeWand = {
    values = true, -- If this is set to true then it will use the min and max values. If set to false the wand will use the formula
   
    -- Damage Values min/max
    wandMinDam = -100,
    wandMaxDam = -130,
   
    -- Damage Formula
    formula = {
        wandMinDam = function(level, magicLevel) return -((level / 5) + (magicLevel * 1.4) + 8) end,
        wandMaxDam = function(level, magicLevel) return -((level / 5) + (magicLevel * 2.2) + 14) end,
    }
}
 
local combat = {}
for k, dam_Table in pairs(DamageTypes) do
    combat[k] = Combat()
    --combat[k]:setParameter(COMBAT_PARAM_BLOCKARMOR, 1)
    --combat[k]:setParameter(COMBAT_PARAM_BLOCKSHIELD, 1)
    combat[k]:setParameter(COMBAT_PARAM_TYPE, dam_Table.DamageType)
    combat[k]:setParameter(COMBAT_PARAM_DISTANCEEFFECT, dam_Table.DamageEffect)  
   
    function onGetFormulaValues(player, level, maglevel)
        if DamageTypeWand.values == true then
            print("Using values")
            min = -(DamageTypeWand.wandMinDam)
            max = -(DamageTypeWand.wandMaxDam)
        else
            print("Using formula")
            min = DamageTypeWand.formula.wandMinDam(level, maglevel)
            max = DamageTypeWand.formula.wandMaxDam(level, maglevel)
        end
        print(min, max)
        return min, max
    end
    combat[k]:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
end
 
function onUseWeapon(player, var)
    local value = player:getStorageValue(10009)
    local combatUse = combat[value]
    if not combatUse then
        return true
    end
    return combatUse:execute(player, var)
end

There was no error in the distro, but now hits are not doing damage.
 
Back
Top