Szerző Téma: változón belüli összes paraméterre vonatkozóan...  (Megtekintve 813 alkalommal)

Nem elérhető buci11

  • 502
    • Profil megtekintése
változón belüli összes paraméterre vonatkozóan...
« Dátum: 2013. július 10. - 07:06:17 »
0 Show voters
Üdv. Szóval létrehoztam egy ilyen változót aszerveremre amivel a munka szolgálatot jelölöm
 
WorkDuty[MAX_WORKS][MAX_PLAYERS]

 
a MAX_WORKS az az adat ami éppen az adott munkát jelöli a játékosra vonatkozóan. Szóval mikor belép a szolgálatba ugye beállítom hogy hanyas munkaszolgálatot kapja. De hogy lehetne esetleg azt megoldani hogyha kilép a játékos a munka szolgálatból akkor az összes munkaszolgálatot 0 ra állítsa? köszönöm ha esetleg érthetetlen szóljatok :)

változón belüli összes paraméterre vonatkozóan...
« Válasz #1 Dátum: 2013. július 10. - 12:42:13 »
+1 Show voters
Ezt nem így szokás megadni mindig a játékos változó van elõbb, tehát így:
 
new WorkDuty[MAX_PLAYERS][MAX_WORKS];

 
Gondolom egy játékosnak több munka is lehet ezért kell neked az újabb MAX_WORKS tömb, ezt mondjuk bit mûveletekkel egyszerûbb létrehozni.
De maradjunk ennél.
Ha ezt úgy hozod létre ahogy fentebb leírtam akkor egy újabb változóval egyszerûen nullára tudod állítani az összes értéket mégpedig így:
 
new set_null[MAX_WORKS];
WorkDuty[playerid] = set_null;

Nem elérhető krisk

  • 2380
    • Profil megtekintése
változón belüli összes paraméterre vonatkozóan...
« Válasz #2 Dátum: 2013. július 10. - 14:09:22 »
+1 Show voters
Amirõl zsoleszka beszél az az, hogy hatékonyabb, ha bináris adatokkal dolgozol.
Tegyük fel, van 5 munka a szervereden. Simán használhatsz egy:
 

new OnDuty[MAX_PLAYERS];

 
tömböt is, és az egyes munkábaállásokat, mint a számon belüli bitekként kezelheted.
Öt munkánál, ha mind az ötben szolgálatban áll, a szám így nézne ki:
 

new OnDuty[playerid] = 0b11111;

 
Ha csak az elsõben, akkor:
 

new OnDuty[playerid] = 0b00001;

 
Számokban biteket a következõ függvénnyel kérdezhetsz le, illetve módosíthatsz:
 

bit_leker(szam,hanyadik)
{
//megcsináljuk a maszkot
new constant = 1 << (hanyadik-1);
//ha 1, terjunk vissza 1-el
if( szam & constant ){
  return 1;
}
//egyebkent nullaval
return 0;
}
bit_allit(szam,hanyadik,bool:beki=true)
{
if(beki)   return szam | (1 << (hanyadik-1));
   return szam & (~(1 << (hanyadik-1)));
}

 
Az elsõ függvény az adott szám n. bitjével tér vissza, míg a második az n. bitet kapcsolja ki vagy be (a bool változónak megfelelõen. ha igaz, akkor be, ha hamis, akkor ki, alapértelmezésként mindig bekapcsolja).
Innen egyszerû az egész:
 

//1. munka: szerelõ
//2. munka: autókereskedõ
//3. munka: rendõr
new OnDuty[MAX_PLAYERS];

 
Ha autókereskedõ dutyba áll:
 

OnDuty[playerid] = bit_allit(OnDuty[playerid],2);

 
Ha ez mellé rendõr is lesz:
 

OnDuty[playerid] = bit_allit(OnDuty[playerid],3);

 
Ezek után ha le akarod kérdezni, hogy szerelõdutyba van-e:
 

bit_leker(OnDuty[playerid],1);

 
Ha OffDuty-ba lép akkor ismét lefuttatod a bit_állítot, csak a beki paraméter legyen false.
Hogy miért van ez így, azt itt nem magyarázom el, Anthonynak van róla egy tutja, ha érdekel.
« Utoljára szerkesztve: 2013. július 11. - 08:46:53 írta krisk »

Nem elérhető buci11

  • 502
    • Profil megtekintése
változón belüli összes paraméterre vonatkozóan...
« Válasz #3 Dátum: 2013. július 11. - 03:57:28 »
0 Show voters
Nagyon szépen köszönöm a kidolgozott válaszokat. Ezek alapján eltudtam indulni egy nyomon és már meg is oldottam :) ment a + még egyszer köszönöm!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal