Пятница, 29.03.2024, 17:36
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии ГТА » Работа с памятью, exe » Работа с памятью игры, exe
Работа с памятью игры, exe
walkДата: Пятница, 08.07.2011, 01:29 | Сообщение # 226
Группа: Проверенные
Сообщений: 96
Статус: Offline
DK22Pac, может есть способ перехватить координаты создаваемой сферы? У меня идеи есть, но как реализовать не особо понимаю

Может мне нужно сделать тоже самое, только с использованием:

Code
for 0@ = <адресс первой структуры в массиве> to <адресс последней структуры в массиве> step <размер одной структуры>
?
 
DK22PacДата: Пятница, 08.07.2011, 03:15 | Сообщение # 227
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Да, можно так сделать.
 
walkДата: Пятница, 08.07.2011, 05:49 | Сообщение # 228
Группа: Проверенные
Сообщений: 96
Статус: Offline
DK22Pac, вобщем попытался и опять те же грабли

Code
03BC: 8@ = create_sphere_at 2277.9211 -1255.8954 23.9886 radius 1.0  
03BC: 9@ = create_sphere_at 2279.0 -1258.0 23.9886 radius 1.0

:Noname_2
wait 0  
for 0@ = 0xA91268 to 0xA912F8 step 0x18  

   
0@ += 0x8  
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0  
0@ += 0x4  
0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0  
0@ += 0x4  
0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0  
064B: 4@ = create_particle "smoke_flare" at 1@ 2@ 3@ type 1  
064C: make_particle 4@ visible  

:Noname_127
jump @Noname_2


Но если в коде поставить 0@ += 0x18 , то эффект создаётся у второй сферы, а первая остаётся пустой, но если всё зациклить, то эффекта никакого
 
ILYALIONДата: Пятница, 08.07.2011, 07:12 | Сообщение # 229
Группа: Проверенные
Сообщений: 325
Статус: Offline
walk, спасибо, но можноли сделать так, чтобы эффект выходил вертикально вверх и был на всех авто с id 410-в траффике, просто стоящих на стоянке? А также включался без нажатия кнопки, и не выключался совсем. Просто у меня на этом id установлена печка, а автор сделал выхлопную трубу как раз из трубы печи. Обычный дым из выхлопной трубы как-то мало похож на настоящий дым из печи, вот я и подумал об этой идее.
 
DK22PacДата: Пятница, 08.07.2011, 09:08 | Сообщение # 230
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Переменная 0@ здесь выступает в роли счётчика.
В конце в цикле надо добавить
Code
0@ -= 0x10
 
walkДата: Пятница, 08.07.2011, 09:55 | Сообщение # 231
Группа: Проверенные
Сообщений: 96
Статус: Offline
DK22Pac, не мог бы ты у себя в игре мой код проверить и сказать в чём ошибка, почему эффект создаётся, либо у второй, либо у первой сферы, а не у всех игровых, как мне нужно.

Добавлено (08.07.2011, 09:55)
---------------------------------------------
ILYALION,

Code
while true
thread 'test'
wait 0
   if player.Defined(0)
    then
     0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to 5@
      if   0@ >  -1
      then
        if car.Id(0@) == 410
        then
         0AB1: call_scm_func @GetExhaustPipeOffset 1 car 0@ 1@ 2@ 3@   
         066C: 0@ = attach_particle "flamethrower" to_car 0@ with_offset 1@ 2@ 3@ rotation 0.0 -90.0 0.0 flag 1   
         064C: make_particle 0@ visible
        end
      end
    end
end

:GetExhaustPipeOffset
0A97: 0@ = car 0@ struct
0@ += 0x22    
0A8D: 0@ = read_memory 0@ size 2 virtual_protect 0 //model index
0@ *= 4
0@ += 0xA9B0C8
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //CModel
0@ += 0x5C                      
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //vehicle struct
0@ += 0x48
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 //x
0@ += 4
0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0 //y
0@ += 4
0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0 //z
0AB2: ret 3 1@ 2@ 3@


Держи. Накидал от руки, в игре сам проверь. По поводу выхода вертикально вверх, отвечает команда:

Code
066C: 0@ = attach_particle "flamethrower" to_car 0@ with_offset 1@ 2@ 3@ rotation 0.0 -90.0 0.0 flag 1


Думаю логично в место -90.0, поставить 0.0. Ещё хорошо было бы узнать флаг уникальности у машин, у DK22Pac. И чтоб каждый раз не ставить одной и той же машину партикл, менять флаг уникальности, а потом просто проверять его у машины. Ну как DK22Pac его напишет, я тебе его вставлю в скрипт


Сообщение отредактировал walk - Пятница, 08.07.2011, 09:56
 
ILYALIONДата: Пятница, 08.07.2011, 15:49 | Сообщение # 232
Группа: Проверенные
Сообщений: 325
Статус: Offline
Спасибо, а можно ли как-то убрать стандартный выхлоп из выхлопной трубы, а то он идёт горизонтально
 
walkДата: Пятница, 08.07.2011, 16:02 | Сообщение # 233
Группа: Проверенные
Сообщений: 96
Статус: Offline
ILYALION, вот по поводу этого не знаю, находится это скорей всего, в структуре машин, но это всё надо искать
 
DK22PacДата: Суббота, 09.07.2011, 00:04 | Сообщение # 234
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
walk, код проверить не могу, так как захожу и пишу с телефона. Я сейчас в отпуске.
Пробуй.
Code
{CLEO .cs}
0000:
while true
     for 0@ = 0xA91268 to 0xA912F8 step 0x18
         0085: 1@ = 0@
         inc(1@ , 4)
         for 5@ = 0 to 2
             inc(1@, 4)
             0A8D: 2@(5@,3f) = read_memory 1@ size 4 virtual_protect 0
         end
         064B: 5@ = create_particle "smoke_flare" at 2@ 3@ 4@ type 1
         064C: make_particle 5@ visible_and_remove_references
     end
     003D:
end

Где адресса взял?
Насчёт уникальности - можно записывать значение в структуру, или создавать свой буффер, где будет храниться адресса струкур и флаги.
 
walkДата: Суббота, 09.07.2011, 06:14 | Сообщение # 235
Группа: Проверенные
Сообщений: 96
Статус: Offline
DK22Pac, адреса сам искал, по примеру скрипта, который приводил выше

Добавлено (09.07.2011, 06:14)
---------------------------------------------

Code
for 0@ = 9@ {0x945D5E} to 10@ {0x94A13C} step 0x34  
         05E0: 1@ = read_memory 0@ size 1 virtual_protect 0  
       if or
           0039: 1@ == 8 //money
           //0039: 1@ == 15 //scm
           0039: 1@ == 4 //ped pickups  
       then




DK22Pac, почему он таким способом получает, способ создания пикапа? Ведь первой в структуре идёт позиция пикапа.

 
DK22PacДата: Суббота, 09.07.2011, 11:10 | Сообщение # 236
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
walk, он начинает перебор структур не со старта массива, а с того места, где находится значение pickupType в первой структуре. Получается так:
for 0@ = <адресс первой структуры + оффсет к pickupType> to <адресс последней структуры + оффсет к pickupType> step <размер одной структуры>

Добавлено (09.07.2011, 11:10)
---------------------------------------------
walk,
http://bitfry.narod.ru/
http://wasm.ru/article.php?article=1022001

 
[ED]AndrДата: Четверг, 14.07.2011, 10:55 | Сообщение # 237
Группа: Пользователи
Сообщений: 12
Статус: Offline
Я недавно начал работать с адресами памяти, а на гтамоддинг их маловато, объясните как их искать с помощью IDA.Я открывал там .exe у гта, но ничего похожего, что описывалось тут на первых страницах, не находил.
 
Den_spbДата: Пятница, 15.07.2011, 01:28 | Сообщение # 238
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
[ED]Andr, в IDA надо открывать idb-базу gta_sa.exe от listener (брать на public.sannybuilder.com, желательно более свежую версию - смотри по дате)
 
DK22PacДата: Суббота, 16.07.2011, 23:27 | Сообщение # 239
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Я расскажу на простом примере. Однажды мне понадобилось найти константу - дистанцию от земли к пикапу денег. Мне надо было изменить эту константу, так, чтобы пикап был расположен прямо над землёй.
Итак, после запуска IDA я открыл базу адрессов gta_sa.exe от listener'а.
Слева находится список функций, справа - сам код .exe. При двойном щелчке на какой-то функции в колонке слева, её код откроется в окошке справа. Для сортировки функци "по алфавиу" достаточно нажать на "Function Name".
Нам надо найти какую-то процедуру, которая связана с созданием пикапа. Ведь именно в этот момент определяется, где он будет располагаться.
Воспользуемся поиском... Ставим курсор на самую первую функцию в списке и нажимаем Alt+T. вводим что-то из вариантов: pickup, create. Я ввёл pickup. Чтобы выполнить функцию "искать далее" по этому списку функций, надо нажать Ctrl+T. Вот какую функцию я нашёл:
Code
_createDeadPedMoneyPickup

То, что надо! Два щелчка по ней - и смотрим в окошко справа.
И теперь всё как на ладони...
Теперь мы можем увидеть тут, как выбираются случайные X и Y координаты в нужном радиусе:
,
как находится нужная Z-координата:
,
Как происходит вызов функции, которая создаёт сам пикап как обьект (субьект игры):

Нас интересует - координата Z для пикапа.
За "определение" Z-координаты отвечает этот участок в коде функции:
Code
024 push    esi
028 push    edi
02C call    CWorld__findGroundZFor3DCoord
02C fadd    ds:flt_858B8C   ; 0.5f

Ведь CWorld__findGroundZFor3DCoord - это процедура, которая находит Z-координату поверхности в точке (X;Y).
Итак, мы видим две команды push - они передают функции два параметра - координаты Y и X.
Далее вызывается процедура (опкод call). А далее идёт команда fadd - она добавляет к значению* число, которое записано по адрессу 0x858B8C. 0.5 - это и есть то значение, "из-за которого" пикап "висит" в воздухе.
Мы можем напрямую изменить это значение:
Code
{$CLEO}
0A8C: write_memory 0x858B8C size 4 value 0.1 virtual_protect 0
0A93:

А можем подменить адресс, значение которого "читает" опкод fadd. Для удобства надо перейти в режим "Text view". Клацаем ПКМ по окну справа и выбираем "Text view". Теперь мы видим глобальные адресса каждой из команд:
Code
.text:00458A17 02C                 fadd    ds:flt_858B8C   ; 0.5f

Итак, нужная нам команда находится по адрессу 0x458A17.
Сама команда
Code
fadd    ds:flt_858B8C

занимает в памяти 6 байт. Мы можем в этом так убедиться: ставим курсор перед fadd, и переходим на вкладку "Hex-view". Мы увидим выделенные 6 байт. Первые 2 байта - это опкод, остальные 4 - адресс. Значит, надо добавить к (0x458A17) (2) и по полученному адрессу записать новое значение (новый адресс, который "читает" опкод fadd).
Code
0x458A17 + 2 = 0x458A19

Code
{$CLEO}
0@ = 0.1
0AC7: 1@ = var 0@ offset // получаем адресс переменной 0@ в памяти
0A8C: write_memory 0x458A19 size 4 value 1@ virtual_protect 0
0A93:

Фуух, надеюсь это кому-то пригодится biggrin

Добавлено (16.07.2011, 23:27)
---------------------------------------------
* есть отдельный стек, для хранения float-чисел - FPU Stack. Процедура CWorld__findGroundZFor3DCoord возвращает значение на вершину этого стека. Команда fadd добавляет значение к значению на вершине FPU Stack'а.


Сообщение отредактировал DK22Pac - Воскресенье, 17.07.2011, 16:19
 
Den_spbДата: Воскресенье, 17.07.2011, 15:12 | Сообщение # 240
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Хороший пример. Добавлю, что список функций отображается на вкладке Functions, а код exe - на вкладке IDA View-A. P.S.В функцию вычисления высоты земли вроде передаются 3 параметра: X, Y, Z
P.P.S.В последнем коде наверное должно быть "value 1@"
 
Форум » Игры серии ГТА » Работа с памятью, exe » Работа с памятью игры, exe
Поиск: