Перейти к содержанию

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Записи блога, опубликованные MasterGH

  1. MasterGH
    Есть инструкции, которые добавляют мусора больше чем другие.
     
    Показываем объем памяти мусора
    print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами
     
    Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени
    Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB 1.49 Lua memory usage 1.8 MiB Lua memory usage 2.3 MiB Lua memory usage 2.3 MiB 1.47 Lua memory usage 2.3 MiB Lua memory usage 2.8 MiB Lua memory usage 2.8 MiB 1.49  
  2. MasterGH
    Обычно, дается 4 аппаратных брейкпоинта на адреса памяти. Их можно включать одновременно  и найти инструкции, которые в данный момент срабатывают. Так можно определить тип данных у адресов и найти инструкции. По инструкциям найти смещения внутри дизассемблированной инструкции. По смещениям визуально определить структуры в структурах. Расструтуризовать структуру в dessect data и найти много интересных параметров для читов. Вручную с 4мя бряками делать очень хлопотно. 
     
    Начинается все с установки огромного бряка на структуру из туториала CE.

     
    Логи
     
    По логам видим, что какие-то инструкции обращаются и скорее всего обращаются к нашей той самой структуре. Проверим так ли это и заодно увидим к каким другим структурам идет обращение
     

     
    Видим, что одна из инструкций действительно обращается к нашей структуре и далеко за пределам диапазона 4 брейкпоинтов. Т.е. это действительно огромный такой брейкпоинт на всю структуру.
    Также видим, что инструкция отработала по другим 4 структурам и это могли быть враги  и друзья игрока.
    Также видим, что тип данных автоматически неверно определился в окна DesectData и мы можем его скорективать - это будет 1 байт

     
    Вот так можно проводить ручную расструктуризацию. Кропотливо по байтикам на весь размер структуры выставлять коментарий и правильный тип данных - не все типы данных могут подцепиться и при экспериментах с изменением значений могут быть глюки в игре или даже вылеты. После того как вся структура изучена, можно сделать множество читов, которых нет ни в одном трейнере, если их еще не сделали.
  3. MasterGH
    Вполне читерская программа Sikulix
     
    Помощник для нахождения отличий
     
    Исходник:
     
    Картинки для тренировки
     
    Игра
    Sikulix
    Документация
    Туториалы
     
    Sikulix умеет:
    ждать появления или исчезновения элемента, просто ждать, периодически просматривать область в background (например игрового чата); читать (и писать) текст в(/из) поля ввода, "нажимать на клавиатуру", подсвечивать области, кликать по элементам, удерживать и перетаскивать; перемещаться по окнам по названию процессов; сохранять скриншоты в том числе определенные области; показывать много разных диалогов: ввода, тултипов, сообщений; сравнивать изображения и находить отличные области (пример выше); поиск элементов по маске; поиск групп элементов и перебор их; создание гайдов или руководств  
    Из наиболее интересных применений:
    1) в играх где необходим поиск графических элементов с действиями (кликеры, поиск отличий или поиск/подсчет элементов, маджонги и другие);
    2) нажать на найденных элементы(кнопки, чек-боксы);
    3) найти текстовое значение, перевести в число, посчитать;
    4) ожидает выхода человека из скайпа (или что-то вроде мониторинга чатов);
     
    Ну и так далее...
  4. MasterGH
    Появилась такая опция асинхронного выполнения скриптов

     
    Если эту опцию поставить на скрипты, то появляются вот такие часики

     
    АА-шные скрипты могут искать в этот момент сигнатуру.
    Lua скрипты потестить было интересно, узнать действительно ли асинхронно выполняется. Например, один скрипт выполняет счет, второй выполняет счет. По выполнении выводится результат.
     
     
    Во время выполнения включаем первую галку. Тут CE подвисает. Затем успеваем нажать на вторую галку. Видим как две иконки часов работают.

     
    После выполнения

     
    Если продублировать 4 скрипта, то видим, что нельзя запустить асинхронно более двух скриптов

     
    Возможно, я Lua код где-то не правильно написал. Вот такой вариант еще делал
     
    Asynchronous testing.CT
  5. MasterGH
    Довольно интересная функция, мне понравилась. 
    showSelectionList() позволяет просмотреть список класса Strings и выбрать свойство через список.
     
    Как пример посмотрим список свойств главной формы и выберем любое свойство
    local mainForm = getMainForm() local listProperties = getPropertyList(mainForm) local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listProperties, allowCustomInput) print ('Index: '..id..", Name: "..name) --> Примеры выполнения: --> Index: 55, Name: ShowHint --> Index: 10, Name: Top После исполнения Lua скрипта вот такой диалог появится. Можно искать свойство через ввод текста

     
     
    Список строк (Stringlist Class) используют:
    createStringlist(): Strings  - постой список
    getAutoAttachList(): Strings  - список имен процессов для автоподключения
    getPropertyList(class) : Strings - список свойств
    getCommonModuleList(): Strings  - список пропускаемых при сканировании модулей
    getProcesslist(Strings) - список процессов
    getWindowlist(Strings) - список окон
    getThreadlist(Strings) - список потоков
    Database.Params: Strings  - свойство  базы данных SQL
    ListItem.SubItems: Strings - свойство подстрок в визуальном компоненте списка
    ComboBox.Items: Strings - комбобокс
    Memo.Lines: Strings  - мемо компонент
    RadioGroup.Items: Strings  - компонент RadioGroup
    ListBox.Items: Strings - компонент ListBox
    FileDialog.Files: Strings  -  выбранные файлы в диалоге
  6. MasterGH
    Функции:
    1) Три типа данных: float, double, integer
    2)  10 слотов сохранений
    3) Управление горячими клавишами. ctrl+X - где X от 0 до 9 сохраняет позицию, shift + X загружает ранее сохраненную позицию
    4) Озвучивание загрузки или сохранения

    Как пользоваться:
    1. Подключаемся к процессу игры любым способом (хоть вручную, хоть на Lua, чем угодно)
    2. В CE вставляем Lua скрипт
     
    3. Меняем адрес teleport_address = "03D2C6DC"   на тот который нужно.
    Здесь может быть указатель например  -"[[address+XX]+XX]" или через registersymbol() в АА скриптах.
    Не тестировалось если адрес еще невалидный, т.е. не существует в памяти. По идее слоты проинициализируются с нулевыми координатами по умолчанию. Поэтому лучше Lua скрипт запускать в момент существования адреса. Проверка на существование адреса - getAddressSafe(string, local OPTIONAL, shallow OPTIONAL): returns the address of a symbol, or nil if not found. Similar to getAddress when errorOnLookup is false, but returns nil instead. Проверку можно делать по таймеру. Запуск скрипта это последняя строка 
     
    4.Меняем тип данных type_data = 'INTEGER'            -- FLOAT, DOUBLE, INTEGER

    Данный скрипт предоставляется как есть. Сделан для всех пользователей форума и можно использовать его в любых целях: в образовательных, в коммерческих. Если что-то не работает, то придется править вам самим. У меня к сожалению нет времени на оказание помощи. Справочник по луа функциям в файле"celua.txt"
  7. MasterGH
    Игра с рандомом. Есть счет.
    Запускается через таблицу в аттаче.
     
    Здесь мог быть AI на Lua, возвращающий номер клетки от 1 до 9.
    function InputAI() -- рандом return math.random (1, 9) end Извиняюсь, лучше рандома пока не могу предложить.
     
     
    Крестики и нолики.CT
  8. MasterGH
    Я решил рассмотреть три новые функции:
     
    Пользовательские типы данных в hex-окне Фильтр на окне определения адресов Поиск данных в окне Tracer  
    1. Пользовательские тип данных в hex-окне
     
    Пример как сделать:
     
    Фильтр на окне определения адресов
     
     
    3. Поиск данных в окне Tracer

     
    Обычный поиск, как на прошлых скринах
     
    Примеры
     
    Ну и более интересная версия перебора и одновременного выделения записей.
     Здесь нужно открыть окно "Трейсера" и рядом в Lua окне писать свои условия в функции "Compare()", "PrintData()", Selected()
     

     
    Документация
     
    Для вывода referencedBytes из трейслога можно использовать byteTableToDword(referencedBytes) (смотрим документации выше) получая из TfrmTracer.Entry[index].referencedBytes или в строке поиска у Трейслога вбить 
    byteTableToDword(referencedBytes) > 0 and print(string.format("0x%08X - 0x%08X", RIP, byteTableToDword(referencedBytes))) == 1  
    Практическое применение
     
    Больше всего могут интересовать реальные практические примеры. Если будет время, желание может быть сделаю, а так просто общий обзор.
  9. MasterGH
    Конечно не секрет, что типы данных не правильно определяются. Вот пример для 50-ти адресов
     
    Слева как определил данные CE. Справа как определил их я по логу ниже

    Понравились данные с размером в 1 байт, привлекают в нимание. Как только я переключил на ноль или 1, то персонаж перестал двигаться и не реагировал на движение.
     
    Лог инструкций
     
    Пытаюсь по логам определить алгоритм для Lua, чтобы скрипт сам ставил тип и смещение. Конечно есть сюрпризы, когда регистр перезаписывает сам себя и еще куча опкодов. Чтобы получить такой лог мож попробовать этот скрипт. Он черновой
     
     
  10. MasterGH
    Пример, который показывает как снять стек вызовов функций
    function A0() -- Здесь можно удалить ":gsub('\n','\r\n')", но тогда в консоли текст будет в одну строку print(debug.traceback():gsub('\n','\r\n')) end function A1() A0() end function A2() A1() end function A3() for i=1,3 do A2() end end A3()  
    Можно поставить пошаговую отладку в консоли Lua (как на скриншоте) и  пройти по шагам
  11. MasterGH
    Почти месяц ковыряюсь со сборкой апк, которая не запускается на инструментальном тестировании в Firebase
     

    Рис.1 Сборка апк на инструментальное тестирование TestLab  от Firebase. Окно AirTest IDE
     
    Две апк-шки создается.
    1. В Unity, с иvпортом Poco SDK 
    2. В Плагине как на рисунке
     
    Затем обе апк-шки отправляются на инструметальное тестирование в Firebase 

    Запускаю тест. Шесть секунд видео со стандартной заставкой и конец теста.
     
    На данный момент тестирование проводим через GameLoop тест, а не через инструментальный тест от AirTest IDE. Продолжаю искать решение, пока не понятно.
    Также в AirTest IDE еще не закончили свою документацию и в Firebase ничего не сказано про этот инструмент. Однако, известно что этот замечательный инструмент тестирования будет участвовать в FireBase TestLab. В 2018 году китайские разработчики официально договорились с гуглом об участии их продукта в тестировании на удаленных устройствах сервиса TestLab
  12. MasterGH
    1. Персонаж падает с большой высоты и разбивается
     
    Ищем адрес скорости прыжка прыгая под speedhack. Находим эту скорость. Ставим бряк на доступ. Прыгаем.
    Инструкции на чтение добавляем в список адресов и там начинаем нопить
    - Либо по одной
    - Либо рискнем по половине от половины
    - Либо рискнем и все сразу занопим
     
    Если повезет, а должно повезти, то инструкция не прочитает то значение скорости, которое уложило бы персонажа на землю и можно будет прыгать на огромную высоту.
     
    2. Как делать супер прыжок
    Ищем под speedhack скорость float (назовем её velocityZ, Z - вертикальная ось) по вертикальной оси прыгая персонажем. Когда прыгаем. то скорость в один момент увеличивается. Затем, скорость постоянно уменьшается от положительного до отрицательного значения.  Когда на земле, то скорость быстро записывается и равна нулю.
    Дальше смотрим что это рабочий адрес. Прыгаем и замораживаем значение. Если адрес рабочий, то персонаж зависает в воздухе или движется.
    Дальше ставим бряк на запись на этот адрес и снимаем speedhack
    Прыгнули и увидели инструкции. Например одна из них будет
    movss [rdi+0000010C],xmm0 и работает каждый раз при прыжке по одному разу за прыжок (прыгнули — сработала, прыгнули — сработала).
    Вот в неё и легко сделать инъекцию с рядом стоящими адресами с умножением на scale величину. Все и персонаж будет с суперпрыжком. Чтобы он не разбивался при прыжке смотрим пункт1
     
    Еще один вариант — не писать инъекцию кода, а искать адрес силы прыжка в структуре.
    Это можно сделать меняя значения в структуре где-то рядом с [rdi+0000010C] и смотреть что происходит в игре. Можно найти, а можно и не найти, и возможно этот процесс будет долгий.
    Еще можно в пошаговой отладке пройтись, посмотреть стек, протресить и попробовать найти адрес в структуре (при чем структура не обязательно будет с адресом в rdi) без рандомного поиска в структуре. Но у последнего есть свои плюсы, можно найти разные параметры движения игрока и увидеть изменения в игре.
     
    3. Менять данные в структурах или менять код?
     
    В примере выше пришлось создать два новых поля
    scaleXY: dd (float)4 scaleZ: dd (float)4 И умножать их на скорости X,Y,Z персонажа.
     
    С одной стороны больше кода писать и добавлять новые поля, а с другой стороны выделить время и найти подход к поиску значения стартовой скорости в структуре. Можно в структуре ничего не искать, а написать скрипт выше и это может быть быстрее чем искать в структуре. С другой стороны если в структуре рандомно ставить параметры в течении времени X на 4К байт, то можно найти: адрес скорости, адрес гравитации, адрес чувствительности и много чего еще.
     
    И еще одно ограничение. Расструктуризация не всегда правильная. Упорно вместо float может видеть 4 байта.  Это в лучшем случае, в худшем разные смешения смержены и выводятся разные типы данных.
    В общем исследование игровой структуры эта тема интересная. Можно сказать это поиск свойств, по которым будет меняется поведения персонажа в игре. Структуру желательно обследовать какой оффест, что делает и какого он типа (через брейкпоинт). Это всего 4К байт проанализировать. Каждое смещение подписать и сохранить. Сделав это вы скажите себе я исследовал всю структуру и знаю, что делает смещение.
     
    Lua может помочь автоматизировать анализ структур и пока я думаю об этом. Данные структур могут сильно повлиять на поведение персонажа,  на прохождение потоком отладочных инструкций игры по разным условиям — выполнять и не выполнять ответвления кода с разными условиям. В общем есть над чем подумать.
     
    Всегда было приоритетным менять код, но теперь стал задумываться о том чтобы больше смотреть в сторону правки данных структур. Фактически код мы не правим, а меняем данные и код работает уже с другими данными.
  13. MasterGH
    Особенности
    1) переход на следующий адрес по инструкциям ветвления вычисляется Lua кодом по ret, jmp, jmp condition до исполнения кода
    2) определение опкодов ветвления по readmem без дизассемблериования
    3) по тестам последний брейкпоинт снимается на ближайшем цикле
     
    Пример лога до близжайшего цикла, когда поднимается из рутины вверх
     
    Код:
     
    Справка
     
    Если трейсить трейслогом 1000 инструкций поверх call, то видим многократное повторение пути внутри цикла между 00437A34 и 0044DFAF.
     
    С помощью скрипта можно выйти на цикл не используя трейслог
    Можно использоваться функции определения куда прыгнет поток, до его выполнения.
    Можно оперировать таблицей адресов с брейкпоинтами в пошаговой отладке.
  14. MasterGH
    Плагин ведет историю поиска, отсева, отмены. Логи выглядят следующим образом
    Для чего может применятся
    На шаге отсева посмотреть в логах, какое значение искали до этого и какой способ поиска использовали. При неудачных поисках мы просматриваем как и что мы сканировали раньше. Если вообще ничего не получается при сканировании, то логами можно обмениваться. Горячие клавиши, которые настраиваются из окна настроек CE работают и в логах.  
    Установка: скопировать GHL_log.lua в директорию "/autorun" Lua скрипт: 
    В комментариях можно написать про ошибки или про идеи улучшения плагина.
  15. MasterGH
    Обновление плагина
     
    Установка с репозитория: ссылка
     

     
    Кратко
    1. Добавил сохранение/загрузку параметров. Хранение в текстовом файле в папке autoruns
    2. Добавил настройки графического интерфейса (слайдеры, пункт меню)
    Подбронее
     
    Слайдеров много, сам путаюсь в них, какие за что отвечают.
    С цветами экспериментировал не понравилось, пока оставляю градацию "черный-белый".
    Для тех кто видит в первые этот плагин.
     
    Плагин планируется развивать дальше, сейчас это черновой вариант
  16. MasterGH
    За нейронными сетями и быстрыми вычислениями (например на тензорных ядрах видеокарт) 
     
    скорее всего,  огромное будущее и огромный спрос. Стартануть в эту тему можно,  изучив статью с хабра о принципах AlphaGo Zero и вот эту.  Основные моменты это рекуррентные сети, которые ищут в глубь и сверточные сети, которые чем-то похоже на хеш-сумму (на тензорных ядрах они-то и быстро считаются). 
     
    На данный момент по своей работе я активно развиваюсь в нескольких направлениях: в многопоточном программировании на CPU/GPU,  вычислительных шейдерах, сокетах. Если писать программы на одном CPU ядре, то все чаще этого не хватает по мощности как на ПК так и тем более на мобильных устройствах. Такое ощущение, что без многопоточного программирования скоро нельзя будет никуда устроиться работать. Сейчас  тенденция много ядер на CPU и их использовать. А еще лучше и быстрее что-то "тяжелое" отправить вычислять на GPU. Это не говоря по обработке графических данных. С ними очень эффективно работают программы на GPU. А чтобы системы соединялись между собой на расстояниях надо хорошо знать сокеты и многопоточное программирование. Основная фишка в многопоточности это спланировать множество задач из одной точки программы и в другой точке ждать, когда они все одновременно выполнятся. Некоторые, задачи при этом должны синхронизироваться только с основным потоком. Когда все задачи выполняться на разных ядрах CPU, то итоговый результат на каком-то одном ядре уже сделает все что требуется. Бонусом к ускорению на CPU ядрах служат специальные ассемблерные инструкции, которые например, позволяют обрабатывать больше данных за меньшее количество тактов.
     
    Интересующимся ссылки в основном по Unity игровом движке
     
  17. MasterGH
    Прошлая точка входа запускающая активирующий скрипт не хотела работать, если запустить гигантский трейнер (сгенеренный на CE), а потом игру.
     
    Для работы трейнера точка входа теперь  задается вот таким образом после генерации кода трейнера
     
    Подробнее в исходниках (лучше смотреть позже, после просмотра видео, которое еще готовится)
    gta3.CT
     
    У версии CE 7.2 есть к сожалению баги.
    1. При генерации трейнера нужно вручную править высоту надписей —  надписи срезаются.
    2. Количество нопов, если прописывать как "nop 7"в  АА, вроде,  на  x64 совсем не работает, только на x32 так можно писать нопы.
     
    Что получилось сделать.
    Сгенерить гиганский трейнер. При подключении к процессу автоматически включается главный скрипт. Работает он с часто обращаемой инструкцией. Извлекает поинтер на главного игрока. И далее по значениям меток может выполнять читы. А сопряженные скрипты могут в метки записывать активацию или использовать поинтер на главного персонажа на инструкциях урона для, например, onehit kill. В активирующем скрипте предполагается работа с оффсетами структуры персонажа и регистрируемыми метками. Например, в структуре можно еще штук 10  оффсетов найти через большой бряк на всю структуру. Значит еще +10 новых меток можно завести в активирующем скрипте и +10 АА скриптов, которые по этим меткам что-то включают....
     
    Переносимость на разные игры.
    В принципе "скелет" АА скриптов показан в исходниках и ожидается, что в этом основная фишка.
    По идее меняется: процесс,  оффсеты, сигнатуры, регистры, инструкции, иконка, заголовок. Для иной игры придется модифицировать  CT таблицу и сгенерировать трейнер.
     
    Если сравнивать, например, с созданием трейнеров на C++. Оффсеты — самое главное и поинтер на структуру, и сигнатура, которая поинтер вытащит. И трейнер получится меньший по размеру. Но на CE уже готово много, а результат фактически один и тот же — запись по оффестам с разным user interface или вообще без него.

  18. MasterGH
    pcall() функция может вызывать функцию, которая может вызывать исключение.
    Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения. 
     
    Источник
     
    Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта.
    Или например если  не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.
  19. MasterGH
    Напишем функцию, которая в 3.2 раз быстрее кода ниже
    splitDisassembledString(disassemble(address))  
    Сравнивая скорости получаем оптимизацию в ~3.20 раза быстрее.
     
    Пример использования
    function GetDebugString2(address) local clearString = string.gsub(disassemble(address), '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end local address, bytes, opcode = GetDebugString2(0x0045464A) print(address) print(bytes) print(opcode) gsub очищает пробелы, а выражение '^(.-)%-(.-)%-(.-)$' позволит захватить данные между тире в строке.
     
    Может пригодится, когда трейсим своим Lua кодом.
    Если заинтересовали регулярки: ссылка
  20. MasterGH
    Unity — среда для тренировки искусственного интеллекта. Ниже пример обучения ИИ для игры в гонки.
     
     
    В новой версии Unity много изменений, если кому интересно на официальном сайте много информации по обновлениям
  21. MasterGH
    Пример лога снятия данных с брейкпоинта на структуру 0x1000 за 10 секунд.
    В структуре по смещению 0x2C0  находится здоровье персонажа. На начало этой структуры и был поставлен брейкпоинт .
     
    Ниже будет большой кусок опкодов, который работает со структурой. Можно посмотреть в каком порядке опкоды исполняются и с какими смещениями, насколько далеко они друг от друга. Некоторые смещения рядом с известными смещениями могут заинтересовать.  Одинаковые опкоды в определенном порядке, но по разным RIP тоже могут заинтересовать. Switch-case могут заинтересоваь в виде cmp [x]. число. Инструкции чтения из структуры больше интересуют, т.к. они могут более вероятно, на что-то влиять - из них читается и для чего-то это нужно. 
     
     
    Причем последовательность инструкций идет в порядке вызова, но RIP всегда уникальный (RIP не дублируются). Здесь RIP, т.к. CE 64 разрядный
    Если последовательность к данным структуры примерно сохраняется, то можно обратить внимание на обращение к адресам в структуре рядом со здоровьем по смещению 2с0: до обращения к адресу здоровья, во время и после. Я выделил их стрелками. Эти смещения могут быть связаны со здоровьем

     
    Интересные моменты могут быть с так называемыми switch-case операциями. Можно пытаться их подменить

  22. MasterGH
    Я обратил внимание на следующие поведения записи и чтения
    1. Срабатывают только инструкции чтения до изменения параметра, адрес рабочий
    С адресом работают инструкции на чтение, но если в друг в этом адресе что-то поменять (например в CE), тот тут же выскочат инструкции на запись. Нельзя однозначно утверждать, что адрес является настроечным параметром, но и нельзя утверждать, что это не рабочий адрес. Какая-то инструкция может жестко менять значение, а может быть будет "стараться" изменить значение адреса в меньшую или большую сторону, но адрес при этом будет рабочим.
    2. Срабатывают инструкции записи и чтения, адрес не рабочий
    Запись и чтение влияет только на часть игры, а не на все или вообще не влияет, а перезаписывается постоянно. Например, на визуальное отображение полоски со здоровьем. Получается, что адрес не рабочий, а у него есть как и в первом пункте инструкции и на запись, и на чтение.
    3. Один раз срабатывает инструкция записи и потом всегда на чтение
    Если попался такой адрес в структуре, то он точно является "настроечным" и рабочим адресом. Например, это какой-то коэффициент, который добавляет, умножает, отнимает... в общем что-то меняет. Что с ним не делай, это адрес будут только "читать". Также это может быть булевой параметр "1 "или "0" и по нему может что-то резко меняться в игре.
     
    Окей. Вспоминается окно с кучей инструкций и счетчиков уникальных адресов (не более 8-ми логируется)

    Постреляв патроны  с адресом патронов (в СТАКЛЕРЕ Зов Припяти) сработали инструкции как на запись, так и на чтение.
     
    Первая инструкция читает очень часто, вторая редко. В круглых скобках обозначаются количество проскакивающих адресов.
    Если был выстрел и значение поменялось, то вылезли инструкции записи (все после первых двух).
     
    Код читает в цикле адрес...и если, что поменялось, то запишет в него потом.
    Это похоже на пункт1, который обсуждали выше, но этот адрес патронов не тот, который нужен. С виду рабочий, но патроны потом не стреляют. Патроны это структуры в памяти, а адрес их как  счетчик структур
     
    Как можно делать
     
    Создаем две группы (скрин ниже). Первая текущая и не замороженная. Вторая с двумя замороженными состояниями, когда стоим и ничего не делаем.
    Делаем несколько выстрелов.
    Цвет по +AC нас интересует больше всего, он соответствует логике состояний (стреляю и (не стреляю и не стреляю))

     
    Выделяем и перемещаем адреса этого цвета и морозим в таблице.
     

    Первый праметр это прочность, второй не знаю. Третий счетик патронов. 3 и 5 адреса связанные, если правильно помню, с объектами патронов
    В Сталкере это не даст беск. патрнов, но в других играх может иметь смысл как прием сравнения структур и групп.
     
    p.s. По Сталкеру Зов Припяти, к сожалению, у меня не было времени взломать патроны или может быть я не умею, не знаю. Какие-то патроны в сталкерах ломал, но не помню как.
  23. MasterGH
    Функция loadstring исполняет строку кода как функцию.
    f = loadstring ("print 'hello, world'") f () --> hello, world Есть еще и такая функция как string.dump. Она создает строку из функции
    function f () print "hello, world" end s = string.dump (f) -- Можно строку тут же запустить как код loadstring (s) () --> hello, world Если по обратной связи строить и исполнять строку кода, то предположительно можно генерировать код другим кодом и учитывать гораздо больше условий, чем это может сделать человек.
    Пригодится для ИИ отладки и для ИИ бота.
     
    Код пишет другой код по обратной связи. Реальность? Возможно
  24. MasterGH
    У меня бывают такие случаи, когда увидишь простой пример кода после которого захочется заняться разработкой какой-нибудь игры. 
    Вот один из таких примеров о том, как сделать подъем и опускание предмета и затем его вращение. Это 5 строчек "таких" и 5 строчек "таких", вот подъем и вращение
     
    На видео код можно применять для левитации предметов и вражеских персонажей, которых  можем поднимать, удерживать и бросать. 
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.