Entre para seguir isso  
Seguidores 0
c0nsumer

Arquivo responsável pela posição dos jogadores

3 posts neste tópico

Senhores, boa tarde! Alguém saberia informar qual arquivo da source é responsável pela renderização dos jogadores em um mapa? Por exemplo... Digamos que estou em Prontera sozinho e aí um novo jogador entra no mapa, agora esse jogador entrou na minha "zona de interesse", ou seja, tudo que acontece com esse player eu consigo visualizar em tempo real, ele se movimentando, pegando um item do chão ou jogando um item no chão. Tô fazendo um trabalho da pós graduação e gostaria de dar uma olhada nesse algoritmo, de como o servidor faz com que os jogadores se enxerguem em tempo real. Na minha "visão" quando um jogador entra no mesmo mapa que você, ou seja, no mesmo TILEMAP, mesmo quadrado ele agora faz parte da sua zona de interesse para o servidor, e o mesmo tem que pegar a posição X e Y dele, que seriam as coordenadas e replicadas para o seu client, assim movimentando o personagem alheio que está na sua tela. Acho que ficou claro o que quero dizer. Gostaria de dar uma olhada nos arquivos de tratam desse algoritmo. Se alguém souber, ótimo! De qualquer forma estou olhando no GitHub também! Grato pela ajuda! Segue uma imagem ainda mais para referenciar a ideia sobre zona de interesse. 

Screen Shot 2018-04-05 at 11.36.54 AM.png

Editado por c0nsumer
0

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Vou responder por que gosto de explicar esse tipo de coisa, se não entender algo me diga. Tentarei explicar de uma forma bem "pseudo-funcionamento".

Existem umas três ou quatro funções importante para esse gerenciamento. Vou abordar só uma que você consegue achar as outras.

A função que se é chamada para "mostrar" um jogador na tela para outro seria essa:

int clif_spawn(struct block_list *bl)

Existem outras funções para atualizar certas informações e etc mas com isso você já consegue entender um pouco.

O seu desenho e conceito estão um pouco equivocado. Tentarei explicar.

Jogadores que estão fora da da área de visão do jogador (que pode ser configurado em conf/battle/client.conf) para o cliente não existem.

iOaOlbv.png

 

O que acontece não é tão complexo quanto acho que você pensa. Partindo do pressuposto que você tem entendimento do que são pacotes irei para a explicação logo.

Um jogador está na área branca da imagem e então clica para ir para a área vermelha, o emulador irá confirmar que ele pode até lá e então vai responder ao cliente que pode movimentar seu personagem. Durante esse processo que o emulador verificou se você pode andar até lá ele já verifica através das funções para checar quais objetos estão próximos a aquela celula nova que você está (já calculando seu alcance de visão).

Normalmente essas funções possuem a nomenclatura "foreachAlgumaCoisa" (dependendo do seu objetivo) e então eles descobrem que jogador está em seu alcance de visão e envia para seu cliente as informações necessárias para que ele mostre o jogador para você.

Quando esse jogador andar, ele irá enviar a solicitação ao jogador e novamente todo o processo começa. 

Editado por Zell
0

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 18/04/2018 at 20:08, Zell disse:

int clif_spawn(struct block_list *bl)

Essa ai é tipo quando um jogador aparece usando teleporte, ou você usa a incubadora num pet, o monstro renasce, etc...

As Rotinas para quando algo entra ou sai na visão do jogador, são:

int clif_insight(struct block_list *bl,va_list ap)
int clif_outsight(struct block_list *bl,va_list ap)

 

1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Entre para seguir isso  
Seguidores 0