Confusão por reutilização de ID de entidade Entity ID reused without a generation counter
ID da causa pt-id-reuse · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento)
Se o servidor reutiliza o mesmo ID de entidade quando um NPC morto reaparece, o cliente que perdeu a mensagem de despawn nesse meio-tempo toma o NPC novo pelo antigo.
Por quê O NPC morre e reaparece com o mesmo ID de entidade → Efeito O cliente que perdeu a mensagem de despawn ignora a mensagem de spawn, achando que é “uma entidade que já conhece”, ou mantém o estado de morto → Na tela O NPC falta ou aparece caído em uma só tela, às vezes com a aparência de outro NPC
Aleatoriamente, de vez em quando, Quando junta muita gente
Responsável
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Desenvolvimento do cliente (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Servidor: incluir um número de geração no ID da entidade para distinguir a reutilização. Cliente: ao receber mensagem de spawn de um ID já conhecido, apagar a entidade antiga e criar uma nova.
No gráfico
Picos aleatórios · Mensagens de spawn de IDs já conhecidos
Onde olhar
Registrar no servidor o horário de criação e remoção de cada ID de entidade (com o número de geração, se houver) e contar quantas vezes o cliente recebeu mensagem de spawn de um ID já conhecido e quantas remoções e recriações foram tratadas como “sem mudança” na atualização de visibilidade
Confirma se
O NPC invisível ou caído tem o mesmo ID de um NPC que acabou de morrer, e nesse intervalo o cliente não recebeu a mensagem de despawn ou o servidor não enviou nem a de despawn nem a de spawn
Descarta se
Se o ID tem número de geração e ele é usado na comparação, a causa é outra. Entidade invisível sem ID reutilizado: aponta para perda da mensagem de spawn
Como verificar
Exige logs e métricas do servidor ou do cliente do jogo
Saiba mais
Também acontece no lado do servidor. Se a lista de entidades no campo de visão é comparada só pelo ID, um NPC que morreu e reapareceu com o mesmo ID entre duas atualizações de visibilidade é visto como “sem mudança”, e nenhuma das duas mensagens (despawn e spawn) é enviada. Se o momento da atualização de visibilidade é diferente para cada jogador, só os clientes pegos nesse instante têm o problema.
Fontes
Entity struct (Entities 1.3)Unity Uma Entity é formada por um Index e um número de geração (Version), o que permite saber se um Index reutilizado ainda é válido