Автор Тема: Вопросы по игровой памяти  (Прочитано 1896 раз)

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
В этой теме задаем мелкие вопросы по памяти в Vice City, не подходящие для отдельной темы.

Я начну: Как узнать список адресов, не используемых игрой?(в которые можно записывать значения без проблем в будущем)
« Последнее редактирование: Март 31, 2015, 03:13:55 pm от Shaggy »

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Вопросы по игровой памяти
« Ответ #1 : Март 31, 2015, 04:21:33 pm »
Попробуй иначе, например создавать скрипт-буфер для дополнительных ячеек структуры для педов, или машин, или объектов.
Скажем один скрипт ведет поиск и создание ячейки, а другой удаление, а уже в самих скриптах где тебе понадобятся ячейки будешь только ссылаться на буфер, я так стал делать...
I know everything and nothing...

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 512
  • Репутация: +33/-0
    • Просмотр профиля
Re: Вопросы по игровой памяти
« Ответ #2 : Март 31, 2015, 04:36:03 pm »
Shaggy, зачем? Не нужно трогать, память игры, выделяй свою и используй с инжектами.

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Вопросы по игровой памяти
« Ответ #3 : Март 31, 2015, 07:29:36 pm »
Скажем один скрипт ведет поиск и создание ячейки, а другой удаление
Как это сделать, я не понял?

Sektor: Иногда это необходимо, например - в скриптах.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Вопросы по игровой памяти
« Ответ #4 : Март 31, 2015, 10:13:19 pm »
ну вот пример моих скриптов:

первый скрипт создания ячейки:

{$CLEO}
thread 'GACTOR'
05F7: 0@ = label @buferofactors offset // тут резервируем 0@ переменную под указатель на буфер
while true // создаем постоянный цикл
    wait 0
    if
        05EF: 15@ = random_actor_near_point 0.0 0.0 0.0 in_radius 100000.0 find_next 0 pass_deads 1 //IF and SET // начинаем поиск педов
    then
        repeat
            0085: 14@ = 0@ // (int) //используем временную переменную
            12@ = -1
            11@ = 0
            10@ = 0
            while true // создаем цикл для поиска хендла данного актера
                if
                    11@ == 200  // если достигнуто 200 ячеек то выход (в буфере как раз 200 строк)
                then
                    break
                end
                05E0: 13@ = read_memory 14@ size 4 virtual_protect 0 // читаем текущую ячейку, где хранится хендл
                if
                    003B:   13@ == 15@  // (int) // если хендл найден то не записываем по второму разу данный хендл
                then
                    12@ = -1 // для этого ставим доп переменной = -1
                    break // и сразу выход из поиска данного хендла
                else
                    if and
                        13@ == -1 //если мы находим попутно что строка содержит = -1 то запоминаем
                        10@ == 0 //  через доп переменную 10@ которую используем как флаг
                    then
                        0085: 12@ = 11@ // (int) // сохраняем первую попавшуюся строку содерж = -1 хендл в доп переменной 12@
                        10@ = 1
                    end
                end
                14@ += 8 // так в одной ячейке два поля хендл и еще одна по 4 байта каждая получает как раз = 8, скачем через 8 байт
                11@ += 1 //счетчик строчек увеличиваем
            end
            if
                12@ <> -1 // по результату пред поиска смотрим нашли мы строчку или нет
            then
                0085: 14@ = 0@ // (int)
                12@ *= 8
                005A: 14@ += 12@  // (int)
                05DF: write_memory 14@ size 4 value 15@ virtual_protect 0 // если да то заносим данный хендл
            end
        until 85EF: 15@ = random_actor_near_point 0.0 0.0 0.0 in_radius 100000.0 find_next 1 pass_deads 1 //IF and SET //продолжаем поиск
    end
end

:buferofactors //буфер актеров
hex
    FF FF FF FF  00 00 00 00 // первые 4 байта идут под хендл по умолчанию это = -1
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
    FF FF FF FF  00 00 00 00
end

Ну и скрипт удаления:

{$CLEO}
thread 'RACTOR'
while true
    wait 0
    05ED: 0@ = thread 'GACTOR' pointer // получаем указатель первого скрипта
    if
        0@ <> 0 // проверяем что он существует
    then
        0@ += 48 // переходим к смещению 0@ локальной переменной первого скрипта
        05E0: 0@ = read_memory 0@ size 4 virtual_protect 0 // считываем данное значение
        break // выходим из цикла
    end
end
while true // определяем вечный цикл
    wait 0
    while 13@ < 200 // определяем второй цикл поиска
        05E0: 1@ = read_memory 0@ size 4 virtual_protect 0 // читаем данную строчку
        if
            1@ == -1 // если хендл = -1 пропускаем
        then
            13@ += 1
            0@ += 8
            continue
        end
        05E6: 15@ = actor 1@ struct // иначе находим указатель структуры актера
        if
            15@ == 0 // если актер не существует
        then
            0085: 14@ = 0@ // (int) //используем времен пер 14@
            05DF: write_memory 14@ size 1 value -1 virtual_protect 0 // здесь и далее пишем -1 почему так? это глюк Клео нельзя сразу записать -1 в 4 байта (недоделка Клео)
            14@ += 1
            05DF: write_memory 14@ size 1 value -1 virtual_protect 0
            14@ += 1
            05DF: write_memory 14@ size 1 value -1 virtual_protect 0
            14@ += 1
            05DF: write_memory 14@ size 1 value -1 virtual_protect 0
            14@ += 1
            05DF: write_memory 14@ size 4 value 0 virtual_protect 0 // во вторые 4 байта пишем 0
            13@ += 1
            0@ += 8
        else
            13@ += 1
            0@ += 8
        end
    end
    05ED: 0@ = thread 'GACTOR' pointer // так как переменных не хватает заново находим 0@ локальную переменную первого скрипта
    0@ += 48
    05E0: 0@ = read_memory 0@ size 4 virtual_protect 0
    13@ = 0
end //и начинаем поиск погибших актеров еще раз

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

Тут есть важный момент, если ты создаешь актера и тебе сразу же надо использовать ячейку, то надо просто опять найти указатель первого скрипта, найти 0@ пер., потом буфер, и найти в цикле не занятый хендл то есть = -1 и все, записать туда, т.е как бы опередить первый скрипт, при этом ничего не будет нарушено, как я уже объяснял ранее благодаря смыслу опкода wait.
I know everything and nothing...

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Вопросы по игровой памяти
« Ответ #5 : Март 31, 2015, 10:27:48 pm »
Отлично, спасибо, как я понял - это пригодится для работы с актерами, тачками и объектами(вешать на них определенные фишки), а просто какой-нибудь список статичных неиспользуемых адресов есть возможность узнать?

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Вопросы по игровой памяти
« Ответ #6 : Апрель 01, 2015, 07:15:40 am »
Я как-то пытался пропихнуть подобную тему http://forum.gtabuilder.ru/index.php?topic=125.0, но меня всячески отговорили. Я видел моды, сделанные с использованием "условно свободных" адресов, например мод VC:TRAFFIC, расширяющий транспортный поток, там кое-что писалось в "пустые места", но конечно пустых мест нет. Опять же предлагаю поставить вопрос по-другому: писать в адреса, называемые "свободными" плохо и неправильно, и лучше выделять память через свои переменные или резервируя нужный объем, но если тема возникла, пусть она и "неграмотная", но как простейший вариант хранения данных, давайте попробуем предложить безболезненные варианты, не причинив вред игре, наверняка есть много мусора.

1. Например список названий аудиофайлов, коих больше 1200 штук, встречается по 6 раз, из которых 5 просто висят мертвым грузом, судя по отсутствию ссылок в коде (хотя возможно это уже после NO-CD).
2. Есть например бессмысленные сообщения, которые пользователь все равно никогда не увидит, а просто получит вылет игры, типа 0x683000 "Can't find the fucking animation", святое дело заменить мат на свое значение.
3. Можно к примеру забрать себе одну из повторяющихся по значению переменных, например 0x69D1C8 = 2.0 встречается 1 раз и ссылка на нее только тут 0x5C6FEB, пишем в 0x5C6FEB адрес любой другой постоянной 2.0, например 0x69D3B4, вот и освободился 0x69D1C8.
4. Не уверен, но предполагаю, что когда мы отключаем вызов ненужной нам функции, например уродские световые кубики на фарах 0x57479D, то тело этой функции 0x5719B0 уже не нужно и можно хранить в этой области, что вздумается. Раз вызова сюда не будет, то и ошибок возникнуть не должно, ну или как-то аккуратно там сделать свои вставки, не меняя логики кода.

Все это, если не задаваться вопросом "А зачем это делать, если можно..."

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Вопросы по игровой памяти
« Ответ #7 : Апрель 01, 2015, 03:50:19 pm »
xanser, спасибо, буду искать в этом направлении. ;)
...
О необходимости:
Конечно, можно всё написать в виде asi, грамотно, оптимизированно и т.д. и т.п., но мы же все понимаем, что сейчас(к сожалению, или к счастью) доминируют SCM и CLEO скриптинг, и в вопросах работы с памятью нужны именно "пустые" адреса, а не корячиться с кучей(или одной громоздкой) ASI.
Пример(как у xanser-a в той теме) - система топлива для всех авто. Понятно, что это всё можно грамотно запилить в виде плагина и т.д., но тут возникает потребность считать значение топлива у какого-то авто в одной из миссий... Повторюсь, это просто пример, и может я что-то не учел(не уверен конкретно насчет этого пример), но тут как раз нужно изпользование "свободной" памяти в структуре авто, чтобы с легкостью считать значение в SCM.
Тут как-то рассуждали о возможности создания своего ASI с полным набором миссий и функций(т.е. все миссии и потоки-"скрипты" в ASI, вместо SCM), но это такооой гемор, что никем применяться не будет, ибо зачем изобретать велосипед? Поэтому возможность работы с неиспользуемыми адресами памяти крайне необходима. Конечно, пока нет альтернативного скриптового языка для гта.
« Последнее редактирование: Апрель 01, 2015, 03:52:34 pm от Shaggy »

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Вопросы по игровой памяти
« Ответ #8 : Апрель 01, 2015, 04:09:44 pm »
Вобщем смысл темы найти все способы, но так не делать  ;D

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Вопросы по игровой памяти
« Ответ #9 : Август 09, 2015, 03:20:25 pm »
Скопирую свой псто с sannybuilder:

Существует ли т.н. лимит "видеопамяти" по аналогии с лимитом "Streaming memory" в Vice City?
Дело в том, что работаю над несколькими глобалками(двумя своими и двум чужим помогаю), и во всех так или иначе начала появляться проблема "перегруженности сцены": когда рендерится слишком много высокополигональных/HQ-текстурных объектов, часть текстур начинает пропадать(становятся белыми), либо начинают глючить текстуры с альфой.
Никакие limit adjuster-ы не помогают, даже если повышать все возможные и не возможные лимиты. Также дело не в компьютерах, т.к. проблема одинакого проявляется и на мощных, и на слабых компах, с видюхами разных производителей и т.д.
Отсюда и появилось подозрение на "внутренний" лимит видеопамяти.

Если кто знает адресок - он буквально спасет 4 проекта  smile
P.S. Вопрос именно по Vice City, т.к. такие проблемы проявляются только в нем.

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Вопросы по игровой памяти
« Ответ #10 : Ноябрь 06, 2016, 03:41:16 pm »
СРОЧНО!

Поделитесь плиз адресами памяти, выдающие 100% рандомные числа ::)
Нужен именно адрес памяти, а не способ на C++(я его знаю, но здесь это не подойдет).
Дело в том, что при старте мейна, существующие опкоды, выдающие "рандомные" числа, на самом деле выдают одни и те же числа в заданный момент времени. Т.е. каждый раз при загрузке выдается одно и то же число. "Нормально" эти опкоды работают лишь если наиграть хоть какое-то время, но мне нужно именно в один и тот же момент(при старте мейна)!

Сначала я думал, что такое нельзя сделать, но путем тысяч проверок я выяснил, что, например, ИИ заспавненных актеров ведет себя каждый раз рандомно. Значит, такое возможно в игре.
Прошу, поделитесь кто чем сможет, и, быть может, объединив все способы, получится сделать 100% рандом.
« Последнее редактирование: Ноябрь 06, 2016, 03:49:34 pm от Shagg_E »

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Вопросы по игровой памяти
« Ответ #11 : Ноябрь 06, 2016, 09:35:44 pm »
Вроде нашел способ: откопал какой-то CTimer::GetCurrentTimeInCycles (0x4D0DF0), он возвращает то сотни, то тысячи, может еще чего возвращает, но мне хватает и добыча единицы:

0AB1: call_scm_func @COMPLETELY_RANDOM_NATURAL_NUMBER 1 5 $WAVBARMUSIC // 5 - means "random number 1 to 5"

...

:COMPLETELY_RANDOM_NATURAL_NUMBER
0AA7: call_function 0x4D0DF0 num_params 0 pop 0 1@
0093: 0@ = integer 0@ to_float
0085: 2@ = 1@
0016: 2@ /= 10
0012: 2@ *= 10
0093: 1@ = integer 1@ to_float
0093: 2@ = integer 2@ to_float
0063: 1@ -= 2@
0007: 2@ = 10.0
0073: 2@ /= 0@
0073: 1@ /= 2@
0092: 1@ = float 1@ to_integer
000A: 1@ += 1
05F6: ret 1 1@

Правда - не уверен, что этот способ будет работать всегда на всех компах и сборках гта и в любой момент, поскольку не знаю смысл функции CTimer::GetCurrentTimeInCycles. Но пока вроде всё работает нормально...

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 494
  • Репутация: +42/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Вопросы по игровой памяти
« Ответ #12 : Ноябрь 07, 2016, 04:10:43 am »
Может подойдет rand();
Код: C++
  1. auto    rand = (int (__cdecl *)()) 0x6499F0;

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Вопросы по игровой памяти
« Ответ #13 : Декабрь 23, 2016, 07:46:55 pm »
Как узнать что пед проигрывает какую-либо анимацию?