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.


Dodatki SourceMod















