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.