0. Wstęp
Jako że ostatnio dużo osób do mnie pisze obnośnie pomocy z tworzeniem klas, postanowiłem napisać ten oto drobny poradnik ukazujący tą "Czarną Magie".
Z góry przepraszam za wszelkie błędy ortograficzne (przepuszczałem przez "sprawdzaniepisowni" ale się wykrzaczył przez znaki specjalne).
1. Piszemy klase
Co będzie nam potrzebne:
- Kompilator sourcemod (ja używam v1.6.4) z wgranym api cmod'a
- Wygodny edytor textu (najlepiej z podświetleniem składni - ja używam Geany z składnią C++)
- pomysł na klase
Moja klasa będzie miała następujące parametry:
- Nazwa: NikuSan
- Opis/umiejętność: Przy każdym użyciu skilla dostaje flash'a
- Bronie: awp, tec-9, flashbang
- Statystyki INT/CON/STR/DEX: 22/10/33/90
A o to nasz "kod startowy":
#include <sdktools> #include <sdkhooks> #include <sourcemod> public Plugin:myinfo = { name = "NikuSan", author = "PLX", description = "Przy każdym użyciu skilla dostaje flash'a", version = "1.0", url = "RedTube.plx" } public OnPluginStart(){ }
Pierwszym krokiem który musimy zrobić jest załączenie api, aby tego dokonać pod:
#include <sdktools> #include <sdkhooks> #include <sourcemod>
dodajemy:
#include <cmod>
Gdzieś musimy przechowywać informacje o klasie, dlatego pod wyżej wymienionymi musimy dodać następujący kod:
//Tworzymy zmienne przechowujące informacje o klasie oraz je wypełniamy new const String:nazwaKlasy[] = "NikuSan"; new const String:opisKlasy[] = "Przy każdym użyciu skilla dostaje flash'a"; new const intKlasy = 22; new const conKlasy = 10; new const strKlasy = 33; new const dexKlasy = 90; //Tworzymy uchwyt dla adt_array (który będzie przechowywał liste broni) new Handle:bronieKlasy;
Czas nastał na stworznie adt_array który będzie przechowywał listę naszych broni, aby tego dokonać do funkcji OnPluginStart() dodajemy:
//Tworzymy adt_array dla listy broni bronieKlasy = CreateArray(32);
Następnie wypełniamy adt_array listą broni które nasza klasa ma mieć, w następujący sposób:
//Dodajemy bronie do adt_array PushArrayString(bronieKlasy, "weapon_awp"); PushArrayString(bronieKlasy, "weapon_tec9"); PushArrayString(bronieKlasy, "weapon_flashbang");
Skoro mamy już zapisane wszystkie informacje które zostaną przekazane do silnika, to przyszedł czas na wysłanie ich, w tym celu pod powyszym kodem dodajemy:
//Rejestrujemy klase w silniku Cmod_RegisterClass(nazwaKlasy, opisKlasy, intKlasy, conKlasy, strKlasy, dexKlasy, bronieKlasy);
A teraz ten nieszczęsny skill.
Wpierw tworzymy funkcje odpowiedzialną za aktywacje skilla:
//Tworzymy funkcje, która będzie wywoływana podczas aktywacji skilla przez gracza public Cmod_OnClientUseSkill(client){ }
Następnie dodajemy do niej:
//Dajemy graczu flash'a GivePlayerItem(client, "weapon_flashbang");
Zapisujemy następnie kompilujemy klase. Gotowe
Dla tych którym się nie udało, niech sobie porównają kod:
#include <sdktools> #include <sdkhooks> #include <sourcemod> #include <cmod> //Tworzymy zmienne przechowujące informacje o klasie oraz je wypełniamy new const String:nazwaKlasy[] = "NikuSan"; new const String:opisKlasy[] = "Przy każdym użyciu skilla dostaje flash'a"; new const intKlasy = 22; new const conKlasy = 10; new const strKlasy = 33; new const dexKlasy = 90; //Tworzymy uchwyt dla adt_array (który będzie przechowywał liste broni) new Handle:bronieKlasy; public Plugin:myinfo = { name = "NikuSan", author = "PLX", description = "Przy każdym użyciu skilla dostaj flash'a", version = "1.0", url = "RedTube.plx" } public OnPluginStart(){ //Tworzymy adt_array dla listy broni bronieKlasy = CreateArray(32); //Dodajemy bronie do adt_array PushArrayString(bronieKlasy, "weapon_awp"); PushArrayString(bronieKlasy, "weapon_tec9"); PushArrayString(bronieKlasy, "weapon_flashbang"); //Rejestrujemy klase w silniku Cmod_RegisterClass(nazwaKlasy, opisKlasy, intKlasy, conKlasy, strKlasy, dexKlasy, bronieKlasy); } //Tworzymy funkcje, która będzie wywoływana podczas aktywacji skilla przez gracza public Cmod_OnClientUseSkill(client){ //Dajemy graczu flash'a GivePlayerItem(client, "weapon_flashbang"); }
2. Podst. omówienie api
2.1 Funkcje
Cmod_RegisterClass
Cmod_GetClientBonusWeapons
Cmod_GetAllowWeapons
Cmod_GetClientWeapons
2.2 Forwardy
Cmod_OnClassEnabled
Cmod_OnClassDisabled
Cmod_OnClientUseSkill
Cmod_OnGetNewClassID
[h1]3 Ostrzeżenia[/h2]
- Cześć funkcji z api nie jest do końca zabezpieczona, dlatego upewnij się że podajesz prawidłowe dane
- Nie dodawaj do listy broni weapon_knife, jeśli go dodasz może wystąpić bug z lewitującym nożem przed graczem
- Nigdy nie zamykaj adt_array jeśli używa go silnik, może to spowodować crash serva
4. Dodatkowo
4.1 m4a1-s
Aby dodać graczu broń m4a1-s należy także dodać do dozwolonych broni (Cmod_GetClientWeapons) dodać broń m4a4 (tak sm uznaje m4a1-s), sytuacja wygląda podobnie z usp
4.2 Vip
public Cmod_OnClassEnabled(client) { if(!GetAdminFlag(GetUserAdmin(client), Admin_Custom1)){ PrintToChat(client, "\x01\x0B\x01 \x07%s \x06Klasa dostępna tylko dla posiadaczy vip'a!", MOD_TAG); return CMOD_DISABLE; } active[client] = true; // <----- opcjonalne return CMOD_CONTINUE; }
4.3 Ciekawostka
Możesz na bieżąco zmieniać bronie klasy (lecz pamiętaj aby nie zamykać adt_array jeśli silnik z niego korzysta)
Użytkownik plx211 edytował ten post 06.04.2015 19:20