Хз почему, но в студии нельзя сделать jmp адрес.Посмотреть вложение 23675Посмотреть вложение 23676Посмотреть вложение 23677
один хуй недопустимый тип операнда, чё делать?
можно)Хз почему, но в студии нельзя сделать jmp адрес.
Записывай адрес в какой-либо регистр. Ну или закрой asm вставку и запиши static uint32_t addr =адрес, и в jmp юзать его.
в имгуи можно как то сменить цвет этих стрелочек на затрагивая цвет текста?
это в функции BeginMenu
Посмотреть вложение 23653
кароче там немного в другом был прикол, я переписывал fixdist от сртима, и долго думал чё там хук на хук стоит, кароче это были джампы внутри области этой хексовой, я тупо метки ебанул и заработало нормХз почему, но в студии нельзя сделать jmp адрес.
Записывай адрес в какой-либо регистр. Ну или закрой asm вставку и запиши static uint32_t addr =адрес, и в jmp юзать его.
в имгуи можно как то сменить цвет этих стрелочек на затрагивая цвет текста?
это в функции BeginMenu
Посмотреть вложение 23653
Пример получения кости игрока и отрисовка их. ID костей находятся в CPed.hКак получить координату кости?
#pragma region DrawBones
if (enableDrawBones) {
actor_info *actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped;
CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
float posX[15], posY[15];
int counter = 0;
CVector vPos[15];
for (int i = 1; i <= 53; i++)
{
switch (i)
{
case 1:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 3:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 4:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 5:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 6:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 22:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 23:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 25:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 32:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 33:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 35:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 42:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 43:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 52:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
case 53:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
}
}
for (int i = 0; i <= 14; i++) SF->getGame()->convert3DCoordsToScreen(vPos[i].fX, vPos[i].fY, vPos[i].fZ, &posX[i], &posY[i]);
SF->getRender()->DrawLine(posX[0], posY[0], posX[1], posY[1], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[0], posY[0], posX[11], posY[11], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[0], posY[0], posX[13], posY[13], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[1], posY[1], posX[2], posY[2], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[2], posY[2], posX[5], posY[5], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[2], posY[2], posX[8], posY[8], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[2], posY[2], posX[3], posY[3], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[3], posY[3], posX[4], posY[4], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[5], posY[5], posX[6], posY[6], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[6], posY[6], posX[7], posY[7], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[8], posY[8], posX[9], posY[9], 1, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[9], posY[9], posX[10], posY[10], 1, 0xFFFFFFFF);
}
#pragma endregion DrawBones
кто тебя учил плюсам?Пример получения кости игрока и отрисовка их. ID костей находятся в CPed.h
Код:#pragma region DrawBones if (enableDrawBones) { actor_info *actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped; CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo); float posX[15], posY[15]; int counter = 0; CVector vPos[15]; for (int i = 1; i <= 53; i++) { switch (i) { case 1: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 3: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 4: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 5: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 6: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 22: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 23: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 25: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 32: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 33: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 35: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 42: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 43: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 52: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 53: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; } } for (int i = 0; i <= 14; i++) SF->getGame()->convert3DCoordsToScreen(vPos[i].fX, vPos[i].fY, vPos[i].fZ, &posX[i], &posY[i]); SF->getRender()->DrawLine(posX[0], posY[0], posX[1], posY[1], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[0], posY[0], posX[11], posY[11], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[0], posY[0], posX[13], posY[13], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[1], posY[1], posX[2], posY[2], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[2], posY[2], posX[5], posY[5], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[2], posY[2], posX[8], posY[8], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[2], posY[2], posX[3], posY[3], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[3], posY[3], posX[4], posY[4], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[5], posY[5], posX[6], posY[6], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[6], posY[6], posX[7], posY[7], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[8], posY[8], posX[9], posY[9], 1, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[9], posY[9], posX[10], posY[10], 1, 0xFFFFFFFF); } #pragma endregion DrawBones
Че за ...?case 1: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 3: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 4: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 5: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 6: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 22: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 23: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 25: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 32: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 33: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 35: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 42: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 43: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 52: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break; case 53: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break;
case 1: case 3: case 4: case 5: case 6: case 22: // ...
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
break;
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()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}Loaded.");
init = true;
}
// Уведомляет только 1 раз, держа оружие в руке при подгрузке скрипта. без использования static флудит в чат, пытался исправить установкой 0 значения - сразу же заменяет, return'нить - не помогло.
static int current_weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
if (current_weapon == 31)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}M4A1 at your right hand.");
current_weapon = 0;
}
}
статик это крутоВынес за блок init, но уведомляет об оружии в руке только при загрузке скрипта. Почему лишь при загрузке?
C++: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()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}Loaded."); init = true; } // Уведомляет только 1 раз, держа оружие в руке при подгрузке скрипта. без использования static флудит в чат, пытался исправить установкой 0 значения - сразу же заменяет, return'нить - не помогло. static int current_weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon; if (current_weapon == 31) { SF->getSAMP()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}M4A1 at your right hand."); current_weapon = 0; } }
нахуя здесь свитч обьясните, если можно сразу вызвать функу какую он хочет перед этим поставив проверку на числоЧе за ...?
Перечисляй так:
C++:case 1: case 3: case 4: case 5: case 6: case 22: // ... Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; break;
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#define FUNC_IsVisible 0x536BC0
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию
{
for (int i = 0; i < SAMP_MAX_PLAYERS; i++)
{
actor_info *actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped;
CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);
float posX[15], posY[15];
int counter = 0;
CVector vPos[15];
for (int i = 1; i <= 53; i++)
{
switch (i)
{
case 1:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 3:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 4:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 5:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 6:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 22:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 23:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 25:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 32:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 33:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 35:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 42:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 43:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 52:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
case 53:
Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
counter++;
}
}
if (Ped->IsOnScreen())
{
for (int i = 0; i <= 14; i++) SF->getGame()->convert3DCoordsToScreen(vPos[i].fX, vPos[i].fY, vPos[i].fZ, &posX[i], &posY[i]);
SF->getRender()->DrawLine(posX[0], posY[0], posX[1], posY[1], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[0], posY[0], posX[11], posY[11], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[0], posY[0], posX[13], posY[13], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[1], posY[1], posX[2], posY[2], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[2], posY[2], posX[5], posY[5], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[2], posY[2], posX[8], posY[8], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[2], posY[2], posX[3], posY[3], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[3], posY[3], posX[4], posY[4], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[5], posY[5], posX[6], posY[6], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[6], posY[6], posX[7], posY[7], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[8], posY[8], posX[9], posY[9], 2, 0xFFFFFFFF);
SF->getRender()->DrawLine(posX[9], posY[9], posX[10], posY[10], 2, 0xFFFFFFFF);
}
SF->getRender()->EndRender(); // завершаем рисование
}
};
return 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("stillobj", sasas);
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;
}
Попытался сделать получение координат кости и рисовать на них, но чё то не то
C++:#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS #include <windows.h> #include <string> #include <assert.h> #include <process.h> #define FUNC_IsVisible 0x536BC0 #include "SAMPFUNCS_API.h" #include "game_api\game_api.h" SAMPFUNCS *SF = new SAMPFUNCS(); bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) { if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию { for (int i = 0; i < SAMP_MAX_PLAYERS; i++) { actor_info *actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped; CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo); float posX[15], posY[15]; int counter = 0; CVector vPos[15]; for (int i = 1; i <= 53; i++) { switch (i) { case 1: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 3: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 4: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 5: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 6: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 22: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 23: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 25: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 32: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 33: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 35: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 42: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 43: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 52: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; case 53: Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]); counter++; } } if (Ped->IsOnScreen()) { for (int i = 0; i <= 14; i++) SF->getGame()->convert3DCoordsToScreen(vPos[i].fX, vPos[i].fY, vPos[i].fZ, &posX[i], &posY[i]); SF->getRender()->DrawLine(posX[0], posY[0], posX[1], posY[1], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[0], posY[0], posX[11], posY[11], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[0], posY[0], posX[13], posY[13], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[1], posY[1], posX[2], posY[2], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[2], posY[2], posX[5], posY[5], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[2], posY[2], posX[8], posY[8], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[2], posY[2], posX[3], posY[3], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[3], posY[3], posX[4], posY[4], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[5], posY[5], posX[6], posY[6], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[6], posY[6], posX[7], posY[7], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[8], posY[8], posX[9], posY[9], 2, 0xFFFFFFFF); SF->getRender()->DrawLine(posX[9], posY[9], posX[10], posY[10], 2, 0xFFFFFFFF); } SF->getRender()->EndRender(); // завершаем рисование } }; return 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("stillobj", sasas); 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; }
В чём ошибка?
for (int i = 0; i < SAMP_MAX_PLAYERS; i++) // перебор всех игроков
{
#pragma region ValidPlayer
// провер¤ем каждого игрока на валидность, зону стрима
if (SF->getSAMP()->getPlayers()->iIsListed[i] != 1) continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i] == NULL) continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData == NULL) continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor == NULL) continue;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped == NULL) continue;
// Если игрок не существует или не в зоне стрима, то пропускаем
#pragma endregion ValidPlayer
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);