______________________________________________________________________________________
The IF - VariationCODE |
if 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 |
By more than one question in an conditional check requires to determine,
if it means if or or if and
CODE |
if and 00DF: actor $PLAYER_ACTOR driving 8119: NOT car 0@ wrecked 004D: jump_if_false @AD_5 |
CODE |
if or 00E1: key_pressed 0 0 00E1: key_pressed 0 1 00E1: key_pressed 0 14 00E1: key_pressed 0 18 004D: jump_if_false @AD_7 |
CODE |
if or 8118: NOT actor 7@ dead 8118: NOT actor 8@ dead 004D: jump_if_false @AD_25 0002: jump @AD_12 |
The most question codes can be changed into the opposite question
by changing the ciro of the opcode into 8 and insert "not" into the code line
exemble:
CODE |
00E1: key_pressed 0 10 |
and
CODE |
80E1: NOT key_pressed 0 11 |
______________________________________________________________________________________
Next Step/ Script structure simpleThe previous scripts ended because of the opcode 0A93: end_custom_thread
Instead let the script ending we use a jump instruction at script end to the 1.Loop adress
So the reading process is permanent looping
And since now we add a check in our loop which we add allways after a Loop adress.
It is:
CODE |
if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @Akt_01 |
It should prevent crashes if the player dies or gets arrested
The "IF Player- Defined-check" should allway be the first check in a loop
Script structure simple with 1 Loop:
-Script head
-1.Loop-Adress
-wait code
-IF player_defined-check
-Conditional Check
-Event
-Normal jump instruction to 1.LoopAdress
CODE |
{$CLEO .cs} :Akt 03A4: name_thread 'AKT'
:Akt_01 0001: wait 0 ms if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @Akt_01 if 0AB0: key_pressed 8//-----------------key = Backspace 004D: jump_if_false @Akt_01 08B2: toggle_thermal_vision 1 0001: wait 3000 ms 08B2: toggle_thermal_vision 0 0002: jump @Akt_01//--------Normal jump instruction to 1.LoopAdress |
Script above activates the Infrarot view after key_press
and toggle back to normal view after 3 seconds
______________________________________________________________________________________
Next Step/ Script structure extendedTo start an event with our script will change the game state and the conditions.
This needs to redirect the reading process to prevent that the same code will be read again.
Therefore we add a second Loop in the script
Loop
1 - before the event
Loop
2 - after the event
Script structure extended with 2 Loops:
-Script head
-1.Loop-Adress
-wait code
-IF player_defined-check
-Conditional Check
-Event
-2.Loop-Adress
-wait code
-IF player_defined-check
-Conditional Check
-Normal jump instruction to 1.LoopAdress
CODE |
{$CLEO .cs} :akt 03A4: name_thread 'AKT'
:akt01//----------------------------1.Loop Adress 0001: wait 0 ms if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @akt01 if 00DF: actor $PLAYER_ACTOR driving 004D: jump_if_false @akt01
03C0: 1@ = actor $PLAYER_ACTOR car 0229: set_car 1@ color_to 17 0 02AC: set_car 1@ immunities BP 1 FP 1 EP 1 CP 1 MP 1 053F: set_car 1@ tires_vulnerability 0
:akt03//----------------------------2.Loop Adress 0001: wait 0 ms if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @akt03 if 80DF: not actor $PLAYER_ACTOR driving 004D: jump_if_false @akt03
01C3: remove_references_to_car 1@
0002: jump @akt01//--------Normal jump instruction to 1.LoopAdress |
The script above makes the player_car undestructable as soon as a car is entered
Therefore we must registrate the instance of the car and define it with a variable name
03C0: 1@ = actor $PLAYER_ACTOR carThen we can use this variable name 1@ to make the car immun
After player has left the car, the reading process jumps back into the first Loop.
Youre not restricted by 2 Loops and there are also other kinds of script structure
But I recommand to build your scripts with this structure as long as you have not much experience
______________________________________________________________________________________
Script exemble: SlowmotionThe script toggle by key_press between slowmotion and normal speed
set_gamespeed .3 make the game slow and also the reading process
wait 50 milliseconds needs ca. 1 second
A "if_player_defined"-check is not nessesary because the script dont have any codes which belongs to the player
After a passed key_press check it makes sense to set a wait of one second otherwise the key_press check will be repeated to fast.
CODE |
{$CLEO .cs} :slow_0 03A4: name_thread 'SLW'
:slow_1 0001: wait 0 ms if 0AB0: key_pressed 8//-----------------key = Backspace 004D: jump_if_false @slow_1 015D: set_gamespeed .3 0001: wait 50 ms
:slow_2 0001: wait 0 ms if 0AB0: key_pressed 8//-----------------key = Backspace 004D: jump_if_false @slow_2 015D: set_gamespeed 1.0 0001: wait 1000 ms 0002: jump @slow_1 |
______________________________________________________________________________________
Next Step/ Spawn a 3D modelUsing models requires 5 steps by applying with models and their definition in its variable name
1. first step to load the model
CODE |
0247: request_model #INFERNUS |
2. second step to prove if the model is loaded in an extra "load-model-check-Loop"
CODE |
:Load_Model_Check 0001: wait 0 ms 00D6: if 0 0248: model #INFERNUS available 004D: jump_if_false @Load_Model_Check |
3. The model can be created as soon as the model file is loaded and define it with a variable name
CODE |
00A5: 1@ = create_car #INFERNUS at 2487.5 -1660.5 13.35 0175: set_car 1@ z_angle_to 90.0 |
4. release the loaded model file if it not needed anymore
CODE |
0249: release_model #INFERNUS |
5. Release the defined item from script when the script has done its work
The script can then go to the status quo by jumping back into the first Loop
CODE |
01C3: remove_references_to_car 1@ // Like turning a car into any random car |
Releasing a spawned car by using 01C3: remove_references_to_car deletes the instance of the car for our script
but its still available in the game but can not used anymore in our script.
An other way to release the car is to delete it complete:
CODE |
00A6: destroy_car 1@ |
This 2 different kinds for releasing exist for vehicles, actors and objects each with own opcodes
CODE |
{$CLEO .cs} :3dModels_1 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: 1@ = create_car #INFERNUS at 2487.5 -1660.5 13.35 0175: set_car 1@ 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 1@ // Like turning a car into any random car 0002: jump @3dModels_2 |
Script above spawns the car Infernus in Grovestreet if player goes into red marker(sphere)
If player leave the spot the car will be released from script and the reading process jumps back into 1.Loop
# marks the connected entry as filename of a loadable model
For Cleo can only be used models which are defined in vehicles.ide, peds.ide or default.ide
Other models needs to use their ID number
For exemble to spawn the object 1655, waterjumpx2 of data\maps\generic\multiobj.ide
CODE |
{$CLEO .cs} :JumpR00 03A4: name_thread 'JPR'
:JumpR01 0001: wait 0 ms 00D6: if 0 0256: player $PLAYER_CHAR defined 004D: jump_if_false @JumpR01 00D6: if 0 00E1: key_pressed 0 10//--------- No key 004D: jump_if_false @JumpR01 0247: request_model 1655
:JumpR02 0001: wait 0 ms 00D6: if 0 0248: model 1655 available 004D: jump_if_false @JumpR02 0172: 2@ = actor $PLAYER_ACTOR z_angle 04C4: create_coordinate 11@ 12@ 13@ from_actor $PLAYER_ACTOR offset 0.0 14.5 -1.8 0107: 1@ = create_object 1655 at 11@ 12@ 13@ 0177: set_object 1@ z_angle_to 2@ 0001: wait 0 ms 0249: release_model 1655 0001: wait 1000 ms 01C4: remove_references_to_object 1@ // This object will now disappear when the player looks away 0002: jump @JumpR01 |
Script above spawns a jumpramp by key_press
You can allways use the ID number to spawn models, also for cars and actors
As next we use 120 intead #TRIBOSS to spawn an actor
CODE |
{$CLEO .cs} :Actor_1 03A4: name_thread 'Actor'
:Actor_2 0001: wait 0 ms 00D6: if 0 0256: player $PLAYER_CHAR defined 004D: jump_if_false @Actor_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 @Actor_2
0247: request_model 120 0247: request_model #AK47
:Load_models_check 0001: wait 0 ms 00D6: if and 0248: model 120 available 0248: model #AK47 available 004D: jump_if_false @Load_models_check
009A: 1@ = create_actor 24 120 at 2486.5 -1664.5 13.45 0173: set_actor 1@ z_angle_to 180.0 01B2: give_actor 1@ weapon 30 ammo 99999 // Load the weapon model before using this 02E2: set_actor 1@ weapon_accuracy_to 100 0223: set_actor 1@ health_to 1000 05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR 0249: release_model 120
:Loop_1 0001: wait 0 ms 00D6: if 0 8118: NOT actor 1@ dead 004D: jump_if_false @Cleanup_1 00D6: if 0 0104: actor $PLAYER_ACTOR near_actor 1@ radius 80.0 80.0 10.0 sphere 0 004D: jump_if_false @Cleanup_1 0002: jump @Loop_1
:Cleanup_1 01C2: remove_references_to_actor 1@ // Like turning an actor into a random pedestrian 0002: jump @Actor_2 |
Script above spawns the actor Triboss with gun in Grovestreet
If player leave the area with radius 80.0 80.0 or if the actor is dead,
the actor will be released from script and the reading process jumps back into 1.Loop
To give the actor or the player a weapon requires also to load first the model file
But to give it then really into his hands needs to insert a special weapon number which is not documented in any game file.
To find the right weapon number look in Sannybuilder HELP: SCM Documentation >> GTA SA >> Weapon numbers
Weapon given to actors are not created in same sense like the other models,
so it dont it to release them from script like other items
The spawned actors have predefined execodet behaviors which is dependent by the pedtype parameter of the create_actor opcode.
Look for pedtypes in Sannybuilder HELP: SCM Documentation >> GTA SA >> PedTypes
An actor with pedtype 8 is recruitable like a homie
CODE |
009A: 1@ = create_actor 8 #TRIBOSS at 2486.5 -1664.5 13.45 |
An actor with pedtype 7 is agressive like an enemy gangmember
CODE |
009A: 1@ = create_actor 7 #TRIBOSS at 2486.5 -1664.5 13.45 |
______________________________________________________________________________________
Placing cars by using parked_car_generator
Init parked_car_generators or pickups need to insert the Cleo opcode:
0A95: enable_thread_saving
Read the discription about enable_thread_saving in the theme:
Special Particularities in Cleo >> Registrate (store) the Script StateThe placing of cars by using parked_car_generator dont allows the using of its variable name in vehicle associated opcodes
because its not a car but a car_generator
CODE |
{$CLEO .cs} :PaCar_1 03A4: name_thread "PACR" 0001: wait 1000 ms 0A95: enable_thread_saving
014B: 1@ = init_parked_car_generator #BANSHEE -1 -1 1 alarm 0 door_lock 0 0 10000 at 920.1994 2020.546 11.79 angle 100.0 014C: set_parked_car_generator 1@ cars_to_generate_to 101
032B: 2@ = create_weapon_pickup #MINIGUN 15 ammo 5000 at 2113.373 1520.674 10.82
0A93: end_custom_thread |
Script above adds a parked_car_generator to spawn the car Banshee
and a weapon pickup with MINIGUN
generate_to 101 means that the car will be spawned again and again
generate_to 0 deactivates the car_generator
the two parameters after the model name
-1 -1 gives the secondary and primary color
by setting
-1 -1the game choose the colors randomly
by setting
0 17 it give black (0) to primary and red (17) to secondary color
alarm 0 can be a value between 0 and 100 and means the probable chance to execute an alarm
door_lock 0 can be a value between 0 and 100 and means the probable chance to execute a door lock
For pickups exist 2 different opcodes for 2 different kinds of pickups
032B: for weapons with ammo and for the Jetpack
0213: for melee weapons and objects like parachute (GUN_PARA) or bodyarmour (1242, bodyarmour)
the parameter after the model ID #MINIGUN 15 is the pickup-typ
Typ 15 is a pickup, which appears again and again
Typ 3 is a pickup, which appears only for one time
______________________________________________________________________________________
______________________________________________________________________________________
Special Particularities in CleoThe extra-Cleo opcodes can be found in Sannybuilder-HELP
CLEO 3 Code Library >> CLEO 3: opcodes CLEO 3 Code Library>> CLEO 3: opcodes
______________________________________________________________________________________
Two major codes to start scripts are those which already exist in the main.scm and have been re-created for Cleo:
1.) 004F: create_thread @SAVEGAME starts an ordinary thread in the main.scm.
We dont need it in Cleo because it will be allready started from Cleo programm
To start an other thread of a cleo script, started from a cleo script needs following opcode:
0A92: create_custom_thread "New_Test_thread.cs"
The code needs to insert the name of the script file which should get started inclusiv dot and extension
The Cleo script file get then the file extension, which is written in the Cleo Script directive at the beginning of the script
{$CLEO .cs} = Cleo directive will be compiled to
*.csAs New_Test_thread.txt saved and compiled as New_Test_thread.cs
The script get then started at second once. Once from Cleo programm and once from the 0A92: create_custom_thread
It needs to set a conditional check at script beginn to let the script ending when it was started from Cleo programm.
An other chance is to give the script the extension .s
This needs to insert following:
0A92: create_custom_thread "New_Test_thread.s"
The Cleo script file which should get started, must have
{$CLEO .cs} as directive and will be compiled as
*.csYou must change the extension manual by renaming from
*.cs into
*.sIn this case the Cleo script will only run if it was started with 0A92: create_custom_thread from an other Cleo script.
The opcode
0A92: create_custom_thread can transport more information to the script which should be started
This opcode can be extended with up to 30 values or variables as parameters
exemble:
CODE |
0A92: create_custom_thread "PimpmyCarFULL2A1.cs" 1 2 0 3@ 4@ 5@ 6@ 29@ 8@ 9@ 10@ |
The started thread recieves these parameter values with following rule
0@ get value of 1.parameter
1@ get value of 2.parameter
2@ get value of 3.parameter
3@ get value of 4.parameter
4@ get value of 5.parameter
etc...
Its also possible to start much threads in one and the same Cleo script, started from the same script which recieve the create_thread commands.
2.)0417: start_mission 3
starts a mission script of the main.scm. It needs to insert the number which the mission script get from the listing of the mission table
In Cleo dont exist a mission table and its listing.
But it needs allways a Cleo mission starter script with following command:
0A94: start_custom_mission "DriftMission"
The code needs to insert the name of the script file which should get started but without extension
The Cleo script file get then the file extension, which is written in the Cleo Script directive at the beginning of the script
{$CLEO .cm} = Cleo directive will be compiled to
*.cmAs DriftMission.txt saved and compiled as DriftMission.cm
______________________________________________________________________________________
0A93: end_custom_thread let a script ending. Its disabled then.
The original version of this code of the main.scm is
004E: end_threadAnd this original version must be used furthermore in Cleo mission scripts (*.cm)
004E: end_thread
Again:
0A93: end_custom_thread in normal Cleo scripts, compiled to a
*.cs file
CODE |
{$CLEO .cs} 0A93: end_custom_thread |
004E: end_thread in mission scripts, compiled to a
*.cm file
CODE |
{$CLEO .cm} 004E: end_thread |
______________________________________________________________________________________
Cleo creates extra save files if a save was done,
stored in folder CLEO\Cleo_saveBy loading a save file must taken care to check that the presence of the scripts in Cleo folder
is the same as it was as the save was done.
Special attention in this case are going to those scripts which includes the Cleo opcode
to registrate and store the Script State
______________________________________________________________________________________
Registrate (store) the Script StateThe Cleo scripts with extension
.cs are started allways from new by loading a save game or start new game,
If such a script includes for exemble a parked car generator and execute it and after this a save game is made,
and then this save game is loaded,
will be created a duplicate of the item, in this case a duplicate of a parked car generator.
This happens with parked car generator, pickups as well as placed objects.
To prevent this or to read the script state by using special special Cleo-variable
must be used following Cleo opcode:
CODE |
0A95: enable_thread_saving |
This instruct Cleo to store the script state by making a savegame
______________________________________________________________________________________
Special Global Cleo VariableThis theme requires the understanding of the description about
Local Variables and
Global Variablesof the previous theme
Datatypeespecially this part which tells why there exist
Local Variables and
Global VariablesGlobal Variables are used in main.scm to communicate between different scripts and they are storable.
Using Global Variables in Cleo scripts can cause bugs and crashes
To realize Global Variables for Cleo scripts exist following Cleo opcode connected with a special expression:
Opcode 0AB3: and 0AB4:
The expression
var together with a number,
<var><space><number> is builing the Special Global Cleo Variable
CODE |
0AB3: var 0 = 10 or 0006: 13@ = 10 // integer values 0AB3: var 0 = 13@
and 0AB4: 0@= var 0 |
var 0 up to var 999 will be stored, in exemble var 0 is stored with 10
to get then stored value into your script needs to submit into a local:
CODE |
0AB4: 13@ = var 44 if 0039: 13@ == 1 // integer values 004D: jump_if_false @nextlabel |
______________________________________________________________________________________
______________________________________________________________________________________
Script Exemble by using Special Global Cleo Variable/ Store a car at any place(requires to understand all previous themes of this tut)
Script below saves a car at any place
If player is in car and key F7 is pressed, it stores x,y,z coords and angle, also the car ID, its primary and secondary color and its paintjob.
The player exit then the car and car will be locked and made immun
If player leave the location and the distance to the car will be greater then 100.0
the car will be released from script and the reading process jumps back into an other Loop
If player then comes back to the location, near 80.0 the car will be spawned as new
Only to store the car settings by making savegame needs to give the values into the Special Global Cleo Variable
As I wrote in the theme "Registrate (store) the Script State"
is the Carstore script running from new by loading a save game or start new game"...
...and checks first if var 955 is ciro
its only not ciro if a car was stored in the loaded savegame
If var 955 is ciro, the script starts with the 1.Loop
If var 955 is not ciro, the reading process jumps into the 3.Loop with the check if player is near the car store location
A special side effect of this kind of car store is that the storable entries then available in memory for all savefiles.
Only by shut down the game and start again is the stored car only stored in the savegame which was done to store the car.
CODE |
{$CLEO .cs} :CARSTORE 03A4: name_thread 'CARSTOR' 0001: wait 1000 ms 0AB4: 7@ = var 955 00D6: if 8039: not 7@ == 0 004D: jump_if_false @CARSTOR_150 0AB4: 3@ = var 951 0AB4: 4@ = var 952 0AB4: 5@ = var 953 0AB4: 6@ = var 954 0AB4: 7@ = var 955 0AB4: 8@ = var 956 0AB4: 9@ = var 957 0AB4: 10@ = var 958 0093: 3@ = integer 3@ to_float 0093: 4@ = integer 4@ to_float 0093: 5@ = integer 5@ to_float 0093: 6@ = integer 6@ to_float 0001: wait 1000 ms 0002: jump @CARSTOR_555
:CARSTOR_150 0001: wait 0 ms 00D6: if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @CARSTOR_150 00D6: if and 00DF: actor $PLAYER_ACTOR driving 0AB0: key_pressed 118//-------------------key F7 004D: jump_if_false @CARSTOR_150 01B4: set_player $PLAYER_CHAR can_move 0 03C0: 2@ = actor $PLAYER_ACTOR car 00AA: store_car 2@ position_to 3@ 4@ 5@ 0174: 6@ = car 2@ Z_angle 0441: 7@ = car 2@ model 0988: get_car 2@ paintjob 8@ 03F3: get_car 2@ primary_color_to 9@ secondary_color_to 10@ 020A: set_car 2@ door_status_to 0 02AC: set_car 2@ immunities BP 1 FP 1 EP 1 CP 1 MP 1 0519: set_car 2@ locked 1 0633: AS_actor $PLAYER_ACTOR exit_car 0092: 13@ = float 3@ to_integer 0092: 14@ = float 4@ to_integer 0092: 15@ = float 5@ to_integer 0092: 16@ = float 6@ to_integer 0AB3: var 951 = 13@ 0AB3: var 952 = 14@ 0AB3: var 953 = 15@ 0AB3: var 954 = 16@ 0AB3: var 955 = 7@ 0AB3: var 956 = 8@ 0AB3: var 957 = 9@ 0AB3: var 958 = 10@ 0001: wait 2000 ms 01B4: set_player $PLAYER_CHAR can_move 1 0002: jump @CARSTOR_403
:CARSTOR_403 0001: wait 0 ms 00D6: if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @CARSTOR_550 00D6: if 82BF: not car 2@ sunk 004D: jump_if_false @CARSTOR_738 00D6: if 8119: not car 2@ wrecked 004D: jump_if_false @CARSTOR_550 00D6: if 0202: actor $PLAYER_ACTOR near_car 2@ radius 100.0 100.0 flag 0 004D: jump_if_false @CARSTOR_550 00D6: if 00DF: actor $PLAYER_ACTOR driving 004D: jump_if_false @CARSTOR_403 00D6: if 00DB: actor $PLAYER_ACTOR in_car 2@ 004D: jump_if_false @CARSTOR_403 02AC: set_car 2@ immunities BP 0 FP 0 EP 0 CP 0 MP 0 0519: set_car 2@ locked 0 0002: jump @CARSTOR_738
:CARSTOR_550 01C3: remove_references_to_car 2@ // Like turning a car into any random car
:CARSTOR_555 0001: wait 0 ms 00D6: if 0256: player $PLAYER_CHAR defined 004D: jump_if_false @CARSTOR_555 00D6: if 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 3@ 4@ 5@ radius 80.0 80.0 50.0 004D: jump_if_false @CARSTOR_555 0002: jump @CARSTOR_624
:CARSTOR_624 0247: load_model 7@
:CARSTOR_629 0001: wait 0 ms 00D6: if 0248: model 7@ available 004D: jump_if_false @CARSTOR_629 0001: wait 0 ms 00A5: 2@ = create_car 7@ at 3@ 4@ 5@ 0175: set_car 2@ Z_angle_to 6@ 06ED: set_car 2@ paintjob 8@ 0229: set_car 2@ primary_color_to 9@ secondary_color_to 10@ 020A: set_car 2@ door_status_to 0 02AC: set_car 2@ immunities BP 1 FP 1 EP 1 CP 1 MP 1 0519: set_car 2@ locked 1 0249: release_model 7@ 0002: jump @CARSTOR_403
:CARSTOR_738 01C3: remove_references_to_car 2@ // Like turning a car into any random car 0AB3: var 955 = 0 0002: jump @CARSTOR_150 |
______________________________________________________________________________________
______________________________________________________________________________________
Template for Cleo Mission Script(requires to understand all previous themes of this tut)
To run a Cleo mission script requires allways 2 Cleo script files
1. A
.cs file to start the Cleo mission script file
2. The Cleo mission script file itself with extension
.cmThe mission starter thread below is done with a conditional check to check if the player is near a specified point,
which must passed to start the mission.
The coordinates of the near_point check are the location in San Fierro/Carlton Heights near savehouse
Edit the coordinates to set your own location for starting
The parameter
1 of the near_point opcode
00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_pointis displaying a red marker (sphere).
If the parameter is ciro
00FE: actor $PLAYER_ACTOR 0 (in-sphere)near_point does not displaying a red marker.
To display a red marker in this way needs to set 0ms as maximum in the wait code of this Loop
CODE |
{$CLEO .cs} :Test_M_Start_1 03A4: name_thread 'TSTM'
:Test_M_Start_2 0001: wait 0 ms 00D6: if 0 0256: player $PLAYER_CHAR defined 004D: jump_if_false @Test_M_Start_2 00D6: if 0 0038: $ONMISSION == 0 // integer values 004D: jump_if_false @Test_M_Start_2
:Test_M_Start_6 00D6: if 0 00FE: actor $PLAYER_ACTOR 1 (in-sphere)near_point 2480.1343 -1665.475 13.3348 radius 3.5 3.5 5.5 004D: jump_if_false @Test_M_Start_2 00BA: text_styled 'STAD_02' 1000 ms 2 0004: $ONMISSION = 1 // integer values 0A94: start_custom_mission "TestMission" // 0002: jump @Test_M_Start_2 |
The mission starter script includes the following Cleo opcode to start the Cleo mission script:
0A94: start_custom_mission "TestMission"
The code needs to insert the name of the script file which should get started but without extension
The Cleo script file get then the file extension, which is written in the Cleo Script directive at the beginning of the script
{$CLEO .cm} = Cleo directive will be compiled to
*.cmAs TestMission.txt saved and compiled as TestMission.cm
CODE |
{$CLEO .cm} :TestMiss_1 03A4: name_thread "TESTM" 0050: gosub @TestMiss_main_1 00D6: if 0 0112: wasted_or_busted 004D: jump_if_false @TestMiss_end_1 0050: gosub @TestMiss_fail_1
:TestMiss_end_1 0050: gosub @TestMiss_clep_1 004E: end_thread
:TestMiss_main_1 0317: increment_mission_attempts//here starts the missionscript 0004: $ONMISSION = 1 054C: use_GXT_table 'MENU2P' 00BC: text_highpriority 'MENU_18' 5000 ms 1
:TestMiss_11 0001: wait 0 ms if and 02D8: actor $PLAYER_ACTOR currentweapon == 0 00E1: key_pressed 0 17 004D: jump_if_false @TestMiss_11
:TestMiss_pass_1 00BA: text_styled 'M_PASS' 5000 ms 1 0051: return
:TestMiss_fail_1 00BA: text_styled 'M_FAIL' 5000 ms 1 0051: return
:TestMiss_clep_1 0004: $ONMISSION = 0 00D8: mission_cleanup 0051: return |
When the mission script from above is running it can be completed by pressing fire key while player have weapon 0/naked fist.
The secret of the onmission mode$ONMISSION is not only a variable to check if a mission script is running or not.
Set $ONMISSION to 1 activates a special mission mode if some important conditions are accomplished.
R*s mission scripts run allways in a subroutine which will be cancled from the exe if player is wasted or busted like reading a return code in the script.
1. At first it needs to set $ONMISSION equal to on_mission_flag
CODE |
0180: set_on_mission_flag_to $ONMISSION// Note: your missions have to use the variable defined here |
This code is set by default in the main part of the original main.scm
2. By starting the mission script must sended the reading precess with a gosub command into a subroutine for the main part of the mission script.
It must be the first gosub of the mission script.
CODE |
0050: gosub @TestMiss_main_1 |
3. By starting the mission script must be activated the onmission mode with
CODE |
0004: $ONMISSION = 1 0317: increment_mission_attempts//here starts the missionscript |
Then the mission is running in a subroutine and dont needs to check if player is defined or dead or busted.
If player dies or get busted, the exe cancels the subroutine as like as a return code of our script is readed
The rest of the mission script is just a cunning gosub construct.
______________________________________________________________________________________
______________________________________________________________________________________
gosub
The gosub command leads the reading process to an excluded subscript.
Excluded means the codes of the subscript are not binded in code following of our thread.
CODE |
0050: gosub @MODLSUBROUTINE |
The subscript must end with return
If the subscript ends with 0051: return, our thread then continues with reading the codes after the 0050: gosub command
Exemble:
CODE |
{$CLEO .cs} :MODLSUB_1 03A4: name_thread 'MODLSUB'
:MODLSUB_2 0001: wait 0 ms 00D6: if 0 0256: player $PLAYER_CHAR defined 004D: jump_if_false @MODLSUB_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 @MODLSUB_2 0050: gosub @MODLSUBROUTINE
:Loop_1 0001: wait 0 ms 00D6: if 0 8118: NOT actor 1@ dead 004D: jump_if_false @Cleanup_1 00D6: if 0 0104: actor $PLAYER_ACTOR near_actor 1@ radius 80.0 80.0 10.0 sphere 0 004D: jump_if_false @Cleanup_1 0002: jump @Loop_1
:Cleanup_1 01C2: remove_references_to_actor 1@ // Like turning an actor into a random pedestrian 0002: jump @MODLSUB_2
:MODLSUBROUTINE 0005: 1@ = 2473.25 0005: 2@ = -1657.79 0005: 3@ = 13.4 0005: 4@ = 2501.12 0005: 5@ = -1676.5 0005: 6@ = 13.4 0208: 7@ = random_float_in_ranges 1@ 4@ 0208: 8@ = random_float_in_ranges 2@ 5@ 0208: 9@ = random_float_in_ranges 3@ 6@ 0247: request_model #TRIBOSS 0247: request_model #AK47
:Load_MODLSUB_Check 0001: wait 0 ms 00D6: if and 0248: model #TRIBOSS available 0248: model #AK47 available 004D: jump_if_false @Load_MODLSUB_Check
009A: 1@ = create_actor 24 #TRIBOSS at 7@ 8@ 9@ 0173: set_actor 1@ z_angle_to 180.0 01B2: give_actor 1@ weapon 30 ammo 99999 // Load the weapon model before using this 02E2: set_actor 1@ weapon_accuracy_to 100 0223: set_actor 1@ health_to 1000 05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR 0249: release_model #TRIBOSS 0051: return |
Script above spawns the actor Triboss with gun in Grovestreet at different places
The coords are generated random
The part with the coords generation and actor spawn is excluded in a subscript
If player leave the area with radius 80.0 80.0 or if the actor is dead,
the actor will be released from script and the reading process jumps back into 1.Loop
______________________________________________________________________________________
______________________________________________________________________________________