- 4,814
- 6,513
int __thiscall stPickupPool::RemovePickup(stPickupPool *this, signed int id)Есть у кого функция удаления пикапов?
samp.dll+0xFE70
int __thiscall stPickupPool::RemovePickup(stPickupPool *this, signed int id)Есть у кого функция удаления пикапов?
код кривойЧто за дичь? Происходит при запуске потока.
код кривой
bool IsPlayerOnScreen(int id)
{
bool value;
if (SF->getSAMP()->getPlayers()->IsPlayerDefined(id, true))
{
DWORD dwFunc = 0x536BC0;
DWORD dwThis = (DWORD)SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTAEntity;
_asm
{
mov ecx, dwThis
call dwFunc
mov value, al
}
}
return value;
}
int GetVehicleSpeed(int id)
{
int speed;
CVector vector;
if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->state == 50)
{
vector.fX -= SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->speed[0];
vector.fY -= SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->speed[1];
vector.fZ -= SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->speed[2];
speed = (int)sqrt(pow(vector.fX, 2) + pow(vector.fY, 2) + pow(vector.fZ, 2)) * 125;
}
return speed;
}
void thread_radar(int max)
{
while (access)
{
if (SF->getGame()->isGTAMenuActive())
continue;
bool status = false;
for (int id = 0; id < SAMP_MAX_PLAYERS; id++)
{
if (SF->getSAMP()->getPlayers()->sLocalPlayerID == id)
continue;
else if (SF->getSAMP()->getPlayers()->iIsListed[id] != 1)
continue;
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id] == NULL)
continue;
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData == NULL)
continue;
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor == NULL)
continue;
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->state != 50)
continue;
else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->passengers[0] != SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped)
continue;
else if(IsPlayerOnScreen(id))
{
int speed = GetVehicleSpeed(id);
if (speed > max)
{
status = true;
SF->getSAMP()->getChat()->AddChatMessage(-1, "• {FFA500}[Радиолокатор] {FFFFFF}%s превысил допустимую скорость [%i км/ч]", SF->getSAMP()->getPlayers()->GetPlayerName(id), speed);
}
}
}
Sleep(status ? 15000 : 1000);
}
}
Пример - SF Plugin - SpeedHack+(https://blast.hk/threads/13382/)Может накидать кто функу спидхака? Т.е. жмем допустим ALT, и машина ускоряется не по вектору движ. а тупо вперед, по вектору направления машины
(C++/C#)
Я не хотел писать SF плагин, я хотел пример реализации посредством стандартных средств C++/C# (WinApi etc)
Сам смысл реализации показан в сурсах, для реализации без сф тебе нужно узнать адрес скорости машины.Я не хотел писать SF плагин, я хотел пример реализации посредством стандартных средств C++/C# (WinApi etc)
Перебором всех айди игроков и совпадениемHOOK функция возвращает CPedSAInterface ,как с помощью CPedSAInterface узнать ID игрока ?
samp.dll+0x10420Перебором
WORD __thiscall stPlayerPool::getPlayerIdByCPed(stPlayerPool *this, CPed *ped)
Я же ньюфаг. Что с меня взять.samp.dll+0x10420
C++:WORD __thiscall stPlayerPool::getPlayerIdByCPed(stPlayerPool *this, CPed *ped)
Я делаю так:Как это юзать?
auto id = CallFunc::thiscall<int>(pPlayerPool, g_handle.dwSAMP + 0x10420, ped);
using namespace std::placeholders;
std::function<WORD(CPed *ped)> stPlayerPool__getPlayerIdByCPed = std::bind((WORD(__thiscall*)(stPlayerPool*, CPed*))((DWORD)GetModuleHandle("samp.dll") + 0x10420), pPlayerPool, _1);
// После чего вызываешь функцию очень просто:
auto id = stPlayerPool__getPlayerIdByCPed(ped);
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#pragma comment(lib, "User32.lib")
SAMPFUNCS *SF = new SAMPFUNCS();
void ThreadOne()
{
while (true)
{
}
}
void ThreadTwo()
{
while (true)
{
}
}
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized())
return;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadOne, 0, 0, 0);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadTwo, 0, 0, 0);
init = true;
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) {
if (dwReasonForCall == DLL_PROCESS_ATTACH)
SF->initPlugin(mainloop, hModule);
return TRUE;
}
Дать ему отдохнуть. Sleep(10);как это исправить?