Comparte
Ver el tema anteriorIr abajoVer el tema siguiente
avatar
Miembro
Mensajes Mensajes : 120
Ver perfil de usuario

[ACTION] Slot System

el Jue Nov 10, 2011 7:34 pm
Este script trata de que puedas abrir un slot para poder colocarle un Upgrade, de preferencia con el Item Upgrade System: http://othispano.foroactivo.mx/t470-action-item-upgrade-system#2031

1. Primero agrega esto en actions.xml :
Código:

<action itemid="8300" event="script" value="slot.lua"/>

2. Ahora crea "slot.lua" en actions/script/slot.lua y copia esto :
Código:


---Config
local conf = {
maxSlotCount=2,
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
function onUse(cid, item, fromPosition, itemEx, toPosition) -- Script by mock the bear (MTB)
        if item.uid == 0 or item.itemid == 0 then return false end
        toPosition.stackpos = 255
        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)
        function getper()
                local n = 1
                for i=1,10 do
                        n = n+math.random(0,10)
                        if n < 8*i then
                                break
                        end
                end
                return n
        end
        function getSlotCount(nam)
                local c = 0
                for _ in nam:gmatch('%[(.-)%]') do
                        c = c+1
                end
                return c
        end
        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
        return true
end

3. Ahora copia esta linea en creaturescripts.xml
Código:

<event type="login" name="SlotLogin" script="slot.lua"/>

4. Para terminar crea "slot.lua" en creaturescripts/script/slot.lua y copiale lo siguiente :

Código:


local conditionMP,conditionHP,conditionML,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)
        --Magic level
        conditionML[i] = createConditionObject(CONDITION_ATTRIBUTES)
        setConditionParam(conditionML[i], CONDITION_PARAM_TICKS, -1)
        setConditionParam(conditionML[i], CONDITION_PARAM_STAT_MAGICLEVELPERCENT, 100+i)
        setConditionParam(conditionML[i], CONDITION_PARAM_BUFF, true)
        setConditionParam(conditionML[i], CONDITION_PARAM_SUBID, 52)
        --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) --By mock the bear
        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) --By mock the bear
        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)
                elseif sl == 'ml' then
                        doAddCondition(cid,conditionML[tonumber(n)])
                        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) ---Script by mock the bear!
        equip(cid,nil,slot)
        addEvent(chk,2000,cid,loadSet(cid)) -- Here we check!
        return TRUE
end

Eso seria todo!

Espero que les sirva

Creditos :

100% Mock
Ver el tema anteriorVolver arribaVer el tema siguiente
Permisos de este foro:
No puedes responder a temas en este foro.