Sprawdzanie czy gracz ma wybrane bronie w...
sebul
28.05.2011
Witam. Przedstawię Wam funkcję, która będzie sprawdzać, czy dany gracz posiada jakąś broń "w plecaku" z kilku podanych, czyli pod uwagę będą brane wszystkie bronie jakie gracz ma przy sobie i jeśli znajdzie przynajmniej jedną broń, to zwróci true.
Można to zrobić na dwa sposóby.
I Sposób
Wygląd funkcji sprawdzającej
Wykorzystanie stocka
Oczywiście można to zrobić bez zmiennej "disallowed", czyli
II Sposób
Wygląd funkcji sprawdzającej
Wykorzystanie stocka
Obydwa sposoby można napisać też tak (jeśli musielibyśmy sprawdzać kilka razy, czy gracz posiada jakieś bronie)
Oczywiście można użyć też negacji, czyli
lub (w przypadku tego drugiego)
Tutaj -> Nazwy broni i ammo do give_item (+ speed) znajdziecie nazwy i ID wszystkich broni oprócz noża.
Podziękowania dla Knopersa za małą pomoc.
Można to zrobić na dwa sposóby.
I Sposób
Wygląd funkcji sprawdzającej
stock bool:sprawdz_bronie(id, disallowed) {
new weapons[32], num;
return bool:(get_user_weapons(id, weapons, num) & disallowed);
}
Wykorzystanie stocka
// tworzymy zmienną z id wszystkich broni, które funkcja ma sprawdzić
new disallowed = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG); // możemy tutaj wypisać wszystkie id broni jakie są
// teraz robimy warunek
if(sprawdz_bronie(id, disallowed)) {
// gracz posiada "w plecaku" którąkolwiek broń podaną wyżej
}
else {
// gracz nie ma broni
}
Oczywiście można to zrobić bez zmiennej "disallowed", czyli
if(sprawdz_bronie(id, (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG))) {
// gracz posiada "w plecaku" którąkolwiek broń podaną wyżej
}
II Sposób
Wygląd funkcji sprawdzającej
stock bool:sprawdz_bronie(id, disallowed[], ile = sizeof(disallowed)) {
new weapons[32], num, pwpns, i;
pwpns = get_user_weapons(id, weapons, num);
for(i=0; i<ile; ++i) {
if(pwpns & (1<<disallowed[i]))
return true;
}
return false;
}
Wykorzystanie stocka
// tworzymy tablicę z id wszystkich broni, które funkcja ma sprawdzić
new disallowed[] = { CSW_SCOUT, CSW_XM1014, CSW_MAC10, CSW_AUG } // możemy tutaj wypisać wszystkie id broni jakie są
// teraz robimy warunek
if(sprawdz_bronie(id, disallowed)) {
// gracz posiada "w plecaku" którąkolwiek broń podaną wyżej
}
else {
// gracz nie ma broni
}
Obydwa sposoby można napisać też tak (jeśli musielibyśmy sprawdzać kilka razy, czy gracz posiada jakieś bronie)
new bool:mabronie = sprawdz_bronie(id, (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG));
if(mabronie) {
// gracz posiada "w plecaku" którąkolwiek broń podaną wyżej
}
else {
// gracz nie ma broni
}
Oczywiście można użyć też negacji, czyli
if(!sprawdz_bronie(id, disallowed)) {
// gracz nie ma broni
}
lub (w przypadku tego drugiego)
if(!mabronie) {
// gracz nie ma broni
}
Tutaj -> Nazwy broni i ammo do give_item (+ speed) znajdziecie nazwy i ID wszystkich broni oprócz noża.
Podziękowania dla Knopersa za małą pomoc.
JLB. Leo 28.05.2011
Well Done. Przyda się z pewnością, mnóstwo czasu kiedyś straciłem na przeszukanie jak to ma wyglądać.
G[o]Q
28.05.2011
myślałem, że jeszcze krócej da się to zrobić
da sie
get_user_weapons i iloczyn bitowy ??
^Grzyboo
28.05.2011
albo user_has_weapon(id, CSW_DEAGLE) ??
Użytkownik ^Grzyboo edytował ten post 28.05.2011 20:16
Użytkownik ^Grzyboo edytował ten post 28.05.2011 20:16
sebul
28.05.2011
Czyli jednak... Ale niby jak iloczyn bitowy? Bo dużo mi to nie mówi.myślałem, że jeszcze krócej da się to zrobić
da sie
get_user_weapons i iloczyn bitowy ??
R3X
28.05.2011
user_has_weapon działa prawdopodobnie tak samo jak to, więc szukanie kilku broni lepiej zrobić w jednej pętli (powyższy stock), ale sprawdzenie jednej zostawić natywnej funkcji
mam taką małą uwagę implementacyjną, nagłówek tej funkcji może wyglądać tak
mam taką małą uwagę implementacyjną, nagłówek tej funkcji może wyglądać tak
stock bool:sprawdz_bronie(id, disallowed[], ile = sizeof disallowed)i nieco ułatwi jej używanie
sebul
28.05.2011
Nie bardzo wiem w czym to będzie ułatwiać, ale skoro tak, to pewnie tak jest ^ ^ Ogólnie poprawiłem trochę nazwę tematu, itp. bo możliwe, że na początku nazwa nie była zbyt dobrze dobrana, źle to ująłem ;]
R3X
28.05.2011
no że ile sam sobie przypisze wielkość tablicy i wystarczy podać tylko 2 pierwsze argumenty
GoldeN 29.05.2011
Co do nagłówka funkcji to nie najlepiej zrobić tak:
Wyjdzie na to samo a nagłówek krótszy. ;d
stock bool:sprawdz_bronie(id, disallowed[]) {
new weapons[32], num, bool:has = false;
get_user_weapons(id, weapons, num);
for(new i=0; i<num; i++) {
for(new o=0; o<sizeof(disallowed); o++) {
if(weapons[i] == disallowed[o]) {
has = true;
break;
}
}
if(has) break;
}
return has;
}
Wyjdzie na to samo a nagłówek krótszy. ;d
sebul
29.05.2011
Tak Ci się nie skompiluje ;] Bo właśnie tak próbowałem na samym początku. Znaczy skompiluje, ale z ostrzeżeniem, więc tak jak teraz jest dobrze.
Użytkownik sebul edytował ten post 29.05.2011 10:45
Użytkownik sebul edytował ten post 29.05.2011 10:45
G[o]Q
29.05.2011
new wpns[32], num, pwpns; pwpns = get_user_weapons(id,wpns,num) if (pwpns&(1<<CSW_DEAGLE)) //Gosc ma deagle'a
sebul
29.05.2011
Ale to będzie sprawdzać pojedynczo, a mi chodzi o takie coś, że podaje się kilka broni i wtedy sprawdza, czy dana osoba ma choć jedną.
sebul
29.05.2011
Czyli coś takiego?
Tylko to mi przyszło do głowy
stock bool:sprawdz_bronie(id, disallowed[], ile = sizeof(disallowed)) {
new weapons[32], num, pwpns, bool:has = false;
pwpns = get_user_weapons(id, weapons, num);
for(new i=0; i<ile; i++) {
if(pwpns & (1<<disallowed[i])) {
has = true;
break;
}
}
return has;
}
Tylko to mi przyszło do głowy
Cypis'
29.05.2011
może tak:
if(sprawdz_bronie(id, CSW_USP))
{
//ma usp
}
else
{
//nie ma
}
stock bool:sprawdz_bronie(id, disallowed)
{
new weapons[32], num;
return (get_user_weapons(id, weapons, num) & (1<<disallowed))? true: false
}
sebul
29.05.2011
Ale teraz to co podałeś, to tym bardziej jest to sprawdzanie, czy grać ma jedną broń, a założenie jest takie, aby sprawdzić, czy gracz ma choć jedną broń z kilku podanych.
Dodano 29 maj 2011 - 20:27:
Dobra, przetestowałem i rzeczywiście ten drugi kod co napisałem też działa, jest krócej, to dodałem do pierwszego postu.
Użytkownik sebul edytował ten post 29.05.2011 19:29
Dodano 29 maj 2011 - 20:27:
Dobra, przetestowałem i rzeczywiście ten drugi kod co napisałem też działa, jest krócej, to dodałem do pierwszego postu.
Użytkownik sebul edytował ten post 29.05.2011 19:29
G[o]Q
29.05.2011
mialem na mysli zrobienie tego troche inaczej a mianowicie zrobienie sumy bitowej dla zestawu i porownanie jej z wynikiem get_user_weapons i zrobienie iloczynu bitowego jesli w wyniku iloczynu pozostala jakas 1 to gosc ma bron
sebul
29.05.2011
Nie rozumiem to co tutaj piszesz ^ ^ Jak wiesz jak to napisać jeszcze inaczej i może lepiej, to napisz, bo ja na sumach bitowych się nie znam ;/