Ir para conteúdo
Propaganda

Posts Recomendados

  • Administrador

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 😄

image.png.eaf8775f1b1811a5ca50ac8d063ca9fd.png

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

  • Like 14
  • Thanks 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

  • gutinha mudou o título para Como colocar água transparente no andar 7 do Tibia

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...