Statusbalken scripten

Hoofdpagina > Modding > Modding Tutorial List > Statusbalken scripten


Deze tutorial gaat over status texten, ofwel de balkjes die je bijvoorbeeld tegenkomt bij de missie "Drive-by" en de missie "Supply Lines".

 :SWEET4_47
 Model.Load(#GREENWOO)
 038B: load_requested_models 
 
 :SWEET4_103
 if
    not Model.Available(#GREENWOO)
 else_jump @SWEET4_152 
 wait 0 
 jump @SWEET4_103 
 
 :SWEET4_152
 1@ = 2508.16
 2@ = -1666.47 
 3@ = 13.0
 4@ = 16.0 
 0395: clear_area 1 at 1@ 2@ 3@ range 6.0 
 5@ = Car.Create(#GREENWOO, 1@, 2@, 3@)
 0229: set_car 5@ color_to 59 34 
 Car.Angle(5@) = 4@
 Car.Health(5@) = 1450
 $6674 = Car.Health(5@)


Dit is gewoon het spawnen van een voertuig, de Greenwood. Daarnaast wordt de variabele $6674 aangemaakt, dat betekent de car health van de Greenwood.

Ik zal eerst even het principe uitleggen. Het balkje gaat van 0 tot 100, gemeten in percentages. Je hebt de car health van de Greenwood op 1450 staan. Onder de 250 gaat de auto branden en ontploffen. Als je dus zegt dat 250 de 0 is van het balkje, dan is de 1450: 1200 (1450 - 250 = 1200). Aangezien je maar van 0 tot 100 mag hebben, moet je dat getal dus delen door 12. Dat gaan we nu eerst laten zien.

 0084: $6673 = $6674 // integer values and handles
 if
   $6673 > 250 // integer values
 else_jump @SWEET4_11472
 $6673 -= 250 // integer values
 
 :SWEET4_11472
 $6673 /= 12 // integer values

Voor je bij $6674 250 af gaat trekken, moet je eerst kijken of hij boen de 250 is. Anders kom je in een negatief getal en dat kan het balkje dus niet aan. Dus als het getal onder de 250 ligt moet je alvast verder gaan bij het volgende label (door de jump), als het getal boven de 250 ligt moet je er 250 vanaf halen.

Vervolgens stel je de variabele $6673 gelijk aan de variabele $6674 (de car health - 250 dus). Dat getal deel je door 12. Zo heb je dus in plaats van een getal tussen 250 en 1450, een getal tussen 0 en 100. In verhouding hetzelfde, maar zo kan je dus instellen voor dat balkje.

 0151: remove_status_text $6673 
 03C4: set_status_text_to $6673 1 'SWE4_08'  // CAR HEALTH[/code]

Dit is de code van "het balkje". Je ziet niet "car health" staan, aangezien de thread niet overeenkomt met het deel uit de GXT wat aangeroepen wordt.

Je kunt de 1 ook veranderen in een 0, dan is het niet meer een balkje, maar een getal. Dan begin je dus met 100 en dan eindig je met 0 en alle waardes daar tussenin.

 repeat
 wait 0 ms
 $6674 = Car.Health(5@)
 
 0084: $6673 = $6674 // integer values and handles 
 if 
   $6673 > 250 // integer values 
 else_jump @SWEET4_11472 
 $6673 -= 250 // integer values   
 
 :SWEET4_11472
 $6673 /= 12 // integer values
 
 until  $6674 < 250
 
 0151: remove_status_text $6673
 
 end_thread

Wat we hier maken is dat je het balkje ziet tot de auto kapot is (balkje verdwijnt als de variabele op 0 komt dus).

Dit is een repeat-wait-until structuur. Hij moet dus alles herhalen vanaf repeat, totdat $6674 kleiner is als 250 (dan is $6673 0 dus). Waarom hebben we nou nog een stuk erin gekopieerd? Omdat hij in de repeat, telkens moet checken of de car health veranderd, dat telkens gelijk moet stellen aan $6673, van $6673 telkens 250 af moet trekken, en $6673 telkens weer moet delen. Anders blijft hij natuurlijk op hetzelfde getal staan, en zal het balkje nooit aflopen.

Je wacht dus tot $6674 (de car health) onder de 250 komt. Dan ontploft de auto namelijk. Dan laat je het balkje met de code "0151: remove_status_text $6673" verdwijnen. Tot slot nog een end_thread, zodat het spel niet crasht en verder gaat met de main thread.

Alles in een stripped SCM file, dus dat je een auto ziet en dat het balkje loopt tot hij kapot gaat, zie je hieronder. Tip: gooi dit even in SannyBuilder om te kijken hoe het er werkelijk uit ziet, zodat je je het beter voor kunt stellen.

 {
   use macro (Ctrl+J) "headsa"
   to insert a file header      
 }
 {$VERSION 3.0.0000}
 var
  $PLAYER_CHAR: Player
 end // var 
 03A4: name_thread 'MAIN' 
 01F0: set_max_wanted_level_to 6 
 0111: toggle_wasted_busted_check 0 
 00C0: set_current_time_hours_to 8 minutes_to 0 
 04E4: unknown_refresh_game_renderer_at 2488.56 -1666.84 
 03CB: set_rendering_origin_at 2488.56 -1666.84 13.38 
 0053: $PLAYER_CHAR = create_player #NULL at 2488.56 -1666.84 13.38 
 01F5: $PLAYER_ACTOR = create_player_actor $PLAYER_CHAR 
 07AF: $PLAYER_GROUP = player $PLAYER_CHAR group 
 0373: set_camera_directly_behind_player 
 01B6: set_weather 0 
 0001: wait 0 ms 
 087B: set_player $PLAYER_CHAR clothes_texture "PLAYER_FACE" model "HEAD" body_part 1 
 087B: set_player $PLAYER_CHAR clothes_texture "JEANSDENIM" model "JEANS" body_part 2 
 087B: set_player $PLAYER_CHAR clothes_texture "SNEAKERBINCBLK" model "SNEAKER" body_part 3 
 087B: set_player $PLAYER_CHAR clothes_texture "VEST" model "VEST" body_part 0 
 070D: rebuild_player $PLAYER_CHAR 
 01B4: toggle_player $PLAYER_CHAR can_move 1 
 016A: fade 1 time 0 
 04BB: select_interior 0 
 0629: change_integer_stat 181 to 4 
 016C: restart_if_wasted_at 2027.77 -1420.52 15.99 angle 137.0 town_number 0 
 016D: restart_if_busted_at 1550.68 -1675.49 14.51 angle 90.0 town_number 0 
 0180: set_on_mission_flag_to $ONMISSION // Note: your missions have to use the variable defined here 
 0004: $DEFAULT_WAIT_TIME = 250
 03E6: remove_text_box
 
 004F: create_thread @BALKJE
 // put your create_thread commands here
 
 
 
 :MAIN_LOOP
 0001: wait $DEFAULT_WAIT_TIME ms
 00BF: $TIME_HOURS = current_time_hours, $TIME_MINS = current_time_minutes
 0002: jump @MAIN_LOOP 
 
 :BALKJE
 thread "BALKJE"
 
 :SWEET4_47
 Model.Load(#GREENWOO)
 038B: load_requested_models 
 
 :SWEET4_103
 if
    not Model.Available(#GREENWOO)
 else_jump @SWEET4_152 
 wait 0 
 jump @SWEET4_103 
 
 :SWEET4_152
 1@ = 2508.16 // floating-point values 
 2@ = -1666.47 // floating-point values 
 3@ = 13.0 // floating-point values 
 4@ = 16.0 // floating-point values 
 0395: clear_area 1 at 1@ 2@ 3@ range 6.0 
 5@ = Car.Create(#GREENWOO, 1@, 2@, 3@)
 0229: set_car 5@ color_to 59 34 
 Car.Angle(5@) = 4@
 Car.Health(5@) = 1450
 $6674 = Car.Health(5@)
 
 if 
   $6674 > 250 // integer values 
 else_jump @SWEET4_11471 
 $6674 -= 250 // integer values 
 
 :SWEET4_11471
 0084: $6673 = $6674 // integer values and handles 
 $6673 /= 12 // integer values
 
 0151: remove_status_text $6673 
 03C4: set_status_text_to $6673 0 'SWE4_08'  // CAR HEALTH  
 
 repeat
 wait 0 ms
 $6674 = Car.Health(5@)
 
 0084: $6673 = $6674 // integer values and handles 
 if 
   $6673 > 250 // integer values 
 else_jump @SWEET4_11472 
 $6673 -= 250 // integer values 
 
 :SWEET4_11472
 $6673 /= 12 // integer values
 
 until  $6674 < 250
 
 0151: remove_status_text $6673
 
 end_thread 
 

Hopelijk is het een beetje duidelijk, reactie en/of vragen kan je altijd in het reactietopic kwijt.