Z gory przepraszam za brak Polskich znakow i ewentualne bledy ortograficzne interpunkcyjine
Poprzedni poradnik (o statystykach)
Skille tak samo jak statystyka zostaly wyrzycone do odzielnych pluginów, ponadto stworzylem specjalna "warstwe" o nazwie PreparedSkill dzięki ktorej mozemy w latwy sposob zmiennic takie rzeczy jak obrazenia, bonusy, czy co tam chcecie (ale pod warunkiem, ze w skillu to zaimplementujecie)
Bedzie nam potrzebne:
- Znajomosc skladni SP 1.7+
- Znajomosc methodmap (polecam tut z alliedow)
- Wgrany na server plugin Cmod_SkillCore oraz Cmod_PreparedSkill
- Kompilator SP 1.8+ z biblioteka cmod'a
Zamiast tworzyc krok po kroku (jak to bylo w poradniku od statystyki), zaimiemy sie analiza ponizszego kodu:
#include <sourcemod> #include <cmod> SkillID mySkill; public void OnPluginStart() { mySkill = SkillID("My magic skill"); mySkill.setDesc("This skill doing only stupid staff"); mySkill.hookPrepare(onPrepare); mySkill.hookStart(onStart); mySkill.hookStop(onStop); } public void OnPluginEnd() { mySkill.remove(); } public void onPrepare(SkillID skillID, PreparedSkill preparedSkill) { preparedSkill.setValue("lucky_number", 100); preparedSkill.setFloat("stupid_lvl", 20.5); preparedSkill.setValue("wtf_count", 69); } public void onStart(SkillID skillID, PreparedSkill preparedSkill, int entity) { int lucky = preparedSkill.getValue("lucky_number"); float stupid = preparedSkill.getFloat("stupid_lvl"); int wtfCount = preparedSkill.getValue("wtf_count"); PrintToChat(entity, "[My magic skill START] You have %d lucky pts, you brain is in %f\% stupid, and you have %d WTF?!", lucky, stupid, wtfCount); } public void onStop(SkillID skillID, PreparedSkill preparedSkill, int entity) { PrintToChat(entity, "[My magic skill STOP] Oh no!!!"); }
No to do dziela
SkillID mySkill;
Tworzymy zmienna ktora bedzie przechowywac ID skilla
mySkill = SkillID("My magic skill");
Rejestrujemy skill w silniku, nalezy pamietac ze wielkosc liter w nazwie ma znaczenie, najlepiej aby nazwa byla napisana w jezyku Angielskim
mySkill.setDesc("This skill doing only stupid staff");
Ustawiamy opis skilla, najlepiej aby opis byl napisany w jezyku Angielskim
mySkill.hookPrepare(onPrepare); mySkill.hookStart(onStart); mySkill.hookStop(onStop);
Hookujemy nastepujace eventy:
- Prepare - jest wywolywany gdy zostanie utworzony PreparedSkill do danego skilla, w callbacku ustawiamy wartosci ktore bedziemy potem pobierac z PreparedSkill, jest to bardzo wazne, jesli nie ustawimy tego jest duze ryzyko ze dostaniemy losowa wartosc
- Start - jest wywolywany kiedy zostanie wywolana funkcjia PreparedSkill.start, w callbacku implementujemy aktywacjie skilla
- Stop - jest wywolywany kiedy zostanie wywolana funkcjia PreparedSkill.stop, w callbacku implementujemy dezaktywacjie skilla
mySkill.remove();
Usuwamy skill, jesli tego nie zrobimy a wylaczymy plugin, to silnik nadal bedzie mial zarejestrowany skill co uniemozliwi ponnowna aktyacjie plugina z skillem
public void onPrepare(SkillID skillID, PreparedSkill preparedSkill) { preparedSkill.setValue("lucky_number", 100); preparedSkill.setFloat("stupid_lvl", 20.5); preparedSkill.setValue("wtf_count", 69); }
Jest to callback do zhookowanego wczesniej eventu Prepare,
Ustawiamy w nim wartosci kluczy PreparedSkill (wiecej o tym nizej)
public void onStart(SkillID skillID, PreparedSkill preparedSkill, int entity) { int lucky = preparedSkill.getValue("lucky_number"); float stupid = preparedSkill.getFloat("stupid_lvl"); int wtfCount = preparedSkill.getValue("wtf_count"); PrintToChat(entity, "[My magic skill START] You have %d lucky pts, you brain is in %f\% stupid, and you have %d WTF?!", lucky, stupid, wtfCount); }
Jest to callback do zhookowanego wczesniej eventu Start,
Pobieramy tutaj wartosci z kluczy PreparedSkill,
Po czym drukujemy mala notke
public void onStop(SkillID skillID, PreparedSkill preparedSkill, int entity) { PrintToChat(entity, "[My magic skill STOP] Oh no!!!"); }
Jest to callback do zhookowanego wczesniej eventu Stop,
Chyba nie musze pisac co w nim jest robione
Ufff, a teraz przypaczmy sie PreparedSkill, na poczatku napiszemy cos co pozwoli nam przetestowac powyzsze wymiociny/wypociny:
#include <sourcemod> #include <cmod> CmodSkill skills; PreparedSkill skillMagic; public void OnPluginStart() { skillMagic = new PreparedSkill(skills.findIDByName("My magice skill")); RegConsoleCmd("sm_startskill", cmd_sm_startskill); RegConsoleCmd("sm_stopskill", cmd_sm_stopskill); } public Action cmd_sm_startskill(int client, int argc) { skillMagic.start(client); } public Action cmd_sm_stopskill(int client, int argc) { skillMagic.stop(client); }
Nie ma zbytnio sensu tlumaczyc powyzszego kodu, dlatego przejde do rzeczy:
Czym jest PreparedSkill?
Jest to poprostu troche przerobiony StringMap, dzięki ktoremu mozemy napisac skill raz, a potem wywolywac go na rozne sposoby w innych klasach/itemach/pluginach.
Moze nam posluzyc jako tymczasowy bonus, lub co kolwiek chcemy.
Pamietaj ze nie musisz zawsze wywolywac/implementowac eventu Stop.
Aby bardziej zilustrowac ci idea:
Zalozmy ze mamy juz storzony skill "rocket" (ktory powiedzmy ze ma 120 linijek kodu) z nastepujacymi "kluczami w prepared":
- "damage" - typu float, odpowiedzialnego za DMG
- "radius" - typu value, odpowiedzialnego za obszar wybuchu
- "rocket_speed" - typu float, odpowiedzialnego za szybkosc rakiety
Teraz gdzies w innym pluginie:
CmodSkill skills; //... PreparedSkill rocket = new PreparedSkill(skills.findIDByName("rocket")); rocket.setFloat("damage", 200.0); rocket.setValue("radius", 64); rocket.setFloat("rocket_speed", 3.0); //... rocket.start(client);
Teraz mozemy w innym pluginie uzyc tego samego skilla, ale z innymi ustawieniami
Bez tego musieli bysmy ponownie napisac 120 linijek kodu, a takto jedynie jestesmy zmuszenie do napisania zaledwie 6 linijek
(Czesc) Skill API z Polskim opisem:
methodmap SkillID __nullable__ { // Tworzy nowy skill // Do dzialania wymaga Cmod_SkillCore // // @param name Nazwa skilla // @return Jesli skill o danej nazwie istnieje zwraca SkillID_Invalid, // W przeciwnym przypadku zwraca id skilla public native SkillID(char[] name); // Pobiera nazwe skilla // Do dzialania wymaga Cmod_SkillCore // // @param buffor Buffor gdzie bedzie skopiowania nazwa // @param maxLength Maksymalna wielkosc buffora public native void getName(char[] buffor, int maxLength); // Ustawia opis skilla // Do dzialania wymaga Cmod_SkillCore // // @param desc Opis jaki ma ustawic public native void setDesc(char[] desc); // Pobiera opis skilla // Do dzialania wymaga Cmod_SkillCore // // @param buffor Buffor gdzie bedzie skopiowany opis // @param maxLength Maksymalna wielkosc buffora public native void getDesc(char[] buffer, int maxLength); // Usuwa skill // Do dzialania wymaga Cmod_SkillCore public native void remove(); // Sprawdza czy skill jest prawidlowy // Do dzialania wymaga Cmod_SkillCore // // @return True jesli skill jest poprawna // False w kazdym innym przypadku public native bool isValid(); // Hookuje event Start skilla // Do dzialania wymaga Cmod_PreparedSkill // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookStart(SkillStartCB callback); // Odhookowuje event Start skilla // Do dzialania wymaga Cmod_PreparedSkill // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookStart(SkillStartCB callback); // Hookuje event Stop skilla // Do dzialania wymaga Cmod_PreparedSkill // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookStop(SkillStopCB callback); // Odhookowuje event Stop skilla // Do dzialania wymaga Cmod_PreparedSkill // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookStop(SkillStopCB callback); // Hookuje event Prepare skilla // Do dzialania wymaga Cmod_PreparedSkill // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookPrepare(SkillPrepareCB callback); // Odhookowuje event Prepare skilla // Do dzialania wymaga Cmod_PreparedSkill // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookPrepare(SkillPrepareCB callback); }; methodmap CmodSkill { // Zwraca maksymalna dlugosc nazwy // Do dzialania wymaga Cmod_SkillCore property int maxNameLength { public native get(); } // Zwraca maksymalna dlugosc opisu // Do dzialania wymaga Cmod_SkillCore property int maxDescLength { public native get(); } // Hookuje stworzenie skilla // Do dzialania wymaga Cmod_SkillCore // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookCreateSkill(SkillCreateCB callback); // Odhookowuje stworzenie skilla // Do dzialania wymaga Cmod_SkillCore // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookCreateSkill(SkillCreateCB callback); // Hookuje usuniecie skilla // Do dzialania wymaga Cmod_SkillCore // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookRemoveSkill(SkillRemoveCB callback); // Odhookowuje usuniecie skilla // Do dzialania wymaga Cmod_SkillCore // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookRemoveSkill(SkillRemoveCB callback); // Zwraca ID skilla o danej nazwie // Do dzialania wymaga Cmod_StatsCore // // @param name Nazwa skilla // @return SkillID_Invalid jesli statystyka o danej nazwie nie istnieje // W przeciwnym wypadku SkillID statystyki public native SkillID getIDByName(char[] name); };
(Czesc) PreparedSkill API z Polskim opisem:
methodmap PreparedSkill __nullable__ { // Tworzy nowy PreparedSkill // Do dzialania wymaga Cmod_PreparedSkill // // @param targetSkill Docelowy skill // @return ID PreparedSkill public native PreparedSkill(SkillID targetSkill); // Usuwa PreparedSkill // Do dzialania wymaga Cmod_PreparedSkil public native void remove(); // Sprawdza czy PreparedSkill jest prawidlowy // Do dzialania wymaga Cmod_PreparedSkil // // @return True jesli PreparedSkill jest poprawna // False w kazdym innym przypadku public native bool isValid(); // Ustawia wartosc typu value // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucz // @param value Wartosc // @param replace Jesli istnieje czy ma zamienic public native bool setValue(char[] key, any value, bool replace = false); // Ustawia wartosc typu float // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @param value Wartosc // @param replace Jesli istnieje czy ma zamienic public native bool setFloat(char[] key, float value, bool replace = false); // Ustawia wartosc typu string // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @param value Wartosc // @param replace Jesli istnieje czy ma zamienic public native bool setString(char[] key, char[] value, bool replace = false); // Ustawia wartosc typu array // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @param array Tablica ktora ma ustawic // @param numItems Ilosc elementow tablicy // @param replace Jesli istnieje czy ma zamienic public native bool setArray(char[] key, any[] array, int numItems, bool replace = false); // Pobiera wartosc klucza // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @return Wartosc klucza public native any getValue(char[] key); // Pobiera wartosc klucza // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @return Wartosc klucza public native float getFloat(char[] key); // Pobiera ciag znakow z klucza // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @param buffor Buffor do ktorego bedzie skopiowana wartosc // @param maxLength Maksymalna dlugosc buffora public native bool getString(char[] key, char[] buffor, int maxLength); // Pobiera ciag znakow z klucza // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @param array Tablica do ktorej zostana skopiowane pozycjie // @param maxSize Maksymalna wielkosc tablicy public native bool getArray(char[] key, any[] array, int maxSize); // Pobiera typ wartosci klucza // Do dzialania wymaga Cmod_PreparedSkil // // @param key Nazwa klucza // @return Typ wartosci klucza public native PreparedVarType getVarType(char[] key); // Wywoluje event Start // Do dzialania wymaga Cmod_PreparedSkil // // @param entity Byt dla jakiego ma wywolac public native void start(int entity); // Wywoluje event Stop // Do dzialania wymaga Cmod_PreparedSkil // // @param entity Byt dla jakiego ma wywolac public native void stop(int entity); }
Wiecej w API (nie stety bez opisow)