You are not logged in.
Pages: 1
Обновленная версия мода:
http://sannybuilder.com/forums/viewtopi … 593#p13593
Last edited by Ruzel (29-12-2010 13:50)
Offline
Читать столько кода не стану. Объясни принцип, алгоритм работы, а я может подскажу, где может быть проблема... Модели выгружаешь? scmlog смотрел?
Offline
Модели выгружаю. Скм лог говорит, что вылетает все время на разных опкодах. Тот момент, что выбранный актер может исчезнуть, учел.
Принцип работы скрипта:
сперва проверяется расстояние от точки до игрока. Если больше 150, то переход обратно. Если меньше, то:
1.создаются машина и актеры, актеры патрулируют по зоне.
2.Начинает работать цикл, который находит случайных актеров в этой зоне. Если найденный актер - это актер-охранник, то ищется следующий. Если следующего нет - возврат к началу цикла (поиск уже в следующей точке по радиусу) (точка в начале цикла берется случайным образом в пределе нашей зоны)
3.Если чужой актер найден, то все актеры-охранники его атакуют. Машина подъезжает к чужому актеру. ( на ней в турете стоит охранник)
4.Если чужой актер не найден или он умер, то охранники опять патрулируют. Машина возвращается в начальную точку.
5.Параллельно идет проверка еще 2-х циклов: 1-й - это на расстояние (вдруг игрок уже давно уехал оттуда) и 2-й, который отвечает за нахождение чужого актера возле въезда в охраняемую зону.(принцип поиска такой же, только координаты центра окружности для поиска не меняется.)
Найденному чужому актеру флаг уникальности не записывается...
Кстати, у меня есть еще один скрипт, там тоже вылет идет на разных опкодах...
Может игровой памяти нехватает? (всего установлено сриптов - 2 (эти); игра оригинальна)
Offline
Хм.. почти всегда вылетает после опкода 0051, т.е. return.
Что могло бы это значить? Нельзя записывать несколько gosub'ов подряд? тогда почему сперва все норм, только на 7-8 круге повтора вылетает? Вложенных госабов нету..
Offline
А если я быстро отойду на более 150 (или сколько там метров) и подойду снова?:D
Offline
Хм.. почти всегда вылетает после опкода 0051, т.е. return
Значит перед return не был выполнен gosub. Внимательно проверь все варианты работы скрипта. Или можно просто убрать gosub-ы и return-ы, заменив их jump-ами.
Offline
Хм.. почти всегда вылетает после опкода 0051, т.е. return.
Что могло бы это значить? Нельзя записывать несколько gosub'ов подряд? тогда почему сперва все норм, только на 7-8 круге повтора вылетает? Вложенных госабов нету..
почему-то возникает мысль, что кол-во gosub больше чем return. Соответственно, переполняется стек gosub-ов и вылет. Например, как в таком коде
:start gosub @1 end_thread :1 jump @start
Offline
Хехе, так оно и есть)) Блин как я сразу не додумался.. Спасибо большое, буду исправлять))
Offline
Суть скрипта в том, что в северной части карты, западнее заброшенной авиа полосы, появляется ваша собственная зона. Она помечена зеленым человечком на карте. Так вот на вашей зоне ходят туда - сюда ваши охранники зоны, которые будут убивать всех, кто зашел на нее. Всех, как случайных педов/машин, так и созданными какими либо скриптами.
Все работает отлично
// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
wait 1000
marker.CreateIconWithoutSphere(15@, 62, -523.6, 2593.2, 53.5)
:NONAME_5
wait 200
0629: change_integer_stat 181 to 4
01F0: set_max_wanted_level_to 0
actor.StorePos($player_actor, 31@, 32@, 33@)
0509: 3@ = distance_between_XY 31@ 32@ and_XY -523.0 2593.0
if
3@ >= 150.0
then
jump @NONAME_5
end
model.Load(#FAM1)
model.Load(#AK47)
model.Load(#SUPERGT)
038B:
:___0
wait 1
if and
model.Available(#FAM1)
model.Available(#AK47)
model.Available(#SUPERGT)
jf @___0
04E4: unknown_refresh_game_renderer_at -523.6 2593.2
actor.Create(4@, 4, #fam1, -520.2, 2583.0, 53.5)
actor.Create(5@, 4, #fam1, -528.4, 2557.6, 53.5)
actor.Create(6@, 4, #fam1, -520.4, 2603.7, 53.5)
actor.Create(7@, 4, #fam1, -527.9, 2628.4, 53.5)
01B2: give_actor 4@ weapon 30 ammo 9999 // Load the weapon model before using this
01B2: give_actor 5@ weapon 30 ammo 9999 // Load the weapon model before using this
01B2: give_actor 6@ weapon 30 ammo 9999 // Load the weapon model before using this
01B2: give_actor 7@ weapon 30 ammo 9999 // Load the weapon model before using this
actor.SetImmunities(4@, 1, 1, 1, 1, 1)
actor.SetImmunities(5@, 1, 1, 1, 1, 1)
actor.SetImmunities(6@, 1, 1, 1, 1, 1)
actor.SetImmunities(7@, 1, 1, 1, 1, 1)
0446: set_actor 4@ immune_to_headshots 1
0446: set_actor 5@ immune_to_headshots 1
0446: set_actor 6@ immune_to_headshots 1
0446: set_actor 7@ immune_to_headshots 1
actor.Health(4@) = 9999
actor.Health(5@) = 9999
actor.Health(6@) = 9999
actor.Health(7@) = 9999
actor.WeaponAccuracy(4@) = 80
actor.WeaponAccuracy(5@) = 80
actor.WeaponAccuracy(6@) = 80
actor.WeaponAccuracy(7@) = 80
car.Create(8@, #SUPERGT, -538.3, 2594.0, 53.1)
car.SetImmunities(8@, 1, 1,1, 1,1)
car.Health(8@) = 9999
053F: set_car 8@ tires_vulnerability 0
car.Angle(8@) = 290.0
0229: set_car 8@ primary_color_to 1 secondary_color_to 0
actor.Create(9@, 4, #FAM1, 0.0, 0.0, 0.0)
072A: put_actor 9@ into_car 8@ driverseat
054A: set_actor 9@ immune_to_car_headshots 1
actor.SetImmunities(9@, 1, 1, 1, 1, 1)
car.DoorStatus(8@, 2)
actor.Create(10@, 4, #FAM1, 0.0, 0.0, 0.0)
01B2: give_actor 10@ weapon 30 ammo 9999
0464: put_actor 10@ into_turret_on_car 8@ at_car_offset 0.0 -1.8 1.2 position 0 shooting_angle_limit 360.0 with_weapon 30
actor.SetImmunities(10@, 1, 1, 1, 1, 1)
0446: set_actor 10@ immune_to_headshots 1
actor.WeaponAccuracy(10@) = 80
actor.Health(10@) = 9999
actor.Angle(10@) = 290.0
car.SetMaxSpeed(8@, 15.0)
00AE: set_car 8@ traffic_behaviour_to 3
actor.Create(11@, 4, #fam1, -502.1, 2597.7, 52.5)
actor.Create(12@, 4, #fam1, -502.1, 2588.5, 52.5)
actor.Angle(11@) = 270.0
actor.Angle(12@) = 270.0
01B2: give_actor 11@ weapon 30 ammo 9999 // Load the weapon model before using this
01B2: give_actor 12@ weapon 30 ammo 9999 // Load the weapon model before using this
actor.SetImmunities(11@, 1, 1, 1, 1, 1)
actor.SetImmunities(12@, 1, 1, 1, 1, 1)
0446: set_actor 11@ immune_to_headshots 1
0446: set_actor 12@ immune_to_headshots 1
actor.Health(11@) = 9999
actor.Health(12@) = 9999
actor.WeaponAccuracy(11@) = 80
actor.WeaponAccuracy(12@) = 80
actor.LockInCurrentPosition(11@, true)
actor.LockInCurrentPosition(12@, true)
model.Destroy(#AK47)
model.Destroy(#FAM1)
model.Destroy(#SUPERGT)
26@ = 1
14@ = 0
:0_
27@ = 0
07CD: AS_actor 4@ walk_to -520.2 2558.0 53.5 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor 5@ walk_to -528.4 2583.0 53.5 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor 6@ walk_to -520.2 2628.0 53.5 stop_with_angle 270.0 within_radius 1.0
07CD: AS_actor 7@ walk_to -528.4 2603.0 53.5 stop_with_angle 270.0 within_radius 1.0
:0
wait 1
jump @w
:00
jump @e
:000
gosub @t
:0000
jump @find
:00000
0208: 1@ = random_float_in_ranges -17.8 17.8
0208: 2@ = random_float_in_ranges -46.5 46.5
1@ += -523.6
2@ += 2593.2
0AE1: 3@ = random_actor_near_point 1@ 2@ 53.5 in_radius 10.0 find_next 0 pass_deads 1 //IF and SET
if or
3@ == false
3@ == -1
3@ == 0
then
jump @0
else
jump @1
end
:1
if or
003B: 3@ == 4@ // (int)
003B: 3@ == 5@ // (int)
003B: 3@ == 6@ // (int)
003B: 3@ == 7@ // (int)
003B: 3@ == 9@ // (int)
003B: 3@ == 10@ // (int)
003B: 3@ == 11@ // (int)
003B: 3@ == 12@ // (int)
then
if
00FE: actor 3@ sphere 0 in_sphere 1@ 2@ 53.5 radius 9.9 9.9 9.9
then
jump @11
else
jump @0
end
:11
0AE1: 3@ = random_actor_near_point 1@ 2@ 53.5 in_radius 10.0 find_next 1 pass_deads 1 //IF and SET
if or
3@ == false
3@ == -1
3@ == 0
then
jump @0
else
if or
003B: 3@ == 4@ // (int)
003B: 3@ == 5@ // (int)
003B: 3@ == 6@ // (int)
003B: 3@ == 7@ // (int)
003B: 3@ == 9@ // (int)
003B: 3@ == 10@ // (int)
003B: 3@ == 11@ // (int)
003B: 3@ == 12@ // (int)
then
jump @0
else
jump @OK
end
end
else
jump @OK
end
:OK
05E2: AS_actor 4@ kill_actor 3@
05E2: AS_actor 5@ kill_actor 3@
05E2: AS_actor 6@ kill_actor 3@
05E2: AS_actor 7@ kill_actor 3@
05E2: AS_actor 10@ kill_actor 3@
:9
wait 1
jump @q
:99
jump @w2
:999
gosub @r
:9999
jump @p
:99999
jump @find2
:999999
jump @9
:q
if or
not actor.Defined(3@)
actor.Dead(3@)
then
:pp
car.DriveTo(8@, -538.3, 2594.0, 53.1)
26@ = 0
jump @0_
else
jump @99
end
:w
actor.StorePos($player_actor, 31@, 32@, 33@)
0509: 33@ = distance_between_XY 31@ 32@ and_XY -523.0 2593.0
if
33@ >= 150.0
then
actor.RemoveReferences(4@)
actor.RemoveReferences(5@)
actor.RemoveReferences(6@)
actor.RemoveReferences(7@)
actor.RemoveReferences(9@)
actor.RemoveReferences(10@)
actor.RemoveReferences(11@)
actor.RemoveReferences(12@)
car.RemoveReferences(8@)
jump @NONAME_5
else
jump @00
end
:e
if
00FE: actor 4@ sphere 0 in_sphere -520.2 2558.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 4@ walk_to -520.2 2583.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 4@ sphere 0 in_sphere -520.2 2583.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 4@ walk_to -520.2 2558.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 5@ sphere 0 in_sphere -528.4 2583.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 5@ walk_to -528.4 2568.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 5@ sphere 0 in_sphere -528.4 2568.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 5@ walk_to -528.4 2583.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 6@ sphere 0 in_sphere -520.2 2628.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 6@ walk_to -520.2 2603.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 6@ sphere 0 in_sphere -520.2 2603.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 6@ walk_to -520.2 2628.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 7@ sphere 0 in_sphere -528.4 2603.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 7@ walk_to -528.4 2628.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
if
00FE: actor 7@ sphere 0 in_sphere -528.4 2628.0 53.5 radius 2.0 2.0 2.0
then
07CD: AS_actor 7@ walk_to -528.4 2603.0 53.5 stop_with_angle 270.0 within_radius 1.0
end
jump @000
:r
actor.StorePos(3@, 28@, 29@, 30@)
if
01AF: car 8@ sphere 0 in_sphere 28@ 29@ 30@ radius 6.0 6.0 6.0
then
car.SetDriverBehaviour(8@, 0)
05E2: AS_actor 10@ kill_actor 3@
return
else
27@ += 1
if
27@ >= 49 // время через которое машина едет к актеру 3@
then
car.LockInCurrentPosition(8@, false)
car.SetMaxSpeed(8@, 15.0)
car.DriveTo(8@, 28@, 29@, 30@)
27@ = 0
return
else
return
end
end
:t
if
01B0: car 8@ sphere 0 in_sphere -538.3 2594.0 53.1 radius 4.0 4.0 4.0 stopped
then
if
26@ == 0
then
car.PutAt(8@, -538.3, 2594.0, 53.1)
car.SetSpeedInstantly(8@, 0.0)
car.Angle(8@) = 290.0
26@ = 1
return
else
return
end
else
return
end
:find
if
14@ == 1
then
jump @check
end
0AE1: 13@ = random_actor_near_point -495.7 2593.0 53.5 in_radius 18.0 find_next 0 pass_deads 1 //IF and SET
if or
13@ == false
13@ == -1
13@ == 0
then
jump @00000
else
if or
003B: 13@ == 4@ // (int)
003B: 13@ == 5@ // (int)
003B: 13@ == 6@ // (int)
003B: 13@ == 7@ // (int)
003B: 13@ == 9@ // (int)
003B: 13@ == 10@ // (int)
003B: 13@ == 11@ // (int)
003B: 13@ == 12@ // (int)
then
0AE1: 13@ = random_actor_near_point -495.7 2593.0 53.5 in_radius 18.0 find_next 1 pass_deads 1 //IF and SET
if or
003B: 13@ == 4@ // (int)
003B: 13@ == 5@ // (int)
003B: 13@ == 6@ // (int)
003B: 13@ == 7@ // (int)
003B: 13@ == 9@ // (int)
003B: 13@ == 10@ // (int)
003B: 13@ == 11@ // (int)
003B: 13@ == 12@ // (int)
then
0AE1: 13@ = random_actor_near_point -495.7 2593.0 53.5 in_radius 18.0 find_next 1 pass_deads 1 //IF and SET
if or
003B: 13@ == 4@ // (int)
003B: 13@ == 5@ // (int)
003B: 13@ == 6@ // (int)
003B: 13@ == 7@ // (int)
003B: 13@ == 9@ // (int)
003B: 13@ == 10@ // (int)
003B: 13@ == 11@ // (int)
003B: 13@ == 12@ // (int)
then
jump @00000
else
14@ = 1
jump @found
end
else
14@ = 1
jump @found
end
else
14@ = 1
jump @found
end
end
:found
05E2: AS_actor 11@ kill_actor 13@
05E2: AS_actor 12@ kill_actor 13@
jump @00000
:check
if or
not actor.Defined(13@)
actor.Dead(13@)
then
14@ = 0
actor.Angle(11@) = 270.0
actor.Angle(12@) = 270.0
05B9: AS_actor 11@ stay_idle 10 ms
05B9: AS_actor 12@ stay_idle 10 ms
jump @00000
else
jump @o
end
:o
actor.StorePos(13@, 16@, 17@, 18@)
0509: 18@ = distance_between_XY 16@ 17@ and_XY -495.7 2593.0
if
18@ >= 20.0
then
14@ = 0
actor.Angle(11@) = 270.0
actor.Angle(12@) = 270.0
05B9: AS_actor 11@ stay_idle 10 ms
05B9: AS_actor 12@ stay_idle 10 ms
jump @00000
else
jump @00000
end
:p
if
00A3: actor 3@ sphere 0 in_rectangle_cornerA -551.4 2537.6 cornerB -496.4 2649.4
then
jump @99999
else
05B9: AS_actor 10@ stay_idle 10 ms
jump @pp
end
:w2
actor.StorePos($player_actor, 31@, 32@, 33@)
0509: 33@ = distance_between_XY 31@ 32@ and_XY -523.0 2593.0
if
33@ >= 150.0
then
actor.RemoveReferences(4@)
actor.RemoveReferences(5@)
actor.RemoveReferences(6@)
actor.RemoveReferences(7@)
actor.RemoveReferences(9@)
actor.RemoveReferences(10@)
actor.RemoveReferences(11@)
actor.RemoveReferences(12@)
car.RemoveReferences(8@)
jump @NONAME_5
else
jump @999
end
:find2
if
14@ == 1
then
jump @check2
end
0AE1: 13@ = random_actor_near_point -495.7 2593.0 53.5 in_radius 18.0 find_next 0 pass_deads 1 //IF and SET
if or
13@ == false
13@ == -1
13@ == 0
then
jump @999999
else
if or
003B: 13@ == 4@ // (int)
003B: 13@ == 5@ // (int)
003B: 13@ == 6@ // (int)
003B: 13@ == 7@ // (int)
003B: 13@ == 9@ // (int)
003B: 13@ == 10@ // (int)
003B: 13@ == 11@ // (int)
003B: 13@ == 12@ // (int)
then
0AE1: 13@ = random_actor_near_point -495.7 2593.0 53.5 in_radius 18.0 find_next 1 pass_deads 1 //IF and SET
if or
003B: 13@ == 4@ // (int)
003B: 13@ == 5@ // (int)
003B: 13@ == 6@ // (int)
003B: 13@ == 7@ // (int)
003B: 13@ == 9@ // (int)
003B: 13@ == 10@ // (int)
003B: 13@ == 11@ // (int)
003B: 13@ == 12@ // (int)
then
0AE1: 13@ = random_actor_near_point -495.7 2593.0 53.5 in_radius 18.0 find_next 1 pass_deads 1 //IF and SET
if or
003B: 13@ == 4@ // (int)
003B: 13@ == 5@ // (int)
003B: 13@ == 6@ // (int)
003B: 13@ == 7@ // (int)
003B: 13@ == 9@ // (int)
003B: 13@ == 10@ // (int)
003B: 13@ == 11@ // (int)
003B: 13@ == 12@ // (int)
then
jump @999999
else
14@ = 1
jump @found2
end
else
14@ = 1
jump @found2
end
else
14@ = 1
jump @found2
end
end
:found2
05E2: AS_actor 11@ kill_actor 13@
05E2: AS_actor 12@ kill_actor 13@
jump @999999
:check2
if or
not actor.Defined(13@)
actor.Dead(13@)
then
14@ = 0
actor.Angle(11@) = 270.0
actor.Angle(12@) = 270.0
05B9: AS_actor 11@ stay_idle 10 ms
05B9: AS_actor 12@ stay_idle 10 ms
jump @999999
else
jump @o2
end
:o2
actor.StorePos(13@, 16@, 17@, 18@)
0509: 18@ = distance_between_XY 16@ 17@ and_XY -495.7 2593.0
if
18@ >= 20.0
then
14@ = 0
actor.Angle(11@) = 270.0
actor.Angle(12@) = 270.0
05B9: AS_actor 11@ stay_idle 10 ms
05B9: AS_actor 12@ stay_idle 10 ms
jump @999999
else
jump @999999
end
Offline
Pages: 1