-
Eléggé sokszor volt rá szükségem, viszont soha nem találtam egy megfelelõen mûködõt ezért kénytelen voltam íni egyet. Igazából nem sok idõ összedobni egy ilyet viszont szerintem nagyon sokszor szükség van rá.
Igazából nem tároló formájában mutatom be hanem inkább magyarázok mellé de ettõl nem leírás hanem útmutató.
Elõször is a kód egyben így néz ki:
new Float:kocsx,Float:kocsy,Float:kocsz;
new talalat = 0; //Köszönöm a bug jelentését!
for(new i = 0; i < MAX_VEHICLES; i++)
{
GetVehiclePos(i,kocsx,kocsy,kocsz);
if(IsPlayerInRangeOfPoint(playerid, 3.0, kocsx,kocsy,kocsz))
{
talalat++;
RepairVehicle(i);
if(talalat >= 1)
{
break;
}
}
else
{
SendClientMessageToAll(-1, \"Jármûkeresésre nincs találat\");
}
}
Szedjük darabokra:
new Float:kocsx,Float:kocsy,Float:kocsz;
3darab lebegõpontos (mivel a pozíció nem minden esetben egész szám) változó, amibe lekérdezzük a pozícióját a jármûnek.
for(new i = 0; i < MAX_VEHICLES; i++)
Ciklus végigfut az összes jármûvön.
if(IsPlayerInRangeOfPoint(playerid, 3.0, kocsx,kocsy,kocsz))
Ha a játékos 3 egység távolságra van a jármûtõl akkor:
RepairVehicle(i);
Megjavítjuk a jármûvet. Fontos megjegyezni, hogy az \"i\" változó itt megegyezik a jármûid-vel!
else
Amennyiben nincs találat:
SendClientMessageToAll(-1, \"Jármûkeresésre nincs találat\");
Küldünk egy kliens üzenetet.
Végülis ennyi lenne. Ez egy rövid kód.
I hope they let us inside.
-
De ez az összes 3 méteres sugárban lévõ kocsit megjavítja nem?
-
De ez az összes 3 méteres sugárban lévõ kocsit megjavítja nem?
Igen.
-
De ez az összes 3 méteres sugárban lévõ kocsit megjavítja nem?
Hmm ez egy jó felvetés. Erre nem gondoltam hamarosan rakok ki rá egy bugfixet.
Bugfix megtörtént.
-
Még mindig nem a legközelebbi, hanem 3 méteres sugárban a legkisebb ID-jû. Mi van ha nem playerhez akarod nézni? És ha a legközelebbi kocsi 3m-en kívül van? :D
-
Még mindig nem a legközelebbi, hanem 3 méteres sugárban a legkisebb ID-jû. Mi van ha nem playerhez akarod nézni? És ha a legközelebbi kocsi 3m-en kívül van? :D
Egy viszonyítási pont és egy viszonyítási távolság szükséges. Persze a kódból kiderül, hogy ezek módosíthatóak.
-
Hát Gentleman ezt egy kicsit más képp kéne megírni.De attól függetlenül nem rossz!
Nem kéne \'talalat\' változó, egyszerû, az elsõnél megállítod, így:
new Float:kocsx,Float:kocsy,Float:kocsz;
for(new i = 0; i < MAX_VEHICLES; i++)
{
GetVehiclePos(i,kocsx,kocsy,kocsz);
if(IsPlayerInRangeOfPoint(playerid, 3.0, kocsx,kocsy,kocsz))
{
RepairVehicle(i);
break;
}
else
{
SendClientMessageToAll(-1, \"Jármûkeresésre nincs találat\");
}
}
Plusz ez nagyon hibás kód mert, mondjuk van 1500 kocsi a szerómon ésha nemvagyok egy melllett se akkor 1500-szor kiírja h jármûkeresésre nincs találat.
Szerintem így kéne:
new Float:lastdist=465456.0000,lastvehicle=INVALID_VEHICLE_ID;
for(new i; i < MAX_VEHICLE; i++)
{
if(i!=INVALID_VEHICLE_ID)
{
new Float:x,Float:y,Float:z;
GetVehiclePos(i,x,y,z);
new Float:nowdist=GetPlayerDistanceFromPoint(playerid,x,y,z);
if(nowdist<lastdist)
{
lastdist=nowdist;
lastvehicle=i;
}
}
}
if(lastvehicle!=INVALID_VEHICLE_ID)
{
RepairVehicle(lastvehicle);
} else {
SendClientMessage(playerid,-1,\"Nincs a közeledben egy jármû sem!\");
}
-
Vagy ha i==MAX_VEHICLES akkor kiírni, hogy nincs találat.
-
Ez így egész jó
[pawn]new Float:lastdist=465456.0000,lastvehicle=INVALID_VEHICLE_ID;
for(new i; i < MAX_VEHICLE; i++)
{
if(i!=INVALID_VEHICLE_ID)
{
new Float:x,Float:y,Float:z;
GetVehiclePos(i,x,y,z);
new Float:nowdist=GetPlayerDistanceFromPoint(playerid,x,y,z);
if(nowdist<lastdist)
{
lastdist=nowdist;
lastvehicle=i;
}
}
}
if(lastvehicle!=INVALID_VEHICLE_ID)
{
RepairVehicle(lastvehicle);
} else {
SendClientMessage(playerid,-1,\"Nincs a közeledben egy jármû sem!\");
}
[/pawn]
csak azt nem tudom hogy az i változó értéke mikor lesz INVALID_VEHICLE_ID értékû hogy kell ez az ellenõrzés:
[pawn]
if(i!=INVALID_VEHICLE_ID)
[/pawn]
?
-
Amikor nem létezõ kocsin fut át, nem?
-
Ez szerintem a legegyszerûbb, bár módosítani még mindig lehet rajta, de én így használom :D
Eredetileg egy módban találtam, elég jól átszerkesztettem.
#define IsValidVehicle(%1) \\
(!!GetVehicleModel(%1))
#define FLOAT_INFINITY (Float:0x7F800000) // Streamer plugin 2.6 include-ba benenvan..
GetVehicleWithinDistance(playerid, Float:x1, Float:y1, Float:z1, Float:dist, &veh)
{
new
Float:vDist = FLOAT_INFINITY;
for(new i = 1; i < MAX_VEHICLES; i++)
{
if(!IsValidVehicle(i)) continue;
if(GetPlayerVehicleID(playerid) != i)
{
vDist = GetVehicleDistanceFromPoint(i, x1, y1, z1);
if(vDist < dist)
{
veh = i;
dist = vDist;
}
}
}
}
else if(newkeys == 640) // Submission + Space
{
new
vehicle;
vID = GetPlayerVehicleID(playerid);
GetPlayerPos(playerid, X, Y, Z );
GetVehicleWithinDistance(playerid, X, Y, Z, 30.0, vehicle);
if(vehicle)
{
ShowWelcome(playerid, \"~p~Trainer ~y~~h~felkapcsolva~w~!\", .time = 750);
AttachTrailerToVehicle(vID, vehicle);
}
}
-
Am 2 féle módon lehet ellenõrizni, hogy valós-e .. kocsi nem?A kurta megoldás a meg az enyém nem?:D
-
Amikor nem létezõ kocsin fut át, nem?
Hát nem.
Lefuttatsz egy for ciklust amiben decimális értékben egyesével növeled az i változó értékét (i++) egészen a MAX_VEHICLES értékig (2000) pontosan 1999-ig.
Akkor az i változó értéke soha nem lesz INVALID_VEHICLE_ID (0xFFFF) ami 65535.
Érthetõ?
Edit:
Írtam egy változatot:
[pawn]//native IsValidVehicle(vehicleid); // Kifelejtett native funkció a függvénykönyvtárakból
stock
GetVehicleWithinDistance(playerid)
{
new
Float:temp_distance = Float:0x7F800000,
Float:distance = 0.0,
temp_vehicle = INVALID_VEHICLE_ID,
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid, x, y, z);
for(new vehicleid = 1; vehicleid <= MAX_VEHICLES; vehicleid++)
{
if(IsValidVehicle(vehicleid))
{
distance = GetVehicleDistanceFromPoint(vehicleid, x, y, z);
if(temp_distance > distance)
{
temp_distance = distance;
temp_vehicle = vehicleid;
}
}
}
return temp_vehicle; // return legközelebb lévõ jármû azonosítószáma (vehicleid)
}[/pawn]
Tesztelésre használt parancs:
[pawn]CMD:distance(playerid)
{
new
vehicleid = GetVehicleWithinDistance(playerid);
if(vehicleid == INVALID_VEHICLE_ID) return SendClientMessage(playerid, -1, \"Nincs jármû a szerveren.\");
new
str[128];
format(str, sizeof str, \"vehicleID: %d\", vehicleid);
SendClientMessage(playerid, -1, str);
new
Float:x,
Float:y,
Float:z;
GetVehiclePos(vehicleid, x, y, z);
SetPlayerPos(playerid, x, y, z + 2);
return 1;
}[/pawn]
-
Ami nekem itt tetszik nagyon, hogy mindenkit megmozgatott a kód és mennyi fajta logikai megoldás van.
-
Jah oké, kössz Zsolesszka. :D
-
Ami nekem itt tetszik nagyon, hogy mindenkit megmozgatott a kód és mennyi fajta logikai megoldás van.
Még nekem van egy másik ötletem mivel az átírt kódban nincs olyan lehetõség hogy meghatározott távolságban kell lennie a legközelebbi jármûnek ezért lehetne egy visszatérés erre az adatra is rögtön átírom, és közlöm.
Kész is:
[pawn]/*
floatcmp(2.0, 2.0) -> 0
floatcmp(1.0, 2.0) -> -1
floatcmp(2.0, 1.0) -> 1
*/
CMD:distance(playerid)
{
new
Float:distance,
vehicleid = GetVehicleWithinDistance(playerid, distance);
if(vehicleid == INVALID_VEHICLE_ID) return SendClientMessage(playerid, -1, \"Nincs jármû a szerveren.\");
if(floatcmp(15.0, distance) == -1) return SendClientMessage(playerid, -1, \"Nem vagy elég közel egy jármûhöz se.\");
new
str[128];
format(str, sizeof str, \"vehicleID: %d\", vehicleid);
SendClientMessage(playerid, -1, str);
new
Float:x,
Float:y,
Float:z;
GetVehiclePos(vehicleid, x, y, z);
SetPlayerPos(playerid, x, y, z + 2);
return 1;
}
//native IsValidVehicle(vehicleid); // Kifelejtett native funkció a függvénykönyvtárakból
stock
GetVehicleWithinDistance(playerid, &Float:dist = 0.0)
{
new
Float:temp_distance = Float:0x7F800000,
Float:distance = 0.0,
temp_vehicle = INVALID_VEHICLE_ID,
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid, x, y, z);
for(new vehicleid = 1; vehicleid <= MAX_VEHICLES; vehicleid++)
{
if(IsValidVehicle(vehicleid))
{
distance = GetVehicleDistanceFromPoint(vehicleid, x, y, z);
if(temp_distance > distance)
{
temp_distance = distance;
temp_vehicle = vehicleid;
}
}
}
dist = temp_distance;
return temp_vehicle; // return legközelebb lévõ jármû azonosítószáma (vehicleid)
}[/pawn]
-
LOL! Van kifelejtett native funkcio a függvénykönyvtárakból?Vagy az csak rejtett ink nem?
-
LOL! Van kifelejtett native funkcio a függvénykönyvtárakból?Vagy az csak rejtett ink nem?
Szerintem inkább kifelejtett, én már több, mind egy éve ismerem és jól mûködik.
Bár én a (!!GetVehicleModel(vehicleid)) megoldást használom.
-
De wikirõl is kifelejtették? Itt valami gyanús.Már van IsValidObject meg ilyesmik akkor ez miért ne lenne?Érted sztem direkt kihagyták vagy vmi.