Другое SAMPFUNCS | API C++

Woofing Giraffe

Активный
402
49
Я не умею с памятью работать, можно код?
Код:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
bool Status;
char newtime[28];
DWORD  ThreadID;
HANDLE hThread;

void __stdcall AnotherThread(void)
{
    HANDLE ProcessHandle = GetCurrentProcess();
    while (true)
    {
        if (Status)
        {
            WriteProcessMemory(ProcessHandle, (LPVOID)0xB70153, newtime, 1, 0);
        }
    }
    TerminateThread(hThread, 0);
    CloseHandle(hThread);
}

void CALLBACK cmd(std::string param)
{
    if (param.empty()) return;
    int time;
    if (!sscanf(param.c_str(), "%d", &time) || time > 23 || time < 0) return SF->getSAMP()->getChat()->AddChatMessage(0xB0B0B0, "Используй: /settime [Время (От 0 до 23)].");
    sprintf(newtime, "%d", time);
    Status = true;
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;
        SF->getSAMP()->registerChatCommand("settime", cmd);
        hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AnotherThread, NULL, 0, &ThreadID);
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
Код конечно та ещё херня, но рабочий.
 
Последнее редактирование:

Woofing Giraffe

Активный
402
49
И опять же вопрос, даже в том коде выше, при выходе из игры через /q тупо крашит игру, если цикл убрать то такого не будет происходить. Что я делаю не так? И как это исправить?
 

Gouvere

Новичок
13
0
Код:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
bool Status;
char newtime[28];
DWORD  ThreadID;
HANDLE hThread;

void __stdcall AnotherThread(void)
{
    HANDLE ProcessHandle = GetCurrentProcess();
    while (true)
    {
        if (Status)
        {
            WriteProcessMemory(ProcessHandle, (LPVOID)0xB70153, newtime, 1, 0);
        }
    }
    TerminateThread(hThread, 0);
    CloseHandle(hThread);
}

void CALLBACK cmd(std::string param)
{
    if (param.empty()) return;
    int time;
    if (!sscanf(param.c_str(), "%d", &time) || time > 23 || time < 0) return SF->getSAMP()->getChat()->AddChatMessage(0xB0B0B0, "Используй: /settime [Время (От 0 до 23)].");
    sprintf(newtime, "%d", time);
    Status = true;
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;
        SF->getSAMP()->registerChatCommand("settime", cmd);
        hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AnotherThread, NULL, 0, &ThreadID);
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
Код конечно та ещё херня, но рабочий.
Спасибо. Но он как-то неправильно работает. При смене времени вылетают варнинги, нельзя сменить время второй раз, а потом у меня вообще крашнуло.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,463
И опять же вопрос, даже в том коде выше, при выходе из игры через /q тупо крашит игру, если цикл убрать то такого не будет происходить. Что я делаю не так? И как это исправить?
Зачем тебе создавать новый поток? Чем тебе не устраивает mainloop?
 

Tray228

Новичок
218
27
как сделать проверки?
actor defiend, actor dead и т.д

а если не найдет то прыгаем обратно.
как это сделать?
 
Последнее редактирование:

Woofing Giraffe

Активный
402
49
как сделать проверки?
actor defiend, actor dead и т.д

а если не найдет то прыгаем обратно.
как это сделать?
Код:
SF->getSAMP()->getPlayers()->IsPlayerDefined(plid, false)
Используй как условие. Plid - ID игрока, true/false - зона стрима, т.е. если стоит false, то оно проверяет подключён ли игрок к серверу, если true, то находится ли он в зоне стрима.
 

Tray228

Новичок
218
27
Код:
SF->getSAMP()->getPlayers()->IsPlayerDefined(plid, false)
Используй как условие. Plid - ID игрока, true/false - зона стрима, т.е. если стоит false, то оно проверяет подключён ли игрок к серверу, если true, то находится ли он в зоне стрима.
retrue;
если условие не выполнено
 

Tray228

Новичок
218
27
return SF->getSAMP()->getChat()->AddChatMessage(0xB0B0B0, "Такого игрока нет.");
вот прям так?