W tym poradniku opiszę w jaki sposób dodać frakcję do nowego coda i to na aż dwa sposoby!
Sposób 1:
W pliku codmod.inc znajdujemy linijkę:
native cod_register_class(const String:nazwa[], const String:opis[], const String:bronie[], inteligencja, zdrowie, obrazenia, wytrzymalosc, kondycja);
zamieniamy ją na:
native cod_register_class(const String:nazwa[], const String:opis[], const String:bronie[], inteligencja, zdrowie, obrazenia, wytrzymalosc, kondycja, const String:frakcja[]);
Następnie otwieramy plik .sp naszego silnika i dodajemy nową zmienną globalną:
new String:frakcje_klas[MAKSYMALNA_ILOSC_KLAS+1][64];
Teraz w kodzie szukamy public ZarejestrujKlase(Handle:plugin, numParams) i w środku zamieniamy:
if(numParams != 8)
na:
if(numParams != 9)
oraz za:
kondycja_klas[ilosc_klas] = GetNativeCell(8);
dodajemy:
GetNativeString(9, frakcje_klas[ilosc_klas], sizeof(frakcje_klas[]));
Jeszcze musimy przerobić wybór klas, więc szukamy public Action:WybierzKlase(client, args) i usuwamy całą jego zawartość a w jego miejsce dodajemy:
public Action:WybierzKlase(client, args) { if(wczytane_dane[client]) { lvl_klasy_gracza[client][klasa_gracza[client]] = poziom_gracza[client]; xp_klasy_gracza[client][klasa_gracza[client]] = doswiadczenie_gracza[client]; int_klasy_gracza[client][klasa_gracza[client]] = inteligencja_gracza[client]; zdr_klasy_gracza[client][klasa_gracza[client]] = zdrowie_gracza[client]; obr_klasy_gracza[client][klasa_gracza[client]] = obrazenia_gracza[client]; wyt_klasy_gracza[client][klasa_gracza[client]] = wytrzymalosc_gracza[client]; kon_klasy_gracza[client][klasa_gracza[client]] = kondycja_gracza[client]; new Handle:menu = CreateMenu(WybierzFrakcje_Handler); SetMenuTitle(menu, "Wybierz Frakcje:"); for(new i = 1; i <= ilosc_klas; i ++) { if(!StrEqual(frakcje_klas[i], "") && !is_in_previous(frakcje_klas[i], i)) AddMenuItem(menu, frakcje_klas[i], frakcje_klas[i]); } DisplayMenu(menu, client, 250); } else PrintToChat(client, "[COD:MW] Trwa wczytywanie twoich danych!"); return Plugin_Handled; } public WybierzFrakcje_Handler(Handle:classhandle, MenuAction:action, client, position) { if(action == MenuAction_Select) { new String:item[64]; GetMenuItem(classhandle, position, item, sizeof(item)); position ++; new String:menu_item[128], String:numer_klasy[10]; new Handle:menu = CreateMenu(WybierzKlase_Handler); SetMenuTitle(menu, "Wybierz Klase:"); for(new i = 1; i <= ilosc_klas; i ++) { if(StrEqual(item, frakcje_klas[i])) { IntToString(i, numer_klasy, sizeof(numer_klasy)); Format(menu_item, sizeof(menu_item), "%s (Lv: %i)", nazwy_klas[i], lvl_klasy_gracza[client][i]); AddMenuItem(menu, numer_klasy, menu_item); } } DisplayMenu(menu, client, 250); } else if(action == MenuAction_End) CloseHandle(classhandle); } public bool:is_in_previous(const String:frakcja[], from) { for(new i = from - 1; i >= 1; i --) { if(StrEqual(frakcje_klas[i], frakcja)) return true; } return false; }
Następnie szukamy public WybierzKlase_Handler(Handle:classhandle, MenuAction:action, client, position) i w środku zamieniamy:
position ++;
na:
position = StringToInt(item);
To będzie na tyle. A jak z dodawaniem nowych frakcji dla klas? Przy rejestracji nowej klasy przypisujemy frakcje dla klasy.
Sposób 2:
Otwieramy plik .sp naszego silnika i dodajemy nową zmienną globalną:
new String:frakcje_klas[MAKSYMALNA_ILOSC_KLAS+1][64];
Następnie szukamy public OnMapStart() i do środka dodajemy:
new String:file[256]; BuildPath(Path_SM, file, sizeof(file), "configs/frakcje.txt"); new Handle:kv = CreateKeyValues("Frakcje"); FileToKeyValues(kv, file); for(new i = 1; i <= ilosc_klas; i ++) { KvGetString(kv, nazwy_klas[i], frakcje_klas[i], sizeof(frakcje_klas[])); TrimString(frakcje_klas[i]); } CloseHandle(kv);
Jeszcze musimy przerobić wybór klas, więc szukamy public Action:WybierzKlase(client, args) i usuwamy całą jego zawartość a w jego miejsce dodajemy:
public Action:WybierzKlase(client, args) { if(wczytane_dane[client]) { lvl_klasy_gracza[client][klasa_gracza[client]] = poziom_gracza[client]; xp_klasy_gracza[client][klasa_gracza[client]] = doswiadczenie_gracza[client]; int_klasy_gracza[client][klasa_gracza[client]] = inteligencja_gracza[client]; zdr_klasy_gracza[client][klasa_gracza[client]] = zdrowie_gracza[client]; obr_klasy_gracza[client][klasa_gracza[client]] = obrazenia_gracza[client]; wyt_klasy_gracza[client][klasa_gracza[client]] = wytrzymalosc_gracza[client]; kon_klasy_gracza[client][klasa_gracza[client]] = kondycja_gracza[client]; new Handle:menu = CreateMenu(WybierzFrakcje_Handler); SetMenuTitle(menu, "Wybierz Frakcje:"); for(new i = 1; i <= ilosc_klas; i ++) { if(!StrEqual(frakcje_klas[i], "") && !is_in_previous(frakcje_klas[i], i)) AddMenuItem(menu, frakcje_klas[i], frakcje_klas[i]); } DisplayMenu(menu, client, 250); } else PrintToChat(client, "[COD:MW] Trwa wczytywanie twoich danych!"); return Plugin_Handled; } public WybierzFrakcje_Handler(Handle:classhandle, MenuAction:action, client, position) { if(action == MenuAction_Select) { new String:item[64]; GetMenuItem(classhandle, position, item, sizeof(item)); position ++; new String:menu_item[128], String:numer_klasy[10]; new Handle:menu = CreateMenu(WybierzKlase_Handler); SetMenuTitle(menu, "Wybierz Klase:"); for(new i = 1; i <= ilosc_klas; i ++) { if(StrEqual(item, frakcje_klas[i])) { IntToString(i, numer_klasy, sizeof(numer_klasy)); Format(menu_item, sizeof(menu_item), "%s (Lv: %i)", nazwy_klas[i], lvl_klasy_gracza[client][i]); AddMenuItem(menu, numer_klasy, menu_item); } } DisplayMenu(menu, client, 250); } else if(action == MenuAction_End) CloseHandle(classhandle); } public bool:is_in_previous(const String:frakcja[], from) { for(new i = from - 1; i >= 1; i --) { if(StrEqual(frakcje_klas[i], frakcja)) return true; } return false; }
Następnie szukamy public WybierzKlase_Handler(Handle:classhandle, MenuAction:action, client, position) i w środku zamieniamy:
position ++;
na:
position = StringToInt(item);
To będzie na tyle. A jak z dodawaniem nowych frakcji dla klas? Tworzymy w configs/ plik o nazwie frakcje.txt i dodajemy nowe klasy oraz frakcje według poniższego przykładu.
"Frakcje" { "Snajper" "Polacy" "Komandos" "Polacy" "Obronca" "Rosjanie" "Medyk" "Niemcy" }
Pierw musimy wpisać nazwę klasy a następnie jej frakcje.
Silnik wraz z paczką modyfikacji, można nabyć wyłącznie poprzez kontakt ze mną. Więcej o tym w sygnaturze.