Missionen

  1. so fügt man eine Mission hinzu:
  2. Missionen müssen im Second_Segment, Missionsaufstellung definiert werden,
  3. :Third_Segment
    0002: jump ££Fourth_Segment
    DEFINE MISSIONS  2
    DEFINE MISSION 0 AT ££INITIAL_1   ; originally: Initial 1
    DEFINE MISSION 1 AT ££TestMission_1   ; originally: TestMission
  4. die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE MISSIONS 2)
  5. Definiert wird die Mission durch ihre Adresse mit der das Missions-Script beginnt (TestMission_1)
  6. Missions-Scripte kommen in den Mission Part des 7. Segments

  7. Und dann, ganz wichtig: Im Main-Thread
  8. muss der Status des speziellen Missions-Modus erfasst werden.
    0180: set_on_mission_flag_to $ON_MISSION
  9. Mit der hiermit erhaltenen Variable $ON_MISSION, durch Gleichsetzen mit 1
  10. 0004: $ON_MISSION =  1  ;; integer values
  11. und dem Opcode
  12. 0317: increment_mission_attempts
  13. der sich im Missions-Script befindet, wird das Spiel in den speziellen Missions-Modus versetzt
  14. Außerdem wird mit der Abfrage
  15. 0038:   $ON_MISSION ==  0  ;; integer values
  16. in Threads des Main Parts verhindert,
    daß Scripte ausgeführt werden, die das Missions-Script stören.
    Wie z.B. Threads zum Starten von Missionen.
    Somit sind wir beim nächsten Schritt:

  17. Zum Starten der Mission setzen wir den Missions-Starter-code
  18. 0417: start_mission  1   ; originally: TestMission
  19. in einen Missions-Starter-Thread, der im Main Part platziert wird.
  20. Die Nummer für den start_mission_code ergibt sich aus der Reihenfolge, wie die Missions-Scripte in den Mission Part des 7. Segments eingefügt wurden
  21. :MissionStart1;;;-----------------MB0.33/sascm.ini vom 1.Sep.2005
    03A4: name_thread "MST"
    
    :MissionStart2
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££MissionStart2
    00D6: if  0
    0038:   $ON_MISSION ==  0  ;; integer values
    004D: jump_if_false ££MissionStart2
    00D6: if  0
    00FF:   actor $PLAYER_ACTOR  1 (in-sphere)near_point_on_foot 2498.5  -1678.5  13.35 radius  2.0  2.0  1.0
    004D: jump_if_false ££MissionStart2
    0004: $ON_MISSION =  1  ;; integer values
    0417: start_mission  1   ; originally: TestMission
    0002: jump ££MissionStart2


  22. Das Missions-Script kommt dann in den Mission Part des 7. Segments
  23. Im folgenden Beispiel, ein einfaches Missions-Script. Die Einzelheiten werden im Anschluss erklärt
  24. ;-------------Mission 1-----------------MB0.33/sascm.ini vom 1.Sep.2005
    ; Originally: TestMission
    
    
    :TestMission_1
    03A4: name_thread "TMISS"  
    0050: gosub £TestMission_main_1 
    00D6: if  0
    0112:   wasted_or_busted
    004D: jump_if_false £TestMission_end_1
    0050: gosub £TestMission_fail_1                    
    
    :TestMission_end_1
    0050: gosub £TestMission_clep_1
    004E: end_thread
    
    :TestMission_main_1
    0317: increment_mission_attempts;;here starts the missionscript
    0004: $on_mission =  1
    
    0247: request_model #VMAFF4
    0247: request_model #AK47
    
    :Load_models1
    0001: wait  0 ms
    00D6: if  1
    0248:   model #VMAFF4 available
    0248:   model #AK47 available
    004D: jump_if_false £Load_models1
    
    009A: @1 = create_actor  24 #VMAFF4 at  2486.5  -1664.5  13.45
    0173: set_actor @1 z_angle_to  180.0
    01B2: give_actor @1 weapon  30 ammo  99999  ;; Load the weapon model before using this
    02E2: set_actor @1 weapon_accuracy_to  100
    0223: set_actor @1 health_to  1000
    05E2: AS_actor @1 kill_actor $PLAYER_ACTOR
    0249: release_model #VMAFF4
    
    :Loop_1
    0001: wait  0 ms
    00D6: if  0
    8118:   NOT   actor @1 dead
    004D: jump_if_false £TestMission_passed_1
    00D6: if  0
    0104:   actor $PLAYER_ACTOR near_actor @1 radius  80.0  80.0  10.0 sphere  0
    004D: jump_if_false £TestMission_fail_1
    0002: jump £Loop_1
    
    :TestMission_passed_1
    00BA: text_styled 'M_PASSD'  5000 ms  1
    0110: clear_player $PLAYER_CHAR wanted_level
    0109: player $PLAYER_CHAR money +=  5000
    0394: play_music  1
    0051: return
    
    :TestMission_fail_1
    00BA: text_styled 'M_FAIL'  5000 ms  1  ;; MISSION FAILED!
    0051: return
    
    :TestMission_clep_1
    01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
    0004: $ON_MISSION = 0  ;; integer values
    00D8: mission_cleanup
    0051: return


  25. In Missions-Scripten werden Lokale Sprunganweisungen benutzt (£)

  26. Im Anfang des Missions-Scripts wird in 3 subscripte verzweigt
  27. :TestMission_1
    03A4: name_thread "TMISS"  
    0050: gosub £TestMission_main_1 
    00D6: if  0
    0112:   wasted_or_busted
    004D: jump_if_false £TestMission_end_1
    0050: gosub £TestMission_fail_1                    
    
    :TestMission_end_1
    0050: gosub £TestMission_clep_1
    004E: end_thread
    
    :TestMission_main_1
    0317: increment_mission_attempts;;here starts the missionscript
    0004: $on_mission =  1
  28. Als 1. in den Hauptabschnitt der Mission
  29. 0050: gosub £TestMission_main_1
    :TestMission_main_1
    0317: increment_mission_attempts;;here starts the missionscript
    0004: $on_mission =  1
  30. Mit increment_mission_attempts und $on_mission = 1,
    wird das Spiel in den speziellen Missions-Modus versetzt
    Ab jetzt überwacht die EXE, ob der Player getötet oder verhaftet wird.
    Ist dies der Fall, wird das Subscript "TestMission_main_1" beendet,
    Im Mission-Script braucht man deshalb auch keinen "if-player-defined-check"
  31. Als 2. kommt nun die Abrage "if wasted_or_busted" zur Geltung
  32. 00D6: if  0
    0112:   wasted_or_busted
    004D: jump_if_false £TestMission_end_1
    0050: gosub £TestMission_fail_1
  33. Wenn das Haupt-subscript der Mission "TestMission_main_1" beendet wurde,
    weil der Player getötet oder verhaftet wurde,
    wird die Abfrage mit Ja gewertet und gosub £TestMission_fail_1 verweist
    zum Mission-fail-Abschnitt, welcher dann mit dem "return"-code endet
  34. Wenn das Haupt-subscript der Mission "TestMission_main_1" beendet wurde,
    weil der Player das Missions-Ziel erreicht hat,
    wird die Abfrage mit Nein gewertet und überspringt den gosub £TestMission_fail_1
  35. In beiden Fällen wird zur 3.gosub-Anweisung verwiesen
  36. Als 3. in den Mission-Cleanup-Abschnitt
  37. 0050: gosub £TestMission_clep_1
  38. Als Abschluss wird ins Mission-Cleanup-Subscript verwiesen
    und der Missions-Thread wird mit end_thread beendet

  39. Ein Anfang braucht auch ein Ende
  40. :TestMission_passed_1
    00BA: text_styled 'M_PASSD'  5000 ms  1
    0110: clear_player $PLAYER_CHAR wanted_level
    0109: player $PLAYER_CHAR money +=  5000
    0394: play_music  1
    0051: return
    
    :TestMission_fail_1
    00BA: text_styled 'M_FAIL'  5000 ms  1  ;; MISSION FAILED!
    0051: return
    
    :TestMission_clep_1
    01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
    0004: $ON_MISSION = 0  ;; integer values
    00D8: mission_cleanup
    0051: return
  41. Die Subscripte für die gosub-Anweisungen aus dem Anfang bestehen in erster Linie aus:
  42. 1.Der Mission-fail-Abschnitt
    Er beinhaltet in der Regel die Meldung "Mission nicht bestanden"
    und endet mit dem return-code
  43. 2.Der Mission-Cleanup-Abschnitt
    Hier werden die Modelle und alles andere, was in der Misssion Kreiert wurde, aufgelöst.
    Und am Ende der 00D8: mission_cleanup-code, der aufräumen soll, wenn was vergessen wurde aufzulösen,
    was aber nicht zuverlässig funktioniert.
    Auf jedenfall bewirkt der mission_cleanup-code,
    daß die Kamera wieder zur Voreinstellung zurückkehrt,
    daß die Verkehrs- und Fußgänger-Frequenz wieder zur Voreinstellung zurückkehrt
    und daß das automatische Wetterwechsel-System wieder eingeschaltet wird
  44. Und ganz zu Schluss wird mit $ON_MISSION = 0 wieder in den Normalzustand geschaltet
    bevor der Abschnitt mit dem return-code endet
  45. Der Mission-passed-Abschnitt ist nicht zwingend nötig
    Man kann im Hauptabschnitt der Mission auch in den Mission-fail-Abschnitt springen,
    um die Mission zu beenden, nachdem die Aufgabe gelöst wurde
  46. Allerdings möchte man in der klassischen Mission unterscheiden,
    ob die Mission bestanden wurde oder nicht.
    Zu diesem Zweck fügt man noch ein 3.Subscript hinzu,
    indem Bonus-codes zur Belohnung gesetzt werden und die Textmeldung "Mission bestanden"
    Der Mission-passed-Abschnitt endet dann auch mit dem return-code

  47. Der Hauptabschnitt der Mission beinhaltet ein oder mehrere Loops mit Abfragen
    zur Überprüfung, ob die Aufgabe erfüllt wurde oder ob was falsch gemacht wurde
  48. :Loop_1
    0001: wait  0 ms
    00D6: if  0
    8118:   NOT   actor @1 dead
    004D: jump_if_false £TestMission_passed_1
    00D6: if  0
    0104:   actor $PLAYER_ACTOR near_actor @1 radius  80.0  80.0  10.0 sphere  0
    004D: jump_if_false £TestMission_fail_1
    0002: jump £Loop_1
  49. In diesem Beispiel wird zum Mission-passed-Abschnitt verwiesen,
    wenn der Gegner erledigt wurde
    und in den Mission-fail-Abschnitt, wenn der Player flieht und weiter als 80 Meter vom Gegner entfernt ist
  50. Dieser Loop liese sich auch minimieren:
  51. :Loop_1
    0001: wait  250 ms
    0002: jump £Loop_1
  52. Dann wird die Mission erst beendet, wenn der Player stirbt oder verhaftet wird. Denn dafür sorgt ja die EXE
nothing

So erstellt man ein Extern-Script

  1. Extern_Scripte müssen im Fourth_Segment, Aufstellung der EXTERNAL_SCRIPTS definiert werden,
  2. :Fourth_Segment
    0002: jump ££Fifth_Segment
    DEFINE EXTERNAL_SCRIPTS  2
    DEFINE EXTERNAL_SCRIPT_NAME PLAYER_PARACHUTE  ;  0  player using parachute
    DEFINE EXTERNAL_SCRIPT_NAME Extern_Action  ;  1  Test_Extern_Script
  3. die Gesamtzahl ist in der ersten Zeile anzugeben(EXTERNAL_SCRIPTS 2)
  4. Definiert wird das Extern_Script durch seinem Namen und seiner Nummer, Der Name wird im EXTERNAL_SCRIPT zur Idendifikation in der DEFINE EXTERNAL_SCRIPT_START-code-Zeile eingetragen
  5. DEFINE EXTERNAL_SCRIPT_START Extern_Action

  6. Extern-Scripte kommen in den Extern-Script-Part des 7. Segments

  7. Und dann, wird im Main-Thread
  8. die Einbindung des Extern-Scripts in die Main.scm angegeben
    0914: init_external_script  0 (PLAYER_PARACHUTE) 
    0914: init_external_script  1 (Extern_Action)


  9. Zum Starten des Extern-Scripts erstellen wir einen Thread, der im Main Part platziert wird.
  10. Das Extern-Script wird ähnlich wie Modelle oder Animationen, erst geladen und
    in einem "load-check" überprüft, ob es geladen ist.
  11. 08A9: load_external_script  1 (Extern_Action)
    00D6: if  0
    08AB:   external_script  1 (Extern_Action) loaded
    004D: jump_if_false ££Extern_Script_Starter_6
  12. Sobald das Extern-Script verfügbar ist, wird es mit run_external_script gestartet
  13. 0913: run_external_script  1 (Extern_Action)
  14. In den Starter-Thread muss eine Abfrage eingefügt werden, die verhindert,
    daß das Extern-Script mehrmals gestartet wird, ähnlich wie die "if $ON_MISSION == 0"-Abfrage
  15. 00D6: if  0
    0038:   $TEXS1 ==  0  ;; integer values
    004D: jump_if_false ££Extern_Script_Starter_2
  16. Dazu wird im Extern-Script selbst, gleich zu Beginn die Abfrage-Kennung umgeschaltet
    und am Ende wieder freigeschaltet
  17. :Extern_Script_Starter_1;;;-----------------MB0.33/sascm.ini vom 1.Sep.2005
    03A4: name_thread 'EXSS'
    
    :Extern_Script_Starter_2
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££Extern_Script_Starter_2
    00D6: if  0
    0038:   $TEXS1 ==  0  ;; integer values
    004D: jump_if_false ££Extern_Script_Starter_2
    00D6: if  0
    00FF:   actor $PLAYER_ACTOR  1 (in-sphere)near_point_on_foot 2503.5  -1673.5  13.35 radius  2.0  2.0  1.0
    004D: jump_if_false ££Extern_Script_Starter_7
    
    :Extern_Script_Starter_5
    0926: $EXTERNAL_SCRIPT_STATUS = external_script_status  1 (Extern_Action) 
    00D6: if  0
    0038:   $EXTERNAL_SCRIPT_STATUS ==  0  ;; integer values
    004D: jump_if_false ££Extern_Script_Starter_6
    08A9: load_external_script  1 (Extern_Action)
    00D6: if  0
    08AB:   external_script  1 (Extern_Action) loaded
    004D: jump_if_false ££Extern_Script_Starter_6
    0913: run_external_script  1 (Extern_Action) 
    
    :Extern_Script_Starter_6
    0002: jump ££Extern_Script_Starter_8
    
    :Extern_Script_Starter_7
    090F: end_external_script  1 (Extern_Action) 
    
    :Extern_Script_Starter_8
    0002: jump ££Extern_Script_Starter_2


  18. In Extern-Scripten werden Lokale Sprunganweisungen benutzt (£)

  19. Das Extern-Script ist Gegensatz zur Mission wieder wie ein normaler Thread aufgebaut
    mit "if-player-defined-check"
    und hat in jedem Fall mit end_thread zu enden
  20. ;-----------------------------------MB0.33/sascm.ini vom 1.Sep.2005
    DEFINE EXTERNAL_SCRIPT_START Extern_Action
    ; Originally: Test_Extern_Script
    
    03A4: name_thread "TEXS"  
    0004: $TEXS1 =  1
    0247: request_model #BALLAS1
    0247: request_model #AK47
    0247: request_model #TRIBOSS
    
    :Load_Extern_models
    0001: wait  0 ms
    00D6: if  2
    0248:   model #BALLAS1 available
    0248:   model #TRIBOSS available
    0248:   model #AK47 available
    004D: jump_if_false £Load_Extern_models
    
    009A: @1 = create_actor  7 #BALLAS1 at  2506.5  -1664.5  13.45
    0173: set_actor @1 z_angle_to  180.0
    01B2: give_actor @1 weapon  30 ammo  99999  ;; Load the weapon model before using this
    02E2: set_actor @1 weapon_accuracy_to  100
    0223: set_actor @1 health_to  3000
    05E2: AS_actor @1 kill_actor $PLAYER_ACTOR
    
    0632: release_group $PLAYER_GROUP
    009A: @2 = create_actor  8 #TRIBOSS at  2506.5  -1674.5  13.45
    0173: set_actor @2 z_angle_to  180.0
    01B2: give_actor @2 weapon  30 ammo  99999  ;; Load the weapon model before using this
    02E2: set_actor @2 weapon_accuracy_to  100
    0223: set_actor @2 health_to  5000
    0631: put_actor @2 in_group $PLAYER_GROUP
    07CB: @2  0
    
    0249: release_model #BALLAS1
    0249: release_model #TRIBOSS
    0249: release_model #AK47
    
    :Extern_Loop_1
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false £Test_Extern_Script_End
    00D6: if  0
    8118:   NOT   actor @1 dead
    004D: jump_if_false £Test_Extern_Script_End
    00D6: if  0
    0104:   actor $PLAYER_ACTOR near_actor @1 radius  80.0  80.0  10.0 sphere  0
    004D: jump_if_false £Test_Extern_Script_End
    0002: jump £Extern_Loop_1
    
    :Test_Extern_Script_End
    01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
    01C2: remove_references_to_actor @2 ;; Like turning an actor into a random pedestrian
    0004: $TEXS1 = 0  ;; integer values
    004E: end_thread
  21. Zu Beginn des Extern-Scripts wird die Abfrage-Kennung auf 1 gestellt
    und am Ende wieder auf 0, und als Abschluss, end_thread.
  22. Der Kompiliervorgang erzeugt zur Main.scm zusätzlich die Script.img
    Um die Script.img ins Spielverzeichnis zu kopieren und somit das Extern-Script zu aktualisieren
    muss GTA_SA beendet werden

  23. Zum Starten eines Extern-Scripts gibts noch andere Möglichkeiten
    Z.B.die Initialisierung über ein Objekt
  24. 0929: init_external_script_with_object_trigger  8 (VENDING_MACHINE) object #CJ_SPRUNK1 priority  100  6.0 -1
  25. Dieses Objekt muss per IPL-Datei ins Spiel eingesetzt werden
    und in der object.dat aufgelistet sein.
    Der Parameter, im Beispiel 6.0 gibt den Aktionsbereich an
    Im Extern-Script selbst können dann Modelle in Relation zum aktivem Objekt eingesetzt werden
nothing

Zusammenfassung

  1. Als Zusammenfassung, die erarbeitete Stripped Main
  2. mit integrierter Mission und Extern-Script:
  3. Das Starter-Script fürs Fallscirm-Extern-Script befindet sich im Main-Thread
  4. DEFINE VERSION SA 0.33;;;-----------------MB0.33/sascm.ini vom 1.Sep.2005
    
    0002: jump ££Second_Segment
    DEFINE MEMORY 33200 ; Equals Mission Builder type global variable range $2 to $8000
    
    :Second_Segment              
    0002: jump ££Third_Segment
    DEFINE OBJECTS  10           
    DEFINE OBJECT (unbenutzt)                 ; This is an unused object. You can put anything here.
    DEFINE OBJECT INFO                        ; Object number -1
    DEFINE OBJECT KEYCARD                     ; Object number -2
    DEFINE OBJECT PICKUPSAVE                  ; Object number -3
    DEFINE OBJECT BODYARMOUR                  ; Object number -4
    DEFINE OBJECT BRIBE                       ; Object number -5
    DEFINE OBJECT KMB_PARACHUTE               ; Object number -6
    DEFINE OBJECT PARA_PACK                   ; Object number -7
    DEFINE OBJECT PARACHUTE                   ; Object number -8
    DEFINE OBJECT PARA_COLLISION              ; Object number -9
    
    :Third_Segment
    0002: jump ££Fourth_Segment
    DEFINE MISSIONS  2
    DEFINE MISSION 0 AT ££INITIAL_1   ; originally: Initial 1
    DEFINE MISSION 1 AT ££TestMission_1   ; originally: TestMission
    
    :Fourth_Segment
    0002: jump ££Fifth_Segment
    DEFINE EXTERNAL_SCRIPTS  2
    DEFINE EXTERNAL_SCRIPT_NAME PLAYER_PARACHUTE  ;  0  player using parachute
    DEFINE EXTERNAL_SCRIPT_NAME Extern_Action  ;  1  Test_Extern_Script
    
    :Fifth_Segment
    0002: jump ££Sixth_Segment
    DEFINE UNKNOWN_FIFTH_SEGMENT
    DEFINE UNKNOWN1  0
    
    :Sixth_Segment
    0002: jump ££MAIN_1
    DEFINE UNKNOWN_SIXTH_SEGMENT
    DEFINE UNKNOWN3  0
    
    ;-------------MAIN---------------
    
    
    :MAIN_1
    03A4: name_thread 'MAIN'
    016A: fade  0 ()  0 ms
    042C: set_total_missions_to  0
    030D: set_total_mission_points_to  0
    01F0: set_max_wanted_level_to  6
    0111: set_wasted_busted_check_to  0 (disabled)
    00C0: set_current_time  10  0
    
    04E4: unknown_refresh_game_renderer_at  2494.5 -1668.5
    03CB: set_camera  2494.5 -1668.5 13.4
    0053: $PLAYER_CHAR = create_player #NULL at  2494.5 -1668.5 13.4
    07AF: $PLAYER_GROUP = player $PLAYER_CHAR group
    01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
    0173: set_actor $PLAYER_ACTOR z_angle_to  180.0
    0373: set_camera_directly_behind_player
    
    0629: change_stat  181 (islands unlocked) to  4  ; integer see statdisp.dat
    0998: add_respect 1000
    062A: change_stat 165 (energy) to 800.0 ; float
    062A: change_stat 23 (muscle) to 800.0 ; float
    062A: change_stat 21 (fat) to 200.0 ; float
    062A: change_stat 160 (driving skill) to 1000.0 ; float
    062A: change_stat 223 (pilot skill) to 1000.0 ; float
    062A: change_stat 229 (bike skill) to 1000.0 ; float
    062A: change_stat 230 (cycling skill) to 1000.0 ; float
    0629: change_stat 225 (lung capasity) to 1000 ; integer see statdisp.dat
    0629: change_stat 22 (stamina) to 1000 ; integer see statdisp.dat
    0629: change_stat 156 (dance skill) to 1000 ; integer see statdisp.dat
    062A: change_stat 81 (gambling skill) to 1000.0 ; integer see statdisp.dat
    0629: change_stat 64 (respect) to 1000 ; integer see statdisp.dat
    0629: change_stat 65 () to 1000 ; integer see statdisp.dat
    062A: change_stat 69 (Weap skill: pistol) to 1000.0 ; float
    062A: change_stat 70 (Weap skill: silence) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 71 (Weap skill: desert ) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 72 (Weap skill: shotgun) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 73 (Weap skill: sawn of) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 74 (Weap skill: combat ) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 75 (Weap skill: machine) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 76 (Weap skill: smg) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 77 (Weap skill: ak-47) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 78 (Weap skill: m4) to 1000.0 ; integer see statdisp.dat
    062A: change_stat 79 (Weap skill: rifle) to 1000.0 ; integer see statdisp.dat
    0629: change_stat 181 (islands unlocked) to 4 ; integer see statdisp.dat
    0A1F: 24 500.0;Healthskill
    055E: set_player $PLAYER_CHAR max_health += 150
    055F: set_player $PLAYER_CHAR max_armour += 150
    0223: set_actor $PLAYER_ACTOR health_to 250
    035F: set_actor $PLAYER_ACTOR armour_to 250
    
    0330: set_player $PLAYER_CHAR infinite_run_to 1 (true)
    07FE: set_actor $PLAYER_ACTOR fighting_style_to 6 6
    0572: set_taxi_boost_jump 1
    
    087B: set_player $PLAYER_CHAR clothes "bballjackrstar" "bbjack"  0
    087B: set_player $PLAYER_CHAR clothes "JEANSDENIM" "JEANS"  2
    087B: set_player $PLAYER_CHAR clothes "SNEAKERBINCBLK" "SNEAKER"  3
    087B: set_player $PLAYER_CHAR clothes "PLAYER_FACE" "HEAD"  1
    070D: $PLAYER_CHAR
    0109: player $PLAYER_CHAR money += 500000
    08DE:  0 ; (Keep stuff after busted)(0=on/1=off)
    08DD:  0 ; (Keep stuff after wasted)(0=on/1=off)
    0180: set_on_mission_flag_to $ON_MISSION
    02FA: garage 'BODLAWN' change_to_type  38
    02FA: garage 'MODLAST' change_to_type  36
    02FA: garage 'MDSSFSE' change_to_type  38
    02FA: garage 'MDS1SFS' change_to_type  37
    02FA: garage 'VECMOD' change_to_type  38
    02FA: garage 'MICHDR' change_to_type  5
    02FA: garage 'HBGDSFS' change_to_type  19
    0237: gang_weapons  1  30  32  24
    0004: $1903 =  1  ;; integer values--Basketball
    0005: $1500 =  5.0  ;; floating-point values
    0005: $1501 = -5.0  ;; floating-point values
    0005: $1503 = -1.5  ;; floating-point values
    0005: $1504 = -30.0  ;; floating-point values
    0005: $1505 =  32.0  ;; floating-point values
    0005: $1506 =  0.0  ;; floating-point values
    0004: $1512 =  0  ;; integer values
    0004: $1513 =  0  ;; integer values
    0004: $1497 =  0  ;; integer values
    
    0914: init_external_script  0 (PLAYER_PARACHUTE) 
    0914: init_external_script  1 (Extern_Action)
    
    
    01B6: set_weather  1
    04BB: select_interior  0  ;; select render area
    01B4: set_player $PLAYER_CHAR frozen_state  1 (unfrozen)
    01B7: release_weather
    016C: restart_if_wasted at  2494.5 -1668.5 13.4 angle  180.0 unknown  0
    016D: restart_if_busted at  2494.5 -1668.5 13.4 angle  180.0 unknown  0
    0417: start_mission  0
    004F: create_thread ££SAVE_1
    004F: create_thread ££MissionStart1
    004F: create_thread ££Extern_Script_Starter_1
    
    
    016A: fade  1 ()  1000 ms
    0001: wait  100 ms
    03E6: remove_text_box
    
    
    :MAIN_3
    0004: $EXTERNAL_SCRIPT_STATUS =  0  ;; integer values
    
    :MAIN_30
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££MAIN_56
    ;077E: $ACTIVE_INTERIOR = active_interior
    
    00D6: if  0
    0491:   actor $PLAYER_ACTOR has_weapon  46 
    004D: jump_if_false ££MAIN_55
    0926: $EXTERNAL_SCRIPT_STATUS = external_script_status  0 (PLAYER_PARACHUTE) 
    00D6: if  0
    0038:   $EXTERNAL_SCRIPT_STATUS ==  0  ;; integer values
    004D: jump_if_false ££MAIN_53
    08A9: load_external_script  0 (PLAYER_PARACHUTE)
    00D6: if  0
    08AB:   external_script  0 (PLAYER_PARACHUTE) loaded
    004D: jump_if_false ££MAIN_53
    0913: run_external_script  0 (PLAYER_PARACHUTE) 
    
    :MAIN_53
    0002: jump ££MAIN_56
    
    :MAIN_55
    090F: end_external_script  0 (PLAYER_PARACHUTE)
    
    :MAIN_56
    0002: jump ££MAIN_30
    
    
    
    
    
    
    
    
    :SAVE_1
    03A4: name_thread 'SAVE'
    0570: $sv02 = create_asset_radar_marker_with_icon 35 at 2496.8 -1700.1 24.39
    018B: show_on_radar $sv02 2
    
    :SAVE_2
    0001: wait 0 ms
    0213: $sv01 = create_pickup #PICKUPSAVE type 3 at 2491.3 -1699.7 1014.75
    
    :SAVE_5
    0001: wait 0 ms
    00D6: if 0
    0256: player $PLAYER_CHAR defined
    004D: jump_if_false ££SAVE_5
    00D6: if 0
    0214: pickup $sv01 picked_up
    004D: jump_if_false ££SAVE_5
    0050: gosub ££SAVE_14
    0002: jump ££SAVE_2 
    
    :SAVE_14
    00D6: if  0
    0038:   $ON_MISSION ==  0  ;; integer values
    004D: jump_if_false ££SAVE_17
    0004: $ON_MISSION =  1  ;; integer values
    01B4: set_player $PLAYER_CHAR frozen_state  0 (frozen)
    0001: wait  350 ms
    03D8: show_SAVE_screen
    
    :SAVE_15
    00D6: if  0
    83D9:   NOT   save_done
    004D: jump_if_false ££SAVE_16
    0001: wait  0 ms
    0002: jump ££SAVE_15
    
    :SAVE_16
    00A1: put_actor $PLAYER_ACTOR at 2493.03 -1701.17 1014.8
    01B4: set_player $PLAYER_CHAR frozen_state  1 (unfrozen)
    0004: $ON_MISSION =  1  ;; integer values
    0001: wait  350 ms
    0004: $ON_MISSION =  0  ;; integer values
    
    :SAVE_17
    0051: return
    
    
    
    
    :MissionStart1
    03A4: name_thread "MST"
    
    
    :MissionStart2
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££MissionStart2
    00D6: if  0
    0038:   $ON_MISSION ==  0  ;; integer values
    004D: jump_if_false ££MissionStart2
    00D6: if  0
    00FF:   actor $PLAYER_ACTOR  1 (in-sphere)near_point_on_foot 2498.5  -1678.5  13.35 radius  2.0  2.0  1.0
    004D: jump_if_false ££MissionStart2
    0004: $ON_MISSION =  1  ;; integer values
    0417: start_mission  1   ; originally: TestMission
    0002: jump ££MissionStart2
    
    
    
    
    :Extern_Script_Starter_1
    03A4: name_thread 'EXSS'
    
    :Extern_Script_Starter_2
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££Extern_Script_Starter_2
    00D6: if  0
    0038:   $TEXS1 ==  0  ;; integer values
    004D: jump_if_false ££Extern_Script_Starter_2
    00D6: if  0
    00FF:   actor $PLAYER_ACTOR  1 (in-sphere)near_point_on_foot 2503.5  -1673.5  13.35 radius  2.0  2.0  1.0
    004D: jump_if_false ££Extern_Script_Starter_7
    
    :Extern_Script_Starter_5
    0926: $EXTERNAL_SCRIPT_STATUS = external_script_status  1 (Extern_Action) 
    00D6: if  0
    0038:   $EXTERNAL_SCRIPT_STATUS ==  0  ;; integer values
    004D: jump_if_false ££Extern_Script_Starter_6
    08A9: load_external_script  1 (Extern_Action)
    00D6: if  0
    08AB:   external_script  1 (Extern_Action) loaded
    004D: jump_if_false ££Extern_Script_Starter_6
    0913: run_external_script  1 (Extern_Action) 
    
    :Extern_Script_Starter_6
    0002: jump ££Extern_Script_Starter_8
    
    :Extern_Script_Starter_7
    090F: end_external_script  1 (Extern_Action) 
    
    :Extern_Script_Starter_8
    0002: jump ££Extern_Script_Starter_2
    
    
    
    ;-------------Mission 0---------------
    ; Originally: Initial 1
    
    :INITIAL_1
    03A4: name_thread 'INITIAL'
    
    014B: $MR1 = init_parked_car_generator #PCJ600 0 17 1 alarm 0 door_lock 0 0 10000 at 2490.0 -1682.0 13.5 angle 90.0
    014C: set_parked_car_generator $MR1 cars_to_generate_to 101
    032B: $WP1 = create_weapon_pickup #AK47 15 ammo 3000 at 2490.0 -1662.0 13.5
    032B: $WP2 = create_weapon_pickup #JETPACK 15 ammo 0 at 2492.0 -1662.0 13.5
    0213: $OP1 = create_pickup #BODYARMOUR type 15 at 2494.0 -1662.0 13.5
    0213: $OP2 = create_pickup #GUN_PARA type 15 at 2496.0 -1662.0 13.5
    0213: $OP3 = create_pickup #BRIBE type 15 at 2498.0 -1662.0 13.5
    
    004E: end_thread
    
    
    
    
    ;-------------Mission 1---------------
    ; Originally: TestMission
    
    
    :TestMission_1
    03A4: name_thread "TMISS"  
    0050: gosub £TestMission_main_1 
    00D6: if  0
    0112:   wasted_or_busted
    004D: jump_if_false £TestMission_end_1
    0050: gosub £TestMission_fail_1                    
    
    :TestMission_end_1
    0050: gosub £TestMission_clep_1
    004E: end_thread
    
    :TestMission_main_1
    0317: increment_mission_attempts;;here starts the missionscript
    0004: $on_mission =  1
    
    0247: request_model #VMAFF4
    0247: request_model #AK47
    
    :Load_models1
    0001: wait  0 ms
    00D6: if  1
    0248:   model #VMAFF4 available
    0248:   model #AK47 available
    004D: jump_if_false £Load_models1
    
    009A: @1 = create_actor  24 #VMAFF4 at  2486.5  -1664.5  13.45
    0173: set_actor @1 z_angle_to  180.0
    01B2: give_actor @1 weapon  30 ammo  99999  ;; Load the weapon model before using this
    02E2: set_actor @1 weapon_accuracy_to  100
    0223: set_actor @1 health_to  1000
    05E2: AS_actor @1 kill_actor $PLAYER_ACTOR
    0249: release_model #VMAFF4
    
    :Loop_1
    0001: wait  0 ms
    00D6: if  0
    8118:   NOT   actor @1 dead
    004D: jump_if_false £TestMission_passed_1
    00D6: if  0
    0104:   actor $PLAYER_ACTOR near_actor @1 radius  80.0  80.0  10.0 sphere  0
    004D: jump_if_false £TestMission_fail_1
    0002: jump £Loop_1
    
    :TestMission_passed_1
    00BA: text_styled 'M_PASSD'  5000 ms  1
    0110: clear_player $PLAYER_CHAR wanted_level
    0109: player $PLAYER_CHAR money +=  5000
    0394: play_music  1
    0051: return
    
    :TestMission_fail_1
    00BA: text_styled 'M_FAIL'  5000 ms  1  ;; MISSION FAILED!
    0051: return
    
    :TestMission_clep_1
    01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
    0004: $ON_MISSION = 0  ;; integer values
    00D8: mission_cleanup
    0051: return
    
    
    
    
    
    
    
    
    
    
    
    
    ;-----------------------------------------------------
    DEFINE EXTERNAL_SCRIPT_START PLAYER_PARACHUTE
    
    03A4: name_thread 'PLCHUTE'
    0247: request_model #GUN_PARA
    
    :PLCHUTE_3
    00D6: if  0
    8248:   NOT   model #GUN_PARA available
    004D: jump_if_false £PLCHUTE_8
    0001: wait  0 ms
    0002: jump £PLCHUTE_3
    
    :PLCHUTE_8
    00D6: if  0
    8118:   NOT   actor $PLAYER_ACTOR dead
    004D: jump_if_false £PLCHUTE_11
    
    :PLCHUTE_11
    0004: $1498 =  0  ;; integer values
    0004: $1513 =  0  ;; integer values
    0004: $1497 =  0  ;; integer values
    00D6: if  0
    0038:   $1498 ==  999  ;; integer values
    004D: jump_if_false £PLCHUTE_18
    0213: $8269 = create_pickup #GUN_PARA type  3 at $69 $70 $71
    
    :PLCHUTE_18
    0001: wait  0 ms
    00D6: if  0
    8118:   NOT   actor $PLAYER_ACTOR dead
    004D: jump_if_false £PLCHUTE_606
    00D6: if  0
    8800:   NOT (unknown)
    004D: jump_if_false £PLCHUTE_606
    00D6: if  0
    8038:   NOT   $1513 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_29
    0992: $PLAYER_CHAR  0 
    
    :PLCHUTE_29
    00D6: if  0
    0018:   $1497 >  0  ;; integer values
    004D: jump_if_false £PLCHUTE_36
    00D6: if  0
    8491:   NOT   actor $PLAYER_ACTOR has_weapon  46 
    004D: jump_if_false £PLCHUTE_36
    0050: gosub £PLCHUTE_614
    
    :PLCHUTE_36
    00D6: if  0
    0038:   $1497 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_45
    00D6: if  0
    0491:   actor $PLAYER_ACTOR has_weapon  46 
    004D: jump_if_false £PLCHUTE_45
    0247: request_model #PARACHUTE
    0004: $1497 =  1  ;; integer values
    0004: $1498 =  0  ;; integer values
    
    :PLCHUTE_45
    00D6: if  0
    0038:   $1497 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_55
    00D6: if  0
    0248:   model #PARACHUTE available
    004D: jump_if_false £PLCHUTE_55
    0107: @17 = create_object #PARACHUTE at $69 $70 $71
    069B: attach_object @17 to_actor $PLAYER_ACTOR at_offset  0.0  0.0  0.0 rotation  0.0  0.0  0.0 
    0750: @17  0 
    0004: $1497 =  2  ;; integer values
    
    :PLCHUTE_55
    00D6: if  1
    0038:   $1497 ==  2  ;; integer values
    0038:   $1513 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_60
    0004: $1497 =  3  ;; integer values
    
    :PLCHUTE_60
    00D6: if  1
    0038:   $1513 ==  0  ;; integer values
    0018:   $1497 >  0  ;; integer values
    004D: jump_if_false £PLCHUTE_80
    00D6: if  0
    0818: $PLAYER_ACTOR 
    004D: jump_if_false £PLCHUTE_80
    083D: $PLAYER_ACTOR $1507 $1508 $1509 
    00D6: if  0
    0022:   -10.0 > $1509  ;; floating-point values
    004D: jump_if_false £PLCHUTE_80
    0819: @7 = actor $PLAYER_ACTOR distance_from_ground
    00D6: if  0
    0021:   @7 >  20.0  ;; floating-point values
    004D: jump_if_false £PLCHUTE_80
    097A: -1000.0 -1000.0 -1000.0  1037 
    0004: $1513 =  1  ;; integer values
    01B9: set_actor $PLAYER_ACTOR armed_weapon_to  46
    0006: @0 =  0  ;; integer values
    0005: $8268 =  0.0  ;; floating-point values
    
    :PLCHUTE_80
    00D6: if  0
    0038:   $1513 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_280
    00D6: if  0
    0039:   @0 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_87
    0006: @0 =  2  ;; integer values
    
    :PLCHUTE_87
    00D6: if  0
    0039:   @0 ==  2  ;; integer values
    004D: jump_if_false £PLCHUTE_99
    062E: $PLAYER_ACTOR  2066 @27 
    00D6: if  0
    04A4: @27  7 
    004D: jump_if_false £PLCHUTE_99
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE" "PED"  1.0  1  0  0  0 -1 
    04ED: load_animation "PARACHUTE"
    0006: @15 =  1  ;; integer values
    0172: @1 = actor $PLAYER_ACTOR z_angle
    0006: @0 =  3  ;; integer values
    
    :PLCHUTE_99
    00D6: if  0
    0039:   @0 ==  3  ;; integer values
    004D: jump_if_false £PLCHUTE_280
    062E: $PLAYER_ACTOR  2066 @27 
    00D6: if  0
    04A4: @27  7 
    004D: jump_if_false £PLCHUTE_107
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE" "PED"  1.0  1  0  0  0 -1 
    
    :PLCHUTE_107
    0819: @7 = actor $PLAYER_ACTOR distance_from_ground
    00D6: if  1
    0023:    100.0 > @7  ;; floating-point values
    0021:   @7 >  60.0  ;; floating-point values
    004D: jump_if_false £PLCHUTE_119
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_119
    00D6: if  0
    0038:   $ON_MISSION ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_119
    00BC: text_highpriority 'PARA_01'  1000 ms  1
    
    :PLCHUTE_119
    0494: get_joystick_data  0 @10 @11 @12 @12
    00D6: if  0
    0038:   $1511 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_125
    0006: @10 =  0  ;; integer values
    0006: @11 =  0  ;; integer values
    
    :PLCHUTE_125
    0093: @21 = integer_to_float @10  
    0017: @21 /=  4.267  ;; floating-point values 
    0063: @21 -= @2  ;; floating-point values 
    0017: @21 /=  20.0  ;; floating-point values 
    005B: @2 += @21  ;; floating-point values 
    0087: @21 = @2  ;; floating-point values only
    0017: @21 /=  5.0  ;; floating-point values 
    0063: @1 -= @21  ;; floating-point values 
    00D6: if  0
    0021:   @1 >  180.0  ;; floating-point values
    004D: jump_if_false £PLCHUTE_137
    000F: @1 -=  360.0  ;; floating-point values
    
    :PLCHUTE_137
    00D6: if  0
    0023:   -180.0 > @1  ;; floating-point values
    004D: jump_if_false £PLCHUTE_141
    000B: @1 +=  360.0  ;; floating-point values
    
    :PLCHUTE_141
    0093: @22 = integer_to_float @11  
    0017: @22 /=  4.267  ;; floating-point values 
    0063: @22 -= @3  ;; floating-point values 
    0017: @22 /=  20.0  ;; floating-point values 
    005B: @3 += @22  ;; floating-point values 
    083D: $PLAYER_ACTOR @8 @9 $1509 
    00D6: if  0
    0024:   $1504 > $1509  ;; floating-point values only
    004D: jump_if_false £PLCHUTE_151
    0086: $1509 = $1504  ;; floating-point values only
    
    :PLCHUTE_151
    00D6: if  0
    0024:   $8268 > $1509  ;; floating-point values only
    004D: jump_if_false £PLCHUTE_155
    0086: $8268 = $1509  ;; floating-point values only
    
    :PLCHUTE_155
    00D6: if  0
    0024:   $1504 > $8268  ;; floating-point values only
    004D: jump_if_false £PLCHUTE_159
    0086: $8268 = $1504  ;; floating-point values only
    
    :PLCHUTE_159
    00D6: if  1
    0024:   $1509 > $8268  ;; floating-point values only
    8038:   NOT   $1902 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_176
    00D6: if  0
    84AD:   NOT   actor $PLAYER_ACTOR touching_water
    004D: jump_if_false £PLCHUTE_174
    00D6: if  0
    0022:   -20.0 > $8268  ;; floating-point values
    004D: jump_if_false £PLCHUTE_171
    0004: $1513 =  2  ;; integer values
    0002: jump £PLCHUTE_173
    
    :PLCHUTE_171
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE" "PED"  1.0  1  0  0  0  100 
    0004: $1513 =  7  ;; integer values
    
    :PLCHUTE_173
    0002: jump £PLCHUTE_176
    
    :PLCHUTE_174
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE" "PED"  1.0  1  0  0  0  100 
    0004: $1513 =  7  ;; integer values
    
    :PLCHUTE_176
    0087: @4 = @3  ;; floating-point values only
    0017: @4 /=  30.0  ;; floating-point values 
    006F: @4 *= $1505  ;; floating-point values
    02F6: $1507 = cosine @1  ;; sinus swapped with cosine
    02F7: $1508 = sinus @1 ;; cosine swapped with sinus
    006D: $1507 *= @4  ;; floating-point values
    006D: $1508 *= @4  ;; floating-point values
    0011: $1508 *= -1.0  ;; floating-point values
    0059: $1508 += $1506  ;; floating-point values
    0087: @21 = @8  ;; floating-point values only
    0065: @21 -= $1507  ;; floating-point values 
    0013: @21 *=  .01  ;; floating-point values 
    0088: $1507 = @8  ;; floating-point values only
    0067: $1507 -= @21  ;; floating-point values
    0087: @21 = @9  ;; floating-point values only
    0065: @21 -= $1508  ;; floating-point values 
    0013: @21 *=  .01  ;; floating-point values 
    0088: $1508 = @9  ;; floating-point values only
    0067: $1508 -= @21  ;; floating-point values
    0085: @12 = @10  ;; integer values and handles
    0085: @13 = @11  ;; integer values and handles
    0095: make @12 absolute_integer  
    0095: make @13 absolute_integer  
    00D6: if  21
    0019:   @12 >  40  ;; integer values
    0019:   @13 >  40  ;; integer values
    004D: jump_if_false £PLCHUTE_252
    00D6: if  0
    001D:   @12 > @13  ;; integer values  
    004D: jump_if_false £PLCHUTE_229
    00D6: if  0
    0029:   @10 >=  0  ;; integer values
    004D: jump_if_false £PLCHUTE_217
    00D6: if  0
    8039:   NOT   @15 ==  2  ;; integer values
    004D: jump_if_false £PLCHUTE_217
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_216
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE_R" "PARACHUTE"  1.0  1  0  0  1 -2 
    
    :PLCHUTE_216
    0006: @15 =  2  ;; integer values
    
    :PLCHUTE_217
    00D6: if  0
    001B:    0 > @10  ;; integer values
    004D: jump_if_false £PLCHUTE_228
    00D6: if  0
    8039:   NOT   @15 ==  3  ;; integer values
    004D: jump_if_false £PLCHUTE_228
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_227
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE_L" "PARACHUTE"  1.0  1  0  0  1 -2 
    
    :PLCHUTE_227
    0006: @15 =  3  ;; integer values
    
    :PLCHUTE_228
    0002: jump £PLCHUTE_251
    
    :PLCHUTE_229
    00D6: if  0
    0029:   @11 >=  0  ;; integer values
    004D: jump_if_false £PLCHUTE_240
    00D6: if  0
    8039:   NOT   @15 ==  4  ;; integer values
    004D: jump_if_false £PLCHUTE_240
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_239
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE" "PARACHUTE"  1.0  1  0  0  1 -2 
    
    :PLCHUTE_239
    0006: @15 =  4  ;; integer values
    
    :PLCHUTE_240
    00D6: if  0
    001B:    0 > @11  ;; integer values
    004D: jump_if_false £PLCHUTE_251
    00D6: if  0
    8039:   NOT   @15 ==  5  ;; integer values
    004D: jump_if_false £PLCHUTE_251
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_250
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE_ACCEL" "PARACHUTE"  1.0  1  0  0  1 -2 
    
    :PLCHUTE_250
    0006: @15 =  5  ;; integer values
    
    :PLCHUTE_251
    0002: jump £PLCHUTE_260
    
    :PLCHUTE_252
    00D6: if  0
    8039:   NOT   @15 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_260
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_260
    0812: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE" "PARACHUTE"  1.0  1  0  0  1 -2 
    0006: @15 =  1  ;; integer values
    
    :PLCHUTE_260
    00D6: if  21
    00E1:   key_pressed  0  17
    0038:   $1512 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_280
    00D6: if  0
    8038:   NOT   $1902 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_280
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_280
    00D6: if  1
    0038:   $1497 ==  3  ;; integer values
    0038:   $1511 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_280
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_OPEN" "PARACHUTE"  8.0  0  0  0  1 -2 
    097A: -1000.0 -1000.0 -1000.0  1038 
    008A: $8270 = @32  ;; integer values and handles
    0008: $8270 +=  1100  ;; integer values
    0004: $1513 =  3  ;; integer values
    0006: @0 =  0  ;; integer values
    
    :PLCHUTE_280
    00D6: if  0
    0038:   $1513 ==  2  ;; integer values
    004D: jump_if_false £PLCHUTE_292
    00D6: if  0
    04EE:   animation "PARACHUTE" loaded
    004D: jump_if_false £PLCHUTE_290
    0173: set_actor $PLAYER_ACTOR z_angle_to @1
    0829: unknown_action_sequence $PLAYER_ACTOR "FALL_SKYDIVE_DIE" "PARACHUTE"  1000.0  0 
    09F1: $PLAYER_ACTOR  1189 
    0002: jump £PLCHUTE_291
    
    :PLCHUTE_290
    05BE: AS_kill_actor $PLAYER_ACTOR 
    
    :PLCHUTE_291
    0050: gosub £PLCHUTE_614
    
    :PLCHUTE_292
    00D6: if  0
    0038:   $1513 ==  3  ;; integer values
    004D: jump_if_false £PLCHUTE_534
    00D6: if  0
    0018:   $8270 >  0  ;; integer values
    004D: jump_if_false £PLCHUTE_303
    00D6: if  0
    001F:   @32 > $8270  ;; integer values
    004D: jump_if_false £PLCHUTE_303
    097A: -1000.0 -1000.0 -1000.0  1039 
    0004: $8270 =  0  ;; integer values
    
    :PLCHUTE_303
    00D6: if  0
    0039:   @0 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_316
    0087: @25 = @3  ;; floating-point values only
    0017: @25 /=  500.0  ;; floating-point values 
    0087: @26 = @2  ;; floating-point values only
    0017: @26 /=  500.0  ;; floating-point values 
    0085: @18 = @32  ;; integer values and handles
    0085: @19 = @32  ;; integer values and handles
    0087: @5 = @4  ;; floating-point values only
    0013: @5 *= -1.0  ;; floating-point values 
    0089: @6 = $1509  ;; floating-point values only
    0006: @0 =  1  ;; integer values
    
    :PLCHUTE_316
    00D6: if  0
    0039:   @0 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_338
    0085: @10 = @32  ;; integer values and handles
    0062: @10 -= @19  ;; integer values 
    00D6: if  0
    001B:    500 > @10  ;; integer values
    004D: jump_if_false £PLCHUTE_335
    0085: @10 = @32  ;; integer values and handles
    0062: @10 -= @18  ;; integer values 
    0085: @18 = @32  ;; integer values and handles
    0093: @21 = integer_to_float @10  
    0087: @22 = @25  ;; floating-point values only
    006B: @22 *= @21  ;; floating-point values
    0087: @23 = @26  ;; floating-point values only
    006B: @23 *= @21  ;; floating-point values
    0063: @3 -= @22  ;; floating-point values 
    0063: @2 -= @23  ;; floating-point values 
    0002: jump £PLCHUTE_338
    
    :PLCHUTE_335
    0007: @2 =  0.0  ;; floating-point values
    0007: @3 =  0.0  ;; floating-point values
    0006: @0 =  2  ;; integer values
    
    :PLCHUTE_338
    00D6: if  0
    0039:   @0 ==  2  ;; integer values
    004D: jump_if_false £PLCHUTE_350
    00D6: if  0
    03CA:   object @17 exists
    004D: jump_if_false £PLCHUTE_350
    0750: @17  1 
    08D2: object @17 scale_model  0.0 
    0085: @19 = @32  ;; integer values and handles
    0001: wait  0 ms
    075A: @17 "PARA_OPEN_O" "PARACHUTE"  1000.0  0  1 
    0006: @0 =  3  ;; integer values
    
    :PLCHUTE_350
    00D6: if  0
    0039:   @0 ==  3  ;; integer values
    004D: jump_if_false £PLCHUTE_364
    0085: @10 = @32  ;; integer values and handles
    0062: @10 -= @19  ;; integer values 
    00D6: if  0
    001B:    500 > @10  ;; integer values
    004D: jump_if_false £PLCHUTE_362
    0093: @21 = integer_to_float @10  
    0017: @21 /=  500.0  ;; floating-point values 
    08D2: object @17 scale_model @21 
    0002: jump £PLCHUTE_364
    
    :PLCHUTE_362
    08D2: object @17 scale_model  1.0 
    0006: @0 =  4  ;; integer values
    
    :PLCHUTE_364
    00D6: if  0
    0039:   @0 ==  5  ;; integer values
    004D: jump_if_false £PLCHUTE_372
    0107: @20 = create_object #PARA_COLLISION at  0.0  0.0  0.0
    0750: @20  0 
    0392: object @20 toggle_in_moving_list  1
    04D9: object @20 set_scripted_collision_check  1
    0006: @0 =  6  ;; integer values
    
    :PLCHUTE_372
    00D6: if  0
    0039:   @0 ==  6  ;; integer values
    004D: jump_if_false £PLCHUTE_489
    0494: get_joystick_data  0 @10 @11 @12 @12
    00D6: if  0
    0038:   $1511 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_381
    0006: @10 =  0  ;; integer values
    0006: @11 =  0  ;; integer values
    
    :PLCHUTE_381
    0093: @21 = integer_to_float @10  
    0017: @21 /=  4.267  ;; floating-point values 
    0063: @21 -= @2  ;; floating-point values 
    0017: @21 /=  20.0  ;; floating-point values 
    005B: @2 += @21  ;; floating-point values 
    0087: @21 = @2  ;; floating-point values only
    0017: @21 /=  15.0  ;; floating-point values 
    0063: @1 -= @21  ;; floating-point values 
    00D6: if  0
    0021:   @1 >  180.0  ;; floating-point values
    004D: jump_if_false £PLCHUTE_393
    000F: @1 -=  360.0  ;; floating-point values
    
    :PLCHUTE_393
    00D6: if  0
    0023:   -180.0 > @1  ;; floating-point values
    004D: jump_if_false £PLCHUTE_397
    000B: @1 +=  360.0  ;; floating-point values
    
    :PLCHUTE_397
    02F6: $1507 = cosine @1  ;; sinus swapped with cosine
    02F7: $1508 = sinus @1 ;; cosine swapped with sinus
    0069: $1507 *= $1500  ;; floating-point values
    0069: $1508 *= $1500  ;; floating-point values
    0011: $1507 *= -1.0  ;; floating-point values
    0085: @12 = @10  ;; integer values and handles
    0085: @13 = @11  ;; integer values and handles
    0095: make @12 absolute_integer  
    0095: make @13 absolute_integer  
    00D6: if  21
    0019:   @12 >  40  ;; integer values
    0019:   @13 >  40  ;; integer values
    004D: jump_if_false £PLCHUTE_463
    00D6: if  0
    001D:   @12 > @13  ;; integer values  
    004D: jump_if_false £PLCHUTE_436
    0089: @21 = $1501  ;; floating-point values only
    0065: @21 -= $1509  ;; floating-point values 
    0017: @21 /=  20.0  ;; floating-point values 
    005F: $1509 += @21  ;; floating-point values 
    00D6: if  0
    0029:   @10 >=  0  ;; integer values
    004D: jump_if_false £PLCHUTE_426
    00D6: if  0
    8039:   NOT   @15 ==  2  ;; integer values
    004D: jump_if_false £PLCHUTE_426
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_STEERR" "PARACHUTE"  1.0  1  0  0  1 -2 
    075A: @17 "PARA_STEERR_O" "PARACHUTE"  1.0  1  1 
    0006: @15 =  2  ;; integer values
    
    :PLCHUTE_426
    00D6: if  0
    001B:    0 > @10  ;; integer values
    004D: jump_if_false £PLCHUTE_435
    00D6: if  0
    8039:   NOT   @15 ==  3  ;; integer values
    004D: jump_if_false £PLCHUTE_435
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_STEERL" "PARACHUTE"  1.0  1  0  0  1 -2 
    075A: @17 "PARA_STEERL_O" "PARACHUTE"  1.0  1  1 
    0006: @15 =  3  ;; integer values
    
    :PLCHUTE_435
    0002: jump £PLCHUTE_462
    
    :PLCHUTE_436
    00D6: if  0
    0029:   @11 >=  0  ;; integer values
    004D: jump_if_false £PLCHUTE_449
    0089: @21 = $1503  ;; floating-point values only
    0065: @21 -= $1509  ;; floating-point values 
    0017: @21 /=  20.0  ;; floating-point values 
    005F: $1509 += @21  ;; floating-point values 
    00D6: if  0
    8039:   NOT   @15 ==  4  ;; integer values
    004D: jump_if_false £PLCHUTE_449
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_DECEL" "PARACHUTE"  1.0  1  0  0  1 -2 
    075A: @17 "PARA_DECEL_O" "PARACHUTE"  1.0  1  1 
    0006: @15 =  4  ;; integer values
    
    :PLCHUTE_449
    00D6: if  0
    001B:    0 > @11  ;; integer values
    004D: jump_if_false £PLCHUTE_462
    0089: @21 = $1501  ;; floating-point values only
    0065: @21 -= $1509  ;; floating-point values 
    0017: @21 /=  20.0  ;; floating-point values 
    005F: $1509 += @21  ;; floating-point values 
    00D6: if  0
    8039:   NOT   @15 ==  5  ;; integer values
    004D: jump_if_false £PLCHUTE_462
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_FLOAT" "PARACHUTE"  1.0  1  0  0  1 -2 
    075A: @17 "PARA_FLOAT_O" "PARACHUTE"  1.0  1  1 
    0006: @15 =  5  ;; integer values
    
    :PLCHUTE_462
    0002: jump £PLCHUTE_476
    
    :PLCHUTE_463
    0089: @21 = $1501  ;; floating-point values only
    0065: @21 -= $1509  ;; floating-point values 
    0017: @21 /=  20.0  ;; floating-point values 
    005F: $1509 += @21  ;; floating-point values 
    00D6: if  0
    8039:   NOT   @15 ==  5  ;; integer values
    004D: jump_if_false £PLCHUTE_476
    00D6: if  0
    8039:   NOT   @15 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_476
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_FLOAT" "PARACHUTE"  1.0  1  0  0  1 -2 
    075A: @17 "PARA_FLOAT_O" "PARACHUTE"  1.0  1  1 
    0006: @15 =  1  ;; integer values
    
    :PLCHUTE_476
    01BB: store_object @17 position_to $73 $74 $75
    0815: @20 $73 $74 $75 
    00D6: if  0
    04DA:   has_object @20 collided
    004D: jump_if_false £PLCHUTE_483
    075A: @17 "PARA_RIP_LOOP_O" "PARACHUTE"  8.0  1  1 
    0006: @0 =  7  ;; integer values
    
    :PLCHUTE_483
    00D6: if  0
    00E1:   key_pressed  0  15
    004D: jump_if_false £PLCHUTE_489
    0792: $PLAYER_ACTOR 
    0004: $1513 =  6  ;; integer values
    0004: $1498 =  3  ;; integer values
    
    :PLCHUTE_489
    00D6: if  0
    03CA:   object @17 exists
    004D: jump_if_false £PLCHUTE_518
    00D6: if  0
    0837: @17 "PARA_OPEN_O" 
    004D: jump_if_false £PLCHUTE_518
    0839: @17 "PARA_OPEN_O" @21 
    0087: @22 = @6  ;; floating-point values only
    0065: @22 -= $1501  ;; floating-point values 
    0087: @23 = @22  ;; floating-point values only
    006B: @23 *= @21  ;; floating-point values
    0088: $1509 = @6  ;; floating-point values only
    0067: $1509 -= @23  ;; floating-point values
    0087: @22 = @5  ;; floating-point values only
    0065: @22 -= $1500  ;; floating-point values 
    0087: @23 = @22  ;; floating-point values only
    006B: @23 *= @21  ;; floating-point values
    0087: @4 = @5  ;; floating-point values only
    0063: @4 -= @23  ;; floating-point values 
    02F6: $1507 = cosine @1  ;; sinus swapped with cosine
    02F7: $1508 = sinus @1 ;; cosine swapped with sinus
    006D: $1507 *= @4  ;; floating-point values
    006D: $1508 *= @4  ;; floating-point values
    0011: $1507 *= -1.0  ;; floating-point values
    00D6: if  1
    0043:   @21 ==  1.0  ;; floating-point values
    0039:   @0 ==  4  ;; integer values
    004D: jump_if_false £PLCHUTE_518
    0006: @0 =  5  ;; integer values
    
    :PLCHUTE_518
    00D6: if  0
    8118:   NOT   actor $PLAYER_ACTOR dead
    004D: jump_if_false £PLCHUTE_534
    00D6: if  0
    04AD:   actor $PLAYER_ACTOR touching_water
    004D: jump_if_false £PLCHUTE_528
    0812: unknown_action_sequence $PLAYER_ACTOR "PARA_LAND_WATER" "PARACHUTE"  8.0  1  1  0  0  1000 
    075A: @17 "PARA_LAND_WATER_O" "PARACHUTE"  1000.0  0  1 
    0004: $1513 =  5  ;; integer values
    0006: @0 =  0  ;; integer values
    
    :PLCHUTE_528
    083D: $PLAYER_ACTOR @21 @21 @23 
    00D6: if  0
    0021:   @23 > -.1  ;; floating-point values
    004D: jump_if_false £PLCHUTE_534
    0004: $1513 =  4  ;; integer values
    0006: @0 =  0  ;; integer values
    
    :PLCHUTE_534
    00D6: if  0
    0038:   $1513 ==  4  ;; integer values
    004D: jump_if_false £PLCHUTE_579
    00D6: if  0
    0039:   @0 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_567
    0004: $1498 =  1  ;; integer values
    00A0: store_actor $PLAYER_ACTOR position_to $69 $70 $71
    000D: $71 -=  1.0  ;; floating-point values
    00A1: put_actor $PLAYER_ACTOR at $69 $70 $71
    083E: $PLAYER_ACTOR  0.0  0.0 @1 
    00D6: if  0
    0022:   -10.0 > $1509  ;; floating-point values
    004D: jump_if_false £PLCHUTE_551
    0004: $1513 =  2  ;; integer values
    0006: @0 =  0  ;; integer values
    0002: jump £PLCHUTE_563
    
    :PLCHUTE_551
    00D6: if  0
    0022:   -4.0 > $1509  ;; floating-point values
    004D: jump_if_false £PLCHUTE_561
    0615: define_action_sequences @14 
    0812: unknown_action_sequence -1 "FALL_FRONT" "PED"  20.0  0  0  0  1  700 
    0812: unknown_action_sequence -1 "GETUP_FRONT" "PED"  8.0  0  1  0  0 -2 
    0616: define_action_sequences_end @14 
    0618: assign_actor $PLAYER_ACTOR to_action_sequences @14 
    061B: @14 
    0002: jump £PLCHUTE_562
    
    :PLCHUTE_561
    0812: unknown_action_sequence $PLAYER_ACTOR "RUN_PLAYER" "PED"  8.0  1  1  0  0  1000 
    
    :PLCHUTE_562
    0006: @0 =  1  ;; integer values
    
    :PLCHUTE_563
    075A: @17 "PARA_LAND_O" "PARACHUTE"  1000.0  0  1 
    0682: @17  0.0  0.0  0.0  0 
    0085: @18 = @32  ;; integer values and handles
    000A: @18 +=  1000  ;; integer values
    
    :PLCHUTE_567
    00D6: if  0
    0039:   @0 ==  1  ;; integer values
    004D: jump_if_false £PLCHUTE_579
    00D6: if  0
    0837: @17 "PARA_LAND_O" 
    004D: jump_if_false £PLCHUTE_579
    0839: @17 "PARA_LAND_O" @21 
    00D6: if  0
    0043:   @21 ==  1.0  ;; floating-point values
    004D: jump_if_false £PLCHUTE_579
    0004: $1498 =  2  ;; integer values
    0050: gosub £PLCHUTE_614
    
    :PLCHUTE_579
    00D6: if  0
    0038:   $1513 ==  5  ;; integer values
    004D: jump_if_false £PLCHUTE_588
    0004: $1498 =  1  ;; integer values
    00D6: if  0
    0039:   @0 ==  0  ;; integer values
    004D: jump_if_false £PLCHUTE_588
    0004: $1498 =  2  ;; integer values
    0050: gosub £PLCHUTE_614
    
    :PLCHUTE_588
    00D6: if  1
    0018:   $1513 >  0  ;; integer values
    001A:    4 > $1513  ;; integer values
    004D: jump_if_false £PLCHUTE_598
    00D6: if  0
    8118:   NOT   actor $PLAYER_ACTOR dead
    004D: jump_if_false £PLCHUTE_598
    083C: $PLAYER_ACTOR $1507 $1508 $1509 
    0173: set_actor $PLAYER_ACTOR z_angle_to @1
    083E: $PLAYER_ACTOR @3 @2 @1 
    
    :PLCHUTE_598
    00D6: if  0
    0038:   $1513 ==  6  ;; integer values
    004D: jump_if_false £PLCHUTE_602
    0050: gosub £PLCHUTE_614
    
    :PLCHUTE_602
    00D6: if  0
    0038:   $1513 ==  7  ;; integer values
    004D: jump_if_false £PLCHUTE_606
    0050: gosub £PLCHUTE_607
    
    :PLCHUTE_606
    0002: jump £PLCHUTE_18
    
    :PLCHUTE_607
    0004: $1513 =  0  ;; integer values
    0006: @0 =  0  ;; integer values
    0249: release_model #PARACHUTE
    04EF: release_animation "PARACHUTE"
    083E: $PLAYER_ACTOR  0.0  0.0 @1 
    0992: $PLAYER_CHAR  1 
    0051: return
    
    :PLCHUTE_614
    0682: @17  0.0  0.0  0.0  0 
    09A2: @17 
    0108: destroy_object @20
    0555: remove_weapon  46 from_actor $PLAYER_ACTOR 
    0004: $1513 =  0  ;; integer values
    0004: $1497 =  0  ;; integer values
    0006: @0 =  0  ;; integer values
    0249: release_model #PARACHUTE
    04EF: release_animation "PARACHUTE"
    0249: release_model #GUN_PARA
    083E: $PLAYER_ACTOR  0.0  0.0 @1 
    0992: $PLAYER_CHAR  1 
    004E: end_thread
    
    
    
    ;-------------------------------------------------
    DEFINE EXTERNAL_SCRIPT_START Extern_Action
    ; Originally: Test_Extern_Script
    
    03A4: name_thread "TEXS"  
    0004: $TEXS1 =  1
    0247: request_model #BALLAS1
    0247: request_model #AK47
    0247: request_model #TRIBOSS
    
    :Load_Extern_models
    0001: wait  0 ms
    00D6: if  2
    0248:   model #BALLAS1 available
    0248:   model #TRIBOSS available
    0248:   model #AK47 available
    004D: jump_if_false £Load_Extern_models
    
    009A: @1 = create_actor  7 #BALLAS1 at  2506.5  -1664.5  13.45
    0173: set_actor @1 z_angle_to  180.0
    01B2: give_actor @1 weapon  30 ammo  99999  ;; Load the weapon model before using this
    02E2: set_actor @1 weapon_accuracy_to  100
    0223: set_actor @1 health_to  3000
    05E2: AS_actor @1 kill_actor $PLAYER_ACTOR
    
    0632: release_group $PLAYER_GROUP
    009A: @2 = create_actor  8 #TRIBOSS at  2506.5  -1674.5  13.45
    0173: set_actor @2 z_angle_to  180.0
    01B2: give_actor @2 weapon  30 ammo  99999  ;; Load the weapon model before using this
    02E2: set_actor @2 weapon_accuracy_to  100
    0223: set_actor @2 health_to  5000
    0631: put_actor @2 in_group $PLAYER_GROUP
    07CB: @2  0
    
    0249: release_model #BALLAS1
    0249: release_model #TRIBOSS
    0249: release_model #AK47
    
    :Extern_Loop_1
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false £Test_Extern_Script_End
    00D6: if  0
    8118:   NOT   actor @1 dead
    004D: jump_if_false £Test_Extern_Script_End
    00D6: if  0
    0104:   actor $PLAYER_ACTOR near_actor @1 radius  80.0  80.0  10.0 sphere  0
    004D: jump_if_false £Test_Extern_Script_End
    0002: jump £Extern_Loop_1
    
    :Test_Extern_Script_End
    01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
    01C2: remove_references_to_actor @2 ;; Like turning an actor into a random pedestrian
    0004: $TEXS1 = 0  ;; integer values
    004E: end_thread
nothing

Garagen

  1. Garagen werden in den IPL-Dateien erstellt, nicht in der Main.scm
  2. Um genau zu sein, wird in der IPL-Datei ein Save-Areal abgesteckt
  3. Save-Garagen werden in der main.scm nur aus und eingeschaltet
  4. 02B9: deactivate_garage 'SAV1SFW'
    0299: activate_garage 'SAV1SFW'

  5. Änderungen der IPL-Einträge erfordern einen neuen Spielstart, damit die neue Garage funktioniert
  6. Es können maximal 4 Fahrzeuge pro Areal gespeichert werden
    Die Anzahl der Save-Areale in GTA_SA ist limitiert.
    Zum original San Adreas können nur 2 neue hinzugefügt werden
  7. Als Beispiel der IPL-Eintrag der Garage in der Grovestreet:
  8. grge
    2502.31, -1699.36, 12.4323, 2508.61, -1699.36, 2502.31, -1691.01, 16.5666, 1, 16, cjsafe 
    
    rechts hinten, unten, links hinten, rechts vorne, oben, 1, 16, zazgar
  9. Eingetragen werden 3 Eckpunkte bestehend aus x - und y -Koordinaten,
    eine obere z - Koordinate und eine untere z - Koordinate
    Die untere z - Koordinate sollte tief genug gesetzt werden
  10. Eine Kopie der Grovestreet-Garage in Ryders Garten gesetzt:
  11. LAe2.ipl>>
    17950, cjsaveg, 0, 2473.29, -1710.83, 14.6953, 0, 0, 0, 1, 329
    17951, cjgaragedoor, 0, 2473.28, -1706.38, 14.3281, 0, 0, 0.707106, 0.707107, -1
    
    grge
    2469.89, -1715.17, 12.23, 2476.59, -1715.01, 2469.81, -1706.54, 17.2, 1, 16, newgarage


  12. Das Garagentor hat in seinem IDE-Eintrag am Ende 2048
    Das Garagentor muss in der object.dat aufgeführt sein, dann funktionierts automatisch

  13. Areale für Pay an Spray-Garagen werden etwas anders abgesteckt
  14. grge
    2056.6, -1835.9, 12.5443, 2071.3, -1835.9, 2056.6, -1826.97, 18.5443, 1, 5, sprLAe
    end
    
    rechts Vorne, unten, rechts hinten, links vorne, oben, 1, 5, sprLAe
  15. Pay and Spray-Garagen bekommen durch den Eintrag ( 5 ) ihre Zuordnung
  16. Bei Garagen, die nicht als Save-Areale erstellt wurden, können mit opcodes in der main.scm
    die Funktionsart gewechselt werden:
  17. 02FA: garage 'BODLAWN' change_to_type  38
    02FA: garage 'MODLAST' change_to_type  36
    02FA: garage 'MDSSFSE' change_to_type  38
    02FA: garage 'MDS1SFS' change_to_type  37
    02FA: garage 'VECMOD' change_to_type  38
    02FA: garage 'MICHDR' change_to_type  5
    02FA: garage 'HBGDSFS' change_to_type  19
  18. Außerdem kann man die Tore öffnen und schließen, sowie abfragen, ob sie geöffnet sind
  19. 0360: open_garage 'MUL_LAN'
    0361: close_garage 'MUL_LAN'
    
    00D6: if  0
    03B0:   garage 'VECMOD' door_open
nothing

Das Interaktive Menue

  1. Das Menue wird mit 08D4: $Menue = create_panel_with_title initiert
  2. 08D4: $Menue = create_panel_with_title 'CHEAT7' position  340.0  120.0 width  240.0 columns  1 interactive  1 background  1 alignment  0
  3. und beinhaltet die Überschrift. Dort werden Daten für die Platzierung eingetragen sowie Spaltenanzahl, Ausrichtung, Hintergrund
    und ob interaktiv oder nicht.
    doch interaktiv wird es erst durch den Spalteneintrag
  4. 08DB: set_panel $Menue column  0 header 'PLA_19' data 'DEBW1' 'DEBW4' 'DEBW5' 'DEBW8' 'DEBW9' 'DEBW10' 'DEBW12' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY'
  5. Hier können nochmal eine Überschrift und dann 12 auswählbare Einträge bestimmt werden
  6. Durch Eintrag des Namens 'DUMMY' bleibt die entsprechende Zeile ausgeblendet
  7. darauf folgen, sollte der code zur Bestimmung der aktiven Zeile
  8. 090E: set_panel $Menue active_row  0
  9. Die Möglichkeit mittels Auf/Ab - Tasten zwischen den Zeilen hoch und runterzuschalten
    funktioniert automatisch
  10. Um eine Aktion auszulösen bezüglich einer aktiven Zeile,
    wird diese Zeile folgendermaßen erfasst:
  11. 08D7: $Auswahl = panel $Menue active_row
  12. und anschließend abgefragt:
  13. 00D6: if  0
    0038:   $Auswahl ==  0  ;; integer values

  14. Als Beispiel, das Menue fürs Wetter zu bestimmen, zu Fuß-[Homie recrutieren/rufen]-Taste drücken :
  15. :WetterSet_00;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
    03A4: name_thread 'WHELP'
    
    :WetterSet_01
    0001: wait  20 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££WetterSet_01
    00D6: if  0
    03EE:   player $PLAYER_CHAR controllable  
    004D: jump_if_false ££WetterSet_01
    00D6: if  1
    80DF:   NOT   actor $PLAYER_ACTOR driving
    00E1:   key_pressed  0  8  
    004D: jump_if_false ££WetterSet_01
    0001: wait  1000 ms
    00D6: if  0
    0038:   $ON_MISSION ==  0  ;; integer values
    004D: jump_if_false ££WetterSet_01
    00D6: if  0
    0038:   $ACTIVE_INTERIOR ==  0  ;; integer values  
    004D: jump_if_false ££WetterSet_01
    00D6: if  0
    00E1:   key_pressed  0  8  
    004D: jump_if_false ££WetterSet_01
    0002: jump ££WetterSet_1
    
    :WetterSet_1
    0001: wait  1000 ms
    0050: gosub ££HelpText001
    0343: set_text_linewidth  680.0
    033E: text_draw  36.0  20.0 'TATTA'
    01B4: set_player $PLAYER_CHAR frozen_state  0 (frozen)
    03BF: set_player $PLAYER_CHAR ignored_by_everyone_to  1 (true)
    0826: toggle_hud  0
    03BF: set_player $PLAYER_CHAR ignored_by_everyone_to  1 (true)
    08D4: $WetterMenue = create_panel_with_title 'CHEAT7' position  340.0  120.0 width  240.0 columns  1 interactive  1 background  1 alignment  0
    08DB: set_panel $WetterMenue column  0 header 'PLA_19' data 'DEBW1' 'DEBW4' 'DEBW5' 'DEBW8' 'DEBW9' 'DEBW10' 'DEBW12' 'DEBW14' 'DEBW16' 'DEBW17' 'DEBW18' 'WEATH0' 
    
    090E: set_panel $WetterMenue active_row  0
    
    :WetterSet_2
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££WetterSet_21
    00D6: if  0
    00E1:   key_pressed  0  15
    004D: jump_if_false ££WetterSet_20
    0002: jump ££WetterSet_21
    
    :WetterSet_20
    00D6: if  0
    00E1:   key_pressed  0  16
    004D: jump_if_false ££WetterSet_2
    03E6: remove_text_box
    08D7: $Auswahl = panel $WetterMenue active_row
    
    
    
    00D6: if  0
    0038:   $Auswahl ==  0  ;; integer values
    004D: jump_if_false ££WetterSet_3
    01B6: set_weather  1; = SUNNY_LA
    0002: jump ££WetterSet_2
    
    :WetterSet_3
    00D6: if  0
    0038:   $Auswahl ==  1  ;; integer values
    004D: jump_if_false ££WetterSet_4
    01B6: set_weather  4; = CLOUDY_LA
    0002: jump ££WetterSet_2
    
    :WetterSet_4
    00D6: if  0
    0038:   $Auswahl ==  2  ;; integer values
    004D: jump_if_false ££WetterSet_5
    01B6: set_weather  5; = SUNNY_SF
    0002: jump ££WetterSet_2
    
    :WetterSet_5
    00D6: if  0
    0038:   $Auswahl ==  3  ;; integer values
    004D: jump_if_false ££WetterSet_6
    01B6: set_weather  8; = RAINY_SF
    0002: jump ££WetterSet_2
    
    :WetterSet_6
    00D6: if  0
    0038:   $Auswahl ==  4  ;; integer values
    004D: jump_if_false ££WetterSet_7
    01B6: set_weather  9; = FOGGY_SF
    0002: jump ££WetterSet_2
    
    :WetterSet_7
    00D6: if  0
    0038:   $Auswahl ==  5  ;; integer values
    004D: jump_if_false ££WetterSet_8
    01B6: set_weather  10; = SUNNY_VEGAS
    0002: jump ££WetterSet_2
    
    :WetterSet_8
    00D6: if  0
    0038:   $Auswahl ==  6  ;; integer values
    004D: jump_if_false ££WetterSet_9
    01B6: set_weather  12; = CLOUDY_VEGAS
    0002: jump ££WetterSet_2
    
    :WetterSet_9
    00D6: if  0
    0038:   $Auswahl ==  7  ;; integer values
    004D: jump_if_false ££WetterSet_10
    01B6: set_weather  14; = SUNNY_COUNTRYSIDE
    0002: jump ££WetterSet_2
    
    :WetterSet_10
    00D6: if  0
    0038:   $Auswahl ==  8  ;; integer values
    004D: jump_if_false ££WetterSet_11
    01B6: set_weather  16; = RAINY_COUNTRYSIDE
    0002: jump ££WetterSet_2
    
    :WetterSet_11
    00D6: if  0
    0038:   $Auswahl ==  9  ;; integer values
    004D: jump_if_false ££WetterSet_12
    01B6: set_weather  17; = EXTRASUNNY_DESERT
    0002: jump ££WetterSet_2
    
    :WetterSet_12
    00D6: if  0
    0038:   $Auswahl ==  10  ;; integer values
    004D: jump_if_false ££WetterSet_13
    01B6: set_weather  19; = SANDSTORM_DESERT
    0002: jump ££WetterSet_2
    
    :WetterSet_13
    00D6: if  0
    0038:   $Auswahl ==  11  ;; integer values
    004D: jump_if_false ££WetterSet_2
    01B7: release_weather
    0002: jump ££WetterSet_21
    
    :WetterSet_21
    08DA: remove_panel $WetterMenue
    0826: toggle_hud  1
    03BF: set_player $PLAYER_CHAR ignored_by_everyone_to  0 (false)
    01B4: set_player $PLAYER_CHAR frozen_state  1 (unfrozen)
    03F0: text_draw_toggle  0
    0002: jump ££WetterSet_01
    
    :WetterSet_25
    08DA: remove_panel $WetterMenue
    01B4: set_player $PLAYER_CHAR frozen_state  1 (unfrozen)
    03BF: set_player $PLAYER_CHAR ignored_by_everyone_to  0 (false)
    03F0: text_draw_toggle  0
    0051: return
    
    :HelpText001
    0340: set_text_draw_color  180  180  180  255
    033F: set_text_draw_letter_width_height 0.5 2.5
    03E4: set_text_draw_align_right  0
    0341: unknown_text_stuff  0
    0342: set_text_draw_centered  0
    0343: set_text_linewidth  200.0
    0348: set_text_draw_proportional  1
    0345: set_text_draw_in_box  0
    0051: return
nothing

Der Zusammenhang des Define Memory, den Globalen Variablen und der Kompilierung

  1. Am Anfang der Original Main steht folgende Zeile:
    DEFINE MEMORY 43800 ; Equals Mission Builder type global variable range $2 to $10949

    Der MissionBuilder benutzt ein direct memory access system für die Globalen Variablen
    D.h. die Gesamtheit der Globalen Variablen, die ja stellvertretend für models, Objekte ,Settings,
    Statusdefinitionen und vieles mehr benutzt werden, erfordern eine Speicherkapazität von 43800.
    Das hier z.B.:
    0008: $RYDERS_MISSIONS_PASSED += 1 ;; integer values
    wird gespeichert.
    Der höchste Wert, der dabei für Globalen Variablen benutzt werden darf ist $10949

    Wenn nun der Original Main ein Script oder Codezeilen, wie z.B. parked_cars hinzugefügt werden,
    die Globalen Variablen enthalten, erhöht sich der Bedarf des MEMORY und
    der mögliche Höchstwert für die Globalen Variablen.

    Dieser Höchstwert wird aber erst beim Kompilieren festgelegt.
    Somit bleibt man also beim Höchstwert der Globalen Variablen auf $10949 beschränkt.
    Das ist aber kein Problem, da die Globalen Variablen sowieso anders gestaltet werden sollen.

    Und zwar soll die Globale Variable mit einem Buchstaben beginnen und eine Zahl hinzugefügt werden.
    Z.B. so: $MR1 , $sv01 , $WP1 , $OP2

    Das hat folgenden Grund:
    Jede Globale Variable die mit einer Zahl beginnt wird an eine Speicheradresse vergeben,
    spezifiziert durch diese Zahl und mit 4 multipliziert.
    Eine Globale Variable wie z.B. $100Test wird an die Adresse 400 vergeben.
    Eine Globale Variable, die NICHT mit einer Zahl beginnt,
    wird an die verfügbare Adresse am Ende des MEMORY vergeben.

    Nach dem Dekompilieren gemodderter Main.scm werden Globalen Variable oftmals ungewöhnlich dargestellt.
    ...mit Punkt
    $10956.75

    weil Zahlen als Globale Variable benutzt wurden und
    dann die Einträge in dieser Zeile nicht entsprechend erhöht wurden:
    DEFINE MEMORY 43800 ; Equals Mission Builder type global variable range $2 to $10949

    Auch Rockstar hat wahrscheinlich die Globalen Variablen anders gestaltet.
    Sie werden aber beim Kompilieren in Zahlen umgewandelt.
    Und das geschieht auch mit euren Globalen Variablen
    Es gibt aber auch Ausnahmen wie z.B.
    $RYDERS_MISSIONS_PASSED
    da der Programmierer des MB, Bart Waterduck, es so eigerichtet hat,
    daß wichtige original-Variable-Namen nach dem Dekompilieren mit ihrem Namen erhalten bleiben.
    Die meisten anderen Global Vars werden zwar in Zahlen ausgegeben, sind aber trotzdem
    als original Variable-Namen registriert.
    Egal welche Variable-Namen man in seinen Scripten hinzufügt, das Player-Fahrzeug
    im Carmod-Extern-Script bekommt immer $10431

    Dazu ein Auszug aus der MB-readme.txt
  2. 4.5 Global variables
    
    Global variables are global to the entire mission script. They can be set>
    in the MAIN part of the mission script and used in the mission part of the
    mission script by any mission. The total size of the mission script memory
    is not set automatically in this version. Use the DEFINE MEMORY command
    to set the total size of the mission script memory. This version 
    uses a direct memory access system with the global variables.
    
    Any global variables that start with
    a number will be allocated at the address specified by that number and
    multiplied by 4. A global variable named $100Test will be allocated at
    address 400. Please note that the decompiler no longer uses hexadecimal
    numbers when outputting global variable names. Any global variable that
    doesn't start with a number will be allocated at an available address at
    the end of the memory (specified by the DEFINE MEMORY command at the
    start of the script). This allocation method will require more memory
    than any mission editor that doesn't. The reason I chose to code the
    mission builder like this was to keep the original script in its original
    state or as close to it as possible when recompiling, preserving memory
    addresses that was unused originally and perhaps avoiding problems related
    to unknown memory issues. Future mission builders (for the PC version)
    will not have this DMA system.
nothing