több féleképpen meg lehet oldani. A legjobb megoldás talán az hogyha.
minden tárgynak egy tömb de nem bool változó hanem rendes változó mivel lehet hogy valahol szükség van arra hogy több tárgyad is lehessen.
Mivel látom nemigazán vagy képbe a programtervezéssel.
A lényeg hogy minden elgondolást helyettesítünk valamivel.
Vascsõ (ha nem objectre gondoltál hanem csak vascsõ azt kész): Vascsõ nincs a pawnba ^^ ezért kell valamivel helyettesíteni mi lesz az? Hát egy változó.
A változó egy számot tárol. Több típusa van. Pawnban nem túl bonyolult van
bool: ez lehet igaz és hamis értékû. létrehozni így lehet: new bool:Valtozo;
Float: Ez a nem egész szám (Float jelentése Lebegés ami a Lebegõpontos számábrázolásból jött ilyen pl 5.25 vagy -6.973) létrehozni így lehet: new Float:Valtozo;
int aminek nincs elõtagja ez az egész szám létrehozni így lehet: new Valtozo;
Ebbõl a háromból lehet olyat létrehozni hogy tömb.
A tömb sok változó egymás mellett amiken belül úgynevezett indexekkel határozzuk meg azt hogy konkrétan melyik változót akarjuk használni a sokból a tömbön belül.
(sok helyen ezért van a for ciklusokban i változó ez az index rövidítése) nah erre példa: new Tomb[MAX_PLAYERS]; ez egy tömb lesz mivel nem raktunk elé elõtagot így egész szám és a MAX_PLAYERS meg megadja hány elemû a tömb. általában ez 500 ha nem definiálod újra a MAX_PLAYERS-t
Na most térjünk vissza a vascsõre.
hogy akarod? lehessen több belõle egy játékosnál vagy ne.
Ha azt akarod lehessen több. Melyik változótipus tûnik a legmegfelelõbbnek? Nyilván az int.
Így létrehozunk egy tömböt pl:
new Vascso[MAX_PLAYERS];
Mi kell még? Kellmég valami ahol meg tudja venni a vascsövet. pawnba ültetve az elképzelést. A változó értékét módosítani tudja.
legyen ez most a példa egyszerüsége kedvééért egy parancs
CMD:vascso(playerid,params[])
{
Vascso[playerid]++; //ezzel növeltem a vascsõ tömb adott játékosára vonatkozó változót egyel.
SendClientMessage(playerid,-1,\"Vettél egy csövet. Ingyen mivel most ez csak egy példa.\");
return 1;
}
na mi hiányzik még az elgondolásból? a /leüt parancs feltételezem objectet akarsz létrehozni neki.
Most el kell döntened hogy pontosan mit is szeretnél.
Egy játékos egyszerre max egy csövet üthessen le és kilépéskor eltünjön? //ez technikailag a legegyszerûbb
Egy játékos akár több csövet is leüthessen de legyen egy felsõ határa ennek pl játékosonként max 10 //ez már bonyolultabb valamivel de nem sokkal
Egy játékos akárhány csövet le tudjon ütni felsõ határ nélkül //itt már bonyolodik a helyzet be jön a képbe a GVar plugin
Ha az elõzõ háromból választottál már csak azt kell eldöntened hogy akarod e hogy ezek kilépés után megmaradjanak e.
Mert ha nem akarod hogy megmaradjanak mindent elég csak a játékos ID re tárolni mivel a kilépésig folyamatosan hozzá lehet rendelni az objectet a játékoshoz. hiszen tudod hogy az X objectet a playerid játékos rakta le.
Ha el akarod öket menteni akkor dönthetsz hogy hozzá akarod e rendelni ezeket a játékoshoz vagy nem.
Tehát tudni akarod hogy a fa melletti csövet Józsi ütötte le vagy lényegtelen.
Itt viszont már el érkeztünk oda hogy kelleni fog vagy valami fájlrendszer vagy mysql ami szerintem egyenlõre sok lenne.
Feltételezem a legegyszerûbb megoldást
Egy játékos egyszerre csak egy csövet üthet le és az kilépéskor eltünik.
így kell egy Tömb ami tárolja az object id-jét
new LerakottCso[MAX_PLAYERS];
és maga a leut parancs:
CMD:leut(playerid,params[])
{
if(LerakottCso[playerid]) return SendClientMessage(playerid,-1,\"Hiba: Már leraktál egy csövet\");
if(!Vascso[playerid]) return SendClientMessage(playerid,-1,\"Hiba: Nincs csöved.\");
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid,X,Y,Z);
LerakottCso[playerid] = CreateObject(/*stb stb ezt gondolom megoldod, az X,Y,Z koordinátára létrehozod az objectet*/);
Vascso[playerid]--;//Csökkentjük egyel a változó értékét.
return 1;
}
Ezután már csak kilépésnél törölni kell ha van OnPlayerDisconnect alatt:
if(LerakottCso[playerid]){
DestroyObject(LerakottCso[playerid]);
LerakottCso[playerid] = 0;//ha törölted az objectet mindig 0-zni kell az értéket különben a késöbbiekben a scripted ugy hiszi majd hogy még mindig létezik az object ez meg kavarodást okozhat.
Vascso[playerid] = 0;//nullázzuk a játékos vascsöveit.
}
Ha többet is le akarsz ütni egyszerre. Szimulálni kell játékosonként mondjuk egy 10 elemû listát amit a legegyszerûbben úgy tudsz megtenni hogy:
hozzá adunk a LerakottCso tömbhöz még egy dimenziót így lesz:
new LerakottCso[MAX_PLAYERS][10];
ilyen kis számoknál nem nagyon számít még az optimalizáltság ezért nem bonyolodnék bele abba hogy sorba legyenek rendezve az elemek a tömb elejére.
Na most a következõ probléma amibe beleütközhetsz hogyaz object létrehozásánál (/lerak parancsnál) honnan tudjam melyik indexre rakjam az objectet a 10bõl?
erre írunk egy külön függvényt:
stock UresLerakottCsoID(playerid)
{
for(new i; i < 10; i++)
{
if(LerakottCso[playerid] == 0) return i;
}
return -1;
}
Így a parancs annyiban változik hogy:
CMD:leut(playerid,params[])
{
if(!Vascso[playerid]) return SendClientMessage(playerid,-1,\"Hiba: Nincs csöved.\");
new szabadcsoid = UresLerakottCsoID(playerid);
if(szabadcsoid == -1) return SendClientMessage(playerid,-1,\"Hiba: Elérted a maximálisan lerakható csövek számát\");
Vascso[playerid]--;//csökkentettem a változó értékét egyel.
new Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid,X,Y,Z);
LerakottCso[playerid] = CreateObject(/*stb stb*/);
}
Kilépésnél pedig:
if(LerakottCso[playerid]){
for(new i; i < 10; i++)
{
if(LerakottCso[playerid])
{
DestroyObject(LerakottCso[playerid]);
LerakottCso[playerid] = 0;
}
}
}
Vascso[playerid] = 0;//nullázzuk a játékos vascsöveit.
Dupla hozzászólás automatikusan összefûzve. ( 2013. augusztus 26. - 02:38:10 )
bocsi hogy sz*rul vannak a tabulátorok nem volt kedvem pawnba megírni.