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