Делаем гоночную миссию ( 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