Jump to content
  • 0

pomoc Problém s freeze


DuFF

Dotaz

Popis problému:


Zdravím,
v rámci prokrastinácie sa pokúšam vymyslieť nový spôsob, ako otestovať hráča na autoscroll, ale vyskytlo sa pár problémov.

Čo je to autoscroll:


Čoraz viac obľúbený cheat, ktorý používajú "sawneri" / "skilleri".
Po pustení pravého tlačítka na myši za nich prehodí zbraň na päsť a naspäť na sawny - doplní im náboje v zásobníku.
Podľa môjho názoru je populárny hlavne kvôli tomu, že naň takmer žiaden cz/sk server nemá anticheat a ťažko sa dokazuje.



Väčšina dostupných autoscrollov prehadzuje zbrane "natvrdo" pomocou "01B9: set_actor $PLAYER_ACTOR armed_weapon_to 0".
Práve toto sa snažím využiť na detekciu.
Pozorovaním som si všimol, že freeznutý hráč bez použitia cheatov nedokáže prehodiť zbrane, ale prehodiť pomocou 01B9 dokáže.

Myšlienka:
V momente, keď hráč prehodí na päsť, treba ho freeznuť.
Ak hráč autoscroll nemá, po uplynutí nejakej doby (pár ms) bude jeho aktuálna zbraň stále päsť (freeznutý hráč bez cheatov nemôže prehodiť zbraň).
Ak však hráč autoscroll používa, jeho script bude chcieť prehodiť aj naspäť na sawny, takže po uplynutí pár ms bude jeho aktuálna zbraň iná ako päsť (čo nemôže nastať v prípade, že by hráč cheaty nemal).

Problém:
Vo svojom kóde sa snažím túto myšlienku zrealizovať, ale narazil som na komplikácie. Ukazuje sa, že public OnPlayerUpdate sa nevolá dostatočne často na to, aby dokázal detekovať každú jednu zmenu zbrane - môže sa stať, že medzi 2 volaniami OnPlayerUpdate prehodím zo sawn na päsť, naspäť na sawny (aj bez cheatov) a žiadne prehodenie sa nezistí. To by ale až tak nevadilo, nie je potrebné testovať každú zmenu...
Skutočný problém je ten, že mám pocit, že krátko po freeznutí sa hráč ešte môže pohybovať alebo prehadzovať zbrane.
Pri testovaní priloženého kódu občas nastala situácia, že sa mi po zmrazení (nie som si istý, či to bolo po zmrazení, každopádne GetPlayerWeapon(playerid) v TestStart vždy vrátilo 0) podarilo prehodiť zbraň z päste na sawny, čo samozrejme rozbilo úplne celý test, pretože tesne pred odmrazením (v TestEnd) som mal v ruke sawny a tým pádom detekovalo autoscroll.

Bol by som vďačný, keby ste sa mi na to pozreli, overili správnosť myšlienky / overili, či je naozaj možné prehodiť zbraň krátko po freeznutí hráča, prípadne poskytli nejaké riešenie problému - či už toho s OnPlayerUpdate alebo toho s freeze.


Chyby/varování kompilátoru a při běhu:


-

Kód:

 

#define FILTERSCRIPT

#include <a_samp> 

enum pData {
    testsLeft,
    lastWeapon,
    testRunning
}

new players[MAX_PLAYERS][pData];

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!strcmp("/testme", cmdtext)) {
        players[playerid][testsLeft] = 10;
        players[playerid][lastWeapon] = GetPlayerWeapon(playerid);
        return 1;
    }
    return 0;
}

public OnPlayerUpdate(playerid)
{
    if (!players[playerid][testsLeft])
        return 1;

    if (players[playerid][testRunning])
        return 1;

    new playerWeapon = GetPlayerWeapon(playerid);
    if (!playerWeapon && playerWeapon != players[playerid][lastWeapon]) {
        TogglePlayerControllable(playerid, false);
        SendClientMessageToAll(-1, "[DEBUG] Change");
        TestStart(playerid);
    }
    players[playerid][lastWeapon] = playerWeapon;
    return 1;
}

TestStart(playerid)
{
    SendClientMessageToAll(-1, "[DEBUG] Test start");
    new playerWeapon = GetPlayerWeapon(playerid);
    if (playerWeapon) {
        SendClientMessageToAll(-1, "Test failed - Repeating");
        TogglePlayerControllable(playerid, true);
    } else {
        players[playerid][testRunning] = 1;
        players[playerid][testsLeft]--;
        SetTimerEx("TestEnd", 1000, false, "d", playerid);
    }
    new msg[16];
    format(msg, sizeof(msg), "weapon: %d", playerWeapon);
    SendClientMessageToAll(-1, msg);
}

forward TestEnd(playerid);
public TestEnd(playerid)
{
    SendClientMessageToAll(-1, "[DEBUG] Test end");
    if (GetPlayerWeapon(playerid) != 0) {
        SendClientMessageToAll(-1, "[DEBUG] Autoscroll detected");
    }
    TogglePlayerControllable(playerid, true);
    players[playerid][testRunning] = 0;
}

 




Dodatečné poznámky:
--

Edited by DuFF
Link to comment
Share on other sites

4 odpovědí na tuto otázku

Recommended Posts

  • 0

Trošku som pozeral kód a čo píšeš icon_e_biggrin.gif

Ako na to pozerám tak:

1) Ak ti teststart vždy vrátil 0 ale test end ti vrátil sawny (a nemáš zapnutý ten cheat), tak potom je chyba vo funkcii toogleplayercontrollable - a s tým bohužial nič nespravíš, keďže je to funkcia sampu

2) OnPlayerUpdate by mal zareagovať na každú zmenu zbrane, nakoľko sa volá pri zmene parametrov hráča (tj. aj zmena zbraní) + každých xy milisekund

3) Nebolo by lepšie proste len kontrolovať rýchlosť prepínania tých zbraní? napr. ak je to menej ako 50 ms tak ho kicknuť?

 

Oprav ma ak sa v niečom mýlim, nepoznám ten cheat, len usudzujem z toho čo píšeš

Edited by Quiter
Link to comment
Share on other sites

  • 0

OnPlayerUpdate sa síce volá každých xy milisekúnd, ale nie dosť často. Ako píšem, som schopný prehodiť zbrane (aj bez cheatov) na päsť a na sawny medzi 2 volaniami, (teda v 1. volaní mám sawny a v ďalšom volaní mám tiež sawny - nič sa nezistí).

 

Kontrolovať rýchlosť prepínania zbraní som tiež skúšal, ale zistil som, že to k ničomu nevedie. Jednak sa dá v niektorých verziách tohto cheatu rýchlosť prehadzovania nastaviť a hlavne som nenašiel žiadnu hranicu, ktorú by bez cheatov nebolo možné dosiahnuť (tvojich 50ms). Napríklad stlačením Q a E dokážem prehodiť do pár ms (spravil som si script, ktorý stláčanie q a e simuluje, testoval som to s ním)

Edited by DuFF
Link to comment
Share on other sites

  • 0
new weaponID = 0;
public OnPlayerUpdate(playerid)
{
	new weap = GetPlayerWeapon(playerid);
	if(weap != weaponID)
	{
	    new string[50];
		format(string, 50, "old: %2d | new: %2d", weaponID, weap);
		weaponID = weap;
		SendClientMessageToAll(-1, string);
		TogglePlayerControllable(playerid, false);
	}
	return 1;
}

Tak som to otestoval a poviem ti, si bez šance... Ak stlačím Q a následne E, tak sa mi public vyvolá 2x aj keď ma to má zamraziť

 

Pozri, miesto anticheatu, sprav antibug :d nedovol hráčovi zmeniť na sawny skôr ako za napr. 5 sekund (neviem ako dlho trvá prebíjanie)

 

 

Tj, hráč zmení napr. na päste a za xy milisekund zmení na sawny, tak mu natvrdo nastav päste a napíš mu že niesme používať reload bug :d

Edited by Quiter
  • Líbí se mi to! (+1) 2
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...