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, и скорость через неё будет задана больше максимально допустимой - игрока кикнет как читера (это нужно учитывать)