14/11/2020 17:14
(07/11/2020 17:51)RodrigoMSR Escreveu: Quando comecei a usar este sistema ano passado também tive esses problemas, eu havia feito uma correção e está funcionando bem.
Aqui está o código:
Código PHP:static bool:s_pSynced[MAX_PLAYERS];
static s_pAmmo[MAX_PLAYERS];
static s_pUpdateTime[MAX_PLAYERS];
static s_pDesyncTime[MAX_PLAYERS];
static s_pBugCount[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
s_pDesyncTime[playerid] = 0;
return 1;
}
public OnPlayerSpawn(playerid)
{
s_pDesyncTime[playerid] = 0;
return 1;
}
public OnPlayerUpdate(playerid)
{
if(gettime() > s_pUpdateTime[playerid])
{
s_pUpdateTime[playerid] = gettime() + 2;
static current_weapon, current_ammo, new_ammo;
GetPlayerWeaponData(playerid, 0, current_weapon, current_ammo);
s_pSynced[playerid] = (current_ammo != s_pAmmo[playerid]);
s_pAmmo[playerid] = current_ammo;
new_ammo = !current_ammo;
if(!s_pSynced[playerid])
{
if(s_pDesyncTime[playerid] == 0) s_pDesyncTime[playerid] = gettime();
if(++s_pBugCount[playerid] >= 2)
{
//mudar munição não funciona algumas vezes por algum motivo desconhecido (talvez valor invertido vindo de GetPlayerWeaponData)
//setando para a mesma munição volta a funcionar
new_ammo = current_ammo;
s_pBugCount[playerid] = 0;
}
}
else
{
s_pDesyncTime[playerid] = 0;
}
SetPlayerAmmo(playerid, current_weapon, new_ammo);
}
return 1;
}
stock IsPlayerSynced(playerid)
{
return s_pSynced[playerid];
}
stock GetDesyncTime(playerid)
{
return (gettime() - s_pDesyncTime[playerid]);
}
Recomendo kickar o jogador somente se ele já estiver dessincronizado há algum tempo (ex: 20 segundos).
Código PHP:if(!IsPlayerSynced(playerid) && GetDesyncTime(playerid) >= 20)
{
//kick
}
Mt obg! Vou testar aqui!