//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; }