Ogni blocco è solido, tranne quando non lo è
Il nostro mesher del client ha una regola ferrea: ogni blocco che non è aria viene disegnato e ha una collisione. Punto. Questa semplificazione rende il meshing veloce e il codice semplice, finché non arriva una funzione che vuole infrangere proprio questa regola.
Il Varco energetico. Per i nostri recinti energetici volevamo un varco: una membrana scintillante che i giocatori e gli NPC amici possono semplicemente attraversare, ma gli animali selvatici no. Un blocco, insomma, che è visibile ma per alcuni non fa da muro. Esattamente ciò che la nostra architettura non prevede.
La soluzione ha due metà. Sul client, il mesher ha avuto la sua prima eccezione voluta: il blocco del varco viene disegnato ma escluso dalla mesh di collisione, quindi i giocatori lo attraversano senza problemi. Sul server gira la logica vera e propria: i sistemi di movimento delle creature controllano a ogni passo se c'è una barriera energetica di mezzo. Animali selvatici e nemici si voltano, compagni e giocatori passano. Questo controllo ha dovuto entrare in tutti e tre i sistemi di movimento (animali selvatici, compagni, nemici dei pianeti), altrimenti un tipo di creatura non avrebbe «conosciuto» il varco.
La nota onesta: le creature volanti scivolano dritte sopra il recinto. Non è un bug, è un limite documentato: un recinto semplicemente non ferma niente che voli. Preferiamo scrivere nero su bianco lacune volute come questa piuttosto che nasconderle.
Cosa resta: regole architetturali come «tutto ciò che non è aria è solido» hanno valore proprio perché sono semplici. Ma bisogna sapere dove vive l'unica eccezione, e perché vive proprio lì.
Commenti