
Histórico de Curtidas
-
lucasprimolemos recebeu reputação de wizv321 em Task System 1.2+Parabéns @KotZletY muito bom mesmo!
Uso tfs 1.3 porém eu coloco o nome do exemplo Rotworm ou Rotworms, mas ele não identifica quando falo com NPC e digo nome do monster
task_monsters = { [1] = {nome = "Rotworms", storage = 30000, amount = 40, exp = 5000, pointsTask = {1, 1}, items = {{id = 2157, count = 1}, {id = 2160, count = 3}}}, [2] = {nome = "Rotworm", storage = 30001, amount = 80, exp = 10000, pointsTask = {1, 1}, items = {{id = 10521, count = 1}, {id = 2160, count = 2}}},
Não sei qual problema, poderia me ajudar?
EDIT (monsters ok)
Eu coloquei o nome em letra minúscula e funcionou, vou continuar testando, por enquanto ok.
EDIT2 (task rank + task points show)
Percebi que o task points e rank não estão aparecendo no channel, como faço para ativa-los?
EDIT3 (task rank + task points RESOLVIDO)
Bom vi que no código tinha as funções que puxavam essas informações, portanto apenas modifiquei o lugar delas e agora esta aparecendo
function onSay(player, words, param) local text = ' ****** Tasks System Information ****** \n\n[+] Pontos Task [+]: Voce tem '..taskPoints_get(player)..' pontos Task.\n[+] Pontos Task Rank [+]: Voce tem '..taskRank_get(player)..' pontos Task.\n[+] Task Rank [+]: '..getRankTask(player)..'\n' if param:lower() == "me" then text = text .. '[+] Pontos Task [+]: Voce tem '..taskPoints_get(player)..' pontos Task.\n[+] Pontos Task Rank [+]: Voce tem '..taskRank_get(player)..' pontos Task.\n[+] Task Rank [+]: '..getRankTask(player)..' ' return false, player:popupFYI(text) end if getTaskInfos(player) then local taskNormal = player:getStorageValue(getTaskInfos(player).storage) text = text .. '\n\n ****** [+] Task Normal [+] ****** \n \n\n[*] Task Atual [*]: '..getTaskInfos(player).nome..' - Voce precisa matar: '..getTaskInfos(player).amount..'.\n[*] Premios [*]: '..getItemsFromTable(getTaskInfos(player).items)..' - '..getTaskInfos(player).pointsTask[1]..' Pontos Task - '..getTaskInfos(player).pointsTask[2]..' Pontos Rank da Task. \n[*] Progresso [*]: ['..(player:getStorageValue(getTaskInfos(player).storage))..'/'..getTaskInfos(player).amount..']\n[*] Status da Task [*]: '..(taskNormal == getTaskInfos(player).amount and 'Completa' or 'Incompleta')..'!' else text = text .. '\n\n ****** [+] Task Normal [+] ****** \n \n\n- Voce nao esta fazendo Task nenhuma.' end if getTaskDailyInfo(player) then local taskDaily = player:getStorageValue(getTaskDailyInfo(player).storage) text = text .. '\n\n\n ****** [+] Task Diaria [+] ****** \n \n\n[*] Task Atual [*]: '..getTaskDailyInfo(player).nome..' - Voce precisa matar: '..getTaskDailyInfo(player).amount..'.\n[*] Premios [*]: '..getItemsFromTable(getTaskDailyInfo(player).items)..' - '..getTaskDailyInfo(player).pointsTask[1]..' Pontos Task - '..getTaskDailyInfo(player).pointsTask[2]..' Pontos Rank da Task. \n[*] Progresso [*]: ['..(player:getStorageValue(getTaskDailyInfo(player).storage))..'/'..getTaskDailyInfo(player).amount..']\n[*] Status da Task [*]: '..(taskDaily == getTaskDailyInfo(player).amount and 'Completa' or 'Incompleta')..'!' else text = text .. '\n\n\n ****** [+] Task Diaria [+] ****** \n \n\n- Voce nao esta fazendo nenhuma Task Diaria.' end return false, player:popupFYI(text) end
Valeu tudo ok por enquanto!! rsrs
-
lucasprimolemos recebeu reputação de LukaOnPlay em [TFS 1.2/1.3] Simples Crafting SystemOlá 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
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!
-
lucasprimolemos deu reputação a gabriel28 em [OPORTUNIDADE] FantasyBR 10.98Muito interessante esse servidor.
-
lucasprimolemos deu reputação a joaopedrodepaiva em [OPORTUNIDADE] FantasyBR 10.98Muito interessante mesmo, se precisar de testers o/
-
lucasprimolemos recebeu reputação de Dwarfer em [OPORTUNIDADE] FantasyBR 10.98Olá Pessoal! No ano passado, tentei ter alguns otservers padrão, em diversas versões, porém é a mesmice de sempre.
Dei início então à um projeto completamente novo, algo diferente do tibia, porém nos padrões tibia. Buscando fidelizar players que gostam de RPG e história, mas mantendo a magia do PVP.
Vou explicar para vocês.
Versão
• 10.98
• Base (The Forgetten Server compilado TFS 1.3) - 98% perfeição
• Site editado Gesior com base em MyAAC (sistema de pagamento e create account 100%) - Falta modelar a parte de SHOP/MOUNTS, etc
Diferenciais.
Inicia seu personagem em uma cidade inicial, com as vocações padrões inciais, do lvl 8 ao 35.
Ao alcançar lvl 35 o personagem pode pegar um barco gratuito e definir dentro de sua vocação, como vai se especializar.
Vocações:
A ideia é ser uma EXP Fixa por todo leveling, onde as quests/tasks ajudarão muito no UP Level (muitas darão um level completo).
- Berserker Knight (dano, ataque rápido e movimento rápido)
- Guardian Knight (defesa, vida e capacidade)
- Elder Wizard (cura e buffs de cura)
- Trap Wizard (vida, debuf e trap spells)
- Master Wizard (dano e mana)
- Enchanted Wizard (regen, summon e running)
- Swift Paladin (crítico, ataque rápido e movimento rápido)
- Heavy Paladin (dano, capacidade e vida)
Ao definir sua vocação nova com Oracle de sua profissão básica, ele é transportado para FantasyCity, uma cidade completa 100% editada.
Nessa cidade o personagem pode começar a se aventurar, com quests missionárias e tasks.
Conta com um sistema completamente novo (já está pronto, só falta definir como será adquirido cada profissão, se é por quest ou missão)
JOBS, isso mesmo, o personagem pode trabalhar e CRAFTAR novos itens onde cada profissão consegue craftar ITENS únicos.
JOBS
Alfaiate (armors)
Escultor (arcos e wands)
Fabricante (shields)
Forjador (helmets)
Fazendeiro (foods especiais regen + buffs)
Mineiro (minera pedras preciosas usadas para profissões, venda e enchant)
Sapateiro (boots)
Joalheiros (rings e amulets)
Alquimista (poções especiais)
Ferreiro (swords, axes e clubs)
Um exemplo da profissão fazendeiro, que pode arar a terra, plantar, molhar, esperar a árvore crescer e colher frutas para fazer poções.
Cada profissão tem uma ala de crafting, exclusiva.
Mineiros onde podem mineirar e craftar
Alas da profissões abaixo
Exemplo de crafting fazendeiro (apenas cada JOB pode entrar em sua sala determinada)
Sistema prontinho para uso.
A ideia também é que aconteça livre comércio entre players, é por isso que o sistema de MARKET PLACE pelo DEPOT está ativado também.
Exemplo: Muitas profissões precisam de pedras que apenas o mineiro consegue coletar, e por ai vai.
---------------------
Conta também com um sistema de facções, foi ai onde parei, a ideia é que na história, tenha a facção a favor da cidade e do prefeito, e outra a favor do submundo...tem uma história pra quem quiser ler, senão só pular
"
FANTASY BR
Parte 1
Em um passado não muito distante, diziam que o poder estava nas mãos dos mais ricos, donos de terra e escravos. Mas uma força nada comum e invisível acompanhava e protegia os menos favorecidos.
Naquele tempo, só existiam 4 humanos capazes de acessar essa força: Thuman (cavalheiro espadachin), Satsofi (rainha das curas), Molinght (rei das flechas) e Balbuzor (mestre dos elementos), eles formaram a Legião Transcendente.
Em seu antigo templo, que ficava localizado na montanha mais alta, se reuniam todas as noites para comer, beber e iluminar todas as regiões com bençãos. Seu objetivo era manter a Ordem e a Paz.
Em suas aventuras desmistificando as leis universais, encontraram um livro acessando um portal, que continham sânscritos de magias com data desconhecida, e no dia em que foram testar a magia, houve um desastre. Thuman, Satsofi, Monlinght e Balbuzor com seus incríveis poderes falaram:
-Quod alta fores aperire partum spiritus (Que as portas profundas abram o espírito criador)
Porém não sabiam ao certo do que aquilo se tratava. Parte de seus poderes foi absorvido por uma força obscura, onde criaram uma permissão universal para uma nova dimensão, porém era a dimensão da obscuridade.
A partir daquele dia conhecido como catárte, nada mais foi o mesmo, com seus poderes diminuídos já não podiam abençoar os povos. Balbuzor infeliz com essa situação, pegou o livro e foi embora em uma madrugada onde a Legião estava adormecida. Muito, muito longe, desceu nos menores níveis, onde se encontravam criaturas diabólicas, mas carregando o livro em suas mãos, elas não tinham permissão de atacá-lo. Uma voz murmurava para Balbuzor onde ele devia ir, e obcecado pela falta de poder, era isso o que ele buscava. Entrou em uma sala, onde continha um pilar para o Livro. Colocou lentamente o livro sobre o pilar, o livro se abriu e páginas começaram a virar com o vento, até que parou na única página vermelha.
-Fac animum corpusque!!! Disse Balbuzor, invocando o espírito obscuro para dentro de seu corpo invólucro de muito poder.
Daquele dia em diante, Balbuzor suprido de muita força e duas personalidades começou a propagar o caos pela terra, expandindo cada vez mais os portais do mundo dimensional para o mundo humano. O caos e destruição estavam por toda parte. Era o fim.
Parte 2
A Legião Transcendente já não era mais forte, e agora tendo um inimigo que era mais forte que os três juntos, seu antigo parceiro Balbuzor.
Thuman disse que não conseguiram controlar tanto poder e nem lutar, Satsofi disse que com o poder atual dela, não conseguiria curar todos os feridos, mas Monlinght com sua esperança e fé elevada disse:
Nós somos a Legião, nós não desistimos. Se não temos o poder para lutar contra isso, então precisamos de uma solução, nós temos honra!
Realmente, não podemos desistir. Disse Thuman.
E se nós treinassemos magia para pessoas interessadas? Disse Satsofi.
Você sabe que isso não é permitido, e você viu o que aconteceu com Balbuzor. Disse Thuman.
Satsofi está certa, é a nossa única opção… Concluiu Monlinght.
Todos os três da Legião concordaram, e não demorou muito para muitas pessoas com habilidades diferentes se interessarem no treinamento. No início eram 10, que passou a ser 100 e logo já haviam mais de 1.000 guerreiros alguns com facilidade magia, outros com precisão e velocidade e muitos com força física.
Com o passar do tempo novas habilidades de luta e magias foram aprendidas e criou-se vocações que definem suas habilidades principais.
Os guerreiros (knights) podem se formar em
Guardian Warrior (mestre de defesa, com muita capacidade de resistência e vida)
Berserker Warrior (mestre dos ataques, rápido com lâminas e em seu movimento mas pouca resistência e vida)
Os arqueiros (paladins) podem se formar em
Swift Archer (utiliza bows e arrows, normalmente os mais rápidos)
Heavy Archer (utiliza crossbows e bolts, movimento e ataque lento, porém um ataque mais preciso e forte, defesa e vida maiores)
Os magos (sorcerer) podem se formar em
Master Wizard (são os magos com poder mágico mais forte)
Enchanted Wizard (magos com alto poder de regeneração de mana e vida, focado em invocações de monstros e criação de runas)
Os curandeiros (druids) podem se formar em
Elder Wizard (Altos poderes de cura em massa e individual)
Trap Wizard (Poderes mágicos focados em atordoar, silenciar e trapar)
Parte 3
Com o auxílio desses novos guerreiros, muitos conseguiram destruir os monstros de outras dimensões, mas também muitos foram derrotados. Os anos se passaram e uma cidade chamada Fantasy cujo Prefeito Dunkherman (que tinha muito poder financeiro) foi construída para todos os que lutam com objetivo de manter a Ordem e Paz.
Com auxílio do prefeito, um guerreiro muito forte chamado Mitswan fundou a Facção ALIANÇA, para que todos se unissem com o objetivo de proteger os cidadãos de qualquer mal.
Era inevitável que outros guerreiros pudessem pender ao lado obscuro, então Katsui, que foi treinado pela Legião dos 3, queria mais poder, pois ele chegou ao nível de seus mestres, e então criou uma Facção dos REBELDES, que queriam ter poder sobre a cidade Fantasy e então criar uma ligação com Balbuzor em busca de poder.
Desde então a luta pelo poder e pela ordem, derramou muito sangue, a única solução é criar guerreiros supremos, capazes de se conectar com a força maior para derrotar Balbuzor. Você consegue fazer isso por toda Fantasy?
"
Basicamente falando, o submundo foi aberto, gerando portais para o mundo real, e existem duas facções que batalham, uma a favor e outra conta o submundo (Balbuzor).
A ideia era criar guerras diárias definidas por faixa de leveis, onde para cada faixa de level a facção que ganhar ganha bonus exp de um dia para o outro e premios.
Enfim.
A Base do otserver está criada, mas falta tudo ainda, DETALHE: QuestLog ativado e funcionando perfeitamente, testado também!.
Para quem quer entrar de cabeça, da um bom trabalho, porém seria uma experiência bem diferente dos otservers comuns.
Não queremos PAY 2 WIN, e sim compras aceitáveis.
Hmmm, que mais? .... Fica ai algumas fotos
Templo Fantasy City
Futuro Tapete mágico após completar missão
Task NPC
Task System
Points System (A cada level vc ganha um ponto, o uso de pontos para atribuição de habilidades)
Site editado
Por enquanto é isso, dei o primeiro ponta pé de criar até aqui, mas agora que estou trabalhando tempo pouquissimo tempo, e perdi bastante as skills para mexer.
Quero agradecer o @Dwarfer por tirar milhares de dúvidas! hahahaha
Quem se interessar pode entrar em contato, pois realmente não vai depender muito de mim
OBS: TENHO 6 MESES DE HOSPEDAGEM WINDOWS SERVER 2003 QUALQUER CONFIGURAÇÃO.
-
lucasprimolemos recebeu reputação de gabriel28 em [OPORTUNIDADE] FantasyBR 10.98Olá Pessoal! No ano passado, tentei ter alguns otservers padrão, em diversas versões, porém é a mesmice de sempre.
Dei início então à um projeto completamente novo, algo diferente do tibia, porém nos padrões tibia. Buscando fidelizar players que gostam de RPG e história, mas mantendo a magia do PVP.
Vou explicar para vocês.
Versão
• 10.98
• Base (The Forgetten Server compilado TFS 1.3) - 98% perfeição
• Site editado Gesior com base em MyAAC (sistema de pagamento e create account 100%) - Falta modelar a parte de SHOP/MOUNTS, etc
Diferenciais.
Inicia seu personagem em uma cidade inicial, com as vocações padrões inciais, do lvl 8 ao 35.
Ao alcançar lvl 35 o personagem pode pegar um barco gratuito e definir dentro de sua vocação, como vai se especializar.
Vocações:
A ideia é ser uma EXP Fixa por todo leveling, onde as quests/tasks ajudarão muito no UP Level (muitas darão um level completo).
- Berserker Knight (dano, ataque rápido e movimento rápido)
- Guardian Knight (defesa, vida e capacidade)
- Elder Wizard (cura e buffs de cura)
- Trap Wizard (vida, debuf e trap spells)
- Master Wizard (dano e mana)
- Enchanted Wizard (regen, summon e running)
- Swift Paladin (crítico, ataque rápido e movimento rápido)
- Heavy Paladin (dano, capacidade e vida)
Ao definir sua vocação nova com Oracle de sua profissão básica, ele é transportado para FantasyCity, uma cidade completa 100% editada.
Nessa cidade o personagem pode começar a se aventurar, com quests missionárias e tasks.
Conta com um sistema completamente novo (já está pronto, só falta definir como será adquirido cada profissão, se é por quest ou missão)
JOBS, isso mesmo, o personagem pode trabalhar e CRAFTAR novos itens onde cada profissão consegue craftar ITENS únicos.
JOBS
Alfaiate (armors)
Escultor (arcos e wands)
Fabricante (shields)
Forjador (helmets)
Fazendeiro (foods especiais regen + buffs)
Mineiro (minera pedras preciosas usadas para profissões, venda e enchant)
Sapateiro (boots)
Joalheiros (rings e amulets)
Alquimista (poções especiais)
Ferreiro (swords, axes e clubs)
Um exemplo da profissão fazendeiro, que pode arar a terra, plantar, molhar, esperar a árvore crescer e colher frutas para fazer poções.
Cada profissão tem uma ala de crafting, exclusiva.
Mineiros onde podem mineirar e craftar
Alas da profissões abaixo
Exemplo de crafting fazendeiro (apenas cada JOB pode entrar em sua sala determinada)
Sistema prontinho para uso.
A ideia também é que aconteça livre comércio entre players, é por isso que o sistema de MARKET PLACE pelo DEPOT está ativado também.
Exemplo: Muitas profissões precisam de pedras que apenas o mineiro consegue coletar, e por ai vai.
---------------------
Conta também com um sistema de facções, foi ai onde parei, a ideia é que na história, tenha a facção a favor da cidade e do prefeito, e outra a favor do submundo...tem uma história pra quem quiser ler, senão só pular
"
FANTASY BR
Parte 1
Em um passado não muito distante, diziam que o poder estava nas mãos dos mais ricos, donos de terra e escravos. Mas uma força nada comum e invisível acompanhava e protegia os menos favorecidos.
Naquele tempo, só existiam 4 humanos capazes de acessar essa força: Thuman (cavalheiro espadachin), Satsofi (rainha das curas), Molinght (rei das flechas) e Balbuzor (mestre dos elementos), eles formaram a Legião Transcendente.
Em seu antigo templo, que ficava localizado na montanha mais alta, se reuniam todas as noites para comer, beber e iluminar todas as regiões com bençãos. Seu objetivo era manter a Ordem e a Paz.
Em suas aventuras desmistificando as leis universais, encontraram um livro acessando um portal, que continham sânscritos de magias com data desconhecida, e no dia em que foram testar a magia, houve um desastre. Thuman, Satsofi, Monlinght e Balbuzor com seus incríveis poderes falaram:
-Quod alta fores aperire partum spiritus (Que as portas profundas abram o espírito criador)
Porém não sabiam ao certo do que aquilo se tratava. Parte de seus poderes foi absorvido por uma força obscura, onde criaram uma permissão universal para uma nova dimensão, porém era a dimensão da obscuridade.
A partir daquele dia conhecido como catárte, nada mais foi o mesmo, com seus poderes diminuídos já não podiam abençoar os povos. Balbuzor infeliz com essa situação, pegou o livro e foi embora em uma madrugada onde a Legião estava adormecida. Muito, muito longe, desceu nos menores níveis, onde se encontravam criaturas diabólicas, mas carregando o livro em suas mãos, elas não tinham permissão de atacá-lo. Uma voz murmurava para Balbuzor onde ele devia ir, e obcecado pela falta de poder, era isso o que ele buscava. Entrou em uma sala, onde continha um pilar para o Livro. Colocou lentamente o livro sobre o pilar, o livro se abriu e páginas começaram a virar com o vento, até que parou na única página vermelha.
-Fac animum corpusque!!! Disse Balbuzor, invocando o espírito obscuro para dentro de seu corpo invólucro de muito poder.
Daquele dia em diante, Balbuzor suprido de muita força e duas personalidades começou a propagar o caos pela terra, expandindo cada vez mais os portais do mundo dimensional para o mundo humano. O caos e destruição estavam por toda parte. Era o fim.
Parte 2
A Legião Transcendente já não era mais forte, e agora tendo um inimigo que era mais forte que os três juntos, seu antigo parceiro Balbuzor.
Thuman disse que não conseguiram controlar tanto poder e nem lutar, Satsofi disse que com o poder atual dela, não conseguiria curar todos os feridos, mas Monlinght com sua esperança e fé elevada disse:
Nós somos a Legião, nós não desistimos. Se não temos o poder para lutar contra isso, então precisamos de uma solução, nós temos honra!
Realmente, não podemos desistir. Disse Thuman.
E se nós treinassemos magia para pessoas interessadas? Disse Satsofi.
Você sabe que isso não é permitido, e você viu o que aconteceu com Balbuzor. Disse Thuman.
Satsofi está certa, é a nossa única opção… Concluiu Monlinght.
Todos os três da Legião concordaram, e não demorou muito para muitas pessoas com habilidades diferentes se interessarem no treinamento. No início eram 10, que passou a ser 100 e logo já haviam mais de 1.000 guerreiros alguns com facilidade magia, outros com precisão e velocidade e muitos com força física.
Com o passar do tempo novas habilidades de luta e magias foram aprendidas e criou-se vocações que definem suas habilidades principais.
Os guerreiros (knights) podem se formar em
Guardian Warrior (mestre de defesa, com muita capacidade de resistência e vida)
Berserker Warrior (mestre dos ataques, rápido com lâminas e em seu movimento mas pouca resistência e vida)
Os arqueiros (paladins) podem se formar em
Swift Archer (utiliza bows e arrows, normalmente os mais rápidos)
Heavy Archer (utiliza crossbows e bolts, movimento e ataque lento, porém um ataque mais preciso e forte, defesa e vida maiores)
Os magos (sorcerer) podem se formar em
Master Wizard (são os magos com poder mágico mais forte)
Enchanted Wizard (magos com alto poder de regeneração de mana e vida, focado em invocações de monstros e criação de runas)
Os curandeiros (druids) podem se formar em
Elder Wizard (Altos poderes de cura em massa e individual)
Trap Wizard (Poderes mágicos focados em atordoar, silenciar e trapar)
Parte 3
Com o auxílio desses novos guerreiros, muitos conseguiram destruir os monstros de outras dimensões, mas também muitos foram derrotados. Os anos se passaram e uma cidade chamada Fantasy cujo Prefeito Dunkherman (que tinha muito poder financeiro) foi construída para todos os que lutam com objetivo de manter a Ordem e Paz.
Com auxílio do prefeito, um guerreiro muito forte chamado Mitswan fundou a Facção ALIANÇA, para que todos se unissem com o objetivo de proteger os cidadãos de qualquer mal.
Era inevitável que outros guerreiros pudessem pender ao lado obscuro, então Katsui, que foi treinado pela Legião dos 3, queria mais poder, pois ele chegou ao nível de seus mestres, e então criou uma Facção dos REBELDES, que queriam ter poder sobre a cidade Fantasy e então criar uma ligação com Balbuzor em busca de poder.
Desde então a luta pelo poder e pela ordem, derramou muito sangue, a única solução é criar guerreiros supremos, capazes de se conectar com a força maior para derrotar Balbuzor. Você consegue fazer isso por toda Fantasy?
"
Basicamente falando, o submundo foi aberto, gerando portais para o mundo real, e existem duas facções que batalham, uma a favor e outra conta o submundo (Balbuzor).
A ideia era criar guerras diárias definidas por faixa de leveis, onde para cada faixa de level a facção que ganhar ganha bonus exp de um dia para o outro e premios.
Enfim.
A Base do otserver está criada, mas falta tudo ainda, DETALHE: QuestLog ativado e funcionando perfeitamente, testado também!.
Para quem quer entrar de cabeça, da um bom trabalho, porém seria uma experiência bem diferente dos otservers comuns.
Não queremos PAY 2 WIN, e sim compras aceitáveis.
Hmmm, que mais? .... Fica ai algumas fotos
Templo Fantasy City
Futuro Tapete mágico após completar missão
Task NPC
Task System
Points System (A cada level vc ganha um ponto, o uso de pontos para atribuição de habilidades)
Site editado
Por enquanto é isso, dei o primeiro ponta pé de criar até aqui, mas agora que estou trabalhando tempo pouquissimo tempo, e perdi bastante as skills para mexer.
Quero agradecer o @Dwarfer por tirar milhares de dúvidas! hahahaha
Quem se interessar pode entrar em contato, pois realmente não vai depender muito de mim
OBS: TENHO 6 MESES DE HOSPEDAGEM WINDOWS SERVER 2003 QUALQUER CONFIGURAÇÃO.
-
lucasprimolemos deu reputação a Johncore em Gesior 1.2 Premium Pack - ANTI SQL INJECTION - TFS [1.x / OTX]tem algo mal configurado no seu vps
-
lucasprimolemos deu reputação a Johncore em Gesior 1.2 Premium Pack - ANTI SQL INJECTION - TFS [1.x / OTX]Gesior 1.2 Premium Pack - TFS [1.x / OTX]
Changelog 1.1
• Layout do tibia 2017 atualizado • ANTI SQL INJECTION • Site 100% seguro • Aba de Teamspeak configuravel • Pagina de Download com mais facilidade • Adicionada Pagina "Change Name" • Correção da página "Donate" • Adicionado metodos de pagamento como Pagseguro, Paypal, Deposito em conta e Picpay(Configuravel) • Site já vem com contador regressivo configuravel • Remoção de algumas paginas por ter falha de segurança. • Corrigido criação de contas • Corrigido pasta cache • Pagina de Prey, Reward e Imbuing • Cast System. • Login.php atualizado
SCAN:
DOWNLOAD
Creditos
ADM Argel, Qwizer, Gesior, Erimyth
-
lucasprimolemos deu reputação a Pedro. em Pequena Hunt ou Quest.Hunt ou Quest
versão: 10.98 sem monstros. feita por mim. https://www.mediafire.com/file/ev1spg3h501gyp4/1-hunt.rar https://www.virustotal.com/#/file/e2a79acf5264006e6b78540e9a517d25d017be1be59ae46a89d96aab57b2bd7a/detection
-
lucasprimolemos recebeu reputação de Ments em (Pesquisa de opinião) O que você acha sobre um 7.6?Não sei quantoi a players, pois é muito variável, e sinto pelo pouco que abri otserver, que temos os players voláteis e os players fiéis.
Players voláteis : normalmente jogadores de high exp e easy loot, pega lvl 500 ou 10k em um dia e tem tudo na mão com itens donate melhor do platena tibia
Players fiéis : players que buscam uma experiência em RPG, PVP, são aqueles que gostam de criar história em um servidor, então tendo um server de qualidade com as características que eles gostam, eles permanecem por bem mais tempo, caso o servidor tenha players para jogar.
Agora quanto a versão é complicado, eu amo 7.4/6 pq é pvp na mão, muito bom! mas não sei quanto ao mercado em si.
Fiz um teste recentemente, abri 3 baiaks 8.6, low exp, medium exp e high exp...todos entraram gente e dps sumiu tudo.
Um colega abriu pagou propaganda e assim que lanço (8.6 baiak medium) bateu 200 players, durou 1 semana com esses players, ai foi diminuindo em 2 semanas era 0 players online... (players voláteis).
É isso, um pouco de minha opinião, abraço!
-
lucasprimolemos recebeu reputação de Myalitth em [ADD ML TFS 1.3] Skill Points Help!Obrigado @Mirkaan
Resolvi da seguinte maneira, deixei que mages e pallys conseguissem +1 ml e kinas um percentual na média do 50% pra mais ml baixo e pra menos ml alto
elseif (p2[2] == "magic") then if getPlayerVocation(cid) == 4 or getPlayerVocation(cid) == 11 or getPlayerVocation(cid) == 12 or getPlayerVocation(cid) == 9 or getPlayerVocation(cid) == 10 or getPlayerVocation(cid) == 3 then --doPlayerSendCancel(cid, "Only avaible for mages!") player:addManaSpent(math.ceil((Vocation(getPlayerVocation(cid)):getRequiredManaSpent(player:getBaseMagicLevel() + 1*2) - player:getManaSpent()) / configManager.getNumber(configKeys.RATE_MAGIC))) else player:addManaSpent(player:getVocation():getRequiredManaSpent(player:getBaseMagicLevel() + 1) - player:getManaSpent()) --player:addSkillTries(skillId, player:getVocation():getRequiredSkillTries(skillId, player:getSkillLevel(skillId) + 1) - player:getSkillTries(skillId)) end
Obrigado de qlqr maneira!
#offtopic
@Mirkkan manja algo de mining system pra tfs 1.x +? to com 1.3 e nenhum q acho funciona, tem um que consegui pra 1.2 que parece perfeito, adicionei no action id do axe mas nao da bug, porém tb n funciona... kkkk
-
lucasprimolemos deu reputação a Myalitth em [ADD ML TFS 1.3] Skill Points Help!Hãm, verifique seu vocations.xml a parte (manamultiplier)
e/ou
Tenta substituir pra:
elseif p2[2] == "magic" then for m = 1, tonumber(p2[3]) do doPlayerAddSpentMana(cid, (getPlayerRequiredMana(cid, getPlayerMagLevel(cid, true) + 1) - getPlayerSpentMana(cid)), false) end
-
lucasprimolemos deu reputação a KotZletY em Gesior Shop Mount e Addon@lucasprimolemos Ele apenas mostrou um trabalho que ele fez "para o servidor dele" e como saio esse trabalho e pediu a opinião dos outros, esse tópico foi feito com a intenção de exibir o trabalho dele nada mais!
-
lucasprimolemos deu reputação a Sekk em Gesior Shop Mount e AddonAmigo, essa area é apenas de show off, aqui eles não são obrigados a compartilhar. Eu gostei tambem, tanto que se vc subir a pagina vai ver meu comentario, mas nao podemos fazer nada quanto a isso.
-
lucasprimolemos deu reputação a Wakon em error script faltandoDiz que não está encontrando a função onUse nos scripts citados nas tags, a callback deveria ser:
function onUse(cid, item, fromPos, itemEx, toPos) Apenas o terceiro erro que é diferente, você provavelmente colocou uma tag do actions no creaturescripts.xml!
Ao invés de criar scripts vazios, basta retirar as tags dos locais citados, procure a linha de cada script e remove .
-
lucasprimolemos recebeu reputação de KotZletY em [TFS 1.2/1.3] Simples Crafting SystemOlá 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
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!
-
lucasprimolemos deu reputação a KotZletY em Task System 1.2+@lucasprimolemos Hahahahaha, show, bom uso!!
-
lucasprimolemos deu reputação a Thiago Rulexz em [TFS 1.x] Crafting SystemBom após 1 semana tentando entrar em contato com o Colors consegui a permissão para trazer o Crafting System 1.x dele para o Tibiaking...
Sem mais Demoras vamos lá
Imagens do Script
Vamos instalar ele então \õ/
Em actions
Em CreatureScript
Parte Configurave
Abra data/global.lua e cole na primeira linha
Bom isso é tudo desse sistema grandinho, porem muito utilizável em servidores RPG
Creditos:
Colors (pelo sistema)
Eu (por encher o saco dele para liberar o post no TK)
Lembrando que o Autor Pediu para que não fosse publicado em vários tópicos, Autorizando meu poste no TK!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
O Sistema não é meu, mais darei suporte no que eu conseguir.
-
lucasprimolemos deu reputação a Mophus em TFS 1.0 Skill Point SystemOpa galera, eu vi esse script em outro fórum e trouxe aqui para compartilhar com vocês porque achei a ideia bacana.
TFS 1.0 Skill Point System
O script é uma forma de customizar seu personagem à medida que ele vai avançando de level. O avanço de level dá ao jogador "pontos", os quais podem ser utilizados para comprar HP, MP e niveis de skills. O grande benefício desse sistema é que jogadores de um mesmo level podem ser radicalmente diferentes e podem se especializar, como no caso de uma equipe/time (um druida com pontos pode se especializar em HP e MP e virar o healer do time, enquanto um knight pode se especializar somente skills para ser o atacante e outro em HP para ser o tank e bloquer). Algumas imagens do funcionamento (retiradas do outro tópico original):
Agora que já se interessou pelo sistema, vamos aplicá-lo em nosso servidor!
Em /creaturescripts/scripts/skillpoints.lua local SkillPoints = { [1] = 1, [2] = 1, [3] = 1, [4] = 1, [5] = 1, [6] = 1, [7] = 1, [8] = 1, } function onAdvance(cid, skill, oldlevel, newlevel) if not (SkillPoints[getPlayerVocation(cid)]) then return true end if (skill == 8) then if (getPlayerStorageValue(cid, 14573) < newlevel) then if (getPlayerStorageValue(cid, 14574) < 0) then setPlayerStorageValue(cid, 14574, 0) setPlayerStorageValue(cid, 14573, 0) end setPlayerStorageValue(cid, 14573, newlevel) setPlayerStorageValue(cid, 14574, getPlayerStorageValue(cid, 14574) + (newlevel - oldlevel) * (SkillPoints[getPlayerVocation(cid)])) doCreatureSay(cid, '+1 Skill Point!', TALKTYPE_ORANGE_1) end end return true end Em /creaturescripts/scripts/login.lua, adicione
player:registerEvent("SkillPointSystem") Em /creaturescripts/creaturescripts.xml, adicione
<event type="advance" name="SkillPointSystem" script="skillpoints.lua"/> Em /talkactions/scripts/skillpoints.lua
local SkillPoints = { [1] = 1, [2] = 1, [3] = 1, [4] = 1, [5] = 1, [6] = 1, [7] = 1, [8] = 1, } function onSay(cid, words, param) local player = Player(cid) local vocation = Player(cid) if not (SkillPoints[getPlayerVocation(cid)]) then return false end local param = param:lower() local p2 = param:split(",") if (getPlayerStorageValue(cid, 14574) < 0) then setPlayerStorageValue(cid, 14574, 0) end local skillids = { ["shielding"] = 5, ["sword"] = 2, ["axe"] = 3, ["club"] = 1, ["fist"] = 0, ["distance"] = 4 } local attributes = { ["health"] = {np = 1, vl = 2, skn = "Hit Points"}, ["energy"] = {np = 1, vl = 2, skn = "Mana Points"}, ["magic"] = {np = 15, vl = 1, skn = "Magic Level"}, ["shielding"] = {np = 15, vl = 1, skn = "Shielding Skill"}, ["sword"] = {np = 15, vl = 1, skn = "Sword Skill"}, ["axe"] = {np = 15, vl = 1, skn = "Axe Skill"}, ["club"] = {np = 15, vl = 1, skn = "Club Skill"}, ["fist"] = {np = 15, vl = 1, skn = "Fist Skill"}, ["distance"] = {np = 15, vl = 1, skn = "Distance Skill"}, } if (param == "check") then doPlayerPopupFYI(cid, "<<<<< Skill Points >>>>> \n\nPoints Available: ".. getPlayerStorageValue(cid, 14574) .."\nPoints Per Level: ".. SkillPoints[getPlayerVocation(cid)]) elseif (p2[1] and p2[1] == "add") and (attributes[p2[2]]) and (tonumber(p2[3])) then local creature = Creature(cid) local cpos = creature:getPosition() if (getPlayerStorageValue(cid, 14574) < tonumber(p2[3]) * attributes[p2[2]].np) then doPlayerSendCancel(cid, "you need more skill points go hunt!") return cpos:sendMagicEffect(CONST_ME_POFF) end if (p2[2] == "health") then player:setMaxHealth(player:getMaxHealth() + attributes[p2[2]].vl * tonumber(p2[3])) player:addHealth(attributes[p2[2]].vl * tonumber(p2[3])) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have been rewarded with ".. tonumber(p2[3]) * attributes[p2[2]].vl .. "Hit Points") elseif (p2[2] == "energy") then player:setMaxMana(player:getMaxMana() + attributes[p2[2]].vl * tonumber(p2[3])) player:addMana(attributes[p2[2]].vl * tonumber(p2[3])) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have been rewarded with ".. tonumber(p2[3]) * attributes[p2[2]].vl .. "Mana Points") elseif (p2[2] == "magic") then player:addManaSpent(math.ceil((Vocation(getPlayerVocation(cid)):getRequiredManaSpent(player:getBaseMagicLevel() + 1) - player:getManaSpent()) / configManager.getNumber(configKeys.RATE_MAGIC))) ---Player receives message on Skill Advance elseif(skillids[p2[2]]) then for a = 1, tonumber(p2[3]) do player:addSkillTries(skillids[p2[2]], player:getVocation():getRequiredSkillTries(skillids[p2[2]], player:getSkillLevel(skillids[p2[2]]) + 1) - player:getSkillTries(skillids[p2[2]])) --Player receives message on Level Advance end end setPlayerStorageValue(cid, 14574, getPlayerStorageValue(cid, 14574) - tonumber(p2[3]) * attributes[p2[2]].np) else local msgx = "" for i, v in pairs(attributes) do local add = (v.np > 1) and "s" or "" msgx = msgx .. string.upper(i:sub(1,1)) .. i:sub(2, #i) .. " - ".. v.np .. " points".. add .. " = " .. v.vl .. " ".. v.skn .. "\n" end doPlayerPopupFYI(cid, " <<<<<<<< Add Skill Points >>>>>>>> \n\n Skill Points are used to customize your character\n\n".. msgx .. "\nExample of Use: ".. words .." add,health, 1\n\nPoints available: ".. getPlayerStorageValue(cid, 14574)) end return true end Em /talkactions/talkactions.xml, adicione
<talkaction words="!points" separator=" " script="skillpoints.lua"/> Se gostou, poste, CURTA e compartilhe!
<Não testei o script, embora tenham garantido no outro fórum que está funcionando... se não funcionar, poste no próprio tópico os erros relacionados a esse script ou então em nossa seção de dúvidas de scripting (http://www.tibiaking.com/forum/forum/249-suporte-de-scripts/)>
Abraços e continue sempre conferindo as novidades do TibiaKing!
[m's]
-
lucasprimolemos deu reputação a Everson Miranda em [Profissão] System (NPC + Look)@lucasprimolemos Entendi... Eu estou do trabalho agora, mas em casa eu tenho algo que possa te ajudar. Vou elaborar pelo metodo que vi de um vipsystem. que fica [VIP] antes do nome do player ex [VIP] Aerismith, entende?
Vou elaborar para profissões Tipo [Marceneiro] Aerosmith
Teria algum problema ou tem que ser exatamente no look?
-
lucasprimolemos recebeu reputação de Fir3element em [TFS 1.2/1.3] Simples Crafting SystemOlá 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
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!
-
lucasprimolemos recebeu reputação de Werner em [TFS 1.2/1.3] Simples Crafting SystemOlá 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
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!
-
lucasprimolemos deu reputação a KotZletY em Task System 1.2+Salve geral, recentemente fiz um Task System para meu servidor, então gostaria de compartilha ele com vocês, assim como outros scripts que fiz e gostaria de compartilhar. Bom, vamos ao que interessa.
Informações!!
Task Normal - Você 1x por vez, quantas vezes quiser, repetindo a task se também quiser.
Task Diaria - Você faz uma vez por dia, não podendo repeti em quanto as 24 horas não terminar.
Task Rank - É mostrado na descrição do player qual rank task ele possui.
Task Rank Quest - Um extra desse task system é o piso task, será explicado na parte do script, leiam com atenção.
Task Comandos - Comandos task, 1 para ver o progresso das suas task e outro para mostrar informações do seu personagem, como uma consulta, os comandos são: !task que mostra quais task você ta fazendo, tanto diaria quanto normal e !task me que mostrar informações do seu personagem, como rank, quantidade de pontos task e quantidade de pontos task rank.
Well, o resto é surpresa, cabe você descobrir! xD
Para não ficar só nas palavras, mostrarei algumas imagens, várias no caso: Removida, colocarei novas!
Instalação!!
Muito bem, chega de conversa, como instalar logo essa bagaça. Primeiramente vá em data/lib e abra o arquivo lib.lua e adicione:
dofile('data/lib/task system.lua') Ainda na pasta lib crie um arquivo.lua chamado task system.lua e adicione esse code dentro:
No final do tópico, ensinarei a configurar a lib. Agora vai em, data/npc e crie um arquivo.xml chamado task.xml e coloque esse code dentro:
<?xml version="1.0" encoding="UTF-8"?> <npc name="NPC Task" script="task system.lua" walkinterval="0" floorchange="0"> <health now="150" max="150"/> <look type="430"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. I'm in charge of delivering missions to the players. Would you like to do a {normal} task, {daily} task, {receive} your reward from a task or {abandon} a task ? You can also see the {normal task list} and the {daily task list}."/> <parameter key="message_farewell" value="See you later." /> <parameter key="message_walkaway" value="See you later." /> </parameters> </npc> Ainda na pasta npc, entre na pasta scripts e crie um arquivo.lua chamado task system.lua e adicione esse code dentro:
Agora vá em data/talkactions e abra o arquivo talkactions.xml e adicione a seguinte tag:
<talkaction words="!task" separator=" " script="task system.lua" /> Ainda na pasta talkactions entre na pasta scripts e crie um arquivo.lua chamado task system.lua e adicione esse code dentro dele:
Agora vá em data/creaturescripts e abra o arquivo creaturescripts.xl e adicione a seguinte tag:
<event type="kill" name="tasksystem" script="task system.lua"/> Ainda na pasta creaturescripts entre na pasta scripts e crie um arquivo.lua chamado task system.lua e adicione esse code dentro dele:
Ainda na pasta script abra o login.lua e adicione dentro:
player:registerEvent("tasksystem") Agora vá em data/events/scripts e abra o arquivo player.lua, depois de aberto, antes de:
self:sendTextMessage(MESSAGE_INFO_DESCR, description) adicione:
if thing:isCreature() then if thing:isPlayer() then description = string.format("%s\nTask Rank: "..getRankTask(thing), description) end end
Extra(Opcional)!!
Extra, vá em data/movements/scripts e crie um arquivo chamado tile task.lua, depois de aberto, antes de:
Vá em data/movements/movements.xml adicione:
<movevent event="StepIn" actionid="XXXX" script="tile task.lua"/>
Explicação: Com esse movements acima, você só poderá passar por o piso caso tenha pontos task necessário para passar, se ativar a opção, removePoints então a mesma quantidade de pontos necessária para passar, será removida, ao passar, caso esteja desativada, então
apenas será necessário ter os pontos task para passar. Em XXXX coloque o actionid, e o actionid coloque no piso desejado!
New Extra: Vá em data/movements/scripts e crie um arquivo chamado tile task2.lua e adicione o seguinte scripts:
Vá em data/movements/movements.xml adicione:
<movevent event="StepIn" actionid="XXXX" script="tile task2.lua"/> Explicação: Ao adicionar esse movements acima, você só poderá passar pelo piso caso seu rank task seja igual ou superior ao rank definido na variável, caso não seja igual e nem superior, não será possível passar.
Configure na lib, a sequência de ranks de acordo com a sequência de rank da tabela de pontos, assim:
A sequência precisa está igual e numeradas.
Configurando!!
task_monsters = { [1] = {name = "monster1", mons_list = {"monster_t2", "monster_t3"}, storage = 30000, amount = 20, exp = 5000, pointsTask = {1, 1}, items = {{id = 2157, count = 1}, {id = 2160, count = 3}}}, [2] = {name = "monster2", mons_list = {"", ""}, storage = 30001, amount = 10, exp = 10000, pointsTask = {1, 1}, items = {{id = 10521, count = 1}, {id = 2160, count = 5}}}, [3] = {name = "monster3", mons_list = {"", ""}, storage = 30002, amount = 10, exp = 18000, pointsTask = {1, 1}, items = {{id = 2195, count = 1}, {id = 2160, count = 8}}}, [4] = {name = "monster4", mons_list = {"", ""}, storage = 30003, amount = 10, exp = 20000, pointsTask = {1, 1}, items = {{id = 2520, count = 1}, {id = 2160, count = 10}}} } task_daily = { [1] = {name = "monsterDay1", mons_list = {"monsterDay1_t2", "monsterDay1_t3"}, storage = 40000, amount = 10, exp = 5000, pointsTask = {1, 1}, items = {{id = 2157, count = 1}, {id = 2160, count = 3}}}, [2] = {name = "monsterDay2", mons_list = {"", ""}, storage = 40001, amount = 10, exp = 10000, pointsTask = {1, 1}, items = {{id = 10521, count = 1}, {id = 2160, count = 5}}}, [3] = {name = "monsterDay3", mons_list = {"", ""}, storage = 40002, amount = 10, exp = 18000, pointsTask = {1, 1}, items = {{id = 2195, count = 1}, {id = 2160, count = 8}}}, [4] = {name = "monsterDay4", mons_list = {"", ""}, storage = 40003, amount = 10, exp = 20000, pointsTask = {1, 1}, items = {{id = 2520, count = 1}, {id = 2160, count = 10}}} }
nome - Nome do monstro.
mons_list - Nome dos monstro que são semelhantes e que matando eles também contará.
Exemplo:
name = "troll", mons_list = {"troll","frost troll","island troll"} e assim matando, troll, frost troll e island troll contará na task também.
storage - É a storage que salva a quantidade de monstros já matados.
amount - É a quantidade necessária de monstros matados para finalizar a task.
exp - É a quantidade de Experiência que vai ganhar ao finalizar a task, caso não queira dar experiência, basta deixar em 0.
pointsTask = {Task Points Que vai ganhar(Pontos usado no piso e etc..), Pontos Rank, que irá ganhar e aumentar seu rank.}
items - Itens que o player vai ganhar, devem está tabelados, dentro da tabela item, adicione das tabelas contendo o id do item e count, quantidade de items que irá ganhar.
Ex: items = {{id = 2157, count = 1}, {id = 2160, count = 3}} -- Aqui contém 2x tipos de itens, o 2157 e o 2160, e suas devidas quantidades que irá ganhar.
items = {{id = 2157, count = 1}} -- Aqui só tem 1 tipo de item e a quantidade que vai ganhar.
Adicione quantos itens quiser. O mesmo vale para as task diarias!
Bom, é isso ae, qualquer duvida, crítica, sugestões, deixem ae, se precisa de suporte na instalação ou está com erro em algo estarei dando suporte, abraços e bom uso do sistema.
É totalmente proibido leva meu sistema para outro site, blog ou fórum!
-
lucasprimolemos deu reputação a Cat em [Pedido] Quest que da montariaEm action/script crie um arquivo com o nome "mount1":
function onUse(cid, item, fromPosition, itemEx, toPosition) local effect = 30 -- efeito ao clicar no baú local storage = 34530 if(getPlayerStorageValue(cid, 34530) > 0) then doPlayerSendTextMessage(cid, 25, "Você já recebeu sua mount.") return TRUE end doPlayerAddMount(cid, ID) -- Aqui é o ID da montaria, você pode encontrar em DATA/XML/mounts.xml. doPlayerSendTextMessage(cid, 25, "Você ganhou uma nova mount.") doSendMagicEffect(getPlayerPosition(cid), effect) return TRUE end Agora em action.xml cole a tag:
<action actionid="12131" event="script" value="mount1.lua"/> actionid="12131" -> adicione no baú pelo map editor (em propriedades - actionid)
créditos: jhon992
-
lucasprimolemos deu reputação a Weddson em [Promotion] NPC Não reconhece vocaçãoAgora estou no PC vou fazer testes.