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

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,768
11,210
1.Ваш вопрос: Дайте код для вывода сообщения в чат при запуске САМПА и еще код на активацию по команде
1. В шаблоне плагина уже есть добавление сообщения
1640358411366.png

2.
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void CALLBACK cmd_callback(std::string arg)
{
    SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "CMD");
}

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "SAMPFUNCS Plugin loaded.");
            SF->getSAMP()->registerChatCommand("cmd", cmd_callback);
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
 

EclipsedFlow

Известный
Проверенный
1,040
462
Почему выводит 0? В imgui вывожу через цикл структуры и там заполняются, но не все структуры.
C++:
// Глоб. область
struct stSeed
{
    int id;
    float distance;
    CVector position;
    std::string seed;
}seed[SAMP_MAX_3DTEXTS];

// Бессконечный цикл
auto it = *std::min_element(std::begin(seed), std::end(seed), [](const stSeed& a, const stSeed& b) {return a.distance < b.distance; });
msg(formatString("[%d] Distance: %0.2f", it.id, it.distance));
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Почему выводит 0? В imgui вывожу через цикл структуры и там заполняются, но не все структуры.
C++:
// Глоб. область
struct stSeed
{
    int id;
    float distance;
    CVector position;
    std::string seed;
}seed[SAMP_MAX_3DTEXTS];

// Бессконечный цикл
auto it = *std::min_element(std::begin(seed), std::end(seed), [](const stSeed& a, const stSeed& b) {return a.distance < b.distance; });
msg(formatString("[%d] Distance: %0.2f", it.id, it.distance));
Ну так вот, незаполненная структура имеет distance 0, поэтому ты и получаешь 0
 
  • Нравится
Реакции: EclipsedFlow

EclipsedFlow

Известный
Проверенный
1,040
462
Как получить угол камеры персонажа? (Радианы или лучше градусы)
Не с помощью SF
Спасибо заранее
 

ERKYNIS

Новичок
1
0
1. Делаю лаунчер для своего сервера на C# через Visual Studio. Мне нужно запускать прямое подключение к серверу, используя другую директорию игры (которую пользователь может настроить в настройках). Если использовать
C++:
Process.Start(samp, IP_CONNECT);
(у меня в переменных прописан путь к сампу и IP сервера), то запускается гта, которая указана в настройках самого сампа.
 

memir

🇷🇺
Всефорумный модератор
333
597
1. Делаю лаунчер для своего сервера на C# через Visual Studio. Мне нужно запускать прямое подключение к серверу, используя другую директорию игры (которую пользователь может настроить в настройках). Если использовать
C++:
Process.Start(samp, IP_CONNECT);
(у меня в переменных прописан путь к сампу и IP сервера), то запускается гта, которая указана в настройках самого сампа.
ну тебе аргументы надо в нужном формате к игре прописать, и библиотеку с сампом подгрузить
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,768
11,210
Если использовать
C++:
Process.Start(samp, IP_CONNECT);
(у меня в переменных прописан путь к сампу и IP сервера), то запускается гта, которая указана в настройках самого сампа.
потому что самп запускает игру, путь к которой лежит в реестре

Если использовать (у меня в переменных прописан путь к сампу и IP сервера), то запускается гта, которая указана в настройках самого сампа.
C#:
public void setSettings(string newpath)
{
    RegistryKey SAMP = Registry.CurrentUser.OpenSubKey("Software\\SAMP", true);
    if (SAMP != null)
    {
        object savepath = newpath;
        SAMP.SetValue("gta_sa_exe", newpath);
    }
}

public string getSettings()
{
    string path;
    RegistryKey SAMP = Registry.CurrentUser.OpenSubKey("Software\\SAMP");
    if (SAMP != null)
    {
        object SAMP_path = SAMP.GetValue("gta_sa_exe");
        path = Convert.ToString(SAMP_path);
    }
    return path;
}

private void play_Click(object sender, EventArgs e)
{
    if (nickname.Text.Length > 2 && nickname.Text.Length < 21)
    {
        string gamepath = getSettings();
        
        setSettings(gamepath, nickname.Text, false);
        string samp_path = gamepath.Replace("gta_sa.exe", "samp.exe");
        if (File.Exists(samp_path))
        {
            Process iStartProcess = new Process();
            iStartProcess.StartInfo.FileName = samp_path;
            iStartProcess.StartInfo.Arguments = " АЙПИ_СЕРВЕРА";
            iStartProcess.Start();
        }
        else
        {
            MessageBox.Show("Файл " + samp_path + " не найден!");
        }
      
    }
    else
    {
        MessageBox.Show("Ошибка: длина ника должна содержать от 3 до 20 символов!");
    }
}
 
Последнее редактирование:
  • Bug
Реакции: ERKYNIS и 4el0ve4ik

[w0te]

Потрачен
773
488
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Привет, попытался выдать себе HP, почему так не работает? компилятор не жалуется.
2:
DWORD CPed = 0xB6F5F0;
ReadProcessMemory(handle, (PBYTE*)CPed + 0x540, &Read, sizeof(Read), 0);
WriteProcessMemory(handle, (LPVOID)CPed, &NewValue, sizeof(NewValue), 0);
Всё работает но HP не выдаются, сервер HMS.
 

sc6ut

неизвестный
Модератор
382
1,075
Привет, попытался выдать себе HP, почему так не работает? компилятор не жалуется.
2:
DWORD CPed = 0xB6F5F0;
ReadProcessMemory(handle, (PBYTE*)CPed + 0x540, &Read, sizeof(Read), 0);
WriteProcessMemory(handle, (LPVOID)CPed, &NewValue, sizeof(NewValue), 0);
Всё работает но HP не выдаются, сервер HMS.
1. что ты делаешь это пиздец
2. сними протект
3. в 0xB6F5F0 хранится указатель на cped а не сам cped
4. что делает твой код только сам бог знает, хп он не меняет так точно
5. есть статичный адресс можешь юзать его (0xB793E0), тебе будет проще и нам тоже
6. разберись что какая функция делает перед тем писать ее в свой код
7. разберись и подумай что тебе надо сделать чтобы выставить значение хп
8. используй google
9. не насилуй код тем что не понимаешь
10. https://gtamods.com/wiki/Memory_Addresses_(SA)
11. если трахнул извини
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Последнее редактирование:

thelupa1488

Новичок
9
1
Всем привет, сделал показ информации о игроках которые на сервере (id, ping, score, name),
но на некоторых игроках пишет вместо ника, иероглифы.
C++:
                RemotePlayer[i].id = i;
                RemotePlayer[i].ping = readMem<int>(Memory.RemotePlayer_PTR + 0x28);
                RemotePlayer[i].score = readMem<int>(Memory.RemotePlayer_PTR + 0x24);
                RemotePlayer[i].isNpc = readMem<int>(Memory.RemotePlayer_PTR + 0x4);

                char remote_name[32];
                DWORD oldProtect = 0;
                DWORD Address = Memory.RemotePlayer_PTR + 0xC;
                VirtualProtectEx(Memory.processHandle, (void*)Address, sizeof(remote_name), PAGE_EXECUTE_READWRITE, &oldProtect);
                ReadProcessMemory(Memory.processHandle, (LPVOID)(Address), &remote_name, sizeof(remote_name), NULL);
                VirtualProtectEx(Memory.processHandle, (void*)Address, sizeof(remote_name), oldProtect, NULL);
                RemotePlayer[i].name = remote_name;
                RemotePlayer[i].address = Memory.RemotePlayer_PTR;
C++:
int player = MenuFunction.test;
        if (player > REDFIRE_MAX_PLAYER || player < 0)
            player = 0;

        if (LocalPlayer.id == player) {
            sprintf(TestInfo, "Address: %X\nID: %d\nName: %s\nScore: %d\nPing: %d\n", LocalPlayer.address, LocalPlayer.id, LocalPlayer.name.c_str(), LocalPlayer.score, LocalPlayer.ping);
        }
        else if (RemotePlayer[player].address != NULL) {
            sprintf(TestInfo, "Address: %X\nID: %d\nName: %s\nScore: %d\nPing: %d\n", RemotePlayer[player].address, RemotePlayer[player].id, RemotePlayer[player].name.c_str(), RemotePlayer[player].score, RemotePlayer[player].ping);
        }
        else {
            sprintf(TestInfo, "Данный игрок не найден!");
        }
        DrawStrokeText(200, 200, &White, TestInfo);
C++:
void DrawStrokeText(int x, int y, RGBA* color, const char* str) {
    ImFont a;
    std::string utf_8_1 = std::string(str);
    std::string utf_8_2 = string_To_UTF8(utf_8_1);
    ImGui::GetForegroundDrawList()->AddText(ImVec2(x, y - 1), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
    ImGui::GetForegroundDrawList()->AddText(ImVec2(x, y + 1), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
    ImGui::GetForegroundDrawList()->AddText(ImVec2(x - 1, y), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
    ImGui::GetForegroundDrawList()->AddText(ImVec2(x + 1, y), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
    ImGui::GetForegroundDrawList()->AddText(ImVec2(x, y), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), utf_8_2.c_str());
}

C++:
std::string string_To_UTF8(const std::string& str) {
    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
    wchar_t* pwBuf = new wchar_t[nwLen + 1];
    ZeroMemory(pwBuf, nwLen * 2 + 2);
    ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    char* pBuf = new char[nLen + 1];
    ZeroMemory(pBuf, nLen + 1);
    ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
    std::string retStr(pBuf);
    delete[]pwBuf;
    delete[]pBuf;
    pwBuf = NULL;
    pBuf = NULL;
    return retStr;
}

Кривое отображение.png
Нормальное.png
 

THERION

Известный
Проверенный
88
324
Кто уже смешарик, дайте, пожалуйста, ответ на глупый вопрос. Какой патч процессор (x86) выполнит быстрее:
1. Блок NOP'ов (Длиной 58 к примеру)
2. Прыжок c начала такого блока в его конец
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Кто уже смешарик, дайте, пожалуйста, ответ на глупый вопрос. Какой патч процессор (x86) выполнит быстрее:
1. Блок NOP'ов (Длиной 58 к примеру)
2. Прыжок c начала такого блока в его конец
NOP’ы это xchg eax, eax; ~3 такта
jump зависит от контекста, но безусловный прыжок почти бесплатный, если инструкции в кеш подгружены в кеш. Прыжок должен быть выгоднее наверное
 
  • Нравится
Реакции: THERION и legendabrn