Administrador gutinha 1.287 Postado 1 de Agosto 2023 Administrador Compartilhar Postado 1 de Agosto 2023 Salve rapaziada, mais um tutorial ai. Acredito que muita gente vai atrás dessa funcionalidade e não encontra. Bom, seus problemas acabaram 😄. Primeiro de tudo, vamos entender um pouco sobre. O sistema em si não é só ter uma água transparente, vamos pontuar algumas coisas. 1) O mecanismo do tibia foi feito de forma que os andares z =< 7 e z > 7 do mapa não se comunicam entre si. Você pode mapear algo muito bom abaixo de z = 7, mas não conseguirá ver de cima. 2) Subterrâneo (z > 7) você só pode ver, no máximo, dois andares abaixo. 3) O ciclo de luz natural não se estende ao subsolo; mesmo quando está claro lá fora, ir abaixo de z = 7 fará com que pareça que você está em uma caverna. Então a partir disso, vamos fazer eles se comunicarem. Exemplo: Spoiler Ignora as bordas, só fiz uma sprite pra testar 😄 Requisitos: Source do cliente e servidor Sprites com transparência Importante: Faça backup de seus arquivos antes de mexer no código-fonte. As coisas podem dar errado e, embora eu possa consertar meu próprio código, não posso garantir que entenderei o que há de errado com o seu. Por favor, use sua cabeça e tente aprender o que você está fazendo enquanto aplica essas mudanças. Meu objetivo é realmente escrever o máximo que puder para ajudar as pessoas a descobrir como implementar essas mudanças, em vez de fazer tudo por você. Pelo que testei, essas alterações funcionam no meu servidor e, se algo der realmente errado, tentarei voltar e atualizá-lo. 1° Passo Spoiler Na source do servidor protocolgame.cpp l. 538 - l. 561 Procure por void ProtocolGame::GetMapDescription(int32_t x, int32_t y, int32_t z, int32_t width, int32_t height, NetworkMessage& msg) E substitua toda a função por void ProtocolGame::GetMapDescription(int32_t x, int32_t y, int32_t z, int32_t width, int32_t height, NetworkMessage& msg) { int32_t skip = -1; int32_t startz, endz, zstep; if (z > 7) { startz = 0; //floors z < 7 retrieve map description from z = 0 endz = 15; //floors z < 7 look for map until z = 15 zstep = 1; } else { startz = 15; //floors z >= 7 look for map until z = 15 endz = 0; //floors z >= 7 retrieve map description from z = 0 zstep = -1; } for (int32_t nz = startz; nz != endz + zstep; nz += zstep) { GetFloorDescription(msg, x, y, nz, width, height, z - nz, skip); } if (skip >= 0) { msg.addByte(skip); msg.addByte(0xFF); } } Procure por bool ProtocolGame::canSee(int32_t x, int32_t y, int32_t z) const Substitua toda a função por bool ProtocolGame::canSee(int32_t x, int32_t y, int32_t z) const { if (!player) { return false; } const Position& myPos = player->getPosition(); if (myPos.z <= 7) { //we are on ground level or above (7 -> 0) //view is from current floor to floor 15. if (z > 15) { return false; } } else if (myPos.z >= 8) { //we are underground (8 -> 15) //view is from current floor to floor 15. if (z > 15) { return false; } } //negative offset means that the action taken place is on a lower floor than ourself int32_t offsetz = myPos.getZ() - z; if ((x >= myPos.getX() - 8 + offsetz) && (x <= myPos.getX() + 9 + offsetz) && (y >= myPos.getY() - 6 + offsetz) && (y <= myPos.getY() + 7 + offsetz)) { return true; } return false; } 2° Passo Spoiler Na source do cliente protocolgameparse.cpp l. 2044 - l. 2064 Procure por void ProtocolGame::setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height) E substitua toda a função por void ProtocolGame::setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height) { int startz, endz, zstep; if(z > Otc::SEA_FLOOR) { startz = 0; endz = 15; zstep = 1; } else { startz = 15; endz = 0; zstep = -1; } int skip = 0; for(int nz = startz; nz != endz + zstep; nz += zstep) skip = setFloorDescription(msg, x, y, nz, width, height, z - nz, skip); } Agora em map.cpp Procure por int Map::getLastAwareFloor() E substitua a função por int Map::getLastAwareFloor() { return Otc::SEA_FLOOR + 8; } Agora em mapview.cpp Procure por int MapView::calcLastVisibleFloor() E substitua toda a função por int MapView::calcLastVisibleFloor() { if(!m_multifloor) return calcFirstVisibleFloor(); int z = 7; Position cameraPosition = getCameraPosition(); // this could happens if the player is not known yet if(cameraPosition.isValid()) { // view only underground floors when below sea level if(cameraPosition.z > Otc::SEA_FLOOR) z = 15; else z = 15; } if(m_lockedFirstVisibleFloor != -1) z = std::max<int>(m_lockedFirstVisibleFloor, z); // just ensure the that the floor is in the valid range z = stdext::clamp<int>(z, 0, (int)Otc::MAX_Z); return z; } Bugs conhecidos: No otclientv8, ele só renderiza os pisos que você já esteve (cada vez que abrir o client), então nesse caso é meio problemático. Ele vai ficar sem transparência até vc ir pro piso 8 (por ex). Se alguém tiver a solução e quiser postar ai nos comentário, eu atualizo o tópico e dou os devidos créditos. No edubart não vi esse problema, não testei no mehah mas provavelmente tbm não vai ter esse problema. Créditos: Dries390 14 2 Link para o comentário https://tibiadevs.com/forums/topic/39-como-colocar-%C3%A1gua-transparente-no-andar-7-do-tibia/ Compartilhar em outros sites Mais opções de compartilhamento...
Liu 13 Postado 1 de Agosto 2023 Compartilhar Postado 1 de Agosto 2023 brabíssimo 2 Link para o comentário https://tibiadevs.com/forums/topic/39-como-colocar-%C3%A1gua-transparente-no-andar-7-do-tibia/#findComment-187 Compartilhar em outros sites Mais opções de compartilhamento...
VelhoBarreiro 3 Postado 2 de Agosto 2023 Compartilhar Postado 2 de Agosto 2023 Brabo, já vou por no PW! REP+ Link para o comentário https://tibiadevs.com/forums/topic/39-como-colocar-%C3%A1gua-transparente-no-andar-7-do-tibia/#findComment-203 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