#1 24-12-2010 10:28

Ruzel
Registered: 03-06-2010
Posts: 61

Cleo Личная Зона

Обновленная версия мода:
http://sannybuilder.com/forums/viewtopi … 593#p13593

Last edited by Ruzel (29-12-2010 13:50)

Offline

#2 27-12-2010 14:00

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Cleo Личная Зона

Читать столько кода не стану. Объясни принцип, алгоритм работы, а я может подскажу, где может быть проблема... Модели выгружаешь? scmlog смотрел?

Offline

#3 28-12-2010 13:36

Ruzel
Registered: 03-06-2010
Posts: 61

Re: Cleo Личная Зона

Модели выгружаю. Скм лог говорит, что вылетает все время на разных опкодах. Тот момент, что выбранный актер может исчезнуть, учел.
Принцип работы скрипта:
сперва проверяется расстояние от точки до игрока. Если больше 150, то переход обратно. Если меньше, то:
1.создаются машина и актеры, актеры патрулируют по зоне.
2.Начинает работать цикл, который находит случайных актеров в этой зоне. Если найденный актер - это актер-охранник, то ищется следующий. Если следующего нет - возврат к началу цикла (поиск уже в следующей точке по радиусу) (точка в начале цикла берется случайным образом в пределе нашей зоны)
3.Если чужой актер найден, то все актеры-охранники его атакуют. Машина подъезжает к чужому актеру. ( на ней в турете стоит охранник)
4.Если чужой актер не найден или он умер, то охранники опять патрулируют. Машина возвращается в начальную точку.
5.Параллельно идет проверка еще 2-х циклов: 1-й - это на расстояние (вдруг игрок уже давно уехал оттуда) и 2-й, который отвечает за нахождение чужого актера возле въезда в охраняемую зону.(принцип поиска такой же, только координаты центра окружности для поиска не меняется.)

Найденному чужому актеру флаг уникальности не записывается...

Кстати, у меня есть еще один скрипт, там тоже вылет идет на разных опкодах...
Может игровой памяти нехватает? (всего установлено сриптов - 2 (эти); игра оригинальна)

Offline

#4 28-12-2010 17:53

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Cleo Личная Зона

Скм лог говорит, что вылетает все время на разных опкодах

На каких?

Offline

#5 28-12-2010 19:10

Ruzel
Registered: 03-06-2010
Posts: 61

Re: Cleo Личная Зона

Хм.. почти всегда вылетает после опкода 0051, т.е. return.
Что могло бы это значить? Нельзя записывать несколько gosub'ов подряд? тогда почему сперва все норм,  только на 7-8 круге повтора вылетает? Вложенных госабов нету..

Offline

#6 28-12-2010 19:32

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Cleo Личная Зона

А если я быстро отойду на более 150 (или сколько там метров) и подойду снова?:D

Offline

#7 29-12-2010 02:45

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Cleo Личная Зона

Хм.. почти всегда вылетает после опкода 0051, т.е. return

Значит перед return не был выполнен gosub. Внимательно проверь все варианты работы скрипта. Или можно просто убрать gosub-ы и return-ы, заменив их jump-ами.

Offline

#8 29-12-2010 05:02

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Cleo Личная Зона

Ruzel wrote:

Хм.. почти всегда вылетает после опкода 0051, т.е. return.
Что могло бы это значить? Нельзя записывать несколько gosub'ов подряд? тогда почему сперва все норм,  только на 7-8 круге повтора вылетает? Вложенных госабов нету..

почему-то возникает мысль, что кол-во gosub больше чем return. Соответственно, переполняется стек gosub-ов и вылет. Например, как в таком коде

:start
gosub @1
end_thread

:1
jump @start

Offline

#9 29-12-2010 07:04

Ruzel
Registered: 03-06-2010
Posts: 61

Re: Cleo Личная Зона

Хехе, так оно и есть)) Блин как я сразу не додумался.. Спасибо большое, буду исправлять))

Offline

#10 29-12-2010 13:49

Ruzel
Registered: 03-06-2010
Posts: 61

Re: Cleo Личная Зона

Суть скрипта в том, что в северной части карты, западнее заброшенной авиа полосы, появляется ваша собственная зона. Она помечена зеленым человечком на карте. Так вот на вашей зоне ходят туда - сюда ваши охранники зоны, которые будут убивать всех, кто зашел на нее. Всех, как случайных педов/машин, так и созданными какими либо скриптами.

Все работает отлично

// 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

Board footer

Powered by FluxBB