Ir para conteúdo

Featured Replies

Postado

Olá pessoal do TibiaKing, como na maioria das vezes estou tirando dúvidas e pedindo scripts, vi a oportunidade de fazer a postagem desse tutorial para inserir um Simple Crafting System dentro do seu otserver para TFS 1.2 / 1.3.

 

De quem são os créditos? 

- Sistema retirado do otland

Modal Window por Non Sequitur

Simple Crafting System por strutZ

 

Porque não pegar direto lá?

- Porque a postagem no otland está picada em partes, eu mesmo demorei um bom tempo até juntar todas as partes, além dos items utilizados no script não estão 100% de acordo com alguns OTServers recentes, entao utilizei um padrão. Eu simplifiquei para o uso e escrevi o tutorial em português.

 

Onde foi testado?

- The Forgetten Base (TFS 1.3) fucionando 100%

 

Imagens do sistema

W5LFOrq.jpg

 

TUTORIAL

Será dividido em duas partes.

• Na primeira vamos instalar uma biblioteca de Janelas para seu otserver, pois não tem um padrão simples que possa ser utilizado.

• Na segunda parte instalar o sistema de crafting.

 

PARTE 1

Instalação da biblioteca de ModalWindow.

 

(1.1) Segundo Non Sequitur, existe uma grande dificuldade em ter que criar diversos códigos para fazer as Modais de Janelas (ModalWindow) funcionarem nas versões mais recentes do tibia, e isso não é bom, porém é uma solução sem erros Ok.

 

(1.2) Existem diversas funções para utilizar os Modais de Janela (ModalWindow) desde modalWindow:addButtons(...) ou modalWindow:addChoices(...), porém não vou me prolongar sobre o assunto da modal, pois o objetivo é que funcione o sistema de crafting. 

 

(2) INSTALAÇÃO

 

(2.1) Na pasta data/lib/ abra o arquivo lib.lua

 

(2.2) Insira o seguinte código

-- Modal window
dofile('data/lib/modalwindow.lua')

(2.3) Na mesma pasta lib, crie um arquivo chamado modalwindow.lua e adicione o código abaixo no arquivo

if not modalWindows then
    modalWindows = {
        modalWindowConstructor = ModalWindow,
        nextFreeId = 500,
 
        windows = {}
    }
end
 
local MT = {}
MT.__index = MT
 
function ModalWindow(...)
    local args = {...}
    if type(args[1]) == 'table' then
        local self = setmetatable(args[1], MT)
        local id = modalWindows.nextFreeId        
        self.id = id
        self.buttons = {}
        self.choices = {}
        self.players = {}
        self.created = false
 
        modalWindows.nextFreeId = id + 1
        table.insert(modalWindows.windows, self)
        return self
    end
 
    return modalWindows.modalWindowConstructor(...)
end
 
function MT:setDefaultCallback(callback)
    self.defaultCallback = callback
end
 
function MT:addButton(text, callback)
    local button = {text = tostring(text), callback = callback}
    table.insert(self.buttons, button)
    return button
end
 
function MT:addButtons(...)
    for _, text in ipairs({...}) do
        table.insert(self.buttons, {text = tostring(text)})
    end
end
 
function MT:addChoice(text)
    local choice = {text = tostring(text)}
    table.insert(self.choices, choice)
    return choice
end
 
function MT:addChoices(...)
    for _, text in ipairs({...}) do
        table.insert(self.choices, {text = tostring(text)})
    end
end
 
function MT:setDefaultEnterButton(text)
    self.defaultEnterButton = text
end
 
function MT:setDefaultEscapeButton(text)
    self.defaultEscapeButton = text
end
 
function MT:setTitle(title)
    self.title = tostring(title)
end
 
function MT:setMessage(message)
    self.message = tostring(message)
end
 
local buttonOrder = {
    [4] = {3, 4, 2, 1},
    [3] = {2, 3, 1},
    [2] = {1, 2},
    [1] = {1}
}
function MT:create()
    local modalWindow = modalWindows.modalWindowConstructor(self.id, self.title, self.message)
    local order = buttonOrder[math.min(#self.buttons, 4)]
 
    if order then
        for _, i in ipairs(order) do
            local button = self.buttons[i]
            modalWindow:addButton(i, button.text)
            button.id = i
 
            if button.text == self.defaultEnterButton then
                modalWindow:setDefaultEnterButton(i)
            elseif button.text == self.defaultEscapeButton then
                modalWindow:setDefaultEscapeButton(i)
            end
        end
    end
 
    for _, choice in ipairs(self.choices) do
        modalWindow:addChoice(_, choice.text)
        choice.id = _
    end
 
    self.modalWindow = modalWindow
end
 
function MT:sendToPlayer(player)
    if not self.modalWindow then
        self:create()
    end
 
    player:registerEvent('ModalWindowHelper')
    self.players[player:getId()] = true
    return self.modalWindow:sendToPlayer(player)
end

(2.4) Agora em data/creaturescript/creaturescript.xml adicione

<event type="modalwindow" name="ModalWindowHelper" script="modalwindowhelper.lua" />

(2.5) Em data/creaturescript/scripts/ crie um arquivo lua chamado modalwindowhelper com o seguinte código

function onModalWindow(player, modalWindowId, buttonId, choiceId)
    local modalWindow
    for _, window in ipairs(modalWindows.windows) do
        if window.id == modalWindowId then
            modalWindow = window
            break
        end
    end
 
    if not modalWindow then
        return true
    end
 
    local playerId = player:getId()
    if not modalWindow.players[playerId] then
        return true
    end
    modalWindow.players[playerId] = nil
 
    local choice = modalWindow.choices[choiceId]
 
    for _, button in ipairs(modalWindow.buttons) do
        if button.id == buttonId then
            local callback = button.callback or modalWindow.defaultCallback
            if callback then
                callback(button, choice)
                break
            end
        end
    end
 
    return true
end

(2.6) PRONTO, AS MODAIS DE JANELA ESTÃO INSTALADAS E PRONTAS PARA USO! VAMOS A PARTE 2 COM A INSTALAÇÃO DO SIMPLE CRAFTING SYSTEM!

 

PARTE 2

Instalação do Simple Crafting System

 

(1.1) Existem alguns sistemas de crafting porém são mais complexos. Este sistema feito por strutZ é super simples e altamente configurável baseado nas suas necessidades! Apenas adicionando os scripts de actions e os de lib. Não há necessidade de registrar nada em login.lua ou em creaturescript.

 

(2) INFORMAÇÕES DO SISTEMA 

Tem uma seção de configuração bem simples onde você pode colocar os items que deseja que sejam craftados e também os items necessários para craftar. Também a personalização dos textos que aparecem nas janelas modais que já foram instaladas na Parte 1.

• Abaixo alguma explicação sobre as configurações do código após ter instalado (para iniciar a instalação vamos ao (2.1)

local config = {
-- Configuracao da Janela Modal
    mainTitleMsg = "Crafting System", -- TITUTLO DA JANELA QUE ABRE
    mainMsg = "Welcome to the crafting system. Please choose a vocation to begin.", -- MENSAGEM DA JANELA
 
    craftTitle = "Crafting System: ", -- Titulo da tela de craft apos o player selecionar a vocacao destinada dos items
    craftMsg = "Here is a list of all items that can be crafted for the ", -- Mensagem na tela de craft após escolhas do jogador de vocação
-- Fim da config Janela Modal
 
-- Notificacoes ao player
    needItems = "You do not have all the required items to make ", -- Mensagem que aparece quando o player tenta craftar e nao tem todos os items
 
-- Configuracoes de Crafting
    system = {
    [1] = {vocation = "Master Wizard", -- Isto e apenas uma categoria, nao influencia em nada
            items = {
                [1] = {item = "arcane staff", -- item name (O NOME TEM QUE SER EXATO, SENAO NAO FUNCIONA!)
                        itemID = 2453, -- ID do item que sera feito, tem que ser compativel com o nome acima
                        reqItems = { -- items e quantidade dos items necessarios para craftar
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },

 

(2.1) Primeiramente vamos a pasta data/actions/actions.xml e adicionar a seguinte linha. O ITEMID é o ID do item que você deseja que seja utilizado para craftar. (no meu caso para teste das fotos usei o item id 8300, mas você pode colocar o que desejar)

  <action itemid="ITEMID" script="crafting.lua"/>

 

(2.2) Ai em data/actions/scripts/ crie um arquivo lua chamado crafting com o seguinte código

local config = {
-- Configuracao da Janela Modal
    mainTitleMsg = "Crafting System", -- TITUTLO DA JANELA QUE ABRE
    mainMsg = "Welcome to the crafting system. Please choose a vocation to begin.", -- MENSAGEM DA JANELA
 
    craftTitle = "Crafting System: ", -- Titulo da tela de craft apos o player selecionar a vocacao destinada dos items
    craftMsg = "Here is a list of all items that can be crafted for the ", -- Mensagem na tela de craft após escolhas do jogador de vocação
-- Fim da config Janela Modal
 
-- Notificacoes ao player
    needItems = "You do not have all the required items to make ", -- Mensagem que aparece quando o player tenta craftar e nao tem todos os items
 
-- Configuracoes de Crafting
    system = {
    [1] = {vocation = "Master Wizard", -- Isto e apenas uma categoria, nao influencia em nada
            items = {
                [1] = {item = "arcane staff", -- item name (O NOME TEM QUE SER EXATO, SENAO NAO FUNCIONA!)
                        itemID = 2453, -- ID do item que sera feito, tem que ser compativel com o nome acima
                        reqItems = { -- items e quantidade dos items necessarios para craftar
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},
				
	[2] = {vocation = "Elder Wizard", 
            items = {
                [1] = {item = "arcane staff", 
                        itemID = 2453,
                        reqItems = { 
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},			
				
	[3] = {vocation = "Swift Archer", 
            items = {
                [1] = {item = "arcane staff", 
                        itemID = 2453,
                        reqItems = { 
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},			
			
	[4] = {vocation = "Guardian Warrior",
            items = {
                [1] = {item = "arcane staff", 
                        itemID = 2453,
                        reqItems = { 
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},		
								
			},
        		
		}
		
               
local player = Player(cid)
function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey)

		player:sendMainCraftWindow(config)

	return true
end

OBS: Coloquei os mesmos items e matéria prima para todas as categorias, para facilitar a edição e compreensão do código.

 

(2.3) Ai na pasta data/ abra o arquivo global.lua e adicionei no início o seguinte código, salve e mantenha o arquivo aberto.

dofile('data/lib/crafting.lua')

(2.3.1) No mesmo arquivo global.lua insira após o último end

function capAll(str)
    local newStr = ""; wordSeparate = string.gmatch(str, "([^%s]+)")
    for v in wordSeparate do
        v = v:gsub("^%l", string.upper)
        if newStr ~= "" then
            newStr = newStr.." "..v
        else
            newStr = v
        end
    end
    return newStr
end

 

(2.4) Em data/lib/ crie um arquivo lua chamado crafting e adicione o seguinte código dentro

-- Main Crafting Window -- This is the modal window that is displayed first
function Player:sendMainCraftWindow(config)
    local function buttonCallback(button, choice)
 
    -- Modal Window Functionallity
        if button.text == "Select" then
            self:sendVocCraftWindow(config, choice.id)
        end
    end
   
    -- Modal window design
    local window = ModalWindow {
        title = config.mainTitleMsg, -- Title of the main craft modal window
        message = config.mainMsg.."\n\n" -- Message of the main craft modal window
    }
 
    -- Add buttons to the window (Note: if you change the names of these you must change the functions in the modal window functionallity!)
    window:addButton("Select", buttonCallback)
    window:addButton("Exit", buttonCallback)
   
    -- Add choices from the action script
    for i = 1, #config.system do
        window:addChoice(config.system[i].vocation)
    end
 
    -- Set what button is pressed when the player presses enter or escape.
    window:setDefaultEnterButton("Select")
    window:setDefaultEscapeButton("Exit")
   
    -- Send the window to player
    window:sendToPlayer(self)
end
-- End of the first modal window
 
 
 
-- This is the modal window that displays all avalible items for the chosen vocation.
function Player:sendVocCraftWindow(config, lastChoice)
    local function buttonCallback(button, choice)  
 
-- Modal Window Functionallity
        -- If the user presses the back button they will be redirected to the main window.
        if button.text == "Back" then
            self:sendMainCraftWindow(config)
        end
        -- If the user presses the details button they will be redirected to a text window with information about the item they want to craft.
        if button.text == "Details" then
        local item = config.system[lastChoice].items[choice.id].item
        local details = "In order to craft "..item.." you must collect the following items.\n\nRequired Items:"
 
            for i = 1, #config.system[lastChoice].items[choice.id].reqItems do
            local reqItems = config.system[lastChoice].items[choice.id].reqItems[i].item
            local reqItemsCount = config.system[lastChoice].items[choice.id].reqItems[i].count
            local reqItemsOnPlayer = self:getItemCount(config.system[lastChoice].items[choice.id].reqItems[i].item)
                details = details.."\n- "..capAll(getItemName(reqItems).." ["..reqItemsOnPlayer.."/"..reqItemsCount.."]")
            end
       
            self:showTextDialog(item, details)
            self:sendVocCraftWindow(config, lastChoice)
        end
       
        -- if the player presses the craft button then begin checks.
        if button.text == "Craft" then
       
            -- Check if player has required items to craft the item. If they dont send needItems message.
            for i = 1, #config.system[lastChoice].items[choice.id].reqItems do
                if self:getItemCount(config.system[lastChoice].items[choice.id].reqItems[i].item) < config.system[lastChoice].items[choice.id].reqItems[i].count then
                    self:say(config.needItems..config.system[lastChoice].items[choice.id].item, TALKTYPE_MONSTER_SAY)
                    return false
                end
            end
            -- Remove the required items and there count from the player.
            for i = 1, #config.system[lastChoice].items[choice.id].reqItems do
                self:removeItem(config.system[lastChoice].items[choice.id].reqItems[i].item, config.system[lastChoice].items[choice.id].reqItems[i].count)
            end            
        -- Send effect and give player item.
        self:addItem(config.system[lastChoice].items[choice.id].itemID)
        self:getPosition():sendMagicEffect(CONST_ME_FIREATTACK)
        end
    end
 
    -- Modal window design
    local window = ModalWindow {
        title = config.craftTitle..config.system[lastChoice].vocation, -- The title of the vocation specific window
        message = config.craftMsg..config.system[lastChoice].vocation..".\n\n", -- The message of the vocation specific window
    }
   
    -- Add buttons to the window (Note: if you change the names of these you must change the functions in the modal window functionallity!)
    window:addButton("Back", buttonCallback)
    window:addButton("Exit")
    window:addButton("Details", buttonCallback)
    window:addButton("Craft", buttonCallback)
   
    -- Set what button is pressed when the player presses enter or escape
    window:setDefaultEnterButton("Craft")
    window:setDefaultEscapeButton("Exit")
   
    -- Add choices from the action script
    for i = 1, #config.system[lastChoice].items do
        window:addChoice(config.system[lastChoice].items[i].item)
    end
   
    -- Send the window to player
    window:sendToPlayer(self)
end

 

PRONTO! É apenas isso, seu sistema de crafting está 100% funcional se você fizer tudo corretamente. Ele está pronto para ser personalizado, onde você pode adicionar as categorias que quiser e os itens que quiser para craftar, tanto como as matérias primas.

 

Espero ter ajudado, nada aqui é de minha autoria, apenas minha edição para facilitar a compreensão e junção de todos os scripts em um post único para ter o sistema 100% funcional.

 

Fico a disposição e boa sorte!

Postado

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

Talvez você queira ver:

BestBaiak

[FAQ]Remere's Map Editor - Dúvidas e soluções de bugs 

 

Contato:

1.png.dadb3fc3ee6ffd08292705b6a71e3d88.png Discord:

  • 5 months later...
Postado

Não funcional testado em tfs 1.3 OTX 3.10

Aparece o seguinte erro para mim no distro:

        
	[C]: in function 'sendMainCraftWindow'

	data/actions/scripts/crafting.lua:103: in function 


Lua Script Error: [Action Interface] 

data/actions/scripts/crafting.lua:onUse

data/actions/scripts/crafting.lua:103: attempt to call method 'sendMainCraftWindow' (a nil value)

stack traceback:

	[C]: in function 'sendMainCraftWindow'

	data/actions/scripts/crafting.lua:103: in function 

 

  • 2 years later...
Postado

Eu baixei a última versão do otservbrasil (12.60) porém eles estão mudando a estrutura dos arquivos, não em arquivos como actions.xml, creaturescripts.xml, os monstros estão tudo em um formato diferente, não sei como proceder hahah.

Postado
Em 01/11/2017 em 11:55, lucasprimolemos disse:

Olá pessoal do TibiaKing, como na maioria das vezes estou tirando dúvidas e pedindo scripts, vi a oportunidade de fazer a postagem desse tutorial para inserir um Simple Crafting System dentro do seu otserver para TFS 1.2 / 1.3.

 

De quem são os créditos? 

- Sistema retirado do otland

Modal Window por Non Sequitur

Simple Crafting System por strutZ

 

Porque não pegar direto lá?

- Porque a postagem no otland está picada em partes, eu mesmo demorei um bom tempo até juntar todas as partes, além dos items utilizados no script não estão 100% de acordo com alguns OTServers recentes, entao utilizei um padrão. Eu simplifiquei para o uso e escrevi o tutorial em português.

 

Onde foi testado?

- The Forgetten Base (TFS 1.3) fucionando 100%

 

Imagens do sistema

W5LFOrq.jpg

 

TUTORIAL

Será dividido em duas partes.

• Na primeira vamos instalar uma biblioteca de Janelas para seu otserver, pois não tem um padrão simples que possa ser utilizado.

• Na segunda parte instalar o sistema de crafting.

 

PARTE 1

Instalação da biblioteca de ModalWindow.

 

(1.1) Segundo Non Sequitur, existe uma grande dificuldade em ter que criar diversos códigos para fazer as Modais de Janelas (ModalWindow) funcionarem nas versões mais recentes do tibia, e isso não é bom, porém é uma solução sem erros Ok.

 

(1.2) Existem diversas funções para utilizar os Modais de Janela (ModalWindow) desde modalWindow:addButtons(...) ou modalWindow:addChoices(...), porém não vou me prolongar sobre o assunto da modal, pois o objetivo é que funcione o sistema de crafting. 

 

(2) INSTALAÇÃO

 

(2.1) Na pasta data/lib/ abra o arquivo lib.lua

 

(2.2) Insira o seguinte código


-- Modal window
dofile('data/lib/modalwindow.lua')

(2.3) Na mesma pasta lib, crie um arquivo chamado modalwindow.lua e adicione o código abaixo no arquivo


if not modalWindows then
    modalWindows = {
        modalWindowConstructor = ModalWindow,
        nextFreeId = 500,
 
        windows = {}
    }
end
 
local MT = {}
MT.__index = MT
 
function ModalWindow(...)
    local args = {...}
    if type(args[1]) == 'table' then
        local self = setmetatable(args[1], MT)
        local id = modalWindows.nextFreeId        
        self.id = id
        self.buttons = {}
        self.choices = {}
        self.players = {}
        self.created = false
 
        modalWindows.nextFreeId = id + 1
        table.insert(modalWindows.windows, self)
        return self
    end
 
    return modalWindows.modalWindowConstructor(...)
end
 
function MT:setDefaultCallback(callback)
    self.defaultCallback = callback
end
 
function MT:addButton(text, callback)
    local button = {text = tostring(text), callback = callback}
    table.insert(self.buttons, button)
    return button
end
 
function MT:addButtons(...)
    for _, text in ipairs({...}) do
        table.insert(self.buttons, {text = tostring(text)})
    end
end
 
function MT:addChoice(text)
    local choice = {text = tostring(text)}
    table.insert(self.choices, choice)
    return choice
end
 
function MT:addChoices(...)
    for _, text in ipairs({...}) do
        table.insert(self.choices, {text = tostring(text)})
    end
end
 
function MT:setDefaultEnterButton(text)
    self.defaultEnterButton = text
end
 
function MT:setDefaultEscapeButton(text)
    self.defaultEscapeButton = text
end
 
function MT:setTitle(title)
    self.title = tostring(title)
end
 
function MT:setMessage(message)
    self.message = tostring(message)
end
 
local buttonOrder = {
    [4] = {3, 4, 2, 1},
    [3] = {2, 3, 1},
    [2] = {1, 2},
    [1] = {1}
}
function MT:create()
    local modalWindow = modalWindows.modalWindowConstructor(self.id, self.title, self.message)
    local order = buttonOrder[math.min(#self.buttons, 4)]
 
    if order then
        for _, i in ipairs(order) do
            local button = self.buttons[i]
            modalWindow:addButton(i, button.text)
            button.id = i
 
            if button.text == self.defaultEnterButton then
                modalWindow:setDefaultEnterButton(i)
            elseif button.text == self.defaultEscapeButton then
                modalWindow:setDefaultEscapeButton(i)
            end
        end
    end
 
    for _, choice in ipairs(self.choices) do
        modalWindow:addChoice(_, choice.text)
        choice.id = _
    end
 
    self.modalWindow = modalWindow
end
 
function MT:sendToPlayer(player)
    if not self.modalWindow then
        self:create()
    end
 
    player:registerEvent('ModalWindowHelper')
    self.players[player:getId()] = true
    return self.modalWindow:sendToPlayer(player)
end

(2.4) Agora em data/creaturescript/creaturescript.xml adicione


<event type="modalwindow" name="ModalWindowHelper" script="modalwindowhelper.lua" />

(2.5) Em data/creaturescript/scripts/ crie um arquivo lua chamado modalwindowhelper com o seguinte código


function onModalWindow(player, modalWindowId, buttonId, choiceId)
    local modalWindow
    for _, window in ipairs(modalWindows.windows) do
        if window.id == modalWindowId then
            modalWindow = window
            break
        end
    end
 
    if not modalWindow then
        return true
    end
 
    local playerId = player:getId()
    if not modalWindow.players[playerId] then
        return true
    end
    modalWindow.players[playerId] = nil
 
    local choice = modalWindow.choices[choiceId]
 
    for _, button in ipairs(modalWindow.buttons) do
        if button.id == buttonId then
            local callback = button.callback or modalWindow.defaultCallback
            if callback then
                callback(button, choice)
                break
            end
        end
    end
 
    return true
end

(2.6) PRONTO, AS MODAIS DE JANELA ESTÃO INSTALADAS E PRONTAS PARA USO! VAMOS A PARTE 2 COM A INSTALAÇÃO DO SIMPLE CRAFTING SYSTEM!

 

PARTE 2

Instalação do Simple Crafting System

 

(1.1) Existem alguns sistemas de crafting porém são mais complexos. Este sistema feito por strutZ é super simples e altamente configurável baseado nas suas necessidades! Apenas adicionando os scripts de actions e os de lib. Não há necessidade de registrar nada em login.lua ou em creaturescript.

 

(2) INFORMAÇÕES DO SISTEMA 

Tem uma seção de configuração bem simples onde você pode colocar os items que deseja que sejam craftados e também os items necessários para craftar. Também a personalização dos textos que aparecem nas janelas modais que já foram instaladas na Parte 1.

• Abaixo alguma explicação sobre as configurações do código após ter instalado (para iniciar a instalação vamos ao (2.1)


local config = {
-- Configuracao da Janela Modal
    mainTitleMsg = "Crafting System", -- TITUTLO DA JANELA QUE ABRE
    mainMsg = "Welcome to the crafting system. Please choose a vocation to begin.", -- MENSAGEM DA JANELA
 
    craftTitle = "Crafting System: ", -- Titulo da tela de craft apos o player selecionar a vocacao destinada dos items
    craftMsg = "Here is a list of all items that can be crafted for the ", -- Mensagem na tela de craft após escolhas do jogador de vocação
-- Fim da config Janela Modal
 
-- Notificacoes ao player
    needItems = "You do not have all the required items to make ", -- Mensagem que aparece quando o player tenta craftar e nao tem todos os items
 
-- Configuracoes de Crafting
    system = {
    [1] = {vocation = "Master Wizard", -- Isto e apenas uma categoria, nao influencia em nada
            items = {
                [1] = {item = "arcane staff", -- item name (O NOME TEM QUE SER EXATO, SENAO NAO FUNCIONA!)
                        itemID = 2453, -- ID do item que sera feito, tem que ser compativel com o nome acima
                        reqItems = { -- items e quantidade dos items necessarios para craftar
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },

 

(2.1) Primeiramente vamos a pasta data/actions/actions.xml e adicionar a seguinte linha. O ITEMID é o ID do item que você deseja que seja utilizado para craftar. (no meu caso para teste das fotos usei o item id 8300, mas você pode colocar o que desejar)


  <action itemid="ITEMID" script="crafting.lua"/>

 

(2.2) Ai em data/actions/scripts/ crie um arquivo lua chamado crafting com o seguinte código


local config = {
-- Configuracao da Janela Modal
    mainTitleMsg = "Crafting System", -- TITUTLO DA JANELA QUE ABRE
    mainMsg = "Welcome to the crafting system. Please choose a vocation to begin.", -- MENSAGEM DA JANELA
 
    craftTitle = "Crafting System: ", -- Titulo da tela de craft apos o player selecionar a vocacao destinada dos items
    craftMsg = "Here is a list of all items that can be crafted for the ", -- Mensagem na tela de craft após escolhas do jogador de vocação
-- Fim da config Janela Modal
 
-- Notificacoes ao player
    needItems = "You do not have all the required items to make ", -- Mensagem que aparece quando o player tenta craftar e nao tem todos os items
 
-- Configuracoes de Crafting
    system = {
    [1] = {vocation = "Master Wizard", -- Isto e apenas uma categoria, nao influencia em nada
            items = {
                [1] = {item = "arcane staff", -- item name (O NOME TEM QUE SER EXATO, SENAO NAO FUNCIONA!)
                        itemID = 2453, -- ID do item que sera feito, tem que ser compativel com o nome acima
                        reqItems = { -- items e quantidade dos items necessarios para craftar
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},
				
	[2] = {vocation = "Elder Wizard", 
            items = {
                [1] = {item = "arcane staff", 
                        itemID = 2453,
                        reqItems = { 
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},			
				
	[3] = {vocation = "Swift Archer", 
            items = {
                [1] = {item = "arcane staff", 
                        itemID = 2453,
                        reqItems = { 
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},			
			
	[4] = {vocation = "Guardian Warrior",
            items = {
                [1] = {item = "arcane staff", 
                        itemID = 2453,
                        reqItems = { 
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                   
                [2] = {item = "enchanted spear",
                        itemID = 7367,    
                        reqItems = {
                                [1] = {item = 9969, count = 1}, -- Black Skull
                                [2] = {item = 5904, count = 30}, -- Magic Sulphur
                            },
                        },
                 	},
				},		
								
			},
        		
		}
		
               
local player = Player(cid)
function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey)

		player:sendMainCraftWindow(config)

	return true
end

OBS: Coloquei os mesmos items e matéria prima para todas as categorias, para facilitar a edição e compreensão do código.

 

(2.3) Ai na pasta data/ abra o arquivo global.lua e adicionei no início o seguinte código, salve e mantenha o arquivo aberto.


dofile('data/lib/crafting.lua')

(2.3.1) No mesmo arquivo global.lua insira após o último end


function capAll(str)
    local newStr = ""; wordSeparate = string.gmatch(str, "([^%s]+)")
    for v in wordSeparate do
        v = v:gsub("^%l", string.upper)
        if newStr ~= "" then
            newStr = newStr.." "..v
        else
            newStr = v
        end
    end
    return newStr
end

 

(2.4) Em data/lib/ crie um arquivo lua chamado crafting e adicione o seguinte código dentro


-- Main Crafting Window -- This is the modal window that is displayed first
function Player:sendMainCraftWindow(config)
    local function buttonCallback(button, choice)
 
    -- Modal Window Functionallity
        if button.text == "Select" then
            self:sendVocCraftWindow(config, choice.id)
        end
    end
   
    -- Modal window design
    local window = ModalWindow {
        title = config.mainTitleMsg, -- Title of the main craft modal window
        message = config.mainMsg.."\n\n" -- Message of the main craft modal window
    }
 
    -- Add buttons to the window (Note: if you change the names of these you must change the functions in the modal window functionallity!)
    window:addButton("Select", buttonCallback)
    window:addButton("Exit", buttonCallback)
   
    -- Add choices from the action script
    for i = 1, #config.system do
        window:addChoice(config.system[i].vocation)
    end
 
    -- Set what button is pressed when the player presses enter or escape.
    window:setDefaultEnterButton("Select")
    window:setDefaultEscapeButton("Exit")
   
    -- Send the window to player
    window:sendToPlayer(self)
end
-- End of the first modal window
 
 
 
-- This is the modal window that displays all avalible items for the chosen vocation.
function Player:sendVocCraftWindow(config, lastChoice)
    local function buttonCallback(button, choice)  
 
-- Modal Window Functionallity
        -- If the user presses the back button they will be redirected to the main window.
        if button.text == "Back" then
            self:sendMainCraftWindow(config)
        end
        -- If the user presses the details button they will be redirected to a text window with information about the item they want to craft.
        if button.text == "Details" then
        local item = config.system[lastChoice].items[choice.id].item
        local details = "In order to craft "..item.." you must collect the following items.\n\nRequired Items:"
 
            for i = 1, #config.system[lastChoice].items[choice.id].reqItems do
            local reqItems = config.system[lastChoice].items[choice.id].reqItems[i].item
            local reqItemsCount = config.system[lastChoice].items[choice.id].reqItems[i].count
            local reqItemsOnPlayer = self:getItemCount(config.system[lastChoice].items[choice.id].reqItems[i].item)
                details = details.."\n- "..capAll(getItemName(reqItems).." ["..reqItemsOnPlayer.."/"..reqItemsCount.."]")
            end
       
            self:showTextDialog(item, details)
            self:sendVocCraftWindow(config, lastChoice)
        end
       
        -- if the player presses the craft button then begin checks.
        if button.text == "Craft" then
       
            -- Check if player has required items to craft the item. If they dont send needItems message.
            for i = 1, #config.system[lastChoice].items[choice.id].reqItems do
                if self:getItemCount(config.system[lastChoice].items[choice.id].reqItems[i].item) < config.system[lastChoice].items[choice.id].reqItems[i].count then
                    self:say(config.needItems..config.system[lastChoice].items[choice.id].item, TALKTYPE_MONSTER_SAY)
                    return false
                end
            end
            -- Remove the required items and there count from the player.
            for i = 1, #config.system[lastChoice].items[choice.id].reqItems do
                self:removeItem(config.system[lastChoice].items[choice.id].reqItems[i].item, config.system[lastChoice].items[choice.id].reqItems[i].count)
            end            
        -- Send effect and give player item.
        self:addItem(config.system[lastChoice].items[choice.id].itemID)
        self:getPosition():sendMagicEffect(CONST_ME_FIREATTACK)
        end
    end
 
    -- Modal window design
    local window = ModalWindow {
        title = config.craftTitle..config.system[lastChoice].vocation, -- The title of the vocation specific window
        message = config.craftMsg..config.system[lastChoice].vocation..".\n\n", -- The message of the vocation specific window
    }
   
    -- Add buttons to the window (Note: if you change the names of these you must change the functions in the modal window functionallity!)
    window:addButton("Back", buttonCallback)
    window:addButton("Exit")
    window:addButton("Details", buttonCallback)
    window:addButton("Craft", buttonCallback)
   
    -- Set what button is pressed when the player presses enter or escape
    window:setDefaultEnterButton("Craft")
    window:setDefaultEscapeButton("Exit")
   
    -- Add choices from the action script
    for i = 1, #config.system[lastChoice].items do
        window:addChoice(config.system[lastChoice].items[i].item)
    end
   
    -- Send the window to player
    window:sendToPlayer(self)
end

 

PRONTO! É apenas isso, seu sistema de crafting está 100% funcional se você fizer tudo corretamente. Ele está pronto para ser personalizado, onde você pode adicionar as categorias que quiser e os itens que quiser para craftar, tanto como as matérias primas.

 

Espero ter ajudado, nada aqui é de minha autoria, apenas minha edição para facilitar a compreensão e junção de todos os scripts em um post único para ter o sistema 100% funcional.

 

Fico a disposição e boa sorte!

 

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.6k

Informação Importante

Confirmação de Termo