Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Fala, galerinha! Há um tempo atrás tinha feito esse sisteminha simples, como achei que não seria muito útil, acabou sumindo nas profundezas das pastas do meu computador. No entanto, como vi o pedido do membro @DboHere, acho que outras pessoas podem precisar.

 

Como funciona:

Uma key única que pode ser usada somente uma vez adicionará um item ao player quando for utilizada.

 

- Criando uma key contendo 10 crystal coins: 

!createkey 2160,10 ou !createkey crystal coin,10 

 

O player receberá a mensagem: "You have created the key: rXo-980376. You can add other items using !addkey."

 

- Adicionando novos itens à mesma key:

!addkey rXo-980376,2463,1

 

O player receberá a mensagem: "You have added other items to the key rXo-980376."

 

- Checando os itens que uma key possui:

!checkkey rXo-980376

 

Oqhr9tE.png

 

- Utilizando a key o player receberá todos os itens associados a essa key. Depois disso, a key ficará inválida.

!key rXo-980376

 

Deletando a key da database (apenas se necessário):

!deletekey rXo-980376

 

Configuração:

 

Execute o seguinte comando no mysql do seu servidor:

 

CREATE TABLE `code_key` (
    `id`         INT NOT NULL AUTO_INCREMENT,
    `key`        VARCHAR(255)       NOT NULL,
    `item_id`    INT                NOT NULL,
    `count`      INT                NOT NULL,
    `invalid`    INT      NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
);

 

Em talkactions/scripts, crie um arquivo:

 

keysystem.lua

 

Spoiler

local config = {
["!createkey"] = {access = 3}, 
["!addkey"] =  {access = 3},
["!deletekey"] = {access = 3},
["!checkkey"] = {access = 3}, 
["!key"] = {access = 0}}

function onSay(cid, words, param)
    local p = getPlayerPosition(cid)

    if config[words].access > getPlayerAccess(cid) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have permission to do this.")
        doSendMagicEffect(p, CONST_ME_POFF)
        return true
    end 
    
    if words == "!createkey" then
        if param == "" then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param. Say !createkey itemid,count")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        local t = string.explode(param, ",")
        
        local id = tonumber(t[1])
        
        if id then
            if not ExistItemById(id) then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item ID "..t[1].." not found.")
                doSendMagicEffect(p, CONST_ME_POFF)
                return true
            end
        else
            id = getItemIdByName(t[1], false)
            if(not id) then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item with such name is "..t[1].." not found.")
                doSendMagicEffect(p, CONST_ME_POFF)
                return true
            end
        end
        
        if(not t[2]) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must specifiy the quantity of items.")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        local key = generateKey()
        db.query("INSERT INTO `code_key`(`key`, `item_id`, `count`) VALUES ('"..key.."',"..id..","..tonumber(t[2])..");")
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have created the key: "..key..". You can add other items using !addkey.")
        doSendMagicEffect(p, CONST_ME_MAGIC_GREEN)     

    elseif words == "!addkey" then
    
        if param == "" then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param. Say !addkey key,itemid,count")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
    
        local t = string.explode(param, ",")
        
        local query = db.getResult("SELECT * FROM `code_key` WHERE `key` = '"..t[1].."';")
        if query:getID() == -1 or query:getDataInt("invalid") == 1 then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can add new items to a key only if the key exists and is not invalid.")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        if(not t[2])then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must specify an item to add.")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        local id = tonumber(t[2])
        
        if id then
            if not ExistItemById(id) then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item ID "..t[2].." not found.")
                doSendMagicEffect(p, CONST_ME_POFF)
                return true
            end
        else
            id = getItemIdByName(t[2], false)
            if(not id) then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item with such name is "..t[2].." not found.")
                doSendMagicEffect(p, CONST_ME_POFF)
                return true
            end
        end
        
        if(not t[3]) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must specifiy the quantity of items.")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end

        db.query("INSERT INTO `code_key`(`key`, `item_id`, `count`) VALUES ('"..t[1].."',"..id..","..tonumber(t[3])..");")
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have added other items to the key " ..t[1]..".")
        doSendMagicEffect(p, CONST_ME_MAGIC_BLUE)             
    
    elseif words == "!deletekey" then
        if param == "" then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param. Say !deletekey key")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        if not doDeleteKey(param) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Key "..param.." does not exist in your database.")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have deleted the key: "..param..".")
        doSendMagicEffect(p, CONST_ME_MAGIC_RED)  
        
    elseif words == "!checkkey" then
        if param == "" then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param. Say !checkkey KEY")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        
        if not checkKeyItems(cid, tostring(param)) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Key "..param.." is invalid.")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
    elseif words == "!key" then
        if param == "" then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param. Say !key KEY")
            doSendMagicEffect(p, CONST_ME_POFF)
            return true
        end
        doPlayerUseKey(cid, param)
    end      
return true
end

function generateKey()
    local strings = "AaBbCcDdEeFfGgHhIiJjKkLlMmOoPpQqRrSsTtUuVvWwXxYyZz"
    local newKeyStr, newKeyInt, newKey = "", 0, ""
    local query 
    repeat 
        for k = 1, math.random(1,10) do
            local l = math.random(1, string.len(strings))
            newKeyStr = newKeyStr .. string.sub(strings, l, l)
        end
        newKeyInt = math.random(999999)
        newKey = newKeyStr.."-"..newKeyInt
        query = db.getResult("SELECT * FROM `code_key` WHERE `key` = " .. db.escapeString(newKey))
    until query:getID() == -1 
    if query:getID() ~= -1 then query:free() end
    return newKey
end

function doDeleteKey(key)
local query = db.getResult("SELECT `id` FROM `code_key` WHERE `key` = '" ..key.."';")
if query:getID() == -1 then
    return false
end
repeat
db.query("DELETE FROM `code_key` WHERE `id` = "..query:getDataInt("id")..";")
until not query:next()
query:free()
return true
end

function getKeyItems(key)
local items = {}
local query = db.getResult("SELECT * FROM `code_key` WHERE `key` = '"..key.."';")
if query:getID() == -1 or query:getDataInt("invalid") == 1 then 
return nil
end
repeat
local itemid = query:getDataInt("item_id")
local count = query:getDataInt("count")
table.insert(items, {itemid = itemid, count = count})
until not query:next()
query:free()
return items
end

function checkKeyItems(cid, key)
local str = "  ~[Key Items]~  \n\n"
local keyitems = getKeyItems(key)
if not keyitems then return false end
for i = 1, #keyitems do
    str = str..i.. " - "..keyitems[i].count.." "..getItemNameById(keyitems[i].itemid).."\n"
end
doPlayerPopupFYI(cid, str)
return true
end

function doPlayerUseKey(cid, key)
local keyitems = getKeyItems(key)
local p = getPlayerPosition(cid)
if not keyitems then
    doPlayerSendCancel(cid, "This key is invalid.")
    doSendMagicEffect(p, CONST_ME_POFF)
    return true
end
for i = 1, #keyitems do
    if not isItemStackable(keyitems[i].itemid) then
        for k = 1, keyitems[i].count do
            doPlayerAddItem(cid, keyitems[i].itemid, 1)
        end
    else
        doPlayerAddItem(cid, keyitems[i].itemid, keyitems[i].count)
    end
end
db.query("UPDATE `code_key` SET `invalid` = 1 WHERE `key` = '"..key.."';")
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have received your items. The key "..key.." is invalid now.")
doSendMagicEffect(p, CONST_ME_STUN)
return true
end

function ExistItemById(id) --by dwarfer
local items = io.open("data/items/items.xml", "r"):read("*all")
local get = items:match('id="'..id..'"')
if get == nil or get == "" then
return false
end
return true
end

 

 

Em "access" edite o grupo que pode utilizar cada comando. No exemplo abaixo, apenas players com acesso maior que 3 podem utilizar o comando !createkey.

 

["!createkey"] = {access = 3}, 

 

Em talkactions.xml, adicione a tag: <talkaction words="!key;!createkey;!deletekey;!checkkey;!addkey" event="script" value="keysystem.lua"/>

 

E é isso, espero que seja útil :) 

Contato:

 

Postado

Funcionando Perfect....

Desde cedo a mãe da gente fala assim: “Filho, por você jogar Tibia, você tem que ser duas vezes melhor.” Aí passado alguns anos eu pensei: Como fazer 2 vezes melhor, se você tá pelo menos 100 vezes atrasado pelos Nubs, pela história, pelos Items, pelas Guilds, pelos Reds… Por tudo que aconteceu? Duas vezes melhor como ? Ou melhora ou ser o melhor ou o pior de uma vez. E sempre foi assim. Você vai escolher o que tiver mais perto de você, o que tiver dentro da sua realidade. Você vai ser duas vezes melhor como? Quem inventou isso aí? Quem foi o pilantra que inventou isso aí ? Acorda pra vida rapaz.

 

YanLoco

 

Projetos: https://www.facebook.com/Dbo-Here-524519644549602/ 70%

  • 2 years later...
  • 1 year later...

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo