Ir para conteúdo
Propaganda

Posts Recomendados

  • Moderador

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()


image.png.2989c770b1621d4d8d66a7b536d59faf.png

Espero que esse tutorial ajude bastante vocês e que venham novos servidores, diversificados e brilhantes! :D

DOWNLOAD characterlist.otui:

SCAN

This is the hidden content, please


DOWNLOAD characterlist.lua:


SCAN: 

This is the hidden content, please


RESULTADO FINAL:

image.png.5029668c40596995c7212536d0bf6ca8.png
 

  • Like 19
Link para o comentário
https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/
Compartilhar em outros sites

  • Suporte
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()


image.png.2989c770b1621d4d8d66a7b536d59faf.png

Espero que esse tutorial ajude bastante vocês e que venham novos servidores, diversificados e brilhantes! :D

DOWNLOAD characterlist.otui:

SCAN

Hidden Content

  • Give reaction to this post to see the hidden content.

 


DOWNLOAD characterlist.lua:

 

 


SCAN: 

Hidden Content

  • Give reaction to this post to see the hidden content.

 


RESULTADO FINAL:

image.png.5029668c40596995c7212536d0bf6ca8.png
 

 

 

brabo demais.

  • Like 1
Link para o comentário
https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/#findComment-4796
Compartilhar em outros sites

  • Moderador
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()


image.png.2989c770b1621d4d8d66a7b536d59faf.png

Espero que esse tutorial ajude bastante vocês e que venham novos servidores, diversificados e brilhantes! 😄

DOWNLOAD characterlist.otui:

SCAN

Hidden Content

  • Give reaction to this post to see the hidden content.

 


DOWNLOAD characterlist.lua:

 

 


SCAN: 

Hidden Content

  • Give reaction to this post to see the hidden content.

 


RESULTADO FINAL:

image.png.5029668c40596995c7212536d0bf6ca8.png
 

 

 

Se não for nois o fórum fica parado kkkk , conteúdo excelente 

  • Haha 1
Link para o comentário
https://tibiadevs.com/forums/topic/918-characterlist-para-tfs-1x-servidorcliente/#findComment-4797
Compartilhar em outros sites

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...