#include <a_samp>public OnPlayerKeyStateChange(playerid, newkeys, oldkeys){if(newkeys & KEY_SPRINT){ new Float:angle, Float:pos[3], Float:X, Float:Y, Float:Z, Float:size; for(new i = 0; i < MAX_VEHICLES; i++){ GetVehiclePos(i, pos[0], pos[1], pos[2]); GetVehicleZAngle(i, angle); if(IsPlayerInRangeOfPoint(playerid, 5.0, pos[0], pos[1], pos[2])) { GetVehicleModelInfo(GetVehicleModel(i), VEHICLE_MODEL_INFO_SIZE, X, Y, Z); size = VectorSize(X, Y, Z) / 2; pos[0] -= (size * floatsin(-angle, degrees)); pos[1] -= (size * floatcos(-angle, degrees)); SetPlayerPos(playerid, pos[0], pos[1], pos[2]); }}}return 1;}
GetVehicleModelInfo(GetVehicleModel(i), VEHICLE_MODEL_INFO_SIZE, X, Y, Z); size = VectorSize(X, Y, Z) / 2; pos[0] -= (size * floatsin(-angle, degrees)); pos[1] -= (size * floatcos(-angle, degrees)); SetPlayerPos(playerid, pos[0], pos[1], pos[2]);
GetVehicleModelInfo(GetVehicleModel(i), VEHICLE_MODEL_INFO_SIZE, X, Y, Z); // lekéri a jármû méretét, majd az értékeket eltároljuk az X, Y, Z változóbasize = VectorSize(X, Y, Z) / 2; // van 3 vektorunk (X, Y, Z). 0.3x-ben lett hozzáadva a VectorSize() függvény (ez nem azt jelenti, hogy eddig nem lehetett kiszámítani). //Ez abban segít, hogy kitudd számítani a megkapott vektorok nagyságát. //Jelen esetben a kocsi nagysága. Ugye lekértük a kocsi pozícióját és eltároltuk azt a pos[0] (X) és pos[1] (Y) változóba. //Mivel a GetVehiclePos() a jármû közepét kéri le (mert ugyan nem a kocsi elejétõl szamolunk, hanem csak a közepétõl), így a kapott eredmény értéket el kell osztani a felével, //hogy megkapd a megfelõ távolságot a csomagtartótól. A \"size\" változóba eltároljuk az értéketpos[0] -= (size * floatsin(-angle, degrees)); //Kiszámítjuk a távolságot, mostmár csak a kocsi mögé kell rakni a playert. sinussal kiszámítjuk, hogy hol lesz a poz. az X tengelyenpos[1] -= (size * floatcos(-angle, degrees)); //cosinussal kiszámítjuk hogy hol lesz a poz. az Y tengelyenSetPlayerPos(playerid, pos[0], pos[1], pos[2]);//végül elteleportáljuk a playert
new Float:X,Float:Y,Float:Z,vehid;GetVehiclePos(vehid,X,Y,Z);if(IsPlayerInrangeOfPoint(playerid,3.0,X,Y,Z);{// funkciók ha a közelében van}
new Float:X,Float:Y,Float:Z,vehid;GetVehiclePos(vehid,X,Y,Z); [/quote]De az bonyolult megoldás, és szükséges hozzá minimum 360 lehetõség megadása. Lehet kevesebb is, de az a pontosság rovására menne. Tehát szerintem maradj az elsõ tanácsomnál, az objectes ellenõrzésnél.
new Float:X,Float:Y,Float:Z,vehid;GetVehiclePos(vehid,X,Y,Z);
CMD:lekerdez(playerid, params[]){ new currentveh; new Float:z_rot; new message[40]; currentveh = GetPlayerVehicleID(playerid); GetVehicleZAngle(currentveh, z_rot); format(message, sizeof(message), \"A Jármû Z forgás tengely értéke: %.0f\", z_rot); SendClientMessage(playerid, 0xFFFFFFFF, message); return 1;}
new Float:ZR;GetVehicleZAngle(currentveh, ZR);
Egyébként mind2-nknek van egy ötlete rá, nincs ezzel semmi baj
Az úgy nem jó. Mert ha a kocsi Z tengelyû rotációja nem 0, akkor máris más lesz a eredmény. Ha pedig pont 180 fokkal van elfordulva a kocsi, akkor úgy fogja érzékelni a rendszer, hogy a játékos a csomagtartónál áll, miközben a motorháztetõnél van, a kocsi másik felén.[/quote]
Ezzel pontosan azt csinálod... new Float:X,Float:Y,Float:Z,vehid;GetVehiclePos(vehid,X,Y,Z); De az bonyolult megoldás, és szükséges hozzá minimum 360 lehetõség megadása. Lehet kevesebb is, de az a pontosság rovására menne. Tehát szerintem maradj az elsõ tanácsomnál, az objectes ellenõrzésnél. [/quote]az meg nem mûködik...mivel nem az aktuális pozícióját adja vissza hanem azt ahol létrehoztad...