Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29

Как считать количество полученного урона и одноразово выводить это на консоль?

31.10.2023, 20:22. Показов 1043. Ответов 16

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Вот я у своей игрушки считал значение хп по адресу. Как мне выводить количество полученного урона ОДНОРАЗОВО, т.е. как мне сделать так, чтобы только при получении урона, это выводилось в консоль, а не бесконечно? А еще, для удобства, как мне заморозить восстановление здоровья? (там, где mas[0], это я просто считал первоначальное здоровье)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <windows.h>
#include <string.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    HWND window = FindWindowA(0, "Titan Quest Anniversary Edition");
 
 
    DWORD PID;
    GetWindowThreadProcessId(window, &PID);
    HANDLE processOpen = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
 
    if (processOpen == NULL)
    {
        cout << "error" << endl;
    }
    else
    {
        float readedValue = 0;
        bool valueIsReaded = ReadProcessMemory(processOpen, (LPCVOID)0x2541AC78, &readedValue, sizeof(int), NULL);
 
        int* mas = new int[10];
        mas[0] = readedValue;
 
        for (int i = 1; ;)
        {
        n:
            ReadProcessMemory(processOpen, (LPCVOID)0x2541AC78, &readedValue, sizeof(int), NULL);
            mas[i] = readedValue;
 
            if (mas[i] < mas[i - 1])
            {
                cout << "Получен урон: " << mas[i - 1] - mas[i];
            }
 
            Sleep(250);
 
        }
    }
}
Добавлено через 14 минут
В дополнение: нужно неограниченное количество раз(но только когда получен урон)) выводить это на консоль, а не бесконечно(когда моя программа видит что условие выполнено, цикл продолжается вечно и постоянно выводится на консоль результат, а мне нужно как то именно ПРЕРЫВАТЬ этот вывод до следующего получения урона). Очень извиняюсь, если плохо сформулировал вопрос.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2023, 20:22
Ответы с готовыми решениями:

Как считать информацию из файла, полученного с помощью утилиты wevtutil?
С помощью утилиты wevtutil сохраняю некоторые журналы в файл с помощью команды: wevtutil epl &lt;Имя_журнала&gt; &lt;имя_файла&gt; В...

Как выводить данные в консоль
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; int main() { static int i = 0; i++; getch(); return i; }

Как выводить в консоль из Windows Forms?
Сценарий. 1. Windows Forms. Подключаемся к БД. 2. Windows Forms. Создаём ДатаТабле. 3. Windows Forms. Нажимаем кнопку для вывода...

16
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,138
31.10.2023, 20:34
geymer228, а зачем массив? Нужно переменную, хранящую предыдущее значение. И всё.
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 20:36  [ТС]
А вот я не знаю, как это сделать, поэтому сделал массив, чтоб по индексам определять текущее/предыдущее значение
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,138
31.10.2023, 20:44
Цитата Сообщение от geymer228 Посмотреть сообщение
float readedValue = 0;
Цитата Сообщение от geymer228 Посмотреть сообщение
&readedValue, sizeof(int)
а чего так странно - тип сделал float, а читаешь якобы int
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 20:45  [ТС]
А тут я уже прозевал)
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
31.10.2023, 20:45
Цитата Сообщение от geymer228 Посмотреть сообщение
нужно неограниченное количество раз(но только когда получен урон)) выводить это на консоль, а не бесконечно
В смысле выводить только в случае, когда "урон" уменьшился в очередной раз? а если остался на прежнем уровне (относительно прошлого раза) - то не выводить?
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,138
31.10.2023, 20:46
geymer228, попробуй так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        int prev = 0;
        ReadProcessMemory(processOpen, (LPCVOID)0x2541AC78, &prev, sizeof prev , NULL);
 
        for (;;Sleep(250))
        {
            int curr=0;
            ReadProcessMemory(processOpen, (LPCVOID)0x2541AC78, &curr, sizeof curr, NULL);
            if(curr!=prev)
            {
                cout << "Получен урон: " << curr-prev;
                prev=cur;
            }
        }
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 20:50  [ТС]
Тут понятно, что в таком случае мне нужно будет вывести "получено 0 урона", но мне сейчас хотя бы нужно основной вопрос решить: чтобы программа была бесконечной, но цикл прерывался на моменте с выводом, а после перезапускался, и ждал, что условие снова сработает, и потом опять по новой.
0
31.10.2023, 20:52

Не по теме:

С таком умением излагать - дохлый номер.
Лично я решительно не могу понять ничего.
Извините, но по стилю изложения вспомнилось про "корованы"

0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 21:08  [ТС]
Чтобы было максимально понятно, мне нужно, как я сказал выше: чтобы программа была бесконечной(т.е. банально чтобы она выполнялась до того момента, пока я сам ее не завершу вручную), но цикл прерывался после вывода, а после перезапускался, ожидая в бездействии, что условие снова сработает, и только тогда снова запускался.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,138
31.10.2023, 21:08
Цитата Сообщение от Алексей1153 Посмотреть сообщение
curr-prev
это я местами их перепутал. Ну, можно было и догадаться самому тоже
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 21:08  [ТС]
Неа, не работает, сейчас вообще рандомные минусовые числа выводит. Все таки, кажется, что с массивом через индексы попроще.
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 21:10  [ТС]
Знаю-знаю) Я поменял их местами, но все равно какие то странные рандомные числа выводит. (Извиняюсь, сохранил необрезанное фото случайно)
Миниатюры
Как считать количество полученного урона и одноразово выводить это на консоль?  
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 21:13  [ТС]
Вся проблема на скриншоте показана. У меня бесконечно спамится вывод, а мне надо чтоб он производился только один раз при получении урона, а дальше замораживался и снова ждал выполнения условия.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
31.10.2023, 21:35
Может проблема в волшебном числе 0x2541AC78? и откуда известно, что там int?
0
0 / 0 / 0
Регистрация: 12.05.2022
Сообщений: 29
31.10.2023, 22:27  [ТС]
Короче решил этот вопрос, теперь осталось считать все это с учетом восстановления хп. Такой вот код получился:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <windows.h>
#include <string.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "ru");
 
    HWND window = FindWindowA(0, "Titan Quest Anniversary Edition");
 
 
    DWORD PID;
    GetWindowThreadProcessId(window, &PID);
    HANDLE processOpen = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
 
    if (processOpen == NULL)
    {
        cout << "error" << endl;
    }
    else
    {
        float writtenValue = 0;
        float readedValue = 0;
        float defaultHP;
        float currentHP;
        ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
        defaultHP = readedValue;
 
 
    m:  ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
        currentHP = readedValue;
 
        if (currentHP < defaultHP)
        {
            cout << "Получен урон: " << defaultHP - currentHP << endl;
            ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
            defaultHP = readedValue;
            goto m;
        }
        else
        {
            goto m;
        }
    }
}
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,138
01.11.2023, 06:22
Цитата Сообщение от geymer228 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
m:  ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
        currentHP = readedValue;
if (currentHP < defaultHP)
        {
            cout << "Получен урон: " << defaultHP - currentHP << endl;
            ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
            defaultHP = readedValue;
            goto m;
        }
        else
        {
            goto m;
        }
goto вообще не в тему ))

C++
1
2
3
4
5
6
7
8
9
10
11
12
    while(1)
    {
        ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
        currentHP = readedValue;
 
        if (currentHP < defaultHP)
        {
            cout << "Получен урон: " << defaultHP - currentHP << endl;
            ReadProcessMemory(processOpen, (LPCVOID)0x38195BD0, &readedValue, sizeof(float), NULL);
            defaultHP = readedValue;
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.11.2023, 06:22
Помогаю со студенческими работами здесь

Как заставить консоль выводить кириллицу
Здравствуйте. Есть такой код: .386 .model flat, stdcall option casemap:none ExitProcess proto :dword GetStdHandle proto :dword ...

Как выводить в консоль следующим образом
Помогите пожалуйста, возможно ли сделать так: В первой строке всегда вводятся какие-то данные пользователем с клавиатуры, причем то, что...

Выводить на экран массив, элемент которого - это количество чисел в соотвествующей строке
программа должна выводить на экран массив,елемент которого-это каличество чисел в соотвествующей строке...например первый элемент...

Программа должна считать количество символов до первого восклицательного знака, если знак отсутствует выводить соответствующее сообщение.
Программа должна считать количество символов до первого восклицательного знака, если знак отсутствует выводить соответствующее сообщение. ...

Как заставить IDE выводить программу в консоль?
Есть программа на паскале, генерирующая лабиринт. Переписал на Java, но компилятор выводит только &quot;Process finished with exit code...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru