Hoofdpagina > Modding > Modding Tutorial List > SA mission coding (voor beginners)
In deze tutorial legt JGuntherS de basis uit van scripting in San Andreas. Hij gebruikt hiervoor San Andreas Mission Builder.
Benodigde tools
- San Andreas Mission Builder
- San Andreas Place Manager
- Kladblok
Voorbereiding & backups
Voordat je aan de slag gaat adviseert JGuntherS je om je data map van SA en je savegames te backuppen.
- Unzip de Mission Builder in een map waar jij wilt.
- Kopieer de bestanden peds.ide, vehicles.ide en default.ide uit de data map van SA naar de map waarin de Mission Builder is geunzipped.
- Open het bestand SASCM.INI in de MB map (met kladblok of met de MissionBuilder zelf) en voeg deze regels toe (aan het eind):
: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 ££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 3
: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
JGuntherS gebruikt altijd deze thread (met een paar kleine aanpassinkjes) (Als je een deel van deze voorbeeldcode gebruikt zou het wel zo vriendelijk zijn er een verwijzing naar JGuntherS te zetten).
Compileren en in het spel zetten
- Ga naar Run -> Compile en wees geduldig. Je kunt de status aflezen in de titelbalk. Mission Builder geeft een melding als hij klaar is met compileren.
- Ga nu naar de map waarin je hem hebt laten decompileren. Daar staan nu de bestanden MAIN.SCM en SCRIPTS.IMG in. Kopieer deze bestanden naar data\scripts.
Testen
- Dit is ongetwijfeld het makkelijkste deel, maar let op: je kunt je oude savegames niet meer gebruiken (hiervoor heb je een backup gemaakt). Ga naar de plek waar hij zou moeten staan en kijk of dat het geval is.
Problemen oplossen
- V: Als ik compileer dan krijg ik een foutmelding over mijn #CHEETAH.
- A: Controleer de spelling, of kijk of er iets mis is met vehicles.ide.
- V: Als ik compileer dan krijg ik een foutmelding: Parameter 4 not set.
- A: Je hebt waarschijnlijk komma's ingevuld, waar punten moeten staan in de coördinaten.
- V: Als ik compileer dan krijg ik een foutmelding over DEFINE MEMORY.
- A: Pas DEFINE MEMORY (staat op de 4e regel) aan tot de in de foutmelding aangegeven waarde (het mag ook hoger zijn).
- V: In de MB kan hij INITIAL_1 niet vinden.
- A: Zet je tekstcursor bovenaan en probeer het opnieuw.
- V: Ik krijg Opcode out of range: 3004h address: 0000AC6h bij het decompileren.
- A: Je hebt SASCM.INI niet aangepast.
Extra: een skateboard pick-up
Open melee.dat in de DATA-map van SA en zoek dit stuk:
#START_COMBO SKATEBOARD # ANIMGROUP sk8_1 # RANGES 1.6 # #-----------hit-----chain---radius--hitlevel----damage--hit-altHit--groundLoop # ATTACK1 11.0 20.0 0.5 H 10 1 2 # ATTACK2 11.0 21.0 0.5 H 15 1 2 # ATTACK3 15.0 99.0 0.5 H 25 1 2 # AGROUND 10.0 20.0 0.5 G 25 3 3 7.0 # AMOVING 6.0 10.0 1.0 HL 15 1 2 # ABLOCK 100.0 100.0 # #---------------- # FLAGS 0x007 #END_COMBO
Haal alle hekjes aan het begin van de zinnen weg. Het resultaat is het volgende:
START_COMBO SKATEBOARD
ANIMGROUP sk8_1
RANGES 1.6
#-----------hit-----chain---radius--hitlevel----damage--hit-altHit--groundLoop
ATTACK1 11.0 20.0 0.5 H 10 1 2
ATTACK2 11.0 21.0 0.5 H 15 1 2
ATTACK3 15.0 99.0 0.5 H 25 1 2
AGROUND 10.0 20.0 0.5 G 25 3 3 7.0
AMOVING 6.0 10.0 1.0 HL 15 1 2
ABLOCK 100.0 100.0
#----------------
FLAGS 0x007
END_COMBO
Sla dit op en open weapons.dat. Zoek het volgende stuk:
£ POOLCUE MELEE 10.0 1.6 338 -1 1 BBALLBAT 1 1 null £ KATANA MELEE 10.0 1.6 339 -1 1 SWORD 1 1 null #£ SKATEBOARD MELEE 10.0 1.6 340 -1 1 SKATEBOARD 1 1 null £ CHAINSAW MELEE 10.0 1.6 341 -1 1 CHAINSAW 1 201 null
Verwijder het hekje voor de regel met het skateboard:
£ POOLCUE MELEE 10.0 1.6 338 -1 1 BBALLBAT 1 1 null £ KATANA MELEE 10.0 1.6 339 -1 1 SWORD 1 1 null £ SKATEBOARD MELEE 10.0 1.6 340 -1 1 SKATEBOARD 1 1 null £ CHAINSAW MELEE 10.0 1.6 341 -1 1 CHAINSAW 1 201 null
Sla dit bestand op en open het bestand default.ide. Zoek het volgende stuk:
337, shovel, shovel, null, 1, 50, 0 338, poolcue, poolcue, null, 1, 50, 0 339, katana, katana, null, 1, 50, 0 #340, skateboard, skateboard, null, 1, 50, 0 341, chnsaw, chnsaw, chainsaw, 1, 50, 0
Verwijder weer het hekje voor de skateboard regel:
337, shovel, shovel, null, 1, 50, 0 338, poolcue, poolcue, null, 1, 50, 0 339, katana, katana, null, 1, 50, 0 340, skateboard, skateboard, null, 1, 50, 0 341, chnsaw, chnsaw, chainsaw, 1, 50, 0
Sla dit bestand op. Nu kunnen we een skateboard pick-up creëren in het script. De wapencode voor het skateboard is: #SKATEBOARD. De code om de pick-up te maken wordt dan:
0213: $mijn_skateboard = create_pickup #SKATEBOARD type 15 at 2492.378 -1667.843 13.34375
Zet deze regel op de plek van de vorige hoofdstukken.