Troszkę roboty będzie, ale się opłaci. Widzę w tą stronę szedłeś ale nie wiedziałeś co dalej (wykomentowana pętla).
Tablicę z listą broni już mamy, dorzucimy teraz prostą funkcję typu stock, która dla nazwy broni zwróci jej indeks z Twojej tablicy:
stock idBroni(weapon) {
for (new i=0; i<sizeof(NazwyBroni); ++i) {
if (NazwyBroni[i] == weapon)
return i;
}
return 0;
}
Funkcji używamy w prosty sposób:
id_broni_z_tablicy = idBroni(CSW_AK47)
Pamiętaj, że jeśli nie znajdzie broni w tablicy, zwróci 0, więc jeśli chcesz z tą wartością coś dalej zrobić sprawdź czy nie jest to 0. W większości przypadków nie będzie to problemem.
Masz również tablice z modelami, super
Odpada nam część pracy.
Trzeba jednak jeszcze jedną tablicę dorobić i 22 wyrzucić. Mówię tu o tablicach hasBRON, które zastąpimy jedną tablicą hasWeapon.
Na pierwszy rzut oka tablica powinna być 2 wymiarowa, 1 wymiar (33) na graczy, 2 wymiar (23) na bronie. Ale... Każda broń w CSie używa ID od 1 do 30, które kryją się pod właśnie stałymi CSW_, wyjątkiem są tutaj 3 rzeczy: kamizelka, kamizelka + hełm i shieldgun (chyba tarcza taktyczna anty-terrorystów, ale głowy nie daję, nigdy tego nie sprawdzałem). Tych 3ch rzeczy nie używasz, więc możemy śmiało przyjąć zakres do 30.
A 30 to mniej niż 32, co oznacza że każda broń może posiadać własny bit
Dlatego stworzymy tablicę hasWeapon:
new hasWeapon[33];
Teraz zamienimy trochę przypisań, by użyć hasWeapon zamiast hasBROŃ, zacznijmy od client_connect, gdzie wystarczy teraz nam:
hasWeapon[id] = 0;
w client_disconnect robimy dokładnie tak samo.
Teraz optymalizacja, której się nie spodziewałeś... Jednak żeby jej dokonać musimy zmienić kolejność w tablicach NazwyBroni i ModeleBroni. Musi ona odpowiadać kolejności w której dajesz graczowi bronie w funkcji Odrodzenie, czyli:
hasGLOCK[id] = true;
hasUSP[id] = true;
hasP228[id] = true;
hasFIVESEVEN[id] = true;
hasDEAGLE[id] = true;
hasELITE[id] = true;
hasTMP[id] = true;
hasMAC10[id] = true;
hasUMP45[id] = true;
hasMP5[id] = true;
hasP90[id] = true;
hasFAMAS[id] = true;
hasGALIL[id] = true;
hasM3[id] = true;
hasXM1014[id] = true;
hasAK47[id] = true;
hasM4A1[id] = true;
hasAUG[id] = true;
hasSG552[id] = true;
hasSG550[id] = true;
hasG3SG1[id] = true;
hasM249[id] = true;
To chyba nie będzie trudne... Pamiętaj jednak, że kolejność w tablicy modeli musi odpowiadać tej w tablicy broni. Pamiętaj też, że na zerowej pozycji nadal pozostawiamy to "magiczne" zero! Możemy oczywiście je usunąć, ale doda nam to troszkę roboty...
Teraz to, co mamy w Odrodzenie (ten cały switch) zamieniamy na:
hasWeapon[id] = 0; // Na wszelki wypadek resetujemy graczowi bronie
for (new i=1; i<sizeof(NazwyBroni) && i<=player_reborns[id]; ++i) {
hasWeapon[id] |= (1<<NazwyBroni[id]);
}
To może być dość trudne do zrozumienia... Krótkie więc objaśnienie. Najpierw zerujemy graczowi jego listę broni, następnie jedziemy pętlą po wszystkich dostępnych broniach, kończąc na broni równej ilości odrodzeń gracza. Każdą broń dodajemy do zmiennej hasWeapon (jeśli nie rozumiesz w jaki sposób, poczytaj o operacjach bitowych (
1 i
2) i operatorach).
Idąc dalej, pętlę która jest zakomentowana w plugin_precache odkomentuj, zamień tylko i<23 na i<sizeof(ModeleBroni), da to lepszą elastyczność gdy będziesz chciał jakieś bronie dodać lub z jakichś zrezygnować.
Teraz przychodzi czas na nasze kochane fwItemDeploy. Zastąpimy naszego wielgachnego IFa czymś takim:
new idWeapon = idBroni(weapon);
if ( idWeapon && hasWeapon[id] & (1<<weapon) ) { // Sprawdzamy czy broń nas interesuje i czy gracz posiada daną broń, tutaj również odsyłam do operacji bitowych jeśli nie rozumiesz... Wygląda to trochę jak sprawdzanie czy gracz ma podaną flagę
entity_set_string(iOwner, EV_SZ_viewmodel, ModeleBroni[idWeapon])
}
Optymalizację możemy uczynić również dalej. Jako że zabierasz za każdym razem po prostu 2x damage jeśli gracz posiada złotą broń, jest to dość proste. Ale wcale nie jest bardziej skomplikowane gdy chcemy zmienić damage dla każdej broni z osobna. Pewnie tego nie potrzebujesz, więc kod sobie uprościsz ale przedstawię bogatszą wersję. Tworzymy jeszcze jedną tablicę typu Float o nazwie DamageBroni:
new Float:DamageBroni[23] = {
1.0, // zauważ że na pozycji zerowej mamy 1.0, tutaj nie ma żadnej broni więc formalnie można tu wpisać cokolwiek. Zostaw jednak tutaj 1.0, w razie wpadki przy sprawdzaniu czy broń nas interesuje, nic złego się nie stanie tj nie zmienisz wcale obrażeń.
2.0,
2.0,
// CIACH... Wiesz co pisać dalej :)
}
I użyjemy jej ładnie. Właściwie bardzo podobnie jak w fwItemDeploy użyliśmy modeli:
new idWeapon = idBroni(weapon);
if ( idWeapon && hasWeapon[id] & (1<<weapon) ) { // Sprawdzamy czy broń nas interesuje i czy gracz posiada daną broń, tutaj również odsyłam do operacji bitowych jeśli nie rozumiesz... Wygląda to trochę jak sprawdzanie czy gracz ma podaną flagę
SetHamParamFloat( 4, damage * DamageBroni[idWeapon] );
}
To chyba wszystko... Jeśli gdzieś jeszcze operowałeś na starych tablicach posiadania broni, powinieneś sobie poradzisz żeby to zamienić.