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);
x = CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
IsPlayerInDynamicArea(playerid, x, recheck = 0);
Ha jól tudom.
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.
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