//Admin fly
//Zmienna przechowująca bool'a z włączonym lataniem. [FALSE - wyłączone, TRUE - włączone]
static bool:FLY_Variable[MAX_PLAYERS];
//Definicje funkcji
forward bool:FLY_Start(playerid); //Start latania, przed tym InitFly(%0)
forward FLY_Keys(playerid); //Obsługa klawiszy
forward bool:FLY_Stop(playerid); //Wyłączenie latania
forward static FLY_Look(playerid,Float:x,Float:y); //Ustawianie pozycji kamery (credits: Y_Less, przerobiona delikatnie)
//---
//Macro na włączenie latania
#define InitFly(%0)
(FLY_Variable[(%0)] = false)
//Stricte włączenie latania
bool:FLY_Start(playerid)
{
//Warunek, że poprzednia funkcja została wykonana, ustawienie boola na 1.
if(FLY_Variable[playerid]) return false;
FLY_Variable[playerid] = true;
//Stworzenie zmiennych z pozycją + przypisanie do nich pozycji
new
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid,x,y,z);
SetPlayerPos(playerid,x,y,z+5.0);
//Wywołanie funkcji public Fly;
FLY_Keys(playerid);
return true;
}
public FLY_Keys(playerid)
{
if(playerid == INVALID_PLAYER_ID) return 1;
new key[3];
GetPlayerKeys(playerid,key[0],key[1],key[2]);
new
Float:v_x,
Float:v_y,
Float:v_z,
Float:x,
Float:y,
Float:z;
if(key[1] < 0) //Góra powoli
{
GetPlayerCameraFrontVector(playerid,x,y,z);
v_x = x+0.1;
v_y = y+0.1;
}
if(key[0] & 128) v_z = -0.2;
else if(key[0] & KEY_FIRE) v_z = 0.2;
if(key[0] & KEY_WALK)
{
v_x /=5.0;
v_y /=5.0;
v_z /=5.0;
}
if(key[0] & KEY_SPRINT)
{
v_x *=4.0;
v_y *=4.0;
v_z *=4.0;
}
if(v_z == 0.0) v_z = 0.025;
SetPlayerVelocity(playerid,v_x,v_y,v_z);
if(v_x != 0 && v_y != 0)
{
GetPlayerCameraFrontVector(playerid,v_x,v_y,v_z);
GetPlayerCameraPos(playerid,x,y,z);
FLY_Look(playerid,v_x*500.0+x,v_y*500.0+y);
}
if(FLY_Variable[playerid]) SetTimerEx("Fly",100,false,"i",playerid);
return 1;
}
bool:FLY_Stop(playerid)
{
if(!FLY_Variable[playerid]) return false;
new
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid,x,y,z);
SetPlayerPos(playerid,x,y,z);
FLY_Variable[playerid] = false;
return true;
}
static FLY_Look(playerid,Float:x,Float:y)
{
new Float:Px, Float:Py, Float: Pa;
GetPlayerPos(playerid, Px, Py, Pa);
Pa = floatabs(atan((y-Py)/(x-Px)));
if (x <= Px && y >= Py) Pa = floatsub(180.0, Pa);
else if (x < Px && y < Py) Pa = floatadd(Pa, 180.0);
else if (x >= Px && y <= Py) Pa = floatsub(360.0, Pa);
Pa = floatsub(Pa, 90.0);
if (Pa >= 360.0) Pa = floatsub(Pa, 360.0);
SetPlayerFacingAngle(playerid, Pa);
return;
}