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…