Другое С/С++ Вопрос - Ответ

ReganRomov

Участник
51
14
Вопрос! Как эта функця будет выглядеть на плюсах?
speed_min, speed_max = string.match(memory.tostring(0x00C71780, 12, false), "(%d+)[^%d]+(%d+)")
 

Вложения

  • Скрин с луа.png
    Скрин с луа.png
    79.6 KB · Просмотры: 193
  • Скрин с плюсов.png
    Скрин с плюсов.png
    23.6 KB · Просмотры: 213
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Что ты вообще хочешь сделать? Откуда ты такой адрес взял? Ты уверен что он статичный? И чего у тебя в коде для speed_min и speed_max один и тот же адрес?
 

checkdasound

Известный
Проверенный
963
410
Есть меню имгуи, где много чекбоксов, которые не умещаются в одно окно и надо листать вниз. Можно ли сделать так, чтобы чекбоксы автоматически переносились, когда доходили до границы меню или хотя-бы разделить по столбцам как-то?
 

_=Gigant=_

Известный
144
221
Есть меню имгуи, где много чекбоксов, которые не умещаются в одно окно и надо листать вниз. Можно ли сделать так, чтобы чекбоксы автоматически переносились, когда доходили до границы меню или хотя-бы разделить по столбцам как-то?

int menu = 1;
BeginChild;
switch(menu)
{
case 1:
Checkbox(...) //1
break;
case 2:
Checkbox(...) //2
break;

default:
menu = 1;
break;
}
EndChild;

if imgui.button "menu 2"
if menu != 2
menu = 2;
 

pretlant

Новичок
20
28
Нужно написать программу на C++, которая бы имитировала движение игрока (бег вперёд, спринт, прыжок).

Я пробовал использовать функции keybd_event(...), но никак не помогает. По факту нажатие передается, но персонаж ествественным образом не бежит.
 

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,199
Как sleep() сделать в цикле, просто когда юзаю sleep игра зависает...
 

traceattack

Известный
218
119
Как sleep() сделать в цикле, просто когда юзаю sleep игра зависает...
Новый поток создай и в нем уже используй sleep
а чё за

int AlmostMain ( int argc, char ** argv )
{

int C = 2019;
//C++;
size_t _( &C != &C );
for(;C&(_=(_?_<<(C!=~C):(C==C)));C&=~_){}
C|=_;

}
Инкремент переменной C на 1
 
Последнее редактирование:

Adder

Известный
22
0
Возможно ли определить примерные координаты прицеливания игрока?
 

ImPasha

Software Developer & System Administrator
Друг
1,789
2,141
Всем привет 👋

Есть нужда в создании плагина, который бы запускался на всех последних версиях SAMP, а значит возможность написания SF плагина сразу отпадает. Собственно, в C++ я новичок, можно сказать, но всё равно попытался всё сделать сам - ничего не получилось, по итогам тестирования было установлено, что игра офигевает от происходящего и крашится. Мои цели в данный момент достаточно простые - заставить ASI плагин выводить сообщение в чат после инициализации SAMP'a.

Пожалуйста, не нужно советовать различные ASI Framework - это не то, что мне нужно. Помогите разобраться с тем, как это работает в идеале, пожалуйста.

main.cpp:
#include "main.h"

void MainThread()
{
    do {
        samp.dwModule = (DWORD)GetModuleHandle(L"samp.dll");
    } while (!samp.dwModule);
    do {
        Sleep(1);
    } while (IsSampInit() != TRUE);
    Sleep(2500);
    AddChatMessage("Hello world!");
}

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
        DisableThreadLibraryCalls(hModule);
        _beginthread((_beginthread_proc_type)MainThread, NULL, NULL);
        break;
    }
    }
}
main.h:
#pragma once
#include <Windows.h>
#include <iostream>
#include <string>
#include <process.h>
#include <stdio.h>

struct SAMPStruct
{
    DWORD dwModule;
} samp;

struct SAMPOffsets
{
    DWORD registerClientCommand = 0x65AC0;
    DWORD addChatMessage = 0x64520;
} offset;

bool IsSampInit()
{
    return ((bool(__thiscall *)())(samp.dwModule + 0x9BF70))();
}

void RegisterChatCommand(const char *command, void *function)
{
    ((void(__thiscall *)(DWORD str, const char* cmd, void* func))(samp.dwModule + offset.registerClientCommand))(*(DWORD*)(samp.dwModule + 0x21A0E8), command, function);
}

void AddChatMessage(const char *message)
{
    ((void(__thiscall *)(DWORD str, const char* text))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
Warning! Указатели, находящиеся в моём коде неправильные. Всё, что они Вам дадут - краш игры.
 
Последнее редактирование:

Roger571

Известный
58
31
Всем привет 👋

Есть нужда в создании плагина, который бы запускался на всех последних версиях SAMP, а значит возможность написания SF плагина сразу отпадает. Собственно, в C++ я новичок, можно сказать, но всё равно попытался всё сделать сам - ничего не получилось, по итогам тестирования было установлено, что игра офигевает от происходящего и крашится. Мои цели в данный момент достаточно простые - заставить ASI плагин выводить сообщение в чат после инициализации SAMP'a.

Пожалуйста, не нужно советовать различные ASI Framework - это не то, что мне нужно. Помогите разобраться с тем, как это работает в идеале, пожалуйста.

main.cpp:
#include "main.h"

void MainThread()
{
    do {
        samp.dwModule = (DWORD)GetModuleHandle(L"samp.dll");
    } while (!samp.dwModule);
    do {
        Sleep(1);
    } while (IsSampInit() != TRUE);
    Sleep(2500);
    AddChatMessage("Hello world!");
}

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
        DisableThreadLibraryCalls(hModule);
        _beginthread((_beginthread_proc_type)MainThread, NULL, NULL);
        break;
    }
    }
}
main.h:
#pragma once
#include <Windows.h>
#include <iostream>
#include <string>
#include <process.h>
#include <stdio.h>

struct SAMPStruct
{
    DWORD dwModule;
} samp;

struct SAMPOffsets
{
    DWORD registerClientCommand = 0x65AC0;
    DWORD addChatMessage = 0x64520;
} offset;

bool IsSampInit()
{
    return ((bool(__thiscall *)())(samp.dwModule + 0x9BF70))();
}

void RegisterChatCommand(const char *command, void *function)
{
    ((void(__thiscall *)(DWORD str, const char* cmd, void* func))(samp.dwModule + offset.registerClientCommand))(*(DWORD*)(samp.dwModule + 0x21A0E8), command, function);
}

void AddChatMessage(const char *message)
{
    ((void(__thiscall *)(DWORD str, const char* text))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
 

ImPasha

Software Developer & System Administrator
Друг
1,789
2,141
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
 

Roger571

Известный
58
31
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
Проблема в прототипе функции.
C++:
void AddChatMessage(const char *message)
{
    ((void(__cdecl *)(DWORD str, const char* text, ...))(samp.dwModule + offset.addChatMessage))(*(DWORD*)(samp.dwModule + 0x21A0E4), message);
}
 
  • Нравится
Реакции: ImPasha