Moderador Yomee 1.689 Postado 24 de Fevereiro Moderador Compartilhar Postado 24 de Fevereiro Para começar, como o próprio tópico já diz, é necessário uma source TFS 1.4.2(foi a utilizada), para instalar o characterlist. O resultado final será algo parecido com isto (vídeo demonstrativo): Vamos começar? SOURCE TFS 1.4.2 CHARACTERLIST (recomendo que utilize o Visual Studio Code para realizar as alterações) Abra a pasta da sua source e vá até src/account.h. Após o #include "enums.h", adicione: Spoiler struct Character { std::string name; std::uint32_t level; std::uint16_t vocation; Outfit_t outfit; }; e após struct Account { Altere: Spoiler std::vector<std::string> characters; por std::vector<Character> characters; Pode salvar e fechar. Agora vamos em src/iologindata.cpp e vamos alterar: Spoiler result = db.storeQuery(fmt::format("SELECT `name` FROM `players` WHERE `account_id` = {:d} AND `deletion` = 0 ORDER BY `name` ASC", account.id)); POR result = db.storeQuery(fmt::format("SELECT `name`, `level`, `vocation`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons` FROM `players` WHERE `account_id` = {:d} AND `deletion` = 0 ORDER BY `name` ASC", account.id)); E ainda em src/iologindata.cpp, vamos alterar: Spoiler account.characters.push_back(result->getString("name")); por Character character; character.name = result->getString("name"); character.level = result->getNumber<uint32_t>("level"); character.vocation = result->getNumber<uint16_t>("vocation"); character.outfit.lookType = result->getNumber<uint16_t>("looktype"); character.outfit.lookHead = result->getNumber<uint16_t>("lookhead"); character.outfit.lookBody = result->getNumber<uint16_t>("lookbody"); character.outfit.lookLegs = result->getNumber<uint16_t>("looklegs"); character.outfit.lookFeet = result->getNumber<uint16_t>("lookfeet"); character.outfit.lookAddons = result->getNumber<uint16_t>("lookaddons"); account.characters.push_back(character); Pode salvar e fechar. Agora vamos em src/networkmessage.cpp e, após Spoiler { add<uint16_t>(Item::items[itemId].clientId); (normalmente é o final da linha) } Vamos adicionar void NetworkMessage::addOutfit(Outfit_t& outfit) { add<uint16_t>(outfit.lookType); if (outfit.lookType != 0) { addByte(outfit.lookHead); addByte(outfit.lookBody); addByte(outfit.lookLegs); addByte(outfit.lookFeet); addByte(outfit.lookAddons); } else { addItemId(outfit.lookTypeEx); } add<uint16_t>(outfit.lookMount); } Pode salvar e fechar. Agora vamos em src/networkmessage.h depois de: Spoiler #include "const.h" Vamos adicionar #include "enums.h" E ainda em src/networkmessage.h, vamos adicionar: Spoiler depois de void addItemId(uint16_t itemId); Vamos adicionar void addOutfit(Outfit_t& outfit); Pode salvar e fechar. Agora vamos até src/protocollogin.cpp e vamos remover: Spoiler Vamos remover uint8_t size = std::min<size_t>(std::numeric_limits<uint8_t>::max(), account.characters.size()); e adicionar no lugar dele uint8_t characters = std::min<size_t>(std::numeric_limits<uint8_t>::max() - 1, account.characters.size()); Ainda em src/protocollogin.cpp, vamos remover: Spoiler Vamos remover output->addByte(size); for (uint8_t i = 0; i < size; i++) { const std::string& character = account.characters[i]; if (g_config.getBoolean(ConfigManager::ONLINE_OFFLINE_CHARLIST)) { output->addByte(g_game.getPlayerByName(character) ? 1 : 0); } else { output->addByte(0); } output->addString(character); e Adicionar no lugar output->addByte(characters); for (std::vector<Character>::iterator it = account.characters.begin(); it != account.characters.end(); it++) { output->addByte(0x00); output->addString(it->name); output->add<uint32_t>(it->level); output->add<uint16_t>(it->vocation); output->addOutfit(it->outfit); E aqui acabamos as alterações na source. Pode salvar e compilar a mesma. Se foi utilizado o Visual Studio Code, o mesmo deve compilar sem nenhum problema. :) Agora vamos para a parte do cliente... Como o post está ficando muito grande, irei deixar algumas coisas já feitas para adiantar a vida de vocês e a minha também, hahahah. Vocês vão até a pasta modules/client_entergame e farão um backup dos seguintes arquivos: characterlist.lua e .otui. Eles serão alterados (Vou deixar eles prontos para download para que seja apenas necessário baixar e realizar a substituição, mas caso já tenha algumas alterações feitas nos seus arquivos, é só abrir algum site no Google e procurar por um site que faça comparações de texto. Assim, vocês encontrarão as modificações feitas.) Após isso, vá até modules/corelib/inputmessage.lua e, após Spoiler após position.z = self:getU8() return position end Adicione function InputMessage:getOutfit() local outfit = {} local lookType if g_game.getFeature(GameLooktypeU16) then lookType = self:getU16() else lookType = self:getU8() end if (lookType ~= 0) then local lookHead = self:getU8() local lookBody = self:getU8() local lookLegs = self:getU8() local lookFeet = self:getU8() local lookAddons = 0 if g_game.getFeature(GamePlayerAddons) then lookAddons = self:getU8() end outfit.type = lookType outfit.feet = lookFeet outfit.addons = lookAddons outfit.legs = lookLegs outfit.head = lookHead outfit.body = lookBody else outfit.auxType = self:getU16() end if g_game.getFeature(GamePlayerMounts) then outfit.mount = self:getU16() end if g_game.getFeature(GameOutfitShaders) then outfit.shader = self:getString() end return outfit end Pode salvar e fechar. Após isso, vá até modules/gamelib/protocollogin.lua e adicione após: Spoiler após local character = {} local worldId = msg:getU8() character.name = msg:getString() Adicione character.level = msg:getU32() character.vocation = msg:getU16() character.outfit = msg:getOutfit() Lembrando que é nas duas vezes que tem local character = {} local worldId = msg:getU8() character.name = msg:getString() Espero que esse tutorial ajude bastante vocês e que venham novos servidores, diversificados e brilhantes! :D DOWNLOAD characterlist.otui: Spoiler characterlist.otui SCAN: This is the hidden content, please Entre ou Cadastre-se DOWNLOAD characterlist.lua: Spoiler characterlist.lua SCAN: This is the hidden content, please Entre ou Cadastre-se RESULTADO FINAL: 19 Link para o comentário https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/ Compartilhar em outros sites Mais opções de compartilhamento...
riakisuk 17 Postado 24 de Fevereiro Compartilhar Postado 24 de Fevereiro Tragam o trofeu pra doação do mês 1 Link para o comentário https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/#findComment-4795 Compartilhar em outros sites Mais opções de compartilhamento...
Suporte Hirxzsx 417 Postado 25 de Fevereiro Suporte Compartilhar Postado 25 de Fevereiro 1 hora atrás, Yomee disse: Para começar, como o próprio tópico já diz, é necessário uma source TFS 1.4.2(foi a utilizada), para instalar o characterlist. O resultado final será algo parecido com isto (vídeo demonstrativo): Vamos começar? SOURCE TFS 1.4.2 CHARACTERLIST (recomendo que utilize o Visual Studio Code para realizar as alterações) Abra a pasta da sua source e vá até src/account.h. Após o #include "enums.h", adicione: Mostrar conteúdo oculto struct Character { std::string name; std::uint32_t level; std::uint16_t vocation; Outfit_t outfit; }; e após struct Account { Altere: Mostrar conteúdo oculto std::vector<std::string> characters; por std::vector<Character> characters; Pode salvar e fechar. Agora vamos em src/iologindata.cpp e vamos alterar: Mostrar conteúdo oculto result = db.storeQuery(fmt::format("SELECT `name` FROM `players` WHERE `account_id` = {:d} AND `deletion` = 0 ORDER BY `name` ASC", account.id)); POR result = db.storeQuery(fmt::format("SELECT `name`, `level`, `vocation`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons` FROM `players` WHERE `account_id` = {:d} AND `deletion` = 0 ORDER BY `name` ASC", account.id)); E ainda em src/iologindata.cpp, vamos alterar: Mostrar conteúdo oculto account.characters.push_back(result->getString("name")); por Character character; character.name = result->getString("name"); character.level = result->getNumber<uint32_t>("level"); character.vocation = result->getNumber<uint16_t>("vocation"); character.outfit.lookType = result->getNumber<uint16_t>("looktype"); character.outfit.lookHead = result->getNumber<uint16_t>("lookhead"); character.outfit.lookBody = result->getNumber<uint16_t>("lookbody"); character.outfit.lookLegs = result->getNumber<uint16_t>("looklegs"); character.outfit.lookFeet = result->getNumber<uint16_t>("lookfeet"); character.outfit.lookAddons = result->getNumber<uint16_t>("lookaddons"); account.characters.push_back(character); Pode salvar e fechar. Agora vamos em src/networkmessage.cpp e, após Mostrar conteúdo oculto { add<uint16_t>(Item::items[itemId].clientId); (normalmente é o final da linha) } Vamos adicionar void NetworkMessage::addOutfit(Outfit_t& outfit) { add<uint16_t>(outfit.lookType); if (outfit.lookType != 0) { addByte(outfit.lookHead); addByte(outfit.lookBody); addByte(outfit.lookLegs); addByte(outfit.lookFeet); addByte(outfit.lookAddons); } else { addItemId(outfit.lookTypeEx); } add<uint16_t>(outfit.lookMount); } Pode salvar e fechar. Agora vamos em src/networkmessage.h depois de: Mostrar conteúdo oculto #include "const.h" Vamos adicionar #include "enums.h" E ainda em src/networkmessage.h, vamos adicionar: Mostrar conteúdo oculto depois de void addItemId(uint16_t itemId); Vamos adicionar void addOutfit(Outfit_t& outfit); Pode salvar e fechar. Agora vamos até src/protocollogin.cpp e vamos remover: Mostrar conteúdo oculto Vamos remover uint8_t size = std::min<size_t>(std::numeric_limits<uint8_t>::max(), account.characters.size()); e adicionar no lugar dele uint8_t characters = std::min<size_t>(std::numeric_limits<uint8_t>::max() - 1, account.characters.size()); Ainda em src/protocollogin.cpp, vamos remover: Mostrar conteúdo oculto Vamos remover output->addByte(size); for (uint8_t i = 0; i < size; i++) { const std::string& character = account.characters[i]; if (g_config.getBoolean(ConfigManager::ONLINE_OFFLINE_CHARLIST)) { output->addByte(g_game.getPlayerByName(character) ? 1 : 0); } else { output->addByte(0); } output->addString(character); e Adicionar no lugar output->addByte(characters); for (std::vector<Character>::iterator it = account.characters.begin(); it != account.characters.end(); it++) { output->addByte(0x00); output->addString(it->name); output->add<uint32_t>(it->level); output->add<uint16_t>(it->vocation); output->addOutfit(it->outfit); E aqui acabamos as alterações na source. Pode salvar e compilar a mesma. Se foi utilizado o Visual Studio Code, o mesmo deve compilar sem nenhum problema. :) Agora vamos para a parte do cliente... Como o post está ficando muito grande, irei deixar algumas coisas já feitas para adiantar a vida de vocês e a minha também, hahahah. Vocês vão até a pasta modules/client_entergame e farão um backup dos seguintes arquivos: characterlist.lua e .otui. Eles serão alterados (Vou deixar eles prontos para download para que seja apenas necessário baixar e realizar a substituição, mas caso já tenha algumas alterações feitas nos seus arquivos, é só abrir algum site no Google e procurar por um site que faça comparações de texto. Assim, vocês encontrarão as modificações feitas.) Após isso, vá até modules/corelib/inputmessage.lua e, após Mostrar conteúdo oculto após position.z = self:getU8() return position end Adicione function InputMessage:getOutfit() local outfit = {} local lookType if g_game.getFeature(GameLooktypeU16) then lookType = self:getU16() else lookType = self:getU8() end if (lookType ~= 0) then local lookHead = self:getU8() local lookBody = self:getU8() local lookLegs = self:getU8() local lookFeet = self:getU8() local lookAddons = 0 if g_game.getFeature(GamePlayerAddons) then lookAddons = self:getU8() end outfit.type = lookType outfit.feet = lookFeet outfit.addons = lookAddons outfit.legs = lookLegs outfit.head = lookHead outfit.body = lookBody else outfit.auxType = self:getU16() end if g_game.getFeature(GamePlayerMounts) then outfit.mount = self:getU16() end if g_game.getFeature(GameOutfitShaders) then outfit.shader = self:getString() end return outfit end Pode salvar e fechar. Após isso, vá até modules/gamelib/protocollogin.lua e adicione após: Mostrar conteúdo oculto após local character = {} local worldId = msg:getU8() character.name = msg:getString() Adicione character.level = msg:getU32() character.vocation = msg:getU16() character.outfit = msg:getOutfit() Lembrando que é nas duas vezes que tem local character = {} local worldId = msg:getU8() character.name = msg:getString() Espero que esse tutorial ajude bastante vocês e que venham novos servidores, diversificados e brilhantes! :D DOWNLOAD characterlist.otui: Mostrar conteúdo oculto characterlist.otui 3.98 kB · 1 download SCAN: Hidden Content Give reaction to this post to see the hidden content. DOWNLOAD characterlist.lua: Mostrar conteúdo oculto characterlist.lua 11.82 kB · 0 downloads SCAN: Hidden Content Give reaction to this post to see the hidden content. RESULTADO FINAL: brabo demais. 1 Link para o comentário https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/#findComment-4796 Compartilhar em outros sites Mais opções de compartilhamento...
Moderador Wang 1.748 Postado 25 de Fevereiro Moderador Compartilhar Postado 25 de Fevereiro 1 hora atrás, Yomee disse: Para começar, como o próprio tópico já diz, é necessário uma source TFS 1.4.2(foi a utilizada), para instalar o characterlist. O resultado final será algo parecido com isto (vídeo demonstrativo): Vamos começar? SOURCE TFS 1.4.2 CHARACTERLIST (recomendo que utilize o Visual Studio Code para realizar as alterações) Abra a pasta da sua source e vá até src/account.h. Após o #include "enums.h", adicione: Mostrar conteúdo oculto struct Character { std::string name; std::uint32_t level; std::uint16_t vocation; Outfit_t outfit; }; e após struct Account { Altere: Mostrar conteúdo oculto std::vector<std::string> characters; por std::vector<Character> characters; Pode salvar e fechar. Agora vamos em src/iologindata.cpp e vamos alterar: Mostrar conteúdo oculto result = db.storeQuery(fmt::format("SELECT `name` FROM `players` WHERE `account_id` = {:d} AND `deletion` = 0 ORDER BY `name` ASC", account.id)); POR result = db.storeQuery(fmt::format("SELECT `name`, `level`, `vocation`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons` FROM `players` WHERE `account_id` = {:d} AND `deletion` = 0 ORDER BY `name` ASC", account.id)); E ainda em src/iologindata.cpp, vamos alterar: Mostrar conteúdo oculto account.characters.push_back(result->getString("name")); por Character character; character.name = result->getString("name"); character.level = result->getNumber<uint32_t>("level"); character.vocation = result->getNumber<uint16_t>("vocation"); character.outfit.lookType = result->getNumber<uint16_t>("looktype"); character.outfit.lookHead = result->getNumber<uint16_t>("lookhead"); character.outfit.lookBody = result->getNumber<uint16_t>("lookbody"); character.outfit.lookLegs = result->getNumber<uint16_t>("looklegs"); character.outfit.lookFeet = result->getNumber<uint16_t>("lookfeet"); character.outfit.lookAddons = result->getNumber<uint16_t>("lookaddons"); account.characters.push_back(character); Pode salvar e fechar. Agora vamos em src/networkmessage.cpp e, após Mostrar conteúdo oculto { add<uint16_t>(Item::items[itemId].clientId); (normalmente é o final da linha) } Vamos adicionar void NetworkMessage::addOutfit(Outfit_t& outfit) { add<uint16_t>(outfit.lookType); if (outfit.lookType != 0) { addByte(outfit.lookHead); addByte(outfit.lookBody); addByte(outfit.lookLegs); addByte(outfit.lookFeet); addByte(outfit.lookAddons); } else { addItemId(outfit.lookTypeEx); } add<uint16_t>(outfit.lookMount); } Pode salvar e fechar. Agora vamos em src/networkmessage.h depois de: Mostrar conteúdo oculto #include "const.h" Vamos adicionar #include "enums.h" E ainda em src/networkmessage.h, vamos adicionar: Mostrar conteúdo oculto depois de void addItemId(uint16_t itemId); Vamos adicionar void addOutfit(Outfit_t& outfit); Pode salvar e fechar. Agora vamos até src/protocollogin.cpp e vamos remover: Mostrar conteúdo oculto Vamos remover uint8_t size = std::min<size_t>(std::numeric_limits<uint8_t>::max(), account.characters.size()); e adicionar no lugar dele uint8_t characters = std::min<size_t>(std::numeric_limits<uint8_t>::max() - 1, account.characters.size()); Ainda em src/protocollogin.cpp, vamos remover: Mostrar conteúdo oculto Vamos remover output->addByte(size); for (uint8_t i = 0; i < size; i++) { const std::string& character = account.characters[i]; if (g_config.getBoolean(ConfigManager::ONLINE_OFFLINE_CHARLIST)) { output->addByte(g_game.getPlayerByName(character) ? 1 : 0); } else { output->addByte(0); } output->addString(character); e Adicionar no lugar output->addByte(characters); for (std::vector<Character>::iterator it = account.characters.begin(); it != account.characters.end(); it++) { output->addByte(0x00); output->addString(it->name); output->add<uint32_t>(it->level); output->add<uint16_t>(it->vocation); output->addOutfit(it->outfit); E aqui acabamos as alterações na source. Pode salvar e compilar a mesma. Se foi utilizado o Visual Studio Code, o mesmo deve compilar sem nenhum problema. 🙂 Agora vamos para a parte do cliente... Como o post está ficando muito grande, irei deixar algumas coisas já feitas para adiantar a vida de vocês e a minha também, hahahah. Vocês vão até a pasta modules/client_entergame e farão um backup dos seguintes arquivos: characterlist.lua e .otui. Eles serão alterados (Vou deixar eles prontos para download para que seja apenas necessário baixar e realizar a substituição, mas caso já tenha algumas alterações feitas nos seus arquivos, é só abrir algum site no Google e procurar por um site que faça comparações de texto. Assim, vocês encontrarão as modificações feitas.) Após isso, vá até modules/corelib/inputmessage.lua e, após Mostrar conteúdo oculto após position.z = self:getU8() return position end Adicione function InputMessage:getOutfit() local outfit = {} local lookType if g_game.getFeature(GameLooktypeU16) then lookType = self:getU16() else lookType = self:getU8() end if (lookType ~= 0) then local lookHead = self:getU8() local lookBody = self:getU8() local lookLegs = self:getU8() local lookFeet = self:getU8() local lookAddons = 0 if g_game.getFeature(GamePlayerAddons) then lookAddons = self:getU8() end outfit.type = lookType outfit.feet = lookFeet outfit.addons = lookAddons outfit.legs = lookLegs outfit.head = lookHead outfit.body = lookBody else outfit.auxType = self:getU16() end if g_game.getFeature(GamePlayerMounts) then outfit.mount = self:getU16() end if g_game.getFeature(GameOutfitShaders) then outfit.shader = self:getString() end return outfit end Pode salvar e fechar. Após isso, vá até modules/gamelib/protocollogin.lua e adicione após: Mostrar conteúdo oculto após local character = {} local worldId = msg:getU8() character.name = msg:getString() Adicione character.level = msg:getU32() character.vocation = msg:getU16() character.outfit = msg:getOutfit() Lembrando que é nas duas vezes que tem local character = {} local worldId = msg:getU8() character.name = msg:getString() Espero que esse tutorial ajude bastante vocês e que venham novos servidores, diversificados e brilhantes! 😄 DOWNLOAD characterlist.otui: Mostrar conteúdo oculto characterlist.otui 3.98 kB · 1 download SCAN: Hidden Content Give reaction to this post to see the hidden content. DOWNLOAD characterlist.lua: Mostrar conteúdo oculto characterlist.lua 11.82 kB · 0 downloads SCAN: Hidden Content Give reaction to this post to see the hidden content. RESULTADO FINAL: Se não for nois o fórum fica parado kkkk , conteúdo excelente 1 Link para o comentário https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/#findComment-4797 Compartilhar em outros sites Mais opções de compartilhamento...
Fant 0 Postado 4 de Março Compartilhar Postado 4 de Março Boa Noite compilei tudo certinho porem ao logar o servidor fecha. poderia da um help? Link para o comentário https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/#findComment-4892 Compartilhar em outros sites Mais opções de compartilhamento...
Posts Recomendados
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora