You are not logged in.
Спасибо, а вот на счёт порядкового номера в handling.cfg
Имеется ввиду, каким по счёту он в файле.
Как пользоваться адресами handling для машины [Адреса]
Заголовок 3 пункт 3.2
0@ = 0xC2B9DC 1@ = 5 // Тут ID хэндлинга, по идее, порядковый номер в handling.cfg (не ID машины). Короче, надо подбирать для нужного ID машины 1@ *= 224 005A: 0@ += 1@ 0@ += 0x14 // тут должно быть необходимое тебе смещение, из указанных в статье 0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0
Если нужно записать значение, то вместо опкода 0A8D используй этот:
0A8C: write_memory 0@ size 4 value 2@ virtual_protect 0
В этом случае, содержимое переменной 2@ запишется по нужному адресу.
Обращай внимание на указания [byte] к смещениям. Это значит, что величина значения не 4 байта (как обычная переменная), а 1. Соответственно параметр size в опкоде чтения/записи памяти нужно изменить на соответствующий (1).
Ребят, а кто знает аналогичный опкоды к 0A8D 0A8C???
Зачем?
Если уж так нужно их чем-нибудь заменить, читай в справке к SB статью про изменение игровой памяти через SCM (в разделе "Опытным пользователям").
думаю даже для актёра можно использовать
Да, только опкод получения структуры надо соответствующий поставить.
Ребят во общем мне надо для машины. Думаю с объектом тоже так же можно сделать
Написал в виде SCM-функции, ибо так удобнее использовать.
// 0AB1: SetCarRotationFromCamera 1 car 0@ :SetCarRotationFromCamera 0A97: 1@ = car 0@ struct 1@ += 0x14 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 2@ = 0xB6F99C // Адрес матрицы камеры // Первые три значения инвертируем, т.к. матрица камеры немного не такая, как у машины 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 3@ *= -1.0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 4 2@ += 4 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 3@ *= -1.0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 4 2@ += 4 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 3@ *= -1.0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 8 2@ += 8 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 4 2@ += 4 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 4 2@ += 4 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 8 2@ += 8 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 4 2@ += 4 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 1@ += 4 2@ += 4 0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 0AB2: ret 0
Если будешь использовать с объектом, вместо машины, то опкод 0A97 надо заменить на 0A98.
В 07C6 передаются компоненты кватерниона x y z w.
Найди матрицу камеры, переведи вращение в кват, потом кват отправляй в 07C6.
Проще уж будет задать объекту матрицу камеры, нежели переводить её в кват и задавать опкодом (тем более, что он используется конкретно для машин, а ему надо для любого объекта). Вобщем, чуть позже напишу, как реализовать, сейчас уходить надо.
Может, есть другие форумы на примете?
Может GTA Forums подойдёт? Правда это не русский форум.
А вообще, какие лимиты тебя интересуют?
Тогда, может быть, есть какая-нибудь альтернатива для снятия лимитов? Я знаю, что есть отдельный stream memory fix, но он имеет только одну функцию из тех, что нужны мне.
Есть SALimitAdjuster от Alexander'а. Прикреплю его. Он правит сам экзешник игры.
И если не секрет, какой операционной системой пользуешься, Ворон?
Windows 7 x64
Скачал с главной страницы, поставил - все равно не работает. Может, какая-нибудь аппаратная или программная несовместимость?
Единственное, что я мог бы предположить - наличие других модификаций, которые могут вызывать конфликт... но ты вроде написал, что у тебя только аси-лоадер и лимит аджастер. Аппаратная несовместимость тут не может иметь место. Программная - тоже вряд ли. Даже не знаю, что не так. Возможно кто-то другой сталкивался с подобными проблемами, нужны более опытные люди, вобщем.
P.S. с помощью великого гугла по коду ошибки набрел на единственную страничку, на которой говорилось, что эта ошибка возникает, если на Windows Vista/7/8 выбрать в игре 16-битную цветность
Код ошибки может играть роль только в данном конкретном случае. Он может встретиться в самых различных программах и играх, так что нет смысла искать что-либо в интернете по этому поводу.
Поставил себе этот лимит аджастер - игра прекрасно работает. Попробуй, как я и сказал, поставить аси-лоадер, который идёт в комплекте с CLEO.
Собственно, проблема в чём? Вылетает из-за Limit Adjuster'а? Выложи его куда-нибудь, потестим. Пробуй ставить аси-лоадер, который идёт с CLEO обычно.
Исходя из крэшдампа, ничего конкретного сказать нельзя. Вылет происходит в районе функции рендера поверхности, насколько я понял.
Нет. Обнулить, значит приравнять весь диапазон памяти к нулю.
Например так:
0A8C: write_memory 0@ size 512 value 0 virtual_protect 0
Где 0@ - указатель на твою память, а 512 нужно поменять на размер выделенной памяти.
Я выделяю и очищаю память, но строку я могу найти в памяти СА. Как это можно обойти?
Прежде чем выгружать память, обнули её.
Уверен, что твой скрипт имеет нулевой номер?
DK22Pac wrote:Получить структ педа, добавить смещение, прочитать структ убийцы (4 байта). Сверить структ убийцы со структом игрока.
ввиде кода пример можешь?
Если у тебя есть хэндл убитого педа, то вот:
// Предположим, что хэндл убитого педа записан в 0@ 0A96: 1@ = actor 0@ struct 0A96: 2@ = actor $PLAYER_ACTOR struct 1@ += 0x764 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 if 003B: 2@ == 3@ // Сравниваем указатели then // Тут твой код, если именно игрок убил педа end
Я тут вдруг подумал - было бы неплохо, если бы метки распознавались как "ссылки" при зажатии какой-нибудь клавиши (Ctrl например) или чтобы при нажатии на них правым кликом, был пункт "Перейти к метке".
Ну к примеру, такой код:
:label_1 wait 0 jump @label_2 :label_2 jump @label_1
Вот когда жмёшь к примеру правым кликом по @label_2, чтоб в менюшке был этот самый пункт, указанный выше. И когда его выбираешь, тебя перекидывает к :label_2.
Конечно, это не слишком полезно, ведь сейчас мы стараемся перейти к высокоуровневым конструкциям, но при декомпиляции каких-либо скриптов, мы возвращаемся к старым добрым меткам
Вобщем, фича не слишком важная, но было бы неплохо, если бы она существовала.
02E0: actor $PLAYER_ACTOR aggressiveЭта проверка срабатывает, как я понял, если актёр использует оружие. Но не сразу, а через некоторое время. Видимо, есть какой-то показатель агрессии, и когда он достигает какого-то значения, проверка срабатывает. Можно ли как-то изменять этот показатель? К примеру, чтобы он увеличивался, если актёр выполняет ещё за какие-то действия.
Насколько я помню, у меня эта проверка срабатывала, когда игрок находится в агрессивной стойке (к примеру, после удара). Насчёт оружия не знаю.
Здесь идёт не показатель, а просто проверка состояния игрока.
Можно сделать показатель самому, отсчитывая, сколько, к примеру, игрок сделал ударов/убийств за определённый промежуток времени (к примеру за последнюю минуту).
2. Есть ли способ поменять угол поворота у объекта, если он прикреплён к кости? Я пробовал в опкоде 070A: менять седьмой параметр, но, похоже, там только два варианта поворота, и не те, что надо
Нет, менять угол крепления нельзя.
Да, именно так. Я это и пытался объяснить.
Ясно. Нужно преобразовать локальное вращение в глобальное. Я попробую написать код.
Что-то мы тут совсем запутались, о чём речь. Я же ничего про этот опкод не говорил и не использовал его. Я пытался объяснить, что 05A1: и 05A2: работают некорректно, если до их испоьзования задать объекту угол поворота, т.е. Z_angle.
Так бы сразу и сказал. Я не мог понять, в чём твоя проблема. Значит объект вращается "криво", если угол Z отличен от нуля?
Так в том-то и дело, что я с этим объектом больше ничего не делаю. И да, визуально вращение продолжается в ту же сторону.
Тогда какая тебе разница, что показывает тебе опкод, получающий текущий угол объекта?
@d88, я не пойму, ты в скрипте после вращения используешь получение угла объекта? Ну, опкод 0176? Визуально вращение продолжается в нужном направлении, так ведь?
Мне казалось, это естественно. С какой стати этот угол поворота меняется? Объект ведь должен просто вращаться вокруг одной из своих осей, а не повернуться одновременно по ещё одной.
Видимо мы друг-друга не поняли. Ты считаешь, что "угол поворота" - это угол в горизонтальной плоскости (ось Z). Суть в том, что при вращении по оси X (я так понял, именно это тебе нужно) вращение по оси Z на самом деле не происходит. Но функция получения угла Z объекта использует такой метод, который возвращает неправильное значение угла из-за вращения по другой оси (по идее он меняется на угол с разницей в 180 градусов).
Просто хотел сначала поискать способ, чтоб вращение было плавным.
Я так и не понял, почему вращение тем способом, который я указал, не плавное? Что ты имеешь ввиду?
Способ в любом случае есть. Можно даже вручную это делать опкодом 0453, если правильно его использовать.
Есть, к примеру, модель стального веера Китаны, так вот я хочу сделать возможность бросать этот объект, но он должен вращаться на лету.
А чем тебе мешает изменение угла поворота объекта? Как ты себе представляешь вращение объекта без изменения угла поворота объекта?
Нет, есть, конечно, вариант с анимированием объекта... Но это уж если осилишь...
С этими опкодами если сначала задать объекту угол поворота, то при вращении он меняется.
Эм... а что тебе именно нужно? Для чего тебе?