GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => A témát indította: Gentleman - 2012. február 28. - 21:34:25

Cím: Legközelebbi jármû lekérdezése
Írta: Gentleman - 2012. február 28. - 21:34:25
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.

Cím: Legközelebbi jármû lekérdezése
Írta: 1ST_Chr - 2012. február 29. - 14:54:36
De ez az összes 3 méteres sugárban lévõ kocsit megjavítja nem?
Cím: Legközelebbi jármû lekérdezése
Írta: Norby - 2012. február 29. - 14:55:58
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.
Cím: Legközelebbi jármû lekérdezése
Írta: Gentleman - 2012. február 29. - 14:59:00
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.
Cím: Legközelebbi jármû lekérdezése
Írta: rhassi - 2012. február 29. - 16:37:10
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
Cím: Legközelebbi jármû lekérdezése
Írta: Gentleman - 2012. február 29. - 16:43:54
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.
Cím: Legközelebbi jármû lekérdezése
Írta: lackos888 - 2012. február 29. - 16:52:18
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!\");
}
Cím: Legközelebbi jármû lekérdezése
Írta: 1ST_Chr - 2012. február 29. - 17:13:07
Vagy ha i==MAX_VEHICLES akkor kiírni, hogy nincs találat.
Cím: Legközelebbi jármû lekérdezése
Írta: Zsolesszka - 2012. február 29. - 18:07:29
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]
?
Cím: Legközelebbi jármû lekérdezése
Írta: lackos888 - 2012. február 29. - 18:12:05
Amikor nem létezõ kocsin fut át, nem?
Cím: Legközelebbi jármû lekérdezése
Írta: kurta999 - 2012. február 29. - 18:12:47
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);
      }
   }
Cím: Legközelebbi jármû lekérdezése
Írta: lackos888 - 2012. február 29. - 18:16:16
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
Cím: Legközelebbi jármû lekérdezése
Írta: Zsolesszka - 2012. február 29. - 18:42:31
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]
Cím: Legközelebbi jármû lekérdezése
Írta: Gentleman - 2012. március 01. - 13:58:59
Ami nekem itt tetszik nagyon, hogy mindenkit megmozgatott a kód és mennyi fajta logikai megoldás van.
Cím: Legközelebbi jármû lekérdezése
Írta: lackos888 - 2012. március 01. - 14:27:57
Jah oké, kössz Zsolesszka. :D
Cím: Legközelebbi jármû lekérdezése
Írta: Zsolesszka - 2012. március 01. - 21:36:29
Idézetet írta: Gentleman date=1330606739\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"17722\" data-ipsquote-contentclass=\"forums_Topic
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]
Cím: Legközelebbi jármû lekérdezése
Írta: lackos888 - 2012. március 03. - 12:57:10
LOL! Van kifelejtett native funkcio a függvénykönyvtárakból?Vagy az csak rejtett ink nem?
Cím: Legközelebbi jármû lekérdezése
Írta: kurta999 - 2012. március 04. - 11:17:41
Idézetet írta: lackos888 date=1330775830\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"17722\" data-ipsquote-contentclass=\"forums_Topic
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.
Cím: Legközelebbi jármû lekérdezése
Írta: lackos888 - 2012. március 04. - 11:34:38
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.