Voertuigen scripten (GTA San Andreas)

Hoofdpagina > Modding > Modding Tutorial List > Voertuigen scripten


Deze tutorial gaat over een wezenlijk deel van het spel: auto’s. Je hebt auto’s op verschillende manieren: een auto die eenmalig spawnt of auto’s die blijven spawnen.

Auto's die blijven spawnen

Je zou het misschien niet zeggen, maar de auto’s die blijven spawnen zijn makkelijker te maken als de auto’s die eenmalig gespawnt worden. Dit komt omdat het een zogenaamde ‘cargenerator’ is. Je hoeft ze dan niet van tevoren te laden en na afloop te unloaden, omdat dat allemaal achter de schermen voorkomt en hardcoded is. Op deze manier worden dus de auto’s gespawnt die een vaste vindplaats hebben.

De regel voor de cargenerator is:

 014B: $PARKED_RHINO = init_parked_car_generator #RHINO -1 -1 1 alarm 0 door_lock 0 0 10000 at 2435.302 -1671.848 12.8007 angle 90.0 
 014C: set_parked_car_generator $PARKED_RHINO cars_to_generate_to 0[/code]

Eerst de eerste regel.

  • $PARKED_RHINO is een variabele, de naam van de code.
  • Het is een RHINO, wat er staat #RHINO.
  • Hij is geparkeerd op de coördinaten “2435.302 -1671.848 12.8007”.
  • Hij staat onder een hoek (angle) van 90 graden, dat betekent dus het oosten.


Tot zover was het nog makkelijk in de regel af te lezen.

  • Na #RHINO staan nog een aantal parameters die ik stuk voor stuk uit zal leggen.
  • De eerste -1 is de eerste kleur van het voertuig.
  • De tweede -1 is de tweede kleur van het voertuig.
  • De derde, de 1, is of de politie denkt dat het jouw auto is of niet. Is het 1, zoals hier, dan denkt de politie dat het de jouwe is. Is het een 0, dan denkt de politie dat jij hem gejat hebt en krijg je een wanted level als ze je zien.
  • Alarm 0 betekent dat er geen alarm op zit. Het getal dat je invult, is de percentuele kans dat het alarm af gaat. Dus 100 is altijd, 0 is nooit. 50 is 1 op de twee keer, 75 is 1 op de drie keer etc.
  • Door_lock 0 betekent dat de auto open is, als je daar 1 weg zet, is de auto op slot.
  • De twee andere parameters, in dit geval 0 en 10000, zijn onbekend (men heeft (nog) niet uitgevonden wat het doet).


De tweede regel betekent: spawnen, ja of nee? Bij 101 spawnt hij, bij 0 niet. Dit lijkt niet zo belangrijk, maar je moet deze tweede regel er altijd bij hebben. Overigens staat de ‘naam’ in de eerste regel, en die moet je toevoegen in de tweede regel. In het voorbeeld hierboven dus $PARKED_RHINO.

Voorbeeld in stripped GTA SA

  {
 use macro (Ctrl+J) "headsa"
 to insert a file header
 }
 {$VERSION 3.0.0000}
 
 thread 'MAIN'
 var
 $PLAYER_CHAR: Player
 end // var
 01F0: set_max_wanted_level_to 6
 set_wb_check_to 0
 00C0: set_current_time 8 0
 04E4: unknown_refresh_game_renderer_at 2488.5601 -1666.84
 Camera.SetAtPos(2488.5601, -1666.84, 13.38)
 $PLAYER_CHAR = Player.Create(#NULL, 2488.5601, -1666.84, 13.38)
 $PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
 07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
 Camera.SetBehindPlayer
 set_weather 0
 wait 0 ms
 $PLAYER_CHAR.SetClothes("PLAYER_FACE", "HEAD", Head)
 $PLAYER_CHAR.SetClothes("JEANSDENIM", "JEANS", Legs)
 $PLAYER_CHAR.SetClothes("SNEAKERBINCBLK", "SNEAKER", Shoes)
 $PLAYER_CHAR.SetClothes("VEST", "VEST", Torso)
 $PLAYER_CHAR.Build
 $PLAYER_CHAR.CanMove = True
 fade 1 (out) 0 ms
 select_interior 0
 0629: change_stat 181 (islands unlocked) to 4
 016C: restart_if_wasted at 2027.77 -1420.52 15.99 angle 137.0 for_town_number 0
 016D: restart_if_busted at 1550.68 -1675.49 14.51 angle 90.0 for_town_number 0
 0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here ($ONMISSION)
 03E6: remove_text_box
 // put your create_thread commands here
 
 create_thread @MODEL
 
 // IDLE LOOP
 :leeg
 wait 500
 jump @leeg
   
 end_thread
 
 :MODEL
 thread 'MODEL'
 014B: $PARKED_RHINO = init_parked_car_generator #RHINO -1 -1 1 alarm 0 door_lock 0 0 10000 at 2459.9041 -1659.4592 13.3047 angle 90.0 
 014C: set_parked_car_generator $PARKED_RHINO cars_to_generate_to 101
   
 end_thread

Een car generator hoeft niet per se in een aparte thread, het is ook mogelijk om hem bovenaan erbij te plaatsen (net boven de idle loop).

Tweede variant (nummerbord)

Er is ook nog een variant, waarmee je het nummerbord kunt wijzigen:

 09E2: $2765 = parked_car_generator_w_numberplate #GREENWOO 59 34 0 alarm 0 door_lock 0 0 10000 plate "GROVE4L_" at $138 $139 $140 angle $141 
 014C: set_parked_car_generator $2765 cars_to_generate_to 101[/code]

Je maakt er "parked_car_generator_w_numberplate" van (with numberplate), en je voegt "Plate "..." " toe. Dan heb je dus een auto die spawnt mét nummerbord. Let wel op; het is ook een andere opcode!


Toevoegingen auto's die eenmalig spawnen

Dit gaat weer ongeveer op dezelfde manier als het spawnen van actors.

 //Load models
 0247: load_model #GREENWOO 
 038B: load_requested_models 
 
 :MODEL_LOAD
 00D6: if  
 8248:   not model #GREENWOO available 
 004D: jump_if_false @MODEL_SPAWN
 0001: wait 0 ms 
 0002: jump @MODEL_LOAD

Als je de andere tuts hebt gelezen, lijkt me hier geen bij uitleg nodig.

 :MODEL_SPAWN
 $greenwood = Car.Create(#GREENWOO, 2458.2483, -1659.0264, 13.3047)
 Car.Angle($greenwood)= 270.0[/code]

Hier spawn je dus de greenwood.

  • De naam van het model is GREENWOO, daarvoor uiteraard altijd een #.
  • Daarachter komen de coordinaten.
  • De tweede regel is weer voor de Angle (hoek).
 0249: release_model #GREENWOO

En hier weer om te releasen, zoals ook in de voorgaande tutorials (bij actors) is gebeurd.

Eigenschappen eenmalig spawnende auto

Natuurlijk zijn er allerlei leuke codes voor een eenmalig spawnende auto. Hier volgen een paar voorbeelden:

 0674: set_car_model #GREENWOO numberplate "ABCDEFG"] 

Zo kan je dus een speciaal nummerbord instellen van een auto.

 0119:   car $greenwood wrecked

Hiermee kun je dus vragen of je auto kapot is of niet (vaak met een if-structuur erbij). Bij de $ moet je de naam van de gespawnde auto geven.

 0224: set_car $greenwood health_to 10000

Hoe hoger je het getal maakt (10000), hoe meer schade de auto kan incasseren. Hier kan je natuurlijk leuk mee variëren. De Greenwood met 500 is hij bijvoorbeeld hevig aan het roken (nog wel wit), met 250 is hij ook aan het roken, zelfs zwart, en is 1 botsing genoeg om te ontploffen. Lager als 249 hoef je niets te doen, dan ontploft hij al uit zichzelf. 1000 is een reëel getal voor een auto. De $greenwood is natuurlijk weer de naam van de auto, gedefinieerd bij het spawnen.

 01E8: create_forbidden_for_cars_cube_cornerA 2500.0 -1677.0 20.0 cornerB 2430.0 -1653.0 0.0
 01E7: remove_forbidden_for_cars_cube_cornerA 2272.922 -1649.556 14.3311 cornerB 2266.101 -1633.219 14.3505

Dit zijn de codes voor aanmaken en verwijderen van gebieden die je autoloos wilt hebben. Er rijden daar dus geen auto’s rond. Is handig als je bijvoorbeeld mensen moet vermoorden die een goed wapen hebben. Anders heb je immers een probleem dat de speler gewoon een auto kan pakken en daardoor vrijwel geen last heeft van het wapen van de actor. Je hebt een corner A en een corner B. De coördinaten invullen is wat lastiger. Je moet dus de x en y coordinaat van de ene hoek nemen en de x en y coordinaat van de andere hoek. Dus:

 A  
 	
 		 B             

Vervolgens moet je de Y coordinaat bepalen. De ene moet hoog zijn, de andere laag: zo krijg je een kubus. Maakt dus niet uit welke van de twee hoog is en welke laag. Advies is om gewoon heel hoog en heel laag te doen, zodat het niet uit maakt waar je gaat staan in die kubus. Bijvoorbeeld 0.0 en 20, of misschien zelfs hoger.

Natuurlijk zijn er nog veel en veel meer commando’s die met cars te maken hebben, omdat het natuurlijk een heel wezenlijk onderdeel is in het spel. Dit zijn slechts enkele voorbeelden van de vele mogelijkheden!