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.