You are not logged in.
Поворот матрицы на заданные углы:
0AA6: call_method 0x59B120 struct $Matrix num_params 3 pop 0 0.0 0.0 0.0 // rot Z rot Y rot X (radians)
Спасибо, проверю.
Вот, я сейчас кое-что перепроверил и выяснил, что тот самый метод вовсе не замедляет скрипт. Я кажется нашёл адрес указателя на позицию камеры, но что-то там не так. Вероятно, в придачу к изменению данной позиции необходимо выполнить ещё какую-нибудь фунцию (метод, или ещё что-нибудь в этом роде), которая как-бы "освежит" координаты камеры. Короче говоря, это надо видеть. Вот пример:
0A8D: 14@ = read_memory 0xC88050 size 4 virtual_protect 0 // получаем адрес координат камеры 0085: 20@ = 14@ // (int) 0A8C: write_memory 0x52B730 size 1 value 0xC3 virtual_protect 1 // записываем retn по указанному адресу, оригинальное значение - 0x81 0AC7: 12@ = var 17@ offset 0A96: 30@ = actor $PLAYER_ACTOR struct while true 0AA6: call_method 0x5E4280 struct 30@ num_params 3 pop 0 1 8 12@ // getPedBonePosition 0085: 14@ = 20@ // (int) 0A8C: write_memory 14@ size 4 value 17@ virtual_protect 0 14@ += 4 0A8C: write_memory 14@ size 4 value 18@ virtual_protect 0 14@ += 4 0A8C: write_memory 14@ size 4 value 19@ virtual_protect 0 wait 0 end
Камера движется вообще без рывков, плавно и не отстаёт, но сам "объект камеры" остаётся на прежнем месте, т.е. если уйти далеко, то не будут убираться LOD'ы зданий, звук будет слышен из прежнего положения камеры и т.п.. Кстати. чуть не забыл про тот самый скрипт, который убирает задержку в цикле.
У меня вот возникла такая интересная идея, не знаю насчёт того, можно ли её воплотить в реальность (вероятней всего да): из игрового MOV'ера камеры вырезать операции с передвижением камеры, но оставить всё остальное. 0x52B730 - Start of camera 'MOVer' subroutine - короче говоря, как я понял, если писать в самое начало retn, то всё, что идёт далее игнорируется - процесс переходит далее, вобщем, аналогично опкодам end_thread, return или jump. Если посмотреть в IDA этот адрес, то можно увидеть, что первым делом идёт обработка положения камеры, затем обработка углов, а если точнее той точки, куда смотрит камера и т.п. Вот если бы можно было пропустить этот кусок (что-то вроде jump'а в СБ) и пойти дальше, было бы очень хорошо. Ещё лучше было бы, если бы можно было просто подставить свои координаты туда...
Last edited by Voron295 (02-10-2011 21:31)
Offline
Подскажите, можно ли выключить взрыв автомобилей при переворачивании?
Offline
Подскажите, можно ли выключить взрыв автомобилей при переворачивании?
мои тесты (путем включения чита неубиваемости текущего авто) показывают, что авто при переворачивании не взрывается как таковое, а быстро теряет здоровье (как известно при здоровье меньше 250 авто начинает гореть и потом (при 0) взрывается - с включенным читом оно порывается загореться, но сразу тушится). Согласно базе данных по адресам в СА по оффсету +1216 находится флоат значение оставшегося здоровья авто, а по оффсету +2276 - флоат таймер горения. Соответственно отключить взрыв можно, проверив находится ли авто в перевернутом положении, и переписывая в лупе значение либо здоровья, либо таймера. Хотя, возможно, где-то есть флаг, отвечающий за последствия переворачивания...
Try not. Do or do not, there is no try.
Offline
Есть такой опкод. Находил в базе deji. Сейчас сам хочу найти. Можно посмотреть тему cleo favorites там тоже кое что есть.
Offline
Есть такой опкод. Находил в базе deji. Сейчас сам хочу найти. Можно посмотреть тему cleo favorites там тоже кое что есть.
Да, действительно, есть опкод на эту тему. Мой SASCM.INI знает один:
03ed=2,set_car %1d% disable_flipped_explosion_when_empty %2h%
1ый параметр - переменная авто, 2ой, насколько я понимаю, - флаг 0/1
Однако, судя по описанию, он отключает взрыв только на пустой машине...
Try not. Do or do not, there is no try.
Offline
Занопать функцию того самого изменения таймера.
Offline
Занопать функцию того самого изменения таймера.
Занопать можно, но тогда это будет на все авто действовать, а не только на авто героя...
Кстати, вопрос к тебе: у тебя что-то вышло с добавлением нового шрифта в игру?
Вопрос ко всем: у кого-нибудь есть почищенный мейн (то есть не совсем пустой, как в файлах СБ идёт, а почищенный от рокстаровского мусора типа опкодов про mutual_activities и идущих подряд jump'ов)?
И еще нубский вопрос... Можно ли в мейне (не в клео) сделать госабом переход в "левую" метку? Например, добавить в мейн интерсептор. Из одного потока искать, скажем авто... из второго - педов. Но искать их госабами, обращаясь к единому интерсептору? Или, можно ли использовать в каждом из таких потоков опкод 0AB1: call_scm_func @interceptor 0, а, соответствено, метку интерсептора в мейне иметь одну?
Last edited by Yoda (09-10-2011 06:13)
Try not. Do or do not, there is no try.
Offline
Занопать можно, но тогда это будет на все авто действовать, а не только на авто героя...
Так вот мне и надо выключить взрыв у всех автомобилей..
Offline
Занопать можно, но тогда это будет на все авто действовать, а не только на авто героя...Так вот мне и надо выключить взрыв у всех автомобилей..
Это я поторопился малось, сказав, что все таймеры отключаться... Отключится как раз только авто героя, ну или той машины, от хендла которой считать оффсет таймера... Чтобы отключить у всех (ну или почти у всех) я бы искал интерсептором перевёрнутое авто и вышеуказанным опкодом запрещал взрыв + нопил таймер в авто героя (поскольку компьютерные педы из авто при переворачивании вылезают - их авто будет пустой и опкод будет работать, а авто героя будет с героем пока кнопку выхода не нажмёшь).
Try not. Do or do not, there is no try.
Offline
Jack Daniel's wrote:Занопать функцию того самого изменения таймера.
Кстати, вопрос к тебе: у тебя что-то вышло с добавлением нового шрифта в игру?
Ничего %D
Посмотри скрипт Ryosuke, он там свой txd загружает и текстуры из него.
http://dl.dropbox.com/u/34394266/hud.zip
Offline
Вопрос ко всем: у кого-нибудь есть почищенный мейн (то есть не совсем пустой, как в файлах СБ идёт, а почищенный от рокстаровского мусора типа опкодов про mutual_activities и идущих подряд jump'ов)?
Что ты имеешь ввиду? Всё кроме миссий? Если да, то я этим занимаюсь, через пару дней может выложу, если надо.
У меня тож вопрос:
Хочу прикрепить камеру к объекту, но так, чтобы крепление было жёстким - углы объекта и камеры должны совпадать. Наткнулся на метод, а может функцию, я толком и не понял в чём между ними разница, у училки по информатике спросил, она сказала, что в функцию передаются параметры и в конце её работы какие-то значения возвращаются, а метод не возвращает никаких значений. Но вот я ещё заметил, что в опкоде, который вызывает метод нужно указывать структуру. К тому же видал методы, которые возвращают значения. Как же всё-таки их различить (в IDA)? Вернёмся к основному вопросу: нашёл, вероятней всего, метод - CCamera__attach (0x50C7C0). Его используют опкоды 0158 и 0159. Можно ли (если да, то как) прикрепить камеру к объекту этим методом?
Last edited by Voron295 (09-10-2011 09:56)
Offline
Извините за оффтоп:
в твоем мейне я нашел еще один баг. На улицах в лавках с едой нельзя кушать, хотя продавцы стоят. И можешь еще убрать скрипт спортзала. Вообщем, чтоб в спортзал можно было зайти, но в нем небыло боев.
Offline
Как же всё-таки их различить (в IDA)?
http://sannybuilder.com/forums/viewtopic.php?id=941
CCamera__attach (0x50C7C0). Его используют опкоды 0158 и 0159. Можно ли прикрепить камеру к объекту этим методом?
Должно работать, т.к. метод используется с CVehicle и CPed, а CVehicle, CPed и CObject имеют общего предка. Попробуй.
(если да, то как)
Как определить количество передаваемых параметров - разъяснено по ссылке выше. В метод CCamera__attach передаётся 4 параметра, не считая указателя на структуру CCamera (0x0B6F028). В опкоде вызова функции (метода) параметры перечисляются в том же порядке, в каком кладутся на стек в exe:
084 push 1 ; int 088 push ecx ; mode2 08C mov ecx, offset _camera 08C push edx ; mode1 090 push eax ; target
Т.е. метод надо вызывать так:
0AA6: call_method $CCamera__attach struct $CCamera num_params 4 pop 0 1 $mode2 $mode1 $Object_struct
Offline
Возможно ли каким-то способом заменить модель машины прямо в игре? (Не просто заспавнив другую машину, а именно изменить модель текущей).
Offline
Ага, есть метод CVehicle::setModelIndex. Но Денис (Den_spb) тестировал его, и обнаружил какие-то проблемы с колёсами.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
В этот метод передается только 1 параметр? (Ид машины или ид/название модели или что-то другое?).
deleted
Это не работает. Можешь привести код с правильным вызовом метода?
Last edited by Jack Daniel's (30-10-2011 08:51)
Offline
Параметр один, всё верно. Но метод работает только при следующих условиях:
1.Предварительно загружена новая модель.
2.Старая и новая модели однотипны (например, 4-дверное авто заменить на 2-дверное не получится, только 4-дверное на 4-дверное).
Offline
Спасибо, работает.
P.S я нашел способ заменить 2-дверную на 4-дверную (у меня gta_sa.exe отредактированный - не вылетает при ошибках, т.е если юзнуть даже Actor.DestroyInstantly($PLAYER_ACTOR), то актер уничтожится! Но продолжать играть не будет возможно или же если юзнуть Player.Defined($ACTOR_CHAR), то тоже не вылетит).
Last edited by Jack Daniel's (10-10-2011 17:57)
Offline
P.S я нашел способ заменить 2-дверную на 4-дверную (у меня gta_sa.exe отредактированный - не вылетает при ошибках, т.е если юзнуть даже Actor.DestroyInstantly($PLAYER_ACTOR), то актер уничтожится! Но продолжать играть не будет возможно или же если юзнуть Player.Defined($ACTOR_CHAR), то тоже не вылетит).
Хах, не хочешь поделиться?))
Offline
На самом-то деле тестировалось в мультиплеере, а там samp.dll так же отслеживает ошибки (samp.dll я тоже пропатчил) и завершает работу игры по необходимости (вот как раз я пропатчил, чтобы не завершал) + в gta_sa.exe я пропатчил обработчик исключений, который используется samp.dll. Поэтому этот exe работает только в мп, а в сингле вылет при начале миссии. На самом-то деле это сырая версия, можно доделать, чтобы все было ок.
Last edited by Jack Daniel's (10-10-2011 18:56)
Offline
у меня gta_sa.exe отредактированный - не вылетает при ошибках
Надо от ошибок избавляться, а не от вылетов. Хотя как эксперимент - интересно конечно.
ли же если юзнуть Player.Defined($ACTOR_CHAR), то тоже не вылетит
Это проверка на существование игрока. Из-за её применения и не должно вылетать.
Last edited by Den_spb (10-10-2011 19:24)
Offline
Это проверка на существование игрока. Из-за её применения и не должно вылетать.
Обрати внимание на параметр - должен быть $PLAYER_CHAR.
Offline
$PLAYER_CHAR - это номер игрока, который, как правило, равен 0 (во многих скриптах так и пишется: Player.Defined(0) ). Ты создал новую переменную, а начальное значение любой новой переменной - ноль. Поэтому в принципе ничего не изменилось, и ошибки здесь быть не должно.
Offline
Спасибо, работает.
P.S я нашел способ заменить 2-дверную на 4-дверную (у меня gta_sa.exe отредактированный - не вылетает при ошибках, т.е если юзнуть даже Actor.DestroyInstantly($PLAYER_ACTOR), то актер уничтожится! Но продолжать играть не будет возможно или же если юзнуть Player.Defined($ACTOR_CHAR), то тоже не вылетит).
Хвастаться все горазды, а как на счёт выложить на суд людской?
Offline
Offline