GTA SAN ANDREAS
MODS for
GTA-San Andreas-Mission-scripting
mit Bart Waterducks Mission Builder/Teil4
Übersicht
- für Anfänger: Vorbereitung und Umgang mit dem SABuilder033
- Erste Lektion: Parked cars (Autos platzieren) und Waffen-Pickups
- Koordinaten auslesen
- speichern und kompilieren
- create_thread/Einfügen eines Mod-Scripts am Beispiel eines neuen Speicherpunktes
- Einteilung und Aufbau der Main
- Stripped main
- Der Opcode
- DATA TYPE MEANING/Die Zeichen und ihre Bedeutung
- Arbeiten mit der Stripped Main erleichtert das Scripten
- Script schreiben
- Modelle einsetzen
- Lokals and Globals
- Math-Coding
- Tastenbelegung
- gosub
- Animationen
- Sounds
- Text aus der german.gxt
- Missionen
- EXTERNAL_SCRIPT
- Zusammenfassung
- Garagen
- Das Interaktive Menue
- Define Memory Beispiel-Scripte
- CJ spricht
- die Koordinatenanzeige
- Die frei bewegliche Kamera
- Cardrive-Script
- Das Wetter-Script
- Stripped Main with Externscripts and Submissions
- Wenn im Mozilla Firefox die Seite nicht richtig dargestellt wird, dann schließt alle anderen Tabs oder startet ihn neu
Missionen
- so fügt man eine Mission hinzu:
- Missionen müssen im Second_Segment, Missionsaufstellung definiert werden,
- die Gesamtzahl ist in der ersten Zeile anzugeben(DEFINE MISSIONS 2)
- Definiert wird die Mission durch ihre Adresse mit der das Missions-Script beginnt (TestMission_1)
- Missions-Scripte kommen in den Mission Part des 7. Segments
- Und dann, ganz wichtig: Im Main-Thread muss der Status des speziellen Missions-Modus erfasst werden.
- Mit der hiermit erhaltenen Variable $ON_MISSION, durch Gleichsetzen mit 1
- und dem Opcode
- der sich im Missions-Script befindet, wird das Spiel in den speziellen Missions-Modus versetzt
- Außerdem wird mit der Abfrage
- 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: - Zum Starten der Mission setzen wir den Missions-Starter-code
- in einen Missions-Starter-Thread, der im Main Part platziert wird.
- 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
- Das Missions-Script kommt dann in den Mission Part des 7. Segments
- Im folgenden Beispiel, ein einfaches Missions-Script. Die Einzelheiten werden im Anschluss erklärt
- In Missions-Scripten werden Lokale Sprunganweisungen benutzt (£)
- Im Anfang des Missions-Scripts wird in 3 subscripte verzweigt
- Als 1. in den Hauptabschnitt der Mission
- 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" - Als 2. kommt nun die Abrage "if wasted_or_busted" zur Geltung
- 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 - 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 - In beiden Fällen wird zur 3.gosub-Anweisung verwiesen
- Als 3. in den Mission-Cleanup-Abschnitt
- Als Abschluss wird ins Mission-Cleanup-Subscript verwiesen
und der Missions-Thread wird mit end_thread beendet - Ein Anfang braucht auch ein Ende
- Die Subscripte für die gosub-Anweisungen aus dem Anfang bestehen in erster Linie aus:
- 1.Der Mission-fail-Abschnitt
Er beinhaltet in der Regel die Meldung "Mission nicht bestanden"
und endet mit dem return-code - 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 - Und ganz zu Schluss wird mit $ON_MISSION = 0 wieder in den Normalzustand geschaltet
bevor der Abschnitt mit dem return-code endet - 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 - 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 - 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 - 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 - Dieser Loop liese sich auch minimieren:
- Dann wird die Mission erst beendet, wenn der Player stirbt oder verhaftet wird. Denn dafür sorgt ja die EXE
: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
0180: set_on_mission_flag_to $ON_MISSION
0004: $ON_MISSION = 1 ;; integer values
0317: increment_mission_attempts
0038: $ON_MISSION == 0 ;; integer values
0417: start_mission 1 ; originally: TestMission
: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
;-------------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
: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
0050: gosub £TestMission_main_1
:TestMission_main_1
0317: increment_mission_attempts;;here starts the missionscript
0004: $on_mission = 1
00D6: if 0
0112: wasted_or_busted
004D: jump_if_false £TestMission_end_1
0050: gosub £TestMission_fail_1
0050: gosub £TestMission_clep_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
: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
:Loop_1
0001: wait 250 ms
0002: jump £Loop_1
So erstellt man ein Extern-Script
- Extern_Scripte müssen im Fourth_Segment, Aufstellung der EXTERNAL_SCRIPTS definiert werden,
- die Gesamtzahl ist in der ersten Zeile anzugeben(EXTERNAL_SCRIPTS 2)
- 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
- Extern-Scripte kommen in den Extern-Script-Part des 7. Segments
- Und dann, wird im Main-Thread die Einbindung des Extern-Scripts in die Main.scm angegeben
- Zum Starten des Extern-Scripts erstellen wir einen Thread, der im Main Part platziert wird.
- Das Extern-Script wird ähnlich wie Modelle oder Animationen, erst geladen und
in einem "load-check" überprüft, ob es geladen ist. - Sobald das Extern-Script verfügbar ist, wird es mit run_external_script gestartet
- 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 - Dazu wird im Extern-Script selbst, gleich zu Beginn die Abfrage-Kennung umgeschaltet
und am Ende wieder freigeschaltet - In Extern-Scripten werden Lokale Sprunganweisungen benutzt (£)
- 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 - Zu Beginn des Extern-Scripts wird die Abfrage-Kennung auf 1 gestellt
und am Ende wieder auf 0, und als Abschluss, end_thread. - 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 - Zum Starten eines Extern-Scripts gibts noch andere Möglichkeiten
Z.B.die Initialisierung über ein Objekt - 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
: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
DEFINE EXTERNAL_SCRIPT_START Extern_Action
0914: init_external_script 0 (PLAYER_PARACHUTE)
0914: init_external_script 1 (Extern_Action)
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)
00D6: if 0
0038: $TEXS1 == 0 ;; integer values
004D: jump_if_false ££Extern_Script_Starter_2
: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
;-----------------------------------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
0929: init_external_script_with_object_trigger 8 (VENDING_MACHINE) object #CJ_SPRUNK1 priority 100 6.0 -1
Zusammenfassung
- Als Zusammenfassung, die erarbeitete Stripped Main
- mit integrierter Mission und Extern-Script:
- Das Starter-Script fürs Fallscirm-Extern-Script befindet sich im Main-Thread
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
Garagen
- Garagen werden in den IPL-Dateien erstellt, nicht in der Main.scm
- Um genau zu sein, wird in der IPL-Datei ein Save-Areal abgesteckt
- Save-Garagen werden in der main.scm nur aus und eingeschaltet
- Änderungen der IPL-Einträge erfordern einen neuen Spielstart, damit die neue Garage funktioniert
- 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 - Als Beispiel der IPL-Eintrag der Garage in der Grovestreet:
- 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 - Eine Kopie der Grovestreet-Garage in Ryders Garten gesetzt:
- Das Garagentor hat in seinem IDE-Eintrag am Ende 2048
Das Garagentor muss in der object.dat aufgeführt sein, dann funktionierts automatisch - Areale für Pay an Spray-Garagen werden etwas anders abgesteckt
- Pay and Spray-Garagen bekommen durch den Eintrag ( 5 ) ihre Zuordnung
- Bei Garagen, die nicht als Save-Areale erstellt wurden, können mit opcodes in der main.scm
die Funktionsart gewechselt werden: - Außerdem kann man die Tore öffnen und schließen, sowie abfragen, ob sie geöffnet sind
02B9: deactivate_garage 'SAV1SFW'
0299: activate_garage 'SAV1SFW'
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
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
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
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
0360: open_garage 'MUL_LAN'
0361: close_garage 'MUL_LAN'
00D6: if 0
03B0: garage 'VECMOD' door_open
Das Interaktive Menue
- Das Menue wird mit 08D4: $Menue = create_panel_with_title initiert
- 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 - Hier können nochmal eine Überschrift und dann 12 auswählbare Einträge bestimmt werden
- Durch Eintrag des Namens 'DUMMY' bleibt die entsprechende Zeile ausgeblendet
- darauf folgen, sollte der code zur Bestimmung der aktiven Zeile
- Die Möglichkeit mittels Auf/Ab - Tasten zwischen den Zeilen hoch und runterzuschalten
funktioniert automatisch - Um eine Aktion auszulösen bezüglich einer aktiven Zeile,
wird diese Zeile folgendermaßen erfasst: - und anschließend abgefragt:
- Als Beispiel, das Menue fürs Wetter zu bestimmen, zu Fuß-[Homie recrutieren/rufen]-Taste drücken :
08D4: $Menue = create_panel_with_title 'CHEAT7' position 340.0 120.0 width 240.0 columns 1 interactive 1 background 1 alignment 0
08DB: set_panel $Menue column 0 header 'PLA_19' data 'DEBW1' 'DEBW4' 'DEBW5' 'DEBW8' 'DEBW9' 'DEBW10' 'DEBW12' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY'
090E: set_panel $Menue active_row 0
08D7: $Auswahl = panel $Menue active_row
00D6: if 0
0038: $Auswahl == 0 ;; integer values
: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
Der Zusammenhang des Define Memory, den Globalen Variablen und der Kompilierung
- 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
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.