Allora ho dato un'occhiata al codice che avevo usato e come avevo fatto, direi che ci sono due modi che però utilizzano lo stesso identico sistema per risolvere l'ultima questione.
Riassumendo con calma:
- nel post precedente abbiamo impostato l'overload della funzione clbkPostCreation per far sì che alla creazione del veicolo nella simulazione esso abbia il pieno di carburante.
- rimane il problema che se carico uno scenario in cui il veicolo esiste già ed ha un certo quantitativo di carburante, la funzione precedente bypassa tutto quanto e riempie di nuovo completamente i serbatoi, cosa che probabilmente non ci va bene
quindi dobbiamo trovare un sistema per far sì che quando carico il veicolo, il programma "capisca" se lo sto creando ex-novo (quindi se lo rilascio dal multistage o da qualsiasi altro veicolo) o se lo sto caricando da uno scenario.
per fare ciò la cosa più intuitiva da fare è far cercare al modulo del veicolo qualcosa nel file scenario da cui viene eventualmente caricato, in modo che se lo trovasse saprà che è stato caricato appunto da un file scenario e dovrà lasciare i serbatoi pieni come questo indicava, se invece non trovasse nulla vorrà dire che il modulo è stato caricato durante la simulazione e quindi dovrà riempire i serbatoi.
come si fa?
Anzitutto per far cercare al modulo qualcosa nel file scenario bisogna che il modulo stesso al momento del salvataggio dello scenario vi lasci un traccia, una specie di briciola di pollicino, che poi potrà ritrovare.
il modo più "elegante" e formalmente corretto è quello che lasci una traccia apposita, immagino una voce nel file scenario che si chiama
LOADED 1Per far sì che il modulo lo scriva nel file scenario dovremo impostare l'overload della funzione clbkSaveState, che diventerà quindi:
- Codice:
-
void nomedelvessel::clbkSaveState(FILEHANDLE scn)
{
SaveDefaultState(scn);
char loadedtxt[256];
sprintf(loadedtxt,"LOADED");
oapiWriteScenario_int(scn,loadedtxt,1);
}
A questo punto bisogna impostare quello che deve succedere al momento della creazione del nostro vessel.
Imposteremo nel file .h una nuova variabile pubblica intera loaded, quindi scriveremo appunto nel file .h tra le variabili pubbliche
int loaded; .
ora nel file .cpp dovremo modificare la funzione clbkLoadStateEx in modo che quando il modulo viene caricato assegni alla variabile intera loaded il valore che trova nel file scenario alla riga che dice appunto LOADED
per farlo scriveremo
- Codice:
-
void nomedelvessel::clbkLoadStateEx(FILEHANDLE scn,void *vs)
{
char *line;
int i,n;
while(oapiReadScenario_nextline(scn,line)){
if(!strnicmp(line,"LOADED",6)){
sscanf(line+6,"%i",&loaded);
}else{
ParseScenarioLineEx(line,vs);
}
ovviamente se ho altre variabili da caricare bisogna impostare correttamente gli if e gli else if.
A questo punto il modulo ha la variabile intera loaded che assume il valore 1 se il modulo è caricato da un file scenario (precedentemente salvato, se si crea a mano bisogna ricordarsi di aggiungere la riga LOADED 1), assume invece un altro valore che ora non ci interessa in caso il modulo venga creato durante la simulazione, quindi per esempio il caso di rilascio da multistage.
A questo punto bisogna aggiungere nella funzione clbkPostCreation il riferimento alla variabile loaded e cioè dire che se la variabile loaded
non è 1 allora bisogna riempire al massimo i serbatoi
- Codice:
-
void nomedelvessel::clbkPostCreation (){
if(loaded!=1){
SetFuelMass(FUELMASS);
}
}
Penso che questo post possa essere d'aiuto sia a te per quanto riguarda il workaround del bug, sia a tutti gli altri per quanto riguarda caricare e salvare variabili nei file scenario.
Spero di essere stato comprensibile
ciaoooo