You are not logged in.
вот именно. а мне надо всех. а если я без прицела стреляю в них.
Offline
444andrei444 wrote:А у меня такая проблема. Мне надо считать сколько я убил бандитов банды баласс и вагос. Причем в 2 счетчика в одно м балассы в другом вагосы. (уровень розыска банд)
Если я правильно понимаю: берешь нацеленного педа, проверяешь есть ли он и какой он модели, если баллас или вагос - проверяешь жив ли он, если нет - проверяешь кто его грохнул, если герой - +1 к соответствующей переменной-счетчику...
Правда, это не будет считать, например, задавленных...
Задавленных, по идее, тоже можно проверять (проверка соприкосновения актера с машиной игрока или как-то там).
Last edited by Jack Daniel's (30-09-2011 16:34)
Offline
У CVehicle, CObject и CPed адрес матрицы вращения хранится по одному и тому же адресу: структура+0x14
спасибо, проверю
UPD. Простите, неправильно выразился, надо позицию - X, Y и Z. Как я понял по адресу структура+0x14+0x30, но там почему-то по нулям...
Last edited by Voron295 (30-09-2011 18:31)
Offline
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
Неправильно, читать память нужно дважды. Первый раз - для получения адреса матрицы, второй - для получения значения элемента:
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
Offline
я проверить хотел, замедляет ли скриптовый процесс этот самый опкод
Заменой одного опкода на пять время выполнения скрипта не уменьшишь.
Опкод 0AA6 замедляет по ходу...
Опкод 0AA6 просто вызывает указанный метод - ничего особенного в нём нет.
В чём вообще выражается "замедление"?
Offline
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
Помогите разобраться,что в этом скрипте не так?не работает
: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
Помогите разобраться,что в этом скрипте не так?не работает
: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
Опкод 0AA6 просто вызывает указанный метод - ничего особенного в нём нет.
В чём вообще выражается "замедление"?
Ну скрипт ведь не идёт дальше, пока не выполнится указанный метод, так ведь? А замедление выражается в цикле - ставлю объект в цикле в указанную точку. В опкоде 0AA6 использую метод, который вычисляет координаты указанной кости игрока. В эти самые координаты ставлю объект. В данном случае объект ставится туда рывками. Если прикрепить другой объект к кости игрока, а затем опкодом 01BB записывать его координаты и ставить туда первый объект, то перемещение происходит значительно плавнее.
P.S. Использую скрипт, который увеличивает "приоритет" скриптового движка - CScriptEngine_update.cs
Offline
Дело не в том, что скрипт "медленно работает". В один момент времени выполняется только одна процедура exe (относящаяся к скриптовому движку или какая-либо другая). Проще говоря, в момент выполнения скрипта "нескриптовые" процессы не выполняются. Если скрипт будет медленно работать, то это скажется на скорости работы всей игры, что проявляется, в частности, заметным уменьшением FPS.
Если прикрепить другой объект к кости игрока, а затем опкодом 01BB записывать его координаты и ставить туда первый объект, то перемещение происходит значительно плавнее.
А зачем вообще нужен второй объект? Не проще ли сразу прицепить первый объект к кости?
Offline
Если скрипт будет медленно работать, то это скажется на скорости работы всей игры, что проявляется, в частности, заметным уменьшением FPS.
Я бы не стал делать таких выводов. У меня сложилось впечатление, будто скриптовый движок не связан с графическим. Я приведу несколько примеров: wait 1000 (1000 взял к примеру) означает задержку в 1000 милисекунд в системе, и будь у тебя 10 фпс или 60 фпс, всё равно задержка составит 1 системную секунду; это же подтверждает задержку в цикле, которая, как я понял, вызвана не wait 0, а какой-то последовательностью запуска движков (наверное я неправильно выражаюсь), отсюда и скрипт убирающий эту задержку в цикле - я не смотрел куда именно он тыкает в память, но судя по всему он меняет приоритеты игровых движков (а может просто добавляет ещё один промежуточный запуск скриптового движка?).
А зачем вообще нужен второй объект? Не проще ли сразу прицепить первый объект к кости?
Отсюда и вытекает, то, что необходимо использовать 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)
Offline
Я бы не стал делать таких выводов. У меня сложилось впечатление, будто скриптовый движок не связан с графическим. Я приведу несколько примеров: wait 1000 (1000 взял к примеру) означает задержку в 1000 милисекунд в системе, и будь у тебя 10 фпс или 60 фпс, всё равно задержка составит 1 системную секунду; это же подтверждает задержку в цикле, которая, как я понял, вызвана не wait 0, а какой-то последовательностью запуска движков (наверное я неправильно выражаюсь), отсюда и скрипт убирающий эту задержку в цикле - я не смотрел куда именно он тыкает в память, но судя по всему он меняет приоритеты игровых движков (а может просто добавляет ещё один промежуточный запуск скриптового движка?).
Как можно скриптовый движок запускать много раз за игру? Секрет в потоках и wait 100500 никак не действует на работу приложения, только поможет, т.к потоки выполняются последовательно, то wait как раз-таки прекращает выполнение текущего потока и перескакивает к следущему и чем больше значение в wait, тем дольше не будет возвращен в работу поток. Wait 0 - делает текущему потоку высокий приоритет, т.е этот поток будет максимально быстро возвращен к работе после выполнения wait в другом потоке. Так вот, если нет wait в циклах, то не будет перехода в другие потоки и игра зависнет.
p.s Но я в чем-то ошибаюсь, так что можете меня поправить, лол
Last edited by Jack Daniel's (02-10-2011 09:35)
Offline
Ну я и говорю, что я наверное неправильно выражаюсь, я не имею ввиду что скриптовый движок запускается много раз, а именно процесс игры переключается последовательно на выполнение скриптовых задач, на выполнение графических задач и т.д. Я не особо разбираюсь в движках и т.п., сужу лишь на основании прочитанного в инете и по собственным представлениям, так что сильно не ругайте за подобные ошибки)
Offline
У меня есть скрипт, изменяющий максимальную скорость автомобиля, но если поставить значение более той, что указано в 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
Кто может, объясните, пожалуйста!
Last edited by Dr_Emmett_Brown_2011 (02-10-2011 10:51)
Offline
У меня есть скрипт, изменяющий максимальную скорость автомобиля, но если поставить значение более той, что указано в 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Кто может, объясните, пожалуйста!
00AD: set_car @1 max_speed_to 10.0
Заранее помещая в @1 текущую машину актера опкодом 03C0
Offline
Я бы не стал делать таких выводов. У меня сложилось впечатление, будто скриптовый движок не связан с графическим. Я приведу несколько примеров: 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
Джек Даниила, он не реагирует на автомобиль, в котором сидит актёр!
Offline
Offline
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