
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"


Dodatki SourceMod
















