#1 02-01-2010 08:46

d88
Registered: 15-12-2009
Posts: 254
Website

Скрипт Банда едет за вами

Вот написал скрипт, который заставляет нанятых братков, которым не хватило места в вашей машине, садиться в другую машину и ехать за вами. Правда это пока первая версия, она рассчитана только если в вашей машине и в машине братков по 4 места.
Вроде всё работает, но иногда почему-то случаются вылеты. Кто-нибудь может понять почему?
Вот скрипт

0000: NOP 

:NONAME_2
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
else_jump @NONAME_2 
wait 0 
if 
0449:   actor $PLAYER_ACTOR in_a_car 
else_jump @NONAME_2 
Actor.RemoveReferences(1@)
Actor.RemoveReferences(2@)
Actor.RemoveReferences(3@)
Actor.RemoveReferences(4@)
wait 100 
092B: 1@ = group $PLAYER_GROUP member 3 
if 
056D:   actor 1@ defined 
else_jump @NONAME_2 
jump @NONAME_99 

:NONAME_99
wait 10 
Actor.StorePos(1@, 5@, 6@, 7@)
073E: get_car_in_sphere 5@ 6@ 7@ radius 50.0 model -1 handle_as 20@ 
wait 0 
if 
   not 20@ == -1 
else_jump @NONAME_2 
wait 0 
if 
056D:   actor 1@ defined 
else_jump @NONAME_2 
06C9: remove_actor 1@ from_group 
05CB: AS_actor 1@ enter_car 20@ as_driver 100000 ms 
092B: 2@ = group $PLAYER_GROUP member 4 
092B: 3@ = group $PLAYER_GROUP member 5 
092B: 4@ = group $PLAYER_GROUP member 6 
if 
056D:   actor 2@ defined 
else_jump @NONAME_262 
06C9: remove_actor 2@ from_group 
05CA: AS_actor 2@ enter_car 20@ passenger_seat 0 20000 ms 

:NONAME_262
wait 0 
if 
056D:   actor 3@ defined 
else_jump @NONAME_300 
06C9: remove_actor 3@ from_group 
05CA: AS_actor 3@ enter_car 20@ passenger_seat 1 20000 ms 

:NONAME_300
wait 0 
if 
056D:   actor 4@ defined 
else_jump @NONAME_338 
06C9: remove_actor 4@ from_group 
05CA: AS_actor 4@ enter_car 20@ passenger_seat 2 20000 ms 

:NONAME_338
wait 0 
if 
056D:   actor 1@ defined 
else_jump @NONAME_420 
wait 0 
if 
   not Actor.Dead(1@)
else_jump @NONAME_420 
wait 0 
if 
0449:   actor 1@ in_a_car 
else_jump @NONAME_338 
29@ = Marker.CreateAboveCar(20@)
07E0: set_marker 29@ type_to 1 
jump @NONAME_420 

:NONAME_420
wait 0 
if 
056E:   car 20@ defined 
else_jump @NONAME_682 
wait 0 
if 
0449:   actor $PLAYER_ACTOR in_a_car 
else_jump @NONAME_682 
wait 0 
03C0: 5@ = actor $PLAYER_ACTOR car 
07F8: car 20@ follow_car 5@ radius 15.0 
0423: set_car 20@ improved_handling_to 1000.0 // (float) 
Car.SetMaxSpeed(20@, 300.0)

:NONAME_505
wait 100 
if 
056E:   car 20@ defined 
else_jump @NONAME_682 
wait 100 
if 
   not Actor.InCar($PLAYER_ACTOR, 5@)
else_jump @NONAME_505 
jump @NONAME_555 

:NONAME_555
wait 0 
if 
056D:   actor 1@ defined 
else_jump @NONAME_710 
wait 100 
if or
856E:   not car 20@ defined 
8449:   not actor 1@ in_a_car 
   Actor.Dead(1@)
else_jump @NONAME_612 
jump @NONAME_657 

:NONAME_612
wait 100 
if or
   not Player.Defined($PLAYER_CHAR)
8204:   not actor $PLAYER_ACTOR near_car 20@ radius 80.0 80.0 flag 0 in_car 
else_jump @NONAME_505 

:NONAME_657
wait 100 
if 
056E:   car 20@ defined 
else_jump @NONAME_505 
Marker.Disable(29@)

:NONAME_682
wait 0 
if 
056D:   actor 1@ defined 
else_jump @NONAME_710 
0631: put_actor 1@ in_group $PLAYER_GROUP 

:NONAME_710
wait 0 
if 
056D:   actor 2@ defined 
else_jump @NONAME_738 
0631: put_actor 2@ in_group $PLAYER_GROUP 

:NONAME_738
wait 0 
if 
056D:   actor 3@ defined 
else_jump @NONAME_766 
0631: put_actor 3@ in_group $PLAYER_GROUP 

:NONAME_766
wait 0 
if 
056D:   actor 4@ defined 
else_jump @NONAME_794 
0631: put_actor 4@ in_group $PLAYER_GROUP 

:NONAME_794
wait 100 
Car.RemoveReferences(5@)
Car.RemoveReferences(20@)
jump @NONAME_2

Вообще когда работаешь с транспортом, взятым из игры, а не созданным скриптом, часто вылетает из-за того, что этот транспорт исчезает когда выходит из поля зрения. Но здесь вроде я сделал достаточно проверок на существовании машины и актёров.

Offline

#2 02-01-2010 18:59

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

Re: Скрипт Банда едет за вами

Вообще когда работаешь с транспортом, взятым из игры, а не созданным скриптом, часто вылетает из-за того, что этот транспорт исчезает когда выходит из поля зрения.

Не важно, создан транспорт скриптом, или "пойман" из стандартного траффика - его существование не будет зависеть от положения игрока, до тех пор, пока не будет удален из переменной или уничтожен.

Но здесь вроде я сделал достаточно проверок на существовании машины и актёров.

Да видимо не все. Без причины игра вылетать не станет. Вот в начале, например, актёры ещё не существуют, а ты уже удаляешь сведения о них.

Offline

#3 02-01-2010 20:53

d88
Registered: 15-12-2009
Posts: 254
Website

Re: Скрипт Банда едет за вами

Den_spb wrote:

Не важно, создан транспорт скриптом, или "пойман" из стандартного траффика - его существование не будет зависеть от положения игрока, до тех пор, пока не будет удален из переменной или уничтожен.

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

Den_spb wrote:

Да видимо не все. Без причины игра вылетать не станет. Вот в начале, например, актёры ещё не существуют, а ты уже удаляешь сведения о них.

Нет, тут всё в порядке, это нормально. Если бы вылетало из-за этого, то скрипт бы вообще не работал. А если ты считаешь что проверок недостаточно, так пожалуйста найди где не хватает.

Offline

#4 04-01-2010 08:52

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

Re: Скрипт Банда едет за вами

Нет, тут всё в порядке, это нормально. Если бы вылетало из-за этого, то скрипт бы вообще не работал.

Не факт. Вылеты - коварная вещь, могут возникать там, где их меньше всего ждут. Попробуй везде добавлять проверки, прежде чем выполнять какое-то действие. Много времени это занять не должно, и скрипту не повредит, зато убережешься от вылетов.
А вообще лучше сначала попытаться определить причину ошибки, а потом уже её исправлять. Можно применить scm log или другие способы (см. тему Один вопрос, стр.72)

Last edited by Den_spb (04-01-2010 08:56)

Offline

#5 22-02-2010 21:17

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

Re: Скрипт Банда едет за вами

Испытывал сейчас этот код, игра вылетела. В scmlog последняя запись - 01C3. Итак, эксперимент доказал, что RemoveReferences совсем не безобидна - перед ней тоже надо делать проверку на существование.

Offline

Board footer

Powered by FluxBB