Check Position bugged -
binnyl - 24.06.2018
I'm trying to make a ANTI Teleport Hack, but i got some problems
It's so simple, get player position, after sometime check if player is in a valid range
If this range is so high and player was not teleported for a server command (SetPlayerPosEx)
It punish the teleport hack
But i'm stuck in the part to if player use server command, dont detect was a hacker
The values here:
Код:
format(string, sizeof(string), "Xtp[%i], Ytp[%i], Ztp[%i]", Xtp[playerid], Ytp[playerid], Ztp[playerid] );
Should be (i used /save in the same place i've got this string /\ ):
Код:
-25.3970,-185.8796,1003.5469
But instead of it, its showing:
Код:
[05:50:29] Xtp[-1043649266], Ytp[-1019616979], Ztp[1148904192]
Full code:
Код:
stock SetPlayerPosEx(playerid,Float:x,Float:y,Float:z,Float:angle,int,vw, bool:carregar = false) {
// update anti TP (to dont detect)
Xtp[playerid] = x;
Ytp[playerid] = y;
Ztp[playerid] = z;
INTtp[playerid] = int;
VWtp[playerid] = vw;
//
SetPlayerInterior(playerid,int);
SetPlayerVirtualWorld(playerid, vw);
SetPlayerPos(playerid, x,y,z);
if(angle == 0) SetCameraBehindPlayer(playerid);
if(carregar == true) PlayerCarregando(playerid);
// active anti TP
ContadorTeleport[playerid] = SetTimerEx("DetectTeleport", 50, false, "i", playerid);
return 1;
}
forward CheckTeleport(playerid); public CheckTeleport(playerid) {
KillTimer(ContadorTeleport[playerid]);
if(IsPlayerConnected(playerid) && playerid != INVALID_PLAYER_ID) {
GetPlayerPos(playerid, Xtp[playerid], Ytp[playerid], Ztp[playerid]);
INTtp[playerid] = GetPlayerInterior(playerid);
VWtp[playerid] = GetPlayerVirtualWorld(playerid);
ContadorTeleport[playerid] = SetTimerEx("DetectTeleport", 500, false, "i", playerid);
}
}
forward DetectTeleport(playerid); public DetectTeleport(playerid) {
KillTimer(ContadorTeleport[playerid]);
if(gSpectateID[playerid] == 65535 && paused[playerid] == false) {
if(!IsPlayerInRangeOfPoint(playerid, 60.0, Xtp[playerid], Ytp[playerid], Ztp[playerid])) {
new string[128];
format(string, sizeof(string), "Xtp[%i], Ytp[%i], Ztp[%i]", Xtp[playerid], Ytp[playerid], Ztp[playerid] );
ABroadCast(-1,string,3);
format(string, sizeof(string), "HACK: %s TELEPORT", PlayerName(playerid) );
ABroadCast(-1,string,3);
SetPlayerPosEx(playerid, Xtp[playerid], Ytp[playerid], Ztp[playerid], 0, INTtp[playerid], VWtp[playerid]);
}
}
ContadorTeleport[playerid] = SetTimerEx("CheckTeleport", 500, false, "i", playerid);
}
What do i doing wrong?
Re: Check Position bugged -
binnyl - 24.06.2018
What i'm doing wrong guys?
Still stuck in this
Re: Check Position bugged -
Sew_Sumi - 24.06.2018
You're trying to make a float, work with integer in your format, so that will throw out incorrect results in the first instance.
You need %f when dealing with floats, not %i (Integer).
Re: Check Position bugged -
binnyl - 25.06.2018
Quote:
Originally Posted by Sew_Sumi
You're trying to make a float, work with integer in your format, so that will throw out incorrect results in the first instance.
You need %f when dealing with floats, not %i (Integer).
|
Ohhhhhh thanks!
Now i think i got the problem...
[22:06:17] Xtp[1978.745239], Ytp[-1761.960449], Ztp[13.546875]
[22:06:20] -> OnFoot position saved (1978.7452,-1761.9604,13.5469)
Is this because
Xtp is 1978.745239
When should be 1978.7452 ?
Limit it to take only max 4 numbers after .
Should be the fix or would cause another problems latter?
If it is the right way to fix, how to take only the 4 numbers after .?
Re: Check Position bugged -
Sew_Sumi - 25.06.2018
Should be fine, /save probably just does to 4 decimal places, where float isn't inhibited by the decimals.
If you want your script to return the 4 decimal places, use %.4f, instead of just %f as the format specifier.
Re: Check Position bugged -
binnyl - 25.06.2018
How to do it?
Xtp[playerid] = x.4f; ?
Re: Check Position bugged -
Exhibit - 25.06.2018
replace %i with %.4f or %f
Re: Check Position bugged -
Sew_Sumi - 25.06.2018
From this...
Код:
format(string, sizeof(string), "Xtp[%i], Ytp[%i], Ztp[%i]", Xtp[playerid], Ytp[playerid], Ztp[playerid] );
to this...
Код:
format(string, sizeof(string), "Xtp[%.4f], Ytp[%.4f], Ztp[%.4f]", Xtp[playerid], Ytp[playerid], Ztp[playerid] );
And it will show in the log as what it is in the save command, but it doesn't matter as it's less than an inch in movement at that far down the decimals.
And this will ONLY show in the logs/chat, in the GetPlayerPosition it's still showing 8 decimals, but you just won't see them unless you look at the users saved data in their accounts if the enum is saved to their player file.
Re: Check Position bugged -
maikons - 25.06.2018
format(string, sizeof(string), "Xtp[%.4f], Ytp[%.4f], Ztp[%.4f]", Xtp[playerid], Ytp[playerid], Ztp[playerid] );
Is just where it print, the error will still happen, you need to get a way to change:
Xtp[playerid] = x;
Ytp[playerid] = y;
Ztp[playerid] = z;
To get only the 4 numbers after dot
Because else if it will still bugging on
if(!IsPlayerInRangeOfPoint(playerid, 60.0, Xtp[playerid], Ytp[playerid], Ztp[playerid])) {
Re: Check Position bugged -
Sew_Sumi - 25.06.2018
Quote:
Originally Posted by maikons
Because else if it will still bugging on
if(!IsPlayerInRangeOfPoint(playerid, 60.0, Xtp[playerid], Ytp[playerid], Ztp[playerid])) {
|
What are you on about? It's HIGHLY unlikely that it will bug because it has 8 decimal places, compared to 4...