#1 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 01-12-2010 21:23

Den_spb

Я не понимаю, какие тут могут появиться сложности: 1.Приводишь игрока на то место, где должен стоять транспорт 2.Сворачиваешь игру, в СБ жмёшь Ctrl+Shift+C - координаты вставляются в позицию курсора 3.Вычитаешь из Z-координаты 1.0. Всё - машина появится в указанном месте.

Не такие мы дураки))) Если точка загрузки (именно загрузки, а не появления) ниже поверхности - машина проваливается)))) У меня тогда маркер показывает, что машина находится ниже моего уровня)))) Такой финт ушами не катит)

Sergey81

Или его значение можно попробовать посмотреть в базе опкодов тут.

О! Спасибо за наводку)))))

По теме:
Ну, хорошо... А если их заспавнить через *.ipl ? Добавочные ИД через ИПЛ спавнятся? Допустим, если их через бинарники спавнить? А хоть бы и через текстовые - не суть...
Тогда вопросец... Можно ли для них создать отдельный IPL? И если кто знает, где его прописать?

#2 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 01-12-2010 12:00

Ну, я пробовал выйти из положения и в классе ACTOR нашел property Car(хендл актора) тогда в переменную передается хендл тачки, в которой он сейчас находится.... (Или все же ИД? Тут чуток гаву впоймал, только сейчас подумал)

тогда код бы выглядел:

:NONAME_75
While true
wait 0        
if   Actor.Driving($PLAYER_ACTOR)
then 
test@=Actor.Car($PLAYER_ACTOR)
Car.LockInCurrentPosition(test@) = False
jump @NONAME_75

end
end

НО! Игра вылетала, когда я садился на первую же тачку. Я подумал, что это проблема переприсвоения property Car.LockInCurrentPosition(test@) = False

А значит нужна проверка, если у тачки Car.LockInCurrentPosition(test@) = true тогда мы ее открываем...
И столкнулся с одной проблемкой:

:NONAME_75
While true
wait 0 
test@=Actor.Car($PLAYER_ACTOR)     //Передаем хендл тачки       
if and  
Actor.Driving($PLAYER_ACTOR)         //Проверка в машине ли игрок
Car.LockInCurrentPosition(test@) = true        //И вот такой проверки НЕ СУЩЕСТВУЕТ
then 
Car.LockInCurrentPosition(test@) = False      //И тогда уже открываем тачку.
jump @NONAME_75
end
end

Еще можно проверять, сидит ли игрок в тачке, которая находится в списке... Тогда:

:NONAME_75
While true
wait 0 
test@=Actor.Car($PLAYER_ACTOR)     //Передаем хендл тачки       
if 
Actor.Driving($PLAYER_ACTOR)         //Проверка в машине ли игрок
then 
if or
Actor.DrivingVehicleType($PLAYER_ACTOR, #MODEL_ID_1)  //Проверка если ГГ в одной из тачек из списка
Actor.DrivingVehicleType($PLAYER_ACTOR, #MODEL_ID_2)
Actor.DrivingVehicleType($PLAYER_ACTOR, #MODEL_ID_3)
then
Car.LockInCurrentPosition(test@) = False      //И тогда уже открываем тачку.
jump @NONAME_75
end
end
end

Второй вариант впринципе должен работать. Но меня тогда смущает test@=Actor.Car($PLAYER_ACTOR) Если тут передается не хендл, а ИД, тогда игра бы вылетала... Но! Тогда бы и компилятор не пропустил бы эту переменную в Car.LockInCurrentPosition(test@) = False  ибо туда нельзя передавать ИД... Или все таки пропустил бы? Нада попробовать..

Это может быть из-за того, что после того как ты появляешься в районе (близ) машины, она спавнится с воздуха и естественно, сразу зависает в нём.

Почему это происходит я и так понимаю... Вы объясните мне, почему так происходит только с моими тачками? Почему так не происходит с тачками, которые добавляются по миссиям? Например, помните велик, который появляется в самом начале игры?
Если у многих тачек по миссиям все координаты в переменных и откуда они беруться - одному богу известно, то у этого велика координаты передаются прямо в функцию. И он не липнет к террейну, он не зависает в воздухе, он появляется именно на тех координатах, которые ему заданы.

Вот:

:INTRO_7081
0395: clear_area 1 at 2246.508 -1263.087 22.9531 radius 500.0 
$60 = Car.Create(#BMX, 2246.508, -1263.087, 22.9531)
Car.Angle($60) = 285.0
145@ = 1

Согласен, тут может быть, что он возникает в воздухе и не проваливается, потому что игрок рядом. Но как быть с машинами которые возникают черт знает где от игрока? И там тоже жесткие координаты? Чего они к террейнам не липнут?

Вот еще на такой код наткнулся:

if 
   not Car.Defined(68@)
else_jump @LOWR_14264 
68@ = Car.Create(#SAVANNA, 1793.496, -1907.423, 12.3992)
Car.Angle(68@) = 181.5231
09FE: unknown_car 68@ 
jump @LOWR_14310 

:LOWR_14264
if 
   not Car.Wrecked(68@)
else_jump @LOWR_14310 
Car.PutAt(68@, 1793.496, -1907.423, 12.3992)
Car.Angle(68@) = 181.5231

Суть вотэтогй команды скрыта от меня завесой тайны:
09FE: unknown_car 68@
Я так понимаю мы помечаем хендл тачки как "неизвестная" И в чем финт? Не пойму...

#3 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 28-11-2010 22:20

Окей. Учту.

Над структурой подумаю.

ID проверю на отдельном коде, с одним добавлением... Но... :-\ Незнаю...

Вобщем вот, что у меня получилось... :

0000: NOP 
thread 'Camaro'
:NONAME_2
Model.Load(#CAMAROC7) <--------(Это какраз то, почему новые ID не грузились)
wait 0 
   Model.Available(#CAMAROC7)
else_jump @NONAME_2 
4@ = Car.Create(#CAMAROC7, 2483.867, -1665.612, 13.3438)
Car.Angle(4@) = 90.0
Car.LockInCurrentPosition(4@) = True
$3333_4 = Marker.CreateAboveCar(4@)

Model.Destroy(#CAMAROC7)
 

:NONAME_3
Model.Load(#DODGE)
wait 0 
   Model.Available(#DODGE)
else_jump @NONAME_3 
0@ = Car.Create(#DODGE, 1041.366, -1376.558, 18.0591)
Car.Angle(0@) = 180.0
Car.LockInCurrentPosition(0@) = True
$3333_0 = Marker.CreateAboveCar(0@)

Model.Destroy(#DODGE)


:NONAME_75
While true
wait 0        
if   Actor.InCar($PLAYER_ACTOR, 0@)
then 
Car.LockInCurrentPosition(0@) = False
marker.Disable($3333_0)
jump @NONAME_75
else
if   Actor.InCar($PLAYER_ACTOR, 4@)
then 
Car.LockInCurrentPosition(4@) = False
marker.Disable($3333_4)
jump @NONAME_75
else

end
end
end
0A93: end_custom_thread

Я вот только смущаюсь по поводу проверок. Блин, а если я туда штук 100 машин насоваю!?
Сначала я думал, что есть параметр, который передает в какой именно машине сейчас наш ГГ... Если бы все было так, ногда весь цикл проверки выглядел бы примерно так:

:NONAME_75
While true
wait 0        
if   Actor.Driving($PLAYER_ACTOR)
then 
test@=(Функция, передающая в test@ ID той машины в которой сейчас ГГ)
Car.LockInCurrentPosition(test@) = False
jump @NONAME_75

end
end

Будем искать...

Да, вот еще что странное заметил... Т.к. я после криэйта сразу же жестко привязываю машину к координатам, они начали висеть в воздухе. Я начал исправлять координаты и мне кажется, что с каждой новой игрой они меняются... Или то у меня глюки?

#4 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 28-11-2010 20:31

Блин... А если открывать отдельный поток для каждой машины? Сколько потоков лимитированно можно открыть?

И как быть с ID-шками? Не работают, гадины... Я уже было решил, что MoreVehicles не работает... Скачал GTA_SA.exe 1.0 us и одно и то же... ID не работают(((

#5 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 28-11-2010 16:03

Den_spb
Это не проверка. Опкод делает так, чтобы машина, находящаяся на большом расстоянии от игрока не проваливалась под землю (в игре используется например, для машины курьера Цезаря).

Ну, может оно то и так, да только разницы никакой. Вот:

Model.Load(#HUSTLE)

:SALEEN_195
wait 0
   Model.Available(#HUSTLE)
else_jump @SALEEN_195
3@ = Car.Create(#HUSTLE, 2605.119, -1492.029, 15.9336)
0587: enable_car 3@ validate_position 0
Car.Angle(3@) = 90.0
Model.Destroy(#HUSTLE)
Model.Load(#CAMAROC7)

А тачка как появлялась на дороге, так и появляется(((

Да! Вот еще что... Случился непонятный косяк....  Вот так работает...

{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
thread 'SALEEN'
Model.Load(#SALEEN)

:SALEEN_18
wait 0
   Model.Available(#SALEEN)
else_jump @SALEEN_18
0@ = Car.Create(#SALEEN, 1098.865, -1239.691, 15.8203)
Car.Angle(0@) = 180.0
Model.Destroy(#SALEEN)
Model.Load(#DODGE)
:SALEEN_77
wait 0
   Model.Available(#DODGE)
else_jump @SALEEN_77
1@ = Car.Create(#DODGE, 1041.366, -1376.558, 18.3619)
Car.Angle(1@) = 180.0
Car.LockInCurrentPosition(1@) = True
:SALEEN_78
wait 0
   Actor.InCar($PLAYER_ACTOR,1@)
else_jump @SALEEN_78
Car.LockInCurrentPosition(1@) = False
Model.Destroy(#DODGE)
Model.Load(#CHRYSLER)

:SALEEN_136
wait 0
   Model.Available(#CHRYSLER)
else_jump @SALEEN_136
2@ = Car.Create(#CHRYSLER, 2518.196, -1710.04, 13.4947)
Car.Angle(2@) = 270.0
Model.Destroy(#CHRYSLER)
Model.Load(#HUSTLE)

:SALEEN_195
wait 0
   Model.Available(#HUSTLE)
else_jump @SALEEN_195
3@ = Car.Create(#HUSTLE, 2605.119, -1492.029, 15.9336)
0587: enable_car 3@ validate_position 0
Car.Angle(3@) = 90.0
Model.Destroy(#HUSTLE)
Model.Load(#CAMAROC7)

:SALEEN_261
wait 0
   Model.Available(#PONFB)
else_jump @SALEEN_261
4@ = Car.Create(#PONFB, 2483.867, -1665.612, 13.3438)
Car.Angle(4@) = 90.0
Car.LockInCurrentPosition(4@) = True

:SALEEN_317
wait 0
   Actor.InCar($PLAYER_ACTOR, 4@)
else_jump @SALEEN_317
Car.LockInCurrentPosition(4@) = False
Model.Destroy(#PONFB)
0A93: end_custom_thread

И Додж покорно ждет меня на прописанном месте...

А вот так уже не работает...

{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
thread 'SALEEN'
Model.Load(#SALEEN)

:SALEEN_18
wait 0
   Model.Available(#SALEEN)
jf @SALEEN_18
0@ = Car.Create(#SALEEN, 1098.865, -1239.691, 15.6435)
Car.Angle(0@) = 180.0
Car.LockInCurrentPosition(0@) = True

:SALEEN_74
wait 0
   Actor.InCar($PLAYER_ACTOR, 0@)
jf @SALEEN_74
Car.LockInCurrentPosition(0@) = False
Model.Destroy(#SALEEN)
Model.Load(#DODGE)

:SALEEN_110
wait 0
   Model.Available(#DODGE)
jf @SALEEN_110
1@ = Car.Create(#DODGE, 1041.366, -1376.558, 18.0591)
Car.Angle(1@) = 180.0
Car.LockInCurrentPosition(1@) = True

:SALEEN_166
wait 0
   Actor.InCar($PLAYER_ACTOR, 1@)
jf @SALEEN_166
Car.LockInCurrentPosition(1@) = False
Model.Destroy(#DODGE)
Model.Load(#CHRYSLER)

:SALEEN_202
wait 0
   Model.Available(#CHRYSLER)
jf @SALEEN_202
2@ = Car.Create(#CHRYSLER, 2518.196, -1710.04, 13.4947)
Car.Angle(2@) = 270.0
Car.LockInCurrentPosition(2@) = True

:SALEEN_258
wait 0
   Actor.InCar($PLAYER_ACTOR, 2@)
jf @SALEEN_258
Car.LockInCurrentPosition(2@) = False
Model.Destroy(#CHRYSLER)
Model.Load(#HUSTLE)

:SALEEN_294
wait 0
   Model.Available(#HUSTLE)
jf @SALEEN_294
3@ = Car.Create(#HUSTLE, 2605.119, -1492.029, 15.9336)
Car.Angle(3@) = 90.0
Model.Destroy(#HUSTLE)
Model.Load(#CAMAROC7)

:SALEEN_353
wait 0
   Model.Available(#CAMAROC7)
jf @SALEEN_353
4@ = Car.Create(#CAMAROC7, 2483.867, -1665.612, 13.5438)
Car.Angle(4@) = 90.0
Car.LockInCurrentPosition(4@) = True

:SALEEN_409
wait 0
   Actor.InCar($PLAYER_ACTOR, 4@)
jf @SALEEN_409
Car.LockInCurrentPosition(4@) = False
Model.Destroy(#CAMAROC7)
0A93: end_custom_thread

Ни одной тачки нет по координатам...

#6 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 28-11-2010 15:57

Судя по названию, должно отключать автоматическую проверку положения тачки, то что тебе нужно.

Ничего не меняется(

При этом возник вообще мистический трабл...

вместе с MoreVehicles был файл со списком свободных ID... Я выбрал самый много численный диапазон свободных 3222-3240... Машины на 3222, 3223 и 3224 добавились без траболв и работают. Помимо этого у меня еще на 612, 613 и 614 есть тачки... И все... Я любую тачку добавляю на любой добавочный ID, какой угодно из свободных в любых диапазонах и нифига. Если косяк в конфигах тачки то игру выбивает на загрузке. Это я давно уже просек и точно знаю теперь где накосячил...

В этом же варианте игра грузится без проблем... Но тачки на координатах нет. Меняю ID модели с 3225 на 614\3222\3223\3224 - все пашет... Эта же тачка, которая не работала на 3225 или любом другом на 624 пашет аж бигом...

Пробовал на все тачки добавлять маркеры, что бы видеть, сколько их сейчас на карте. Соответственно. Если тачка с ID 612\613\614\3222\3223\3224 - все работает. Если другой ID - ни тачки, ни маркера...

#7 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 27-11-2010 21:08

Ойвей! Кажись фурычит!

Model.Load(#DODGE)
:SALEEN_77
wait 0
   Model.Available(#DODGE)
else_jump @SALEEN_77
1@ = Car.Create(#DODGE, 1041.366, -1376.558, 18.3619)
Car.Angle(1@) = 180.0
Car.LockInCurrentPosition(1@) = True
:SALEEN_78
wait 0
   Actor.InCar($PLAYER_ACTOR,1@)
else_jump @SALEEN_78
Car.LockInCurrentPosition(1@) = False
Model.Destroy(#DODGE)

В итоге что. Применил лок и намертво привязал модель машины к координатам. Поставил цикл проверки, не в машине ли игрок. Если да - тогда включается анлок и мы едим....

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

#8 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 27-11-2010 20:13

Или вот, например. Миссия, где нужно пострелять по бутылками и в конце взорвать тампу.

0395: clear_area 1 at 2446.49 -1966.47 12.54 radius 4.0
0674: set_car_model #TAMPA numberplate "_FELTCH_"
83@ = Car.Create(#TAMPA, 2446.49, -1965.0, 12.54)
Car.Angle(83@) = 101.85
Car.DoorStatus(83@) = 2
Car.SetImmunities(83@, 1, 1, 1, 1, 1)

Опять таки с машиной больше ничего не происходит... Но как!? Она зараза ставится на эти координаты и потом никуда не девается!?

#9 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 27-11-2010 20:09

Вот... Еще кое что.. ашел в мейне такие строки. В Криэйтах тачек во время миссий часто встречаются:

40@ = Car.Create(#VOODOO, 2411.31, -1928.837, 12.3906)
0229: set_car 40@ primary_color_to 22 secondary_color_to 22
053F: set_car 40@ tires_vulnerability 0
0587: enable_car 40@ validate_position 0  (!!!!)
Car.Health(40@) = 3000
Car.DoorStatus(40@) = 3
Car.Angle(40@) = 178.7106
52@ = Marker.CreateAboveCar(40@)

0587: enable_car 40@ validate_position 0  Во первых смутила эта строка... Что за позицию оно проверяет?
А во вторых:
52@ = Marker.CreateAboveCar(40@) -Это что? Перекриэйт? с переменной 52@ в данном стриме потом вообще ничего не происходит....

#10 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 27-11-2010 19:57

:SALEEN_254
wait 0
   Model.Available(#CAMAROC7)
else_jump @SALEEN_254
4@ = Car.Create(#CAMAROC7, 1041.366, -1376.558, 18.3619)
Car.Angle(4@) = 90.0
Car.LockInCurrentPosition(4@) = True
Model.Destroy(#CAMAROC7)

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

#11 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 27-11-2010 15:08

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

#13 Re: Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 27-11-2010 00:38

Тогда вопрос заключается в том, как быть с данной идеей?
Я хочу что бы тачки стояли. А не ездили. Я миссию пишу, аля угнать за 60 сек. Соответственно, мне нужны тачки, которые в игре не ездят по дорогам...

Как их добавить на карту иным способом?

#14 Вопросы по скриптингу » Трабл с добавлением парковочного генератора » 25-11-2010 12:13

dimuluka
Replies: 26

В общем давно не играл в ГТА, тут залез в нэты и насмотрел гору новых красивых машин на SA. Накачал. Почитал мануалы по добавлению, а не замене машин в игре.  Читал отсюда. Скачал все программы. Взял модель Dodge Charger R/T 69 Hot Road Автор:Dr.BrainM качал отсюда.

Возникла мысль, сделать так что бы машины не ездили по дорогам, как указано в маниале а стояли в каких нибудь трудно доступных местах. Реши прописать позицию машин через скрипт. Как и в оригинале.

Далее установил себе SannyBuilder 3. Открыл main.scm Нашел секции, где прописаны парковочные генераторы для большинства машин (легче всего найти секцию через поиск введя PCJ600, tuj cnhjrf 027386) Вобщем посмотрел параметры генератора, почитал про опкоды и решился попробовать.

Далее по порядку... Я по мануалу забросил в GTA.img модель и текстуры Доджа под названием dodge.dff, dodge.txd и dodge1.txd...
Добавил в vehicles.ide строку, взятую у SABRE. Выглядит так:
612, dodge, dodge, car, DODGE, DODGECR, null, normal,    10, 0, 2ff0, -1, 0.7, 0.7, 0
Далее добавил в HandlingAdder.ini секцию, так же взятую точно с SABRE. Писать секцию не буду - здоровая.
Добавил в VehicleAudioData.ini секцию для данного ID (612) так же секцию, содранную с SABRE
Далее в carcols.dat carmods.dat добавил строки из ридми модели.

Все, модель добавли, параметры прописал. Через Санибилдер открыл main.scm нашел секцию и добавл в строку 027405 такой скрипт:

014B: $5270DODGE = init_parked_car_generator #DODGE color -1 -1 0 alarm 0 door_lock 0 0 10000 at 2483.867 -1665.612 13.3438 angle 90.0
014C: set_parked_car_generator $5270DODGE cars_to_generate_to 101

Запустил SA, начал новую игру и возле дома CJ-я стоял новенький Dodge Charger RT 69

Но радость была не долгой.  Я нашел модель 1969 Chevy Nova ProStreet Dragger тут

Решил добавить. Проблема была в том, что для нее нужен скрипт. Скачал CLEO 3. впихнул скрипты в папку CLEO. Подредактировал скриптовый ini, в котором указал новый ID для этой тачки. ДАлее добавил ее по той же схеме что и Доджа. Втулил ее в водосточный канал рядом со стадионом в LS.
(секцию генератора добавил сразу за секцией Доджа) Модель появилась, но вылетала, как только я в нее садился.

Решил удалить

Удалил. И на ее ID добавил Chrysler 300 Hurst 1970 качал тут. Сделал все как и в Додже...

vehicles.ide
613, Chrysler, Chrysler, car, CHRYSLER, CHRYS, null, normal, 10, 0, 2ff0, -1, 0.7, 0.7,    0

HandlingAdder.ini
[613]
index=56
fmass=1700
fTurnMass=4000
fDragMult=2
x=0
y=0,100000001490116
z=0
nPercentSubmerged=70
fTractionMultiplier=0,699999988079071
fTractionLoss=0,800000011920929
fTractionBias=0,52999997138977
nNumberOfGears=4
fMaxVelocity=10,958667576313019
fEngineAcceleration=0,10192000006791204
fEngineInertia=10
nDriveType=R
nEngineType=P
fBrakeDeceleration=0,0031999999191612
fBrakeBias=0,519999980926514
bABS=0
fSteeringLock=35
fSuspensionForceLevel=1,29999995231628
fSuspensionDampingLevel=0,0799999982118607
fSuspensionHighSpdComDamp=5
fSuspensionUpperLimit=0,300000011920929
fSuspensionLowerLimit=-0,200000002980232
fSuspensionBiasBetweenFrontAndRear=0,5
fSuspensionAntiDiveMultiplier=0,25
fSeatOffsetDistance=0,25
fCollisionDamageMultiplier=0,611764669418335
nMonetaryValue=19000
modelFlags=0
handlingFlags=268435462
frontLight=1
rearLight=1
animGroup=0

VehicleAudioData.ini
[613]
CarType=0
EngineOnSound=76
EngineOffSound=75
Unknown4=0
Unknown5=0,850000023841858
Unknown6=1
HornTon=8
HornHigh=0,943874299526215
DoorSound=1
RadioNum=10
RadioType=0
Unknown12=1
Unknown13=0
Unknown14=0
Unknown15=0
Unknown16=0

Далее в carcols.dat carmods.dat добавил строки из ридми модели.

main.scm
Поменял ту же секцию, что была у CHEVY
014B: $5270CHRYSLER = init_parked_car_generator #CHRYSLER color -1 -1 0 alarm 0 door_lock 0 0 10000 at 2604.796 -1482.0 16.5815 angle 0.0
014C: set_parked_car_generator $5270CHRYSLER cars_to_generate_to 101

Итог. На той же секции, что и был Chevy ни одна машина, кроме Доджа не появляется. И последующие секции не добавляются... ID для них - свободные, я посмотрел в ридми для HandlingAdder...

Я уже незнаю чего делать! Че за нах? Я может чего в коде напутал?

Board footer

Powered by FluxBB