GTA SAN ANDREAS
MODS for
GTA-San Andreas-Mission-scripting
mit Bart Waterducks Mission Builder/Teil2
Ü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
Script schreiben
- Der Thread ist das Basis-Script in der Main.scm
- Die Gestaltung der Abfrage ( IF - CHECK)
- Das Script erweitern durch Verkettung
- Das Script erweitern durch Hinzufügen eines weiteren Loops
- Modelle einsetzen
- Vorrausgesetzt wird, daß die vorrangegangenen Themen verstanden wurden
- Dieses Kapitel sollte man dann mit Hilfe einer Stripped Main nachvollziehen.
- Der Thread ist das Basis-Script in der Main.scm
- Er wird in "create_thread", in Missionen oder Externscripten definiert
- und bekommt einen Namen
- Die threads im Main Part werden mit der create_thread-Zeile definiert
- Die create_thread-Zeile aktiviert den thread und kann an jeder Stelle der main gesetzt werden (d.h. um genau zu sein im 7.Segment)
- So wird sie z.B. im Belohnungsabschnitt von diversen Missions-Scripten
- gesetzt, um neue Missions-Starter-Threads zu aktivieren.
- Dadurch werden neue Missionen freigeschaltet.
- Die Thread-Scripte selbst werden in den Main Part eingefügt
- Es können mehrere gleichzeit ausgeführt werden. Eigentlich weden sogar alle, die durch create_thread schon gestartet wurden, gleichzeit ausgeführt.
- Jedoch rennen sie ledeglich in einer aktionslosen Schleife
- Der erste Thread in der Main ist der Main-Thread
- Im Main-Thread wird alles initiiert für den weitern Verlauf Spiels.
- Im Anschluss zum Main-Thread können dann weitere Threads eingefügt werden
- Diese Thread-Variante benutzen wir um Mod-scripte zu entwickeln
- Das Thread-Script beginnt mit dem Label (Adress-Name)
- mit dem es in der create_thread-Zeile aktiviert wurde.
- Dannach folgt die Namensgebung für den Thread mit:
- Und jetzt das wichtigste:
- 1.Die erste LOOP-Adresse
- 2.Der Wait-code
- 3.Der "if-player-defined-check"
- Mit diesem Script-Abschnitt sollte jeder Thread beginnen
- LOOP-Adresse bedeutet, daß die Game-Engine beim Durchlesen des Scripts, wieder zu dieser Adresse zurückspringt.
- Sie vollzieht eine Schleife, einen Loop.
- In diesem Fall muss der Loop-Adresse unbedingt ein WAIT-code folgen.
- wait 0 ms bedeuted daß die Game-Engine 1/1000 Sekunde wartet.
- Anschließend muss der "if-player-defined-check" folgen.
- Dieser Abfrage-code überprüft, ob die Player-Figur überhaupt vorhanden ist.
- Wenn CJ im Spiel stirbt oder Verhaftet wird, wird diese Abfrage verneint.
- Dann erst kommen wir zum eigentlichen Inhalt unseres Mod-Scripts
- und beginnen natürlich wieder mit einer Abfrage, denn schließlich soll ja erst
- eine Bedingung erfüllt werden, um eine Aktion auszulösen,
- sonst würde die Game-Engine ja ständig den Aktions-code ausführen.
- Es hätte zur Folge, daß wenn man an dieser Stelle ohne eine Bedingung abzufragen,
- ein Fahrzeug ins Spiel bringt, endlos Fahrzeuge generiert werden bis das Spiel abstürtzt.
- Die Bedingung, die im Teleportscript erfüllt werden soll, ist,
- ob sich die Player-Figur an einer bestimmten Stelle befindet.
- Von diesen "near_point"-Frage-codes gibts viele verschiedene Varianten
- In den meisten kann man auch den Eintrag so ändern, daß auch gleichzeitig
- eine rote Markierung dargestellt wird, im Script-english SPHERE genannnt.
- Wenn die Bedingung erfüllt wird, soll die Player-Figur zu einen anderen Ort teleportiert werden.
- Und zum Schluss soll die Game-Engine wieder zum Anfang springen, damit das Script weiter aktiv bleibt.
- Somit springt sie also wieder zu unserer Loop-Adresse zurück:
- Das ganze sieht dann so aus:
- Anstatt einer Jump-Anweisung zur Loop-Adresse, am Ende des Scripts
- kann man den Thread auch einfach beenden,
- mit
- Dann wird der Thread für immer beendet und kann wieder mit 004F: create_thread ££Teleport_1 initiiert werden
- Eine Abfrage besteht aus mindestens 3 opcodes:
- 1. die IF-Variation
- 2. die eigentliche Frage
- 3. Die Sprunganweisung bei Verneinung
004F: create_thread ££Teleport_1
:Teleport_1
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00FF: actor $PLAYER_ACTOR 0 ()near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
0002: jump ££Teleport_2
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
0002: jump ££Teleport_2
Alle Sprung(jump)-Anweisungen im Script verweisen auf die Loop-Adresse
Teleport_2
004E: end_thread
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
004E: end_thread
1. if 0
2. actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
3. jump_if_false ££Teleport_2
- Hier wird die Frage-Variation angegeben
- if 7 und 27 sind maximal möglich
- Die Abfragegestaltung ist die schwierigste Thematik beim Scripten und wird gerne falsch gemacht.
- Ich selbst bin immer wieder bei Fehlersuche auf falsche IF-Variationen gestoßen.
- Ein paar Beispiele:
- Abgefragt wird:
- Fährt CJ NICHT, UND wird die Taste 10 gedrückt ?
- Abgefragt wird:
- Befindet sich CJ in der Zone Verdant Madows, ODER in der Zone Las Venturas ?
- Abgefragt wird:
- Ist KEINE Mission aktiv UND ist das Fahrzeug NICHT geschrottet
- UND NICHT gesunken UND wurde auch NICHT die Taste 11 gedrückt?
- Abgefragt wird:
- Ist CJ an einem der folgenden Orten ?
- ( Im Sinne von ODER )
- Abgefragt wird:
- Ist CJ an keinem der folgenden Orten ?
- ( Im Sinne von UND )
- Für die meisten Frage-codes gibts auch den dazugehörigen Gegenteil-Frage-code
- Beispiel:
- Wir betrachten nur die Opcodes:
- 00E1: / 80E1:
- und erkennen daß die erste Ziffer bei normaler Frage 0 ist,
- und bei Nein- Frage 8
- Es ist vielleicht aufgefallen, daß der Variable-Name für die Player-Figur
- einmal $PLAYER_CHAR und ein anderesmal $PLAYER_ACTOR heißt.
- Der Player-Status wird zu Beginn der Main ins Leben gerufen
- Es gibt codes, die nur für den Player anwendbar sind
- z.B.
- 01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
- viele andere codes dagegen können allgemein für alle actor (peds) verwendet werden.
- Dazu wurde der Player einem actor gleichgesetzt.
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
Die Gestaltung der Abfrage (
IF - CHECK)
00D6: if 0 = wenn nur eine Bedingung gestellt wird
00D6: if 1 = wenn 2 Bedingungen zutfeffen müssen im Sinne von " UND "
00D6: if 2 = wenn 3 Bedingungen zutfeffen müssen im Sinne von " UND "
00D6: if 21 = wenn 2 Bedingungen zutfeffen müssen im Sinne von " ODER "
00D6: if 27 = wenn 8 Bedingungen zutfeffen müssen im Sinne von " ODER "
00D6: if 1
80DF: NOT actor $PLAYER_ACTOR driving
00E1: key_pressed 0 10
004D: jump_if_false ££Label
00D6: if 21
0154: actor $PLAYER_ACTOR in_zone 'MEAD'
0154: actor $PLAYER_ACTOR in_zone 'VE'
004D: jump_if_false ££Label
00D6: if 3
0038: $ON_MISSION == 0 ;; integer values
8119: NOT car @1 wrecked
82BF: NOT car @1 sunk
80E1: NOT key_pressed 0 11
004D: jump_if_false ££Label
00D6: if 25
00FE: actor $PLAYER_ACTOR 0 ()near_point 2402.664 -1712.32 14.20 radius 5.0 5.0 3.0
00FE: actor $PLAYER_ACTOR 0 ()near_point -1799.58 1202.5 24.10 radius 5.0 5.0 3.0
00FE: actor $PLAYER_ACTOR 0 ()near_point -368.3978 -1428.692 25.72 radius 5.0 5.0 3.0
00FE: actor $PLAYER_ACTOR 0 ()near_point 1579.101 -1635.873 13.56 radius 5.0 5.0 3.0
00FE: actor $PLAYER_ACTOR 0 ()near_point -2574.808 1151.744 55.70 radius 5.0 5.0 3.0
00FE: actor $PLAYER_ACTOR 0 ()near_point 2037.362 2724.411 10.82 radius 5.0 5.0 3.0
004D: jump_if_false ££Label
00D6: if 5
80EC: NOT actor $PLAYER_ACTOR 0 ()near_point 2402.664 -1712.32 radius 10.5 10.5
80EC: NOT actor $PLAYER_ACTOR 0 ()near_point -1799.5 1202.5 radius 10.5 10.5
80EC: NOT actor $PLAYER_ACTOR 0 ()near_point -368.3978 -1428.692 radius 10.5 10.5
80EC: NOT actor $PLAYER_ACTOR 0 ()near_point 1579.101 -1635.873 radius 10.5 10.5
80EC: NOT actor $PLAYER_ACTOR 0 ()near_point -2574.808 1151.744 radius 10.5 10.5
80EC: NOT actor $PLAYER_ACTOR 0 ()near_point 2037.362 2724.411 radius 10.5 10.5
004D: jump_if_false ££Label
00E1: key_pressed 0 10
und
80E1: NOT key_pressed 0 11
0053: $PLAYER_CHAR = create_player #NULL at 920.22 2012.941 11.15
01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
Das Script erweitern
- Durch Verkettung:
- Dazu kopieren wir aus dem Thread den Aktionsabschnitt
- und fügen eine neue Adresse hinzu
- :Teleport_3
- 00D6: if 0
- 00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
- 004D: jump_if_false ££Teleport_2
- 00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
- 0002: jump ££Teleport_2
- Dann ändern wir die Jump-Anweisung der "jump_if_false"-code-Zeile aus dem ersten Abschnitt,
- daß sie zur neuen Adresse verweist.
- Dann noch neue Koordinaten und schon haben wir 2 Teleports
- Das lässt sich so x-beliebig fortsetzen
- Durch Hinzufügen eines weiteren Loops
- Es kann vorkommen, daß man aus einem Loop herausspringen muß,
- um sich von dessen Wirkungsbereich zu lösen.
- Als Beispiel ändern wir put_actor-code in eine kleine Animation
- Der Player hält jetzt fortwährend die Hand hoch, so lange er im "near_point_on_foot"-Bereich steht.
- Er soll es aber nur einmal machen.
- Dazu lassen wir den code in einen neuen Loop springen
- Der neue Loop hat dann genauso zu beginnen wie der Thread
- 1.Die LOOP-Adresse
- 2.Der Wait-code
- 3.Der "if-player-defined-check"
- Jetzt springt der code durch die Jump-Anweisung nach der Animation
zur neuen Loop-Adresse (:Teleport_3)
und durchläuft nur den zweiten Loop solange bis sich der Player nichtmehr im "near_point_on_foot"-Berreich befindet.
Der radius des "near_point_on_foot"-Berreich wurde auch vergrößert um eine Überschneidung zu vermeiden
Der Player hebt nur einmal die Hand und muss erst ein Stück weglaufen, damit die rote Sphere wieder aktiv wird.
Die Jump-Anweisung am Ende verweist wieder zur ersten LOOP-Adresse
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
0002: jump ££Teleport_2
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_3
00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
0002: jump ££Teleport_2
:Teleport_3
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2530.5 -1678.5 19.95 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
00A1: put_actor $PLAYER_ACTOR at 2512.5 -1670.5 13.5
0002: jump ££Teleport_2
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_3
00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
0002: jump ££Teleport_2
:Teleport_3
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2530.5 -1678.5 19.95 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_4
00A1: put_actor $PLAYER_ACTOR at 2512.5 -1670.5 13.5
0002: jump ££Teleport_2
:Teleport_4
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2507.5 -1673.5 13.4 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_5
00A1: put_actor $PLAYER_ACTOR at 2490.5 -1717.5 18.6
0002: jump ££Teleport_2
:Teleport_5
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2504.5 -1719.5 18.6 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
00A1: put_actor $PLAYER_ACTOR at 2497.5 -1681.5 13.4
0002: jump ££Teleport_2
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
05C2: show_the_finger $PLAYER_ACTOR
0002: jump ££Teleport_2
:Teleport_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TELE'
:Teleport_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Teleport_2
05C2: show_the_finger $PLAYER_ACTOR
0002: jump ££Teleport_3
:Teleport_3
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Teleport_3
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2493.5 -1682.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££Teleport_3
0002: jump ££Teleport_2
Modelle einsetzen
- Die Benutzung von Modellen erfordert 5 Aktionen
- special_actor
- Ped-Gruppe
- Waffe für den actor
- Tuningteile
- Objekte
- Mit Modelle sind Fahrzeuge, Peds, Waffen, Objekte und Tuningteile gemeint
Fahrzeuge werden im script car genannt(nur in speziellen codes wird "bike", "boat", "heli","hydra" oder "plane" benutzt)
Peds werden im script actor genannt
Waffen, weapon
Die Benutzung von Modellen erfordert 5 Aktionen 1.Um ein Modell einsetzen zu können, muss man zuerst deren Datei anfordern - 2.Dann, und das ist besonders wichtig,
muss in einem kleinen Extra-Loop geprüft werden ob die Datei geladen wurde und verfügbar ist - Diesen kleinen Loop nennnen wir den Load_Model_Check
Ein "if-player-defined-check" ist dabei nicht nötig
Aber der wait-code ist absolut wichtig - 3.Sobald die Datei verfügbar ist, können wir sie im Spiel einsetzen
- Das Modell wird dann mit einem Variable-Namen definiert
- 4. Wenn die Datei jetzt nicht mehr zur Verfügung
stehen muss,
dann geben wir das an, um die Game-Engine zu entlasten - 5.Wenn das eingesetzte Modell im Script nicht mehr gebraucht wird,
- dann entlassen wir es
- Nun ist das Modell weiterhin im Spiel, kann aber im Script nicht mehr kommandiert werden
- Alternativ kann man es auch ganz löschen, mit
- Waffen muß man nicht entlassen. Das übernimmt die Exe
- Das Beispiel-Script:
- #INFERNUS ist der
Dateiname des Modells, zur Angabe eines Dateinamens wird ein #
(Raute/hash) davorgestellt
Anstatt des Dateinamens kann auch nur die ID-Nummer eingetragen werden, ohne Verwendung von # (Raute/hash) - Dateiname oder ID-Nummer für ein Fahrzeug
muß auf jedenfall in der VEHICLES.IDE vorkommen
Dateiname oder ID-Nummer für einen actor
muß auf jedenfall in der PEDS.IDE vorkommen
Dateiname oder ID-Nummer für Waffen
muß auf jedenfall in der DEFAULT.IDE vorkommen
bei Einsetzen eines Objektnamens, also auch für Objekt-Pickups muss zusätzlich dieser Name in der
Objektliste (2. Segment) aufgeführt sein
das gleiche gilt für Tuning parts (Anbauteile für Fahrzeuge) - bei Einsetzen der ID-Nummer von Objekten, also auch für Objekt-Pickups muss diese Nummer in einer der IDE-Dateien vorhanden sein
- Pickups und Parked cars
- Das Einsetzen von actors, die in der PEDS.IDE definiert sind
erfolgt auf die gleiche Weise wie beim car
Zusätzlich gibt es noch spezielle actors, die Story-Charaktere
Diese werden als special_actor geladen
Den einzutregenden Namen muss man in der gta3.img suchen - 1.
- 2.
- 3.
- 4.
- 5.
0247: request_model #INFERNUS
:Load_Model_Check
0001: wait 0 ms
00D6: if 0
0248: model #INFERNUS available
004D: jump_if_false ££Load_Model_Check
00A5: $Auto1 = create_car #INFERNUS at 2487.5 -1660.5 13.35
0175: set_car $Auto1 z_angle_to 90.0
0249: release_model #INFERNUS
01C3: remove_references_to_car $Auto1 ;; Like turning a car into any random car
00A6: destroy_car $Auto1
:3dModels_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'MODL'
:3dModels_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££3dModels_2
0247: request_model #INFERNUS
:Load_Model_Check
0001: wait 0 ms
00D6: if 0
0248: model #INFERNUS available
004D: jump_if_false ££Load_Model_Check
00A5: $Auto1 = create_car #INFERNUS at 2487.5 -1660.5 13.35
0175: set_car $Auto1 z_angle_to 90.0
0249: release_model #INFERNUS
:3dModels_3
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_3
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2491.5 -1667.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££3dModels_3
01C3: remove_references_to_car $Auto1 ;; Like turning a car into any random car
0002: jump ££3dModels_2
:3dModels_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'MODL'
:3dModels_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££3dModels_2
0247: request_model 411
:Load_Model_Check
0001: wait 0 ms
00D6: if 0
0248: model 411 available
004D: jump_if_false ££Load_Model_Check
00A5: $Auto1 = create_car 411 at 2487.5 -1660.5 13.35
0175: set_car $Auto1 z_angle_to 90.0
0249: release_model 411
:3dModels_3
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_3
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2491.5 -1667.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££3dModels_3
01C3: remove_references_to_car $Auto1 ;; Like turning a car into any random car
0002: jump ££3dModels_2
023C: load_special_actor 1 'ogloc'
:Load_special_actor_Check
00D6: if 0
823D: NOT special_actor 1 loaded
004D: jump_if_false ££3dModels_3
023C: load_special_actor 1 'ogloc'
0001: wait 0 ms
0002: jump ££Load_special_actor_Check
009A: $SpA1 = create_actor 24 #SPECIAL01 at 2486.5 -1664.5 13.45
0296: unload_special_actor 1
01C2: remove_references_to_actor $SpA1 ;; Like turning an actor into a random pedestrian
:3dModels_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'MODL'
:3dModels_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££3dModels_2
0247: request_model #INFERNUS
0247: request_model #fam1
023C: load_special_actor 1 'ogloc'
:Load_Model_Check
0001: wait 0 ms
00D6: if 1
0248: model #INFERNUS available
0248: model #fam1 available
004D: jump_if_false ££Load_Model_Check
:Load_special_actor_Check
00D6: if 0
823D: NOT special_actor 1 loaded
004D: jump_if_false ££3dModels_3
023C: load_special_actor 1 'ogloc'
0001: wait 0 ms
0002: jump ££Load_special_actor_Check
:3dModels_3
00A5: $Auto1 = create_car #INFERNUS at 2487.5 -1660.5 13.35
0175: set_car $Auto1 z_angle_to 90.0
0129: $Ped1 = create_actor 8 #fam1 in_car $Auto1 driverseat
009A: $SpA1 = create_actor 24 #SPECIAL01 at 2486.5 -1664.5 13.45
0173: set_actor $SpA1 z_angle_to 180.0
0001: wait 0 ms
0249: release_model #INFERNUS
0249: release_model #fam1
0296: unload_special_actor 1
:3dModels_4
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_4
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2491.5 -1667.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££3dModels_4
01C3: remove_references_to_car $Auto1 ;; Like turning a car into any random car
01C2: remove_references_to_actor $Ped1 ;; Like turning an actor into a random pedestrian
01C2: remove_references_to_actor $SpA1 ;; Like turning an actor into a random pedestrian
0002: jump ££3dModels_2
- Die actors werden einer Ped-Gruppe zugeordnet
Z.B. der Gruppe 8 - Diese Gruppierung stimmt nicht mit den Zahlen der Gruppierung in der pedgrp.dat überein
Gruppe 8 ist ein Homie
Gruppe 7 ein feindliches Gangmitglied
Diese haben zusätlich ein unkontrollierbares, exegesteuertes Eigenleben.
In Missionen werden die actor vorwiegend der Gruppe 24 zugeordnet
und agieren somit ohne Eigenleben
0129: $Ped1 = create_actor 8 #fam1 in_car $Auto1 driverseat
0 = PLAYER1
1 = PLAYER2
2 = PLAYER_NETWORK
3 = PLAYER_UNUSED
4 = CIVMALE
5 = CIVFEMALE;;;;;;;;create_actor 5 #GANGRL3
6 = COP
7 = GANG1;;;;;;;;;;;;;create_actor 7 #BALLAS
8 = GANG2;;;;;;;;;;;;;create_actor 8 #FAM1
9 = GANG3
10 = GANG4
11 = GANG5
12 = GANG6
13 = GANG7
14 = GANG8;;;;;;;;;;;;;;;create_actor 14 #LSV3
15 = GANG9;;;;;;;;;;;;;;;;;create_actor 15 #HFYRI
16 = GANG10
17 = DEALER
18 = MEDIC
19 = FIREMAN
20 = CRIMINAL
21 = BUM*
22 = PROSTITUTE;;;;;;;;;;;create_actor 22 #HFYPRO
23 = SPECIAL;;;;;;023C: load_special_actor 1 'JIZZY';;;;;,,create_actor 23 #SPECIAL01
24 = MISSION1
25 = MISSION2;;;;;;;;;create_actor 25 #WBDYG1
26 = MISSION3
27 = MISSION4
28 = MISSION5
29 = MISSION6
30 = MISSION7
31 = MISSION8
- Um dem actor eine Waffe zu geben wird im "give_actor weapon"-code nicht die ID-Nummer des Waffen-Modells eingetragen,
sondern eine spezielle Kennzahl - Zusätlich muss man dem actor noch die Fähigkeit zu treffen zuweisen
Weitere Eigenschaft des actors sind sein Leben und ob er immun gegen Kopfschuss ist
Waffe für den actor
01B2: give_actor $SpA1 weapon 30 ammo 99999 ;; Load the weapon model before using this
02E2: set_actor $SpA1 weapon_accuracy_to 100
0223: set_actor $SpA1 health_to 3000
0446: set_actor_immune_to_headshots $SpA1 0
:3dModels_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'MODL'
:3dModels_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££3dModels_2
0247: request_model #INFERNUS
0247: request_model #fam1
0247: request_model #AK47
023C: load_special_actor 1 'ogloc'
:Load_Model_Check
0001: wait 0 ms
00D6: if 2
0248: model #INFERNUS available
0248: model #fam1 available
0248: model #AK47 available
004D: jump_if_false ££Load_Model_Check
:Load_special_actor_Check
00D6: if 0
823D: NOT special_actor 1 loaded
004D: jump_if_false ££3dModels_3
023C: load_special_actor 1 'ogloc'
0001: wait 0 ms
0002: jump ££Load_special_actor_Check
:3dModels_3
00A5: $Auto1 = create_car #INFERNUS at 2487.5 -1660.5 13.35
0175: set_car $Auto1 z_angle_to 90.0
0129: $Ped1 = create_actor 8 #fam1 in_car $Auto1 driverseat
009A: $SpA1 = create_actor 24 #SPECIAL01 at 2486.5 -1664.5 13.45
0173: set_actor $SpA1 z_angle_to 180.0
01B2: give_actor $SpA1 weapon 30 ammo 99999 ;; Load the weapon model before using this
02E2: set_actor $SpA1 weapon_accuracy_to 100
0223: set_actor $SpA1 health_to 3000
0446: set_actor_immune_to_headshots $SpA1 0
05E2: AS_actor $SpA1 kill_actor $PLAYER_ACTOR
0001: wait 0 ms
0249: release_model #INFERNUS
0249: release_model #fam1
0249: release_model #AK47
0296: unload_special_actor 1
:3dModels_4
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_4
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2491.5 -1667.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££3dModels_4
01C3: remove_references_to_car $Auto1 ;; Like turning a car into any random car
01C2: remove_references_to_actor $Ped1 ;; Like turning an actor into a random pedestrian
01C2: remove_references_to_actor $SpA1 ;; Like turning an actor into a random pedestrian
0002: jump ££3dModels_2
Die speziellen Waffen-Kennzahlen:
Weapon Name - SCM Integer - Model Name
.:Melee:.
Unarmed - 0 - No model, and no need to load it, because it's standard.
Brassknuckles - 1 - BRASSKNUCKLE
Golfclub - 2 - GOLFCLUB
Nightstick - 3 - NITESTICK
Knife - 4 - KNIFECUR
Baseballbat - 5 - BAT
Shovel - 6 - SHOVEL
Poolcue - 7 - POOLCUE
Katana - 8 - KATANA
Chainsaw - 9 - CHNSAW
Dildo 1 - 10 - GUN_DILDO1
Dildo 2 - 11 - GUN_DILDO2
Vibrator 1 - 12 - GUN_VIBE1
Vibrator 2 - 13 - GUN_VIBE2
Flowers - 14 - FLOWERA
Cane - 15 - CANE
.:Thrown Projectiles:.
Grenade - 16 - GRENADE
Teargas - 17 - TEARGAS
Molotov Cocktail - 18 - MOLOTOV
.:Handguns:.
Colt 45 - 22 - COLT45
Silenced Pistol - 23 - SILENCED
Desert Eagle - 24 - DESERT_EAGLE
.:Shotguns:.
Shotgun - 25 - CHROMEGUN
Sawnoff Shotgun - 26 - SAWNOFF
Combat Shotgun - 27 - SHOTGSPA
.:Machine Guns:.
Micro Uzi - 28 - MICRO_UZI
Tec 9 - 32 - TEC9
MP5 - 29 - MP5LNG
.:Assault Rifles:.
AK47 - 30 - AK47
M4 - 31 - M4
.:Heavy Weapons:.
Country Rifle - 33 - c*ntGUN
Sniper Rifle - 34 - SNIPER
Rocket Launcher - 35 - ROCKETLA
Heatseeking Rocket Launcher - 36 - HEATSEEK
Flamethrower - 37 - FLAME
Minigun - 38 - MINIGUN
Satchel Charges - 39 - SATCHEL and BOMB (Detonator)
.:Gameplay Weapons:.
Spraycan - 41 - SPRAYCAN
Fire Extinguisher - 42 - FIRE_EX
Camera - 43 - CAMERA
Night Vision Goggles - 44 - NVGOGGLES
Infrared Goggles - 45 - IRGOGGLES
Parachute - 46 - GUN_PARA
-
Tuningteile
- Der Anbau von Tuningteilen an Autos, erfordet auch wieder
eigene codes zum laden und einsetzen der Modelle
außerdem ist darauf zu achten, daß die Möglichkeit nur für bestimmte Fahrzeuge vorgesehen ist
- bei Einsetzen eines Tuningteil-Namens, muss zusätzlich dieser Name in der
Objektliste (2. Segment) aufgeführt sein - bei Einsetzen der ID-Nummer von Tuningteilen, ist diese Nummer in der veh_mods.ide zu finden
- Eine Info über die Aufschlüsselung der Tuningteil-Namen
findet man auf gta-action - 1.
- 2.
- 3.
- 4.
- 5.
- Weitere Eigenschaften, die man dem Fahrzeug zuordnen kann, ist die Farbe
und, insofern es für das betreffende Auto vorgesehen ist, die Sonderlackierung - Außerdem die Angabe über Lebensdauer oder ob Reifen platzen können
und, insofern es für das betreffende Auto vorgesehen ist, die Sonderlackierung - Bei Fahrzeugen mit Tuningteilen dauerts etwas länger bis sie erscheinen
06E9: request_car_component #hydralics
06E9: request_car_component #NTO_B_S
06E9: request_car_component 1115
:Load_Model_Check
0001: wait 0 ms
00D6: if 2
06EA: car_component_available #hydralics
06EA: car_component_available #NTO_B_S
06EA: car_component_available 1115
004D: jump_if_false ££Load_Model_Check
06E7: $NOS1 = add_car_component #NTO_B_S to_car $Auto1
06E7: $HYD1 = add_car_component #hydralics to_car $Auto1
06E7: $Tune1 = add_car_component 1115 to_car $Auto1
06EB: release_car_component #hydralics
06EB: release_car_component #NTO_B_S
06EB: release_car_component 1115
;Ein Entlassungs-code wie bei den anderen Modellen gibts eigentlich nicht
;man kann ihren Varable-Namen mit Null gleichsetzen
0004: $NOS1 = 0 ;; integer values
0004: $HYD1 = 0 ;; integer values
0004: $Tune1 = 0 ;; integer values
0229: set_car $Auto1 color_to 1 1
06ED: set_car $Auto1 paintjob 1
0224: set_car $Auto1 health_to 5000
053F: set_car $Auto1 tires_vulnerable 0
:3dModels_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'MODL'
:3dModels_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££3dModels_2
0247: request_model #SLAMVAN
0247: request_model #fam1
0247: request_model #AK47
06E9: request_car_component #hydralics
06E9: request_car_component #NTO_B_S
06E9: request_car_component 1115
023C: load_special_actor 1 'ogloc'
:Load_Model_Check
0001: wait 0 ms
00D6: if 5
0248: model #SLAMVAN available
0248: model #fam1 available
0248: model #AK47 available
06EA: car_component_available #hydralics
06EA: car_component_available #NTO_B_S
06EA: car_component_available 1115
004D: jump_if_false ££Load_Model_Check
:Load_special_actor_Check
00D6: if 0
823D: NOT special_actor 1 loaded
004D: jump_if_false ££3dModels_3
023C: load_special_actor 1 'ogloc'
0001: wait 0 ms
0002: jump ££Load_special_actor_Check
:3dModels_3
00A5: $Auto1 = create_car #SLAMVAN at 2487.5 -1660.5 13.35
0175: set_car $Auto1 z_angle_to 180.0
06E7: $NOS1 = add_car_component #NTO_B_S to_car $Auto1
06E7: $HYD1 = add_car_component #hydralics to_car $Auto1
06E7: $Tune1 = add_car_component 1115 to_car $Auto1
0229: set_car $Auto1 color_to 1 1
06ED: set_car $Auto1 paintjob 1
0224: set_car $Auto1 health_to 5000
053F: set_car $Auto1 tires_vulnerable 0
0129: $Ped1 = create_actor 8 #fam1 in_car $Auto1 driverseat
009A: $SpA1 = create_actor 24 #SPECIAL01 at 2486.5 -1664.5 13.45
0173: set_actor $SpA1 z_angle_to 180.0
01B2: give_actor $SpA1 weapon 30 ammo 99999 ;; Load the weapon model before using this
02E2: set_actor $SpA1 weapon_accuracy_to 100
0223: set_actor $SpA1 health_to 3000
0446: set_actor_immune_to_headshots $SpA1 0
05E2: AS_actor $SpA1 kill_actor $PLAYER_ACTOR
0001: wait 0 ms
06EB: release_car_component #hydralics
06EB: release_car_component #NTO_B_S
06EB: release_car_component 1115
0249: release_model #SLAMVAN
0249: release_model #fam1
0249: release_model #AK47
0296: unload_special_actor 1
:3dModels_4
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££3dModels_4
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2491.5 -1667.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££3dModels_4
01C3: remove_references_to_car $Auto1 ;; Like turning a car into any random car
01C2: remove_references_to_actor $Ped1 ;; Like turning an actor into a random pedestrian
01C2: remove_references_to_actor $SpA1 ;; Like turning an actor into a random pedestrian
0002: jump ££3dModels_2
- Objekte
- Den Einsatz von Objekten kann man so gestalten wie bei actors oder Fahrzeugen
- dann mit diesem code
- Oder auf einfachere Weise, dann entfällt der Load_Model_Check
- beim Einsetzen eines Objektnamens, muss dieser Name in der
Objektliste (2. Segment) aufgeführt sein - beim Einsetzen der ID-Nummer von Objekten, muss diese Nummer in einer der IDE-Dateien vorhanden sein
- Objekt-Pickups
- Die objekte verschwinden gerne
das lässt sich mit diesem code verhindern: - Entlassen werden sie dann wieder hiermit
- oder hiermit
- Ein Beisoielscript:
0107: $Ex1 = create_object #BARREL4 at 2487.5 -1660.5 13.35
029B: $Ex1 = init_object #BARREL4 at 2487.5 -1660.5 13.35
01C7: remove_object_from_mission_cleanup_list $Ex1
01C4: remove_references_to_object $Ex1 ;; This object will now disappear when the player looks away
0108: destroy_object $Ex1
:Objekt_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'EXPL'
:Objekt_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Objekt_2
00D6: if 0
00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2486.5 -1670.5 13.35 radius 1.0 1.0 1.0
004D: jump_if_false ££Objekt_2
029B: $Ex1 = init_object #BARREL4 at 2481.5 -1664.5 13.35
0001: wait 0 ms
01C7: remove_object_from_mission_cleanup_list $Ex1
0002: jump ££Objekt_3
:Objekt_3
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Objekt_3
00D6: if 0
80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2486.5 -1670.5 13.35 radius 2.0 2.0 2.0
004D: jump_if_false ££Objekt_3
01C4: remove_references_to_object $Ex1 ;; This object will now disappear when the player looks away
0002: jump ££Objekt_2
Lokals and Globals
- Die Verwendung Globaler Varialen treibt den Memorybedarf nach oben
- Verwendet deshalb Lokale Variable
- Außer man möchte im Thread Globale Varialen benutzen, die in einem anderen Thread erstellt wurden
- z.B. $PLAYER_ACTOR
- Ein Script mit Globalen Varialen:
- Ein Auto, ein Homie, steigt ein, fährt ein Stück, steigt aus und schießt auf CJ
- Das selbe Script mit Lokalen Variable:
:Action;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'AKT'
:StartLoop_1
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££StartLoop_1
00D6: if 0
00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_point 2498.84 -1666.013 13.4 radius 3.0 3.0 3.0
004D: jump_if_false ££StartLoop_1
0247: request_model #COLT45
0247: request_model #FAM1
0247: request_model #BULLET
:LoadModel_1
0001: wait 0 ms
00D6: if 2
0248: model #COLT45 available
0248: model #FAM1 available
0248: model #BULLET available
004D: jump_if_false ££LoadModel_1
009A: $ped1 = create_actor 24 #fam1 at 2472.02 -1668.41 13.4
0173: set_actor $ped1 z_angle_to 270.0
01B2: give_actor $ped1 weapon 22 ammo 99999 ;; Load the weapon model before using this
00A5: $car1 = create_car #BULLET at 2472.4994 -1659.546 13.4
0175: set_car $car1 z_angle_to 205.0
0249: release_model #fam1
0249: release_model #BULLET
0249: release_model #COLT45
05CB: AS_actor $ped1 enter_car_as_driver $car1 delay 10000
:Loop_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 1
8119: NOT car $car1 wrecked
8118: NOT actor $ped1 dead
004D: jump_if_false ££Bereinigung1
00D6: if 0
00DB: actor $ped1 in_car $car1
004D: jump_if_false ££Loop_2
00A7: car $car1 drive_to 2502.112 -1664.745 13.4
00AD: set_car $car1 max_speed_to 20.0
:Loop_3
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 1
8119: NOT car $car1 wrecked
8118: NOT actor $ped1 dead
004D: jump_if_false ££Bereinigung1
00D6: if 0
01AF: car $car1 0 ()near_point 2502.112 -1664.745 13.4 radius 2.0 2.0 2.0
004D: jump_if_false ££Loop_3
0633: AS_actor $ped1 exit_vehicle
:Loop_4
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 1
8119: NOT car $car1 wrecked
8118: NOT actor $ped1 dead
004D: jump_if_false ££Bereinigung1
00D6: if 0
80DB: NOT actor $ped1 in_car $car1
004D: jump_if_false ££Loop_4
05E2: AS_actor $ped1 kill_actor $PLAYER_ACTOR
:Loop_5
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 21
0119: car $car1 wrecked
0118: actor $ped1 dead
004D: jump_if_false ££Loop_5
:Bereinigung1
01C2: remove_references_to_actor $ped1 ;; Like turning an actor into a random pedestrian
01C3: remove_references_to_car $car1 ;; Like turning a car into any random car
0002: jump ££StartLoop_1
:Action;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'AKT'
:StartLoop_1
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££StartLoop_1
00D6: if 0
00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_point 2498.84 -1666.013 13.4 radius 3.0 3.0 3.0
004D: jump_if_false ££StartLoop_1
0247: request_model #COLT45
0247: request_model #FAM1
0247: request_model #BULLET
:LoadModel_1
0001: wait 0 ms
00D6: if 2
0248: model #COLT45 available
0248: model #FAM1 available
0248: model #BULLET available
004D: jump_if_false ££LoadModel_1
009A: @1 = create_actor 24 #fam1 at 2472.02 -1668.41 13.4
0173: set_actor @1 z_angle_to 270.0
01B2: give_actor @1 weapon 22 ammo 99999 ;; Load the weapon model before using this
00A5: @2 = create_car #BULLET at 2472.4994 -1659.546 13.4
0175: set_car @2 z_angle_to 205.0
0249: release_model #fam1
0249: release_model #BULLET
0249: release_model #COLT45
05CB: AS_actor @1 enter_car_as_driver @2 delay 10000
:Loop_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 1
8119: NOT car @2 wrecked
8118: NOT actor @1 dead
004D: jump_if_false ££Bereinigung1
00D6: if 0
00DB: actor @1 in_car @2
004D: jump_if_false ££Loop_2
00A7: car @2 drive_to 2502.112 -1664.745 13.4
00AD: set_car @2 max_speed_to 20.0
:Loop_3
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 1
8119: NOT car @2 wrecked
8118: NOT actor @1 dead
004D: jump_if_false ££Bereinigung1
00D6: if 0
01AF: car @2 0 ()near_point 2502.112 -1664.745 13.4 radius 2.0 2.0 2.0
004D: jump_if_false ££Loop_3
0633: AS_actor @1 exit_vehicle
:Loop_4
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 1
8119: NOT car @2 wrecked
8118: NOT actor @1 dead
004D: jump_if_false ££Bereinigung1
00D6: if 0
80DB: NOT actor @1 in_car @2
004D: jump_if_false ££Loop_4
05E2: AS_actor @1 kill_actor $PLAYER_ACTOR
:Loop_5
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 21
0119: car @2 wrecked
0118: actor @1 dead
004D: jump_if_false ££Loop_5
:Bereinigung1
01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
01C3: remove_references_to_car @2 ;; Like turning a car into any random car
0002: jump ££StartLoop_1
Math-Coding
- Math-Coding bedeuted die Verwendung von Gleichungen, Verrechnung von Werten
- oder um Werte variabel übergeben zu können,
- sowie Zeitabläufe steuern oder einfach um Schalter einzubauen.
- Schalter
- Koordinaten auslesen und als Variable verwenden
- Math-codes richtig anwenden
- die Koordinatenanzeige
- Sequenzen scripten
- Frei bewegliche Kamera
-
Schalter
- Das obige Script läuft in 5 Loops,
- da es 5 Stadien durchläuft.
- Mit Anwendung von Kennungen lassen sich die 5 Stadien in einem Loop verschalten.
- Zur Verdeutlichung benutze ich jetzt bewusst eine Globale Variable
:Action;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'AKT'
0004: $Schalter1 = 0 ;; integer values
:StartLoop_1
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££StartLoop_1
00D6: if 0
0038: $Schalter1 == 0 ;; integer values
004D: jump_if_false ££Abschnitt_2
00D6: if 0
00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_point 2498.84 -1666.013 13.4 radius 3.0 3.0 3.0
004D: jump_if_false ££StartLoop_1
0247: request_model #COLT45
0247: request_model #FAM1
0247: request_model #BULLET
:LoadModel_1
0001: wait 0 ms
00D6: if 2
0248: model #COLT45 available
0248: model #FAM1 available
0248: model #BULLET available
004D: jump_if_false ££LoadModel_1
0004: $Schalter1 = 1 ;; integer values
009A: @1 = create_actor 24 #fam1 at 2472.02 -1668.41 13.4
0173: set_actor @1 z_angle_to 270.0
01B2: give_actor @1 weapon 22 ammo 99999 ;; Load the weapon model before using this
00A5: @2 = create_car #BULLET at 2472.4994 -1659.546 13.4
0175: set_car @2 z_angle_to 205.0
0249: release_model #fam1
0249: release_model #BULLET
0249: release_model #COLT45
05CB: AS_actor @1 enter_car_as_driver @2 delay 10000
:Abschnitt_2
00D6: if 2
8119: NOT car @2 wrecked
8118: NOT actor @1 dead
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Bereinigung1
00D6: if 0
0038: $Schalter1 == 1 ;; integer values
004D: jump_if_false ££Abschnitt_3
00D6: if 0
00DB: actor @1 in_car @2
004D: jump_if_false ££StartLoop_1
0004: $Schalter1 = 2 ;; integer values
00A7: car @2 drive_to 2502.112 -1664.745 13.4
00AD: set_car @2 max_speed_to 20.0
:Abschnitt_3
00D6: if 0
0038: $Schalter1 == 2 ;; integer values
004D: jump_if_false ££Abschnitt_4
00D6: if 0
01AF: car @2 0 ()near_point 2502.112 -1664.745 13.4 radius 2.0 2.0 2.0
004D: jump_if_false ££StartLoop_1
0004: $Schalter1 = 3 ;; integer values
0633: AS_actor @1 exit_vehicle
:Abschnitt_4
00D6: if 0
0038: $Schalter1 == 3 ;; integer values
004D: jump_if_false ££StartLoop_1
00D6: if 0
80DB: NOT actor @1 in_car @2
004D: jump_if_false ££StartLoop_1
0004: $Schalter1 = 4 ;; integer values
05E2: AS_actor @1 kill_actor $PLAYER_ACTOR
0002: jump ££StartLoop_1
:Bereinigung1
01C2: remove_references_to_actor @1 ;; Like turning an actor into a random pedestrian
01C3: remove_references_to_car @2 ;; Like turning a car into any random car
0004: $Schalter1 = 0 ;; integer values
0002: jump ££StartLoop_1
-
Koordinaten auslesen und als Variable verwenden
- Der create_coordinate-from_actor-offset-code ermittelt die Koordinaten
- einer Stelle relativ zum Player-Achsen-Mittelpunkt
- In den Parametern hinter "offset" wird die X/Y/Z- Verschiebung zum Player-Achsen-Mittelpunkt eingetragen
- Mit diesem kleinem Script wird eine Jump-Rampe gespawnt
- 14.5 meter vor dem Player und immer im richtigen Ausrichtwinkel
- Dazu ist die "NO"-Taste zu drücken. Im Fahrzeug ist es die "Song überspringen"-Taste
04C4: create_coordinate @11 @12 @13 from_actor $PLAYER_ACTOR offset 0.0 14.5 -2.1
:JumpR_1;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'JPR'
:JumpR_2
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££JumpR_2
00D6: if 0
00E1: key_pressed 0 10
004D: jump_if_false ££JumpR_2
0247: request_model #AD_JUMP
:JumpR_3
0001: wait 0 ms
00D6: if 0
0248: model #AD_JUMP available
004D: jump_if_false ££JumpR_3
0172: @2 = actor $PLAYER_ACTOR z_angle
04C4: create_coordinate @11 @12 @13 from_actor $PLAYER_ACTOR offset 0.0 14.5 -2.1
0107: @1 = create_object #AD_JUMP at @11 @12 @13
0177: set_object @1 z_angle_to @2
0001: wait 0 ms
0249: release_model #AD_JUMP
0001: wait 1000 ms
01C4: remove_references_to_object @1 ;; This object will now disappear when the player looks away
0002: jump ££JumpR_2
-
Math-codes richtig anwenden
- es gibt viel verschieden Math-codes
- und man darf sie auf keinen Fall durcheinander bringen
- Globale Variable die nur mit integeren Werten zusammenarbeiten
- und nur mit Globale Variablen zusammenarbeiten
- das gilt auch für die Frage-codes
- Globale Variable die nur mit Kommagetrennten Werten zusammenarbeiten (floating-points)
- und nur mit Globale Variablen zusammenarbeiten
- das gilt auch für die Frage-codes
- Lokale Variable die nur mit integeren Werten zusammenarbeiten
- und nur mit Lokale Variablen zusammenarbeiten
- das gilt auch für die Frage-codes
- Lokale Variable die nur mit Kommagetrennten Werten zusammenarbeiten (floating-points)
- und nur mit Lokale Variablen zusammenarbeiten
- das gilt auch für die Frage-codes
- es gibt auch codes die Globale mit Lokalen abgleichen
- und welche die floating-points in integere Werte verrechnen
- bei "größer als"-Fragen gibts welche, die fragen ob der Wert größer ist als die Variable
- und welche, die fragen ob die Variable größer ist als der Wert
- und das ist nur ein Bruchteil der Möglichen Varianten
- Die Lokale Variable @33 wird automatisch als Timer benutzt. Sie muss nicht definiert werden sondern ledeglich auf 0 gesetzt. Im Anschluss kann man dann Zeitspannen abfragen. Die Zeit wird als integerer Wert gemessen, 1 = 1/1000 Sekunde
0004: $ON_MISSION = 1 ;; integer values
0058: $Playermoney += $Preis ;; integer values
0038: $ON_MISSION == 0 ;; integer values
0018: $Playermoney > 1500 ;; integer values
003A: $zeit1 == $zeit2 ;; integer values and handles
0005: $PunktX = 10.5 ;; floating-point values
0011: $speed *= 1.38 ;; floating-point values
0059: $Standort += $vorwaerts ;; floating-point values
0042: $PunktX == 1.5 ;; floating-point values
0022: 360.0 > $Winkel ;; floating-point values
0006: @5 = 1 ;; integer values
0062: @5 -= @6 ;; integer values
0039: @7 == 3 ;; integer values
001B: 2000 > @25 ;; integer values
003B: @12 == @11 ;; integer values
0007: @3 = 120.05 ;; floating-point values
0017: @24 /= 1000.0 ;; floating-point values
0087: @8 = @9 ;; floating-point values only
0043: @9 == 1.0 ;; floating-point values
0021: @8 > 47.5 ;; floating-point values
008A: $wert = @27 ;; integer values and handles
0088: $Punkt1 = @10 ;; floating-point values only
008C: $wert1 = float_to_integer $Punkt1
008F: @17 = integer_to_float $wert1
001B: 2000 > @25 ;; integer values
0021: @8 > 47.5 ;; floating-point values
0006: @33 = 0 ;; integer values
:Sequenz
00D6: if 0
001B: 2000 > @33 ;; integer values
004D: jump_if_false ££weiter
-
Koordinatenanzeige
- Die Textdarstellung im Spiel kann keine Kommagetrennten Werte darstellen
- Deshalb muß man die ausgelesenen Koordinaten mit etwas Aufwand umrechnen
- Zuerst mit den entsprechenden Math-codes die floating-point-Werte in Integere Werte verwandeln
- Somit hätten wir eigentich schon die Koordinaten für die Anzeige
- Allerdings werden dann keine Nachkommastellen angezeigt
- Um dies auch noch zu ermöglichen, verwandeln wir die ermittelten Integere Werte wieder um in floating-point-Werte
- Diese nun erhaltenen floating-point-Werte haben dann .00 als Nachkommastellen
- Nun ziehen wir diese floating-point-Werte von den ursprünglich ausgelesenen floating-point-Werte ab
- Als Ergebnis erhalten wir den Wert der Nachkommastellen als floating-point-Werte
- Diese Werte sind kleiner als 1 und somit nicht groß genug für die Umwandlung in Integere Werte
- Also multiplizieren wir sie mit 100 und wandel sie dann um in Integere Werte
- Jetzt müssen wir noch dafür sorgen, daß bei ausgelesenen Minuswerten, die Nachkommastell nicht als Minuswert angezeigt wird
- Die Abfrage, ist 0 größer als der Wert, lässt einen Minuswert in die Umrechnung zum Pluswert
- Der Minuswert wird mit -1 multipliziert
- Dann ist er als Anzeige der Nachkommastelle geeignet
0092: @3 = float_to_integer @0
0093: @6 = integer_to_float @3
0063: @0 -= @6 ;; floating-point values
0013: @0 *= 100.0 ;; floating-point values
0092: @11 = float_to_integer @0
00D6: if 0
001B: 0 > @11 ;; integer values
0012: @11 *= -1 ;; integer values
:coords_00;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'COO'
:coords_01
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££coords_01
00A0: store actor $PLAYER_ACTOR position to @0 @1 @2
0092: @3 = float_to_integer @0
0092: @4 = float_to_integer @1
0092: @5 = float_to_integer @2
0093: @6 = integer_to_float @3
0093: @7 = integer_to_float @4
0093: @8 = integer_to_float @5
0063: @0 -= @6 ;; floating-point values
0063: @1 -= @7 ;; floating-point values
0063: @2 -= @8 ;; floating-point values
0013: @0 *= 100.0 ;; floating-point values
0013: @1 *= 100.0 ;; floating-point values
0013: @2 *= 100.0 ;; floating-point values
0092: @11 = float_to_integer @0
0092: @12 = float_to_integer @1
0092: @13 = float_to_integer @2
:coords_02
00D6: if 0
001B: 0 > @11 ;; integer values
004D: jump_if_false ££coords_03
0012: @11 *= -1 ;; integer values
:coords_03
00D6: if 0
001B: 0 > @12 ;; integer values
004D: jump_if_false ££coords_04
0012: @12 *= -1 ;; integer values
:coords_04
00D6: if 0
001B: 0 > @13 ;; integer values
004D: jump_if_false ££coords_05
0012: @13 *= -1 ;; integer values
:coords_05
0001: wait 1000 ms
03F0: text_draw_toggle 1
0001: wait 50 ms
03F0: text_draw_toggle 0
0001: wait 50 ms
045A: text_draw_1number 50.0 425.0 'NUMBER' @3 ; value
045A: text_draw_1number 200.0 425.0 'NUMBER' @4 ; value
045A: text_draw_1number 350.0 425.0 'NUMBER' @5 ; value
045A: text_draw_1number 100.0 425.0 'NUMBER' @11 ; value
045A: text_draw_1number 250.0 425.0 'NUMBER' @12 ; value
045A: text_draw_1number 400.0 425.0 'NUMBER' @13 ; value
0002: jump ££coords_01
-
Sequenzen
- Im folgenden Script macht der Player Gesprächsgestik und spricht per Tastendruck
- Zur Koordination der Dialog-Sounds müssen Zeitsequenzen abgefragt werden
- Das Laden und abspielen der Sounds übernimmt ein zweiter Thread, der schon in der original Main für diesen Zweck existiert
- Zu Fuß die "Nein"-Taste drücken, dann setzt er sich und spricht
- Zu Fuß die "Ja"-Taste drücken, dann spricht er im Stehen
- Zum Abrechen eine von Enter, sprinten, springen, vor, zurück, rechts, links oder Aktion drücken
- Die Lokale Variable @33 wird automatisch als Timer benutzt. Sie muss nicht definiert werden sondern ledeglich auf 0 gesetzt. Im Anschluss kann man dann Zeitspannen abfragen. Die Zeit wird als integerer Wert gemessen, 1 = 1/1000 Sekunde
- zusätlich sind Schalter in die Zeitabfrage integriert
0006: @33 = 0 ;; integer values
:Sequenz
00D6: if 0
001B: 2000 > @33 ;; integer values
004D: jump_if_false ££weiter
:CJtalk_00;;;--------------------------MB0.33/sascm.ini vom 1.Sep.2005
03A4: name_thread 'TALK'
0001: wait 1000 ms
0004: $1219 = 0 ;; integer values
0004: $vseq1 = 0 ;; integer values
0004: $vseq2 = 0 ;; integer values
:CJtalk_01
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££CJtalk_01
00D6: if 0
80DF: NOT actor $PLAYER_ACTOR driving
;0038: $ON_MISSION == 0 ;; integer values
004D: jump_if_false ££CJtalk_01
00D6: if 1
03EE: player $PLAYER_CHAR controllable
09E7: $PLAYER_CHAR;;not_frozen (if)
004D: jump_if_false ££CJtalk_01
00D6: if 0
00E1: key_pressed 0 10
004D: jump_if_false ££CJtalk_05
0826: toggle_hud 0
0581: toggle_radar 0 (off)
0002: jump ££CJtalk_20
:CJtalk_05
00D6: if 0
00E1: key_pressed 0 11
004D: jump_if_false ££CJtalk_01
0826: toggle_hud 0
0581: toggle_radar 0 (off)
0002: jump ££CJtalk_25
:CJtalk_20
04ED: load_animation "GANGS"
04ED: load_animation "MISC"
:CJtalk_21
0001: wait 0 ms
00D6: if 1
04EE: animation "GANGS" loaded
04EE: animation "MISC" loaded
004D: jump_if_false ££CJtalk_22
0002: jump ££CJtalk_23
:CJtalk_22
04ED: load_animation "GANGS"
04ED: load_animation "MISC"
0002: jump ££CJtalk_21
:CJtalk_23
0172: @5 = actor $PLAYER_ACTOR z_angle
000B: @5 += 180.1 ;; floating-point values
05D4: unknown_action_sequence $PLAYER_ACTOR unknown_angle @5
0001: wait 800 ms
0605: actor $PLAYER_ACTOR perform_animation_sequence "SEAT_TALK_01" from_file "MISC" 4.0 1 0 0 0 -1 ms
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 14017
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0004: $vseq1 = 1 ;; integer values
0004: $vseq2 = 0 ;; integer values
0006: @33 = 0 ;; integer values
0002: jump ££CJtalk_31
:CJtalk_25
04ED: load_animation "GANGS"
04ED: load_animation "MISC"
:CJtalk_26
0001: wait 0 ms
00D6: if 1
04EE: animation "GANGS" loaded
04EE: animation "MISC" loaded
004D: jump_if_false ££CJtalk_27
0002: jump ££CJtalk_28
:CJtalk_27
04ED: load_animation "GANGS"
04ED: load_animation "MISC"
0002: jump ££CJtalk_26
:CJtalk_28
0605: actor $PLAYER_ACTOR perform_animation_sequence "PRTIAL_GNGTLKC" from_file "GANGS" 4.0 1 0 0 0 -1 ms
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 24800
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0004: $vseq2 = 0 ;; integer values
0004: $vseq1 = 0 ;; integer values
0006: @33 = 0 ;; integer values
:CJtalk_29
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££CJtalk_29
00D6: if 0
80DF: NOT actor $PLAYER_ACTOR driving
03EE: player $PLAYER_CHAR controllable
09E7: $PLAYER_CHAR;;not_frozen (if)
004D: jump_if_false ££CJtalk_51
00D6: if 1
0038: $vseq2 == 0 ;; integer values
0019: @33 > 5000 ;; integer values
004D: jump_if_false ££CJtalk_29
0004: $vseq2 = 1 ;; integer values
0968: $PLAYER_ACTOR;stop_mouth
0687: $PLAYER_ACTOR;clear_actor_task
0002: jump ££CJtalk_31
:CJtalk_31
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££CJtalk_31
00D6: if 0
80DF: NOT actor $PLAYER_ACTOR driving
03EE: player $PLAYER_CHAR controllable
09E7: $PLAYER_CHAR;;not_frozen (if)
004D: jump_if_false ££CJtalk_51
00D6: if 25
00E1: key_pressed 0 14
00E1: key_pressed 0 15
00E1: key_pressed 0 16
00E1: key_pressed 0 4
00E1: key_pressed 0 1
00E1: key_pressed 0 0
004D: jump_if_false ££CJtalk_35
0002: jump ££CJtalk_51
:CJtalk_35
00D6: if 0
00E1: key_pressed 0 10
004D: jump_if_false ££CJtalk_37
0004: $vseq2 = 0 ;; integer values
0004: $vseq1 = 1 ;; integer values
0006: @33 = 0 ;; integer values
0687: $PLAYER_ACTOR;clear_actor_task
04EB: action_sequence actor $PLAYER_ACTOR 0
0172: @5 = actor $PLAYER_ACTOR z_angle
000B: @5 += 180.1 ;; floating-point values
05D4: unknown_action_sequence $PLAYER_ACTOR unknown_angle @5
0001: wait 700 ms
0605: actor $PLAYER_ACTOR perform_animation_sequence "SEAT_TALK_01" from_file "MISC" 4.0 1 0 0 0 -1 ms
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 14017
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0002: jump ££CJtalk_43
:CJtalk_37
00D6: if 0
00E1: key_pressed 0 11
004D: jump_if_false ££CJtalk_43
00D6: if 21
0038: $vseq2 == 0 ;; integer values
0038: $vseq2 == 1 ;; integer values
004D: jump_if_false ££CJtalk_38
0605: actor $PLAYER_ACTOR perform_animation_sequence "PRTIAL_GNGTLKC" from_file "GANGS" 4.0 1 0 0 0 1000 ms
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 27801
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0006: @33 = 0 ;; integer values
0004: $vseq2 = 2 ;; integer values
:CJtalk_38
00D6: if 1
0038: $vseq2 == 2 ;; integer values
0019: @33 > 2000 ;; integer values
004D: jump_if_false ££CJtalk_39
0006: @33 = 0 ;; integer values
0004: $vseq2 = 3 ;; integer values
0968: $PLAYER_ACTOR;stop_mouth
0687: $PLAYER_ACTOR;clear_actor_task
0002: jump ££CJtalk_31
:CJtalk_39
00D6: if 0
0038: $vseq2 == 3 ;; integer values
004D: jump_if_false ££CJtalk_40
0605: actor $PLAYER_ACTOR perform_animation_sequence "PRTIAL_GNGTLKC" from_file "GANGS" 4.0 1 0 0 0 3000 ms
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 26203
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0006: @33 = 0 ;; integer values
0004: $vseq2 = 4 ;; integer values
:CJtalk_40
00D6: if 1
0038: $vseq2 == 4 ;; integer values
0019: @33 > 3000 ;; integer values
004D: jump_if_false ££CJtalk_41
0006: @33 = 0 ;; integer values
0004: $vseq2 = 5 ;; integer values
0968: $PLAYER_ACTOR;stop_mouth
0687: $PLAYER_ACTOR;clear_actor_task
0002: jump ££CJtalk_31
:CJtalk_41
00D6: if 0
0038: $vseq2 == 5 ;; integer values
004D: jump_if_false ££CJtalk_42
0605: actor $PLAYER_ACTOR perform_animation_sequence "PRTIAL_GNGTLKC" from_file "GANGS" 4.0 1 0 0 0 2000 ms
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 26406
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0006: @33 = 0 ;; integer values
0004: $vseq2 = 6 ;; integer values
:CJtalk_42
00D6: if 1
0038: $vseq2 == 6 ;; integer values
0019: @33 > 2000 ;; integer values
004D: jump_if_false ££CJtalk_31
0006: @33 = 0 ;; integer values
0004: $vseq2 = 1 ;; integer values
0968: $PLAYER_ACTOR;stop_mouth
0687: $PLAYER_ACTOR;clear_actor_task
0002: jump ££CJtalk_31
:CJtalk_43
00D6: if 0
0038: $vseq2 == 0 ;; integer values
004D: jump_if_false ££CJtalk_31
00D6: if 1
0038: $vseq1 == 1 ;; integer values
0019: @33 > 1000 ;; integer values
004D: jump_if_false ££CJtalk_44
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 10658
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0006: @33 = 0 ;; integer values
0004: $vseq1 = 2 ;; integer values
0002: jump ££CJtalk_31
:CJtalk_44
00D6: if 1
0038: $vseq1 == 2 ;; integer values
0019: @33 > 4000 ;; integer values
004D: jump_if_false ££CJtalk_45
0006: @33 = 0 ;; integer values
0004: $vseq1 = 3 ;; integer values
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 17438
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0002: jump ££CJtalk_31
:CJtalk_45
00D6: if 1
0038: $vseq1 == 3 ;; integer values
0019: @33 > 3000 ;; integer values
004D: jump_if_false ££CJtalk_46
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 13215
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0006: @33 = 0 ;; integer values
0004: $vseq1 = 4 ;; integer values
0002: jump ££CJtalk_31
:CJtalk_46
00D6: if 1
0038: $vseq1 == 4 ;; integer values
0019: @33 > 3000 ;; integer values
004D: jump_if_false ££CJtalk_47
04AE: unknown $ACTOR_SPEECH_WAV_FILE radar_icon_or_model 8270
004F: create_thread ££AUDIOL_1 $PLAYER_ACTOR 0 1 1 0
0006: @33 = 0 ;; integer values
0004: $vseq1 = 5 ;; integer values
0002: jump ££CJtalk_31
:CJtalk_47
00D6: if 1
0038: $vseq1 == 5 ;; integer values
0019: @33 > 4000 ;; integer values
004D: jump_if_false ££CJtalk_31
0006: @33 = 0 ;; integer values
0004: $vseq1 = 1 ;; integer values
0002: jump ££CJtalk_31
:CJtalk_51
0968: $PLAYER_ACTOR;stop_mouth
0687: $PLAYER_ACTOR;clear_actor_task
04EB: action_sequence actor $PLAYER_ACTOR 0
0004: $vseq1 = 0 ;; integer values
0004: $vseq2 = 0 ;; integer values
0006: @33 = 0 ;; integer values
0001: wait 1000 ms
04EF: release_animation "GANGS"
04EF: release_animation "MISC"
0826: toggle_hud 1
0581: toggle_radar 1 (on)
0002: jump ££CJtalk_01
;;;----------------------------------------------------------------------
;;;--------- Dieser Thread vvv ist in der original Main schon vorhanden--;----MB0.33/sascm.ini vom 1.Sep.2005
:AUDIOL_1
03A4: name_thread 'AUDIOL'
0006: @8 = 0 ;; integer values
00D6: if 0
0039: @8 == -1 ;; integer values
004D: jump_if_false ££AUDIOL_7
009A: @0 = create_actor 4 #MALE01 at 0.0 0.0 0.0
:AUDIOL_7
00D6: if 0
8038: NOT $ACTOR_SPEECH_AUDIO_PLAYING == 0 ;; integer values
004D: jump_if_false ££AUDIOL_25
00D6: if 0
0039: @2 == 1 ;; integer values
004D: jump_if_false ££AUDIOL_24
040D: unload_wav @3
:AUDIOL_14
00D6: if 0
8038: NOT $ACTOR_SPEECH_AUDIO_PLAYING == 0 ;; integer values
004D: jump_if_false ££AUDIOL_23
00D6: if 0
0038: $1035 == 1 ;; integer values
004D: jump_if_false ££AUDIOL_21
0002: jump ££AUDIOL_106
:AUDIOL_21
0001: wait 0 ms
0002: jump ££AUDIOL_14
:AUDIOL_23
0002: jump ££AUDIOL_25
:AUDIOL_24
0002: jump ££AUDIOL_106
:AUDIOL_25
05AA: s@5 = s$ACTOR_SPEECH_GXT_REFERENCE ;; 8-byte strings
008B: @7 = $ACTOR_SPEECH_WAV_FILE ;; integer values and handles
0004: $ACTOR_SPEECH_AUDIO_PLAYING = 1 ;; integer values
:AUDIOL_28
00D6: if 0
0038: $1035 == 1 ;; integer values
004D: jump_if_false ££AUDIOL_32
0002: jump ££AUDIOL_94
:AUDIOL_32
0871: init_jump_table @8 total_jumps 4 0 ££AUDIOL_92 jumps 0 ££AUDIOL_33 1 ££AUDIOL_46 2 ££AUDIOL_72 3 ££AUDIOL_90 -1 ££AUDIOL_92 -1 ££AUDIOL_92 -1 ££AUDIOL_92
:AUDIOL_33
00D6: if 0
0039: @4 == 0 ;; integer values
004D: jump_if_false ££AUDIOL_38
040D: unload_wav @3
03CF: load_wav @7 as @3
:AUDIOL_38
00D6: if 0
8118: NOT actor @0 dead
004D: jump_if_false ££AUDIOL_43
094E: @0 1
0A09: @0 1
:AUDIOL_43
0006: @32 = 0 ;; integer values
000A: @8 += 1 ;; integer values
0002: jump ££AUDIOL_92
:AUDIOL_46
00D6: if 0
03D0: wav @3 loaded
004D: jump_if_false ££AUDIOL_67
00D6: if 0
8118: NOT actor @0 dead
004D: jump_if_false ££AUDIOL_60
00D6: if 0
894D: NOT @0
004D: jump_if_false ££AUDIOL_59
00D6: if 0
0039: @1 == 1 ;; integer values
004D: jump_if_false ££AUDIOL_59
0949: link_wav @3 to_actor @0
:AUDIOL_59
0967: actor @0 move_mouth_for 10000 ms
:AUDIOL_60
03D1: play_wav @3
00D6: if 0
85AE: NOT s@5 == 'DUMMY' ;; 8-byte strings
004D: jump_if_false ££AUDIOL_65
00BC: text_highpriority s@5 10000 ms 1
:AUDIOL_65
000A: @8 += 1 ;; integer values
0002: jump ££AUDIOL_71
:AUDIOL_67
00D6: if 0
0019: @32 > 5000 ;; integer values
004D: jump_if_false ££AUDIOL_71
000A: @8 += 1 ;; integer values
:AUDIOL_71
0002: jump ££AUDIOL_92
:AUDIOL_72
00D6: if 0
03D0: wav @3 loaded
004D: jump_if_false ££AUDIOL_88
00D6: if 0
03D2: wav @3 ended
004D: jump_if_false ££AUDIOL_80
000A: @8 += 1 ;; integer values
0002: jump ££AUDIOL_87
:AUDIOL_80
00D6: if 0
056D: unknown_actor @0 dead_but_valid
004D: jump_if_false ££AUDIOL_87
00D6: if 0
0118: actor @0 dead
004D: jump_if_false ££AUDIOL_87
000A: @8 += 1 ;; integer values
:AUDIOL_87
0002: jump ££AUDIOL_89
:AUDIOL_88
000A: @8 += 1 ;; integer values
:AUDIOL_89
0002: jump ££AUDIOL_92
:AUDIOL_90
0002: jump ££AUDIOL_94
0002: jump ££AUDIOL_92
:AUDIOL_92
0001: wait 0 ms
0002: jump ££AUDIOL_28
:AUDIOL_94
00D6: if 0
8118: NOT actor @0 dead
004D: jump_if_false ££AUDIOL_100
094F: @0
0A09: @0 0
0968: @0
:AUDIOL_100
040D: unload_wav @3
00D6: if 0
85AE: NOT s@5 == 'DUMMY' ;; 8-byte strings
004D: jump_if_false ££AUDIOL_105
03D5: remove_text s@5
:AUDIOL_105
0004: $ACTOR_SPEECH_AUDIO_PLAYING = 0 ;; integer values
:AUDIOL_106
004E: end_thread