#3776 30-09-2011 16:19

444andrei444
Registered: 29-03-2011
Posts: 317
Website

Re: Один вопрос

вот именно. а мне надо всех. а если я без прицела стреляю в них.

Offline

#3777 30-09-2011 16:33

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Один вопрос

Yoda wrote:
444andrei444 wrote:

А у меня такая проблема. Мне надо считать сколько я убил бандитов банды баласс и вагос. Причем в 2 счетчика в одно м балассы в другом вагосы. (уровень розыска банд)

Если я правильно понимаю: берешь нацеленного педа, проверяешь есть ли он и какой он модели, если баллас или вагос - проверяешь жив ли он, если нет - проверяешь кто его грохнул, если герой - +1 к соответствующей переменной-счетчику...
Правда, это не будет считать, например, задавленных...

Задавленных, по идее, тоже можно проверять (проверка соприкосновения актера с машиной игрока или как-то там).

Last edited by Jack Daniel's (30-09-2011 16:34)

Offline

#3778 30-09-2011 16:57

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

У меня вот какой вопрос - как получить указатель на матрицу объекта?


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3779 30-09-2011 17:48

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

Re: Один вопрос

У CVehicle, CObject и CPed адрес матрицы вращения хранится по одному и тому же адресу: структура+0x14

Offline

#3780 30-09-2011 18:12

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

Den_spb wrote:

У CVehicle, CObject и CPed адрес матрицы вращения хранится по одному и тому же адресу: структура+0x14

спасибо, проверю

UPD. Простите, неправильно выразился, надо позицию - X, Y и Z. Как я понял по адресу структура+0x14+0x30, но там почему-то по нулям...

Last edited by Voron295 (30-09-2011 18:31)


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3781 30-09-2011 18:51

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

Re: Один вопрос

UPD. Простите, неправильно выразился, надо позицию - X, Y и Z. Как я понял по адресу структура+0x14+0x30, но там почему-то по нулям...

Неправильно, читать память нужно дважды. Первый раз - для получения адреса матрицы, второй - для получения значения элемента:

0A98: 0@ = object 0@ struct
0@ += 0x14                            
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x30                            
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0

А вообще для этой цели есть стандартный опкод:

01BB: store_object 0@ position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3

Offline

#3782 30-09-2011 19:05

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

Den_spb wrote:

Неправильно, читать память нужно дважды. Первый раз - для получения адреса матрицы, второй - для получения значения элемента:

0A98: 0@ = object 0@ struct
0@ += 0x14                            
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x30                            
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0

Спасибо, теперь дошло))

Den_spb wrote:

А вообще для этой цели есть стандартный опкод:

01BB: store_object 0@ position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3

Про его существование я в курсе, необходимо кое-что проверить с изменением позиции именно через память.


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3783 30-09-2011 19:13

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

Re: Один вопрос

Про его существование я в курсе, необходимо кое-что проверить с изменением позиции именно через память.

Стандартный опкод работает по тому же принципу.

Offline

#3784 30-09-2011 19:57

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

Den_spb wrote:

Стандартный опкод работает по тому же принципу.

Да знаю я) я проверить хотел, замедляет ли скриптовый процесс этот самый опкод, но вроде не в нём дело. Опкод 0AA6 замедляет по ходу...


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3785 30-09-2011 21:45

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

Re: Один вопрос

Voron295 wrote:

я проверить хотел, замедляет ли скриптовый процесс этот самый опкод

Заменой одного опкода на пять время выполнения скрипта не уменьшишь.

Voron295 wrote:

Опкод 0AA6 замедляет по ходу...

Опкод 0AA6 просто вызывает указанный метод - ничего особенного в нём нет.
В чём вообще выражается "замедление"?

Offline

#3786 01-10-2011 05:50

444andrei444
Registered: 29-03-2011
Posts: 317
Website

Re: Один вопрос

07E4: get_model 2601 dimensions_cornerA_to 20@ 21@ 22@ dimensions_cornerB_to 20@ 21@ 22@ 21@ /= 2.0 21@ += 0.027 
070A: AS_actor $PLAYER_ACTOR attach_to_object 3@ offset 0.062 21@ 0.0 on_bone 5 16 perform_animation "VEND_USE_PT2" IFP_file "VENDING" time 0 
070A: AS_actor $PLAYER_ACTOR attach_to_object 3@ offset 0.062 21@ 0.0 on_bone 5 16 perform_animation "VEND_DRINK2_P" IFP_file "VENDING" time 0

вот так крепится бутылка к актеру, и исполняется анимация питья из бутылки. Проблема в том ,что она крепится не той стороной и получается, что актер пьет не из горлышка, А из дна бутылки. Можно это как то исправить?

Last edited by 444andrei444 (01-10-2011 05:53)

Offline

#3787 01-10-2011 17:03

Metis
Registered: 01-10-2011
Posts: 1

Re: Один вопрос

Помогите разобраться,что в этом скрипте не так?не работает sad

:NONAME
02DD: 1@ = get_random_ped_in_zone 'SAN_AND' with_pedtype_civilian 1 gang 0 criminal/prostitute 1 
   not 1@ == -1 
jf @NONAME 
Actor.StorePos(1@, 2@, 3@, 4@)
Actor.DestroyInstantly(1@)
Actor.RemoveReferences(1@)
Model.Load(#SWAT)
Model.Load(#KNIFECUR)
038B: load_requested_models 

:NONAME_70
wait 0 
if and
   Model.Available(#SWAT)
   Model.Available(#KNIFECUR)
jf @NONAME_70 
1@ = Actor.Create(Special, #SWAT, 2@, 3@, 4@)
Actor.Armour(1@) = 1500
0446: set_actor 1@ immune_to_headshots 0 
01B2: give_actor 1@ weapon 4 ammo -1 // Load the weapon model before using this 
087E: set_actor 1@ weapon_droppable 0 
060A: create_decision_maker_type 0 store_to 8@ // decision\allowed\m_.ped files 
060B: set_actor 1@ decision_maker_to 8@ 
077A: set_actor 1@ acquaintance 4 to_actors_pedtype 0 // see ped.dat 
07A5: AS_actor 1@ attack_actor $PLAYER_ACTOR -1 ms 

:NONAME_179
wait 0 
if or
   not Player.Defined($PLAYER_CHAR)
   Actor.Dead(1@)
jf @NONAME_226 
Actor.RemoveReferences(1@)
065C: release_decision_maker 8@ 
wait 10000 
jump @NONAME 

:NONAME_226
if 
   Actor.Driving($PLAYER_ACTOR)
07A5: AS_actor 1@ attack_actor $PLAYER_ACTOR -1 ms 
jump @NONAME_179

Last edited by Metis (01-10-2011 17:23)

Offline

#3788 01-10-2011 18:56

Yoda
From: Moscow
Registered: 08-03-2011
Posts: 90

Re: Один вопрос

Metis wrote:

Помогите разобраться,что в этом скрипте не так?не работает sad

:NONAME_226
if 
   Actor.Driving($PLAYER_ACTOR)
07A5: AS_actor 1@ attack_actor $PLAYER_ACTOR -1 ms 
jump @NONAME_179

jf @ не пробовал добавить? а то когда герой пешком у тебя код подвисает...


Try not. Do or do not, there is no try.

Offline

#3789 01-10-2011 19:23

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

Re: Один вопрос

В цикле должен быть wait:

:NONAME
wait 0
02DD: 1@ = get_random_ped_in_zone 'SAN_AND' with_pedtype_civilian 1 gang 0 criminal/prostitute 1
   not 1@ == -1
jf @NONAME

Offline

#3790 01-10-2011 21:24

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

Den_spb wrote:

Опкод 0AA6 просто вызывает указанный метод - ничего особенного в нём нет.
В чём вообще выражается "замедление"?

Ну скрипт ведь не идёт дальше, пока не выполнится указанный метод, так ведь? А замедление выражается в цикле - ставлю объект в цикле в указанную точку. В опкоде 0AA6 использую метод, который вычисляет координаты указанной кости игрока. В эти самые координаты ставлю объект. В данном случае объект ставится туда рывками. Если прикрепить другой объект к кости игрока, а затем опкодом 01BB записывать его координаты и ставить туда первый объект, то перемещение происходит значительно плавнее.

P.S. Использую скрипт, который увеличивает "приоритет" скриптового движка - CScriptEngine_update.cs


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3791 01-10-2011 22:26

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

Re: Один вопрос

Дело не в том, что скрипт "медленно работает". В один момент времени выполняется только одна процедура exe (относящаяся к скриптовому движку или какая-либо другая). Проще говоря, в момент выполнения скрипта "нескриптовые" процессы не выполняются. Если скрипт будет медленно работать, то это скажется на скорости работы всей игры, что проявляется, в частности, заметным уменьшением FPS.

Если прикрепить другой объект к кости игрока, а затем опкодом 01BB записывать его координаты и ставить туда первый объект, то перемещение происходит значительно плавнее.

А зачем вообще нужен второй объект? Не проще ли сразу прицепить первый объект к кости?

Offline

#3792 02-10-2011 06:45

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

Den_spb wrote:

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

Я бы не стал делать таких выводов. У меня сложилось впечатление, будто скриптовый движок не связан с графическим. Я приведу несколько примеров: wait 1000 (1000 взял к примеру) означает задержку в 1000 милисекунд в системе, и будь у тебя 10 фпс или 60 фпс, всё равно задержка составит 1 системную секунду; это же подтверждает задержку в цикле, которая, как я понял, вызвана не wait 0, а какой-то последовательностью запуска движков (наверное я неправильно выражаюсь), отсюда и скрипт убирающий эту задержку в цикле - я не смотрел куда именно он тыкает в память, но судя по всему он меняет приоритеты игровых движков (а может просто добавляет ещё один промежуточный запуск скриптового движка?).

Den_spb wrote:

А зачем вообще нужен второй объект? Не проще ли сразу прицепить первый объект к кости?

Отсюда и вытекает, то, что необходимо использовать 2 объекта, ибо мне нужно прикрепить камеру к объекту (машине, актёру, разницы нет, удобнее просто с объектом работать), а если я прикреплю объект к кости, а к нему камеру, тем самым способом, что ты мне подсказал:

0A8C: write_memory 4805086 size 1 value 156 virtual_protect 1 
0A8C: write_memory 4805091 size 4 value -197031 virtual_protect 1 
067B: put_camera_on_object 12@ with_offset 6@ 7@ 0.0 point_to_actor 1@ tilt 0.0 2 
0A8C: write_memory 4805086 size 1 value 148 virtual_protect 1 
0A8C: write_memory 4805091 size 4 value -592135 virtual_protect 1

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

Если прикрепить другой объект к кости игрока, а затем опкодом 01BB записывать его координаты и ставить туда первый объект, то перемещение происходит значительно плавнее.

Так понятно? Вообще речь идёт опять же о виде от первого лица. Последний указанный мной способ тоже не совсем подходит - камера движется плавно, но она отстаёт при увеличении скорости. Только что мне пришла в голову ещё 1 идея, которую я не проверил: прикрепить объект к кости, и записывая координаты этого объекта ставить туда камеру. Я уже пробовал подобное - методом вычислял координаты кости и ставил туда камеру, но была такая же фигня - из-за метода скрипт тормозил. Сейчас проверю новую идею.

UPD. А, нет, такая же фигня с отставанием. Единственный раз, когда мне удалось убрать полностью эффект задержки - это перемещение камеры напрямую, через матрицу. Но здесь есть 2 проблемы:
1. Вполне решаема - необходим код, переводящий углы в вектора и наоборот.
2. Указатель на матрицу камеры, который указан в списке адресов памяти, нельзя изменить, почитай вот этот пост.
Какой-то "ненастоящий" адрес матрицы я нашёл при помощи Cheat Engine, и её можно было изменить (при условии записи команды retn в 0x52B730), однако это работает только в пределах нескольких метров. И ещё её адрес меняется, как мне показалось, в зависимости от майна (может от его размера), по крайней мере я заметил именно такую зависимость.

Last edited by Voron295 (02-10-2011 07:00)


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3793 02-10-2011 08:42

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Один вопрос

Я бы не стал делать таких выводов. У меня сложилось впечатление, будто скриптовый движок не связан с графическим. Я приведу несколько примеров: wait 1000 (1000 взял к примеру) означает задержку в 1000 милисекунд в системе, и будь у тебя 10 фпс или 60 фпс, всё равно задержка составит 1 системную секунду; это же подтверждает задержку в цикле, которая, как я понял, вызвана не wait 0, а какой-то последовательностью запуска движков (наверное я неправильно выражаюсь), отсюда и скрипт убирающий эту задержку в цикле - я не смотрел куда именно он тыкает в память, но судя по всему он меняет приоритеты игровых движков (а может просто добавляет ещё один промежуточный запуск скриптового движка?).

Как можно скриптовый движок запускать много раз за игру? grin Секрет в потоках и wait 100500 никак не действует на работу приложения, только поможет, т.к потоки выполняются последовательно, то wait как раз-таки прекращает выполнение текущего потока и перескакивает к следущему и чем больше значение в wait, тем дольше не будет возвращен в работу поток. Wait 0 - делает текущему потоку высокий приоритет, т.е этот поток будет максимально быстро возвращен к работе после выполнения wait в другом потоке. Так вот, если нет wait в циклах, то не будет перехода в другие потоки и игра зависнет.

p.s Но я в чем-то ошибаюсь, так что можете меня поправить, лол

Last edited by Jack Daniel's (02-10-2011 09:35)

Offline

#3794 02-10-2011 10:05

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

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


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3795 02-10-2011 10:45

Dr_Emmett_Brown_2011
Registered: 28-04-2011
Posts: 80

Re: Один вопрос

У меня есть скрипт, изменяющий максимальную скорость автомобиля, но если поставить значение более той, что указано в Handling, то при снижении скорости игра зависает! Вот скрипт:

0006: 1@ = 424 //модель автомобиля
0012: 1@ *= 4 
000A: 1@ += 11120840 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 
000A: 1@ += 74 
0A8D: 1@ = read_memory 1@ size 2 virtual_protect 0 
0012: 1@ *= 224 
000A: 1@ += 12761564 
000A: 1@ += 132 
0A8C: write_memory 1@ size 4 value 1063340000 virtual_protect 0

Кто может, объясните, пожалуйста! sad

Last edited by Dr_Emmett_Brown_2011 (02-10-2011 10:51)

Offline

#3796 02-10-2011 11:00

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Один вопрос

Dr_Emmett_Brown_2011 wrote:

У меня есть скрипт, изменяющий максимальную скорость автомобиля, но если поставить значение более той, что указано в Handling, то при снижении скорости игра зависает! Вот скрипт:

0006: 1@ = 424 //модель автомобиля
0012: 1@ *= 4 
000A: 1@ += 11120840 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 
000A: 1@ += 74 
0A8D: 1@ = read_memory 1@ size 2 virtual_protect 0 
0012: 1@ *= 224 
000A: 1@ += 12761564 
000A: 1@ += 132 
0A8C: write_memory 1@ size 4 value 1063340000 virtual_protect 0

Кто может, объясните, пожалуйста! sad

00AD: set_car @1 max_speed_to 10.0

Заранее помещая в @1 текущую машину актера опкодом 03C0

Offline

#3797 02-10-2011 11:36

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

Re: Один вопрос

Voron295 wrote:

Я бы не стал делать таких выводов. У меня сложилось впечатление, будто скриптовый движок не связан с графическим. Я приведу несколько примеров: wait 1000 (1000 взял к примеру) означает задержку в 1000 милисекунд в системе, и будь у тебя 10 фпс или 60 фпс, всё равно задержка составит 1 системную секунду; это же подтверждает задержку в цикле, которая, как я понял, вызвана не wait 0, а какой-то последовательностью запуска движков (наверное я неправильно выражаюсь), отсюда и скрипт убирающий эту задержку в цикле - я не смотрел куда именно он тыкает в память, но судя по всему он меняет приоритеты игровых движков (а может просто добавляет ещё один промежуточный запуск скриптового движка?).

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

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

{$CLEO}
0000:
while true
    32@ = 0  // обнуляем таймер       
    wait 0 // прерываем работу скрипта
    03F0: enable_text_draw 1 
    045A: draw_text_1number 300.0 300.0 GXT 'NUMBER' number 32@  // выводим значение таймера
end

Результат: 70 - 90 мс.
Теперь проверим, влияет ли длительность выполнения скрипта на игру. Пусть скрипт будет выполнять 3000 опкодов за цикл:

{$CLEO}
0000:
while true
    32@ = 0
    repeat
        0@ += 1
    until 0@ == 1000
    0@ = 0        
    wait 0
    03F0: enable_text_draw 1 
    045A: draw_text_1number 300.0 300.0 GXT 'NUMBER' number 32@  // ~1~
end

Результат: всё те же 70 - 90 мс, FPS нисколько не упала.
Увеличим количество операций до 30000 опкодов в цикл:

{$CLEO}
0000:
while true
    32@ = 0 
    repeat
        0@ += 1
    until 0@ == 10000
    0@ = 0        
    wait 0
    03F0: enable_text_draw 1 
    045A: draw_text_1number 300.0 300.0 GXT 'NUMBER' number 32@  // ~1~
end

Результат: 180 - 190 мс, игра стала немного притормаживать.
300000 опкодов в цикл:

{$CLEO}
0000:
while true
    32@ = 0 
    repeat
        0@ += 1
    until 0@ == 100000
    0@ = 0        
    wait 0
    03F0: enable_text_draw 1 
    045A: draw_text_1number 300.0 300.0 GXT 'NUMBER' number 32@  // ~1~
end

Результат: 1500 - 1700 мс, игра превратилась в слайдшоу.
1500000 опкодов в цикл:

{$CLEO}
0000:
while true
    32@ = 0 
    repeat
        0@ += 1
    until 0@ == 500000
    0@ = 0        
    wait 0
    03F0: enable_text_draw 1 
    045A: draw_text_1number 300.0 300.0 GXT 'NUMBER' number 32@  // ~1~
end

Результат: 10000 - 15000 мс. Можно двинуть мышью и подождать 10 - 15 секунд, прежде чем игра ответит на это воздействие.
Ну а что будет, если убрать wait из скрипта, всем известно - игра зависнет. Объяснение простое: скрипт выполняется без остановки, в результате не работают другие процессы, в т.ч. отрисовка, обработка нажатия клавиш и т.д.

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

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

Last edited by Den_spb (02-10-2011 13:02)

Offline

#3798 02-10-2011 11:44

Dr_Emmett_Brown_2011
Registered: 28-04-2011
Posts: 80

Re: Один вопрос

Джек Даниила, он не реагирует на автомобиль, в котором сидит актёр!

Offline

#3799 02-10-2011 16:48

Voron295
From: Каушаны
Registered: 06-12-2010
Posts: 425
Website

Re: Один вопрос

@Den_spb - ясно... насчёт камеры - может кто-нибудь помочь с поиском решения тех 2-ух проблем, что я указал выше?

Last edited by Voron295 (02-10-2011 16:52)


Добро всегда побеждает зло. Кто победил, тот и добрый!
userbar.png

Offline

#3800 02-10-2011 19:19

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

Re: Один вопрос

Voron295 wrote:

1. Вполне решаема - необходим код, переводящий углы в вектора и наоборот.

Установка значений в матрицу по заданным углам:

0AA6: call_method 0x59B120 struct $Matrix num_params 3 pop 0 0.0 0.0 0.0  // rot Z rot Y rot X (radians)

Получение угла Z (при условии, что углы X и Y не выходят за пределы диапазона (-90.0; 90.0) ):

0A8E: $TopX = $Matrix + 16 // int
0A8E: $TopY = $Matrix + 20 // int
0A8D: $TopX = read_memory $TopX size 4 virtual_protect 0
0A8D: $TopY = read_memory $TopY size 4 virtual_protect 0
0604: get_angle_between_vectors_{x,y} $TopX $TopY and_{0,1}_store_to $ZAngle // Z_angle

Last edited by Den_spb (02-10-2011 20:20)

Offline

Board footer

Powered by FluxBB