Реально крутой скриптинг - статья 4
Автор статьи: mordvin.
18 сентября 2006.
Реально крутой скриптинг.
В этих статьях я расскажу вам, как создавать миссии и не только к GTA:VC. Для SA всё немного сложнее, но я уверен, что вы сами разберётесь. Уже была статья с сайта gtazone.ru, но 1) неудобный общий код 2) неясность того, что же именно писать в одной из меток сподвигла меня на статьи.
СТАТЬЯ 4.
Приёмчики миссий.
В прошлой статье мы разобрались с поэтапным написанием кода миссий. Теперь разберём этапы по отдельности: как их делать?
Самый простой и в то же время популярный приём - звеньевое написание.
:M1_Carwrecked
0001: wait 0 ms
00D6: if 0
0119: car $car wrecked ;; если машина не уничтожена,
004D: jump_if_false ЈM1_doexal ;; идём сюда
0050: gosub ЈFail1ByWOB ;; иначе в процедуру (см. шаблон) для кода провала
;;сюда можно засунуть команду типа 00BC: text_highpriority "..." 5000 ms 1 ;; ~r~Машина не в состоянии ездить! - этот текст будет под надписью "миссия провалена!"
0051: return ;; и возврат кода
:M1_doexal
0001: wait 0 ms
00D6: if 1
00FA: player $PLAYER_CHAR stopped 0 ()near point in car -861.4575 -470.7795 10.9273 radius 4.0 4.0 3.0
00DC: player $PLAYER_CHAR driving $car
004D: jump_if_false ЈM1_Carwrecked ;; если игрока нет в этой машине и в этой точке, ещё раз проверяем машину по этой метке, иначе идём дальше
а здесь будет продолжение, т. е. следующий этап.
Вы уже поняли, что попеременно проверяются 2 условия (2-е составное, но одно - игрок в такой-то точке И водит такую-то машину). Так может проверяться сколько угодно условий. Вот только проверку смерти/ареста делать не стоит - я про это уже высказался во 2-й статье. Посмотрите скрипт полёта на лодке Dinghy:
:Flip
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false ЈЈFlip
0001: wait 0 ms
00D6: if 0
00DE: player $PLAYER_CHAR driving vehicle type #dinghy
004D: jump_if_false ЈЈFlip
:ToFlipSt
0001: wait 0 ms;;torep
01B4: set_player $PLAYER_CHAR frozen_state 0 (frozen)
03C1: 0@ = player $PLAYER_CHAR car
02AA: set car 0@ immune to nonplayer 1
00AA: store_car 0@ position_to $flip_x $flip_y $flip_z
0174: $flip_ang = car 0@ z_angle
0005: $flip_speed = 0.0 ;; floating-point values
:Flip1
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
0175: set_car 0@ z_angle_to $flip_ang
04BA: set car 0@ speed instantly $flip_speed
00D6: if 0
00E1: key pressed 0 15
004D: jump_if_false ЈЈFlip2
01B4: set_player $PLAYER_CHAR frozen_state 1 ()
03E2: actor $PLAYER_ACTOR exit_car
01C3: remove_references_to_car 0@ ;; Like turning a car into any random car
0001: wait 1000 ms
0002: jump ЈЈFlip
:Flip4
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
0175: set_car 0@ z_angle_to $flip_ang
04BA: set car 0@ speed instantly $flip_speed
00D6: if 0
00E1: key pressed 0 17
004D: jump_if_false ЈЈFlip6
02E3: $flip_speed = car 0@ speed
0009: $flip_speed += 5.0 ;; floating-point values
0011: $flip_speed *= 1.3 ;; floating-point values
04BA: set car 0@ speed instantly $flip_speed
:Flip6
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
0175: set_car 0@ z_angle_to $flip_ang
04BA: set car 0@ speed instantly $flip_speed
00D6: if 0
00E1: key pressed 0 11
004D: jump_if_false ЈЈFlip7
0174: $flip_ang = car 0@ z_angle
000D: $flip_ang -= 5.0 ;; floating-point values
00D6: if 0
0032: 0 >= $flip_ang ;; floating-point values
004D: jump_if_false ЈЈFlip8
0009: $flip_ang += 360.0 ;; floating-point values
0002: jump ЈЈFlipang
:Flip7
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
0175: set_car 0@ z_angle_to $flip_ang
04BA: set car 0@ speed instantly $flip_speed
00D6: if 0
00E1: key pressed 0 10
004D: jump_if_false ЈЈFlip9
0174: $flip_ang = car 0@ z_angle
0009: $flip_ang += 5.0 ;; floating-point values
:Flipang
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
04BA: set car 0@ speed instantly $flip_speed
00D6: if 21
0020: $flip_ang > 360.0 ;; floating-point values
0042: $flip_ang == 360.0 ;; floating-point values
004D: jump_if_false ЈЈFlip8
000D: $flip_ang -= 360.0 ;; floating-point values
:Flip8
0001: wait 0 ms;;torep
0175: set_car 0@ z_angle_to $flip_ang
:Flip9
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
0175: set_car 0@ z_angle_to $flip_ang
04BA: set car 0@ speed instantly $flip_speed
00D6: if 0
00E1: key pressed 0 18
004D: jump_if_false ЈЈFlipA
02E3: $flip_speed = car 0@ speed
0011: $flip_speed *= 0.5 ;; floating-point values
04BA: set_car 0@ speed_instantly $flip_speed
:FlipA
0001: wait 0 ms;;torep
00AA: store_car 0@ position_to $flip_x $flip_y $musor
00AB: put_car 0@ at $flip_x $flip_y $flip_z
0175: set_car 0@ z_angle_to $flip_ang
04BA: set car 0@ speed instantly $flip_speed
00D6: if 22
0119: car 0@ wrecked
02BF: car 0@ sunk
80DB: NOT actor $player_actor in_car 0@
004D: jump_if_false ЈЈFlip1
0001: wait 0 ms;;torep
00D6: if 0
00DB: actor $player_actor in car 0@
004D: jump_if_false ЈЈFlipB
03E2: actor $PLAYER_ACTOR exit_car
:FlipB
0001: wait 0 ms;;torep
01B4: set player $PLAYER_CHAR frozen state 1 (unfrozen)
0001: wait 1000 ms
01C3: remove_references_to_car 0@ ;; Like turning a car into any random car
0002: jump ЈЈFlip
Это, конечно, не миссия, а поток, но вы, изучив этот код, ясно поймёте, как делается звеньевое написание. Попробуйте улучшить этот код, например, чтобы не проходило сквозь землю. Я могу. А вы?
Рекомендация: смотрите чужие скрипты, разбирайтесь в них, чтобы лучше писать свои.
В следующей статье я приведу интересные команды и модели скриптов, которые вам ой как пригодятся.