#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();
float x; float y; float z; char name[64];
stFontInfo *pFont;
const uint16_t _settingsDialogID = 8249;
bool espitem; bool esp; bool _enabled = false, _inited = false, _dialog = false, _showDialog = false; bool espact[10] = { false, false, false, false, false, false, false, false, false, false };
void ShowSettingsDialog(void);
float GetDistance(D3DXVECTOR3 target)
{
D3DXVECTOR3 player(PEDSELF->GetPosition()->fX, PEDSELF->GetPosition()->fY, PEDSELF->GetPosition()->fZ);
return sqrt((player.x - target.x) * (player.x - target.x) + (player.y - target.y) * (player.y - target.y) + (player.z - target.z) * (player.z - target.z));
}
void CalcScreenCoors(D3DXVECTOR3 *vecWorld, D3DXVECTOR3 *vecScreen)
{
D3DXMATRIX m((float *)(0xB6FA2C));
DWORD *dwLenX = (DWORD *)(0xC17044);
DWORD *dwLenY = (DWORD *)(0xC17048);
vecScreen->x = (vecWorld->z * m._31) + (vecWorld->y * m._21) + (vecWorld->x * m._11) + m._41;
vecScreen->y = (vecWorld->z * m._32) + (vecWorld->y * m._22) + (vecWorld->x * m._12) + m._42;
vecScreen->z = (vecWorld->z * m._33) + (vecWorld->y * m._23) + (vecWorld->x * m._13) + m._43;
double fRecip = (double)1.0 / vecScreen->z;
vecScreen->x *= (float)(fRecip * (*dwLenX));
vecScreen->y *= (float)(fRecip * (*dwLenY));
}
bool CALLBACK whtop(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) // рендер
{
if (espitem == false)
return true;
if (SUCCEEDED(SF->getRender()->BeginRender()))
{
for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
{
if (!SF->getSAMP()->getInfo()->pPools->pObject->IsObjectExists(i)) continue;
D3DXVECTOR3 scPos;
object_info *object = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity;
if (object != nullptr)
{
x = object->base.matrix[4 * 3];
y = object->base.matrix[4 * 3 + 1];
z = object->base.matrix[4 * 3 + 2];
}
if (GetDistance(D3DXVECTOR3(x, y, z)) > 350) continue;
int MID = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->iModel;
// Плита - 1718 | Кувшин - 2870 | 2228 19631 - Лопата | 2726 - Ваза | 14705 - Ваза | 19941 - Свиток | 19314 - Рога | 1575 - сундук / 19591 - веер 1575 - пакет 19631 - молот
CalcScreenCoors(&D3DXVECTOR3(x, y, z), &scPos);
if (MID == 1718) sprintf(name, "Плита");
if (MID == 2870) sprintf(name, "Кувшин");
if (MID == 2228) sprintf(name, "Лопата");
if (MID == 2726 || MID == 14705) sprintf(name, "Ваза");
if (MID == 19941) sprintf(name, "Слиток");
if (MID == 19314) sprintf(name, "Рога");
if (MID == 1575) sprintf(name, "Сундук");
if (MID == 19591) sprintf(name, "Веер");
if (MID == 1575) sprintf(name, "Мешок");
if (MID == 19631) sprintf(name, "Молот");
if (MID == 19820) sprintf(name, "Сосуд");
if (scPos[2] > 0.01f && ((MID == 1718 && espact[0]) || (MID == 2870 && espact[1]) || (MID == 2228 && espact[2]) || ((MID == 2726 || MID == 14705) && espact[3]) || (MID == 19941 && espact[4]) || (MID == 19314 && espact[5]) || (MID == 1575 && espact[6]) || (MID == 19591 && espact[7]) || (MID == 1575 && espact[8]) || (MID == 19631 && espact[9]) || (MID == 19820 && espact[10])) && espitem == true)
{
char szMsg[128];
sprintf(szMsg, "%s{0000FF}[%.0f]", name, GetDistance(D3DXVECTOR3(x, y, z)));
//else if(esp == true) sprintf(szMsg, "ModelID: %d{0000FF}[%.0f]", MID, GetDistance(D3DXVECTOR3(x, y, z)));
pFont->Print(szMsg, 0xFFFF8C00, scPos.x, scPos.y, false);
if (esp == true) SF->getRender()->DrawLine(950, 800, scPos.x, scPos.y, 1, 0xFFFF8C00); // Делался под мой экран, надо было корды перса перевести в 2D
}
}
SF->getRender()->EndRender();
}
return true;
}
void CALLBACK OnDialogRespond(int dialogId, int buttonId, int listItem, const char *input) // диалог
{
if (_dialog == false || dialogId != _settingsDialogID || buttonId == 0)
return;
_dialog = false;
switch (listItem)
{
case 0: espitem ^= true; break;
case 1: esp ^= true; break;
case 2: SF->getSAMP()->getChat()->AddChatMessage(-1, "Ваза - 250$ | Сосуд - 500$ | Плита - 500$ | Кувшин - 250$ | Слиток - 1750$ | Мешок - 2250$ | Веер - 1000$"); break;
case 4: espact[0] ^= true; break;
case 5: espact[1] ^= true; break;
case 6: espact[2] ^= true; break;
case 7: espact[3] ^= true; break;
case 8: espact[4] ^= true; break;
case 9: espact[5] ^= true; break;
case 10: espact[6] ^= true; break;
case 11: espact[7] ^= true; break;
case 12: espact[8] ^= true; break;
case 13: espact[9] ^= true; break;
case 14: espact[10] ^= true; break;
}
_showDialog = true;
}
void CALLBACK cmd_menu(std::string str) // диалог
{
ShowSettingsDialog();
}
void ShowSettingsDialog(void) // диалог
{
const char *on = "{00DD00}ON{FFFFFF}", *off = "{AAAAAA}OFF{FFFFFF}", *white = "{FFFFFF}";
char str[4096];
sprintf_s(str, "%sСтатус скрипта: \t%s\n%sЛинии к объектам: \t%s\n%s[ {00FF00}Инфо{FFFFFF} ] Цены на объекты\n{4169E1}Список объектов: \n[ %s ] Плиты\n[ %s ] Кувшины\n[ %s ] Лопаты\n[ %s ] Вазы\n[ %s ] Слитки\n[ %s ] Рога\n[ %s ] Сундуки\n[ %s ] Вееры\n[ %s ] Мешки\n[ %s ] Молоты\n[ %s ] Сосуды",
white, (espitem ? "{00DD00}Включен{FFFFFF}" : "{AAAAAA}Выключен{FFFFFF}"),
white, (esp ? "{00DD00}Включена{FFFFFF}" : "{AAAAAA}Выключена{FFFFFF}"), // линия
white,
(espact[0] ? on : off), //
(espact[1] ? on : off), //
(espact[2] ? on : off),
(espact[3] ? on : off),
(espact[4] ? on : off),
(espact[5] ? on : off),
(espact[6] ? on : off),
(espact[7] ? on : off),
(espact[8] ? on : off),
(espact[9] ? on : off),
(espact[10] ? on : off));
SF->getSAMP()->getDialog()->ShowDialog(_settingsDialogID, DIALOG_STYLE_LIST, "Diver ESP | by Revalto", str, "Toggle", "Close");
_dialog = true;
}
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized()) return;
SF->getSAMP()->getChat()->AddChatMessage(-1, "{FF8C00}[ Dhelp ]{FFFFFF} Скрипт создан для проекта Diamond RP! {4169E1}Разработчик: {8A2BE2}Revalto");
SF->getSAMP()->getChat()->AddChatMessage(-1, "{FF8C00}[ Dhelp ]{FFFFFF} Активация: {4169E1}/diver");
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, whtop); // Рендер
pFont = SF->getRender()->CreateNewFont("Verdana", 10, FCR_BORDER); // Шрифт текста
SF->getSAMP()->registerChatCommand("diver", cmd_menu); // кмд
SF->getSAMP()->registerDialogCallback(OnDialogRespond); // Диалог
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;
}