Szerző Téma: csak egy területen belül lehetséges parancs (hogyan?)  (Megtekintve 1371 alkalommal)

csak egy területen belül lehetséges parancs (hogyan?)
« Dátum: 2014. november 10. - 12:43:58 »
0 Show voters
Hali.
Azt hogy kell, hogy pl van egy négyzet alakú terület (pl gangzone) és csak azon belül lehessen parancsot használni?
(Pontosabban nem a kör alakú OnPlayerRangeOfPoint-ra gondolok hanem hogy pl csak gangzonen belül lehessen)

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
csak egy területen belül lehetséges parancs (hogyan?)
« Válasz #1 Dátum: 2014. november 10. - 15:27:35 »
0 Show voters
Használd ki a Streamer plugin lehetőségeit. Létrehozod a területet pl. CreateDynamicRectangle-el, majd ellenőrzöd, hogy benne van e, IsPlayerInDynamicArea-el. Ezt ugye a parancsba építed és ha benne tartózkodik, a parancs teszi a dolgát, máskülönben kiír a felhasználónak egy hibaüzenetet. Így feleslegesen gangzonet sem kell használod, az nem erre való, hanem térkép színezésre.
 
native CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicCylinder(Float:x, Float:y, Float:minz, Float:maxz, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicSphere(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicCuboid(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);
native DestroyDynamicArea(areaid);
native IsValidDynamicArea(areaid);
native GetDynamicPolygonPoints(areaid, Float:points[], maxpoints = sizeof points);
native GetDynamicPolygonNumberPoints(areaid);
native TogglePlayerDynamicArea(playerid, areaid, toggle);
native TogglePlayerAllDynamicAreas(playerid, toggle);
native IsPlayerInDynamicArea(playerid, areaid, recheck = 0);
native IsPlayerInAnyDynamicArea(playerid, recheck = 0);
native IsAnyPlayerInDynamicArea(areaid, recheck = 0);
native IsAnyPlayerInAnyDynamicArea(recheck = 0);
native GetPlayerDynamicAreas(playerid, areas[], maxareas = sizeof areas);
native GetPlayerNumberDynamicAreas(playerid);
native IsPointInDynamicArea(areaid, Float:x, Float:y, Float:z);
native IsPointInAnyDynamicArea(Float:x, Float:y, Float:z);
native AttachDynamicAreaToObject(areaid, objectid, type = STREAMER_OBJECT_TYPE_DYNAMIC, playerid = INVALID_PLAYER_ID);
native AttachDynamicAreaToPlayer(areaid, playerid);
native AttachDynamicAreaToVehicle(areaid, vehicleid);

csak egy területen belül lehetséges parancs (hogyan?)
« Válasz #2 Dátum: 2014. november 10. - 16:05:08 »
0 Show voters
Eddig értem köszi, de hogy határoz meg az areaid-t? Ahogy berakom sorba automata számozza 0tól vagy 1től kezdve vagy mi?

Nem elérhető gbr333

  • 670
    • Profil megtekintése
csak egy területen belül lehetséges parancs (hogyan?)
« Válasz #3 Dátum: 2014. november 10. - 16:16:27 »
0 Show voters
x = CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
IsPlayerInDynamicArea(playerid, x, recheck = 0);

 
Ha jól tudom.
« Utoljára szerkesztve: 2014. november 10. - 16:40:19 írta Dfoglalo »

Nem elérhető krisk

  • 2380
    • Profil megtekintése
csak egy területen belül lehetséges parancs (hogyan?)
« Válasz #4 Dátum: 2014. november 10. - 16:34:53 »
+2 Show voters
Persze, ha tudsz matekozni, akkor írhatsz magadnak rá saját fgv-t is.
Egy téglalapot meghatároz két szélső pontja, a kettő pont közé húzott átló meghatározza a téglalap egyik átlóját. A téglalapra teljesül az az egyenlőtlenség, hogy:
minx <= x <= maxx,
miny <= y <= maxy.
Tehát:
 

stock IsPointWithinRectangle(Float:x, Float:y, Float:minx, Float:miny, Float:maxx, Float:maxy)
{
    return( (minx <= x) && (x <= maxx) && (miny <= y) && (y <= maxy) );
}

 
Egy körnél pedig a kör algebrai egyenletét figyelembe véve egy (x,y) pont akkor és csak akkor van rajta a (cx,cy) középpontú, r sugarú körön, ha:
(x-cx)^2 + (y-cy)^2 <= r^2.
Ekkor:
 

stock IsPointWithinCircle( Float:x, Float:y, Float:cx, Float:cy, Float:r )
{
    return( VectorSize(x-cx, y-cy, 0) <= r^2 );
}

 
Ha ezekhez hozzáadsz egy z koordinátát, akkor egy téglatestet és egy gömböt kapsz. Ez jól jöhet ha pl. nincs fent a streamer plugin vagy nem használod, és nem akarod csak ezért feltelepíteni.
« Utoljára szerkesztve: 2014. november 10. - 16:41:23 írta Dfoglalo »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
csak egy területen belül lehetséges parancs (hogyan?)
« Válasz #5 Dátum: 2014. november 10. - 16:39:47 »
0 Show voters
Idézetet írta: TylerWish date=1415631908\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"51342\" data-ipsquote-contentclass=\"forums_Topic
Eddig értem köszi, de hogy határoz meg az areaid-t? Ahogy berakom sorba automata számozza 0tól vagy 1től kezdve vagy mi?
 
Automatikusan számoz mindent. Az areakat, az objecteket, a járműveket, mindent. Szóval ha csak egy darab areat kreálsz, akkor 0, vagy 1 lesz az ID-je. De az ID-t lekérheted úgy is, ha egy változónak értékül adod magát az area létrehozó függvényt, ezzel létre is hozva az areat. Mint ahogyan Rolux is írta...
...azzal a különbséggel, hogy véletlenül CreateDynamicCircle-t írt... Na jó, nem ez a nagy durranás, hanem az, hogy az nem lesz megfelelő, mert neki pont, hogy nem kör kell.
 

(Pontosabban nem a kör alakú OnPlayerRangeOfPoint-ra gondolok hanem hogy pl csak gangzonen belül lehessen)
 
[/quote]
Ezért is írtam a példámban a téglalapot, a CreateDynamicRectangle-t. Ha pedig a témanyitónak szavak alapján nem megy, akkor itt van szájbarágósan - bár így nehezebben fogja megtanulni:
 
 // Globális területen deklarálod
new var = CreateDynamicRectangle();
// A parancsban ellenőrzöd
if(!IsPlayerInDynamicArea(playerid, var)) return SendClientMessage(playerid, 0xFF0000FF, \"Itt nem használhatod ezt a parancsot!\");
// A parancs többi része, amit csinálna az a parancs, ha a zónában van a játékos

 


Krisk, ritkán van olyan, hogy valaki ne használná a Streamer plugint és ez egy eléggé kényelmes megoldás. De ha az ember kicsit számolgat, az sosem árt :D
« Utoljára szerkesztve: 2014. november 10. - 16:43:36 írta Dfoglalo »

csak egy területen belül lehetséges parancs (hogyan?)
« Válasz #6 Dátum: 2014. november 10. - 20:01:14 »
0 Show voters
Idézetet írta: Dfoglalo date=1415633987\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"51342\" data-ipsquote-contentclass=\"forums_Topic
Ha pedig a témanyitónak szavak alapján nem megy, akkor itt van szájbarágósan - bár így nehezebben fogja megtanulni:
 
Nem vagyok kezdő scripter, igaz régen scripteltem utoljára, viszont ezt nem tudtam, meg is értettem, nagyon szépen köszönöm!
Zárom!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal