17.11.2016, 11:36
(
Последний раз редактировалось OstGot; 17.11.2016 в 12:04.
Причина: Исключение при выходе из авто
)
Код:
new
Float:OldSpeed[MAX_PLAYERS],
SpeedTime[MAX_PLAYERS];
public OnPlayerSpawn(playerid)
{
OldSpeed[playerid] = 0.0;
return 1;
}
public OnPlayerUpdate(playerid)
{
if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING &&
GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID &&
GetPlayerSurfingObjectID(playerid) == INVALID_OBJECT_ID)
{
new Float:vX, Float:vY, Float:vZ;
GetPlayerVelocity(playerid, vX, vY, vZ);
vX = GetSpeed(vX, vY, vZ);
if(vX > 212.0 && vX > OldSpeed[playerid] && GetTickCount() > SpeedTime[playerid] + 500)
{
Kick(playerid); //Наказание своё
return 0; //Рассинхрон, это важно
}
OldSpeed[playerid] = vX;
}
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(PLAYER_STATE_DRIVER <= oldstate <= PLAYER_STATE_PASSENGER)
{
new Float:vX, Float:vY, Float:vZ;
GetPlayerVelocity(playerid, vX, vY, vZ);
OldSpeed[playerid] = GetSpeed(vX, vY, vZ);
SpeedTime[playerid] = GetTickCount();
}
return 1;
}
GetSpeed(Float:X, Float:Y, Float:Z = 0.0)
return floatround(VectorSize(X, Y, Z) * 179.28625);
1. Максимальная скорость (212) замерялась именно под эту формулу в функции GetSpeed
2. Если в скрипте используется SetPlayerVelocity, и скорость через неё будет задана больше максимально допустимой - игрока кикнет как читера (это нужно учитывать)


