000113. Делаем гоночную миссию ( SARMC v0.9 )

Делаем гоночную миссию ( SARMC v0.9 )|Всем привет! Сегодня мы будем играть в гонки! А точнее делать гонку для GTA San Andreas!|wmysterio|wmysterio||||Первый шаг - сделать копию нашего main.scm, так как программа, которой мы будем делать нашу гонку может перезаписать наши данные, что нам естественно не нужно.

Воспользуемся программой SARMC v0.9, что бы быстро сделать код скрипта. Для этого запустим нашу Саню и определим точку, где будет иконка стартера, а затем программу:

Нажимаем кнопку xyz, что бы получить координаты ( выделена красным ). Должны появиться координаты игрока в полях X Y Z. Если этого не произошло, то воспользуйтесь Sanny Builder, что бы их определить и скопируйте в нужные поля.

Тип гонки пусть будет - Спринт. Имя миссии - это название потока. Укажем TEST_RA. Так, как мы будем делать миссию для Cleo, то Номер миссии в мэйне указывать не нужно. Перейдём во вкладку "Параметры машин". Здесь мы будем добавлять наш транспорт. Для этого нужно в игре сесть в какую-то машину и занять позицию, где должна она находится при старте и определим её координаты и модель, нажав на кнопку "Добавить машину":

Проделайте эту процедуру раза 3. Дальше устанавливаем значение "Улучшенное управление машин..." на 1.75, как показано на рисунке выше ( оранжевая линия ). Поставим галочку на чекбокс "Все машины пуле-непробиваемы". Таким образом в машин появятся иммунитеты.

Следующий шаг - установка Чекпоинтов. Это сферы, к которым нужно ехать. Делается это таким-же способом, что и машины.

Для примера, три достаточно три точки. Скорость уже нужно определять на глаз. Если гонка идёт по трассе, то 100 будет нормально. Если же гонка будет содержать множество поворотов, то оптимально ставить значение на 40. Иначе противники не смогут вписаться в поворот.

"Тип езды" ставим "По обычным транспортным путям", в этом случае противники более-менее адекватно будут ехать по дороге. Ни и вкладка "Прочие параметры" ставим галочку в чекбоксе "восстанавливать машины противников...", задаём призовые и время проведения гонки.

В меню выбираем: "Скрипт->Построить". Перед нами код, построенный программой. Первый поток является стартером. В Sanny Builder создадим два новых файла, в первый кинем верхнюю часть, во второй - код миссии.

Сам стартер, как по мне не очень, и я решил переделать его на более удобный. Получилось следующее:

{$cleo}
0000:

:STARTER
thread 'STARTER'
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @STARTER_END
0@ = Marker.CreateIconAndSphere(53, -2239.009, -206.6812, 35.4655)

while true
 if AND
 00EC: actor $PLAYER_ACTOR 0 near_point -2239.009 -206.6812 radius 2.0 2.0
 $ONMISSION == 0
 not actor.Driving($PLAYER_ACTOR)
 then
 break
 end
wait 0
end

Player.CanMove($PLAYER_CHAR) = false
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
fade 0 1000
wait 1000

Marker.Disable(0@)
054C: use_GXT_table 'RACETOR'
00BA: text_styled 'RACES_0' 1500 ms 2 // Races
00BE: text_clear_all
03E6: remove_text_box
0A94: start_custom_mission "TEST_RC"
wait 1000
jump @STARTER

:STARTER_END
wait 0
0A93: end_custom_thread

Код миссии копируем во второй файл. У меня вышел следующий код:

{$cleo .cm}
0000:

//-------------Mission 0---------------

var
$money : integer = 20000
$traff : float = 0.0
$a : integer = 3
$ak : integer = 1
$b : integer = 2
$d : integer = 0
end

var
$nar : integer
$tar : integer
$time : float = 0.0
$dist : float
$dist2 : float
$pos : integer = 1
$pos2 : integer = 1
$stage : array 7 of integer
$car : array 7 of car
$model : array 7 of integer
$act : array 7 of actor
$mark : array 7 of marker
$carx : array 7 of float
$cary : array 7 of float
$carz : array 7 of float
$angle : array 7 of float
$pointx : array 10 of float
$pointy : array 10 of float
$pointz : array 10 of float
$speed : array 10 of float
$type : array 10 of integer
end

:TEST_RC_000
thread 'TEST_RC'
gosub @TEST_RC_47
if
 wasted_or_busted
jf @TEST_RC_38
gosub @TEST_RC_2497

:TEST_RC_38
gosub @TEST_RC_2762
end_thread

:TEST_RC_47
increment_mission_attempts
$ONMISSION = 1 // integer values
00C0: set_current_time 0 0
Player.ClearWantedLevel($PLAYER_CHAR)
00BE: text_clear_all
$a0 = 0 // integer values
$a1 = 1 // integer values
$a2 = 2 // integer values
$a3 = 3 // integer values
$a4 = 4 // integer values
$a5 = 5 // integer values
$a6 = 6 // integer values
$a7 = 7 // integer values
$a8 = 8 // integer values
$a9 = 9 // integer values
$a10 = 10 // integer values
$a11 = 11 // integer values

for $par = 1 to $a
$stage[$par] = 1
end

$pointx[$a1] = -2252.6108 // floating-point values
$pointy[$a1] = -36.9271 // floating-point values
$pointz[$a1] = 34.7809 // floating-point values
$speed[$a1] = 100.0 // floating-point values
$type[$a1] = 1 // integer values
$pointx[$a2] = -2250.3931 // floating-point values
$pointy[$a2] = 222.0426 // floating-point values
$pointz[$a2] = 34.774 // floating-point values
$speed[$a2] = 100.0 // floating-point values
$type[$a2] = 1 // integer values
$carx[$a1] = -2252.9915 // floating-point values
$cary[$a1] = -203.6328 // floating-point values
$carz[$a1] = 34.8808 // floating-point values
$angle[$a1] = 0.8863 // floating-point values
$carx[$a2] = -2256.1475 // floating-point values
$cary[$a2] = -203.5943 // floating-point values
$carz[$a2] = 34.8783 // floating-point values
$angle[$a2] = 0.2939 // floating-point values
$carx[$a3] = -2259.1709 // floating-point values
$cary[$a3] = -203.6472 // floating-point values
$carz[$a3] = 34.8799 // floating-point values
$angle[$a3] = 1.4727 // floating-point values
$model[$a1] = #MANANA
$model[$a2] = #STRATUM
$model[$a3] = #JESTER
054C: use_GXT_table 'RACETOR'

for $par = 1 to $a
Model.Load($model[$par])
end
038B: load_requested_models

:TEST_RC_111
wait 0 ms
for $par = 1 to $a
 if
 Model.Available($model[$par])
 jf @TEST_RC_111
end

01EB: set_traffic_density_to 0.0
0395: clear_area 0 at $carx[$ak] $cary[$ak] $carz[$ak] range 300.0
for $par = 1 to $a
$car[$par] = Car.Create($model[$par], $carx[$par], $cary[$par], $carz[$par])
Car.Angle($car[$par]) = $angle[$par]
07EE: car $car[$par] enable_tire_marks 1
Car.DoorStatus($car[$par]) = 2
 if
 $par <> $ak
 then
 0560: $car[$par] = create_random_driver_in_vehicle $act[$par]
 end
end

036A: put_actor $PLAYER_ACTOR in_vehicle $car[$ak]
03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 1
03F4: set_all_vehicles_apply_damage_rules 0
wait 2500 ms
Camera.SetBehindPlayer
Camera.Restore
fade 1 1000
wait 1000 ms
00BA: text_styled 'RACES_4' 1100 ms 4 // 3
097A: at 0.0 0.0 0.0 play_sound 1056
wait 1100 ms
00BA: text_styled 'RACES_5' 1100 ms 4 // 2
097A: at 0.0 0.0 0.0 play_sound 1056
wait 1100 ms
00BA: text_styled 'RACES_6' 1100 ms 4 // 1
097A: at 0.0 0.0 0.0 play_sound 1056
wait 1100 ms
00BA: text_styled 'RACES_7' 800 ms 4 // GO!
097A: at 0.0 0.0 0.0 play_sound 1057
01BD: 11@ = current_time_in_ms
Player.CanMove($PLAYER_CHAR) = True
03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 0
03F4: set_all_vehicles_apply_damage_rules 1
01EB: set_traffic_density_to $traff

for $par = 1 to $a
 if
 $par <> $ak
 then
 Car.SetSpeedInstantly($car[$par], 14.0)
 05D1: AS_actor $act[$par] drive_vehicle -1 to $pointx[$a1] $pointy[$a1] $pointz[$a1] speed $speed[$a1] $type[$a1] 0 2
 $mark[$par] = Marker.CreateAboveCar($car[$par])
 Marker.SetColor($mark[$par], 2)
 Marker.SetIconSize($mark[$par], 2)
 end
end

03C3: set_timer_with_text_to $time type 0 text 'TIMER' // TIME

for $kar = 1 to $b
$nar = $kar // integer values
$nar += 1 // integer values
018A: $chekp = create_checkpoint_at $pointx[$kar] $pointy[$kar] $pointz[$kar]
0168: show_on_radar $chekp 4
 if
 $kar == $b // integer values
 then
 Marker.SetColor($chekp, 0)
 $a0 = 1 // integer values
 end
06D5: $rchekp = create_racing_checkpoint_at $pointx[$kar] $pointy[$kar] $pointz[$kar] point_to $pointx[$nar] $pointy[$nar] $pointz[$nar] type $a0 radius 6.0
 while 8100: not actor $PLAYER_ACTOR near_point_in_vehicle $pointx[$kar] $pointy[$kar] $pointz[$kar] radius 12.0 12.0 12.0 sphere 0
 gosub @TEST_RC_211
 03F0: toggle_text_draw 0
 $pos2 = $pos // integer values
 0340: set_text_draw_color 134 155 184 255
 0349: text_draw_style = 1
 033F: set_text_draw_letter_width_height 1.0 3.6
 0341: unknown_text_stuff 3
 0342: set_text_draw_centered 1
 0343: set_text_linewidth 640.0
 060D: draw_text_shadow 2 color 0 0 0 alpha 180
 038E: draw_box position 570.7242 356.2812 scale 68.2072 48.2072 color 0 0 0 alpha 255
 038E: draw_box position 570.7242 356.2812 scale 66.2072 46.2072 color 134 155 184 alpha 255
 038E: draw_box position 570.7242 356.2812 scale 62.2072 42.2072 color 0 0 0 alpha 255
 045A: text_draw_1number 570.0 339.0 'RACES44' $pos2 // ~1~TH
 $pos = 1 // integer values
 if
 not Actor.InCar($PLAYER_ACTOR, $car[$ak])
 then
 jump @TEST_RC_2497
 end
 if or
 Car.Wrecked($car[$ak])
 02BF: car $car[$ak] sunk
 then
 jump @TEST_RC_2497
 end
 wait 0 ms
 end
Marker.Disable($chekp)
06D6: delete_racing_checkpoint $rchekp
097A: at 0.0 0.0 0.0 play_sound 1058
end
jump @TEST_RC_2491

:TEST_RC_211
for $ind = 1 to $a
 if
 $ind <> $ak // integer values
 then
 if
 $car[$ind] <> -1
 then
 if
 $stage[$ind] <= $b
 then
 $tar = $stage[$ind]
 if
 0100: actor $act[$ind] near_point_in_vehicle $pointx[$tar] $pointy[$tar] $pointz[$tar] radius 12.0 12.0 12.0 sphere 0
 then
 $stage[$ind] += 1
 if
 $stage[$ind] <= $b
 then
 $tar = $stage[$ind]
 05D1: AS_actor $act[$ind] drive_vehicle $car[$ind] to $pointx[$tar] $pointy[$tar] $pointz[$tar] speed $speed[$tar] $type[$tar] 0 2
 end
 end
 if
 $kar == $stage[$ind]
 then
 Car.StorePos($car[$ak], $xpos, $ypos, $zpos)
 0509: $dist = distance between point $xpos $ypos and point $pointx[$kar] $pointy[$kar]
 Car.StorePos($car[$ind], $xpos2, $ypos2, $zpos2)
 0509: $dist2 = distance between point $xpos2 $ypos2 and point $pointx[$kar] $pointy[$kar]
 if
 $dist > $dist2
 then
 $pos += 1
 end
 else
 if
 $stage[$ind] > $kar
 then
 $pos += 1
 end
 end
 else
 $pos += 1
 end
 if or
 01F4: vehicle $car[$ind] flipped
 02BF: car $car[$ind] sunk
 then
 Car.StorePos($car[$ind], $xpos, $ypos, $zpos)
 02C1: set $xpos $ypos $zpos to_car_path_coords_closest_to $xpos $ypos $zpos
 Car.PutAt($car[$ind], $xpos, $ypos, $zpos)
 end
 end
 end
end
return

:TEST_RC_2491
gosub @TEST_RC_REMOVE
if
$pos2 == 1
then
00BA: text_styled 'RACES18' 3000 ms 1 // Winner!
wait 3000 ms
01E3: text_1number_styled 'M_PASS' $money 4000 ms 1 // MISSION PASSED!~n~~w~$~1~
Player.Money($PLAYER_CHAR) += $money
01BD: 12@ = current_time_in_ms
0085: 13@ = 12@ // integer values and handles
0062: 13@ -= 11@ // integer values
13@ /= 1000.0 // floating-point values
0085: 452@ = 13@ // integer values and handles
452@ /= 60 // integer values
0085: 36@ = 452@ // integer values and handles
36@ *= 60 // integer values
0085: 453@ = 13@ // integer values and handles
0062: 453@ -= 36@ // integer values
0394: play_music 1
02FD: text_2numbers_lowpriority 'TIME' 452@ 453@ 8000 ms 1 // ~1~:~1~
else
01E3: text_1number_styled 'RACES_8' 200 5000 ms 1
01BD: 12@ = current_time_in_ms
0085: 13@ = 12@ // integer values and handles
0062: 13@ -= 11@ // integer values
13@ /= 1000.0 // floating-point values
0085: 452@ = 13@ // integer values and handles
452@ /= 60 // integer values
0085: 36@ = 452@ // integer values and handles
36@ *= 60 // integer values
0085: 453@ = 13@ // integer values and handles
0062: 453@ -= 36@ // integer values
02FD: text_2numbers_lowpriority 'TIME' 452@ 453@ 8000 ms 1 // ~1~:~1~
end
0318: set_latest_mission_passed_to 'RACES_0' // Races
Player.ClearWantedLevel($PLAYER_CHAR)
gosub @TEST_RC_38
return

:TEST_RC_2497
gosub @TEST_RC_REMOVE
00BA: text_styled 'RACES_8' 5000 ms 1 // Loser!
return

:TEST_RC_REMOVE
01EB: set_traffic_density_to 1.0
Car.DoorStatus($car[$ak]) = 0
for $par = 1 to $a
 if
 $car[$par] <> -1
 then
 Car.SetImmunities($car[$par], 0, 0, 0, 0, 0)
 Model.Destroy($model[$par])
 Car.RemoveReferences($car[$par])
 if
 $par <> $ak
 then
 Marker.Disable($mark[$par])
 Actor.RemoveReferences($act[$par])
 end
 end
end
Marker.Disable($chekp)
06D6: delete_racing_checkpoint $rchekp
03F0: toggle_text_draw 0
014F: delete_timer $time
01B7: release_weather
return

:TEST_RC_2762
$ONMISSION = 0 // integer values
mission_cleanup
return

Здесь я отредактировал только следующее:

Camera.SetBehindPlayer
Camera.Restore

Переместил перед ближайшим "fade 1", что бы камера следовала за игроком перед осветлением екрана. Убрал:

Player.CanMove($PLAYER_CHAR) = False
// и
create_thread @TEST_RA

Так как мы запретили игроку двигаться в стартере и нам не нужно делать переход к этому стартеру, так как он находится в другом файле. И добавил опкод:

038B: load_requested_models

Так как он отсутствовал в коде. Дальше уже нужно просто скомпилировать этот код. Программа SARMC прекрасно сгенерировала код, чем мы воспользовались.

Осталось проверить, работает ли наш скрипт ( советую сначала закрыть программу-генератор и GTA SA, так как могут возникнуть проблемы как у меня ).

Результат:

Отлично! На этой программе я делал мод NFS GTA RACE, можете и вы сделать что-то подобное. Всем пока!|1081|1|0|90127376png600337400224``\|43126613png649466400287\|92736430`png`649`466`400`287|65734758png649466400`287``||delaem_gonochnuju_missiju|1504502393

Last updated