Ir para conteúdo
  • Cadastre-se

Posts Recomendados

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!

Link para o post
Compartilhar em outros sites

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:

Link para o post
Compartilhar em outros sites
  • 5 months later...

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 

 

Link para o post
Compartilhar em outros sites
  • 2 years later...

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.

Link para o post
Compartilhar em outros sites
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!

 

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.


  • Conteúdo Similar

    • Por Bagon
      Bom, hoje venho trazer á vocês um sistema de Pet System DIFERENCIADO de alguns presentes no fórum. Este sistema tem diversos comandos diferenciados, como: 
       
      !pet nomedopet este comando irá sumonar o pet. 
      !remove irá remover o pet.
      !fale eu sou lindo o pet falará "eu sou lindo"
      !conversar o pet irá conversar com vc. 
       
      Então sem mais delongas vamos ao script.
       
      OBS: SCRIPT TESTADO SOMENTE EM TFS 0.4/0.3, e este script foi feito com a intenção de ser vendido no site do ot ou em poderá usar como quest usando o item selecionado como premio. fique ao seu critério.
       
      Primeiro vá até a pasta talkaction/script e crie um arquivo chamado petsystem.lua, depois coloque o seguinte script:
       
       
      Agora em talkactions/talkactions.xml adicione a seguinte tag:
       
      <talkaction words="!pet;!remove;!fale;!conversar" event="script" value="petsystem.lua" />  
      EXPLICAÇÂO:
      As partes em Negrito, são os pets. Você pode alterar ou criar monstros para fazer eles como pets. (Recomendo criar um monstro para que seja somente pet.)
       
      Exemplo: ["dog"]= {stor=78552},      
       
       
      Lembrando que é necessário mudar esta parte no script do monstro colocado a cima.
       
      <flag attackable="1" /> para :
       
      <flag attackable="0" />  
      agora vá em action/script e crie um arquivo chamado pet com o seguinte script:
       
       
      e vá em action.xml e adiciona a seguinte tag:
       
      <action itemid="10063" script="pet.lua"/> Explicação: Na tag da action o itemid é o item que deverá ser usado para ganhar a storage 78552, e assim podera sumonar o monstro com esta storage.
       
                                              
                                                         CRIE UMA ACTION COM A TAG A CIMA PARA CADA MONSTRO COLOCADO NA TALKACTION,
                                                         BASTA VC ALTERAR A STORAGE DO SCRIPT DA ACTION
                                                         EXEMPLO: em action altere as storage que estão em vermelho, como mostra abaixo
       
                                                              if getPlayerStorageValue(cid, 78552) < 1 then
                                                              setPlayerStorageValue(cid, 78552, 1)
       
                                                         aonde tem 78552 altere para 78553 que no caso é a storage do cyclops escolhido lá no script da talkaction
                                                         e assim susecivelmente.
       
       
       
      CREDITOS:
      Mulizeu
      Smartbox
      Bagon 
       
    • Por DarkrestOnline
      Desencadeie o futuro em 15 de setembro de 2023 às 19:00 CEST, quando lançamos nosso servidor, destinado a redefinir os domínios de desempenho, aventura e PvP.
      19:00 CEST | 18:00 WEST | 02:00 PM GMT-3 | 10:00 AM PDT
       
      -
       
       
       
      Website: https://darkrest.online
       
      Lembra-se da emoção de se aventurar no mundo clássico de Tibia? O entusiasmo de cada nível ganho, o desespero por cada derrota árdua e a camaradagem com sua guilda? Nosso objetivo é trazer essa sensação de volta, mas com um toque novo. É por isso que o chamamos de "Nostalgia Redefinida".
       
      Informações do Servidor
      Exp: x2 (Rookgaard x6) Habilidade: x2 Mágica: x1 Saque: x1 Host: Canadá + Proxy para EU Renascimento: +35% maior que no vanilla 7.4  
      Estamos comprometidos em tornar este um servidor sem wipes a longo prazo. O motivo para as taxas mais baixas é justamente incentivar um ambiente de jogo estável e duradouro. Nosso servidor é projetado para ser um RPG difícil, mas com um forte ênfase em PVP. Prepare-se para uma experiência de jogo que testará suas habilidades, estratégia e trabalho em equipe.
       
       
       
      Novos Recursos
      Sistema de Criação Raridade e Bônus Sistema de Tarefas Personalizadas Coleta Novas Vocações e Magias O respawn não pode ser bloqueado Lanças e pequenas pedras aparecem no chão e têm 3% de chance de quebra  
       
      Política de Zero Tolerância para Bots, Macros e MC
      Temos uma política estrita de tolerância zero para trapaças, uso de bots e macros. Violar essas regras resultará em banimento permanente de todas as contas associadas ao indivíduo ofensor.
      Website: https://darkrest.online
       
      Informações Geek
      - Testamos nosso servidor com um total de 134 contas registradas durante a fase de teste e 183 jogadores.
      - Completamos 290 tarefas (cartões estilo Jira) com melhorias de desempenho, mudanças de equilíbrio, correções de bugs e novos recursos.
      - Reescrevemos completamente o salvamento de casas, a busca de caminhos (multithread), NPCs e melhoramos a IA dos monstros.
      Website: https://darkrest.online
       
    • Por Imperius
      Olá, pessoal! Acabei encontrando um script que tinha feito a um tempo atrás. Estou compartilhando aqui para quem quiser usar ou melhorar.
       
      É bem parecido com os outros sistemas de roleta, igual deste tópico: https://tibiaking.com/forums/topic/101557-action-cassino-roleta-de-items/
       
      Como funciona?
       
      O "Treasure Chest" é um item custom, onde o jogador têm a possibilidade de ganhar itens raros ou bem meia boca. Tudo dependerá da sorte.
       
      O jogador precisa tacar o treasure chest na bancada e acionar a alavanca. O treasure chest irá se transformar em vários itens de forma randômica no qual o jogador poderá ou não ganhar. No final, apenas um item é entregue ao jogador.
       
      Para entender melhor o seu funcionamento, segue o GIF abaixo:
       

       
       
      em data > actions > actions.xml
       
       
      em data > actions > scripts > crie um arquivo chamado leverTreasureChest.lua
       
       
      no banco de dados do servidor, adicione o seguinte código em "SQL":
       
       
       

      Também estou disponibilizando uma página PHP, para quem quiser usar no site do servidor. Na página tem informações sobre o funcionamento, quais são os possíveis prêmios e a lista de jogadores que ganharam os itens raros.
       

       
       
      Espero ter ajudado de alguma forma! : )
       
      treasure_chest.php
    • Por Mazarati
      SCAN
      forja.otbm
    • Por pota
      Desenvolvi por muito tempo uma base Pokémon do 0 (parti do TFS 1.2 e fui implementando tudo até chegar nessa versão que estou disponibilizando). O resultado é um servidor extremamente leve e estável (já testado com 100+ players e por mais de 1 mês sem cair). Basicamente, ele suporta tranquilamente 1k+ players e não tem nenhum bug conhecido que faça com que ele caia.
       
      Esse servidor ficou no ar por muito tempo (mais de 2 anos) e era conhecido como PokeDash. Acabei ficando sem tempo para administrar o servidor, o que fez com que a maioria dos players parassem de jogar e com que eu fechasse de vez.
       
      Pensei por muito tempo sobre o que fazer com ele, e decidi disponibilizar para a comunidade. Trata-se de algo único (eu ao menos nunca vi um servidor de Pokémon construído a partir do TFS 1.2)!
       
      Como desenvolvi todos os sistemas do 0, tomei cuidado para fazer tudo da melhor maneira possível e para que possa ser facilmente modificado e atualizado. Basicamente, os Pokémons podem ser criados a partir de um único arquivo XML (como monstros do Tibia), e nesse arquivo você pode especificar tudo, desde level máximo e mínimo de spawn, loots, tipos (fogo, agua, etc), se ele pode usar habilidades (surf, fly, etc), moves (quando alguém captura), ataques (quando selvagem), evoluções, chance de catch, etc.
      Exemplo de Pokemon
      Resumo de alguns sistemas (tem muita coisa, então coloquei os principais)
      ✅ Pokemons com level, status e boost. O level do player/boost também influencia no status dos pokes.
      ✅ Sistema de Love (seu poke fica mais forte que os demais quando upa de level matando pokemons mais fortes que ele).
      ✅ Base propria com Shinys e Ancients.
      ✅ Cada player pode conseguir ancient stone para evoluir 1 shiny para ancient através de quest.
      ✅ Moves bar e pokemon bar (troca de pokemon com 1 click).
      ✅ Autoloot agrupando em bags.
      ✅ Ganho de exp ao capturar/dar dex em pokes com um bonus adicional para o primeiro catch de cada poke.
      ✅ Mapa original com mais de 40 quests, incluindo outland com Ancients.
      ✅ Eventos diários automáticos: Futebol todo dia 19:30, arena PVP todo dia 20:00, golden arena aos sabados 17:00, bag premiada aos domingos/feriados 17:00.
      ✅ Profissões (facilmente customizáveis):
      Catcher: 3.5% mais chance de capturar um Pokemon. Hunter: 10% mais status de dano para o seu Pokemon (tanto magico quanto fisico). Blocker: 25% mais vida para seus Pokemons. Healer: 100% mais cura que aplica tanto em potions quando moves dos seus Pokemons. Explorer: 15% mais experiencia para seu personagem durante a caça. ✅ Task diária de catch/loot dando Tokens. Os tokens podem ser trocados por itens raros (dentre eles premier ball e bags personalizadas) além de pagar seu curso com o NPC Job Manager para aprender uma das profissões acima. Uma das maneiras de conseguir tokens é fazendo tasks diárias.
      ✅ Muito mais!
      Screenshots

       

      Download
      Baixe o pack contendo o servidor, cliente, site, editor de mapa e editor de itens clique aqui!. Caso considere minha contribuição interessante para a comunidade, considere realizar uma doação para a chave pix: [email protected]
      GM account: gm/gmgmgm
      O projeto será atualizado em sua homepage: https://pokedashpota.vercel.app/
       
      SCAN
       
      ---EDIT---
      Download sources
      SCAN
       
       Problemas e soluções
      GroupID não existe ao tentar logar no server.
       
      Erros ao importar o schema.sql.
       
      Comando /cb não funcionando:
       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo