Script schreiben

  1. Der Thread ist das Basis-Script in der Main.scm
  2. Die Gestaltung der Abfrage ( IF - CHECK)
  3. Das Script erweitern durch Verkettung
  4. Das Script erweitern durch Hinzufügen eines weiteren Loops
  5. Modelle einsetzen
  1. Vorrausgesetzt wird, daß die vorrangegangenen Themen verstanden wurden
  2. Dieses Kapitel sollte man dann mit Hilfe einer Stripped Main nachvollziehen.
  3. Der Thread ist das Basis-Script in der Main.scm
  4. Er wird in "create_thread", in Missionen oder Externscripten definiert
  5. und bekommt einen Namen
  6. Die threads im Main Part werden mit der create_thread-Zeile definiert
  7. 004F: create_thread ££Teleport_1
  8. 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)
  9. So wird sie z.B. im Belohnungsabschnitt von diversen Missions-Scripten
  10. gesetzt, um neue Missions-Starter-Threads zu aktivieren.
  11. Dadurch werden neue Missionen freigeschaltet.
  12. Die Thread-Scripte selbst werden in den Main Part eingefügt
  13. Es können mehrere gleichzeit ausgeführt werden. Eigentlich weden sogar alle, die durch create_thread schon gestartet wurden, gleichzeit ausgeführt.
  14. Jedoch rennen sie ledeglich in einer aktionslosen Schleife
  15. Der erste Thread in der Main ist der Main-Thread
  16. Im Main-Thread wird alles initiiert für den weitern Verlauf Spiels.
  17. Im Anschluss zum Main-Thread können dann weitere Threads eingefügt werden
  18. Diese Thread-Variante benutzen wir um Mod-scripte zu entwickeln
  19. Das Thread-Script beginnt mit dem Label (Adress-Name)
  20. mit dem es in der create_thread-Zeile aktiviert wurde.
  21. :Teleport_1
  22. Dannach folgt die Namensgebung für den Thread mit:
  23. 03A4: name_thread 'TELE'

  24. Und jetzt das wichtigste:
  25. 1.Die erste LOOP-Adresse
  26. 2.Der Wait-code
  27. 3.Der "if-player-defined-check"
  28. :Teleport_2
    0001: wait  0 ms
    00D6: if  0
    0256:   player $PLAYER_CHAR defined
    004D: jump_if_false ££Teleport_2
  29. Mit diesem Script-Abschnitt sollte jeder Thread beginnen
  30. LOOP-Adresse bedeutet, daß die Game-Engine beim Durchlesen des Scripts,
  31. wieder zu dieser Adresse zurückspringt.
  32. Sie vollzieht eine Schleife, einen Loop.
  33. In diesem Fall muss der Loop-Adresse unbedingt ein WAIT-code folgen.
  34. wait 0 ms bedeuted daß die Game-Engine 1/1000 Sekunde wartet.
  35. Anschließend muss der "if-player-defined-check" folgen.
  36. Dieser Abfrage-code überprüft, ob die Player-Figur überhaupt vorhanden ist.
  37. Wenn CJ im Spiel stirbt oder Verhaftet wird, wird diese Abfrage verneint.
  38. Dann erst kommen wir zum eigentlichen Inhalt unseres Mod-Scripts
  39. und beginnen natürlich wieder mit einer Abfrage, denn schließlich soll ja erst
  40. eine Bedingung erfüllt werden, um eine Aktion auszulösen,
  41. sonst würde die Game-Engine ja ständig den Aktions-code ausführen.
  42. Es hätte zur Folge, daß wenn man an dieser Stelle ohne eine Bedingung abzufragen,
  43. ein Fahrzeug ins Spiel bringt, endlos Fahrzeuge generiert werden bis das Spiel abstürtzt.
  44. Die Bedingung, die im Teleportscript erfüllt werden soll, ist,
  45. ob sich die Player-Figur an einer bestimmten Stelle befindet.
  46. 00FF:   actor $PLAYER_ACTOR  0 ()near_point_on_foot 2493.5  -1682.5  13.35 radius  1.0  1.0  1.0
  47. Von diesen "near_point"-Frage-codes gibts viele verschiedene Varianten
  48. In den meisten kann man auch den Eintrag so ändern, daß auch gleichzeitig
  49. eine rote Markierung dargestellt wird, im Script-english SPHERE genannnt.
  50. 00FF:   actor $PLAYER_ACTOR  1 (in-sphere)near_point_on_foot 2493.5  -1682.5  13.35 radius  1.0  1.0  1.0
  51. Wenn die Bedingung erfüllt wird, soll die Player-Figur zu einen anderen Ort teleportiert werden.
  52. Und zum Schluss soll die Game-Engine wieder zum Anfang springen, damit das Script weiter aktiv bleibt.
  53. Somit springt sie also wieder zu unserer Loop-Adresse zurück:
  54. 0002: jump ££Teleport_2


  55. Das ganze sieht dann so aus:
  56. :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

  57. Anstatt einer Jump-Anweisung zur Loop-Adresse, am Ende des Scripts
  58. kann man den Thread auch einfach beenden,
  59. mit
  60. 004E: end_thread
  61. Dann wird der Thread für immer beendet und kann wieder mit 004F: create_thread ££Teleport_1 initiiert werden
  62. :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


  63. Eine Abfrage besteht aus mindestens 3 opcodes:
  64. 1. die IF-Variation
  65. 2. die eigentliche Frage
  66. 3. Die Sprunganweisung bei Verneinung

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

    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)
  1. Hier wird die Frage-Variation angegeben
  2. 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 "
    
  3. if 7 und 27 sind maximal möglich
  4. Die Abfragegestaltung ist die schwierigste Thematik beim Scripten und wird gerne falsch gemacht.
  5. Ich selbst bin immer wieder bei Fehlersuche auf falsche IF-Variationen gestoßen.
  6. Ein paar Beispiele:
  7. Abgefragt wird:
  8. Fährt CJ NICHT, UND wird die Taste 10 gedrückt ?
  9. 00D6: if  1
    80DF:   NOT   actor $PLAYER_ACTOR driving
    00E1:   key_pressed  0  10
    004D: jump_if_false ££Label
  10. Abgefragt wird:
  11. Befindet sich CJ in der Zone Verdant Madows, ODER in der Zone Las Venturas ?
  12. 00D6: if  21
    0154:   actor $PLAYER_ACTOR in_zone 'MEAD'
    0154:   actor $PLAYER_ACTOR in_zone 'VE'
    004D: jump_if_false ££Label
  13. Abgefragt wird:
  14. Ist KEINE Mission aktiv UND ist das Fahrzeug NICHT geschrottet
  15. UND NICHT gesunken UND wurde auch NICHT die Taste 11 gedrückt?
  16. 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
  17. Abgefragt wird:
  18. Ist CJ an einem der folgenden Orten ?
  19. ( Im Sinne von ODER )
  20. 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
  21. Abgefragt wird:
  22. Ist CJ an keinem der folgenden Orten ?
  23. ( Im Sinne von UND )
  24. 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
  25. Für die meisten Frage-codes gibts auch den dazugehörigen
  26. Gegenteil-Frage-code
  27. Beispiel:
  28. 00E1: key_pressed 0 10 
    und
    80E1: NOT key_pressed 0 11
  29. Wir betrachten nur die Opcodes:
  30. 00E1: / 80E1:
  31. und erkennen daß die erste Ziffer bei normaler Frage 0 ist,
  32. und bei Nein- Frage 8

  33. Es ist vielleicht aufgefallen, daß der Variable-Name für die Player-Figur
  34. einmal $PLAYER_CHAR und ein anderesmal $PLAYER_ACTOR heißt.
  35. Der Player-Status wird zu Beginn der Main ins Leben gerufen
  36. 0053: $PLAYER_CHAR = create_player #NULL at  920.22  2012.941  11.15
  37. Es gibt codes, die nur für den Player anwendbar sind
  38. z.B.
  39. 01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
  40. viele andere codes dagegen können allgemein für alle actor (peds) verwendet werden.
  41. Dazu wurde der Player einem actor gleichgesetzt.
  42. 01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR


Das Script erweitern

  1. Durch Verkettung:
  2. Dazu kopieren wir aus dem Thread den Aktionsabschnitt
  3. :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
  4. und fügen eine neue Adresse hinzu
  5. :Teleport_3
  6. 00D6: if 0
  7. 00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
  8. 004D: jump_if_false ££Teleport_2
  9. 00A1: put_actor $PLAYER_ACTOR at 2524.5 -1677.5 19.95
  10. 0002: jump ££Teleport_2
  11. Dann ändern wir die Jump-Anweisung der "jump_if_false"-code-Zeile aus dem ersten Abschnitt,
  12. daß sie zur neuen Adresse verweist.
  13. Dann noch neue Koordinaten und schon haben wir 2 Teleports
  14. :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
  15. Das lässt sich so x-beliebig fortsetzen
  16. :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


  17. Durch Hinzufügen eines weiteren Loops
  18. Es kann vorkommen, daß man aus einem Loop herausspringen muß,
  19. um sich von dessen Wirkungsbereich zu lösen.
  20. Als Beispiel ändern wir put_actor-code in eine kleine Animation
  21. :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
  22. Der Player hält jetzt fortwährend die Hand hoch, so lange er im "near_point_on_foot"-Bereich steht.
  23. Er soll es aber nur einmal machen.
  24. Dazu lassen wir den code in einen neuen Loop springen
  25. Der neue Loop hat dann genauso zu beginnen wie der Thread
  26. 1.Die LOOP-Adresse
  27. 2.Der Wait-code
  28. 3.Der "if-player-defined-check"
  29. :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
  30. 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


Modelle einsetzen

  1. Die Benutzung von Modellen erfordert 5 Aktionen
  2. special_actor
  3. Ped-Gruppe
  4. Waffe für den actor
  5. Tuningteile
  6. Objekte

  1. 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. 0247: request_model #INFERNUS

  3. 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
  4. :Load_Model_Check
    0001: wait  0 ms
    00D6: if  0
    0248:   model #INFERNUS available
    004D: jump_if_false ££Load_Model_Check
  5. 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
  6. 3.Sobald die Datei verfügbar ist, können wir sie im Spiel einsetzen
  7. Das Modell wird dann mit einem Variable-Namen definiert
  8. 00A5: $Auto1 = create_car #INFERNUS at 2487.5  -1660.5  13.35
    0175: set_car $Auto1 z_angle_to 90.0

  9. 4. Wenn die Datei jetzt nicht mehr zur Verfügung stehen muss,
    dann geben wir das an, um die Game-Engine zu entlasten
  10. 0249: release_model #INFERNUS

  11. 5.Wenn das eingesetzte Modell im Script nicht mehr gebraucht wird,
  12. dann entlassen wir es
  13. 01C3: remove_references_to_car $Auto1  ;; Like turning a car into any random car
  14. Nun ist das Modell weiterhin im Spiel, kann aber im Script nicht mehr kommandiert werden
  15. Alternativ kann man es auch ganz löschen, mit
  16. 00A6: destroy_car $Auto1
  17. Waffen muß man nicht entlassen. Das übernimmt die Exe
  18. Das Beispiel-Script:
  19. :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


  20. #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)
  21. 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)
  22. bei Einsetzen der ID-Nummer von Objekten, also auch für Objekt-Pickups muss diese Nummer in einer der IDE-Dateien vorhanden sein
  23. Pickups und Parked cars
  24. :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


  25. 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
  26. 1.
  27. 023C: load_special_actor  1 'ogloc'
  28. 2.
  29. :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
  30. 3.
  31. 009A: $SpA1 = create_actor  24 #SPECIAL01 at  2486.5  -1664.5  13.45
  32. 4.
  33. 0296: unload_special_actor  1
  34. 5.
  35. 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


  1. Die actors werden einer Ped-Gruppe zugeordnet
    Z.B. der Gruppe 8
  2. 0129: $Ped1 = create_actor  8 #fam1 in_car $Auto1 driverseat
  3. 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

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


    Waffe für den actor
  1. 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
  2. 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
  3. 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
  4. :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
  1. 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
  2. bei Einsetzen eines Tuningteil-Namens, muss zusätzlich dieser Name in der
    Objektliste (2. Segment) aufgeführt sein
  3. bei Einsetzen der ID-Nummer von Tuningteilen, ist diese Nummer in der veh_mods.ide zu finden
  4. Eine Info über die Aufschlüsselung der Tuningteil-Namen
    findet man auf gta-action
  5. 1.
  6. 06E9: request_car_component #hydralics
    06E9: request_car_component #NTO_B_S
    06E9: request_car_component 1115
  7. 2.
  8. :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
  9. 3.
  10. 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
  11. 4.
  12. 06EB: release_car_component #hydralics
    06EB: release_car_component #NTO_B_S
    06EB: release_car_component 1115
  13. 5.
  14. ;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

  15. Weitere Eigenschaften, die man dem Fahrzeug zuordnen kann, ist die Farbe
    und, insofern es für das betreffende Auto vorgesehen ist, die Sonderlackierung
  16. Außerdem die Angabe über Lebensdauer oder ob Reifen platzen können
    und, insofern es für das betreffende Auto vorgesehen ist, die Sonderlackierung
  17. 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
    
  18. Bei Fahrzeugen mit Tuningteilen dauerts etwas länger bis sie erscheinen
  19. :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


  1. Objekte
  2. Den Einsatz von Objekten kann man so gestalten wie bei actors oder Fahrzeugen
  3. dann mit diesem code
  4. 0107: $Ex1 = create_object #BARREL4 at  2487.5  -1660.5  13.35
  5. Oder auf einfachere Weise, dann entfällt der Load_Model_Check
  6. 029B: $Ex1 = init_object #BARREL4 at 2487.5  -1660.5  13.35
  7. beim Einsetzen eines Objektnamens, muss dieser Name in der
    Objektliste (2. Segment) aufgeführt sein
  8. beim Einsetzen der ID-Nummer von Objekten, muss diese Nummer in einer der IDE-Dateien vorhanden sein
  9. Objekt-Pickups
  10. Die objekte verschwinden gerne
    das lässt sich mit diesem code verhindern:
  11. 01C7: remove_object_from_mission_cleanup_list $Ex1
  12. Entlassen werden sie dann wieder hiermit
  13. 01C4: remove_references_to_object $Ex1  ;; This object will now disappear when the player looks away
  14. oder hiermit
  15. 0108: destroy_object $Ex1
  16. Ein Beisoielscript:
  17. :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
nothing

Lokals and Globals

  1. Die Verwendung Globaler Varialen treibt den Memorybedarf nach oben
  2. Verwendet deshalb Lokale Variable
  3. Außer man möchte im Thread Globale Varialen benutzen, die in einem anderen Thread erstellt wurden
  4. z.B. $PLAYER_ACTOR
  5. Ein Script mit Globalen Varialen:
  6. Ein Auto, ein Homie, steigt ein, fährt ein Stück, steigt aus und schießt auf CJ
  7. :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


  8. Das selbe Script mit Lokalen Variable:
  9. :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

  1. Math-Coding bedeuted die Verwendung von Gleichungen, Verrechnung von Werten
  2. oder um Werte variabel übergeben zu können,
  3. sowie Zeitabläufe steuern oder einfach um Schalter einzubauen.
  1. Schalter
  2. Koordinaten auslesen und als Variable verwenden
  3. Math-codes richtig anwenden
  4. die Koordinatenanzeige
  5. Sequenzen scripten
  6. Frei bewegliche Kamera

    Schalter
  1. Das obige Script läuft in 5 Loops,
  2. da es 5 Stadien durchläuft.
  3. Mit Anwendung von Kennungen lassen sich die 5 Stadien in einem Loop verschalten.
  4. Zur Verdeutlichung benutze ich jetzt bewusst eine Globale Variable
  5. :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
  1. Der create_coordinate-from_actor-offset-code ermittelt die Koordinaten
  2. einer Stelle relativ zum Player-Achsen-Mittelpunkt
  3. In den Parametern hinter "offset" wird die X/Y/Z- Verschiebung zum Player-Achsen-Mittelpunkt eingetragen
  4. 04C4: create_coordinate @11 @12 @13 from_actor $PLAYER_ACTOR offset 0.0 14.5  -2.1
  5. Mit diesem kleinem Script wird eine Jump-Rampe gespawnt
  6. 14.5 meter vor dem Player und immer im richtigen Ausrichtwinkel
  7. Dazu ist die "NO"-Taste zu drücken. Im Fahrzeug ist es die "Song überspringen"-Taste
  8. :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
  1. es gibt viel verschieden Math-codes
  2. und man darf sie auf keinen Fall durcheinander bringen
  3. Globale Variable die nur mit integeren Werten zusammenarbeiten
  4. 0004: $ON_MISSION =  1  ;; integer values
  5. und nur mit Globale Variablen zusammenarbeiten
  6. 0058: $Playermoney += $Preis  ;; integer values
  7. das gilt auch für die Frage-codes
  8. 0038:   $ON_MISSION ==  0  ;; integer values
    0018:   $Playermoney >  1500  ;; integer values
    003A:   $zeit1 == $zeit2  ;; integer values and handles

  9. Globale Variable die nur mit Kommagetrennten Werten zusammenarbeiten (floating-points)
  10. 0005: $PunktX =  10.5  ;; floating-point values
    0011: $speed *= 1.38  ;; floating-point values
  11. und nur mit Globale Variablen zusammenarbeiten
  12. 0059: $Standort += $vorwaerts  ;; floating-point values
  13. das gilt auch für die Frage-codes
  14. 0042:   $PunktX ==  1.5  ;; floating-point values
    0022:    360.0 > $Winkel  ;; floating-point values

  15. Lokale Variable die nur mit integeren Werten zusammenarbeiten
  16. 0006: @5 =  1  ;; integer values
  17. und nur mit Lokale Variablen zusammenarbeiten
  18. 0062: @5 -= @6  ;; integer values
  19. das gilt auch für die Frage-codes
  20. 0039:   @7 ==  3  ;; integer values
    001B:    2000 > @25  ;; integer values 
    003B:   @12 == @11  ;; integer values 

  21. Lokale Variable die nur mit Kommagetrennten Werten zusammenarbeiten (floating-points)
  22. 0007: @3 =  120.05  ;; floating-point values
    0017: @24 /=  1000.0  ;; floating-point values 
  23. und nur mit Lokale Variablen zusammenarbeiten
  24. 0087: @8 = @9  ;; floating-point values only
  25. das gilt auch für die Frage-codes
  26. 0043:   @9 ==  1.0  ;; floating-point values
    0021:   @8 >  47.5  ;; floating-point values

  27. es gibt auch codes die Globale mit Lokalen abgleichen
  28. 008A: $wert = @27  ;; integer values and handles
    0088: $Punkt1 = @10  ;; floating-point values only
  29. und welche die floating-points in integere Werte verrechnen
  30. 008C: $wert1 = float_to_integer $Punkt1
    008F: @17 = integer_to_float $wert1  
  31. bei "größer als"-Fragen gibts welche, die fragen ob der Wert größer ist als die Variable
  32. 001B:    2000 > @25  ;; integer values 
  33. und welche, die fragen ob die Variable größer ist als der Wert
  34. 0021:   @8 >  47.5  ;; floating-point values
  35. und das ist nur ein Bruchteil der Möglichen Varianten
  36. 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
  37. 0006: @33 =  0  ;; integer values
    
    :Sequenz
    00D6: if  0
    001B:    2000 > @33  ;; integer values 
    004D: jump_if_false ££weiter


    Koordinatenanzeige

  1. Die Textdarstellung im Spiel kann keine Kommagetrennten Werte darstellen
  2. Deshalb muß man die ausgelesenen Koordinaten mit etwas Aufwand umrechnen
  3. Zuerst mit den entsprechenden Math-codes die floating-point-Werte in Integere Werte verwandeln
  4. 0092: @3 = float_to_integer @0
  5. Somit hätten wir eigentich schon die Koordinaten für die Anzeige
  6. Allerdings werden dann keine Nachkommastellen angezeigt
  7. Um dies auch noch zu ermöglichen, verwandeln wir die ermittelten Integere Werte wieder um in floating-point-Werte
  8. 0093: @6 = integer_to_float @3
  9. Diese nun erhaltenen floating-point-Werte haben dann .00 als Nachkommastellen
  10. Nun ziehen wir diese floating-point-Werte von den ursprünglich ausgelesenen floating-point-Werte ab
  11. 0063: @0 -= @6  ;; floating-point values
  12. Als Ergebnis erhalten wir den Wert der Nachkommastellen als floating-point-Werte
  13. Diese Werte sind kleiner als 1 und somit nicht groß genug für die Umwandlung in Integere Werte
  14. Also multiplizieren wir sie mit 100 und wandel sie dann um in Integere Werte
  15. 0013: @0 *=  100.0  ;; floating-point values
    0092: @11 = float_to_integer @0
  16. Jetzt müssen wir noch dafür sorgen, daß bei ausgelesenen Minuswerten, die Nachkommastell nicht als Minuswert angezeigt wird
  17. Die Abfrage, ist 0 größer als der Wert, lässt einen Minuswert in die Umrechnung zum Pluswert
  18. 00D6: if  0
    001B:    0 > @11  ;; integer values
  19. Der Minuswert wird mit -1 multipliziert
  20. 0012: @11 *= -1  ;; integer values
  21. Dann ist er als Anzeige der Nachkommastelle geeignet
  22. :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
  1. Im folgenden Script macht der Player Gesprächsgestik und spricht per Tastendruck
  2. Zur Koordination der Dialog-Sounds müssen Zeitsequenzen abgefragt werden
  3. Das Laden und abspielen der Sounds übernimmt ein zweiter Thread, der schon in der original Main für diesen Zweck existiert
  4. Zu Fuß die "Nein"-Taste drücken, dann setzt er sich und spricht
  5. Zu Fuß die "Ja"-Taste drücken, dann spricht er im Stehen
  6. Zum Abrechen eine von Enter, sprinten, springen, vor, zurück, rechts, links oder Aktion drücken
  7. 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
  8. 0006: @33 =  0  ;; integer values
    
    :Sequenz
    00D6: if  0
    001B:    2000 > @33  ;; integer values 
    004D: jump_if_false ££weiter

  9. zusätlich sind Schalter in die Zeitabfrage integriert
  10. :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