1 | ||||||||||||||||
Динамическое приложение с использованием шаблонов/конфигов29.07.2016, 12:00. Показов 1853. Ответов 45
Метки нет (Все метки)
Есть файл main.cpp
Сообщение от First.cfg
Сообщение от Two.cfg
з.ы. для полноты картины: main.cpp Кликните здесь для просмотра всего текста
gtavc.cfg Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ // GAME_PROCESS = "gtavc.exe" TRAINER_TITLE = "GTA Vice City Trainer +3" // x86 = 32 // x64 = 64 CPU_BIT = 32 // +++++++++++++++++++++++++++++++ // // 1 byte = unsigned char // 2 bytes = short // 4 bytes = int // float = float TYPE_HEALTH = int ADR_HEALTH = 0x00168A4C MODULE_HEALTH = "Core.dll" OFFSETS_HEALTH = 0x480 TYPE_ARMOUR = float ADR_ARMOUR = 0x00168A4C MODULE_ARMOUR = "Core.dll" OFFSETS_ARMOUR = 0x774 TYPE_MONEY float ADR_MONEY = 0x1498EA2 MODULE_MONEY = "gtavc.exe" OFFSETS_MONEY = 0x3b4 hl.cfg Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ // GAME_PROCESS = "hl.exe" TRAINER_TITLE = "Half-Life Trainer +3" // x86 = 32 // x64 = 64 CPU_BIT = 32 // +++++++++++++++++++++++++++++++ // // 1 byte = unsigned char // 2 bytes = short // 4 bytes = int // float = float TYPE_HEALTH = unsigned char ADR_HEALTH = 0x00768B4C MODULE_HEALTH = "hl.exe" OFFSETS_HEALTH = 0x123 TYPE_ARMOUR = short ADR_ARMOUR = 0x00668A42 MODULE_ARMOUR = "hl.dll" OFFSETS_ARMOUR = 0x5a0 TYPE_MONEY = float ADR_MONEY = 0x2428EA1 MODULE_MONEY = "hl.exe" OFFSETS_MONEY = 0x3b4 Добавлено через 6 минут На данный момент использую подключение файла config.h с таким вот содержимым Кликните здесь для просмотра всего текста
Это работает, но: -Каждый раз нужно менять содержимое этого файла под конкретную игру -Каждый раз после внесения изменений в этот конфиг нужно снова компилировать приложение
0
|
29.07.2016, 12:00 | |
Ответы с готовыми решениями:
45
Динамическое построение формы из шаблонов Создание калькулятора с использованием шаблонов Переписать код с использованием шаблонов Задача с использованием шаблонов классов в С++ |
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
29.07.2016, 12:46 | 2 |
Описать все возможные структуры данных и выбирать нужную в самой программе.
1
|
30.07.2016, 08:37 [ТС] | 3 | ||||||||||||||||||||||||||||||
Это первое что пришло в голову, но решение окажется слишком громоздким
было: Кликните здесь для просмотра всего текста
стало: Кликните здесь для просмотра всего текста
Добавлено через 35 секунд и это лишь для такого примитивного кода, который использовал в качестве примера для наглядности Добавлено через 59 секунд ну и плюс ко всему дублирование кода неизбежать Добавлено через 1 час 6 минут Вот такой код получился
2 15 Для продолжения нажмите любую клавишу . . . Добавлено через 18 часов 20 минут Думал попробовать с шаблонами
main.cpp Кликните здесь для просмотра всего текста
gtavc.cfg Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ // GAME_PROCESS = "gtavc.exe" TRAINER_TITLE = "GTA Vice City Trainer +3" // x86 = 32 // x64 = 64 CPU_BIT = 32 // +++++++++++++++++++++++++++++++ // // 1 byte = unsigned char // 2 bytes = short // 4 bytes = int // float = float TYPE_HEALTH = int ADR_HEALTH = 0x00168A4C MODULE_HEALTH = "Core.dll" OFFSETS_HEALTH = 0x480 TYPE_ARMOUR = float ADR_ARMOUR = 0x00168A4C MODULE_ARMOUR = "Core.dll" OFFSETS_ARMOUR = 0x774 TYPE_MONEY = float ADR_MONEY = 0x1498EA2 MODULE_MONEY = "gtavc.exe" OFFSETS_MONEY = 0x3b4 hl.cfg Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ // GAME_PROCESS = hl.exe TRAINER_TITLE = Half-Life Trainer +3 // x86 = 32 // x64 = 64 CPU_BIT = 32 // +++++++++++++++++++++++++++++++ // // 1 byte = unsigned char // 2 bytes = short // 4 bytes = int // float = float TYPE_HEALTH = unsigned char ADR_HEALTH = 0x00768B4C MODULE_HEALTH = "hl.exe" OFFSETS_HEALTH = 0x123 TYPE_ARMOUR = short ADR_ARMOUR = 0x00668A42 MODULE_ARMOUR = "hl.dll" OFFSETS_ARMOUR = 0x5a0 TYPE_MONEY = float ADR_MONEY = 0x2428EA1 MODULE_MONEY = "hl.exe" OFFSETS_MONEY = 0x3b4 Что меня настораживает так это такое огромное ветвление с кучей if-else и способ чтения конфига Наверняка есть более разумный вариант создать переменную с типом, который указан в конфиге т.е.
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
30.07.2016, 09:19 | 4 |
Шаблон существует только до компиляции. Это не поможет.
Делай универсальную. Каких там условий много? У тебя всего три секции: HEALTH, ARMOUR и MONEY.
1
|
30.07.2016, 10:51 [ТС] | 5 | |||||||||||||||
Три секции это для примера, на самом деле их 6: health, armour, money, magazine, ammo, gren
Кликните здесь для просмотра всего текста
Сообщение от config.h
файл main.cpp строчки 42-212
Попробую полностью объяснить суть задачи: Есть класс Game, который работает с памятью игры, т.е. пишет/читает её. Game.h Кликните здесь для просмотра всего текста
Game.cpp Кликните здесь для просмотра всего текста
Делаю универсальный трейнер для любой игры. Всё прекрасно работает,но как я писал выше Сейчас же хочу чтобы приложение(трейнер) работало на основе конфига, который будет выбран в начале работы программы. Т.е. захотел трейнер под GTA:VC - пожалуйста, под HalfLife - ради бога. Вся проблема в том, что в разных играх типы переменных для HP,AP,MONEY,AMMO, etc... разные, т.е. в одной игре броня может быть float, в другой int, в третьей вообще unsigned char.
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
30.07.2016, 10:59 | 6 |
У тебя сами секции однотипные. Из этого исходи. Сделаешь для одной, а после будешь для всех использовать.
1
|
30.07.2016, 11:05 [ТС] | 7 |
Можно подробнее? "Сделаешь для одной" но как? третьи сутки уже бьюсь
Не по теме: думал уже оставить эту затею и оставить как есть - каждый раз компилить под новую игру, что есесно не есть гуд
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
30.07.2016, 11:18 | 8 |
Одну секцию сделай под все типы. Потом будешь использовать для остальных.
1
|
30.07.2016, 11:35 [ТС] | 9 | |||||
эм... так ?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
30.07.2016, 11:51 | 10 | ||||||||||
у вас какая то каша в голове.
в коде соответственно - такая же каша. дизайн вашего конфига выглядит примерно так:
определяя текстовое имя ключа, и текстовое значение ключа. данные заносятся в std::map<std::string, std::string> далее, в выражении:
а его значение преобразуется к типу int руками стандартной библиотеки. если преобразование законное - все хорошо. иначе покажет ошибку.
1
|
30.07.2016, 12:13 [ТС] | 11 |
проблемы прочитать файл нет, этому особого внимания не уделял и пока просто считывал строки getline();
но за идею с .ini спасибо, возьму на заметку. проблема в том что я не знаю какой тип данных использует игра для хранения значения жизней Добавлено через 2 минуты Не по теме: hoggy, вы мне в прошлый раз очень сильно помогли в реализации этого класса(Game):good:
0
|
30.07.2016, 12:21 [ТС] | 13 | ||||||||||||||||||||
сейчас у меня в main.cpp подключен #include<config.h>
Кликните здесь для просмотра всего текста
прецпроссесор на заменяет код
0
|
30.07.2016, 12:26 [ТС] | 14 | ||||||||||
0
|
30.07.2016, 12:27 | 15 |
Тогда при изменении типа переменной Вам придется всё равно всё перекомпилировать.
Мой Вам совет - сначала разработайте ту самую систему типов, не нужно всё делать крайне универсально - всё равно не получится. Дайте пользователям возможность выставлять health в конфигах, но тип этого самого health - не их забота. Игра регулируется правилами, эти правила жестко заданы в приложении, увы, но изменять абсолютно всё конфигами и скриптами у Вас не получится. Посмотрите на гигантов, типа Civilization, TES, Fallout и т.д. В этих играх многое можно поменять в конфигах и скриптах - но далеко не всё.
1
|
30.07.2016, 12:36 [ТС] | 16 |
эти конфиги создаются другим приложением написанным на C++ (CheatTable converter) которое позже напишу.
т.е. есть таблица указателей созданная в CheatEngine. сохраняем её $game_name$.ct. конвертером преобразую данные из этой таблицы .ct в свой конфиг .cfg/.ini а это значит что пользователи там врядли будут ковыряться, а если и чтото поменяют - то это их проблема что программа где-то не так работает
0
|
HelicopterK52
|
30.07.2016, 12:38
#17
|
0
|
30.07.2016, 12:43 [ТС] | 18 | ||||||||||
тем не менее всё работает, пока для двух игр Killing Floor и Killing Floor 2, и это не предел
чтобы добавить еще одну игру нужно просто найти указатели на нужные данные, с помощью CheatEngine/ArtMoney/etc,, Сейчас чтобы получить трейнер для KF1 нужно в проекте просто поменять конфиг
абсолютно также и для игры KF2:
Добавлено через 1 минуту с друзьями на разных машинах в сингл-плеере тестили - всё ок, с этим проблем нет. проблема в универсальности
0
|
HelicopterK52
|
30.07.2016, 12:47
#19
|
0
|
30.07.2016, 12:50 | 20 |
Я сам играю в killing floor, все эти "читерные" значения(лаве, хп, броня, патроны, опыт (на рпг серверах) - все это хранится на стороне сервера), так что есть сомнения в реальной работе твоего чита в сетке (про взлом параметров в одиночке можешь не писать).
Единственное, что мне удалось "поломать", так это steam id, чтобы баны обходить, причем играю на non steam клиенте игры на соотв. no steam серверах, чего уж говорить про нормальные сервера с VAC'ом
0
|
30.07.2016, 12:50 | |
30.07.2016, 12:50 | |
Помогаю со студенческими работами здесь
20
Cоздание итератора с использованием шаблонов Выбор валидной функции с использованием шаблонов Среднее геометрическое с использованием перегруженных функций и шаблонов Не получается правильно объявить friend перегрузку оператора с использованием шаблонов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |