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;
}
Dotaz
DuFF 85
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:
Edited by DuFFDodatečné poznámky:
--
Link to comment
Share on other sites
4 odpovědí na tuto otázku
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now