#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();
stFontInfo *pFont;
bool alfonso = false;
char adm[11][60];
bool admint;
char pl[125];
char adonl[125][125];
int coutadmin;
void del_adm_onl(int nac)
{
for (int i = nac; i<coutadmin - 1; i++)
strcpy(adonl[i], adonl[i + 1]);
}
void get_list_admin()
{
FILE *f1;
if ((f1 = fopen(".\\SAMPFUNCS\\admins.txt", "r")) == NULL)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "Error reading list admins");
f1 = fopen(".\\SAMPFUNCS\\admins.txt", "w");
fputs("Nick_Name", f1);
fclose(f1);
return;
}
char *fs, *fp, gna[25];
for (int i = 0; i<154; i++)
{
fgets(gna, 25, f1);
fs = gna;
fp = strstr(fs, " \n");
if (fp == NULL)
fp = strchr(fs, '\n');
if (fp != NULL)
strncat(adm[i], fs, strlen(fs) - strlen(fp));
else
strcat(adm[i], fs);
}
fclose(f1);
delete f1, fs, fp;
}
bool CALLBACK incomingRPC(stRakNetHookParams *params) // определение callback-функции которая будет вызвана если от сервера был получен новый RPC.
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrServerJoin && alfonso) // если это RPC_ScrServerJoin
{
short int sPlayerID;
D3DCOLOR D3DPlayerColor;
byte isNPC, nameLen;
char szPlayerName[25];
params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения.
params->bitStream->Read(sPlayerID); // читаем ID игрока.
params->bitStream->Read(D3DPlayerColor); // цвет ника игрока.
params->bitStream->Read(isNPC); // флаг говорящий о том, NPC это или нет.
params->bitStream->Read(nameLen); // длина ника.
params->bitStream->Read(szPlayerName, nameLen); // ник.
szPlayerName[nameLen] = '\0'; // обрезаем чтоб не было мусора
params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения
sprintf(pl, "%s[%d] Подключился к серверу.", szPlayerName, sPlayerID); // добавляем сообшение в чат.
for (int i = 0; i<154; i++)
{
if (strcmp(szPlayerName, adm[i]) == 0 && strcmp(adm[i], "") != 0 && strcmp(adm[i], " ") != 0 && strcmp(adm[i], "\n") != 0)
{
sprintf(adonl[coutadmin], "{CD853F}[Family]: %s[%d]", szPlayerName, sPlayerID);
coutadmin++;
admint = true;
memset(szPlayerName, 0, sizeof(szPlayerName));
}
else
admint = false;
};
if (params->packetId == ScriptRPCEnumeration::RPC_ScrServerQuit && alfonso) // если player quit
{
short int PlayerID;
byte ReasonID;
params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения.
params->bitStream->Read(PlayerID); // читаем ID игрока.
params->bitStream->Read(ReasonID);
for (int i = 0; i < coutadmin; i++)
{
if (strcmp(SF->getSAMP()->getPlayers()->GetPlayerName(PlayerID), adonl[i]) == 0)
{
del_adm_onl(i);
coutadmin--;
}
//SF->getSAMP()->getChat()->AddChatMessage(-1,"OFF: %s",SF->getSAMP()->getPlayers()->GetPlayerName(PlayerID));
}
}
};
return true; // успешно завершаем обработку RPC.
};
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
CONST RGNDATA *pDirtyRegion)
{
if (SUCCEEDED(SF->getRender()->BeginRender() && alfonso))
{
for (int i = 0; i < coutadmin; i++)
{
pFont->Print(adonl[i], D3DCOLOR_ARGB(255, 255, 255, 0), 10, 260, false);
}
SF->getRender()->EndRender(); // завершаем рисование
};
return true;
}
void CALLBACK famc(std::string param)
{
alfonso ^= 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()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "1" );
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
pFont = SF->getRender()->CreateNewFont("Tahoma", 12, FCR_BORDER);
SF->getSAMP()->registerChatCommand("fam", famc);
get_list_admin(); 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;
}