In questa puntata di Bugsmashers, Mark ci porta alla scoperta di un bug riguardante la modalità Spettatore.


TLDR

·Il bug di oggi riguardava un interessante crash che si verificava quando un giocatore usciva dalla propria nave ed entrava in modalità spettatore per poi sloggare, facendo così crashare tutti i giocatori nella partita, lui incluso.

·Il problema era causato un’entità di trasporto oggetto che non veniva ripulita correttamente dopo che il giocatore era entrato in modalità spettatore. Il gioco quindi cercava di accedere a qualcosa di inesistente, facendo crashare la partita.

·Mark si è immerso nel codice per assicurarsi che la procedura di uscita del giocatore da una nave e di passaggio alla modalità spettatore fosse eseguita correttamente e che il gioco ripulisse tutte le risorse rimaste dopo che il giocatore aveva lasciato il sedile.

·Inoltre, Mark ama la pancetta e l’ha usata per scherzare durante la puntata.

 

TRASCRIZIONE COMPLETA

Mark Abent (MA): Salve a tutti e benvenuti a Bugsmashers. Io sono il vostro presentatore, Mark Abent. Sono Programmatore Senior di Gameplay alla CIG di L.A. e sono qui per mostrarvi dei bug.

Allora, ci troviamo nella nostra bellissima modalità Sciame Vanduul, dove replicherò un crash che si verifica quando si passa alla modalità Spettatore… Vediamo cosa succede. Ok, sono in modalità spettatore, funziona tutto come dovrebbe, le navi si muovono, ma non appena mi disconnetto dovrei crashare… BAM! Crash. Si tratta di un crash interessante. In realtà, è dovuto al codice dello HUD, che tenta di accedere al Sistema di Trasporto Oggetti. Il Sistema di Trasporto Oggetti viene utilizzato per connettere oggetti come le armi al giocatore, il giocatore alla nave e via dicendo. Per qualche motivo… Diciamo che l’entità genitore di questa particolare entità di trasporto fa schifo. Potrebbe essere questo… In ogni caso, non gli piace qualcosa, il punto di trasporto genitore fa abbastanza schifo, e quando il gioco cerca di accedervi, escono avvisi del tipo:” Whoa! Stai cercando di accedere ad una porzione della memoria che è stata cancellata”.

Dunque, cosa sta succedendo e perché? Facciamo un passo indietro, chiudiamo tutto e rilanciamo mentre spiego il problema.

Allora, oops, ho lanciato l’applicazione sbagliata. Ho cliccato troppo in fretta. Andiamo, ok, ci siamo. Allora, quello che sta succedendo qui è che, ogni volta che ci sediamo in un sedile, dobbiamo portare il giocatore in questo stato di collegamento. Questo qui è lo stato di collegamento attivo e questa è, sostanzialmente, l’area in cui vi venite a trovare quando entrate, oppure quanto uscite dal vostro sedile. Quando succede ciò, riceverete un evento di collegamento o di scollegamento e, in situazioni normali, dovreste finire qui.

Se volete entrare in una nave, dovreste ricevere un evento di collegamento, per cui per elaborare questa informazione vogliamo entrare in modalità spettatore, abbandonando così il sedile, ed andare in questa parte del codice. Questa porzione del codice che vi sto mostrando ora si occupa di prendere il giocatore e… Non lo agganciamo ad un’entità oggetto, piuttosto ci limitiamo ad impostare l’entità genitore. Ciò ci permette di fare in modo che il suo radar comunichi con il radar del veicolo e viceversa. In pratica, questo sistema permette di stabilire una comunicazione tra gli oggetti ed i sotto-oggetti presenti sulla nave e quelli agganciati al giocatore. Questo è il compito generale di questa parte di codice. Quest’altra, invece, si preoccupa di scollegare il tutto e di ripulire i collegamenti, così da separare completamente i vari elementi. Ma se lo scollegamento o il collegamento non vengono effettuati in maniera adeguata, questa parte del codice non verrà mai eseguita. Per cui se abbiamo una nave e la cancelliamo, il giocatore non riceverà mai l’informazione relativa all’evento di scollegamento, e quando passeremo alla modalità osservatore, nel codice delle entità di trasporto oggetti rimarranno dei puntatori penzolanti che non sono stati cancellati. Pertanto ora sediamoci e diciamo al giocatore di collegarsi al veicolo. Passiamo in modalità spettatore, spostiamo il giocatore e cancelliamo il veicolo, ma così facendo non riceveremo il messaggio di scollegamento, per cui il giocatore non avrà ripulito le sue entità di trasporto oggetti, che si riferiscono ancora a porzioni della memoria che sono state cancellate. Quello che dobbiamo fare, qui, è assicurarci di passare per questa parte del codice prima di entrare in modalità Osservatore.

Il codice relativo alla modalità Spettatore è… Dunque, se richiedo di passare a questa modalità, il server riceverà la richiesta, la elaborerà e, infine, arriverà a questa parte del codice. A questo punto il codice dovrebbe cancellare questa nave e farci uscire da essa, ma prima che ciò avvenga, il sistema avrà preparato una macchina degli stati e l’avrà impostata su una condizione completamente differente da quella iniziale, per cui anche se rimuoviamo il giocatore dal suo sedile, questa parte del codice ignorerà tutte le richieste di pulizia ed assegnerà il giocatore direttamente alla sua nuova macchina di stato, per cui non verranno mai trasmessi gli eventi di scollegamento delle entità.

Ovviamente, per sistemare questo problema è necessario assicurarsi che il giocatore esca correttamente dal sedile, così che la macchina degli stati possa inviare l’informazione di scollegamento richiesta, per poi rimuovere tutti i puntatori delle entità di trasporto oggetti. Quando ciò sarà avvenuto e non ci saranno più puntatori facenti riferimento ad indirizzi non validi della memoria, potremo uscire correttamente dal sedile e quindi passare in modalità spettatore.

Adesso ricompileremo il codice… Compilazione in corso… E mentre il sistema torna online e viene lanciato nuovamente… Volete un po’ di pancetta? Sentite come scrocchia, è ottima questa pancetta. Ok, la ricompilazione è terminata. Ora potremo riconnetterci al server e, ovviamente, questa procedura richiederà del tempo, per cui mi chiedo cosa potrei fare nel mentre. Oh, ce l’ho! Pancetta! Già, nei prossimi minuti mi vedrete sgranocchiare della pancetta. Mi sta bene così. Pancetta.

Bene, siamo tornati nel gioco. Mettiamo da parte la pancetta e proviamo a passare in modalità spettatore ed a vedere se il personaggio riesce ad uscire correttamente dal sedile. Entriamo in modalità Osservatore ed ora il sistema dovrebbe aver ripulito tutto correttamente, per cui quando uscirà non dovrei causare alcun crash. Woo! Come potete vedere, il gioco non è crashato, sta caricando il menu principale e non ci sono problemi. Per cui adesso potrete passare in modalità Spettatore, uscire dal gioco, tornarvi, uscire dalla modalità Spettatore, sedervi in un sedile e fare qualsiasi cosa vogliate. Non crasherete più per via di alcuni puntatori penzolanti. Spero che vi sia piaciuta questa puntata. È di nuovo il momento della pancetta.

Come avete visto, ci siamo divertiti con un piccolo bug che si verificava quando si entrava in una partita coop, per poi passare alla modalità Spettatore. Inizialmente andava tutto bene, ma il gioco poi crashava improvvisamente nel momento in cui si abbandonava la partita. La modalità Spettatore non ci stava facendo uscire correttamente dal sedile e, infatti, ci stava semplicemente cacciando dal veicolo per portarci nella modalità Spettatore, mentre il sistema pensava ancora che ci trovassimo sul sedile. Adesso, invece, la modalità spettatore vi rimuoverà correttamente dal sedile prima di spostarvi in modalità Osservatore. Per cui non si verificheranno più crash quando qualcuno uscirà dalla partita. Spero che vi siate divertiti ed arrivederci alla prossima puntata.

Traduzione a cura di Darnos.
Trascrizione originale disponibile presso Relay.
Articolo originale disponibile presso le Roberts Space Industries.