Ir para conteúdo
  • 0

Ajuda com otclient de poketibia Character list


Pergunta

4 respostass a esta questão

Posts Recomendados

  • 0

Salve man, respondendo esse tópico com alguns anos de atraso mas isso foi um problema que acabei esbarrando também e consegui encontrar a solução. Podem estar acontecendo basicamente 2 coisas
1 - Erro no código do cliente, e ai precisariamos ver o console (ctrl+t) ou o debug (geralmente otclient.txt) para saber o que está acontecendo
2 - Muitos clientes podem até ja vir preparados para receber outfit nas devidas modules como, por exemplo, o OTClient do Edubart na module client_entergame:
 

        if key == 'outfit' then -- it's an exception
          subWidget:setOutfit(value)
        else

Mas o servidor precisa mandar a seção "outfit" corretamente pelo protocolo de login, assim como o cliente deve receber essa mesma seção pelo mesmo protocolo, por exemplo:
2.1 Servidor:
Pegando, por exemplo as sources desse servidor (

) Notamos no arquivos protocollogin.cpp (sources server) na função ProtocolLogin::parseFirstPacket todos os dados que são enviados pro cliente em relação ao personagem. Precisamos apenas adicionar a seção de outfits aqui, como por exemplo, abaixo de output->AddU16(g_config.getNumber(ConfigManager::GAME_PORT)); (em relação ao player e NÃO ao Account Manager) você pode adicionar um código tipo assim (lembrando de adicionar o import #include "database.h" e #include "databasemanager.h" no topo do arquivo):

uint16_t lookType = 128;
uint8_t lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookAddons = 0;

DBResult* result = Database::getInstance()->storeQuery(
    "SELECT looktype, lookhead, lookbody, looklegs, lookfeet, lookaddons "
    "FROM players WHERE name = " + Database::getInstance()->escapeString((*it)) + " LIMIT 1"
);

if(result) {
  lookType   = result->getDataInt("looktype");
  lookHead   = result->getDataInt("lookhead");
  lookBody   = result->getDataInt("lookbody");
  lookLegs   = result->getDataInt("looklegs");
  lookFeet   = result->getDataInt("lookfeet");
  lookAddons = result->getDataInt("lookaddons");
  result->free();
}

output->AddU16(lookType);
output->AddByte(lookHead);
output->AddByte(lookBody);
output->AddByte(lookLegs);
output->AddByte(lookFeet);
output->AddByte(lookAddons);

E na seção do Account Manager passar valores padrão:

output->AddU16(128); // lookType
output->AddByte(0);  // head
output->AddByte(0);  // body
 output->AddByte(0);  // legs
 output->AddByte(0);  // feet
output->AddByte(0);  // addons

2.2 Cliente
Voltando pro cliente, precisamos captar essa nova seção no protocolo de Login. Pegando o OTClient do Edubart como exemplo, existe o arquivo modules/gamelib/protocollogin.lua (no cliente mesmo e não nas sources) que possui a função ProtocolLogin:parseCharacterList agora é só passar a nova seção de outfit aqui dentro, junto com os demais dados do personagem:
   

function ProtocolLogin:parseCharacterList(msg)
  local characters = {}

  local charactersCount = msg:getU8()
  for i = 1, charactersCount do
    local character = {}
    character.name = msg:getString()
    character.worldName = msg:getString()
    character.worldIp = iptostring(msg:getU32())
    character.worldPort = msg:getU16()

    local lookType = msg:getU16()
    local lookHead = msg:getU8()
    local lookBody = msg:getU8()
    local lookLegs = msg:getU8()
    local lookFeet = msg:getU8()
    local lookAddons = msg:getU8()

    character.outfit = {
      type = lookType,
      head = lookHead,
      body = lookBody,
      legs = lookLegs,
      feet = lookFeet,
      addons = lookAddons,
    }

    characters[i] = character
  end

  local account = {}
  account.premDays = msg:getU16()
  signalcall(self.onCharacterList, self, characters, account)
end

E ai é só ajustar sua module de listagem de personagens para o design/layout que quiser :)

Editado por Nathso123
erro de digitação
×
×
  • Criar Novo...