-
Total de Posts
67 -
Registro em
-
Última visita
-
Dias Ganhos
2
Mateus Roberto ganhou no último dia 2 de Março 2024
Mateus Roberto teve o conteúdo mais curtida!
Sobre Mateus Roberto

Informações Pessoais
-
Eu sou:
Scripter
Últimos Visitantes
Mateus Roberto's Achievements
-
elhelcio começou a seguir Mateus Roberto
-
Naruto Tibia 781 (ediçao)
Mateus Roberto respondeu ao tópico de asunakido em Suporte de Infraestrutura
Tenho uma boa indicação para custom NTO/DBO/POKEMON. Essa base é bem melhor em desempenho, walk lisa, entre outras coisas. Existem boas opções: 1. **TFS 1.4.2 1098 Original**: É só uma versão clean original. [Hidden Content] 2. **TFS 1.4.2 1098 do Gesior**: Ele fez algumas melhorias no desempenho. Suporta VPS fraco com menos de 150 jogadores online. Os monstros reagem bem (não são burros, mas normais, parecidos com o global). [Hidden Content] 3. **Black Tek**: Mesma coisa do Gesior, porém ele fez muitas melhorias, como sistemas de imbuments, argumentos, atributos customizados, entre muitas outras coisas. Vale a pena experimentar o Black Tek. [Hidden Content] Não recomendo pegar uma base Nekiro TFS 1.5. Existem 3 versões diferentes: 7.72, 8.0 e 8.60. Mas têm muitos problemas e são cheias de críticos, má walk, entre outros. Se caso você queira a versão 7.72, então pegue a nekiro 1.5 7.72 e assuma por sua conta própria corrigir tudo para deixá-la estável. Sei que é muito trabalhoso... [Hidden Content] -
Naruto Tibia 781 (ediçao)
Mateus Roberto respondeu ao tópico de asunakido em Suporte de Infraestrutura
Cara, você vai perder seu tempo à toa esperando que alguém possa te ajudar... Essa base foi feita por Xiadozu, não presta pra nada... Cheia de problemas críticos, bugs, muita coisa... Eu usava assim e só me deu dor de cabeça. Resolvi migrar para TFS 1.x+ e fiquei satisfeito. Mesmo mapa e scripts foram convertidos para TFS 1.x+ com mapa era Evolutions, sim... É melhor você largar essa base de merda e ir para uma versão mais recente, estável e tudo mais. -
Eu notei que o items.xml do Thunder e o original do Nekiro são bem diferentes... Ninguém me reportou isso, mas agora você me reportou, então vou testar para saber o que aconteceu... Procure essa linha: <item id="2816" article="a" name="dead rat" editorsuffix=" (Not Decaying)"> <attribute key="weight" value="3000" /> </item> E altere para isso: <item id="2816" article="a" name="dead rat"> <attribute key="weight" value="2000" /> <attribute key="decayTo" value="0" /> <attribute key="duration" value="30" /> <attribute key="corpseType" value="blood" /> </item> ve se resolve ou nao.
-
[FUNCIONANDO] Sistema de Diálogo para NPCs no OTClient a partir do TFS 1.x+
Mateus Roberto respondeu ao tópico de Mateus Roberto em Modules OTC
Corrigi o NPC. Antes, ele estava chamando o diálogo corretamente, mas acabei removendo algumas funções sem querer. Depois, o @Yome me relatou que o NPC não estava respondendo nem reagindo. Então, fui verificar o que estava faltando, adicionei as funções de volta e atualizei um pequeno tutorial. Agora está funcionando corretamente. O NPC acima foi atualizado. -
Mateus Roberto alterou sua foto pessoal
-
[FUNCIONANDO] Sistema de Diálogo para NPCs no OTClient a partir do TFS 1.x+
Mateus Roberto respondeu ao tópico de Mateus Roberto em Modules OTC
O que eu roubei??? Você não viu que eu dei crédito para o Dengo? Não vi nenhum tutorial de TFS 1.x para isso, então simplesmente peguei o sistema dele e adaptei para o TFS 1.x. Você é um cabeça oca... -
[FUNCIONANDO] Sistema de Diálogo para NPCs no OTClient a partir do TFS 1.x+
Mateus Roberto respondeu ao tópico de Mateus Roberto em Modules OTC
Esqueci de adicionar essa parte JSON. Para quem não adicionou, é necessário colocar para o opcode funcionar corretamente. Segue aqui. vá até data/lib/lib.lua e adicione esta linha no arquivo. dofile('dados/lib/core/json.lua') Depois disso, vá até data/lib/core, crie um arquivo chamado json.lua e adicione este código nele. -- -- json.lua -- -- Copyright (c) 2018 rxi -- -- Permission is hereby granted, free of charge, to any person obtaining a copy of -- this software and associated documentation files (the "Software"), to deal in -- the Software without restriction, including without limitation the rights to -- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -- of the Software, and to permit persons to whom the Software is furnished to do -- so, subject to the following conditions: -- -- The above copyright notice and this permission notice shall be included in all -- copies or substantial portions of the Software. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -- SOFTWARE. -- json = { _version = "0.1.1" } ------------------------------------------------------------------------------- -- Encode ------------------------------------------------------------------------------- local encode local escape_char_map = { [ "\\" ] = "\\\\", [ "\"" ] = "\\\"", [ "\b" ] = "\\b", [ "\f" ] = "\\f", [ "\n" ] = "\\n", [ "\r" ] = "\\r", [ "\t" ] = "\\t", } local escape_char_map_inv = { [ "\\/" ] = "/" } for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end local function escape_char(c) return escape_char_map[c] or string.format("\\u%04x", c:byte()) end local function encode_nil(val) return "null" end local function encode_table(val, stack) local res = {} stack = stack or {} -- Circular reference? if stack[val] then error("circular reference") end stack[val] = true if val[1] ~= nil or next(val) == nil then -- Treat as array -- check keys are valid and it is not sparse local n = 0 for k in pairs(val) do if type(k) ~= "number" then error("invalid table: mixed or invalid key types") end n = n + 1 end if n ~= #val then error("invalid table: sparse array") end -- Encode for i, v in ipairs(val) do table.insert(res, encode(v, stack)) end stack[val] = nil return "[" .. table.concat(res, ",") .. "]" else -- Treat as an object for k, v in pairs(val) do if type(k) ~= "string" then error("invalid table: mixed or invalid key types") end table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) end stack[val] = nil return "{" .. table.concat(res, ",") .. "}" end end local function encode_string(val) return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' end local function encode_number(val) -- Check for NaN, -inf and inf if val ~= val or val <= -math.huge or val >= math.huge then error("unexpected number value '" .. tostring(val) .. "'") end return string.format("%.14g", val) end local type_func_map = { [ "nil" ] = encode_nil, [ "table" ] = encode_table, [ "string" ] = encode_string, [ "number" ] = encode_number, [ "boolean" ] = tostring, } encode = function(val, stack) local t = type(val) local f = type_func_map[t] if f then return f(val, stack) end error("unexpected type '" .. t .. "'") end function json.encode(val) return ( encode(val) ) end ------------------------------------------------------------------------------- -- Decode ------------------------------------------------------------------------------- local parse local function create_set(...) local res = {} for i = 1, select("#", ...) do res[ select(i, ...) ] = true end return res end local space_chars = create_set(" ", "\t", "\r", "\n") local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") local literals = create_set("true", "false", "null") local literal_map = { [ "true" ] = true, [ "false" ] = false, [ "null" ] = nil, } local function next_char(str, idx, set, negate) for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end return #str + 1 end local function decode_error(str, idx, msg) local line_count = 1 local col_count = 1 for i = 1, idx - 1 do col_count = col_count + 1 if str:sub(i, i) == "\n" then line_count = line_count + 1 col_count = 1 end end error( string.format("%s at line %d col %d", msg, line_count, col_count) ) end local function codepoint_to_utf8(n) -- [Hidden Content] local f = math.floor if n <= 0x7f then return string.char(n) elseif n <= 0x7ff then return string.char(f(n / 64) + 192, n % 64 + 128) elseif n <= 0xffff then return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) elseif n <= 0x10ffff then return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, f(n % 4096 / 64) + 128, n % 64 + 128) end error( string.format("invalid unicode codepoint '%x'", n) ) end local function parse_unicode_escape(s) local n1 = tonumber( s:sub(3, 6), 16 ) local n2 = tonumber( s:sub(9, 12), 16 ) -- Surrogate pair? if n2 then return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) else return codepoint_to_utf8(n1) end end local function parse_string(str, i) local has_unicode_escape = false local has_surrogate_escape = false local has_escape = false local last for j = i + 1, #str do local x = str:byte(j) if x < 32 then decode_error(str, j, "control character in string") end if last == 92 then -- "\\" (escape char) if x == 117 then -- "u" (unicode escape sequence) local hex = str:sub(j + 1, j + 5) if not hex:find("%x%x%x%x") then decode_error(str, j, "invalid unicode escape in string") end if hex:find("^[dD][89aAbB]") then has_surrogate_escape = true else has_unicode_escape = true end else local c = string.char(x) if not escape_chars[c] then decode_error(str, j, "invalid escape char '" .. c .. "' in string") end has_escape = true end last = nil elseif x == 34 then -- '"' (end of string) local s = str:sub(i + 1, j - 1) if has_surrogate_escape then s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) end if has_unicode_escape then s = s:gsub("\\u....", parse_unicode_escape) end if has_escape then s = s:gsub("\\.", escape_char_map_inv) end return s, j + 1 else last = x end end decode_error(str, i, "expected closing quote for string") end local function parse_number(str, i) local x = next_char(str, i, delim_chars) local s = str:sub(i, x - 1) local n = tonumber(s) if not n then decode_error(str, i, "invalid number '" .. s .. "'") end return n, x end local function parse_literal(str, i) local x = next_char(str, i, delim_chars) local word = str:sub(i, x - 1) if not literals[word] then decode_error(str, i, "invalid literal '" .. word .. "'") end return literal_map[word], x end local function parse_array(str, i) local res = {} local n = 1 i = i + 1 while 1 do local x i = next_char(str, i, space_chars, true) -- Empty / end of array? if str:sub(i, i) == "]" then i = i + 1 break end -- Read token x, i = parse(str, i) res[n] = x n = n + 1 -- Next token i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "]" then break end if chr ~= "," then decode_error(str, i, "expected ']' or ','") end end return res, i end local function parse_object(str, i) local res = {} i = i + 1 while 1 do local key, val i = next_char(str, i, space_chars, true) -- Empty / end of object? if str:sub(i, i) == "}" then i = i + 1 break end -- Read key if str:sub(i, i) ~= '"' then decode_error(str, i, "expected string for key") end key, i = parse(str, i) -- Read ':' delimiter i = next_char(str, i, space_chars, true) if str:sub(i, i) ~= ":" then decode_error(str, i, "expected ':' after key") end i = next_char(str, i + 1, space_chars, true) -- Read value val, i = parse(str, i) -- Set res[key] = val -- Next token i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "}" then break end if chr ~= "," then decode_error(str, i, "expected '}' or ','") end end return res, i end local char_func_map = { [ '"' ] = parse_string, [ "0" ] = parse_number, [ "1" ] = parse_number, [ "2" ] = parse_number, [ "3" ] = parse_number, [ "4" ] = parse_number, [ "5" ] = parse_number, [ "6" ] = parse_number, [ "7" ] = parse_number, [ "8" ] = parse_number, [ "9" ] = parse_number, [ "-" ] = parse_number, [ "t" ] = parse_literal, [ "f" ] = parse_literal, [ "n" ] = parse_literal, [ "[" ] = parse_array, [ "{" ] = parse_object, } parse = function(str, idx) local chr = str:sub(idx, idx) local f = char_func_map[chr] if f then return f(str, idx) end decode_error(str, idx, "unexpected character '" .. chr .. "'") end function json.decode(str) if type(str) ~= "string" then error("expected argument of type string, got " .. type(str)) end local res, idx = parse(str, next_char(str, 1, space_chars, true)) idx = next_char(str, idx, space_chars, true) if idx <= #str then decode_error(str, idx, "trailing garbage") end return res end -
Tudo depende da sua capacidade de análise. Basta abrir o módulo, acessar o arquivo .LUA do OTClient que o Yomee postou e verificar todos os opcodes. Seu papel é entender o que precisa ser feito no lado do servidor para criar o script adequado e garantir que os dados sejam enviados corretamente para o cliente. Por exemplo, o servidor utiliza opcodes para transmitir as informações corretas ao cliente. Cabe a você assegurar que a comunicação entre ambos esteja funcionando conforme o esperado. No fim, não há segredo tudo depende da estrutura do seu servidor, seja ele TFS 0.x ou 1.x
-
diálogo system [OtClient] Diálogo System TFS 0.3.6
Mateus Roberto respondeu ao tópico de Wang em OTClient Mehah, V8 e derivados
esta aqui original tfs 0.3.6game_npcdialog.zip -
[FUNCIONANDO] Sistema de Diálogo para NPCs no OTClient a partir do TFS 1.x+
Mateus Roberto postou um tópico no fórum em Modules OTC
E aí, galera! 🚀 Fiz a adaptação deste script que era originalmente para TFS 0.3.6 by Gengo, e algumas pessoas me pediram explicação sobre como funciona e como deixá-lo compatível com TFS 1.x. Já tinha falado que era necessário converter as funções para a versão mais recente do TFS, e agora está pronto para uso! 🔹 Download: Basta baixar o module e colar na pasta do OTClient: 📂 data/mods/ ou data/modules/ (depende do seu OTClient). game_npcdialog.rar 💡 Como Funciona o Diálogo? Para que o sistema de diálogo reconheça a função, você precisa adicionar esta linha ao seu script de NPC: 📌 Exemplo básico de uso: openNpcDialog(player, Npc():getId(), "Olá jovem, vejo que você conseguiu chegar até aqui!\nClique em Recompensa e fique feliz pela conquista!", "Fechar&Recompensa") Sempre use openNpcDialog(player, getNpcCid(), "mensagem") corretamente! 💡 Resultado Final no NPC: function greetCallback(cid) local player = Player(cid) if not player then return true end openNpcDialog(player, Npc():getId(), "Olá jovem, vejo que você conseguiu chegar até aqui!\nClique em Recompensa e fique feliz pela conquista!", "Fechar&Recompensa") return true end 📌 Como Fechar a Janela de Diálogo? Se quiser que a opção "Fechar" funcione corretamente no diálogo do NPC, você deve garantir que a função closeNpcDialog(player) seja chamada corretamente. ✅ Exemplo Correto: openNpcDialog(player, Npc():getId(), message, "Fechar") elseif msgcontains(msg:lower(), "fechar") then closeNpcDialog(player) npcHandler:unGreet(cid) 📜 Implementação do Opcode no Servidor Se você ainda não implementou suporte para Opcode no lado do servidor, será necessário adicioná-lo na sua source para que o diálogo do NPC e outros módulos funcionem corretamente. 📌 Siga este tutorial e adicione o suporte à sua source do TFS 1.x+: 🔗 Link do commit: [Hidden Content] ⚠️ Atenção: Não sou responsável por possíveis danos à sua source. Faça as alterações por sua conta e risco. 📜 Script Completo para o NPC Aqui está o script completo. Vocês já sabem como adicionar NPCs, então basta colocar o arquivo dentro de data/npc e modificar como quiserem. local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onThink() npcHandler:onThink() end function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function greetCallback(cid) local player = Player(cid) if not player then return true end openNpcDialog(player, Npc():getId(), "Olá jovem, vejo que você conseguiu chegar até aqui!\nClique em Recompensa e fique feliz pela conquista!", "Fechar&Recompensa") return true end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local player = Player(cid) if not player then return false end if msgcontains(msg:lower(), "recompensa") then local message = "" if player:getStorageValue(7000) == -1 then player:setStorageValue(7000, 1) player:addItem(2160, 1) message = "Você acaba de ganhar uns trocado por chegar até aqui.\nVolte sempre!" else message = "Você ja pegou sua recompensa, obrigado e volte sempre!" end openNpcDialog(player, Npc():getId(), message, "Fechar") elseif msgcontains(msg:lower(), "fechar") then closeNpcDialog(player) npcHandler:unGreet(cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:setCallback(CALLBACK_GREET, greetCallback) npcHandler:addModule(FocusModule:new()) 📜 Configuração no Servidor (TFS 1.x+) Para que o sistema de diálogo funcione corretamente, você deve adicionar a seguinte linha no servidor: 📌 Edite o arquivo: data/lib/core/core.lua dofile('data/lib/core/npcdialog_lib.lua') Isso garante que o sistema de diálogo seja carregado corretamente. Agora crie o arquivo npcdialog_lib.lua dentro de data/lib/core/ e copie o código abaixo: 📌 Arquivo: data/lib/core/npcdialog_lib.lua local OpcodeDialog = 80 local Actions = { open = 1, closed = 2 } function openNpcDialog(player, npc, message, options) if not player or not player:isPlayer() then return end if not npc or type(npc) ~= "number" then error("openNpcDialog: NPC ID inválido.") return end if not options then options = '' end local data = { action = Actions.open, data = { npcId = npc, message = message, options = options } } local status, jsonData = pcall(json.encode, data) if not status then error("Erro ao converter dados para JSON: " .. tostring(jsonData)) return end player:sendExtendedOpcode(OpcodeDialog, jsonData) end function closeNpcDialog(player) if not player or not player:isPlayer() then return end local data = { action = Actions.closed } local status, jsonData = pcall(json.encode, data) if not status then error("Erro ao converter dados para JSON: " .. tostring(jsonData)) return end player:sendExtendedOpcode(OpcodeDialog, jsonData) end 📜 Configuração no Global.lua Agora você deve adicionar a seguinte linha no arquivo global.lua. Você pode colocá-la no começo do arquivo ou logo abaixo de closedLevelDoors = {}. 📌 Edite o arquivo: data/global.lua function table.find(tbl, value) for i, v in pairs(tbl) do if v == value then return i end end return nil end function table.serialize(x, recur) local t = type(x) recur = recur or {} if x == nil then return "nil" elseif t == "string" then return string.format("%q", x) elseif t == "number" or t == "boolean" then return tostring(x) elseif t == "table" then if table.find(recur, x) then error("Cannot serialize recursive tables.") end table.insert(recur, x) local serialized = {} for k, v in pairs(x) do local key = "[" .. table.serialize(k, recur) .. "]" local value = table.serialize(v, recur) table.insert(serialized, key .. " = " .. value) end return "{" .. table.concat(serialized, ", ") .. "}" else error("Cannot serialize value of type '" .. t .. "'.") end end Para quem não adicionou, é necessário colocar essa parte JSON para o opcode funcionar corretamente. Segue aqui: dofile('data/lib/core/json.lua') Depois disso, vá até data/lib/core, crie um arquivo chamado json.lua e adicione este código nele. -- -- json.lua -- -- Copyright (c) 2018 rxi -- -- Permission is hereby granted, free of charge, to any person obtaining a copy of -- this software and associated documentation files (the "Software"), to deal in -- the Software without restriction, including without limitation the rights to -- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -- of the Software, and to permit persons to whom the Software is furnished to do -- so, subject to the following conditions: -- -- The above copyright notice and this permission notice shall be included in all -- copies or substantial portions of the Software. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -- SOFTWARE. -- json = { _version = "0.1.1" } ------------------------------------------------------------------------------- -- Encode ------------------------------------------------------------------------------- local encode local escape_char_map = { [ "\\" ] = "\\\\", [ "\"" ] = "\\\"", [ "\b" ] = "\\b", [ "\f" ] = "\\f", [ "\n" ] = "\\n", [ "\r" ] = "\\r", [ "\t" ] = "\\t", } local escape_char_map_inv = { [ "\\/" ] = "/" } for k, v in pairs(escape_char_map) do escape_char_map_inv[v] = k end local function escape_char(c) return escape_char_map[c] or string.format("\\u%04x", c:byte()) end local function encode_nil(val) return "null" end local function encode_table(val, stack) local res = {} stack = stack or {} -- Circular reference? if stack[val] then error("circular reference") end stack[val] = true if val[1] ~= nil or next(val) == nil then -- Treat as array -- check keys are valid and it is not sparse local n = 0 for k in pairs(val) do if type(k) ~= "number" then error("invalid table: mixed or invalid key types") end n = n + 1 end if n ~= #val then error("invalid table: sparse array") end -- Encode for i, v in ipairs(val) do table.insert(res, encode(v, stack)) end stack[val] = nil return "[" .. table.concat(res, ",") .. "]" else -- Treat as an object for k, v in pairs(val) do if type(k) ~= "string" then error("invalid table: mixed or invalid key types") end table.insert(res, encode(k, stack) .. ":" .. encode(v, stack)) end stack[val] = nil return "{" .. table.concat(res, ",") .. "}" end end local function encode_string(val) return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"' end local function encode_number(val) -- Check for NaN, -inf and inf if val ~= val or val <= -math.huge or val >= math.huge then error("unexpected number value '" .. tostring(val) .. "'") end return string.format("%.14g", val) end local type_func_map = { [ "nil" ] = encode_nil, [ "table" ] = encode_table, [ "string" ] = encode_string, [ "number" ] = encode_number, [ "boolean" ] = tostring, } encode = function(val, stack) local t = type(val) local f = type_func_map[t] if f then return f(val, stack) end error("unexpected type '" .. t .. "'") end function json.encode(val) return ( encode(val) ) end ------------------------------------------------------------------------------- -- Decode ------------------------------------------------------------------------------- local parse local function create_set(...) local res = {} for i = 1, select("#", ...) do res[ select(i, ...) ] = true end return res end local space_chars = create_set(" ", "\t", "\r", "\n") local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",") local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u") local literals = create_set("true", "false", "null") local literal_map = { [ "true" ] = true, [ "false" ] = false, [ "null" ] = nil, } local function next_char(str, idx, set, negate) for i = idx, #str do if set[str:sub(i, i)] ~= negate then return i end end return #str + 1 end local function decode_error(str, idx, msg) local line_count = 1 local col_count = 1 for i = 1, idx - 1 do col_count = col_count + 1 if str:sub(i, i) == "\n" then line_count = line_count + 1 col_count = 1 end end error( string.format("%s at line %d col %d", msg, line_count, col_count) ) end local function codepoint_to_utf8(n) -- [Hidden Content] local f = math.floor if n <= 0x7f then return string.char(n) elseif n <= 0x7ff then return string.char(f(n / 64) + 192, n % 64 + 128) elseif n <= 0xffff then return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128) elseif n <= 0x10ffff then return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128, f(n % 4096 / 64) + 128, n % 64 + 128) end error( string.format("invalid unicode codepoint '%x'", n) ) end local function parse_unicode_escape(s) local n1 = tonumber( s:sub(3, 6), 16 ) local n2 = tonumber( s:sub(9, 12), 16 ) -- Surrogate pair? if n2 then return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000) else return codepoint_to_utf8(n1) end end local function parse_string(str, i) local has_unicode_escape = false local has_surrogate_escape = false local has_escape = false local last for j = i + 1, #str do local x = str:byte(j) if x < 32 then decode_error(str, j, "control character in string") end if last == 92 then -- "\\" (escape char) if x == 117 then -- "u" (unicode escape sequence) local hex = str:sub(j + 1, j + 5) if not hex:find("%x%x%x%x") then decode_error(str, j, "invalid unicode escape in string") end if hex:find("^[dD][89aAbB]") then has_surrogate_escape = true else has_unicode_escape = true end else local c = string.char(x) if not escape_chars[c] then decode_error(str, j, "invalid escape char '" .. c .. "' in string") end has_escape = true end last = nil elseif x == 34 then -- '"' (end of string) local s = str:sub(i + 1, j - 1) if has_surrogate_escape then s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape) end if has_unicode_escape then s = s:gsub("\\u....", parse_unicode_escape) end if has_escape then s = s:gsub("\\.", escape_char_map_inv) end return s, j + 1 else last = x end end decode_error(str, i, "expected closing quote for string") end local function parse_number(str, i) local x = next_char(str, i, delim_chars) local s = str:sub(i, x - 1) local n = tonumber(s) if not n then decode_error(str, i, "invalid number '" .. s .. "'") end return n, x end local function parse_literal(str, i) local x = next_char(str, i, delim_chars) local word = str:sub(i, x - 1) if not literals[word] then decode_error(str, i, "invalid literal '" .. word .. "'") end return literal_map[word], x end local function parse_array(str, i) local res = {} local n = 1 i = i + 1 while 1 do local x i = next_char(str, i, space_chars, true) -- Empty / end of array? if str:sub(i, i) == "]" then i = i + 1 break end -- Read token x, i = parse(str, i) res[n] = x n = n + 1 -- Next token i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "]" then break end if chr ~= "," then decode_error(str, i, "expected ']' or ','") end end return res, i end local function parse_object(str, i) local res = {} i = i + 1 while 1 do local key, val i = next_char(str, i, space_chars, true) -- Empty / end of object? if str:sub(i, i) == "}" then i = i + 1 break end -- Read key if str:sub(i, i) ~= '"' then decode_error(str, i, "expected string for key") end key, i = parse(str, i) -- Read ':' delimiter i = next_char(str, i, space_chars, true) if str:sub(i, i) ~= ":" then decode_error(str, i, "expected ':' after key") end i = next_char(str, i + 1, space_chars, true) -- Read value val, i = parse(str, i) -- Set res[key] = val -- Next token i = next_char(str, i, space_chars, true) local chr = str:sub(i, i) i = i + 1 if chr == "}" then break end if chr ~= "," then decode_error(str, i, "expected '}' or ','") end end return res, i end local char_func_map = { [ '"' ] = parse_string, [ "0" ] = parse_number, [ "1" ] = parse_number, [ "2" ] = parse_number, [ "3" ] = parse_number, [ "4" ] = parse_number, [ "5" ] = parse_number, [ "6" ] = parse_number, [ "7" ] = parse_number, [ "8" ] = parse_number, [ "9" ] = parse_number, [ "-" ] = parse_number, [ "t" ] = parse_literal, [ "f" ] = parse_literal, [ "n" ] = parse_literal, [ "[" ] = parse_array, [ "{" ] = parse_object, } parse = function(str, idx) local chr = str:sub(idx, idx) local f = char_func_map[chr] if f then return f(str, idx) end decode_error(str, idx, "unexpected character '" .. chr .. "'") end function json.decode(str) if type(str) ~= "string" then error("expected argument of type string, got " .. type(str)) end local res, idx = parse(str, next_char(str, 1, space_chars, true)) idx = next_char(str, idx, space_chars, true) if idx <= #str then decode_error(str, idx, "trailing garbage") end return res end ⚠️ OBSERVAÇÃO IMPORTANTE O module npcdialog precisou de algumas correções para funcionar corretamente no OTClient. Agora está tudo pronto! Só baixar, colar no seu servidor e rodar! 🚀🔥 Se ajudou, comenta aí! 😃- 7 respostas
-
- 55
-
-
-
-
-
DBO GALICK BEAST BASE OPEN SOURCE
Mateus Roberto respondeu ao tópico de ivissonx1 em Servidores DBO (Dragon Ball)
ALTER TABLE `accounts` ADD COLUMN `web_lastlogin` INT(11) DEFAULT NULL; -
[8.6] TFS 1.5 Nekiro Baiak, Mount and Modal widow.
Mateus Roberto respondeu ao tópico de Mateus Roberto em Tfs 1x ( forgottenserver )
Bom dia! Sim, eu tenho o TFS 1.6 8.60, mexi um pouco nele e percebi que tudo era muito diferente, então parei de mexer... Mas sim, tudo é downgrade. Parece que você não clonou corretamente. Siga esses passos para clonar corretamente: 1. Clone o repositório inteiro com o comando: git clone [Hidden Content] 2. Acesse o diretório do repositório clonado: cd forgottenserver 3. Faça checkout para a branch correta: git checkout feature/1.6-downgrade-860/enable-mounts Se a branch não for encontrada, tente listar as branches remotas com: git branch -r Caso ela apareça na lista, use o seguinte comando para criar a branch localmente: git checkout -b feature/1.6-downgrade-860/enable-mounts origin/feature/1.6-downgrade-860/enable-mounts commit esta aqui: [Hidden Content] -
[8.6] TFS 1.5 Nekiro Baiak, Mount and Modal widow.
Mateus Roberto respondeu ao tópico de Mateus Roberto em Tfs 1x ( forgottenserver )
Edited post: Vi agora que o Felipe esqueceu de adicionar aqui. Então, clone este TFS 1.6 com mounts e, em seguida, adicione isso no config.lua. enableMounts = true -
[8.6] TFS 1.5 Nekiro Baiak, Mount and Modal widow.
Mateus Roberto respondeu ao tópico de Mateus Roberto em Tfs 1x ( forgottenserver )
Ah, você não mencionou a versão do TFS, então vou explicar um resumo. O TFS 1.5 e o 1.6 são totalmente diferentes, pois o TFS 1.6 mudou muito a estrutura. Claro que não é compatível com este commit. Mas você não viu que o Felipe Muinz já tinha postado o TFS 1.6 separadamente? Basta você habilitar a funcionalidade de mounts via config.lua do servidor, sem precisar configurar no OTClient. É só ativar diretamente no config.lua. Dá uma olhada aqui... [Hidden Content] -
[8.6] TFS 1.5 Nekiro Baiak, Mount and Modal widow.
Mateus Roberto respondeu ao tópico de Mateus Roberto em Tfs 1x ( forgottenserver )
Então, você quer apenas o sistema de montaria para adicionar ao seu TFS, certo? Se sim, aqui está o commit com as alterações que você precisa fazer na sua source. Serve apenas para TFS 1.x+ downgrade. [Hidden Content] Se for para TFS 0.x, ta aqui abaixo. [Hidden Content] -
Servidor TFS 1.2 Open Source/Client V8 Master
Mateus Roberto respondeu ao tópico de ploneer157 em Servidores Poketibia
Siga o tutorial que compartilhei no link, faça as alterações necessárias utilizando o Microsoft Visual Studio, salve e recompile o projeto. Em seguida, realize os testes para validar as mudanças. É uma questão simples de ajustes e testes. Não tem mistério, amigo! Você instalou o XAMPP e configurou o banco de dados corretamente? Verificou se tudo foi configurado direitinho? Dê uma revisada nisso também, só para garantir!
- Criar Novo...