←  Gotowe funkcje

AMXX.pl: Support AMX Mod X i SourceMod

»

Sprawdzanie czy gracz ma wybrane bronie w...

  • +
  • -
sebul - zdjęcie 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
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.
Odpowiedz

JLB. Leo - zdjęcie 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ć.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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 ??
Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^Grzyboo 28.05.2011

albo user_has_weapon(id, CSW_DEAGLE) ??
Użytkownik ^Grzyboo edytował ten post 28.05.2011 20:16
Odpowiedz

  • +
  • -
Cypis' - zdjęcie Cypis' 28.05.2011

^Grzyboo, to sprawdza nawet jak masz broń w plecaku
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 28.05.2011

myślałem, że jeszcze krócej da się to zrobić


da sie

get_user_weapons i iloczyn bitowy ??

Czyli jednak... Ale niby jak iloczyn bitowy? Bo dużo mi to nie mówi.
Odpowiedz

  • +
  • -
R3X - zdjęcie 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
stock bool:sprawdz_bronie(id, disallowed[], ile = sizeof disallowed)
i nieco ułatwi jej używanie
Odpowiedz

  • +
  • -
sebul - zdjęcie 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 ;]
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 28.05.2011

no że ile sam sobie przypisze wielkość tablicy i wystarczy podać tylko 2 pierwsze argumenty :)
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 28.05.2011

A to już rozumiem :D Post poprawiony jeszcze raz.
Odpowiedz

GoldeN - zdjęcie GoldeN 29.05.2011

Co do nagłówka funkcji to nie najlepiej zrobić tak:

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
Odpowiedz

  • +
  • -
sebul - zdjęcie 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
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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
Odpowiedz

  • +
  • -
sebul - zdjęcie 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ą.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 29.05.2011

przeciez to samo mozna bitowo zrobic :D
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 29.05.2011

Czyli coś takiego?
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 ^^
Odpowiedz

  • +
  • -
Cypis' - zdjęcie 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
}
Odpowiedz

  • +
  • -
sebul - zdjęcie 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
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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 :D
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 29.05.2011

Nie rozumiem to co tutaj piszesz ^ ^ :D Jak wiesz jak to napisać jeszcze inaczej i może lepiej, to napisz, bo ja na sumach bitowych się nie znam ;/
Odpowiedz