• 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!

TFS 0.X attempt to concatenate upvalue 'maximum' (a nil value)

sabodden

Member
Joined
Sep 27, 2019
Messages
138
Reaction score
18
Code:
[0:9:04.831] [Error - Weapon Interface] 
[0:9:04.832] data/weapons/scripts/wands_n_rods/multielements_staff.lua:onUseWeapon
[0:9:04.832] Description: 
[0:9:04.832] .../scripts/wands_n_rods/multielements_staff.lua:54: attempt to concatenate upvalue 'maximum' (a nil value)
[0:9:04.832] stack traceback:
[0:9:04.832]     .../scripts/wands_n_rods/multielements_staff.lua:54: in function <.../scripts/wands_n_rods/multielements_staff.lua:32>

what should i done to put it to work:
Code:
local wands = {
  [12031] = {ef = 36, sh = 3, dmg = COMBAT_FIREDAMAGE},
  [12032] = {ef = 42, sh = 28, dmg = COMBAT_ICEDAMAGE},
  [12033] = {ef = 45, sh = 38, dmg = COMBAT_POISONDAMAGE},
  [12034] = {ef = 17, sh = 31, dmg = COMBAT_DEATHDAMAGE},
  [12035] = {ef = 11, sh = 35, dmg = COMBAT_ENERGYDAMAGE},
  [12036] = {ef = 49, sh = 37, dmg = COMBAT_HOLYDAMAGE}
}

-- out of the onGetFormulaValues to be used in onUseWeapon
local minimum
local maximum

function onGetFormulaValues(cid, level, skill, attack, factor)
  local factorMultipler = 1
  if factor == 1.0 then -- player_fight_mode = offensive
    factorMultipler = 3
  elseif factor == 2.0 then -- player_fight_mode = defensive
    factorMultipler = 1
  else  -- player_fight_mode = balanced
    factorMultipler = 2
  end
  min = ( (spellcfg_wandnrods_min * factorMultipler) + (attack * factorMultipler * spellcfg_wand_atkMultipler) ) * -0.50
  max = ( (spellcfg_wandnrods_max * factorMultipler) + (attack * factorMultipler * spellcfg_wand_atkMultipler) ) * -1.00
  minimum = min
  maximum = max
  print("[1] minimum: " .. minimum .. "maximum " .. maximum)
  return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onUseWeapon(cid, var)
  local item1 = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
  local item2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
  local staffatk, hand1, hand2 = 0, 0, 0
  if item1.uid ~= 0 then
    hand1 = getItemInfo(item1.itemid).attack
  end
  if item2.uid ~= 0 then
    hand2 = getItemInfo(item2.itemid).attack
  end
  if hand1 > hand2 then
    staffatk = hand1
  else
    staffatk = hand2
  end
  local attackValue = staffatk

  local target = getCreatureTarget(cid)
  for str, info in pairs (wands) do
    if getPlayerStorageValue(cid, str) > 0 then
      if target ~= nil then
        doSendDistanceShoot(getThingPos(cid), getThingPos(target), info.sh)
        print("[2] minimum: " .. minimum .. "maximum " .. maximum)
        aaddEvent(doAreaCombatHealth, 100, cid, info.dmg, getThingPos(target), 0, -minimum, -maximum, info.ef)
      end
    end
  end
  return true
end
 
Solution
I didn't give up on this, but I do not know how to proceed. This script at least functions, but not fully in the way you wanted.

The problem is I don't think you can call setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "functionName")
It's just not available to weapons scripts. It seems to be limited to spell scripts only.

I will try again later, but I can't spent more time on it right now. 🤷‍♂️

Lua:
Elements = {
    FIRE   = { damage = COMBAT_FIREDAMAGE,   condition = createConditionObject(CONDITION_FIRE),     effect = CONST_ME_FIREAREA,   distance = CONST_ANI_FIRE,   combat = createCombatObject() },
    ICE    = { damage = COMBAT_ICEDAMAGE,    condition = createConditionObject(CONDITION_FREEZING), effect =...
addEvent instead of aaddEvent

Code:
[13:55:27.656] [Error - Weapon Interface] 
[13:55:27.656] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[13:55:27.656] Description: 
[13:55:27.656] (luaSetCombatCallBack) Combat not found

:(
Why?

I can use this function in other script like this:

Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)

function onGetFormulaValues(cid, level, skill, attack, factor)
    local factorMultipler = 1
    if factor == 1.0 then -- player_fight_mode = offensive
        factorMultipler = 3
    elseif factor == 2.0 then -- player_fight_mode = defensive
        factorMultipler = 1
    else  -- player_fight_mode = balanced
        factorMultipler = 2
    end
    min = ( (spellcfg_wandnrods_min * factorMultipler) + (attack * factorMultipler * spellcfg_wand_atkMultipler) ) * -0.50
    max = ( (spellcfg_wandnrods_max * factorMultipler) + (attack * factorMultipler * spellcfg_wand_atkMultipler) ) * -1.00
    return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onUseWeapon(cid, var)
    return doCombat(cid, combat, var)
end
 
Your script is incomplete. There is no combat object for the skill formula to act upon. Everything else is irrelevant, because this makes it fundamentally broken.
 
Your script is incomplete. There is no combat object for the skill formula to act upon. Everything else is irrelevant, because this makes it fundamentally broken.

did u know how to put this script with doCombat

this script use dynamic elementals, not static, i cant use, i think:
Code:
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)

could u help?

Code:
local wands = {
  [12031] = {ef = 36, sh = 3, dmg = COMBAT_FIREDAMAGE},
  [12032] = {ef = 42, sh = 28, dmg = COMBAT_ICEDAMAGE},
  [12033] = {ef = 45, sh = 38, dmg = COMBAT_POISONDAMAGE},
  [12034] = {ef = 17, sh = 31, dmg = COMBAT_DEATHDAMAGE},
  [12035] = {ef = 11, sh = 35, dmg = COMBAT_ENERGYDAMAGE},
  [12036] = {ef = 49, sh = 37, dmg = COMBAT_HOLYDAMAGE}
}

-- out of the onGetFormulaValues to be used in onUseWeapon
local minimum
local maximum

function onGetFormulaValues(cid, level, skill, attack, factor)
  local factorMultipler = 1
  if factor == 1.0 then -- player_fight_mode = offensive
    factorMultipler = 3
  elseif factor == 2.0 then -- player_fight_mode = defensive
    factorMultipler = 1
  else  -- player_fight_mode = balanced
    factorMultipler = 2
  end
  min = ( (spellcfg_wandnrods_min * factorMultipler) + (attack * factorMultipler * spellcfg_wand_atkMultipler) ) * -0.50
  max = ( (spellcfg_wandnrods_max * factorMultipler) + (attack * factorMultipler * spellcfg_wand_atkMultipler) ) * -1.00
  minimum = min
  maximum = max
  print("[1] minimum: " .. minimum .. "maximum " .. maximum)
  return min, max
end
setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onUseWeapon(cid, var)
  local item1 = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
  local item2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
  local staffatk, hand1, hand2 = 0, 0, 0
  if item1.uid ~= 0 then
    hand1 = getItemInfo(item1.itemid).attack
  end
  if item2.uid ~= 0 then
    hand2 = getItemInfo(item2.itemid).attack
  end
  if hand1 > hand2 then
    staffatk = hand1
  else
    staffatk = hand2
  end
  local attackValue = staffatk

  local target = getCreatureTarget(cid)
  for str, info in pairs (wands) do
    if getPlayerStorageValue(cid, str) > 0 then
      if target ~= nil then
        doSendDistanceShoot(getThingPos(cid), getThingPos(target), info.sh)
        print("[2] minimum: " .. minimum .. "maximum " .. maximum)
        addEvent(doAreaCombatHealth, 100, cid, info.dmg, getThingPos(target), 0, -minimum, -maximum, info.ef)
      end
    end
  end
  return true
end
 
There is many missing vars here. Where are spellcfg_wandnrods_min, spellcfg_wandnrods_max, and spellcfg_wand_atkMultipler coming from?

Where did you get this script?
 
There is many missing vars here. Where are spellcfg_wandnrods_min, spellcfg_wandnrods_max, and spellcfg_wand_atkMultipler coming from?

Where did you get this script?

from data/lib


spellcfg_wandnrods_min = 2.0
spellcfg_wandnrods_max = 4.0
spellcfg_wand_atkMultipler = 2
 
If these are globals you made, you should follow convention and make them ALLCAPSMEANSGLOBALSINGLE = true
Post automatically merged:

Based on what it seems like you trying to do... this is roughly how I'd do the same thing.

Lua:
local lookup = {
    [COMBAT_FIREDAMAGE]   = { condition = CONDITION_FIRE,     effect = CONST_ME_FIREAREA,   distance = CONST_ANI_FIRE   },
    [COMBAT_ICEDAMAGE]    = { condition = CONDITION_FREEZING, effect = CONST_ME_ICEAREA,    distance = CONST_ANI_ICE    },
    [COMBAT_POISONDAMAGE] = { condition = CONDITION_POISON,   effect = CONST_ME_POISONAREA, distance = CONST_ANI_POISON },
    [COMBAT_DEATHDAMAGE]  = { condition = CONDITION_CURSED,   effect = CONST_ME_MORTAREA,   distance = CONST_ANI_DEATH  },
    [COMBAT_ENERGYDAMAGE] = { condition = CONDITION_ENERGY,   effect = CONST_ME_ENERGYAREA, distance = CONST_ANI_ENERGY },
    [COMBAT_HOLYDAMAGE]   = { condition = CONDITION_DAZZLED,  effect = CONST_ME_HOLYAREA,   distance = CONST_ANI_HOLY   },
}

local elements = { COMBAT_FIREDAMAGE, COMBAT_ICEDAMAGE, COMBAT_POISONDAMAGE, COMBAT_DEATHDAMAGE, COMBAT_ENERGYDAMAGE, COMBAT_HOLYDAMAGE }

local breeds = {}
for _,element in ipairs(elements) do
    breeds[element] = {
        combat = createCombatObject(),
        condition = createConditionObject(lookup[element]['condition'])
    }

    local combat = breeds[element]['combat']
    local condition = breeds[element]['condition']

    setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
    addDamageCondition(condition, 7, 1000, -5)
    addDamageCondition(condition, 5, 3000, -15)
    addDamageCondition(condition, 3, 5000, -33)
    addDamageCondition(condition, 1, 7000, -100)

    setCombatArea(combat, createCombatArea(AREA_CIRCLE3X3))
    setCombatParam(combat, COMBAT_PARAM_TYPE, element)
    setCombatParam(combat, COMBAT_PARAM_EFFECT, lookup[element]['effect'])
    setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, lookup[element]['distance'])
    --setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 10, 10, 3.6, 3.6)
    setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
    setCombatCondition(combat, condition)

end

local powers = {
    [12031] = { element = COMBAT_FIREDAMAGE   },
    [12032] = { element = COMBAT_ICEDAMAGE    },
    [12033] = { element = COMBAT_POISONDAMAGE },
    [12034] = { element = COMBAT_DEATHDAMAGE  },
    [12035] = { element = COMBAT_ENERGYDAMAGE },
    [12036] = { element = COMBAT_HOLYDAMAGE   },
}

function getAttack(cid)
    local hand1, hand2 = 0, 0
    local item1 = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
    local item2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
    if item1.uid ~= 0 then
        hand1 = getItemInfo(item1.itemid).attack
    end
    if item2.uid ~= 0 then
        hand2 = getItemInfo(item2.itemid).attack
    end

    return math.max(hand1,hand2)
end


function onGetFormulaValues(cid, level, skill, attack, factor)
    --[[
        factor == 1.0 == player_fight_mode = offensive
        factor == 2.0 == player_fight_mode = balanced
        factor == 3.0 ?= player_fight_mode = defensive
    ]]
    local factorMultipler = 1
    if factor == 1.0 then 
        factorMultipler = 3
    elseif factor == 2.0 then
        factorMultipler = 1
    else
        factorMultipler = 2
    end
    local myOwnAttackWithBlackjackAndHookers = getAttack(cid)

    min = ((spellcfg_wandnrods_min * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -0.50
    max = ((spellcfg_wandnrods_max * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -1.00
    print("[1] minimum: " .. min .. "maximum " .. max)
    return min, max
end


function onUseWeapon(cid, var)
    local function helper(f, n, a, ...)
      if n > 0 then return f(a), helper(f, n-1, ...) end
    end
    local function map(f, ...)
      return helper(f, select('#', ...), ...)
    end
    local function evoke(combat)
      return doCombat(cid, combat, var)
    end

    local hydra = {}
    local anything = false;
    for unlocked, power in pairs (powers) do
        if getPlayerStorageValue(cid, unlocked) > 0 then
            anything = true
            table.push(hydra, breeds[power.element])
        end
    end
    return anything and map(evoke, unpack(hydra)) or false
end
 
Last edited:
If these are globals you made, you should follow convention and make them ALLCAPSMEANSGLOBALSINGLE = true
Post automatically merged:

Based on what it seems like you trying to do... this is roughly how I'd do the same thing.

Lua:
local lookup = {
    [COMBAT_FIREDAMAGE]   = { condition = CONDITION_FIRE,     effect = CONST_ME_FIREAREA,   distance = CONST_ANI_FIRE   },
    [COMBAT_ICEDAMAGE]    = { condition = CONDITION_FREEZING, effect = CONST_ME_ICEAREA,    distance = CONST_ANI_ICE    },
    [COMBAT_POISONDAMAGE] = { condition = CONDITION_POISON,   effect = CONST_ME_POISONAREA, distance = CONST_ANI_POISON },
    [COMBAT_DEATHDAMAGE]  = { condition = CONDITION_CURSED,   effect = CONST_ME_MORTAREA,   distance = CONST_ANI_DEATH  },
    [COMBAT_ENERGYDAMAGE] = { condition = CONDITION_ENERGY,   effect = CONST_ME_ENERGYAREA, distance = CONST_ANI_ENERGY },
    [COMBAT_HOLYDAMAGE]   = { condition = CONDITION_DAZZLED,  effect = CONST_ME_HOLYAREA,   distance = CONST_ANI_HOLY   },
}

local elements = { COMBAT_FIREDAMAGE, COMBAT_ICEDAMAGE, COMBAT_POISONDAMAGE, COMBAT_DEATHDAMAGE, COMBAT_ENERGYDAMAGE, COMBAT_HOLYDAMAGE }

local breeds = {}
for _,element in ipairs(elements) do
    breeds[element] = {
        combat = createCombatObject(),
        condition = createConditionObject(lookup[element]['condition'])
    }

    local combat = breeds[element]['combat']
    local condition = breeds[element]['condition']

    setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
    addDamageCondition(condition, 7, 1000, -5)
    addDamageCondition(condition, 5, 3000, -15)
    addDamageCondition(condition, 3, 5000, -33)
    addDamageCondition(condition, 1, 7000, -100)

    setCombatArea(combat, createCombatArea(AREA_CIRCLE3X3))
    setCombatParam(combat, COMBAT_PARAM_TYPE, element)
    setCombatParam(combat, COMBAT_PARAM_EFFECT, lookup[element]['effect'])
    setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, lookup[element]['distance'])
    --setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 10, 10, 3.6, 3.6)
    setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
    setCombatCondition(combat, condition)

end

local powers = {
    [12031] = { element = COMBAT_FIREDAMAGE   },
    [12032] = { element = COMBAT_ICEDAMAGE    },
    [12033] = { element = COMBAT_POISONDAMAGE },
    [12034] = { element = COMBAT_DEATHDAMAGE  },
    [12035] = { element = COMBAT_ENERGYDAMAGE },
    [12036] = { element = COMBAT_HOLYDAMAGE   },
}

function getAttack(cid)
    local hand1, hand2 = 0, 0
    local item1 = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
    local item2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
    if item1.uid ~= 0 then
        hand1 = getItemInfo(item1.itemid).attack
    end
    if item2.uid ~= 0 then
        hand2 = getItemInfo(item2.itemid).attack
    end

    return math.max(hand1,hand2)
end


function onGetFormulaValues(cid, level, skill, attack, factor)
    --[[
        factor == 1.0 == player_fight_mode = offensive
        factor == 2.0 == player_fight_mode = balanced
        factor == 3.0 ?= player_fight_mode = defensive
    ]]
    local factorMultipler = 1
    if factor == 1.0 then
        factorMultipler = 3
    elseif factor == 2.0 then
        factorMultipler = 1
    else
        factorMultipler = 2
    end
    local myOwnAttackWithBlackjackAndHookers = getAttack(cid)

    min = ((spellcfg_wandnrods_min * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -0.50
    max = ((spellcfg_wandnrods_max * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -1.00
    print("[1] minimum: " .. min .. "maximum " .. max)
    return min, max
end


function onUseWeapon(cid, var)
    local function helper(f, n, a, ...)
      if n > 0 then return f(a), helper(f, n-1, ...) end
    end
    local function map(f, ...)
      return helper(f, select('#', ...), ...)
    end
    local function evoke(combat)
      return doCombat(cid, combat, var)
    end

    local hydra = {}
    local anything = false;
    for unlocked, power in pairs (powers) do
        if getPlayerStorageValue(cid, unlocked) > 0 then
            anything = true
            table.push(hydra, breeds[power.element])
        end
    end
    return anything and map(evoke, unpack(hydra)) or false
end

Code:
[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface] 
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description: 
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback
 
literally zero effort curating feedback
Code:
[20:26:10.522] [Error - Weapon Interface]
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description:
[20:26:10.522] (luaSetCombatArea) Area not found
[20:26:10.522] Warning: [CallBack::loadCallBack] Event onGetFormulaValues not found.

[20:26:10.522] [Error - Weapon Interface]
[20:26:10.522] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[20:26:10.522] Description:
[20:26:10.522] (luaSetCombatCallBack) Cannot load callback

it only takes mere seconds of effort to eliminate duplicate error messages...
337987505846747136.png


Lua:
function getAttack(cid)
    local hand1, hand2 = 0, 0
    local item1 = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
    local item2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
    if item1.uid ~= 0 then
        hand1 = getItemInfo(item1.itemid).attack
    end
    if item2.uid ~= 0 then
        hand2 = getItemInfo(item2.itemid).attack
    end

    return math.max(hand1,hand2)
end

function onGetPlayerMinMaxValues(cid, level, skill, attack, factor)
    --[[
        factor == 1.0 == player_fight_mode = offensive
        factor == 2.0 == player_fight_mode = balanced
        factor == 3.0 ?= player_fight_mode = defensive
    ]]
    local factorMultipler = 1
    if factor == 1.0 then
        factorMultipler = 3
    elseif factor == 2.0 then
        factorMultipler = 1
    else
        factorMultipler = 2
    end
    local myOwnAttackWithBlackjackAndHookers = getAttack(cid)

    min = ((spellcfg_wandnrods_min * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -0.50
    max = ((spellcfg_wandnrods_max * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -1.00
    print("[1] minimum: " .. min .. "maximum " .. max)
    return min, max
end

local lookup = {
    [COMBAT_FIREDAMAGE]   = { condition = CONDITION_FIRE,     effect = CONST_ME_FIREAREA,   distance = CONST_ANI_FIRE   },
    [COMBAT_ICEDAMAGE]    = { condition = CONDITION_FREEZING, effect = CONST_ME_ICEAREA,    distance = CONST_ANI_ICE    },
    [COMBAT_POISONDAMAGE] = { condition = CONDITION_POISON,   effect = CONST_ME_POISONAREA, distance = CONST_ANI_POISON },
    [COMBAT_DEATHDAMAGE]  = { condition = CONDITION_CURSED,   effect = CONST_ME_MORTAREA,   distance = CONST_ANI_DEATH  },
    [COMBAT_ENERGYDAMAGE] = { condition = CONDITION_ENERGY,   effect = CONST_ME_ENERGYAREA, distance = CONST_ANI_ENERGY },
    [COMBAT_HOLYDAMAGE]   = { condition = CONDITION_DAZZLED,  effect = CONST_ME_HOLYAREA,   distance = CONST_ANI_HOLY   },
}

local elements = { COMBAT_FIREDAMAGE, COMBAT_ICEDAMAGE, COMBAT_POISONDAMAGE, COMBAT_DEATHDAMAGE, COMBAT_ENERGYDAMAGE, COMBAT_HOLYDAMAGE }

local breeds = {}
for _,element in ipairs(elements) do
    local area = createCombatArea(AREA_SQUARE1X1)
    local combat = createCombatObject(),
    local condition = createConditionObject(lookup[element]['condition'])

    setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
    addDamageCondition(condition, 7, 1000, -5)
    addDamageCondition(condition, 5, 3000, -15)
    addDamageCondition(condition, 3, 5000, -33)
    addDamageCondition(condition, 1, 7000, -100)

    setCombatArea(combat, area)
    setCombatParam(combat, COMBAT_PARAM_TYPE, element)
    setCombatParam(combat, COMBAT_PARAM_EFFECT, lookup[element]['effect'])
    setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, lookup[element]['distance'])
    --setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 10, 10, 3.6, 3.6)
    setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetPlayerMinMaxValues")
    setCombatCondition(combat, condition)

    breeds[element] = {
        combat = combat,
        condition = condition
    }
end

local powers = {
    [12031] = { element = COMBAT_FIREDAMAGE   },
    [12032] = { element = COMBAT_ICEDAMAGE    },
    [12033] = { element = COMBAT_POISONDAMAGE },
    [12034] = { element = COMBAT_DEATHDAMAGE  },
    [12035] = { element = COMBAT_ENERGYDAMAGE },
    [12036] = { element = COMBAT_HOLYDAMAGE   },
}

function onUseWeapon(cid, var)
    local function helper(f, n, a, ...)
      if n > 0 then return f(a), helper(f, n-1, ...) end
    end
    local function map(f, ...)
      return helper(f, select('#', ...), ...)
    end
    local function evoke(combat)
      return doCombat(cid, combat, var)
    end

    local hydra = {}
    local anything = false;
    for unlocked, power in pairs (powers) do
        if getPlayerStorageValue(cid, unlocked) > 0 then
            anything = true
            table.push(hydra, breeds[power.element]['combat'])
        end
    end
    return anything and map(evoke, unpack(hydra)) or false
end
 
this is right?
local combat = createCombatObject(),
idk, just asking




on start
Code:
[22:58:01.699] [Error - Weapon Interface] 
[22:58:01.699] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.699] Description: 
[22:58:01.699] (luaSetCombatArea) Area not found

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatArea) Area not found
[22:58:01.700] Warning: [CallBack::loadCallBack] Event onGetPlayerMinMaxValues not found.

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatCallBack) Cannot load callback

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatArea) Area not found
[22:58:01.700] Warning: [CallBack::loadCallBack] Event onGetPlayerMinMaxValues not found.

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatCallBack) Cannot load callback

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatArea) Area not found
[22:58:01.700] Warning: [CallBack::loadCallBack] Event onGetPlayerMinMaxValues not found.

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatCallBack) Cannot load callback

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatArea) Area not found
[22:58:01.700] Warning: [CallBack::loadCallBack] Event onGetPlayerMinMaxValues not found.

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatCallBack) Cannot load callback

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatArea) Area not found
[22:58:01.700] Warning: [CallBack::loadCallBack] Event onGetPlayerMinMaxValues not found.

[22:58:01.700] [Error - Weapon Interface] 
[22:58:01.700] data/weapons/scripts/wands_n_rods/multielements_staff.lua
[22:58:01.700] Description: 
[22:58:01.700] (luaSetCombatCallBack) Cannot load callback












on atk:
Code:
[22:58:37.178] [Error - Weapon Interface] 
[22:58:37.179] data/weapons/scripts/wands_n_rods/multielements_staff.lua:onUseWeapon
[22:58:37.179] Description: 
[22:58:37.179] .../scripts/wands_n_rods/multielements_staff.lua:99: attempt to call field 'push' (a nil value)
[22:58:37.179] stack traceback:
[22:58:37.179]     .../scripts/wands_n_rods/multielements_staff.lua:99: in function <.../scripts/wands_n_rods/multielements_staff.lua:83>
 
I didn't give up on this, but I do not know how to proceed. This script at least functions, but not fully in the way you wanted.

The problem is I don't think you can call setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "functionName")
It's just not available to weapons scripts. It seems to be limited to spell scripts only.

I will try again later, but I can't spent more time on it right now. 🤷‍♂️

Lua:
Elements = {
    FIRE   = { damage = COMBAT_FIREDAMAGE,   condition = createConditionObject(CONDITION_FIRE),     effect = CONST_ME_FIREAREA,   distance = CONST_ANI_FIRE,   combat = createCombatObject() },
    ICE    = { damage = COMBAT_ICEDAMAGE,    condition = createConditionObject(CONDITION_FREEZING), effect = CONST_ME_ICEAREA,    distance = CONST_ANI_ICE,    combat = createCombatObject() },
    POISON = { damage = COMBAT_POISONDAMAGE, condition = createConditionObject(CONDITION_POISON),   effect = CONST_ME_POISONAREA, distance = CONST_ANI_POISON, combat = createCombatObject() },
    DEATH  = { damage = COMBAT_DEATHDAMAGE,  condition = createConditionObject(CONDITION_CURSED),   effect = CONST_ME_MORTAREA,   distance = CONST_ANI_DEATH,  combat = createCombatObject() },
    ENERGY = { damage = COMBAT_ENERGYDAMAGE, condition = createConditionObject(CONDITION_ENERGY),   effect = CONST_ME_ENERGYAREA, distance = CONST_ANI_ENERGY, combat = createCombatObject() },
    HOLY   = { damage = COMBAT_HOLYDAMAGE,   condition = createConditionObject(CONDITION_DAZZLED),  effect = CONST_ME_HOLYAREA,   distance = CONST_ANI_HOLY,   combat = createCombatObject() },
}

function getAttack(cid)
    local hand1, hand2 = 0, 0
    local item1 = getPlayerSlotItem(cid, CONST_SLOT_LEFT)
    local item2 = getPlayerSlotItem(cid, CONST_SLOT_RIGHT)
    if item1.uid ~= 0 then
        hand1 = getItemInfo(item1.itemid).attack
    end
    if item2.uid ~= 0 then
        hand2 = getItemInfo(item2.itemid).attack
    end

    return math.max(hand1,hand2)
end

function getSpellDamage(cid, level, skill, attack, factor)
    --[[
        factor == 1.0 == player_fight_mode = offensive
        factor == 2.0 == player_fight_mode = balanced
        factor == 3.0 ?= player_fight_mode = defensive
    ]]
    local factorMultipler = 1
    if factor == 1.0 then
        factorMultipler = 3
    elseif factor == 2.0 then
        factorMultipler = 1
    else
        factorMultipler = 2
    end
    local myOwnAttackWithBlackjackAndHookers = getAttack(cid)

    min = ((spellcfg_wandnrods_min * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -0.50
    max = ((spellcfg_wandnrods_max * factorMultipler) + (myOwnAttackWithBlackjackAndHookers * factorMultipler * spellcfg_wand_atkMultipler)) * -1.00
    print("[1] minimum: " .. min .. "maximum " .. max)
    return min, max
end

local AREA_SQUARE1X1 = { -- Weapons don't get access to the spells lib
    { 1, 1, 1 },
    { 1, 3, 1 },
    { 1, 1, 1 }
}

function createPowerTable(Powers)
    local function createElementPackage(element, eTable)
        local area = createCombatArea(AREA_SQUARE1X1)
        local combat = Elements[element]['combat']
        local condition = Elements[element]['condition']

        setConditionParam(condition, CONDITION_PARAM_DELAYED, 1)
        addDamageCondition(condition, 7, 1000, -5)
        addDamageCondition(condition, 5, 3000, -15)
        addDamageCondition(condition, 3, 5000, -33)
        addDamageCondition(condition, 1, 7000, -100)

        setCombatArea(combat, area)
        setCombatParam(combat, COMBAT_PARAM_TYPE, eTable['damage'])
        setCombatParam(combat, COMBAT_PARAM_EFFECT, eTable['effect'])
        setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, eTable['distance'])
        setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 10, 10, 3.6, 3.6)
        --setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "getSpellDamage")
        setCombatCondition(combat, condition)

        local elementPackage = {
            combat = combat,
            condition = condition
        }
        return elementPackage
    end

    for element, eTable in pairs(Elements) do
        Powers[element] = createElementPackage(element, eTable)
    end

end

PowerMap = {
    [12031] = { element = 'FIRE'   },
    [12032] = { element = 'ICE'    },
    [12033] = { element = 'POISON' },
    [12034] = { element = 'DEATH'  },
    [12035] = { element = 'ENERGY' },
    [12036] = { element = 'HOLY'   },
}

Powers = {}
createPowerTable(Powers)

function onUseWeapon(cid, var)
    local function helper(f, n, a, ...)
      if n > 0 then return f(a), helper(f, n-1, ...) end
    end
    local function map(f, ...)
      return helper(f, select('#', ...), ...)
    end
    local function evoke(combat)
      return doCombat(cid, combat, var)
    end

    local hydra = {}
    local anything = false
    for unlocked, power in pairs (PowerMap) do
        if getPlayerStorageValue(cid, unlocked) > 0 then
            anything = true
            table.insert(hydra, Powers[power.element]['combat'])
        end
    end
    return anything and map(evoke, unpack(hydra)) or false
end
 
Solution
Back
Top