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

how to add new attributes in that script ?

demonrage

New Member
Joined
Oct 28, 2014
Messages
22
Reaction score
2
Hello, I added new attributes to items;
criticalHitChance, dodgeChance, lifeAbsorb, manaAbsorb, lifeLeech, manaLeech
and I would like to implement them in this slots system, how can I do that?
I use otx2

Action:
Lua:
--[[
Slot system 100% by mock \o
]]
---Config
local conf = {
    maxSlotCount=1,
    ignoredIds={}
}
--End
function choose(...) --- Function by mock.
    local arg = {...}
    return arg[math.random(1,#arg)]
end
if not getItemAttack then
    function getItemAttack(uid)
        return getItemAttribute(uid,'attack')
    end
    function getItemDefense(uid)
        return getItemAttribute(uid,'defense')
    end
end
local function isArmor(uid) -- Function by Mock the bear.
    if (getItemInfo(uid.itemid).armor ~= 0) and (getItemWeaponType(uid.uid) == 0) then
        return true
    end
    return false
end
local function isWeapon(uid) -- Function by Mock the bear.
    uid = uid or 0
    local f = getItemWeaponType(uid)
    if f == 1 or f == 2 or f == 3 then
        return true
    end
    return false
end
local function isShield(uid) -- Function by Mock the bear.
    uid = uid or 0
    if getItemWeaponType(uid) == 4 then
        return true
    end
    return false
end
local function isBow(uid) -- Function by Mock the bear.
    uid = uid or 0
    if getItemWeaponType(uid) == 5 and not isItemStackable(uid) then
        return true
    end
    return false
end

local function getper()
local min, max = 1, 5
    return math.random(min, max)
end
local function getSlotCount(nam)
    local c = 0
    for _ in nam:gmatch('%[(.-)%]') do
        c = c+1
    end
    return c
end
local function getSlots(nam)
    local c = {}
    for slot in nam:gmatch('%[(.-)%]') do
        table.insert(c, slot)
    end
    return c
end


local removeUpgrade = {
    [11971] = "all" -- "all", "last" or "first"
}

function onUse(cid, item, fromPosition, itemEx, toPosition) -- Script by mock the bear (MTB)
    if removeUpgrade[item.itemid] then
        if item.uid == 0 or item.itemid == 0 then return false end
        toPosition.stackpos = 255
        if isInArray(conf.ignoredIds, itemEx.itemid)
            or (not getItemWeaponType(itemEx.uid) or getItemWeaponType(itemEx.uid) > 5)
            or (getItemWeaponType(itemEx.uid) == 0 and not isArmor(itemEx))
            or itemEx.itemid == 0 or itemEx.type > 1 or isItemStackable(itemEx.uid) then
            doPlayerSendTextMessage(cid, 24,"You cannot remove a slot from this item. #")
            return true
        end
        if isCreature(itemEx.uid) then
            return false
        end
        local nam = getItemName(itemEx.uid)
        if getSlotCount(nam) >= 1 then
            local slots = getSlots(nam)
            local newName = getItemInfo(itemEx.itemid).name
            for i = 1, #slots do
                if removeUpgrade[item.itemid] ~= "all" and (not((removeUpgrade[item.itemid] == "first" and i == 1) or (removeUpgrade[item.itemid] == "last" and i == #slots))) then
                    newName = newName .. ' [' .. slots[i] .. ']'
                end
            end

            doSendMagicEffect(toPosition,30)
            doSendAnimatedText(toPosition,'REMOVED',120)
            doItemSetAttribute(itemEx.uid,'name', newName)
            doRemoveItem(item.uid, 1)
        else
            doPlayerSendTextMessage(cid, 24,"You cannot remove a slot here.")
        end
    else
        if item.uid == 0 or item.itemid == 0 then return false end
        toPosition.stackpos = 255
        if isInArray(conf.ignoredIds, itemEx.itemid)
            or (not getItemWeaponType(itemEx.uid) or getItemWeaponType(itemEx.uid) > 5)
            or (getItemWeaponType(itemEx.uid) == 0 and not isArmor(itemEx))
            or itemEx.itemid == 0 or itemEx.type > 1 or isItemStackable(itemEx.uid) then
            doPlayerSendTextMessage(cid, 24,"You cant open a slot on this item.")
            return true
        end
        if isCreature(itemEx.uid) then
            return false
        end
        local nam = getItemName(itemEx.uid)
        if getSlotCount(nam) < conf.maxSlotCount then
            local l = choose('hp','mp','ml','cas','shield','dist')
            local p = getper()
    
            doSendMagicEffect(toPosition,30)
            nam = nam..' ['..l..'.+'..p..'%]'
            doSendAnimatedText(toPosition,l..' '..p..'%',120)
            doItemSetAttribute(itemEx.uid,'name',nam)
            doRemoveItem(item.uid,1)
        else
            doPlayerSendTextMessage(cid, 24,"You cant open a slot on this item.")
        end
    end
    return true
end

Creaturescript:
Lua:
local conditionMP,conditionHP,conditionCLUB,conditionSHI,conditionDIST,conditionAMP = {},{},{},{},{},{},{}
for i=1,100 do ---Carrega as conditions
--- HP
conditionHP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionHP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionHP[i], CONDITION_PARAM_STAT_MAXHEALTHPERCENT, 100+i)
setConditionParam(conditionHP[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionHP[i], CONDITION_PARAM_SUBID, 50)
--MANA
conditionMP[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionMP[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionMP[i], CONDITION_PARAM_STAT_MAXMANAPERCENT, 100+i)
setConditionParam(conditionMP[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionMP[i], CONDITION_PARAM_SUBID, 51)
--club axe sword
conditionCLUB[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_CLUBPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_SWORDPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SKILL_AXEPERCENT, 100+i)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionCLUB[i], CONDITION_PARAM_SUBID, 53)
--- shield
conditionSHI[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionSHI[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SKILL_SHIELDPERCENT, 100+i)
setConditionParam(conditionSHI[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionSHI[i], CONDITION_PARAM_SUBID, 54)
--- dist
conditionDIST[i] = createConditionObject(CONDITION_ATTRIBUTES)
setConditionParam(conditionDIST[i], CONDITION_PARAM_TICKS, -1)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SKILL_DISTANCEPERCENT, 100+i)
setConditionParam(conditionDIST[i], CONDITION_PARAM_BUFF, true)
setConditionParam(conditionDIST[i], CONDITION_PARAM_SUBID, 55)
end
function getSlotType(n)
if not n then
return false
end
if n:match('%[(.+)%]') then
n = n:match('%[(.+)%]')
if n == '?' then
return 0,n
else
return n:match('(.-)%.([+-])(%d+)%%')
end
else
return false
end

end
local function loadSet(cid)
local t = {}
for slot=1,9 do
t[slot] = ''

local s = getPlayerSlotItem(cid,slot).uid
if s ~= 0 then
t[slot] = getItemName(s)
end
end
return t
end
function isInArray2(arr,var) -- Because in some servers it return 1 and 0 and others true and false
for i,b in pairs(arr) do
if var == b then
return true
end
end
return false
end
function check2(cid,i)
if i == 5 or i == 6 then
if isInArray({'head','necklace','backpack','body','legs','feet','ring'},getItemValue(getPlayerSlotItem(cid,i).itemid,'slotType') or '') then
return false
end
end
return true
end
function chk(cid,f)
if not isPlayer(cid) then return end
local t = loadSet(cid)
for i=1,#f do
if f[i] ~= t[i] then
equip(cid,nil,slot)
break
end
end
addEvent(chk,2000,cid,t)
end
items = { ---- Only to get attr: slotType because getItemName dont return it -.-'
_VERSION='1.0 By mock',
XML_DIR='data/items/items.xml',
}
do
local ia = os.clock()
io.write('Loading items')
local i = io.open(items.XML_DIR,'r')
local u = i:read(-1)
i:close()
local u = u:match('<items>(.+)</items>')
for mi,id,mid,name,data,me in u:gmatch('<(%a-)%s*id%s*=%s*"(%d+)"%s*(.-)%s*name%s*=%s*"(.-)"%s*>(.-)</(%a*)>') do
if mi == 'item' and me == 'item' then
local td = {name=name,id=id,type=1}
for key,value in data:gmatch('<attribute key="(.-)" value="(.-)"/>') do
td[key] = value
end
for key,value in mid:gmatch('(.-)="(.-)"') do
td[key] = value
end
items[tonumber(id)] = td

items[name] = td
end
end
for mi,id,mid,name,data in u:gmatch('<(%a-)%s*id%s*=%s*"(%d*)"%s*(.-)%s*name%s*=%s*"(%a+)"%s*/>') do
if mi == 'item' then
local td = {name=name,id=id,type=2}
for key,value in mid:gmatch('(.-)="(.-)"') do
td[key] = value
end
items[tonumber(id)] = td
items[name] = td
end
end
io.write('[done '..os.clock()-ia..']\n')
end
function getItemValue(item,value)
return items[item] and items[item][value]
end
function equip(cid,item,slot)
local HP = getCreatureHealth(cid)
local MP = getCreatureMana(cid)
local t = {}
if item then
local mm,sinal,qto = getSlotType(getItemName(item.uid))
t[mm] = tonumber(qto)
end
for i=1,9 do -- Not on slot 10 > arrow
if i ~= slot then
if getPlayerSlotItem(cid,i).itemid ~= 0 then
local aab = getPlayerSlotItem(cid,i).uid
if aab and check2(cid,i) then
for _ in getItemName(aab):gmatch('(%[.-%])') do
local mm,sinal,qto2 = getSlotType(_)
if mm then
if not t[mm] then
t[mm] = 0
end
t[mm] = t[mm]+tonumber(qto2)

t[mm] = t[mm] > 100 and 100 or t[mm]
end
end
end
end
end
end
local fu = 0
local ca = {}
local s = ''
for sl,n in pairs(t) do
fu = fu+1
s = s..''..n..'% more of '..sl..'\n'
if sl == 'hp' then
doAddCondition(cid,conditionHP[tonumber(n)])
doCreatureAddHealth(cid,HP-getCreatureHealth(cid))
ca[50] = 1
doPlayerSendTutorial(cid,19)
elseif sl == 'mp' then
doAddCondition(cid,conditionMP[tonumber(n)])
doCreatureAddMana(cid,HP-getCreatureMana(cid))
ca[51] = 1
doPlayerSendTutorial(cid,19)
ca[52] = 1
elseif sl == 'cas' then
doAddCondition(cid,conditionCLUB[tonumber(n)])
ca[53] = 1
elseif sl == 'shield' then
doAddCondition(cid,conditionSHI[tonumber(n)])
ca[54] = 1
elseif sl == 'dist' then
doAddCondition(cid,conditionDIST[tonumber(n)])
ca[55] = 1
end
end
if fu > 0 then
addEvent(doPlayerSendTextMessage,100,cid,24,'You have:\n'..s)
for i=50,55 do
if not ca[i] then
doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
end
end
else
for i=50,55 do
doRemoveCondition(cid,CONDITION_ATTRIBUTES,i)
end
end
return true
end
function onLogin(cid)
equip(cid,nil,slot)
addEvent(chk,2000,cid,loadSet(cid)) -- Here we check!
return TRUE
end
 
Back
Top