Szerző Téma: tárgy hozzá adás majd elvétele![javítva]  (Megtekintve 799 alkalommal)

tárgy hozzá adás majd elvétele![javítva]
« Dátum: 2013. Augusztus 25. - 00:33:15 »
0 Show voters
Hellotok segítséget szeretnék kérni , ehez:
Azt szeretném hogy a player tesz valamit pl: kapál kap +1 valamit és amikor megkapta ezt a tárgyat vagy mit akkor oda megy egy adott helyre beírja egy parancsot valami történik és elveszi tõle a tárgyat,és mivel nincs nála olyan tárgy ezért azt a parancsot nem tudja használni!
Ha nem érted akkor
cmd/kapal +1tárgy [tárgy=+1]
majd
cmd/kapunyit -1tárgy [tárgy=-1]
ujra bírja
cmd/kapunyit nem fogja kinyitni mert nem kapált és a [tárgy=0]
« Utoljára szerkesztve: 2013. Augusztus 26. - 11:10:39 írta rcsbakos2 »

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
tárgy hozzá adás majd elvétele![javítva]
« Válasz #1 Dátum: 2013. Augusztus 25. - 10:40:25 »
0 Show voters

new bool: targy[MAX_PLAYERS];
CMD:kapal(playerid, params[])
{
targy[playerid] = true; // Ezt ha gondolod mentheted is
SendClientMessage(playerid, -1, \"Kaptál egy tárgyat, mehetsz a kapuhoz\");
return 1;
}
CMD:kapu(playerid,params[])
{
  if(targy[playerid] == true)
   {
   SendClientMessage(playerid, -1, \"Van tárgyad ezért használhatod ezt a parancsot\");
   }
   else
   {
   SendClientMessage(playerid, -1, \"Nincs tárgyad ezért nem használhatod ezt a parancsot\");
   }
   return 1;
}

tárgy hozzá adás majd elvétele![javítva]
« Válasz #2 Dátum: 2013. Augusztus 25. - 11:41:52 »
0 Show voters
Köszönöm SnooP!
És hogy tudom megoldani úgy mint a boltnál amikor veszek valamit?
pl.: veszek egy vas csövet akkor azt lementi nekem,majd azt /leütparancsnál megmarad a tárgy((vascsõ))
azt is new bool: vascso[MAX_PLAYERS]; hozzam létre?:O

tárgy hozzá adás majd elvétele![javítva]
« Válasz #3 Dátum: 2013. Augusztus 26. - 02:11:53 »
0 Show voters
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.
« Utoljára szerkesztve: 2013. Augusztus 26. - 02:44:02 írta hegdavid95 »

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
tárgy hozzá adás majd elvétele![javítva]
« Válasz #4 Dátum: 2013. Augusztus 26. - 07:36:04 »
0 Show voters
[mod]Téma neve mindig a problémára utaljon, kapsz 10 órát a szerkesztéshez![/mod]

tárgy hozzá adás majd elvétele![javítva]
« Válasz #5 Dátum: 2013. Augusztus 26. - 11:45:48 »
0 Show voters
Az ilyen több tárgyas dolgokat hasonlóképpen szokás megoldani mint a regisztrációs adatokat.
Tehát létrehozol egy felsorolást (enum) a tárgyak neveivel, és egy változót minden egyes játékosnak [MAX_PLAYERS] a létrehozott felsorolással.
 
enum ITEMS
{
cso,
tegla,
mag
};
new
     targyak[MAX_PLAYERS][iTEMS];

 
Majd növeled illetve csökkented az értéküket ha megszerzi vagy eladja/leteszi a tárgyat.
 

targyak[playerid][cso]++; // Egyet hozzá ad.
targyak[playerid][cso]--;  // Egyet levon.

 
Majd ellenõrzésként megkérdezed van-e nála az adott tárgyból elegendõ mennyiség.
 
if(targyak[playerid][cso] > 0) Send..( , ,\"Van nálad csõ.\");
« Utoljára szerkesztve: 2013. Augusztus 26. - 11:47:19 írta ɐʞzssǝlosz »

tárgy hozzá adás majd elvétele![javítva]
« Válasz #6 Dátum: 2013. Augusztus 26. - 12:49:09 »
0 Show voters
rendben nagyon köszönöm srácok!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal