Szerző Téma: Legközelebbi jármû lekérdezése  (Megtekintve 3037 alkalommal)

Legközelebbi jármû lekérdezése
« Dátum: 2012. február 28. - 21:34:25 »
0 Show voters
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.

« Utoljára szerkesztve: 2012. március 03. - 13:47:19 írta Norby »

Legközelebbi jármû lekérdezése
« Válasz #1 Dátum: 2012. február 29. - 14:54:36 »
0 Show voters
De ez az összes 3 méteres sugárban lévõ kocsit megjavítja nem?

Nem elérhető Norby

  • 1575
    • Profil megtekintése
Legközelebbi jármû lekérdezése
« Válasz #2 Dátum: 2012. február 29. - 14:55:58 »
0 Show voters
Idézetet írta: 1ST_Chr date=1330523676\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"17722\" data-ipsquote-contentclass=\"forums_Topic
De ez az összes 3 méteres sugárban lévõ kocsit megjavítja nem?
 
Igen.

Legközelebbi jármû lekérdezése
« Válasz #3 Dátum: 2012. február 29. - 14:59:00 »
0 Show voters
Idézetet írta: 1ST_Chr date=1330523676\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"17722\" data-ipsquote-contentclass=\"forums_Topic
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.
« Utoljára szerkesztve: 2012. február 29. - 15:00:46 írta Gentleman »

Nem elérhető rhassi

  • 624
    • Profil megtekintése
Legközelebbi jármû lekérdezése
« Válasz #4 Dátum: 2012. február 29. - 16:37:10 »
0 Show voters
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

Legközelebbi jármû lekérdezése
« Válasz #5 Dátum: 2012. február 29. - 16:43:54 »
0 Show voters
Idézetet írta: rhassi date=1330529830\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"17722\" data-ipsquote-contentclass=\"forums_Topic
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.

Legközelebbi jármû lekérdezése
« Válasz #6 Dátum: 2012. február 29. - 16:52:18 »
0 Show voters
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!\");
}
« Utoljára szerkesztve: 2012. február 29. - 16:54:50 írta lackos888 »

Legközelebbi jármû lekérdezése
« Válasz #7 Dátum: 2012. február 29. - 17:13:07 »
0 Show voters
Vagy ha i==MAX_VEHICLES akkor kiírni, hogy nincs találat.

Legközelebbi jármû lekérdezése
« Válasz #8 Dátum: 2012. február 29. - 18:07:29 »
0 Show voters
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]
?

Legközelebbi jármû lekérdezése
« Válasz #9 Dátum: 2012. február 29. - 18:12:05 »
0 Show voters
Amikor nem létezõ kocsin fut át, nem?

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
Legközelebbi jármû lekérdezése
« Válasz #10 Dátum: 2012. február 29. - 18:12:47 »
0 Show voters
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);
      }
   }
« Utoljára szerkesztve: 2012. február 29. - 18:14:30 írta kurta999 »

Legközelebbi jármû lekérdezése
« Válasz #11 Dátum: 2012. február 29. - 18:16:16 »
0 Show voters
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

Legközelebbi jármû lekérdezése
« Válasz #12 Dátum: 2012. február 29. - 18:42:31 »
0 Show voters
Idézetet írta: lackos888 date=1330535525\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"17722\" data-ipsquote-contentclass=\"forums_Topic
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]
« Utoljára szerkesztve: 2012. február 29. - 20:57:37 írta ɐʞzssǝlosz »

Legközelebbi jármû lekérdezése
« Válasz #13 Dátum: 2012. március 01. - 13:58:59 »
0 Show voters
Ami nekem itt tetszik nagyon, hogy mindenkit megmozgatott a kód és mennyi fajta logikai megoldás van.

Legközelebbi jármû lekérdezése
« Válasz #14 Dátum: 2012. március 01. - 14:27:57 »
0 Show voters
Jah oké, kössz Zsolesszka. :D

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal