#1 Re: Вопросы по скриптингу » Один вопрос » 14-11-2010 18:06

спс, разобрался, только тут вот кое что непонятно:

CPed +0x14 = Указатель на структуру позиции в XYZ (и угол вращения)

    * (CPed+0x14) +0x0 to +0x2C = [dword] матрица вращения
что это за матрица вращения и как её получить?))
я прибавил к структуре педа +0x14 и потом нужно ещё +0x2C прибавить? тут какой-то промежуток чтоли? +0x0 to +0x2C

#2 Re: Вопросы по скриптингу » Один вопрос » 14-11-2010 10:45

вот нашёл интересный адрес - CPed +0x47C = Указатель на структуру анимации
можно ли отсюда как-то узнать название анимации?
и вообще научите пожалуйста, как этими адресами с CPed пользоваться))
вот мне например надо вот это - CPed +0x15C = Некторые статусы анимации:

    * 0 = прыгает от земли
    * 61 = ударяет
    * 102 = остановился
    * 154 = спринт (бежит с ускорением)
    * 205 = бежит
и как же мне узнать что из этого сейчас выполняется?))

#3 Re: Вопросы по скриптингу » Один вопрос » 10-11-2010 16:28

да блин снова вы не поняли меня, я знаю что это делается через изменение угла, ну блин, как вам объяснить, чтоб вы поняли...короче, где-т через час дам вам анимацию и скрипт её воспроизведения и поворота, тогда может вы поймёте чего я хочу...

#4 Re: Вопросы по скриптингу » Один вопрос » 09-11-2010 20:35

Den_spb wrote:

Смотря как мелко поделить угол. Если доля будет составлять 10.0 градусов, то действительно получится неплавно. Или надо искать подходящие опкоды.

ты не понял что имею ввиду под словом "плавно")) я имел ввиду не то что он рывками поворачивается, а то что он поворачивается мгновенно. Ты, например, если бежишь, не можешь ведь моментально повернуть в другую сторону, в СА при беге это учтено, хотя и не полностью, и если ты сначала бежишь вперёд, а потом резко повернёшь камеру назад, то он не мгновенно повернётся в эту сторону, а постепенно, делая полукруг...того же эффекта мне нужно добиться и при воспроизведении анимации...

#5 Re: Вопросы по скриптингу » Один вопрос » 07-11-2010 13:07

Den_spb wrote:

Угол делишь на небольшие доли, затем в цикле через короткие промежутки времени присваиваешь актёру угол, с каждым разом увеличенный на одну долю.

что-то я сомневаюсь что это будет плавно...нет, мне бы опкодик какой-нибудь вроде 083E только чтоб на земле работал)

#6 Re: Вопросы по скриптингу » Один вопрос » 07-11-2010 08:28

Sergey81 wrote:

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

это было бы то что нужно, только вот как найти адрес в памяти?

Да, кстати, можно ли как-то плавно повернуть игрока во время анимации? с парашютом прыгали? видели как он плавно поворачивается? там используется опкод 083E: set_actor $PLAYER_ACTOR rotation 0.0 0.0 1@ while_in_air
однако, он работает только в воздухе...а как же тогда поворачивается игрок, во время бега? скажу сразу для чего это нужно)) у меня есть анимация ходьбы на руках, только мне нужно вместе с камерой игрока поворачивать...как вычислить угол я знаю, я ставлю зацикленную проверку:

:HANDSTAND
wait 0
if
actor.Animation($PLAYER_ACTOR) == "HANDSTAND"
jf @HANDSTAND

если эта проверка проходит я вычисляю нужный угол, а теперь мне нужно применить этот угол, только чтобы он применялся не моментально, а плавно...надеюсь я понятно объяснил, хотя наверное мне опять никто не ответит...

#7 Re: Вопросы по скриптингу » Один вопрос » 06-11-2010 11:20

реально ли как-то отключить клавишу спринта, наподобе опкодов:

0901: enable_player $PLAYER_CHAR jump_key 0
07CC: player $PLAYER_CHAR disable_key_15 0

#9 Re: Вопросы по скриптингу » Один вопрос » 03-11-2010 10:20

что, никто не знает???))) тогда как сделать чтобы камера смотрела в нужную мне точку, после вот этого опкода:

092F: lock_camera_target_point 1

#10 Re: Вопросы по скриптингу » Один вопрос » 31-10-2010 20:43

можно и так...тогда придётся делить анимации на замах и саму аниму...ну щас попробую...)
да кстати, анимации перелазинья через забор и анимации залезания воспроизводятся, примерно так:

0812: AS_actor $PLAYER_ACTOR perform_animation "CLIMB_PULL" IFP_file "PED" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time -1 // versionB

особое внимание стоит уделить параметрам LockX  и LockY, они отвечают за перемещение центра игрока (ну или камеры) вместе с анимацией...если они равны 0, то анимация будет играть, а камера оставаться на месте, однако в игре камера как-то передвигается вместе с перелезанием (заметно что она передвигается искусственно, не вместе с анимацией, особенно если эту анимацию заменить какой-то другой)...вопрос: как сделать тоже самое с камерой))??

#11 Re: Вопросы по скриптингу » Один вопрос » 31-10-2010 19:15

я в курсе что она превышает указанное значение, дело не в этом...как же объяснить понятнее...тут только показывать надо)) короче говоря, мне это нужно для моего мода...паркур мода...чтобы можно было перепрыгивать сальтами через заборы и не только, я придаю движение игроку опкодом 083С, а анимацию обездвиживаю...но проблема в том, что у меня анимация начинается с замаха, движение которого я оставляю, и убираю когда он должен подлетать...подлетание обеспечиваю тем самым опкодом (083С), через время замаха...время замаха подсчитать несложно, но если поставить wait с тем временем, то очень часто не попадает вовремя, а если фпс опустится скажем до 15, то он половину замаха сделает и подлетит, короче говоря опкод 083C сработает раньше чем надо...ну вобщем если непонятно, я могу скинуть примерчик))

#12 Re: Вопросы по скриптингу » Один вопрос » 31-10-2010 08:59

ну ладно, но мне нужно сделать что-то типа таймера (опкод 014E), только без отображения цифр на экране...главное чтобы он зависел от FPS...как я заметил, этот таймер зависит, но не совсем...всё равно немного не совпадает...

#13 Re: Вопросы по скриптингу » Один вопрос » 30-10-2010 21:21

Мммм...у меня всё тот же вопрос, как избавиться от wait 0???? просто очень очень очень очень надо!!)))
И ещё, я уже давно заметил, скриптовый и графический движки не синхронны...короче говоря, если мне например нужно воспроизвести анимацию через какое-то время, я ставлю wait с нужным временем...а если у меня FPS около 10 например...анимация воспроизведётся через то время которое я задал, но в игре она воспроизведётся раньше чем надо...как можно синхронизировать их? короче говоря, что использовать вместо wait в таких случаях?...пробовал опкод 01BD: 10@ = current_time_in_ms, но он тоже не зависит от графического движка (я заметил что игровое время тоже идёт независимо от графического движка)...что делать?)) Ещё заметил что когда ставишь таймер, он идёт в ногу с графическим движком...мне бы как нибудь его использовать, только чтобы сам таймер не отображался)))

#14 Re: Вопросы по скриптингу » Один вопрос » 26-10-2010 17:31

Den_spb wrote:

Прочитай внимательно раздел Кодинг-Циклы в справке и всё поймёшь.

хех...я прочитал...но почему то у меня вылетает когда я пишу...причём вылетает когда проигрывается именно эта анимация...

:LOOK 
wait 0 
while actor.Animation($PLAYER_ACTOR) == "ROLL"
068D: get_camera_position_to 1@ 2@ 3@ 
068E: get_camera_target_point_to 4@ 5@ 6@ 
0063: 4@ -= 1@ // (float)
0063: 5@ -= 2@ // (float)
0063: 6@ -= 3@ // (float)
050A: 7@ = distance_between_XYZ 0.0 0.0 0.0 and_XYZ 4@ 5@ 6@ 
7@ /= 100.0 
0073: 4@ /= 7@ // (float) 
0073: 5@ /= 7@ // (float) 
005B: 4@ += 1@ // (float) 
005B: 5@ += 2@ // (float) 
actor.StorePos($PLAYER_ACTOR, 10@, 11@, 12@)
0063: 4@ -= 10@ // (float)
0063: 5@ -= 11@ // (float)
0604: get_Z_angle_for_point 4@ 5@ store_to 8@
actor.Angle($PLAYER_ACTOR) = 8@
end
jump @LOOK

насчёт while true...end
я так понял тут надо останавливать цикл внутри его тела, судя по всему с помощью проверок и Break...

насчёт R* штучек - у них в одном потоке либо один wait 0, либо они пишут его так))) -

:PSAVE1_1049
if 
83D9:   not save_done 
jf @PSAVE1_1073 
wait 0 
jump @PSAVE1_1049

хотя нет, вот один -

:TRAINSL_11
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
jf @TRAINSL_115 
if 
   Actor.Driving($PLAYER_ACTOR)
jf @TRAINSL_115 
if 
   Actor.DrivingVehicleType($PLAYER_ACTOR, #STREAKC)
jf @TRAINSL_115 
0926: $SCRIPT_STATUS = external_script_status 33 (TRAINS) 
if 
  $SCRIPT_STATUS == 0 
jf @TRAINSL_115 
08A9: load_external_script 33 (TRAINS) 
if 
08AB:   external_script 33 (TRAINS) loaded 
jf @TRAINSL_115 
0913: run_external_script 33 (TRAINS)  

:TRAINSL_115
jump @TRAINSL_11

кстати, они не ставят jf на начало, а в той метке куда стоит jf (@TRAINSL_115 в нашем случае) стоит jump на первую метку и так все jf-ы которые должны попасть на начало например...почему они делали именно так?)))

и есть ли способ избавиться от этой задержки в циклической проверке??

#15 Re: Вопросы по скриптингу » Один вопрос » 26-10-2010 13:42

Sanchez, не понял зачем там где ты вычисляешь c (по идее по теореме пифагра) ты добавил -2abcosC, хотя это мне уже не нужно...
Den_spb, насчёт этого опкода:

0604: get_Z_angle_for_point 0@ 1@ store_to 2@

ты сказал:

Den_spb wrote:

угол будет получен в пределах 0-90 градусов

поэтому я не стал его проверять, но сейчас всё же решил проверить и как оказалось он работает на все 360 градусов, короче говоря, это то что мне было нужно)) спасибо большое, очень выручил!)
d88, вот код скрипта который тебе нужен:

:LOOK
wait 0
if
// тут какая-нибудь проверка, например, не дошёл ли актёр куда надо...
jf @LOOK
actor.StorePos($ХЭНДЛ_АКТЁРА_ЗА_КОТОРЫМ_СЛЕДЯТ 1@, 2@, 3@)
actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
0063: 1@ -= 4@ // (float)
0063: 2@ -= 5@ // (float)
0604: get_Z_angle_for_point 1@ 2@ store_to 7@
actor.Angle($PLAYER_ACTOR) = 7@
jump @LOOK

правда, я не заметил разницы в скорости работы скриптов, как можно избавиться от wait в этом скрипте?
у меня проверка такого вида:

:LOOK
wait 0                          
if or
actor.Animation($PLAYER_ACTOR) == "FALL_COLLAPSE"
actor.Animation($PLAYER_ACTOR) == "ROLL"
jf @LOOK

и ещё, объясните пожалуйста, как правильно пользоваться while...end

#16 Re: Вопросы по скриптингу » Один вопрос » 25-10-2010 18:49

или у меня не показывает, или картинка действительно не прикрепилась в посте выше?
выкладываю так...
[img align=С]http://gta-parkour.ucoz.ru/angle.jpg[/img]

#17 Re: Вопросы по скриптингу » Один вопрос » 25-10-2010 18:44

Den_spb wrote:

Тут есть три возможности:
1.Воспользоваться опкодом

0604: get_Z_angle_for_point 0@ 1@ store_to 2@

В немодифицированной игре он использовался для нахождения угла между отрезком, лежащим в горизонтальной плоскости, и направлением на север. Если в 0@ записать разницу x-координат (x-координата конца отрезка - x-координата начала отрезка), а в 1@ - разницу y-координат (y-координата конца отрезка - y-координата начала отрезка), то угол будет записан в 2@.
Этот опкод можно применить и для вычисления угла между отрезком и горизонтальной поверхностью (угол будет получен в пределах 0-90 градусов). В 0@ нужно записать разницу z-координат (z-координата начала отрезка - z-координата конца отрезка), а в 1@ - расстояние между проекциями точек начала и конца отрезка на горизонтальную плоскость (воспользоваться опкодом 0509).
2.Воспользоваться дополнительными опкодами arcsin, arccos, arctan от Sanchez
3.Разложить синус, косинус или тангенс в ряд.

тут я конечно половину сказанного не понял))ну да ладно...всё дело в том что мне нужна формула (алгоритм), по которой я бы мог вычислить угол образованный осью Y игрока и отрезком (наверное правильней сказать лучом) проведённым из координат игрока до координат которые я задаю сам...короче говоря - вот нарисовал картинку)) кстати, насчёт того что у тебя написано: в пределах 0-90 градусов - это я уже сумел сделать теми вычислениями, код которых я дал раньше...мне нужна такая формула (алгоритм), с помощью которой можно было вычислить угол в пределах 0-360 градусов, тоесть чтобы можно было вычислить, даже если X и/или Y отрицательны (смотрим картинку, хотя там они положительны..)

#18 Re: Вопросы по скриптингу » Один вопрос » 25-10-2010 15:19

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

#19 Re: Вопросы по скриптингу » Один вопрос » 25-10-2010 13:09

да я уже давно заметил что wait сильно замедляет скрипт, но дело в том что часто, если забывал где-то поставить wait, зависало, а где-то тут на форуме прочитал что нужно ставить wait перед проверкой...хотя я решил попробовать без wait'ов, и сейчас не зависало...может объяснишь, когда нужно ставить wait, а когда не надо? Предполагаю что ставить надо тогда, когда в jump_if_false пишешь имя той же метки,...я прав?

#20 Re: Вопросы по скриптингу » Один вопрос » 24-10-2010 16:02

дык воспользуйся Car.LockInCurrentPosition($car)  = True

#21 Re: Вопросы по скриптингу » Один вопрос » 24-10-2010 15:17

Sergey81 wrote:

А почему при использовании 0ABF: set_vehicle 0@ engine_state_to 0/1 машина становится не восприимчивой к урону? Можно это как то пофиксить?

хаха, не знал...может стоит попробовать убрать иммунитеты - Car.SetImmunities($CAR, 0, 0, 0, 0, 0)

#22 Re: Вопросы по скриптингу » Один вопрос » 24-10-2010 12:29

тебе, тебе, кому же ещё!) ну раз для майна, то....мне как раз тоже для майна...блин я тут кучу потоков понаделал, не знаю зачем...щас упрощу как можно сильнее и выложу)

------------------------------------------------------------------------------------------
так, это первая версия, сидел, вспоминал систему координат по математике, и вот вроде получилось кое-что... незнаю, может быть можно как-то упростить это, применить другую формулу вычисления (синусы, косинусы какие-нибудь=)), d88, тебе если следить за актёром - должно быть без рывков, а вот если какие-то резкие движения будут, там уже надо будет создавать метки LOOK (начиная с if and), LOOK_1, LOOK_2 и LOOK_3 как отдельные потоки, а то слишком долго с одной метки на другую переходит... вот собственно сам код:

var
4@ : Float
5@ : Float
10@ : Float
11@ : Float
end

:LOOK
wait 0
if
// тут какая-нибудь проверка, например, не дошёл ли актёр куда надо...
jf @LOOK
actor.StorePos($ХЭНДЛ_АКТЁРА_ЗА_КОТОРЫМ_СЛЕДЯТ 4@, 5@, 6@)
actor.StorePos($PLAYER_ACTOR, 10@, 11@, 12@)
4@ -= 10@
5@ -= 11@
8@ = 90.0 
0087: 9@ = 4@ // 9@ = X 
0087: 13@ = 5@ // 13@ = Y  
if and
9@ > 0.0
13@ > 0.0
jf @LOOK_1 
005B: 4@ += 5@ // X + Y
0073: 8@ /= 4@ // 90.0 / (X + Y) 
006B: 8@ *= 9@ // 8@ * X 
8@ *= -1.0 
jump @LOOK_FINAL

:LOOK_1
wait 0
if and
9@ > 0.0
13@ < 0.0
jf @LOOK_2
4@ *= -1.0
005B: 4@ += 5@ // X + Y 
0073: 8@ /= 4@ // 90.0 / (X + Y) 
006B: 8@ *= 9@ // 8@ * X 
8@ += 180.0
8@ *= -1.0 
jump @LOOK_FINAL

:LOOK_2
wait 0
if and
9@ < 0.0
13@ < 0.0
jf @LOOK_3
4@ *= -1.0
5@ *= -1.0
005B: 4@ += 5@ // X + Y 
0073: 8@ /= 4@ // 90.0 / (X + Y) 
006B: 8@ *= 9@ // 8@ * X
8@ += 180.0 
jump @LOOK_FINAL

:LOOK_3
wait 0
if and
9@ < 0.0
13@ > 0.0
jf @LOOK
5@ *= -1.0
005B: 4@ += 5@ // X + Y 
0073: 8@ /= 4@ // 90.0 / (X + Y) 
006B: 8@ *= 9@ // 8@ * X 

:LOOK_FINAL
actor.Angle($PLAYER_ACTOR) = 8@
jump @LOOK

так сходу алгоритм сего не понять, если надо будет, я могу объяснить...
вариант с майном (несколько потоков) пока не доработал...

#23 Re: Вопросы по скриптингу » Один вопрос » 24-10-2010 11:28

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

#24 Re: Вопросы по скриптингу » Один вопрос » 23-10-2010 08:26

Кстати, никто не знает, как пользоваться консольным Spark'ом?
-------------------------------------------------------------------------------
А всё не надо, уже нашёл)

#25 Re: Вопросы по скриптингу » Один вопрос » 21-10-2010 19:33

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

Board footer

Powered by FluxBB