Jump to content

Anti Sobeit


Ryso

Recommended Posts

V dnesnej dobe ma kazdy server problem s cheatermi a ich odhalovanim. Neexistuje ziaden anticheat, ktory by na 100% odhalil cheatera.

 

Vo svojom mode mam spraveny jeden stunt, ktory je nemozne prejst so SetVehicleHealth(vehicleid,1000);, tak som spravil script, ktory spravi vozidlo nesmrtelnym (SetVehicleHealth(vehicleid,9999*1000);. Po postupnom testovani niektorym hracom tie vozidla stale vybuchovali a ani za boha som nevedel najst chybu. Neskor som si nasiel na nete sobeit (potreboval som airbreak na rychlejsie ziskavanie suradnic pre tvorbu svojho modu) a ked som vyskusal ten stunt so zapnutym sobeitom, nesmrtelnost vozidla z nicoho nic prestala fungovat. Po chvili testovania som zistil, ze sobeit nikdy neprekroci hranicu zivota vozidla nad standartnych 1000. A tak mi napadlo spravit script, ktory zisti, ci ma hrac spusteny sobeit, avsak dany hrac musi byt vo vozidle.

 

Tento anticheat funguje nasledovne:

 

#include 

new Float:OldVehicleHealth[MAX_PLAYERS]; // sem sa ulozi prvotny zivot vozidla
new Float:NewVehicleHealth[MAX_PLAYERS]; // sem sa ulozi zivot pocas zistovania sobeitu

#define MAX_ODPOCET_TIMER       1
new Odpocet_Timer[MAX_PLAYERS][MAX_ODPOCET_TIMER]; // nadefinujeme timer

enum Informacie // klasicky enum, do ktoreho bude ulozena casomiera
{
timerSobeitCheck
};
new Hrac[MAX_PLAYERS][informacie];

COMMAND:sobeit(playerid,params[]) //zaciatok prikazu
{
if(!IsPlayerAdmin(playerid)) return false; // je hrac rcon admin ?
new hrac = strval(params); // ulozi parameter do
if(isnull(params)) return SendClientMessage(playerid,COLOR_RED,"Použitie: /sobeit [ ID ]"); // toto vypise, ak zadate bez paarmetra
if(!IsPlayerConnected(hrac)) return SendClientMessage(playerid,COLOR_RED,"Hráč nie je pripojený na serveri!"); // je hrac pripojeny ?
if(!IsPlayerInAnyVehicle(hrac)) return SendClientMessage(playerid,COLOR_RED,"[ADMIN] Hráč musí byť vo vozidle!"); // hrac musi byt vo vozidle
GetVehicleHealth(GetPlayerVehicleID(hrac),OldVehicleHealth[hrac]); // ulozi prvotny zivot vozidla, ktory bude potom vrateny
SetVehicleHealth(GetPlayerVehicleID(hrac),5000); // nastavime zivot vozidla
Hrac[hrac][timerSobeitCheck] = 2; // casomiera 2 sekundy
Odpocet_Timer[hrac][1] = SetTimerEx("SobeitCheck",1000,true,"i",hrac); // spustime casomieru
SendClientMessage(playerid,COLOR_RED,"[ANTICHEAT] Počkaj 2 sekundy, kým prebehne kontrola..."); // oznamovaci text..
return true;
}

publicEx SobeitCheck(playerid) // timer
{
if(Hrac[playerid][timerSobeitCheck] > 0) // odpocet
{
	Hrac[playerid][timerSobeitCheck]--;
}
if(Hrac[playerid][timerSobeitCheck] == 1) // ak ostava presne 1 sekunda do konca, zistime zivot vozidla
{
    GetVehicleHealth(GetPlayerVehicleID(playerid),NewVehicleHealth[playerid]);
}
if(Hrac[playerid][timerSobeitCheck] == 0) // vyhodnotenie
{
	KillTimer(Odpocet_Timer[playerid][1]); // zrusime timer
	Hrac[playerid][timerSobeitCheck] = 0; // vynulujeme casomieru
	new str[128];
	if(NewVehicleHealth[playerid] > float(1000)) // ak zivot ostal na tych povodnych 5000, hrac ne negativny
	// ta podmienka "viac ako 1000" tam je preto, lebo hrac moze pocas tych dvoch sekund naburat a zivot sa znizi (za 2 sekundy je velmi mala pravdepodobnost, ze si ju znizi az o 4000
	{
		format(str,sizeof(str),"[ANTICHEAT] %s (ID: %d) je negatívny na sobeit!",PlayerName(playerid),playerid);
		SendClientMessageToAll(COLOR_RED,str); // vypise spravu
		SetVehicleHealth(GetPlayerVehicleID(playerid),OldVehicleHealth[playerid]); // vrati prvotny zivot vozidla
	}
	else // to znamena, ze sa BUD zivotnost znizila o 4000 (velmi nepravdepodobne), ALEBO hrac ma zapnuty sobeit, ktory automaticky nastavil zivot vozidla na 1000
	{
		format(str,sizeof(str),"[ANTICHEAT] %s (ID: %d) je pozitívny na sobeit!",PlayerName(playerid),playerid);
		SendClientMessageToAll(COLOR_RED,str); // vypise spravu
		SetVehicleHealth(GetPlayerVehicleID(playerid),OldVehicleHealth[playerid]); // vrati prvotny zivot vozidla
	}
}
return true;
}

alebo v pastebin http://pastebin.com/ZV2W1ZHy

 

To je len taky zaklad, ale podstata je zachovana. Samozrejme tie "SendClientMessageToAll" si zmente, aby to vypisalo len adminom, nechceme predsa, aby cheateri o tom vedeli :d.

 

Nevyhodou tohto scriptu je to, ze hrac musi byt vo vozidle, ale zase na 100% zisti, ak ma hrac co i len zapnuty sobeit, pricom nemusi pouzivat ziaden z jeho konkretnych cheatov. Testoval som to len raz, ziadne bugy som nenasiel, vsetko funguje. Vyhodou je, ze cheater o tom ani nevie, ze na nom prebieha kontrola.

 

PS: Pouzil som include zcmd.inc (najdete si na samp fore)

(Neviem, ci to na bicykloch funguje)

Link to comment
Share on other sites

Zajímavý postřeh. Já s0beit nepoužívám. Ale tohle je hezkej postřeh. BTW nemusel jsi ten kód dělat tak těžko + v tom public SobeitCheck ti chybíé podmínka jestli je hráč ve vozidle..

 

if(IsPlayerInAnyVehicle(playerid))

{

Link to comment
Share on other sites

Tu podmienku s vozidlom mam priamo v prikaze

 

if(!IsPlayerInAnyVehicle(hrac)) return SendClientMessage(playerid,COLOR_RED,"[ADMIN] Hráč musí byť vo vozidle!"); // hrac musi byt vo vozidle

Link to comment
Share on other sites

Tu podmienku s vozidlom mam priamo v prikaze

 

if(!IsPlayerInAnyVehicle(hrac)) return SendClientMessage(playerid,COLOR_RED,"[ADMIN] Hráč musí byť vo vozidle!"); // hrac musi byt vo vozidle

 

 

Nj ale za tu sekundu ten hráč může z toho auta vystoupit ..

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...