Ü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 :)
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;
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.