Een eenvoudige missie scripten (GTA San Andreas)

Hoofdpagina > Modding > Modding Tutorial List > Een eenvoudige missie scripten


Zoals beloofd gaan we nu beginnen met een echte missie te maken. Allereerst moet je een goed plan hebben voor de missie. In ons voorbeeld gaan we een auto laten spawnen met pijl erboven, als je instapt gaat de pijl weg en komt er een sphere waar je heen moet rijden. Op dit moment heeft de speler een baseball bat. De auto is al ver kapot, en bij de lichtste aanraking (zelfs met een lantaarnpaal) ontploft hij. Als men in de marker is, moet er een actor spawnen met een baseball bat. Deze moet je aanvallen zodra hij je ziet. Als de actor vermoord is krijg je een bericht dat de missie gehaald is en krijg je er $10.000 bij. Ook verdwijnt de marker dan.

Natuurlijk is dit niet een hele moeilijke missie, en zou je hem later nog wat kunnen opleuken. Bijvoorbeeld door een tijd toe te voegen als je rijdt: zo moet je snel rijden en kan je niet gewoon rustig rijden en zo schade voorkomen. Of bijvoorbeeld als je uitstapt, dat je dan weer een marker krijgt op de auto. Of dat je de missie faalt als je dood bent, want nu moet je gewoon van het Los Santos ziekenhuis gaan naar de plek waar je gebleven bent (met de gevolgen daarvan). Hoe dan ook, je moet klein beginnen, en dat gaan we dus ook doen met deze missie.

Het scripten

Nu we het idee hebben, gaan we scripten. We beginnen zoals gebruikelijk met de stripped file. Deze kan je vinden in de map van Sanny Builder (meestal in Program Files) > Data > SA > Stripped.txt. Open deze in Sanny Builder.

Vervolgens gaan we eerst maar alles laden en kijken of het geladen is. De actor moet nog niet gespawnt worden, de auto wel. De bat moeten we zometeen geven aan de speler, later pas aan de actor. Hier het loaden van de models en het spawnen van de auto (en de instellingen van de auto) .

 :MODEL
 thread 'MODEL'
 //Load models
 0247: load_model #GREENWOO
 0247: load_model #bat
 0247: load_model #BFYST
 038B: load_requested_models 
 
 :MODEL_LOAD
 00D6: if or 
 8248:   not model #GREENWOO available
 8248:   not model #bat available
 8248:   not model #BFYST available
 004D: jump_if_false @MODEL_SPAWN											  
 wait 0 ms 
 jump @MODEL_LOAD
 
 :MODEL_SPAWN
 0674: set_car_model #GREENWOO numberplate "ABCDEFG" 
 00A5: $greenwood = create_car #GREENWOO at 2458.2483 -1659.0264 13.3047 
 Car.Angle($greenwood)= 270.0
 0224: set_car $greenwood health_to 250[/code]

Vervolgens gaan we kijken, wat missen we nog voordat we gaan rijden? Dat is dat de speler een baseball bat krijgt, en natuurlijk ook de marker boven de auto:

 0186: $m1 = create_marker_above_car $greenwood
 01B2: give_actor $PLAYER_ACTOR weapon 5 ammo 10 // Load the weapon model before using this
 01B9: set_actor $PLAYER_ACTOR armed_weapon_to 5

Ok, we zijn nu zo ver dat we in de auto kunnen gaan stappen. Stel, we zitten in de auto. Wat moet er dan gebeuren? Je moet naar de volgende plek gaan. Dus nadat we in de auto zitten, moet de marker van de auto weg, de icon geplaatst worden en de sphere gemaakt worden. Dat doe je als volgt:

 repeat
 wait 0
 until Actor.InCar($PLAYER_ACTOR, $greenwood)
 Marker.Disable($m1)
 
 0004: $coordinaat_x = 2100.9604
 0004: $coordinaat_y = -1366.8369
 0004: $coordinaat_z = 23.9844 
 	
 $coordinaat = Marker.CreateIconAndSphere(0, $coordinaat_x, $coordinaat_y, $coordinaat_z)

Wat hebben we nou, we hebben een speler die in de auto zit en naar de marker toe moet rijden. Wat kan er onderweg gebeuren? De auto kan kapot gaan, wat willen we dan dat er gebeurt? Dan moet er een nieuwe auto gespawnd worden aan het begin en moet je teruggaan. Deze check moet maar doorgaan tot de auto de sphere heeft bereikt. Dit is misschien een lastigere code om te maken, maar als je er goed naar kijkt is het eigenlijk wel logisch en kan je het de volgende keer zelf ook!

 :MODEL_WRECKED
 wait 0 ms										
 if	 
   0119:   car $greenwood wrecked			   
   004D: jump_if_false @MODEL_END								 
 wait 0 ms											  
 jump @MODEL
 
 :MODEL_END
 if
  01AE:   car $greenwood sphere 0 near_point $coordinaat_x $coordinaat_y radius 5.0 5.0 stopped 
  004D: jump_if_false @MODEL_WRECKED
 wait 0 ms

Hier staat: Wanneer de auto kopot is, spring naar @MODEL. Dan begin je dus weer helemaal opnieuw. Wanneer dit niet het geval is (jump_if_false), spring dan naar MODEL END, de label eronder. Probleem is dat je nu nog niet klaar bent, want je moet die check niet één keer uitvoeren, maar heel vaak. In het begin is hij immers nog niet kapot, maar dat kan gebeuren tot aan de sphere, en dat betekent dus dat deze code herhaald moet blijven worden.

Dus wanneer de auto (aangegeven met car $greenwood, zodat er per se in die auto gezeten moet worden) in de buurt is van de sphere (radius 5.0), dan mag hij door. Zo niet? Dan springt hij terug naar MODEL_WRECKED en komt er eerst een controle of hij kapot is. Dit gaat zo door, totdat de Greenwood in de buurt van de sphere is.

Nu moet de sphere en marker verdwijnen. Dan wil je de actor spawnen, die je aanvalt.

 10@ = Actor.Create(CIVFEMALE, #BFYST, 2094.3499, -1342.9515, 23.9844)
 Marker.Disable($coordinaat)
 Actor.Angle(10@) = 88.44
 0187: $marker = create_marker_above_actor 10@ 
 actor.WeaponAccuracy(10@)= 100
 actor.Health(10@) = 250
 01B2: give_actor 10@ weapon 5 ammo 1000 // Load the weapon model before using this
 01B9: set_actor 10@ armed_weapon_to 5
 05E2: AS_actor 10@ kill_actor $PLAYER_ACTOR

Alle codes die in dit stukje code voorkomen, zijn in de vorige tutorials al uitgelegd.

Tot slot wil je dat de actor dood gaat, en dan is de missie gehaald. Liedje afspelen, tekst op het scherm, geld erbij, de marker op de actor destroyen en ook de models destroyen:

  repeat
 wait 0 ms
 until actor.Dead(10@)
 
 0394: play_music 1
 01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1 // MISSION PASSED!~n~~w~$~1~
 Player.Money($PLAYER_CHAR) += 10000
 0249: release_model #GREENWOO
 0249: release_model #BAT
 0249: release_model #BFYST
 Marker.Disable($marker)

Ook hier staat niets nieuws. Misschien het "Repeat until", dat betekent niets anders als wachten tot (in dit geval) de actor dood is.

Tot slot zet je nog een end_thread en dan ben je klaar.

 end_thread

Alles bij elkaar krijg je het volgende. En probeer maar: het is een missie. Misschien niet een al te moeilijke missie, maar who cares? Je moet tenslotte klein beginnen :Y.

 {
 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
 create_thread @MODEL
 
 // IDLE LOOP
 :leeg
 wait 500
 jump @leeg
 
 end_thread
 
 :MODEL
 thread 'MODEL'
 //Load models
 0247: load_model #GREENWOO
 0247: load_model #bat
 0247: load_model #BFYST
 038B: load_requested_models 
 
 :MODEL_LOAD
 00D6: if or 
 8248:   not model #GREENWOO available
 8248:   not model #bat available
 8248:   not model #BFYST available
 004D: jump_if_false @MODEL_SPAWN                                              
 0001: wait 0 ms 
 0002: jump @MODEL_LOAD
 
 :MODEL_SPAWN
 0674: set_car_model #GREENWOO numberplate "ABCDEFG" 
 00A5: $greenwood = create_car #GREENWOO at 2458.2483 -1659.0264 13.3047 
 Car.Angle($greenwood)= 270.0
 0224: set_car $greenwood health_to 250
 0186: $m1 = create_marker_above_car $greenwood
 01B2: give_actor $PLAYER_ACTOR weapon 5 ammo 10 // Load the weapon model before using this
 01B9: set_actor $PLAYER_ACTOR armed_weapon_to 5
 
 repeat
 wait 0
 until Actor.InCar($PLAYER_ACTOR, $greenwood)
 Marker.Disable($m1) 
 
                                                                                  
 0004: $coordinaat_x = 2100.9604
 0004: $coordinaat_y = -1366.8369
 0004: $coordinaat_z = 23.9844 
 
 $coordinaat = Marker.CreateIconAndSphere(0, $coordinaat_x, $coordinaat_y, $coordinaat_z)
 
 :MODEL_WRECKED
 wait 0 ms                                        
 if     
   0119:   car $greenwood wrecked               
   004D: jump_if_false @MODEL_END                                 
 wait 0 ms                                              
 jump @MODEL
 
 :MODEL_END
 if
  01AE:   car $greenwood sphere 0 near_point $coordinaat_x $coordinaat_y radius 5.0 5.0 stopped 
  004D: jump_if_false @MODEL_WRECKED
 wait 0 ms
 
 10@ = Actor.Create(CIVFEMALE, #BFYST, 2094.3499, -1342.9515, 23.9844)
 Marker.Disable($coordinaat)
 Actor.Angle(10@) = 88.44
 0187: $m2 = create_marker_above_actor 10@ 
 actor.WeaponAccuracy(10@)= 100
 actor.Health(10@) = 250
 01B2: give_actor 10@ weapon 5 ammo 1000 // Load the weapon model before using this
 01B9: set_actor 10@ armed_weapon_to 5
 05E2: AS_actor 10@ kill_actor $PLAYER_ACTOR
 
 repeat
 wait 0 ms
 until actor.Dead(10@)
 
 0394: play_music 1
 01E3: show_text_1number_styled GXT 'M_PASS' number 10000 time 5000 style 1 // MISSION PASSED!~n~~w~$~1~
 Player.Money($PLAYER_CHAR) += 10000
 0249: release_model #GREENWOO
 0249: release_model #BAT
 0249: release_model #BFYST
 Marker.Disable($m2)
 
 end_thread

Zo zien jullie, met eenvoudige codes kan je toch al een aardige missie maken. Maar het probleem is bij veel modders ook niet de kunst van het modden, maar de creativiteit…