DW pools_cars = *(DW*)0xB74494; //
int carid = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID;
int veh_handle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(carid);
DW car = *(DW*)(pools_cars + (veh_handle * 0xA18));
////////////////////////////////////////////////////////////////////////////////////
DW pools_cars = *(DW*)(*(DW*)0xB74494);
int carid = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID;
int veh_handle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(carid);
DW car = *(DW*)(pools_cars + (veh_handle * 0xA18));
////////////////////////////////////////////////////////////////////////////////////
DW pools_cars = 0xC502AA0;
int carid = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID;
int veh_handle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(carid);
DW car = *(DW*)(pools_cars + (veh_handle * 0xA18));
Ты хочешь машину в которой ты сидишь получить?@DarkP1xel , помоги пж, я хочу получить CVehicle через handle машины, (пока-что только с SFAPI) я пробовал:
ты когда-то сказал что хендл это типо игрового id
CVehicle
Каждый транспорт как объект, равняется 2584 (0xA18) байтам и начинается с 0xC502AA0.
0xB74494 - Содержит указатель. Этот указатель:
- +0 = Содержит указатель на первый элемент в пуле CVehicle
- +4 = Содержит указатель на карту байтов показывающую какие элементы сейчас используются в пуле CVehicle
- +8 = [dword] максимальное кол-во элементов в пуле CVehicle
- +12 = [dword] текущее кол-во элементов в пуле CVehicle
но всё крашилоC++:DW pools_cars = *(DW*)0xB74494; // int carid = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID; int veh_handle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(carid); DW car = *(DW*)(pools_cars + (veh_handle * 0xA18)); //////////////////////////////////////////////////////////////////////////////////// DW pools_cars = *(DW*)(*(DW*)0xB74494); int carid = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID; int veh_handle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(carid); DW car = *(DW*)(pools_cars + (veh_handle * 0xA18)); //////////////////////////////////////////////////////////////////////////////////// DW pools_cars = 0xC502AA0; int carid = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData.sVehicleID; int veh_handle = SF->getSAMP()->getVehicles()->GetCarHandleFromSAMPCarID(carid); DW car = *(DW*)(pools_cars + (veh_handle * 0xA18));
Да, но не стандартным способом, чтоб получить свою машину, я использую -Ты хочешь машину в которой ты сидишь получить?
DWORD me = *(DWORD*)0xB6F5F0;
DWORD car = *(DWORD*)(me + 0x58C);
Путь в utf-8 отдаешь?В имгуи при попытке загрузки шрифта из пути имеющего русские символы, не получается загрузить шрифт.
Загружаю так:
Кто-то знает как можно решить эту проблему?C++:io.Fonts->AddFontFromFileTTF(font, 15.0f, &icons_config, icons_ranges);
Это нелогично, ты обёртываешь под кодировку не путь, а только текст %s\\%s, поэтому ошибка, у тебя строка всё ещё не под utf8делаю вот так, но не уверен, что это правильно
C++:char path[MAX_PATH], font[MAX_PATH]; GetCurrentDirectory(MAX_PATH, path); sprintf(font, u8"%s\\%s", path, FONT_PATH);
#include <Windows.h>
#include "main.h"
SAMPFUNCS *SF = new SAMPFUNCS();
void CALLBACK cmd_show_info_player(std::string param)
{
if (param.empty()) return;
int i = std::stoi(param);
char buf[128];
stRemotePlayer* pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[i];
if (!pPlayer) return;
sprintf(buf, "Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d",
pPlayer->szPlayerName,
pPlayer->iPing,
pPlayer->iScore,
pPlayer->iIsNPC,
pPlayer->pPlayerData->iAFKState == 2);
SF->getSAMP()->getChat()->AddChatMessage(-1, buf);
};
void __stdcall mainloop()
{
static bool initialized = false;
if (!initialized)
{
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
SF->getSAMP()->registerChatCommand("showinfo", cmd_show_info_player);
initialized = true;
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Bl");
}
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
if (dwReasonForCall == DLL_PROCESS_ATTACH)
SF->initPlugin(mainloop, hModule);
return TRUE;
}
Посмотреть вложение 72673
C++:#include <Windows.h> #include "main.h" SAMPFUNCS *SF = new SAMPFUNCS(); void CALLBACK cmd_show_info_player(std::string param) { if (param.empty()) return; int i = std::stoi(param); char buf[128]; stRemotePlayer* pPlayer = SF->getSAMP()->getPlayers()->pRemotePlayer[i]; if (!pPlayer) return; sprintf(buf, "Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d", pPlayer->szPlayerName, pPlayer->iPing, pPlayer->iScore, pPlayer->iIsNPC, pPlayer->pPlayerData->iAFKState == 2); SF->getSAMP()->getChat()->AddChatMessage(-1, buf); }; void __stdcall mainloop() { static bool initialized = false; if (!initialized) { if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized()) { SF->getSAMP()->registerChatCommand("showinfo", cmd_show_info_player); initialized = true; SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Bl"); } } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) { if (dwReasonForCall == DLL_PROCESS_ATTACH) SF->initPlugin(mainloop, hModule); return TRUE; }
Сорри, я тупой нихуя не понял. Но, то что ты скинул(ссылку), я сделал уже.настрой и посмотри![]()
Гайд - Интегрированная отладка asi/sf/dll плагинов в игре с помощью Visual Studio
прив Многие ли из вас знают, что с помощью Visual Studio можно отлаживать плагины прямо в игре и что делается это очень просто? Нет, блять, нихуя вы не знаете! Но я вас научу. Берём студию и проект своего плагина, идём в конфигурацию проекта на страницу "Debugging" (Отладка) и ставим такие...www.blast.hk
там скорее всего исключение в stoi вызывается, если больше sizeof(int) то std::out_of_range, если туда отправляется текст без цифр то std::invalid_argument
Сорри, я тупой нихуя не понял
void CALLBACK si(std::string param)
{
if (param.empty() || param.length() > 23)
return SF->getSAMP()->getChat()->AddChatMessage(-1, "Please use /si <ID>");
try {
int id = std::stoi(param);
if (id > SAMP_MAX_PLAYERS - 5)
_Xout_of_range("stoi");
stRemotePlayer* pData = SF->getSAMP()->getPlayers()->pRemotePlayer[i];
if (!pData)
throw std::exception("Player is offline");
std::string text
= "ID: " + param
+ " | NAME: " + pData.name // fields may be wrong
+ " | SCORE: " + to_string(pData.score)
+ " | PING: " + to_string(pData.ping);
SF->getSAMP()->getChat()->AddChatMessage(-1, text.c_str());
}
catch (const std::out_of_range)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "Not more than 1000");
}
catch (const std::invalid_argument)
{
// here u can try find player by nickname
SF->getSAMP()->getChat()->AddChatMessage(-1, "You didn't put number");
}
catch (const std::exception& arg)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, arg.what());
}
}
Исключения в c++ чересчур медленные. Для чтения числа можно использовать scanf, либо regex_match.C++:void CALLBACK si(std::string param) { if (param.empty() || param.length() > 23) return SF->getSAMP()->getChat()->AddChatMessage(-1, "Please use /si <ID>"); try { int id = std::stoi(param); if (id > SAMP_MAX_PLAYERS - 5) _Xout_of_range("stoi"); stRemotePlayer* pData = SF->getSAMP()->getPlayers()->pRemotePlayer[i]; if (!pData) throw std::exception("Player is offline"); std::string text = "ID: " + param + " | NAME: " + pData.name // fields may be wrong + " | SCORE: " + to_string(pData.score) + " | PING: " + to_string(pData.ping); SF->getSAMP()->getChat()->AddChatMessage(-1, text.c_str()); } catch (const std::out_of_range) { SF->getSAMP()->getChat()->AddChatMessage(-1, "Not more than 1000"); } catch (const std::invalid_argument) { // here u can try find player by nickname SF->getSAMP()->getChat()->AddChatMessage(-1, "You didn't put number"); } catch (const std::exception& arg) { SF->getSAMP()->getChat()->AddChatMessage(-1, arg.what()); } }
Добро пожаловать в 2к20. Если исключение не брошено, то оно ничего не стоитИсключения в c++ чересчур медленные. Для чтения числа можно использовать scanf, либо regex_match.
Тоже верно. :DДобро пожаловать в 2к20. Если исключение не брошено, то оно ничего не стоит
Разве? Тогда как ты объяснишь рекомендацию использовать регулярки вместо stoi? Вот совет тебе по конвертации скроки в число и обратно - используй std::from_chars и std::to_chars(Оптимизация головного мозга, извините)