• 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 Spell that requires an item + sets cooldown

Heszek

New Member
Joined
Apr 12, 2018
Messages
5
Reaction score
1
Hello! I've had some issues with merging the neccessity of a certain weapon ID on yourself whilst also setting a storage that sets a cooldown for a spell.

For example , I have this spell:
Lua:
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, 34)


function onGetFormulaValues(player, skill, attack, factor)
    local distanceSkill = player:getEffectiveSkillLevel(SKILL_DEXTERITY)
    local min = (player:getLevel() / 5) + distanceSkill * 0.7
    local max = (player:getLevel() / 5) + distanceSkill + 5
    return -min, -max
end
combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onCastSpell(creature, variant)
    return combat:execute(creature, variant)
end

function onCastSpell(creature, var)
local weapons = {26649, 26657, 26661, 26665, 26669, 26673, 26677}
        local slotWeapon = CONST_SLOT_LEFT
        local playerWeapon = creature:getSlotItem(slotWeapon)
        if playerWeapon and table.contains(weapons, playerWeapon:getId()) then
            return combat:execute(creature, var)
    end

    creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 2 bow type weapon in your left hand to use that technique.")
    return false


end
And i'd love to add this part, not sure how tho:
Lua:
local player = Player(creature)
    if player:getStorageValue(55555) >= os.time() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
        return false
    end
player:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds
    return combat:execute(creature, variant)
end

I've managed to create a spell that has few events and it's working, but this problem solution is a mystery for me - hope some good souls could give me a lesson on that? :D

(the spell that i've managed to create in case someone wants to use that system in the future and can't figure out how)
Lua:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat1, COMBAT_PARAM_USECHARGES, true)
local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat2, COMBAT_PARAM_USECHARGES, true)
local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT)
setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat3, COMBAT_PARAM_USECHARGES, true)


local area1 = createCombatArea(AREA_BEAM1)
local area2 = createCombatArea(AREA_BEAM1)
local area3 = createCombatArea(AREA_BEAM1)

setCombatArea(combat1, area1)
setCombatArea(combat2, area2)
setCombatArea(combat3, area3)


function onGetFormulaValues1(player, skill, attack, factor)
    local attackTotal = (attack/2)
    local min = (player:getLevel() / 2) + (skill * attackTotal * 0.02) + 2
    local max = (player:getLevel() / 2) + (skill * attackTotal * 0.025) + 5
    return -min, -max
end
function onGetFormulaValues2(player, skill, attack, factor)
    local attackTotal = (attack/2)
    local min = (player:getLevel() / 2) + (skill * attackTotal * 0.02) + 2
    local max = (player:getLevel() / 2) + (skill * attackTotal * 0.025) + 5
    return -min, -max
end
function onGetFormulaValues3(player, skill, attack, factor)
    local attackTotal = (attack/2)
    local min = (player:getLevel() / 2) + (skill * attackTotal * 0.02) + 2
    local max = (player:getLevel() / 2) + (skill * attackTotal * 0.025) + 5
    return -min, -max
end



setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues1")
setCombatCallback(combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues2")
setCombatCallback(combat3, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues3")



function onCastSpell(creature, variant)
local weapons = {26662, 26666, 26670, 26674, 26678}
        local slotWeapon = CONST_SLOT_LEFT
        local playerWeapon = creature:getSlotItem(slotWeapon)
        if playerWeapon and table.contains(weapons, playerWeapon:getId()) then
        addEvent(doCombat, 0, creature:getId(), combat1, variant)
        addEvent(doCombat, 170, creature:getId(), combat2, variant)
        addEvent(doCombat, 340, creature:getId(), combat3, variant)
    return true
    else
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 3 crossbow type weapon in your left hand to use that technique.")
    return false


end
end

Have a nice day dear reader!
 
Solution
Hello! I've had some issues with merging the neccessity of a certain weapon ID on yourself whilst also setting a storage that sets a cooldown for a spell.

For example , I have this spell:
Lua:
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, 34)


function onGetFormulaValues(player, skill, attack, factor)
    local distanceSkill = player:getEffectiveSkillLevel(SKILL_DEXTERITY)
    local min = (player:getLevel() / 5) + distanceSkill * 0.7
    local max = (player:getLevel() / 5) + distanceSkill + 5
    return -min, -max
end
combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onCastSpell(creature, variant)
    return...
Hello! I've had some issues with merging the neccessity of a certain weapon ID on yourself whilst also setting a storage that sets a cooldown for a spell.

For example , I have this spell:
Lua:
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, 34)


function onGetFormulaValues(player, skill, attack, factor)
    local distanceSkill = player:getEffectiveSkillLevel(SKILL_DEXTERITY)
    local min = (player:getLevel() / 5) + distanceSkill * 0.7
    local max = (player:getLevel() / 5) + distanceSkill + 5
    return -min, -max
end
combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onCastSpell(creature, variant)
    return combat:execute(creature, variant)
end

function onCastSpell(creature, var)
local weapons = {26649, 26657, 26661, 26665, 26669, 26673, 26677}
        local slotWeapon = CONST_SLOT_LEFT
        local playerWeapon = creature:getSlotItem(slotWeapon)
        if playerWeapon and table.contains(weapons, playerWeapon:getId()) then
            return combat:execute(creature, var)
    end

    creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 2 bow type weapon in your left hand to use that technique.")
    return false


end
And i'd love to add this part, not sure how tho:
Lua:
local player = Player(creature)
    if player:getStorageValue(55555) >= os.time() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
        return false
    end
player:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds
    return combat:execute(creature, variant)
end

I've managed to create a spell that has few events and it's working, but this problem solution is a mystery for me - hope some good souls could give me a lesson on that? :D

(the spell that i've managed to create in case someone wants to use that system in the future and can't figure out how)
Lua:
local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat1, COMBAT_PARAM_USECHARGES, true)
local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat2, COMBAT_PARAM_USECHARGES, true)
local combat3 = createCombatObject()
setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BOLT)
setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
setCombatParam(combat3, COMBAT_PARAM_USECHARGES, true)


local area1 = createCombatArea(AREA_BEAM1)
local area2 = createCombatArea(AREA_BEAM1)
local area3 = createCombatArea(AREA_BEAM1)

setCombatArea(combat1, area1)
setCombatArea(combat2, area2)
setCombatArea(combat3, area3)


function onGetFormulaValues1(player, skill, attack, factor)
    local attackTotal = (attack/2)
    local min = (player:getLevel() / 2) + (skill * attackTotal * 0.02) + 2
    local max = (player:getLevel() / 2) + (skill * attackTotal * 0.025) + 5
    return -min, -max
end
function onGetFormulaValues2(player, skill, attack, factor)
    local attackTotal = (attack/2)
    local min = (player:getLevel() / 2) + (skill * attackTotal * 0.02) + 2
    local max = (player:getLevel() / 2) + (skill * attackTotal * 0.025) + 5
    return -min, -max
end
function onGetFormulaValues3(player, skill, attack, factor)
    local attackTotal = (attack/2)
    local min = (player:getLevel() / 2) + (skill * attackTotal * 0.02) + 2
    local max = (player:getLevel() / 2) + (skill * attackTotal * 0.025) + 5
    return -min, -max
end



setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues1")
setCombatCallback(combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues2")
setCombatCallback(combat3, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues3")



function onCastSpell(creature, variant)
local weapons = {26662, 26666, 26670, 26674, 26678}
        local slotWeapon = CONST_SLOT_LEFT
        local playerWeapon = creature:getSlotItem(slotWeapon)
        if playerWeapon and table.contains(weapons, playerWeapon:getId()) then
        addEvent(doCombat, 0, creature:getId(), combat1, variant)
        addEvent(doCombat, 170, creature:getId(), combat2, variant)
        addEvent(doCombat, 340, creature:getId(), combat3, variant)
    return true
    else
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 3 crossbow type weapon in your left hand to use that technique.")
    return false


end
end

Have a nice day dear reader!

So function onCastSpell(creature, variant) in the function, creature is the person casting the spell.

so when you want to add
Lua:
local player = Player(creature)
if player:getStorageValue(55555) >= os.time() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
    return false
end
player:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds

You just need to change it like this
Lua:
if creature:getStorageValue(55555) >= os.time() then
    creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
    return false
end
creature:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds

To add it to your spell, we can see that the if statement is checking for the cooldown, so you want to do that before anything else.
So add that directly under the onCast portion.
the last part is setting the cooldown. creature:setStorageValue(55555, os.time() + 2)
You only want to set the cooldown if the spell casts correctly, so put it in with your addEvents.

(and I'm going to fix up the logic, so the spell reads better.)
Here's what it looks like in the end.

Lua:
-- locals that don't change, should be left outside of the function
local weapons = {26662, 26666, 26670, 26674, 26678}
local slotWeapon = CONST_SLOT_LEFT

function onCastSpell(creature, variant)
    -- check for cooldown
    if creature:getStorageValue(55555) >= os.time() then
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
        return false
    end
    
    local playerWeapon = creature:getSlotItem(slotWeapon)
    
    -- check for weapon
    -- we are using the 'not' operator to flip the logic around.
    -- 'if the player has an item in that slot AND if the table of accepted weapons DOES NOT contain the players weapon_id
    if playerWeapon and not table.contains(weapons, playerWeapon:getId()) then
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 3 crossbow type weapon in your left hand to use that technique.")
        return false
    end
    
    -- and here we set the cooldown, and cast the spell successfully
    creature:setStorageValue(55555, os.time() + 2) -- set the cooldown
    addEvent(doCombat, 0, creature:getId(), combat1, variant)
    addEvent(doCombat, 170, creature:getId(), combat2, variant)
    addEvent(doCombat, 340, creature:getId(), combat3, variant)
    return true
end
 
Solution
So function onCastSpell(creature, variant) in the function, creature is the person casting the spell.

so when you want to add
Lua:
local player = Player(creature)
if player:getStorageValue(55555) >= os.time() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
    return false
end
player:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds

You just need to change it like this
Lua:
if creature:getStorageValue(55555) >= os.time() then
    creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
    return false
end
creature:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds

To add it to your spell, we can see that the if statement is checking for the cooldown, so you want to do that before anything else.
So add that directly under the onCast portion.
the last part is setting the cooldown. creature:setStorageValue(55555, os.time() + 2)
You only want to set the cooldown if the spell casts correctly, so put it in with your addEvents.

(and I'm going to fix up the logic, so the spell reads better.)
Here's what it looks like in the end.

Lua:
-- locals that don't change, should be left outside of the function
local weapons = {26662, 26666, 26670, 26674, 26678}
local slotWeapon = CONST_SLOT_LEFT

function onCastSpell(creature, variant)
    -- check for cooldown
    if creature:getStorageValue(55555) >= os.time() then
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
        return false
    end
   
    local playerWeapon = creature:getSlotItem(slotWeapon)
   
    -- check for weapon
    -- we are using the 'not' operator to flip the logic around.
    -- 'if the player has an item in that slot AND if the table of accepted weapons DOES NOT contain the players weapon_id
    if playerWeapon and not table.contains(weapons, playerWeapon:getId()) then
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 3 crossbow type weapon in your left hand to use that technique.")
        return false
    end
   
    -- and here we set the cooldown, and cast the spell successfully
    creature:setStorageValue(55555, os.time() + 2) -- set the cooldown
    addEvent(doCombat, 0, creature:getId(), combat1, variant)
    addEvent(doCombat, 170, creature:getId(), combat2, variant)
    addEvent(doCombat, 340, creature:getId(), combat3, variant)
    return true
end

Wonderful explanation sir!
Not only it works, but also you teached me a thing that i was trying to learn for about a month in 5 minutes :-;
Thank you very much :D
 
Why do you add storage to caster (exhaust) instead simply seting proper cooldown to a spell (cooldown/groupcooldown)? Just to display a custom „exhust message”?
 
Why do you add storage to caster (exhaust) instead simply seting proper cooldown to a spell (cooldown/groupcooldown)? Just to display a custom „exhust message”?
There are two answers to that question.
1st - setting it up on XML doesn't work for me.
2nd - to create advanced combo system where I use 7 elements, skillbooks, trinkets & 10 types of weapons w/ dualwielding it's pretty difficult to not abuse low cooldown spells. Let me show u an example: https://i.gyazo.com/857574f308dcbb842f86fe5afccee73d.mp4

When you are using the sword slash spell it puts a 500ms exhaust on ,,sword slash" group, but 1 sec on other groups to avoid abusing anotherspell->slash->anotherspell->slash for free DPS - otherwords, to balance things that are a bit more complicated than basic tibia mechanically requires the storage thing (unless you can easily add new groups in xml)

Best regards!
 
cooldown - milliseconds
groupcooldown - milliseconds

you can have groupcooldown zero (never tried) or even use separate group for that so it does not affect other spells from same group

So you say there’s some global cooldown that affects all groups, even if you create some custom group?
I’d rework whole concept of cooldown anyway if I had such mechanics in place.
So that way you could easily configure spells which are blocking all existing groups.
Or even create some config for groups to give them priorities or configure dependencies.
 
Last edited:
This example, SPELL_COOLDOWN_STORAGE is a unique storage value that is used to store the end time of the spell's cooldown. onCastSpell() function checks if the player has the required weapon equipped and if the spell is on cooldown. If the checks pass, the spell is executed, and the cooldown is set by storing the end time in the SPELL_COOLDOWN_STORAGE. The onGetFormulaValues() function is used to calculate the damage values of the spell.

Lua:
local SPELL_COOLDOWN_STORAGE = 123 -- change this to a unique storage value

function onCastSpell(creature, variant)
    local weaponID = 12345 -- change this to the ID of the required weapon
 
    -- check if the player has the required weapon equipped
    local playerWeapon = creature:getSlotItem(CONST_SLOT_LEFT)
    if not playerWeapon or playerWeapon:getId() ~= weaponID then
        creature:sendCancelMessage("You need to have the correct weapon equipped to use this spell.")
        return false
    end
 
    -- check if the spell is on cooldown
    if creature:getStorageValue(SPELL_COOLDOWN_STORAGE) > os.time() then
        creature:sendCancelMessage("The spell is still on cooldown.")
        return false
    end
 
    -- execute the spell
    local combat = Combat()
    combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
    combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, 34)
    combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
    combat:execute(creature, variant)
 
    -- set the cooldown
    creature:setStorageValue(SPELL_COOLDOWN_STORAGE, os.time() + 10) -- change 10 to the cooldown time in seconds
 
    return true
end

function onGetFormulaValues(player, skill, attack, factor)
    local distanceSkill = player:getEffectiveSkillLevel(SKILL_DEXTERITY)
    local min = (player:getLevel() / 5) + distanceSkill * 0.7
    local max = (player:getLevel() / 5) + distanceSkill + 5
    return -min, -max
end
 
Last edited:
So function onCastSpell(creature, variant) in the function, creature is the person casting the spell.

so when you want to add
Lua:
local player = Player(creature)
if player:getStorageValue(55555) >= os.time() then
    player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
    return false
end
player:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds

You just need to change it like this
Lua:
if creature:getStorageValue(55555) >= os.time() then
    creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
    return false
end
creature:setStorageValue(55555, os.time() + 2) -- last number "2"  is the cooldown in seconds

To add it to your spell, we can see that the if statement is checking for the cooldown, so you want to do that before anything else.
So add that directly under the onCast portion.
the last part is setting the cooldown. creature:setStorageValue(55555, os.time() + 2)
You only want to set the cooldown if the spell casts correctly, so put it in with your addEvents.

(and I'm going to fix up the logic, so the spell reads better.)
Here's what it looks like in the end.

Lua:
-- locals that don't change, should be left outside of the function
local weapons = {26662, 26666, 26670, 26674, 26678}
local slotWeapon = CONST_SLOT_LEFT

function onCastSpell(creature, variant)
    -- check for cooldown
    if creature:getStorageValue(55555) >= os.time() then
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You are exhausted")
        return false
    end
   
    local playerWeapon = creature:getSlotItem(slotWeapon)
   
    -- check for weapon
    -- we are using the 'not' operator to flip the logic around.
    -- 'if the player has an item in that slot AND if the table of accepted weapons DOES NOT contain the players weapon_id
    if playerWeapon and not table.contains(weapons, playerWeapon:getId()) then
        creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 3 crossbow type weapon in your left hand to use that technique.")
        return false
    end
   
    -- and here we set the cooldown, and cast the spell successfully
    creature:setStorageValue(55555, os.time() + 2) -- set the cooldown
    addEvent(doCombat, 0, creature:getId(), combat1, variant)
    addEvent(doCombat, 170, creature:getId(), combat2, variant)
    addEvent(doCombat, 340, creature:getId(), combat3, variant)
    return true
end
Hello again sir! I've managed to find a slight problem with the script - if you have a weapon in your left hand, it checks for the ID of the weapon and everything works fine - if the ID is wrong, you don't cast the spell. But if you don't wear any weapon, it doesn't check the ID, therefore you are able to cast any spell as long as your left hand is free. I thought about making certain weapons only wearable in the left hand & setting up the ,,needweapon="1"" in .xml, but it doesn't seem to work neither - the script in .lua makes it unable to check the ,,needweapon" in .xml, as far as I can understand the nature of scripting at least ;-;

Best regards!
 
@Heszek
Lua:
local leftSlotItem = creature:getSlotItem(CONST_SLOT_RIGHT)
local rightSlotItem = creature:getSlotItem(CONST_SLOT_LEFT)

local leftSlotItemId = leftSlotItem and leftSlotItem:getId() or 0
local rightSlotItemId = rightSlotItem and rightSlotItem:getId() or 0

local hasWeaponInHand = table.contains(weapons, leftSlotItemId) or table.contains(weapons, rightSlotItemId)
if not hasWeaponInHand then
    creature:sendTextMessage(MESSAGE_STATUS_SMALL, "You need at least a tier 3 crossbow type weapon in your hand to use that technique.")
    return false
end

or you could iterate over these slots to find that weapons but as it's only two checks it's probably not worth:
Lua:
local hasWeaponInHand = false
for slot = CONST_SLOT_RIGHT, CONST_SLOT_LEFT do
   local item = creature:getSlotItem(slot)
   hasWeaponInHand = hasWeaponInHand or (item and table.contains(weapons, item:getId()))
end

Or if it has to be left hand only just change this check you have to:
Lua:
if not playerWeapon or not table.contains(weapons, playerWeapon:getId()) then
 
Last edited:
Hello again sir! I've managed to find a slight problem with the script - if you have a weapon in your left hand, it checks for the ID of the weapon and everything works fine - if the ID is wrong, you don't cast the spell. But if you don't wear any weapon, it doesn't check the ID, therefore you are able to cast any spell as long as your left hand is free. I thought about making certain weapons only wearable in the left hand & setting up the ,,needweapon="1"" in .xml, but it doesn't seem to work neither - the script in .lua makes it unable to check the ,,needweapon" in .xml, as far as I can understand the nature of scripting at least ;-;

Best regards!
oops, sorry about that.
 
Back
Top