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)


Dodatki SourceMod













