marcosvf132 14 #1 Posted February 19, 2021 Tutorial para editar e criar monstros novos no client 12.xx Programa utilizado: HxD editor Introdução: Este tutorial serve para quem planeja adicionar e registrar novos monstros no assets do client protocolo 12.xx. O sistema foi baseado e criado para funcionar com a base OTBR versão 12.61, podendo ou não variar com versões futuras. Caso esteja com outro repositório este sistema não funcionara e ninguém daqui oferecera suporte para adaptar para sua base, caso queira utilizar esta ferramenta será necessário utilizar a base OTBR, ficando atento a futuras atualizações para melhorias e correções quando necessário. Isso afetara sistemas que usam os monstros com suas imagens e nome para suas features especificas como por exemplo a bestiary, prey system, boosted creature, task hunting e outros. OBS: Não afeta nada em relação a sprites, para isso pode usar outras ferramentas como o assets-editor. Depois de ler a introdução, começaremos adicionando o script no servidor OTBR. O sistema é feito para funcionar dentro do jogo por meio de uma 'talkaction', porém este é apenas o inicio do processo, o restante teremos que fazer manualmente por fora do client. Primeiro inserimos a talkaction no servidor: Vá até /data/scripts/talkactions/god crie um arquivo .lua com o nome que quiser e cole o seguinte código: Spoiler local hex_monster = { author = "Marcosvf132", date = "19/02/2021", version = "1.0", organization = "###### OTServ-Br #####", objective = " [OTServ-Br 12.x project] \ Export hex code to create and insert custom creatures on the client protocol 12.xx \ This system will create a '.txt' file with all the monsters bytes, to insert it on the client you will need to do it \ manually using a Hex editor (HxD is a good option). \ -> With this script the user can insert custom monsters with any outfit on bestiary, prey and boosted creature.\ -> This script was created to work with OTBR repository, this probably won't work with other repository, so don't ask support for it. \ -> Created based on the client 12.61 protocol, future protocols may have some problems, if so, seek for updates on the OTBR Forum. \ -> Important note: This script reads all monsters that have raceId registered on the server, if you wan't to remove, edit or create monsters on the client \ you need to just remove/edit/add it on their repective '.lua' \ --> The .txt file will be created on /data/ folder -'hex-monster.txt'-. " } local hexmonster = TalkAction("/hexmonster") local function randomValueToHex(nValue) return string.format("%2X ", nValue) end local function bigDecimalTohex(value) local value = bit.bor(value, 0) local jumpEscape = value < 64 local result = "" while (true) do local byte = bit.band(value, 0x7f) value = bit.rshift(value, 7) if ((value == 0) and ((bit.band(byte, 0x40)) == 0)) or ((value == -1) and ((bit.band(byte, 0x40)) ~= 0)) then if byte < 10 then result = result .. " 0" .. tostring(tonumber(randomValueToHex(tostring(byte)))):gsub("%s+", "") .. " " elseif byte < 16 then result = result .. " 0" .. randomValueToHex(byte):gsub("%s+", "") .. " " else result = result .. " " .. randomValueToHex(byte):gsub("%s+", "") .. " " end result = result:gsub(" ", " ") return result end local borBit = bit.bor(byte, 0x80) if borBit < 10 then result = result .. " 0" .. tostring(tonumber(randomValueToHex(tostring(borBit)))):gsub("%s+", "") .. " " elseif borBit < 16 then result = result .. " 0" .. randomValueToHex(borBit):gsub("%s+", "") .. " " else result = result .. " " .. randomValueToHex(borBit):gsub("%s+", "") .. " " end jumpEscape = false end end local function retNumberToHex(look_value) local ret = look_value > 64 and tostring(randomValueToHex(look_value)) or randomValueToHex(look_value) if look_value < 16 then ret = ret:gsub("%s+", "") ret = "0" .. ret end return ret end local function stringTextToHexChar(str) return (str:gsub('.', function (c) return string.format('%02X ', string.byte(c)) end)) end local function numberToHex(value) local ret = tostring(randomValueToHex(tostring(value))):gsub("%s+", "") if value < 10 then ret = "0" .. tonumber(ret) elseif value < 16 then ret = retNumberToHex(value) end return ret end function hexmonster.onSay(player, words, param) if not player:getGroup():getAccess() or player:getAccountType() < ACCOUNT_TYPE_GOD then return true end local alreadyImplementedRaceId = {} local file = io.open("data/hex-monster.txt", "wb") if file then for index, monsterName in pairs(Game.getBestiaryList()) do local mType = MonsterType(monsterName) if mType and not(table.contains(alreadyImplementedRaceId, mType:raceId())) then local name = mType:name():lower() local outfit = mType:outfit() local monsterid_bit = bigDecimalTohex(mType:raceId()) local nameDigits = numberToHex(string.len(name)) local lookt_bit = bigDecimalTohex(outfit.lookType) local looka_bot = numberToHex(outfit.lookAddons) local lookh_bot = outfit.lookHead < 128 and numberToHex(outfit.lookHead) or (numberToHex(outfit.lookHead) .. " 01") local lookb_bot = outfit.lookBody < 128 and numberToHex(outfit.lookBody) or (numberToHex(outfit.lookBody) .. " 01") local lookl_bot = outfit.lookLegs < 128 and numberToHex(outfit.lookLegs) or (numberToHex(outfit.lookLegs) .. " 01") local lookf_bot = outfit.lookFeet < 128 and numberToHex(outfit.lookFeet) or (numberToHex(outfit.lookFeet) .. " 01") local counter_09 = 0 if outfit.lookType < 128 then lookt_bit = " " .. numberToHex(outfit.lookType) .. " " end if outfit.lookHead >= 128 then lookh_bot = numberToHex(outfit.lookHead - 19) end if outfit.lookBody >= 128 then counter_09 = counter_09 + 1 end if outfit.lookLegs >= 128 then counter_09 = counter_09 + 1 if counter_09 > 1 then counter_09 = counter_09 - 1 lookl_bot = numberToHex(outfit.lookLegs - 19) end end if outfit.lookFeet >= 128 then counter_09 = counter_09 + 1 if counter_09 > 1 then counter_09 = counter_09 - 1 lookf_bot = numberToHex(outfit.lookFeet - 19) end end local byteIncrease = "08" if counter_09 > 0 then byteIncrease = "09" end local look_case = "" if counter_09 > 0 then look_case = "10" else if outfit.lookType < 128 then look_case = "0E" else look_case = "0F" end end local stringHex, size_bit, return_hex = "", "", "" if outfit.lookType == 0 and outfit.lookTypeEx ~= 0 then local looke_bit = ItemType(outfit.lookTypeEx) and ItemType(outfit.lookTypeEx):getClientId() or 0 stringHex = " 08" .. monsterid_bit .. "12 " .. nameDigits .. " " .. stringTextToHexChar(name) .. "1A 03 20" .. bigDecimalTohex(looke_bit) size_bit = numberToHex(string.len(stringHex:gsub("%s+", ""))/2) return_hex = "0A " .. size_bit .. stringHex .. " " elseif outfit.lookTypeEx == 0 then stringHex = " 08" .. monsterid_bit .. "12 " .. nameDigits .. " " .. stringTextToHexChar(name) .. "1A ".. look_case .. " 08" .. lookt_bit .. "12" stringHex = stringHex .. " " .. byteIncrease .. " 08 " .. lookh_bot .. " 10 " .. lookb_bot .. " 18 " .. lookl_bot .. " 20 " .. lookf_bot .. " 18 " .. looka_bot size_bit = numberToHex(string.len(stringHex:gsub("%s+", ""))/2) return_hex = "0A " .. size_bit .. stringHex .. " " end table.insert(alreadyImplementedRaceId, mType:raceId()) return_hex = return_hex:gsub(" ", " ") file:write(return_hex) end end player:sendCancelMessage("Data file has been succesfully created.") io.close(file) end return true end hexmonster:separator(" ") hexmonster:register() Salve o arquivo e reinicie o servidor, feito isso ja temos o script pronto para usar. Adicionando monstros: Primeiro iremos escolher o id do monstro (raceid): O ID do monstro é único, ou seja, não pode conflitar com outro monstro, por esta razão é necessário colocar valores que sabemos que não é utilizado, Até o presente momento os id's que ja estão registrados no client oficial começam em 2 e terminam em aproximadamente 2200, por esta razão é aconselhável que comece a utilizar valores bem distantes, dando espaço para futuros monstros oficiais que venham a ser adicionado a esta lista. Caso esteja editando o seu servidor por completo e queira refazer todos os monstros desde o primeiro até o ultimo, então poderá fazer a sua própria sequencia de acordo com o .lua dos seus monstros, respeitando a regra de que não é possível ter mais de um monstro por ID. Para adicionar um monstro é bem simples, é necessário que apenas registre ele na bestiary, para fazer isso é só inserir as seguintes informações no .lua do(s) monstro(s), exemplo: Spoiler monster.raceId = xxxx -- O id do monstro, checar anotações monster.Bestiary = { -- Os seguintes dados não sao essenciais para este tutorial, porém é necessario fazer para funcionar corretamente dentro do jogo. class = "Demon", -- Nome da raça do monstro, checar anotação para saber as outras opções. race = BESTY_RACE_DEMON, -- ID da raça do monstro, checar anotação para saber as outras opções. toKill = xxxxx, -- Quantidade de monstros mortos para liberar o monstro e poder usar uma runa de charm. FirstUnlock = xx, -- Quantidade de monstros mortos para desbloquear as primeiras informações do monstro na bestiary. SecondUnlock = xxx, -- Quantidade de monstros para desbloquear todas informações do monstro na bestiary. CharmsPoints = xx, -- Quantidade de pontos que o player ira receber quando alcançar a quantidade total de abates do monstro (toKill) Stars = x, -- Numero de estrelas do monstro, basicamente é a dificuldade do monstro (de 1 a 5) Occurrence = x, -- Dificuldade para encontrar o monstro dentro do jogo Locations = "Temple of hate." -- Descrição do monstro dentro da bestiary. } -- Anotações: -- "class" "race" -- "Amphibic" - BESTY_RACE_AMPHIBIC -- "Aquatic" - BESTY_RACE_AQUATIC -- "Bird" - BESTY_RACE_BIRD -- "Construct" - BESTY_RACE_CONSTRUCT -- "Demon" - BESTY_RACE_DEMON -- "Dragon" - BESTY_RACE_DRAGON -- "Elemental" - BESTY_RACE_ELEMENTAL -- "Extra Dimensional" - BESTY_RACE_EXTRA_DIMENSIONAL -- "Fey" - BESTY_RACE_FEY -- "Giant" - BESTY_RACE_GIANT -- "Humanoid" - BESTY_RACE_HUMANOID -- "Human" - BESTY_RACE_HUMAN -- "Lycanthrope" - BESTY_RACE_LYCANTHROPE -- "Magical" - BESTY_RACE_MAGICAL -- "Mammal" - BESTY_RACE_MAMMAL -- "Plant" - BESTY_RACE_PLANT -- "Reptile" - BESTY_RACE_REPTILE -- "Slime" - BESTY_RACE_SLIME -- "Undead" - BESTY_RACE_UNDEAD -- "Vermin" - BESTY_RACE_VERMIN Feito isso com todos os monstros que você queira inserir no client, reinicie o servidor para que ele seja registrado no server e, uma vez reiniciado, siga para o próximo passo. Editando um monstro: Qualquer alterações que estejam no .lua dos monstros serão automaticamente puxados para o sistema, que depois levaremos essas mudanças para o client com os passos seguintes. Executando o sistema: O script é feito para funcionar como uma 'talkaction' para ser utilizada por um personagem que tenha acesso GOD,. Uma vez com o script instalado dentro da pasta /data/scripts/talkactions/god/ e as alterações dos monstros ja feitas, reiniciaremos o servidor e, depois de reiniciado, é executar a talkaction digitando /hexmonster Feito isso, deverá aparecer a seguinte mensagem na sua tela: Aparecendo esta mensagem o arquivo hex-monster.txt será criado na pasta /data/: Inserindo os dados no client: Uma vez criado o arquivo hex-monster.txt iremos inserir os dados nos assets do client com um programa Hex editor. Neste tutorial vou utilizar o HxD editor: Identificaremos o arquivo onde os dados dos monstros esta localizado. Vá para a pasta do seu client e procure a pasta dos assets, o meu por exemplo fica em C:\Users\Marcos Vitor\Desktop\Tibia Client\Tibia\assets. Dentro desta pasta procure pelo arquivo cujo o nome é staticdata-NUMEROGIGANTE.dat. Existe apenas um com o nome staticdata então não tem como errar. Abra este arquivo com o HxD editor e vera esta tela ao abrir: Aperte o atalho ctrl + f e procure por Chorister: Após encontrar, na janela dos bytes procure pela seguinte sequencia 12 AF 01 08: Quando encontrar esta sequencia, selecione e apague toda a sequencia que terminam no 12 AF 01 08 e vai até o inicio, ou seja do 12 para trás: Após apagar todos os dados anteriores iremos adicionar os novos valores. Vá ate o arquivo hex-monster.txt e copie tudo que esta dentro dele. Feito isso cole tudo dentro do HxD na primeira linha antes do 12 AF 01 08 e salve. Feito isso ja temos tudo pronto e configurado. Abra o client novamente e todas as alterações ja estarão feitas. Abra a sua bestiary para comprovar: Como visto no exemplo das duas ultimas fotos, qualquer outfit pode ser adicionado no client, inclusive outfits que são de items (lookTypeEx). Adicionando ao boosted creature: Uma vez adicionado na bestiary o monstro ja esta automaticamente inserido no sistema 'boosted creature'. Adicionando ao prey-system: O sistema de prey não é feito de forma automatizada, nesse caso devemos adicionas o ID do monstro (raceid) manualmente na lista desse sistema. Primeiro iremos adicionar o ID do monstro (raceid) no arquivo \data\modules\scripts\prey_system\assets.lua Segundo e ultimo passo é adicionar o nome do monstro no arquivo \data\modules\scripts\prey_system\prey.lua Créditos: Marcosvf132 (eu) Projeto: OTServ-BR 12 Global Spoiler +1 Ponto pro client 12 6 Beatss, Majesty, NetoKain and 3 others reacted to this Share this post Link to post
Majesty 1,755 #2 Posted February 19, 2021 Muito obrigado pela sua contribuição, seu conteúdo foi aprovado!Nós do OTServ Brasil agradecemos, seu conteúdo com certeza ajudará a muitos outros. Você recebeu +1 REP! Share this post Link to post