[GUIDA] Creare semplici missioni
#21
Inviato il 14 maggio 2009 - 10:41
vado la e che faccio aspetto?
Visita il forum: http://paradisecityrp.tk/
Paradise City Roleplay:
Nome: Curtis_Smoke
Città: Los Santos
Fazione: Cosanostra
Rank: Padrino
Anni: 21
Lavoro: Drug Dealer
Veicoli: Sultan, ZR, Buffalo
Livello: 3
#23
Inviato il 14 maggio 2009 - 16:21
Ho fatto tutto male^^
Visita il forum: http://paradisecityrp.tk/
Paradise City Roleplay:
Nome: Curtis_Smoke
Città: Los Santos
Fazione: Cosanostra
Rank: Padrino
Anni: 21
Lavoro: Drug Dealer
Veicoli: Sultan, ZR, Buffalo
Livello: 3
#24
Inviato il 15 maggio 2009 - 08:39
{$VERSION 3.1.0027} {$CLEO .cs} thread 'MISSIONE' :MISSIONE wait 1000 03A4: name_thread 'MISSIONE' if and 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 2861.8618 -1887.3459 10.9339 radius 30.0 25.0 10.0 $ONMISSION == 0 else_jump @MISSIONE 023C: request_special_actor 'TENPEN' as 1 023C: request_special_actor 'SMOKEV' as 2 023C: request_special_actor 'BB' as 3 Model.Load(#AK47) Model.Load(#COLT45) Model.Load(#DESERT_EAGLE) if and Model.Available(#AK47) Model.Available(#DESERT_EAGLE) Model.Available(#COLT45) 023D: special_actor 1 loaded 023D: special_actor 2 loaded 023D: special_actor 3 loaded wait 1000 009A: 1@ = create_actor 23 #SPECIAL01 at 2859.7527 -1917.4506 10.9324 009A: 2@ = create_actor 23 #SPECIAL02 at 2861.2815 -1917.2495 10.9335 009A: 3@ = create_actor 23 #SPECIAL03 at 2861.8311 -1915.5322 10.933 Actor.Angle(1@) = 272.1 Actor.Angle(2@) = 98.9 Actor.Angle(3@) = 169.0 4@ = Marker.CreateAboveActor(1@) 5@ = Marker.CreateAboveActor(2@) 6@ = Marker.CreateAboveActor(3@) 01B2: give_actor 1@ weapon 22 ammo 9999 01B2: give_actor 2@ weapon 30 ammo 9999 01B2: give_actor 3@ weapon 24 ammo 9999 05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR 05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR 05E2: AS_actor 3@ kill_actor $PLAYER_ACTOR $ONMISSION = 1 Model.Destroy(#AK47) Model.Destroy(#DESERT_EAGLE) Model.Destroy(#COLT45) :MISSIONE_TENPENNY wait 150 if Actor.Dead(1@) else_jump @MISSIONE_TENPENNY Actor.RemoveReferences(1@) Marker.Disable(4@) :MISSIONE_BIGSMOKE wait 150 if Actor.Dead(2@) else_jump @MISSIONE_TENPENNY Actor.RemoveReferences(2@) Marker.Disable(5@) :MISSIONE_BIGBEAR wait 150 if Actor.Dead(3@) else_jump @MISSIONE_BIGBEAR Actor.RemoveReferences(3@) Marker.Disable(6@) :MISSIONE_COMPIUTA wait 150 if and Actor.Dead(1@) Actor.Dead(2@) Actor.Dead(3@) else_jump @MISSIONE_COMPIUTA Actor.RemoveReferences(1@) Actor.RemoveReferences(2@) Actor.RemoveReferences(3@) Marker.Disable(4@) Marker.Disable(5@) Marker.Disable(6@) 01E3: show_text_1number_styled GXT 'M_PASSR' number 6 time 5000 style 1 // MISSION PASSED!~n~~w~RESPECT + Player.Money($PLAYER_CHAR) += 10000 $ONMISSION = 0 0998: add_respect 6 :MISSIONE_FALLITA wait 150 if wasted_or_busted else_jump @MISSIONE_FALLITA $ONMISSION = 0 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // ~r~MISSION FAILED!
Questo è il .cs della missione completa, prova a compilarlo.
#25
Inviato il 10 giugno 2009 - 15:42
Per essere sinceri, da quel che vedo da quest'ultimo script, mancano alcune nozioni di base del coding, forse per "ignoranza" (da non fraintendere con le offese), forse per sviste dovute all'inattenzione. Ora riporto gli\le errori\omissioni.
Ci sono diversi modi per i rispettivi tipi di variabili (globali e locali). Quì di sotto è riportata la rispettiva differenza.
Per svolgere l'operazione occorre innescare un loop, ovvero un ciclo di tipo "for" per ripetere il thread (e quindi la creazione) finchè non avrà raggiunto un certo valore (in poche parole, un certo numero di volte). Vediamo come si presenta.
Per chi non lo sappia, entrambe le diciture "//" e "{}" indicano rispettivamente che dopo vi è un testo che non verrà nè compilato, nè decompilato. La seconda invece, delimita un testo (ovviamente inizia con "{" e termina con "}". Mentre la prima rende tutto ciò che segue (ma solo nello stesso rigo) un testo come commento, la seconda delimita solo una parte, quindi solo ciò che vi è all'interno delle "{}" diventerà commento.
Come è possibile vedere nel source, ho aggiunto l'opcode 0000. Quest'ultimo è necessario solo se non si intende utilizzare nessun label come partenza (in questo caso è relativo). Mi spiego, è possibile anche omettere il label a cui un jump si riferisce, ma occorre inequivocabilemente aggiungere quell'opcode od il nome del thread, altrimenti la compilazione non avverrà. Ciò accade solamente con gli scripts composti con i comandi high level, ovvero if, while, repeat-until, then, else, for, end. Esempio.
Durante la definizione delle variabili, si può notare che, per quanto riguarda il puntatore del pedone, l'ID del modello, l'angolo del pedone e l'ID dell'arma, le variabili aumentano automaticamente di 1 alla volta (0@, 1@...), mentre per le coordinate, aumentano di 6 alla volta (6@, 12@...).
Il numero massimo di variabili locali di un thread è 33 (da 0@ fino a 33@). Per le variabili globali, invece, è 16383 (da $1 fino a $16383). Le variabili locali, solo nelle missioni, possono essere anche estese fino ad un certo limite, quindi oltre i 33. Invece di creare un file .cs o utilizzare l'scm, bisogna utilizzare il formato .cm (custom mission), ma bisogna comunque richiamarla dall'scm, credo con l'opcode 0A94.
Così facendo potremmo utilizzare un numero maggiore di variabili locali e creare quanti players, pedoni od oggetti vogliamo. Probabilmente, ci sarà anche un limite per gli array: nel main compaiono solo fino a 32 (quindi 1@(2@,32i), credo), ma da qualche parte ho visto anche utilizzare 50 indici.
Ecco lo stesso thread adattato agli arrays.
Nota: Qualunque stringa è delimitata da '' o "". Entrambi possono essere usati tranquillamente ma solo il primo ha un limite di 7 caratteri. Non credo che ormai abbia valenza utilizzare sempre "" per i nomi di thread con minimo 8 caratteri, perchè, se non sbaglio, il sannybuilder non tiene più conto della limitazione.
Spero di essere stato chiaro e di aver fatto apprendere.
- La linea "name_thread" può essere benissimo inizializzata una solo volta.
- E' inutile inserire tanti waits, ma solo se necessario come nel caso dei loop (thread che terminano con un jump che si riferisce al medesimo), preferibilmente con valore 0. Se, per motivi di efficenza dello script, si vuol anche inserire un valore superiore a 0, ben venga.
Nota: Se per caso non è stato ancora detto da nessuna parte, il wait utilizza un valore in millisecondi, quindi 1000 corrisponde and 1 secondo, 500 a 1/2 secondo, e via dicendo. - Dopo ogni condizione è necessario utilizzare l'else jump, altrimenti non vi è modo per cui essa esista perchè il codice andrebbe comunque avanti con la lettura.
- Al termine del thread (di qualunque natura esso sia: normale, missione o script esterni), per attestarne la chiusura bisogna inserire il jump o l'end_thread (end_custom_thread per cleo), altrimenti leggerebbe anche il contenuto che segue.
- Per sminuire il contenuto del codice stesso, converrebbe sostituire la dicitura "else_jump" con "jf" ovvero "jump_if_false".
- Ond'evitare problemi di visibilità dei modelli, meglio inserire la linea "Model.Destroy()" quando quest'ultimi non rendono più la loro utilità.
- L'ultimo thread non ha nessuna utilità, anzi, non si conclude mai.
Ci sono diversi modi per i rispettivi tipi di variabili (globali e locali). Quì di sotto è riportata la rispettiva differenza.
$ACTOR_X[0] = 0.0 1@(31@,1i) = 0.0
Per svolgere l'operazione occorre innescare un loop, ovvero un ciclo di tipo "for" per ripetere il thread (e quindi la creazione) finchè non avrà raggiunto un certo valore (in poche parole, un certo numero di volte). Vediamo come si presenta.
{$CLEO .cs} 0000: NOP // High level code { n = 3 for I = 1 to n Actor(I) = Actor.Create( Type(I), modelID(I), x(I), y(I), z(I) ) ... end } :Thread_Array thread 'ThreadA' // Per prima cosa, caricare i modelli :Thread_Array2 Model.Load(#AK47) Model.Load(#COLT45) Model.Load(#DESERT_EAGLE) 023C: load_special_actor 'TENPEN' as 1 // 290 023C: load_special_actor 'SMOKEV' as 2 // 291 023C: load_special_actor 'BB' as 3 // 292 // Verificare che i modelli siano caricati :Thread_Array3 wait 0 if and Model.Available(#AK47) Model.Available(#DESERT_EAGLE) Model.Available(#COLT45) 023D: special_actor 1 loaded // 290 023D: special_actor 2 loaded // 291 023D: special_actor 3 loaded // 292 jf @Thread_Array3 060A: create_decision_maker_type 0 store_to 10@ // decision\allowed\m_.ped files 6@ = 2859.753 12@ = -1917.451 18@ = 10.9324 04AF: 21@ = 290 // @ = any 24@ = 272.1 04AF: 27@ = 22 // @ = any 7@ = 2861.281 13@ = -1917.25 19@ = 10.9335 04AF: 22@ = 291 // @ = any 25@ = 98.9 04AF: 28@ = 30 // @ = any 8@ = 2861.831 14@ = -1915.532 20@ = 10.933 04AF: 23@ = 292 // @ = any 26@ = 169.0 04AF: 29@ = 24 // @ = any 31@ = 0 // Innescare una struttura loop for :Thread_Array4 wait 0 // Actor(int) = Actor.Create(Type(int), modelID(int), x(float), y(float), z(float)) 0@(31@,3i) = Actor.Create(Mission1, 21@(31@,3i), 6@(31@,3f), 12@(31@,3f), 18@(31@,3f)) Actor.Angle(0@(31@,3i)) = 24@(31@,3f) Actor.WeaponAccuracy(0@(31@,3i)) = 25 01B2: give_actor 0@(31@,3i) weapon 27@(31@,3i) ammo 9999 // Load the weapon model before using this 05E2: AS_actor 0@(31@,3i) kill_actor $PLAYER_ACTOR if 2 > 31@ jf @Thread_Array5 31@ += 1 jump @Thread_Array4 // Parametri addizionali (solo dopo tale ciclo for) :Thread_Array5 3@ = Marker.CreateAboveActor(0@) 4@ = Marker.CreateAboveActor(1@) 5@ = Marker.CreateAboveActor(2@) 060B: set_actor 0@ decision_maker_to 10@ 060B: set_actor 1@ decision_maker_to 10@ 060B: set_actor 2@ decision_maker_to 10@ 31@ = 0 //... 0A93: end_custom_thread
Per chi non lo sappia, entrambe le diciture "//" e "{}" indicano rispettivamente che dopo vi è un testo che non verrà nè compilato, nè decompilato. La seconda invece, delimita un testo (ovviamente inizia con "{" e termina con "}". Mentre la prima rende tutto ciò che segue (ma solo nello stesso rigo) un testo come commento, la seconda delimita solo una parte, quindi solo ciò che vi è all'interno delle "{}" diventerà commento.
Come è possibile vedere nel source, ho aggiunto l'opcode 0000. Quest'ultimo è necessario solo se non si intende utilizzare nessun label come partenza (in questo caso è relativo). Mi spiego, è possibile anche omettere il label a cui un jump si riferisce, ma occorre inequivocabilemente aggiungere quell'opcode od il nome del thread, altrimenti la compilazione non avverrà. Ciò accade solamente con gli scripts composti con i comandi high level, ovvero if, while, repeat-until, then, else, for, end. Esempio.
{$CLEO .cs} 0000: NOP while true end
Durante la definizione delle variabili, si può notare che, per quanto riguarda il puntatore del pedone, l'ID del modello, l'angolo del pedone e l'ID dell'arma, le variabili aumentano automaticamente di 1 alla volta (0@, 1@...), mentre per le coordinate, aumentano di 6 alla volta (6@, 12@...).
Il numero massimo di variabili locali di un thread è 33 (da 0@ fino a 33@). Per le variabili globali, invece, è 16383 (da $1 fino a $16383). Le variabili locali, solo nelle missioni, possono essere anche estese fino ad un certo limite, quindi oltre i 33. Invece di creare un file .cs o utilizzare l'scm, bisogna utilizzare il formato .cm (custom mission), ma bisogna comunque richiamarla dall'scm, credo con l'opcode 0A94.
{$CLEO .cm}
Così facendo potremmo utilizzare un numero maggiore di variabili locali e creare quanti players, pedoni od oggetti vogliamo. Probabilmente, ci sarà anche un limite per gli array: nel main compaiono solo fino a 32 (quindi 1@(2@,32i), credo), ma da qualche parte ho visto anche utilizzare 50 indici.
Ecco lo stesso thread adattato agli arrays.
{$CLEO .cs} { 0@ = Actor pointer 1@ = Actor2 pointer 2@ = Actor3 pointer 3@ = Actor marker 4@ = Actor2 marker 5@ = Actor3 marker 6@ = Actor x pos 7@ = Actor2 x pos 8@ = Actor3 x pos 10@ = Decision marker 12@ = Actor y pos 13@ = Actor2 y pos 14@ = Actor3 y pos 18@ = Actor z pos 19@ = Actor2 z pos 20@ = Actor3 z pos 21@ = Actor modelID 22@ = Actor2 modelID 23@ = Actor3 modelID 24@ = Actor z angle 25@ = Actor2 z angle 26@ = Actor3 z angle 27@ = Actor weapID 28@ = Actor2 weapID 29@ = Actor3 weapID 30@ = kill count 31@ = loop variable } :Mission_Thread thread "MissionA" :Mission_Start wait 0 if and $ONMISSION == 0 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 2861.862 -1887.346 10.9339 radius 30.0 25.0 10.0 jf @Mission_Start $ONMISSION = 1 if and not Actor.Dead($PLAYER_ACTOR) 8741: not actor $PLAYER_ACTOR busted jf @Mission_Failed Model.Load(#AK47) Model.Load(#COLT45) Model.Load(#DESERT_EAGLE) 023C: load_special_actor 'TENPEN' as 1 // 290 023C: load_special_actor 'SMOKEV' as 2 // 291 023C: load_special_actor 'BB' as 3 // 292 :Mission_Body wait 0 if and Model.Available(#AK47) Model.Available(#DESERT_EAGLE) Model.Available(#COLT45) 023D: special_actor 1 loaded // 290 023D: special_actor 2 loaded // 291 023D: special_actor 3 loaded // 292 jf @Mission_Body 060A: create_decision_maker_type 0 store_to 10@ // decision\allowed\m_.ped files 6@ = 2859.753 12@ = -1917.451 18@ = 10.9324 04AF: 21@ = 290 // @ = any 24@ = 272.1 04AF: 27@ = 22 // @ = any 7@ = 2861.281 13@ = -1917.25 19@ = 10.9335 04AF: 22@ = 291 // @ = any 25@ = 98.9 04AF: 28@ = 30 // @ = any 8@ = 2861.831 14@ = -1915.532 20@ = 10.933 04AF: 23@ = 292 // @ = any 26@ = 169.0 04AF: 29@ = 24 // @ = any 31@ = 0 :Mission_Array wait 0 0@(31@,3i) = Actor.Create(Mission1, 21@(31@,3i), 6@(31@,3f), 12@(31@,3f), 18@(31@,3f)) Actor.Angle(0@(31@,3i)) = 24@(31@,3f) Actor.WeaponAccuracy(0@(31@,3i)) = 25 01B2: give_actor 0@(31@,3i) weapon 27@(31@,3i) ammo 9999 // Load the weapon model before using this 05E2: AS_actor 0@(31@,3i) kill_actor $PLAYER_ACTOR if 2 > 31@ jf @Mission_Array2 31@ += 1 jump @Mission_Array :Mission_Array2 3@ = Marker.CreateAboveActor(0@) 4@ = Marker.CreateAboveActor(1@) 5@ = Marker.CreateAboveActor(2@) 060B: set_actor 0@ decision_maker_to 10@ 060B: set_actor 1@ decision_maker_to 10@ 060B: set_actor 2@ decision_maker_to 10@ 30@ = 0 31@ = 0 :Mission_Chars_Dead wait 0 if 2 >= 31@ jf @Mission_Chars_Dead3 if Actor.Dead(0@(31@,3i)) jf @Mission_Chars_Dead2 if 075C: marker 3@(31@,3i) enabled jf @Mission_Chars_Dead2 Actor.RemoveReferences(0@(31@,3i)) Marker.Disable(3@(31@,3i)) 30@ += 1 :Mission_Chars_Dead2 31@ += 1 jump @Mission_Chars_Dead :Mission_Chars_Dead3 if or not Actor.Dead($PLAYER_ACTOR) 8741: not actor $PLAYER_ACTOR busted jf @Mission_Failed if not 30@ == 3 jf @Mission_Complete 31@ = 0 jump @Mission_Chars_Dead :Mission_Failed wait 0 if 2 >= 31@ jf @Mission_Failed3 if not Actor.Dead(0@(31@,3i)) jf @Mission_Failed2 Actor.DestroyWithFade(0@(31@,3i)) 30@ += 1 :Mission_Failed2 31@ += 1 jump @Mission_Failed :Mission_Failed3 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // ~r~MISSION FAILED! $ONMISSION = 0 0A93: end_custom_thread :Mission_Complete Model.Destroy(#AK47) Model.Destroy(#DESERT_EAGLE) Model.Destroy(#COLT45) 01E3: show_text_1number_styled GXT 'M_PASSS' number 1000 time 5000 style 1 // MISSION PASSED!~n~~w~$~1~~n~~w~RESPECT + Player.Money($PLAYER_CHAR) += 1000 0998: add_respect 5 $ONMISSION = 0 0A93: end_custom_thread
Nota: Qualunque stringa è delimitata da '' o "". Entrambi possono essere usati tranquillamente ma solo il primo ha un limite di 7 caratteri. Non credo che ormai abbia valenza utilizzare sempre "" per i nomi di thread con minimo 8 caratteri, perchè, se non sbaglio, il sannybuilder non tiene più conto della limitazione.
Spero di essere stato chiaro e di aver fatto apprendere.
Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206
#30
Inviato il 10 luglio 2009 - 14:11
Quote
Originally posted by dvxx95@08/07/09 - 14:17
perchè quando sono nel raggio delle coordinate il gioco crasha???????
ho riprovato a farla ma il problema persiste
perchè quando sono nel raggio delle coordinate il gioco crasha???????
ho riprovato a farla ma il problema persiste
...beh...ovviamente perchè hai sbagliato qlks....
Se hai solo fatto copia-incolla da uno dei 2 codici (snake o wesser) è normale che crasha
Nel primo manca
0A93: end_custom_thread
alla fine del thread.
Il secondo non si compila nemmeno perchè un' arrey si ripete 2 volte
Posta il tuo codice e vediamo cosa c'è che non và.....
Se hai apportato variazioni e non hai tolto ciò che non serviva è ovvio che crasha tutto appena entri nelle coordinate
/
"Alme Sol, curru nitido diem qui promis et celas aliusque et idem nasceris, possis nihil urbe Roma visere maius"
/
"Alme Sol, curru nitido diem qui promis et celas aliusque et idem nasceris, possis nihil urbe Roma visere maius"
/
#31
Inviato il 10 luglio 2009 - 21:44
L'unico problema nel mio secondo script (quello completo) consiste nel non aver cambiato il nome di due label, ne deriva quindi che quest'ultimo è uguale per ambedue costringendo il compilatore a non poter compilare lo script. Ora ho corretto il post e testato nuovamente lo script ingame; di conseguenza, posso dire con certezza che funziona alla perfezione.
Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206
#32
Inviato il 13 luglio 2009 - 00:23
Quote
Originally posted by Saint Jake+10/07/09 - 15:11
Quote
(Saint Jake @ 10/07/09 - 15:11)
-dvxx95@08/07/09 - 14:17
perchè quando sono nel raggio delle coordinate il gioco crasha???????
ho riprovato a farla ma il problema persiste
...beh...ovviamente perchè hai sbagliato qlks....
Se hai solo fatto copia-incolla da uno dei 2 codici (snake o wesser) è normale che crasha
Nel primo manca
alla fine del thread.
Il secondo non si compila nemmeno perchè un' arrey si ripete 2 volte
Posta il tuo codice e vediamo cosa c'è che non và.....
Se hai apportato variazioni e non hai tolto ciò che non serviva è ovvio che crasha tutto appena entri nelle coordinate [/b]
ok eccolo
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
thread 'MISSIONE'
:MISSIONE_19
wait 1000
thread 'MISSIONE'
if and
00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 1919.828 -1230.462 17.91885 radius 30.0 25.0 10.0
$ONMISSION == 0
else_jump @MISSIONE_19
023C: load_special_actor 'BALLAS1' as 1 // models 290-299
023C: load_special_actor 'BALLAS2' as 2 // models 290-299
023C: load_special_actor 'BALLAS3' as 3 // models 290-299
023C: load_special_actor 'FAM1' as 4 // models 290-299
023C: load_special_actor 'FAM2' as 5 // models 290-299
023C: load_special_actor 'FAM3' as 6 // models 290-299
023C: load_special_actor 'SWEET' as 7 // models 290-299
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
if and
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
023D: special_actor 1 loaded
023D: special_actor 2 loaded
023D: special_actor 3 loaded
023D: special_actor 4 loaded
023D: special_actor 5 loaded
023D: special_actor 6 loaded
023D: special_actor 7 loaded
wait 1000
1@ = Actor.Create(Special, #SPECIAL01, 1919.828, -1230.462, 17.91885)
2@ = Actor.Create(Special, #SPECIAL02, 1921.177, -1230.2, 18.14182)
3@ = Actor.Create(Special, #SPECIAL03, 1914.285, -1229.235, 17.38179)
4@ = Actor.Create(Special, #SPECIAL04, 1912.606, -1225.933, 17.59943)
5@ = Actor.Create(Special, #SPECIAL05, 1911.651, -1228.455, 17.18024)
6@ = Actor.Create(Special, #SPECIAL06, 1913.453, -1229.186, 17.24896)
7@ = Actor.Create(Special, #SPECIAL07, 1912.281, -1231.196, 16.87708)
Actor.Angle(1@) = 272.1
Actor.Angle(2@) = 98.9
Actor.Angle(3@) = 169.0
Actor.Angle(4@) = 123.0
Actor.Angle(4@) = 100.1
Actor.Angle(5@) = 158.0
Actor.Angle(5@) = 93.0
Actor.Angle(6@) = 78.1
Actor.Angle(7@) = 34.6
4@ = Marker.CreateAboveActor(1@)
5@ = Marker.CreateAboveActor(2@)
6@ = Marker.CreateAboveActor(3@)
7@ = Marker.CreateAboveActor(4@)
8@ = Marker.CreateAboveActor(5@)
9@ = Marker.CreateAboveActor(6@)
10@ = Marker.CreateAboveActor(7@)
01B2: give_actor 1@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 2@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 3@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 4@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 5@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 6@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 7@ weapon 22 ammo 9999 // Load the weapon model before using this
05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 3@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 4@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 5@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 6@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 7@ kill_actor $PLAYER_ACTOR
$ONMISSION = 1
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
:MISSIONE_761
wait 150
if
Actor.Dead(1@)
else_jump @MISSIONE_761
Actor.RemoveReferences(1@)
Marker.Disable(4@)
:MISSIONE_792
wait 150
if
Actor.Dead(2@)
else_jump @MISSIONE_792
Actor.RemoveReferences(2@)
Marker.Disable(5@)
:MISSIONE_823
wait 150
if
Actor.Dead(3@)
else_jump @MISSIONE_823
Actor.RemoveReferences(3@)
Marker.Disable(6@)
:MISSIONE_854
wait 150
if
Actor.Dead(3@)
else_jump @MISSIONE_854
Actor.RemoveReferences(4@)
Marker.Disable(5@)
:MISSIONE_885
wait 150
if
Actor.Dead(4@)
else_jump @MISSIONE_885
Actor.RemoveReferences(5@)
Marker.Disable(6@)
:MISSIONE_916
wait 150
if
Actor.Dead(5@)
else_jump @MISSIONE_916
Actor.RemoveReferences(6@)
Marker.Disable(7@)
:MISSIONE_947
wait 150
if
Actor.Dead(6@)
else_jump @MISSIONE_947
Actor.RemoveReferences(7@)
Marker.Disable(8@)
:MISSIONE_978
wait 150
if and
Actor.Dead(1@)
Actor.Dead(2@)
Actor.Dead(3@)
Actor.Dead(4@)
Actor.Dead(5@)
Actor.Dead(6@)
Actor.Dead(7@)
else_jump @MISSIONE_978
Actor.RemoveReferences(1@)
Actor.RemoveReferences(2@)
Actor.RemoveReferences(3@)
Actor.RemoveReferences(4@)
Actor.RemoveReferences(5@)
Actor.RemoveReferences(6@)
Actor.RemoveReferences(7@)
Marker.Disable(1@)
Marker.Disable(2@)
Marker.Disable(3@)
Marker.Disable(4@)
Marker.Disable(5@)
Marker.Disable(6@)
Marker.Disable(7@)
01E3: show_text_1number_styled GXT 'M_PASSR' number 6 time 5000 style 1 // MISSION PASSED!~n~~w~RESPECT +
Player.Money($PLAYER_CHAR) += 10000
$ONMISSION = 0
0998: add_respect 6
:MISSIONE_1136
wait 150
if
wasted_or_busted
else_jump @MISSIONE_1136
$ONMISSION = 0
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // ~r~MISSION FAILED!
0A93: end_custom_thread
scusate la mia niubbagine
quindi special lo devo rimanere solo a sweet???
ad esempio:
da:
023C: load_special_actor 'BALLAS1' as 1 // models 290-299
023C: load_special_actor 'BALLAS2' as 2 // models 290-299
023C: load_special_actor 'BALLAS3' as 3 // models 290-299
023C: load_special_actor 'FAM1' as 4 // models 290-299
023C: load_special_actor 'FAM2' as 5 // models 290-299
023C: load_special_actor 'FAM3' as 6 // models 290-299
023C: load_special_actor 'SWEET' as 7 // models 290-299
a
023C: load_actor 'BALLAS1' as 1 // models 290-299
023C: loadl_actor 'BALLAS2' as 2 // models 290-299
023C: load_actor 'BALLAS3' as 3 // models 290-299
023C: load_actor 'FAM1' as 4 // models 290-299
023C: load_actor 'FAM2' as 5 // models 290-299
023C: load_actor 'FAM3' as 6 // models 290-299
023C: load_special_actor 'SWEET' as 7 // models 290-299
,da
1@ = Actor.Create(Special, #SPECIAL01, 1919.828, -1230.462, 17.91885)
2@ = Actor.Create(Special, #SPECIAL02, 1921.177, -1230.2, 18.14182)
3@ = Actor.Create(Special, #SPECIAL03, 1914.285, -1229.235, 17.38179)
4@ = Actor.Create(Special, #SPECIAL04, 1912.606, -1225.933, 17.59943)
5@ = Actor.Create(Special, #SPECIAL05, 1911.651, -1228.455, 17.18024)
6@ = Actor.Create(Special, #SPECIAL06, 1913.453, -1229.186, 17.24896)
7@ = Actor.Create(Special, #SPECIAL07, 1912.281, -1231.196, 16.87708)
a
1@ = Actor.Create(#01, 1919.828, -1230.462, 17.91885)
2@ = Actor.Create(#02, 1921.177, -1230.2, 18.14182)
3@ = Actor.Create(#031914.285, -1229.235, 17.38179)
4@ = Actor.Create(#04, 1912.606, -1225.933, 17.59943)
5@ = Actor.Create(#05, 1911.651, -1228.455, 17.18024)
6@ = Actor.Create(#1913.453, -1229.186, 17.24896)
7@ = Actor.Create(Special, #SPECIAL07, 1912.281, -1231.196, 16.87708)
1 utenti stanno leggendo questa discussione
perchè quando sono nel raggio delle coordinate il gioco crasha???????
ho riprovato a farla ma il problema persiste
...beh...ovviamente perchè hai sbagliato qlks....
Se hai solo fatto copia-incolla da uno dei 2 codici (snake o wesser) è normale che crasha
Nel primo manca
0A93: end_custom_thread
alla fine del thread.
Il secondo non si compila nemmeno perchè un' arrey si ripete 2 volte
Posta il tuo codice e vediamo cosa c'è che non và.....
Se hai apportato variazioni e non hai tolto ciò che non serviva è ovvio che crasha tutto appena entri nelle coordinate [/b]
ok eccolo
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
thread 'MISSIONE'
:MISSIONE_19
wait 1000
thread 'MISSIONE'
if and
00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 1919.828 -1230.462 17.91885 radius 30.0 25.0 10.0
$ONMISSION == 0
else_jump @MISSIONE_19
023C: load_special_actor 'BALLAS1' as 1 // models 290-299
023C: load_special_actor 'BALLAS2' as 2 // models 290-299
023C: load_special_actor 'BALLAS3' as 3 // models 290-299
023C: load_special_actor 'FAM1' as 4 // models 290-299
023C: load_special_actor 'FAM2' as 5 // models 290-299
023C: load_special_actor 'FAM3' as 6 // models 290-299
023C: load_special_actor 'SWEET' as 7 // models 290-299
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
Model.Load(#AK47)
if and
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
Model.Available(#AK47)
023D: special_actor 1 loaded
023D: special_actor 2 loaded
023D: special_actor 3 loaded
023D: special_actor 4 loaded
023D: special_actor 5 loaded
023D: special_actor 6 loaded
023D: special_actor 7 loaded
wait 1000
1@ = Actor.Create(Special, #SPECIAL01, 1919.828, -1230.462, 17.91885)
2@ = Actor.Create(Special, #SPECIAL02, 1921.177, -1230.2, 18.14182)
3@ = Actor.Create(Special, #SPECIAL03, 1914.285, -1229.235, 17.38179)
4@ = Actor.Create(Special, #SPECIAL04, 1912.606, -1225.933, 17.59943)
5@ = Actor.Create(Special, #SPECIAL05, 1911.651, -1228.455, 17.18024)
6@ = Actor.Create(Special, #SPECIAL06, 1913.453, -1229.186, 17.24896)
7@ = Actor.Create(Special, #SPECIAL07, 1912.281, -1231.196, 16.87708)
Actor.Angle(1@) = 272.1
Actor.Angle(2@) = 98.9
Actor.Angle(3@) = 169.0
Actor.Angle(4@) = 123.0
Actor.Angle(4@) = 100.1
Actor.Angle(5@) = 158.0
Actor.Angle(5@) = 93.0
Actor.Angle(6@) = 78.1
Actor.Angle(7@) = 34.6
4@ = Marker.CreateAboveActor(1@)
5@ = Marker.CreateAboveActor(2@)
6@ = Marker.CreateAboveActor(3@)
7@ = Marker.CreateAboveActor(4@)
8@ = Marker.CreateAboveActor(5@)
9@ = Marker.CreateAboveActor(6@)
10@ = Marker.CreateAboveActor(7@)
01B2: give_actor 1@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 2@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 3@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 4@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 5@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 6@ weapon 22 ammo 9999 // Load the weapon model before using this
01B2: give_actor 7@ weapon 22 ammo 9999 // Load the weapon model before using this
05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 3@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 4@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 5@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 6@ kill_actor $PLAYER_ACTOR
05E2: AS_actor 7@ kill_actor $PLAYER_ACTOR
$ONMISSION = 1
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
Model.Destroy(#AK47)
:MISSIONE_761
wait 150
if
Actor.Dead(1@)
else_jump @MISSIONE_761
Actor.RemoveReferences(1@)
Marker.Disable(4@)
:MISSIONE_792
wait 150
if
Actor.Dead(2@)
else_jump @MISSIONE_792
Actor.RemoveReferences(2@)
Marker.Disable(5@)
:MISSIONE_823
wait 150
if
Actor.Dead(3@)
else_jump @MISSIONE_823
Actor.RemoveReferences(3@)
Marker.Disable(6@)
:MISSIONE_854
wait 150
if
Actor.Dead(3@)
else_jump @MISSIONE_854
Actor.RemoveReferences(4@)
Marker.Disable(5@)
:MISSIONE_885
wait 150
if
Actor.Dead(4@)
else_jump @MISSIONE_885
Actor.RemoveReferences(5@)
Marker.Disable(6@)
:MISSIONE_916
wait 150
if
Actor.Dead(5@)
else_jump @MISSIONE_916
Actor.RemoveReferences(6@)
Marker.Disable(7@)
:MISSIONE_947
wait 150
if
Actor.Dead(6@)
else_jump @MISSIONE_947
Actor.RemoveReferences(7@)
Marker.Disable(8@)
:MISSIONE_978
wait 150
if and
Actor.Dead(1@)
Actor.Dead(2@)
Actor.Dead(3@)
Actor.Dead(4@)
Actor.Dead(5@)
Actor.Dead(6@)
Actor.Dead(7@)
else_jump @MISSIONE_978
Actor.RemoveReferences(1@)
Actor.RemoveReferences(2@)
Actor.RemoveReferences(3@)
Actor.RemoveReferences(4@)
Actor.RemoveReferences(5@)
Actor.RemoveReferences(6@)
Actor.RemoveReferences(7@)
Marker.Disable(1@)
Marker.Disable(2@)
Marker.Disable(3@)
Marker.Disable(4@)
Marker.Disable(5@)
Marker.Disable(6@)
Marker.Disable(7@)
01E3: show_text_1number_styled GXT 'M_PASSR' number 6 time 5000 style 1 // MISSION PASSED!~n~~w~RESPECT +
Player.Money($PLAYER_CHAR) += 10000
$ONMISSION = 0
0998: add_respect 6
:MISSIONE_1136
wait 150
if
wasted_or_busted
else_jump @MISSIONE_1136
$ONMISSION = 0
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // ~r~MISSION FAILED!
0A93: end_custom_thread
scusate la mia niubbagine
I BAMBINI HANNO PAURA DEL BUIO....IL BUIO HA PAURA DI CHUCK NORRIS
#33
Inviato il 13 luglio 2009 - 08:15
A una prima vista mi viene da dire che i ballas e i ragazzi di grove non sono special actors......gli special actor sono i personaggi della storia (sweet, big smoke, woozie ecc...).
Per questi devi mettere #FAM1 e così anche x gli altri...
E anche quando poi li carichi non devi caricare gli special 1, spacial 2 eccetera.....perchè FAM e ballas non sono special
Per questi devi mettere #FAM1 e così anche x gli altri...
E anche quando poi li carichi non devi caricare gli special 1, spacial 2 eccetera.....perchè FAM e ballas non sono special
/
"Alme Sol, curru nitido diem qui promis et celas aliusque et idem nasceris, possis nihil urbe Roma visere maius"
/
"Alme Sol, curru nitido diem qui promis et celas aliusque et idem nasceris, possis nihil urbe Roma visere maius"
/
#34
Inviato il 13 luglio 2009 - 08:16
Certo che non hai seguito i miei consigli. Se vuoi utilizzare la soluzione più semplice, devi ottimizzarlo in base a quello che ho scritto all'inizio del post in cui ho parlato, in seguito, degli arrays. Se proprio non riesci cercherò di spiegarlo in parole ancora più povere.
Per quanto riguarda il caricamento dei modelli, basta farlo una sola volta per modello anche se quest'ultimo verrà richiamato più volte.
Per quanto riguarda il caricamento dei modelli, basta farlo una sola volta per modello anche se quest'ultimo verrà richiamato più volte.
Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206
#35
Inviato il 13 luglio 2009 - 12:15
Quote
Originally posted by Saint Jake@13/07/09 - 09:15
A una prima vista mi viene da dire che i ballas e i ragazzi di grove non sono special actors......gli special actor sono i personaggi della storia (sweet, big smoke, woozie ecc...).
Per questi devi mettere #FAM1 e così anche x gli altri...
E anche quando poi li carichi non devi caricare gli special 1, spacial 2 eccetera.....perchè FAM e ballas non sono special
A una prima vista mi viene da dire che i ballas e i ragazzi di grove non sono special actors......gli special actor sono i personaggi della storia (sweet, big smoke, woozie ecc...).
Per questi devi mettere #FAM1 e così anche x gli altri...
E anche quando poi li carichi non devi caricare gli special 1, spacial 2 eccetera.....perchè FAM e ballas non sono special
quindi special lo devo rimanere solo a sweet???
ad esempio:
da:
023C: load_special_actor 'BALLAS1' as 1 // models 290-299
023C: load_special_actor 'BALLAS2' as 2 // models 290-299
023C: load_special_actor 'BALLAS3' as 3 // models 290-299
023C: load_special_actor 'FAM1' as 4 // models 290-299
023C: load_special_actor 'FAM2' as 5 // models 290-299
023C: load_special_actor 'FAM3' as 6 // models 290-299
023C: load_special_actor 'SWEET' as 7 // models 290-299
a
023C: load_actor 'BALLAS1' as 1 // models 290-299
023C: loadl_actor 'BALLAS2' as 2 // models 290-299
023C: load_actor 'BALLAS3' as 3 // models 290-299
023C: load_actor 'FAM1' as 4 // models 290-299
023C: load_actor 'FAM2' as 5 // models 290-299
023C: load_actor 'FAM3' as 6 // models 290-299
023C: load_special_actor 'SWEET' as 7 // models 290-299
,da
1@ = Actor.Create(Special, #SPECIAL01, 1919.828, -1230.462, 17.91885)
2@ = Actor.Create(Special, #SPECIAL02, 1921.177, -1230.2, 18.14182)
3@ = Actor.Create(Special, #SPECIAL03, 1914.285, -1229.235, 17.38179)
4@ = Actor.Create(Special, #SPECIAL04, 1912.606, -1225.933, 17.59943)
5@ = Actor.Create(Special, #SPECIAL05, 1911.651, -1228.455, 17.18024)
6@ = Actor.Create(Special, #SPECIAL06, 1913.453, -1229.186, 17.24896)
7@ = Actor.Create(Special, #SPECIAL07, 1912.281, -1231.196, 16.87708)
a
1@ = Actor.Create(#01, 1919.828, -1230.462, 17.91885)
2@ = Actor.Create(#02, 1921.177, -1230.2, 18.14182)
3@ = Actor.Create(#031914.285, -1229.235, 17.38179)
4@ = Actor.Create(#04, 1912.606, -1225.933, 17.59943)
5@ = Actor.Create(#05, 1911.651, -1228.455, 17.18024)
6@ = Actor.Create(#1913.453, -1229.186, 17.24896)
7@ = Actor.Create(Special, #SPECIAL07, 1912.281, -1231.196, 16.87708)
I BAMBINI HANNO PAURA DEL BUIO....IL BUIO HA PAURA DI CHUCK NORRIS
#36
Inviato il 13 luglio 2009 - 16:33
L'"SCM" è un linguaggio creato appositamente per gta sa, quindi è molto limitato. Non puoi inventare e\o provare a modificare parametri se non si conoscono almeno le basi <_<. "Sanny Builder" possiede una buona documentazione di quello che alcuni parametri vogliano significare od i loro relativi valori.
Puoi consultarla da Aiuto->Guida in linea->SCM Documentation->GTA SA. Per trovare tutti gli opcode che ti interessano, invece, apri il file "sascm.ini" contenuto nella cartella "data\sa".
Ora analizziamo il tuo script. Non puoi cambiare la descrizione di ogni "opcode" per poterlo far funzionare. Per opcode si intende il numero che precede tutta le descrizione di quest'ultimo ed i relativi parametri. In pratica, sono funzioni richiamate dall'.exe (linguaggio macchina) ed in seguito convertite in linguaggio prettamente "umano", aggiungendoci la descrizione. Pertanto, tali funzioni non possono essere modificate dall'esterno perchè sono precompilate nell'.exe. Quindi, l'opcode:
E' adibito solamente a far caricare i modelli speciali (praticamente quelli principali del gioco, visibili nelle cutscenes), e non a caricare modelli di pedoni. Ovviamente dico questo perchè mi avvalo della descrizione. Ciò che hai bisogno di modificare, è il numero che precede la descrizione ed i parametri, ma sarebbe meglio che prelevassi tutto l'opcode dal file apposito che lo contiene (riferendomi al "sascm.ini"), così da aver la descrizione ed il numero dei parametri esatti.
Nota: Consultando il file ".ini" e possibile visualizzare tutti gli opcode ed i parametri che ci interessano. La lista, presenta differenze rispetto a quella che è la visualizzazione all'interno del source. Cerchiamo di capire la struttura.
Ora elenco quello che indicano i rispettivi parametri: opcode, numero parametri, parametro "2" ed "1". E' inutile spiegare come ricavare l'opcode "compilabile", ci si può rendersene conto anche autonomamente. Per curiosità, ogni parametro è delimitato da "%" ed il tipo, dopo il numero di esso (la lettera "d"). Questa dovrebbe essere la lista completa.
Comunque sia, questi sono parametri che, in futuro, potremmo utilizzare per la creazione di un nostro opcode. Ripeto, solo con librerie (o meglio .dll\.asi) aggiuntive.
Nota: Per comodità meglio consultare il source del file "main.scm" decompilato, così potresti anche vedere in quale occasione l'opcode desiderato viene utilizzato ed a quale scopo. Molto spesso, per quanto riguarda gli opcode più utilizzati, capita che manca il numero dell'opcode. Non vi è alcuna ragione di preoccuparsi perchè, in quel caso, si è di fronte all'utilizzo di una classe, ovvero un'abbreviazione di tutto l'opcode omettendo il suo numero. Le classi, hanno un'aspetto simile alle funzioni che vengono utilizzate nei linguaggi di programmazione come C#, C++, VB, e via dicendo. Cercando nell'scm l'opcode "0247" (contenuto nell'esempio successivo) non è possibile trovarlo, perchè utilizza una classe. Per ovviare a ciò, aprire il file "classes.db" in "data\sa" e consultare l'indice per trovare il contenuto di quello che stiamo cercando (nel nostro caso "Model").
Trovata la linea che ci interessa cerchiamo di capire cosa significa. "Load", è la dicitura che segue dopo il punto.
Il paramtro successivo, invece, è l'opcode che cercavamo. Tale modifica è utile nel momento in cui non ricordiamo il nome di un opcode e sappiamo qual'è il nome della classe (anche se una volta che abbiamo scritto ".", "Sanny Builder", automaticamente, aprirà una sotto finestra che elencherà tutti i vari opcode cui e stato settato il nome della classe in base al campo digitato in precedenza, come "Model", "Actor", "Object", "Car" ed "Animation".
L'opcode, di cui parlavamo in precedenza (023C), deve essere quindi sostituito con il seguente:
Prima di tutto occorre caricare il modello e se, dunque, è stato caricato correttamente, proseguire con il codice successivo. Esempio:
Nota: Qualsiasi loop deve essere sempre preceduto da un "wait", altrimenti il gioco crasherà. In questo caso la condizione prima è falsa, poi viene letto il "wait", ed infine ritorna al label di partenza. A questo punto, la condizione sara sempre vera e continua con la lettura del codice successivo.
Ciò accade perchè, delle volte, vi è un ritardo del caricamento del modello richiesto, ed in assenza, può crashare e non.
Per quanto concerne l'opcode "009A", ovvero "Actor.Create", consulta la documentazione di "SB" per "fixare" il parametro inadeguato del tipo di pedone (generalmente "CivMale" o "4", ma se in missione "Mission1" o 21), ed il nome id del modello corretto.
E così via. Ricapitolando, per i pedoni carica i modelli con "Load.Model" o l'opcode "023C" per quelli speciali, controlla se sono stati caricati o meno con "Model.Available" e "spawnali" con l'opcode "009A", utilizzando il modello caricato con "Load.Model" per i pedoni (#BALLAS1... #FAM1...) e l'opcode 023C per gli attori speciali (#SPECIAL01...).
Spero di esser stato di aiuto.
Puoi consultarla da Aiuto->Guida in linea->SCM Documentation->GTA SA. Per trovare tutti gli opcode che ti interessano, invece, apri il file "sascm.ini" contenuto nella cartella "data\sa".
Ora analizziamo il tuo script. Non puoi cambiare la descrizione di ogni "opcode" per poterlo far funzionare. Per opcode si intende il numero che precede tutta le descrizione di quest'ultimo ed i relativi parametri. In pratica, sono funzioni richiamate dall'.exe (linguaggio macchina) ed in seguito convertite in linguaggio prettamente "umano", aggiungendoci la descrizione. Pertanto, tali funzioni non possono essere modificate dall'esterno perchè sono precompilate nell'.exe. Quindi, l'opcode:
023C: load_special_actor 'BALLAS1' as 1
E' adibito solamente a far caricare i modelli speciali (praticamente quelli principali del gioco, visibili nelle cutscenes), e non a caricare modelli di pedoni. Ovviamente dico questo perchè mi avvalo della descrizione. Ciò che hai bisogno di modificare, è il numero che precede la descrizione ed i parametri, ma sarebbe meglio che prelevassi tutto l'opcode dal file apposito che lo contiene (riferendomi al "sascm.ini"), così da aver la descrizione ed il numero dei parametri esatti.
Nota: Consultando il file ".ini" e possibile visualizzare tutti gli opcode ed i parametri che ci interessano. La lista, presenta differenze rispetto a quella che è la visualizzazione all'interno del source. Cerchiamo di capire la struttura.
023C=2,load_special_actor %2d% as %1d%
Ora elenco quello che indicano i rispettivi parametri: opcode, numero parametri, parametro "2" ed "1". E' inutile spiegare come ricavare l'opcode "compilabile", ci si può rendersene conto anche autonomamente. Per curiosità, ogni parametro è delimitato da "%" ed il tipo, dopo il numero di esso (la lettera "d"). Questa dovrebbe essere la lista completa.
# GTA3-GTAvc-GTAsa ; d% = valore decimale, variabile locale e globale, float, o integer ; g% = riferimento stringa gxt 8-byte ; h% = intero esadecimale ; m% = riferimento statistiche ? ; o% = tutti i tipi di oggetto dei modelli ; p% = riferimento puntatore label ; s% = riferimento stringa 16-byte ? ; x% = script esterno # GTA3 ; b:set_from_position/clear% = valore sconosciuto abilita\disabilita # GTAsa ; f% = modello pedone speciale ; w% = riferimento audio wav ? # GTA3-GTAvc ; a% = riferimento al particle .cfg ; b:in-sphere/% = valore sphere abilita\disabilita ; b:enabled/disabled% = valore parametro abilita\disabilita ; b:day/night = valore scelta tempo atmosferico ; b:back/% = valore fade abilita\disabilita ; b:unfrozen/frozen% = valore blocco abilita\disabilita ; b:true/false% = sostituisci con true se <> 0, sostituisci con false se = 0 ; b:on/off% = valore parametro abilita\disabilita ; b:kill/arrest% = valore scelta polizia ; b:off/wander% = valore "wander" abilita\disabilita ; b:visible/invisible% = valore visibilità abilita\disabilita ; b:bar/number% = valore scelta tipo del testo-stato ; c% = numero arma ; e% = tipo pedone ; i% = intero binario ; u% = gruppo pedone ; z% = riferimento stringa zona 8-byte # GTAvc-GTAsa ; t% = riferimento agli .ide dell'oggetto dei modelli
Comunque sia, questi sono parametri che, in futuro, potremmo utilizzare per la creazione di un nostro opcode. Ripeto, solo con librerie (o meglio .dll\.asi) aggiuntive.
Nota: Per comodità meglio consultare il source del file "main.scm" decompilato, così potresti anche vedere in quale occasione l'opcode desiderato viene utilizzato ed a quale scopo. Molto spesso, per quanto riguarda gli opcode più utilizzati, capita che manca il numero dell'opcode. Non vi è alcuna ragione di preoccuparsi perchè, in quel caso, si è di fronte all'utilizzo di una classe, ovvero un'abbreviazione di tutto l'opcode omettendo il suo numero. Le classi, hanno un'aspetto simile alle funzioni che vengono utilizzate nei linguaggi di programmazione come C#, C++, VB, e via dicendo. Cercando nell'scm l'opcode "0247" (contenuto nell'esempio successivo) non è possibile trovarlo, perchè utilizza una classe. Per ovviare a ciò, aprire il file "classes.db" in "data\sa" e consultare l'indice per trovare il contenuto di quello che stiamo cercando (nel nostro caso "Model").
Load,0247,0,0,("ModelID%i")
Trovata la linea che ci interessa cerchiamo di capire cosa significa. "Load", è la dicitura che segue dopo il punto.
Model.Load
Il paramtro successivo, invece, è l'opcode che cercavamo. Tale modifica è utile nel momento in cui non ricordiamo il nome di un opcode e sappiamo qual'è il nome della classe (anche se una volta che abbiamo scritto ".", "Sanny Builder", automaticamente, aprirà una sotto finestra che elencherà tutti i vari opcode cui e stato settato il nome della classe in base al campo digitato in precedenza, come "Model", "Actor", "Object", "Car" ed "Animation".
L'opcode, di cui parlavamo in precedenza (023C), deve essere quindi sostituito con il seguente:
0247: load_model #BALLAS1
Prima di tutto occorre caricare il modello e se, dunque, è stato caricato correttamente, proseguire con il codice successivo. Esempio:
0247: load_model #BALLAS1 :Model_load if not Model.Available(#BALLAS1) jf @Model_load2 wait 0 jump @Model_load :Model_load2 ...
Nota: Qualsiasi loop deve essere sempre preceduto da un "wait", altrimenti il gioco crasherà. In questo caso la condizione prima è falsa, poi viene letto il "wait", ed infine ritorna al label di partenza. A questo punto, la condizione sara sempre vera e continua con la lettura del codice successivo.
Ciò accade perchè, delle volte, vi è un ritardo del caricamento del modello richiesto, ed in assenza, può crashare e non.
Per quanto concerne l'opcode "009A", ovvero "Actor.Create", consulta la documentazione di "SB" per "fixare" il parametro inadeguato del tipo di pedone (generalmente "CivMale" o "4", ma se in missione "Mission1" o 21), ed il nome id del modello corretto.
1@ = Actor.Create(Mission1, #BALLAS1, px, py, pz)
E così via. Ricapitolando, per i pedoni carica i modelli con "Load.Model" o l'opcode "023C" per quelli speciali, controlla se sono stati caricati o meno con "Model.Available" e "spawnali" con l'opcode "009A", utilizzando il modello caricato con "Load.Model" per i pedoni (#BALLAS1... #FAM1...) e l'opcode 023C per gli attori speciali (#SPECIAL01...).
Model.Load(#BALLAS1) Model.Load(#BALLAS2) Model.Load(#BALLAS3) Model.Load(#FAM1) Model.Load(#FAM2) Model.Load(#FAM3) 023C: load_special_actor 'SWEET' as 1 // Inserisci il thread che verifichi se il modello è stato correttamente caricato quì 1@ = Actor.Create(Mission1, #BALLAS1, 1919.828, -1230.462, 17.91885) 2@ = Actor.Create(Mission1, #BALLAS2, 1921.177, -1230.2, 18.14182) 3@ = Actor.Create(Mission1, #BALLAS3, 1914.285, -1229.235, 17.38179) 4@ = Actor.Create(Mission1, #FAM1, 1912.606, -1225.933, 17.59943) 5@ = Actor.Create(Mission1, #FAM2, 1911.651, -1228.455, 17.18024) 6@ = Actor.Create(Mission1, #FAM3, 1913.453, -1229.186, 17.24896) 7@ = Actor.Create(Mission1, #SPECIAL01, 1912.281, -1231.196, 16.87708)
Spero di esser stato di aiuto.
Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206