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 создадим два новых файла, в первый кинем верхнюю часть, во второй - код миссии.
Сам стартер, как по мне не очень, и я решил переделать его на более удобный. Получилось следующее:
1
{$cleo}
2
0000:
3
4
:STARTER
5
thread 'STARTER'
6
wait 0
7
if
8
Player.Defined($PLAYER_CHAR)
9
jf @STARTER_END
10
[email protected] = Marker.CreateIconAndSphere(53, -2239.009, -206.6812, 35.4655)
11
12
while true
13
if AND
14
00EC: actor $PLAYER_ACTOR 0 near_point -2239.009 -206.6812 radius 2.0 2.0
15
$ONMISSION == 0
16
not actor.Driving($PLAYER_ACTOR)
17
then
18
break
19
end
20
wait 0
21
end
22
23
Player.CanMove($PLAYER_CHAR) = false
24
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
25
fade 0 1000
26
wait 1000
27
28
Marker.Disable([email protected])
29
054C: use_GXT_table 'RACETOR'
30
00BA: text_styled 'RACES_0' 1500 ms 2 // Races
31
00BE: text_clear_all
32
03E6: remove_text_box
33
0A94: start_custom_mission "TEST_RC"
34
wait 1000
35
jump @STARTER
36
37
:STARTER_END
38
wait 0
39
0A93: end_custom_thread
Copied!
Код миссии копируем во второй файл. У меня вышел следующий код:
1
{$cleo .cm}
2
0000:
3
4
//-------------Mission 0---------------
5
6
var
7
$money : integer = 20000
8
$traff : float = 0.0
9
$a : integer = 3
10
$ak : integer = 1
11
$b : integer = 2
12
$d : integer = 0
13
end
14
15
var
16
$nar : integer
17
$tar : integer
18
$time : float = 0.0
19
$dist : float
20
$dist2 : float
21
$pos : integer = 1
22
$pos2 : integer = 1
23
$stage : array 7 of integer
24
$car : array 7 of car
25
$model : array 7 of integer
26
$act : array 7 of actor
27
$mark : array 7 of marker
28
$carx : array 7 of float
29
$cary : array 7 of float
30
$carz : array 7 of float
31
$angle : array 7 of float
32
$pointx : array 10 of float
33
$pointy : array 10 of float
34
$pointz : array 10 of float
35
$speed : array 10 of float
36
$type : array 10 of integer
37
end
38
39
:TEST_RC_000
40
thread 'TEST_RC'
41
gosub @TEST_RC_47
42
if
43
wasted_or_busted
44
jf @TEST_RC_38
45
gosub @TEST_RC_2497
46
47
:TEST_RC_38
48
gosub @TEST_RC_2762
49
end_thread
50
51
:TEST_RC_47
52
increment_mission_attempts
53
$ONMISSION = 1 // integer values
54
00C0: set_current_time 0 0
55
Player.ClearWantedLevel($PLAYER_CHAR)
56
00BE: text_clear_all
57
$a0 = 0 // integer values
58
$a1 = 1 // integer values
59
$a2 = 2 // integer values
60
$a3 = 3 // integer values
61
$a4 = 4 // integer values
62
$a5 = 5 // integer values
63
$a6 = 6 // integer values
64
$a7 = 7 // integer values
65
$a8 = 8 // integer values
66
$a9 = 9 // integer values
67
$a10 = 10 // integer values
68
$a11 = 11 // integer values
69
70
for $par = 1 to $a
71
$stage[$par] = 1
72
end
73
74
$pointx[$a1] = -2252.6108 // floating-point values
75
$pointy[$a1] = -36.9271 // floating-point values
76
$pointz[$a1] = 34.7809 // floating-point values
77
$speed[$a1] = 100.0 // floating-point values
78
$type[$a1] = 1 // integer values
79
$pointx[$a2] = -2250.3931 // floating-point values
80
$pointy[$a2] = 222.0426 // floating-point values
81
$pointz[$a2] = 34.774 // floating-point values
82
$speed[$a2] = 100.0 // floating-point values
83
$type[$a2] = 1 // integer values
84
$carx[$a1] = -2252.9915 // floating-point values
85
$cary[$a1] = -203.6328 // floating-point values
86
$carz[$a1] = 34.8808 // floating-point values
87
$angle[$a1] = 0.8863 // floating-point values
88
$carx[$a2] = -2256.1475 // floating-point values
89
$cary[$a2] = -203.5943 // floating-point values
90
$carz[$a2] = 34.8783 // floating-point values
91
$angle[$a2] = 0.2939 // floating-point values
92
$carx[$a3] = -2259.1709 // floating-point values
93
$cary[$a3] = -203.6472 // floating-point values
94
$carz[$a3] = 34.8799 // floating-point values
95
$angle[$a3] = 1.4727 // floating-point values
96
$model[$a1] = #MANANA
97
$model[$a2] = #STRATUM
98
$model[$a3] = #JESTER
99
054C: use_GXT_table 'RACETOR'
100
101
for $par = 1 to $a
102
Model.Load($model[$par])
103
end
104
038B: load_requested_models
105
106
:TEST_RC_111
107
wait 0 ms
108
for $par = 1 to $a
109
if
110
Model.Available($model[$par])
111
jf @TEST_RC_111
112
end
113
114
01EB: set_traffic_density_to 0.0
115
0395: clear_area 0 at $carx[$ak] $cary[$ak] $carz[$ak] range 300.0
116
for $par = 1 to $a
117
$car[$par] = Car.Create($model[$par], $carx[$par], $cary[$par], $carz[$par])
118
Car.Angle($car[$par]) = $angle[$par]
119
07EE: car $car[$par] enable_tire_marks 1
120
Car.DoorStatus($car[$par]) = 2
121
if
122
$par <> $ak
123
then
124
0560: $car[$par] = create_random_driver_in_vehicle $act[$par]
125
end
126
end
127
128
036A: put_actor $PLAYER_ACTOR in_vehicle $car[$ak]
129
03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 1
130
03F4: set_all_vehicles_apply_damage_rules 0
131
wait 2500 ms
132
Camera.SetBehindPlayer
133
Camera.Restore
134
fade 1 1000
135
wait 1000 ms
136
00BA: text_styled 'RACES_4' 1100 ms 4 // 3
137
097A: at 0.0 0.0 0.0 play_sound 1056
138
wait 1100 ms
139
00BA: text_styled 'RACES_5' 1100 ms 4 // 2
140
097A: at 0.0 0.0 0.0 play_sound 1056
141
wait 1100 ms
142
00BA: text_styled 'RACES_6' 1100 ms 4 // 1
143
097A: at 0.0 0.0 0.0 play_sound 1056
144
wait 1100 ms
145
00BA: text_styled 'RACES_7' 800 ms 4 // GO!
146
097A: at 0.0 0.0 0.0 play_sound 1057
147
01BD: [email protected] = current_time_in_ms
148
Player.CanMove($PLAYER_CHAR) = True
149
03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 0
150
03F4: set_all_vehicles_apply_damage_rules 1
151
01EB: set_traffic_density_to $traff
152
153
for $par = 1 to $a
154
if
155
$par <> $ak
156
then
157
Car.SetSpeedInstantly($car[$par], 14.0)
158
05D1: AS_actor $act[$par] drive_vehicle -1 to $pointx[$a1] $pointy[$a1] $pointz[$a1] speed $speed[$a1] $type[$a1] 0 2
159
$mark[$par] = Marker.CreateAboveCar($car[$par])
160
Marker.SetColor($mark[$par], 2)
161
Marker.SetIconSize($mark[$par], 2)
162
end
163
end
164
165
03C3: set_timer_with_text_to $time type 0 text 'TIMER' // TIME
166
167
for $kar = 1 to $b
168
$nar = $kar // integer values
169
$nar += 1 // integer values
170
018A: $chekp = create_checkpoint_at $pointx[$kar] $pointy[$kar] $pointz[$kar]
171
0168: show_on_radar $chekp 4
172
if
173
$kar == $b // integer values
174
then
175
Marker.SetColor($chekp, 0)
176
$a0 = 1 // integer values
177
end
178
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
179
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
180
gosub @TEST_RC_211
181
03F0: toggle_text_draw 0
182
$pos2 = $pos // integer values
183
0340: set_text_draw_color 134 155 184 255
184
0349: text_draw_style = 1
185
033F: set_text_draw_letter_width_height 1.0 3.6
186
0341: unknown_text_stuff 3
187
0342: set_text_draw_centered 1
188
0343: set_text_linewidth 640.0
189
060D: draw_text_shadow 2 color 0 0 0 alpha 180
190
038E: draw_box position 570.7242 356.2812 scale 68.2072 48.2072 color 0 0 0 alpha 255
191
038E: draw_box position 570.7242 356.2812 scale 66.2072 46.2072 color 134 155 184 alpha 255
192
038E: draw_box position 570.7242 356.2812 scale 62.2072 42.2072 color 0 0 0 alpha 255
193
045A: text_draw_1number 570.0 339.0 'RACES44' $pos2 // ~1~TH
194
$pos = 1 // integer values
195
if
196
not Actor.InCar($PLAYER_ACTOR, $car[$ak])
197
then
198
jump @TEST_RC_2497
199
end
200
if or
201
Car.Wrecked($car[$ak])
202
02BF: car $car[$ak] sunk
203
then
204
jump @TEST_RC_2497
205
end
206
wait 0 ms
207
end
208
Marker.Disable($chekp)
209
06D6: delete_racing_checkpoint $rchekp
210
097A: at 0.0 0.0 0.0 play_sound 1058
211
end
212
jump @TEST_RC_2491
213
214
:TEST_RC_211
215
for $ind = 1 to $a
216
if
217
$ind <> $ak // integer values
218
then
219
if
220
$car[$ind] <> -1
221
then
222
if
223
$stage[$ind] <= $b
224
then
225
$tar = $stage[$ind]
226
if
227
0100: actor $act[$ind] near_point_in_vehicle $pointx[$tar] $pointy[$tar] $pointz[$tar] radius 12.0 12.0 12.0 sphere 0
228
then
229
$stage[$ind] += 1
230
if
231
$stage[$ind] <= $b
232
then
233
$tar = $stage[$ind]
234
05D1: AS_actor $act[$ind] drive_vehicle $car[$ind] to $pointx[$tar] $pointy[$tar] $pointz[$tar] speed $speed[$tar] $type[$tar] 0 2
235
end
236
end
237
if
238
$kar == $stage[$ind]
239
then
240
Car.StorePos($car[$ak], $xpos, $ypos, $zpos)
241
0509: $dist = distance between point $xpos $ypos and point $pointx[$kar] $pointy[$kar]
242
Car.StorePos($car[$ind], $xpos2, $ypos2, $zpos2)
243
0509: $dist2 = distance between point $xpos2 $ypos2 and point $pointx[$kar] $pointy[$kar]
244
if
245
$dist > $dist2
246
then
247
$pos += 1
248
end
249
else
250
if
251
$stage[$ind] > $kar
252
then
253
$pos += 1
254
end
255
end
256
else
257
$pos += 1
258
end
259
if or
260
01F4: vehicle $car[$ind] flipped
261
02BF: car $car[$ind] sunk
262
then
263
Car.StorePos($car[$ind], $xpos, $ypos, $zpos)
264
02C1: set $xpos $ypos $zpos to_car_path_coords_closest_to $xpos $ypos $zpos
265
Car.PutAt($car[$ind], $xpos, $ypos, $zpos)
266
end
267
end
268
end
269
end
270
return
271
272
:TEST_RC_2491
273
gosub @TEST_RC_REMOVE
274
if
275
$pos2 == 1
276
then
277
00BA: text_styled 'RACES18' 3000 ms 1 // Winner!
278
wait 3000 ms
279
01E3: text_1number_styled 'M_PASS' $money 4000 ms 1 // MISSION PASSED!~n~~w~$~1~
280
Player.Money($PLAYER_CHAR) += $money
281
01BD: [email protected] = current_time_in_ms
282
0085: [email protected] = [email protected] // integer values and handles
283
0062: [email protected] -= [email protected] // integer values
284
[email protected] /= 1000.0 // floating-point values
285
0085: [email protected] = [email protected] // integer values and handles
286
[email protected] /= 60 // integer values
287
0085: [email protected] = [email protected] // integer values and handles
288
[email protected] *= 60 // integer values
289
0085: [email protected] = [email protected] // integer values and handles
290
0062: [email protected] -= [email protected] // integer values
291
0394: play_music 1
292
02FD: text_2numbers_lowpriority 'TIME' [email protected] [email protected] 8000 ms 1 // ~1~:~1~
293
else
294
01E3: text_1number_styled 'RACES_8' 200 5000 ms 1
295
01BD: [email protected] = current_time_in_ms
296
0085: [email protected] = [email protected] // integer values and handles
297
0062: [email protected] -= [email protected] // integer values
298
[email protected] /= 1000.0 // floating-point values
299
0085: [email protected] = [email protected] // integer values and handles
300
[email protected] /= 60 // integer values
301
0085: [email protected] = [email protected] // integer values and handles
302
[email protected] *= 60 // integer values
303
0085: [email protected] = [email protected] // integer values and handles
304
0062: [email protected] -= [email protected] // integer values
305
02FD: text_2numbers_lowpriority 'TIME' [email protected] [email protected] 8000 ms 1 // ~1~:~1~
306
end
307
0318: set_latest_mission_passed_to 'RACES_0' // Races
308
Player.ClearWantedLevel($PLAYER_CHAR)
309
gosub @TEST_RC_38
310
return
311
312
:TEST_RC_2497
313
gosub @TEST_RC_REMOVE
314
00BA: text_styled 'RACES_8' 5000 ms 1 // Loser!
315
return
316
317
:TEST_RC_REMOVE
318
01EB: set_traffic_density_to 1.0
319
Car.DoorStatus($car[$ak]) = 0
320
for $par = 1 to $a
321
if
322
$car[$par] <> -1
323
then
324
Car.SetImmunities($car[$par], 0, 0, 0, 0, 0)
325
Model.Destroy($model[$par])
326
Car.RemoveReferences($car[$par])
327
if
328
$par <> $ak
329
then
330
Marker.Disable($mark[$par])
331
Actor.RemoveReferences($act[$par])
332
end
333
end
334
end
335
Marker.Disable($chekp)
336
06D6: delete_racing_checkpoint $rchekp
337
03F0: toggle_text_draw 0
338
014F: delete_timer $time
339
01B7: release_weather
340
return
341
342
:TEST_RC_2762
343
$ONMISSION = 0 // integer values
344
mission_cleanup
345
return
Copied!
Здесь я отредактировал только следующее:
1
Camera.SetBehindPlayer
2
Camera.Restore
Copied!
Переместил перед ближайшим "fade 1", что бы камера следовала за игроком перед осветлением екрана. Убрал:
1
Player.CanMove($PLAYER_CHAR) = False
2
// и
3
create_thread @TEST_RA
Copied!
Так как мы запретили игроку двигаться в стартере и нам не нужно делать переход к этому стартеру, так как он находится в другом файле. И добавил опкод:
1
038B: load_requested_models
Copied!
Так как он отсутствовал в коде. Дальше уже нужно просто скомпилировать этот код. Программа SARMC прекрасно сгенерировала код, чем мы воспользовались.
Осталось проверить, работает ли наш скрипт ( советую сначала закрыть программу-генератор и GTA SA, так как могут возникнуть проблемы как у меня ).
Результат:
Отлично! На этой программе я делал мод NFS GTA RACE, можете и вы сделать что-то подобное. Всем пока!|1081|1|0|90127376png600337400224``\|43126613png649466400287\|92736430`png`649`466`400`287|65734758png649466400`287``||delaem_gonochnuju_missiju|1504502393
Copy link
Edit on GitHub