De basissen van een missie

Hoofdpagina > Modding > Modding Tutorial List > De basissen van een missie


In deze tutorial van JGuntherS wordt de basissen van het SCM-scripten uitgelegd.

Introductie

Het is aangeraden eerst een beetje ervaring op te doen. Je kunt deze tutorial volgen. IF's en threads zijn heel belangrijk voor het schrijven van een missie.

Een missie definiëren

Een missie moet je aan het begin van het script definiëren. Je moet je missie bij dit stuk zetten:

:JGS1
0001: wait 100 ms
03A4: name_thread 'PANC_1'
0005: $2000 = 40.30668
0005: $2001 = 20.28515
0005: $2002 = 14.26602

:JGS1_0
02A7: $2003 = create_icon_marker_and_sphere  34 at  $2000 $2001 $2002
0004: $eiland_m1_on = 1

:JGS1_2
0001: wait 100 ms
00D6: if 0
0038:    $ON_MISSION == 0
004D: jump_if_false ££JGS1_5
00D6: if 1
0038:    $ON_MISSION == 0
0038:    $eiland_m1_on == 0
004D: jump_if_false ££JGS1_3
02A7: $2003 = create_icon_marker_and_sphere  34 at  $2000 $2001 $2002
0004: $eiland_m1_on = 1

:JGS1_3
00D6: if 0
0256:    player $PLAYER_CHAR defined
004D: jump_if_false ££JGS1_2   
00D6: if 0
00FF:    actor $PLAYER_ACTOR 0 ()near_point_on_foot $2000 $2001 $2002 radius 3.0 3.0 2.0
004D: jump_if_false ££JGS1_2
00D6: if 0
03EE:   player $PLAYER_CHAR controllable
004D: jump_if_false ££JGS1_2
0164: disable_marker $2003
0004: $eiland_m1_on = 0
00BA: text_styled 'JGS_M1'  1500 ms  2
0050: gosub ££PANCCAM
0417: start_mission (missienummer)

:JGS1_4
0001: wait 0 ms
00D6: if 0
0038:    $m_135_tried == 1
004D: jump_if_false ££JGS1_4
0004: $m_135_tried = 0
00D6: if 0
0038:    $m_135_done == 1
004D: jump_if_false ££JGS1_2
00BE: text_clear_all 
03E6: remove_text_box
01E3: text_1number_styled 'M_PASS'  1000  5000 ms  1
0318: set_latest_mission_passed 'PANCA_1'
030C: set_mission_points +=  1
0394: play_music  1
01BD: $184 = current_time_in_ms 
0109: player $PLAYER_CHAR money +=  1000
0110: clear_player $PLAYER_CHAR wanted_level
004E: end_thread

:JGS1_5
00D6: if 0
0038:    $eiland_m1_on == 1
004D: jump_if_false ££JGS1_2
0164: disable_marker $2003
0004: $eiland_m1_on = 0
0002: jump ££JGS1_2

:PANCCAM
0002: jump ££PANCCAM5

:PANCCAM1
0169: set_fade_color  0  0  0
016A: fade  0 ()  500 ms

:PANCCAM2
00D6: if  0
016B:   fading
004D: jump_if_false ££PANCCAM3
0001: wait  0 ms
00BE: text_clear_all
03E6: remove_text_box
0002: jump ££PANCCAM2

:PANCCAM3
00D6: if  0
0256:   player $PLAYER_CHAR defined
004D: jump_if_false ££PANCCAM4
016A: fade  0 ()  0 ms
02EB: restore_camera_with_jumpcut
0687: $PLAYER_ACTOR 
016A: fade  0 ()  0 ms

:PANCCAM4
0051: return
           
:PANCCAM5
00D6: if  0
0256:   player $PLAYER_CHAR defined
004D: jump_if_false ££PANCCAM6
03E6: remove_text_box
01B4: set_player $PLAYER_CHAR frozen_state  0 (frozen)
0050: gosub ££PANCCAM1

:PANCCAM6
0051: return

Kijkt en leert. Een goede oefening is trouwens om deze thread te begrijpen.

Het "frame" van een missie

Het frame van een missie ziet er ongeveer zo uit:

:M_BEGIN
0050: gosub £M_CODE
00D6: if 0
0112:   wasted_or_busted
004D: jump_if_false £M_KLAAR
0050: gosub £M_FAIL

:M_KLAAR
0050: gosub £M_OPSCHONEN
004E: end_thread

:M_CODE
;; de echte code van de missie
;; als de missie faalt, moet je deze code gebruiken: 0002: jump £M_FAIL

:M_PASS
;; als je mijn thread gebruikt moet je deze code hier neerzetten: 0004: $m_135_done = 1 
0002: jump £M_OPSCHONEN

:M_FAIL
00BA: text_styled 'M_FAIL'  5000 ms  1; MISSION FAILED!

:M_OPSCHONEN
;; opschoondingen hier
;; als je mijn thread gebruikt moet je deze code hier neerzetten: 0004: $m_135_tried = 1
0051: return

De plek in het script voor de missie

Een nieuwe missie zet je altijd onder laatse missie en boven het eerste externe script (in de normale GTA San Andreas is dat externe script AAA). In de normale SA:

01B4: set_player $PLAYER_CHAR frozen_state 1 (unfrozen)
03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 0 (false)
02A3: toggle_widescreen 0 (off)
0004: $ON_MISSION = 0 ;; integer values
01BD: $184 = current_time_in_ms
00D8: mission_cleanup
004E: end_thread
0051: return

Hier komt je missie

;-----------------------------------------------------
DEFINE EXTERNAL_SCRIPT_START AAA
; Originally: player using parachute

; The AAA script is created internally

;-----------------------------------------------------
DEFINE EXTERNAL_SCRIPT_START AMMU
; Originally: npc actors with parachutes

0005: $9585 = 0.0 ;; floating-point values

Handige stukjes code

Race checkpoints

Racecheckpoints maak je met opcode 06D5 op deze manier:

06D5: $cpID = create_racing_checkpoint_at X  Y  Z  X2  Y2  Z2  type 0 radius 3.0
X Y Z Dit zijn de coördinaten van dit checkpoint
X2 Y2 Z2 Dit zijn de coördinaten van het volgende checkpoint.
type 0 Het type kan 0 t/m 4 zijn.
  1. Rode checkpoint met een pijl naar het volgende checkpoint
  2. Een rood finish checkpoint
  3. Onbekend
  4. Corona?
  5. Corona?

Vervolgens moet er een stuk code komen dat controleert of de speler door het CP heen is gegaan. Meestal is dat zoiets als dit:

:MissC2a
0001: wait 0
00D6: if 0
00EE:   actor $PLAYER_ACTOR  0 ()near_point_in_car  X  Y radius  7.0  7.0
004D: jf ££MissC2a
-- meer code --

Een race checkpoint vernietig je weer met opcode 06D6 op deze manier:

06D6: destroy_racing_checkpoint $cpID