W tym tutku pokaze w jaki sposob dodac frakcje do klas. Frakcje powoduja, ze mozemy podzielic klasy na okreslone grupy, w tym przypadku stworze dwie grupy dla zwyklych klas i od lv.
Pierw otwieramy sp. naszego silnika i szukamy:
enum { };
pod tym dodajemy:
enum { niewybrana, zwykla, odpoziomu }
nastepnie gdzies na gorze dodajemy:
new frakcja_gracza[MAX_PLAYERS+1]; new String:nazwy_frakcji[][] = { "Brak", // 0 "Zwykle", // 1 "Od Lvla" // 2 };
Teraz szukamy:
new umiejetnosci_klas[][] = { };
i zamieniamy to na:
new umiejetnosci_klas[][] = { // Lvl - 0 // Zdr - 1 // Wyt - 2 // Kon - 3 // - 4 frakcja {0, 100, 0, 100, niewybrana}, // 0 {0, 120, 100, 110, zwykla}, // 1 {0, 135, 100, 135, zwykla}, // 2 {0, 120, 150, 80, zwykla}, // 3 {0, 100, 100, 100, zwykla}, // 4 {0, 100, 100, 100, zwykla}, // 5 {0, 100, 100, 100, zwykla}, // 6 {0, 100, 50, 120, zwykla}, // 7 {0, 100, 50, 100, zwykla}, // 8 {0, 150, 150, 100, zwykla}, // 9 {0, 105, 150, 80, zwykla}, // 10 {0, 140, 150, 80, zwykla}, // 11 {0, 100, 100, 115, zwykla}, // 12 {500, 120, 50, 100, odpoziomu}, // 13 {1000, 180, 0, 120, odpoziomu}, // 14 {1500, 80, 80, 80, odpoziomu}, // 15 {2000, 125, 0, 80, odpoziomu}, // 16 {2500, 120, 25, 110, odpoziomu}, // 17 {3000, 115, 25, 110, odpoziomu}, // 18 {3500, 175, 175, 100, odpoziomu}, // 19 {4000, 125, 100, 100, odpoziomu}, // 20 {4500, 120, 100, 110, odpoziomu}, // 21 {5000, 105, 50, 105, odpoziomu}, // 22 {6000, 130, 50, 115, odpoziomu}, // 23 {7000, 200, 100, 130, odpoziomu} // 24 };
Nastepnie szukamy:
public Action:WybierzKlase(client) { } public WybierzKlase2(Handle:owner, Handle:query, const String:error[], any:client) { } public Action:WybierzKlaseMenu(client) { } public WybierzKlase_Handler(Handle:classhandle, MenuAction:action, client, Position) { }
i usuwamy a w nich miejsce wklejamy to:
public Action:WybierzKlase(client) { new Handle:menu = CreateMenu(WybierzKlase_Handler); SetMenuTitle(menu, "Wybierz Frakcje:"); for(new i = 1; i < sizeof nazwy_frakcji; i ++) AddMenuItem(menu, "1", nazwy_frakcji[i]); DisplayMenu(menu, client, 250); } public WybierzKlase_Handler(Handle:classhandle, MenuAction:action, client, Position) { if(action == MenuAction_Select) { new String:Item[32]; GetMenuItem(classhandle, Position, Item, sizeof(Item)); Position ++; frakcja_gracza[client] = Position; WybierzFrakcje(client); } else if(action == MenuAction_End) CloseHandle(classhandle); } public Action:WybierzFrakcje(client) { if(polaczony_raz[client]) PrintToChat(client, "[COD:MW] Trwa wczytywanie klas..."); else { if(klasa_gracza[client]) { new klasa_g = klasa_gracza[client]; poziom_klasy_gracza[client][klasa_g] = poziom_gracza[client]; doswiadczenie_klasy_gracza[client][klasa_g] = doswiadczenie_gracza[client]; inteligencja_klasy_gracza[client][klasa_g] = inteligencja_gracza[client]; zdrowie_klasy_gracza[client][klasa_g] = zdrowie_gracza[client]; obrazenia_klasy_gracza[client][klasa_g] = obrazenia_gracza[client]; wytrzymalosc_klasy_gracza[client][klasa_g] = wytrzymalosc_gracza[client]; kondycja_klasy_gracza[client][klasa_g] = kondycja_gracza[client]; WybierzKlaseMenu(client); } else { new String:tmp[1024]; new String:authid[64]; if(!GetClientAuthId(client, AuthId_Steam2, authid, sizeof(authid))) return; Format(tmp, sizeof(tmp), "SELECT `lvl`, `xp`, `inteligencja`, `zdrowie`, `obrazenia`, `wytrzymalosc`, `kondycja`, `klasa` FROM `codmod` WHERE steamid = '%s';", authid); SQL_TQuery(sql, WybierzFrakcje2, tmp, client); polaczony_raz[client] = 1; } } } public WybierzFrakcje2(Handle:owner, Handle:query, const String:error[], any:client) { if(query == INVALID_HANDLE) { LogError("Load error: %s", error); return; } if(SQL_GetRowCount(query)) { new poziom = 1, doswiadczenie = 0, inteligencja = 0, zdrowie = 0, obrazenia = 0, wytrzymalosc = 0, kondycja = 0; new String:klasa[512]; while(SQL_MoreRows(query)) { while(SQL_FetchRow(query)) { poziom = SQL_FetchInt(query, 0); doswiadczenie = SQL_FetchInt(query, 1); inteligencja = SQL_FetchInt(query, 2); zdrowie = SQL_FetchInt(query, 3); obrazenia = SQL_FetchInt(query, 4); wytrzymalosc = SQL_FetchInt(query, 5); kondycja = SQL_FetchInt(query, 6); SQL_FetchString(query, 7, klasa, sizeof(klasa)); for(new i = 1; i < sizeof nazwy_klas; i ++) { if(StrEqual(nazwy_klas[i], klasa)) { poziom_klasy_gracza[client][i] = poziom; doswiadczenie_klasy_gracza[client][i] = doswiadczenie; inteligencja_klasy_gracza[client][i] = inteligencja; zdrowie_klasy_gracza[client][i] = zdrowie; obrazenia_klasy_gracza[client][i] = obrazenia; wytrzymalosc_klasy_gracza[client][i] = wytrzymalosc; kondycja_klasy_gracza[client][i] = kondycja; } } } } } WybierzKlaseMenu(client); polaczony_raz[client] = 0; } public Action:WybierzKlaseMenu(client) { new String:klasa[512]; new Handle:menu = CreateMenu(WybierzFrakcje_Handler); SetMenuTitle(menu, "Wybierz Klase:"); for(new i = 1; i < sizeof nazwy_klas; i ++) { if(umiejetnosci_klas[i][4] == frakcja_gracza[client]) { Format(klasa, sizeof(klasa), "%s (Lv: %i)", nazwy_klas[i], poziom_klasy_gracza[client][i]); AddMenuItem(menu, "1", klasa); } } DisplayMenu(menu, client, 250); } public WybierzFrakcje_Handler(Handle:classhandle, MenuAction:action, client, Position) { if(action == MenuAction_Select) { new String:Item[32]; GetMenuItem(classhandle, Position, Item, sizeof(Item)); Position ++; if(StrEqual(Item, "1")) { if(Position == klasa_gracza[client] && !nowa_klasa_gracza[client]) return; new ile = 0, ma_poziom = 0; for(new i = 1; i < sizeof nazwy_klas; i ++) { if(umiejetnosci_klas[i][4] == frakcja_gracza[client]) ile++; if(ile == Position) { Position = i; break; } } for(new i = 1; i < sizeof nazwy_klas; i ++) { if(poziom_klasy_gracza[client][i] >= umiejetnosci_klas[Position][0]) ma_poziom = 1; } if(ma_poziom) { if(klasa_gracza[client]) { nowa_klasa_gracza[client] = Position; PrintToChat(client, "[COD:MW] Klasa zostanie zmieniona w nastepnej rundzie."); } else { klasa_gracza[client] = Position; WczytajDane(client, klasa_gracza[client]); Odrodzenie(client); } } else { WybierzKlaseMenu(client); PrintToChat(client, "[COD:MW] Wybrana klasa dostepna jest od %dLv!", umiejetnosci_klas[Position][0]); } } } else if(action == MenuAction_End) CloseHandle(classhandle); }
Od teraz bedziemy mieli dzialajace frakcje. Nowa grupe tworzymy poprzez dodanie jej do enum oraz zmiennej "nazwy_frakcji" (podobnie jak z dodawaniem nowych klas). Za przypisanie odpowiedniej grupy do klasy odpowiada 5 kolumna w zmiennej "umiejetnosci_klas"