Ir para conteúdo
  • Cadastre-se

(Resolvido)Ajuda com Autoloot System


Ir para solução Resolvido por Sekk,

Posts Recomendados

Falae galera, estou muito sem tempo, tipo, sem tempo mesmo, só estou postando isso porque é muito necessário, de vez em quando entro no TK mas não consigo ver as dúvidas que deixaram em meus tópicos etc... Enfim, venho aqui pedir ajuda com um script de MOD do AutoLoot do @Vodkart.

 

Então, tem o script MOD dele que é o autoloot, eu queria poder adicionar um item no server que adiciona X storage por 1 dia(1 * 24 * 60 * 60), então a storage é retirada do player, e no script do autoloot, ter um comando para "iniciar" o sistema, exemplo: !autoloot start

 

A partir daí, você recebe uma mensagem como "Você iniciou seu autoloot, você tem 1 dia para usá-lo.", caso contrário "Você não tem tempo de autoloot".

 

Se o player não usar esse start, ele não pode usar os comandos do autoloot e nem usufruir de suas funções.

 

A storage seria 91911, por 1 dia. O ID do item pra usar e receber a stor é 9941.

 

Ai vai o código do mod:

Spoiler

<?xml version="1.0" encoding="ISO-8859-1"?>  

<mod name="Loot System" version="1.0" author="Vodkart And Mkalo" contact="none.com" enabled="yes">  

<config name="Loot_func"><![CDATA[


info = {

OnlyPremium = false,

AutomaticDeposit = true,

BlockMonsters = {},

BlockItemsList = {}

}


function setPlayerStorageTable(cid, storage, tab)

    local tabstr = "&"

    for i,x in pairs(tab) do

            tabstr = tabstr .. i .. "," .. x .. ";"

    end

    setPlayerStorageValue(cid, storage, tabstr:sub(1, #tabstr-1))

end

function getPlayerStorageTable(cid, storage)

    local tabstr = getPlayerStorageValue(cid, storage)

    local tab = {}

    if type(tabstr) ~= "string" then

            return {}

    end

    if tabstr:sub(1,1) ~= "&" then

            return {}

    end

    local tabstr = tabstr:sub(2, #tabstr)

    local a = string.explode(tabstr, ";")

    for i,x in pairs(a) do

            local b = string.explode(x, ",")

            tab[tonumber(b[1]) or b[1]] = tonumber(b[2]) or b[2]

    end

    return tab

end


function isInTable(cid, item)

         for _,i in pairs(getPlayerStorageTable(cid, 27000))do

             if tonumber(i) == tonumber(item) then

                return true

             end

         end

return false

end

function addItemTable(cid, item)

         local x = {}

               for i = 1,#getPlayerStorageTable(cid, 27000) do

                   table.insert(x,getPlayerStorageTable(cid, 27000)[i])

               end

               if x ~= 0 then

                  table.insert(x,tonumber(item))

                  setPlayerStorageTable(cid, 27000, x)

               else

                   setPlayerStorageTable(cid, 27000, {item})

               end

end

function removeItemTable(cid, item)

         local x = {}

               for i = 1,#getPlayerStorageTable(cid, 27000) do

                   table.insert(x,getPlayerStorageTable(cid, 27000)[i])

               end

               for i,v in ipairs(x) do 

                   if tonumber(v) == tonumber(item) then

                   table.remove(x,i)

               end

               end

         return setPlayerStorageTable(cid, 27000, x)

end

function ShowItemsTabble(cid)

local str,n = "-- My Loot List --\n\n",0

for i = 1,#getPlayerStorageTable(cid, 27000) do

n = n + 1

str = str..""..n.." - "..getItemNameById(getPlayerStorageTable(cid, 27000)[i]).."\n"

end

return doShowTextDialog(cid, 2529, str)

end

function getContainerItems(containeruid)

    local items = {}

    local containers = {}

    if type(getContainerSize(containeruid)) ~= "number" then

            return false

    end

    for slot = 0, getContainerSize(containeruid)-1 do

            local item = getContainerItem(containeruid, slot)

            if item.itemid == 0 then

                    break

            end

            if isContainer(item.uid) then

                    table.insert(containers, item.uid)

            end

            table.insert(items, item)

    end

    if #containers > 0 then

            for i,x in ipairs(getContainerItems(containers[1])) do

                    table.insert(items, x)

            end

            table.remove(containers, 1)

    end     

    return items

end

function getItemsInContainerById(container, itemid) -- Function By Kydrai

            local items = {}

            if isContainer(container) and getContainerSize(container) > 0 then

                            for slot=0, (getContainerSize(container)-1) do

                                            local item = getContainerItem(container, slot)

                                            if isContainer(item.uid) then

                                                            local itemsbag = getItemsInContainerById(item.uid, itemid)

                                                            for i=0, #itemsbag do

                                                                            table.insert(items, itemsbag[i])

                                                            end

                                            else

                                                            if itemid == item.itemid then

                                                                            table.insert(items, item.uid)

                                                            end

                                            end

                            end

            end

            return items

end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo

    local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)

    local piles = 0

    if #item > 0 then

            for i,x in pairs(item) do

                    if getThing(x).type < 100 then

                            local it = getThing(x)

                            doTransformItem(it.uid, itemid, it.type+quant)

                            if it.type+quant > 100 then

                                    doPlayerAddItem(cid, itemid, it.type+quant-100)

                            end

                    else

                           piles = piles+1

                    end

            end

    else

            return doPlayerAddItem(cid, itemid, quant)

    end

    if piles == #item then

            doPlayerAddItem(cid, itemid, quant)

    end

end

function AutomaticDeposit(cid,item,n)

local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n*1)

return doPlayerDepositMoney(cid, deposit)

end

function corpseRetireItems(cid, pos)

local check = false

for i = 0, 255 do

pos.stackpos = i

tile = getTileThingByPos(pos)

if tile.uid > 0 and isCorpse(tile.uid) then

check = true break

end

end

if check == true then

     local items = getContainerItems(tile.uid)

     for i,x in pairs(items) do

             if isInArray(getPlayerStorageTable(cid, 27000), tonumber(x.itemid)) then

                     if isItemStackable(x.itemid) then

doPlayerAddItemStacking(cid, x.itemid, x.type)

if info.AutomaticDeposit == true and isInArray({"2148","2152","2160"},tonumber(x.itemid)) then

AutomaticDeposit(cid,x.itemid,x.type)

end

                     else

                             doPlayerAddItem(cid, x.itemid)

                     end

                     doRemoveItem(x.uid)

             end

     end

end

end

]]></config>

<event type="login" name="LootLogin" event="script"><![CDATA[

function onLogin(cid)

registerCreatureEvent(cid, "MonsterAttack")

return true

end]]></event>

<event type="death" name="LootEventDeath" event="script"><![CDATA[

domodlib('Loot_func')

function onDeath(cid, corpse, deathList)

local killer,pos = deathList[1],getCreaturePosition(cid)

addEvent(corpseRetireItems,1,killer,pos)

return true

end]]></event>

<event type="combat" name="MonsterAttack" event="script"><![CDATA[

domodlib('Loot_func')

if isPlayer(cid) and isMonster(target) and not isInArray(info.BlockMonsters,string.lower(getCreatureName(target))) then

registerCreatureEvent(target, "LootEventDeath")

                 end

return true]]></event>

<talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[

domodlib('Loot_func')

local t = string.explode(string.lower(param), ",")

if info.OnlyPremium == true and not isPremium(cid) then

doPlayerSendCancel(cid, "you must be a premium account.") return true

elseif not t[1] then

ShowItemsTabble(cid) return true

elseif tonumber(t[1]) or tonumber(t[2]) then

doPlayerSendCancel(cid, "enter!autoloot add,name or !autoloot remove,name") return true

elseif isInArray({"add","remove"}, tostring(t[1])) then

local func,check = tostring(t[1]) == "add" and addItemTable or removeItemTable, tostring(t[1]) == "add" and true or false

local item = getItemIdByName(tostring(t[2]), false) 

if not item then

doPlayerSendCancel(cid, "This item does not exist.") return true

elseif check == true and isInArray(info.BlockItemsList, item) then

doPlayerSendCancel(cid, "You can not add this item in the list!") return true

elseif isInTable(cid, item) == check then

doPlayerSendCancel(cid, "This Item "..(check == true and "already" or "is not").." in your list.") return true

end

func(cid, item)

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,check == true and "you added the item "..t[2].." in the list" or "you removed the item "..t[2].." from the list") return true

end

return true]]></talkaction>

</mod>

 

 

@xWhiteWolf

@zipter98

@Fir3element

@Comedinha

 

Se puderem ajudar, agradeço muito!

 

Grato

Link para o post
Compartilhar em outros sites
  • Respostas 9
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

agora o item           obs: podia fzr td pelo mod, mas fiquei com preguiça kkk

RESOLVIDO! @Vodkart me ajudou, e aqui está a solução:   mods/autoloot.xml     data/actions/scripts/aloot.lua   data/actions/actions.xml <action itemid="XXXX" script="aloot.lua"/>     Obrigado cara xD

posso fazer essa alteração sem problemas! então vou usar só 2 storages... você já tem o script do item no actions.xml? ou tem que criar o action e alterar a talkction?

6 minutos atrás, Sekk disse:

Falae galera, estou muito sem tempo, tipo, sem tempo mesmo, só estou postando isso porque é muito necessário, de vez em quando entro no TK mas não consigo ver as dúvidas que deixaram em meus tópicos etc... Enfim, venho aqui pedir ajuda com um script de MOD do AutoLoot do @Vodkart.

 

Então, tem o script MOD dele que é o autoloot, eu queria poder adicionar um item no server que adiciona X storage por 1 dia(1 * 24 * 60 * 60), então a storage é retirada do player, e no script do autoloot, ter um comando para "iniciar" o sistema, exemplo: !autoloot start

 

A partir daí, você recebe uma mensagem como "Você iniciou seu autoloot, você tem 1 dia para usá-lo.", caso contrário "Você não tem tempo de autoloot".

 

Se o player não usar esse start, ele não pode usar os comandos do autoloot e nem usufruir de suas funções.

 

A storage seria 91911, por 1 dia. O ID do item pra usar e receber a stor é 9941.

 

Ai vai o código do mod:

  Ocultar conteúdo


<?xml version="1.0" encoding="ISO-8859-1"?>  

<mod name="Loot System" version="1.0" author="Vodkart And Mkalo" contact="none.com" enabled="yes">  

<config name="Loot_func"><![CDATA[


info = {

OnlyPremium = false,

AutomaticDeposit = true,

BlockMonsters = {},

BlockItemsList = {}

}


function setPlayerStorageTable(cid, storage, tab)

    local tabstr = "&"

    for i,x in pairs(tab) do

            tabstr = tabstr .. i .. "," .. x .. ";"

    end

    setPlayerStorageValue(cid, storage, tabstr:sub(1, #tabstr-1))

end

function getPlayerStorageTable(cid, storage)

    local tabstr = getPlayerStorageValue(cid, storage)

    local tab = {}

    if type(tabstr) ~= "string" then

            return {}

    end

    if tabstr:sub(1,1) ~= "&" then

            return {}

    end

    local tabstr = tabstr:sub(2, #tabstr)

    local a = string.explode(tabstr, ";")

    for i,x in pairs(a) do

            local b = string.explode(x, ",")

            tab[tonumber(b[1]) or b[1]] = tonumber(b[2]) or b[2]

    end

    return tab

end


function isInTable(cid, item)

         for _,i in pairs(getPlayerStorageTable(cid, 27000))do

             if tonumber(i) == tonumber(item) then

                return true

             end

         end

return false

end

function addItemTable(cid, item)

         local x = {}

               for i = 1,#getPlayerStorageTable(cid, 27000) do

                   table.insert(x,getPlayerStorageTable(cid, 27000)[i])

               end

               if x ~= 0 then

                  table.insert(x,tonumber(item))

                  setPlayerStorageTable(cid, 27000, x)

               else

                   setPlayerStorageTable(cid, 27000, {item})

               end

end

function removeItemTable(cid, item)

         local x = {}

               for i = 1,#getPlayerStorageTable(cid, 27000) do

                   table.insert(x,getPlayerStorageTable(cid, 27000)[i])

               end

               for i,v in ipairs(x) do 

                   if tonumber(v) == tonumber(item) then

                   table.remove(x,i)

               end

               end

         return setPlayerStorageTable(cid, 27000, x)

end

function ShowItemsTabble(cid)

local str,n = "-- My Loot List --\n\n",0

for i = 1,#getPlayerStorageTable(cid, 27000) do

n = n + 1

str = str..""..n.." - "..getItemNameById(getPlayerStorageTable(cid, 27000)[i]).."\n"

end

return doShowTextDialog(cid, 2529, str)

end

function getContainerItems(containeruid)

    local items = {}

    local containers = {}

    if type(getContainerSize(containeruid)) ~= "number" then

            return false

    end

    for slot = 0, getContainerSize(containeruid)-1 do

            local item = getContainerItem(containeruid, slot)

            if item.itemid == 0 then

                    break

            end

            if isContainer(item.uid) then

                    table.insert(containers, item.uid)

            end

            table.insert(items, item)

    end

    if #containers > 0 then

            for i,x in ipairs(getContainerItems(containers[1])) do

                    table.insert(items, x)

            end

            table.remove(containers, 1)

    end     

    return items

end

function getItemsInContainerById(container, itemid) -- Function By Kydrai

            local items = {}

            if isContainer(container) and getContainerSize(container) > 0 then

                            for slot=0, (getContainerSize(container)-1) do

                                            local item = getContainerItem(container, slot)

                                            if isContainer(item.uid) then

                                                            local itemsbag = getItemsInContainerById(item.uid, itemid)

                                                            for i=0, #itemsbag do

                                                                            table.insert(items, itemsbag[i])

                                                            end

                                            else

                                                            if itemid == item.itemid then

                                                                            table.insert(items, item.uid)

                                                            end

                                            end

                            end

            end

            return items

end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo

    local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)

    local piles = 0

    if #item > 0 then

            for i,x in pairs(item) do

                    if getThing(x).type < 100 then

                            local it = getThing(x)

                            doTransformItem(it.uid, itemid, it.type+quant)

                            if it.type+quant > 100 then

                                    doPlayerAddItem(cid, itemid, it.type+quant-100)

                            end

                    else

                           piles = piles+1

                    end

            end

    else

            return doPlayerAddItem(cid, itemid, quant)

    end

    if piles == #item then

            doPlayerAddItem(cid, itemid, quant)

    end

end

function AutomaticDeposit(cid,item,n)

local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n*1)

return doPlayerDepositMoney(cid, deposit)

end

function corpseRetireItems(cid, pos)

local check = false

for i = 0, 255 do

pos.stackpos = i

tile = getTileThingByPos(pos)

if tile.uid > 0 and isCorpse(tile.uid) then

check = true break

end

end

if check == true then

     local items = getContainerItems(tile.uid)

     for i,x in pairs(items) do

             if isInArray(getPlayerStorageTable(cid, 27000), tonumber(x.itemid)) then

                     if isItemStackable(x.itemid) then

doPlayerAddItemStacking(cid, x.itemid, x.type)

if info.AutomaticDeposit == true and isInArray({"2148","2152","2160"},tonumber(x.itemid)) then

AutomaticDeposit(cid,x.itemid,x.type)

end

                     else

                             doPlayerAddItem(cid, x.itemid)

                     end

                     doRemoveItem(x.uid)

             end

     end

end

end

]]></config>

<event type="login" name="LootLogin" event="script"><![CDATA[

function onLogin(cid)

registerCreatureEvent(cid, "MonsterAttack")

return true

end]]></event>

<event type="death" name="LootEventDeath" event="script"><![CDATA[

domodlib('Loot_func')

function onDeath(cid, corpse, deathList)

local killer,pos = deathList[1],getCreaturePosition(cid)

addEvent(corpseRetireItems,1,killer,pos)

return true

end]]></event>

<event type="combat" name="MonsterAttack" event="script"><![CDATA[

domodlib('Loot_func')

if isPlayer(cid) and isMonster(target) and not isInArray(info.BlockMonsters,string.lower(getCreatureName(target))) then

registerCreatureEvent(target, "LootEventDeath")

                 end

return true]]></event>

<talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[

domodlib('Loot_func')

local t = string.explode(string.lower(param), ",")

if info.OnlyPremium == true and not isPremium(cid) then

doPlayerSendCancel(cid, "you must be a premium account.") return true

elseif not t[1] then

ShowItemsTabble(cid) return true

elseif tonumber(t[1]) or tonumber(t[2]) then

doPlayerSendCancel(cid, "enter!autoloot add,name or !autoloot remove,name") return true

elseif isInArray({"add","remove"}, tostring(t[1])) then

local func,check = tostring(t[1]) == "add" and addItemTable or removeItemTable, tostring(t[1]) == "add" and true or false

local item = getItemIdByName(tostring(t[2]), false) 

if not item then

doPlayerSendCancel(cid, "This item does not exist.") return true

elseif check == true and isInArray(info.BlockItemsList, item) then

doPlayerSendCancel(cid, "You can not add this item in the list!") return true

elseif isInTable(cid, item) == check then

doPlayerSendCancel(cid, "This Item "..(check == true and "already" or "is not").." in your list.") return true

end

func(cid, item)

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,check == true and "you added the item "..t[2].." in the list" or "you removed the item "..t[2].." from the list") return true

end

return true]]></talkaction>

</mod>

 

 

@xWhiteWolf

@zipter98

@Fir3element

@Comedinha

 

Se puderem ajudar, agradeço muito!

 

Grato


esse autoloot é por talkaction ou apenas pelo client??
 

Link para o post
Compartilhar em outros sites
1 minuto atrás, Sekk disse:

@wevertonvrb Talkaction!

 

!autoloot -- abre a lista de items registrados

!autoloot add, id do item ou nome -- adiciona item pra lista

!autoloot remove, id do item ou nome -- deleta item da lista

ok entendido, é o mesmo que eu uso porem n tenho isso de mod

então voce quer que o personagem possa usar o auto loot apenas se tiver usado um certo item antes, este item vai dar a permisão por 24h certo??
se for isso posso ajudar porem sem a opção start, o tempo começara a contar assi mque o player usar o item

Link para o post
Compartilhar em outros sites

posso fazer essa alteração sem problemas!

então vou usar só 2 storages... você já tem o script do item no actions.xml? ou tem que criar o action e alterar a talkction?

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Estatísticas dos Fóruns

    96844
    Tópicos
    519597
    Posts



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo