W nowej wersji cmoda (1.0+), statystyki zostaly wyrzucone do osobnych pluginów (tak jak bylo z klasami/itemami w poprzednim "prototypie")
Bedzie nam potrzebne:
- Znajomosc skladni SP 1.7+
- Znajomosc methodmap (polecam tut z alliedow)
- Wgrany na server plugin Cmod_StatsCore do testow
- Kompilator SP 1.8+ z biblioteka cmod'a
- O nazwie "TestStats"
- Z opisem "bla bla moja statystyka"
- Pod czas aktywacji ma pisac na czacie gracza "Statystyka o id X zostala aktywowana z moca Y pktow"
#include <sourcemod> #include <cmod> public void OnPluginStart() { } public void OnPluginEnd() { }Przydala by nam sie zmienna ktora bedzie przechowywac ID statystyki, dlatego pod include dodajemy
static StatsID testStats;Przyszedl czas na rejestracje statystyki w silniku, w funkcji OnPluginStart() dodajemy nastepujaca linijke:
testStats = new StatsID("TestStats");Dobra 1 zalozenie spelnione

Przyszedl czas na opis, w tym celu pod powyzsza linijka dodajemy:
testStats.setDesc("bla bla moja statystyka");Prawda ze proste?
No to czas na finnalne zalozenie, czyli:
Pod czas aktywacji ma pisac na czacie gracza "Statystyka zostala aktywowana z moca X pktow"A wiec do dziela, na samym dole tworzymy nowa publiczna funkcjie, ktora bedzie sluzyla nam za callback:
public void onActivate(StatsID statsID, int client, int points) { }Oczywiscie nie musimy nazywac funkcji onActivate, nasza funkcja musi spelniac tylko ponizsza zaleznosc:
typeset StatsActivateCB { function void (StatsID statsID, int client, int points); };Wracajac do zalozenia, dodajemy teraz wewnatrz naszej przepieknej funkcji:
PrintToChat(client, "Statystyka o id %d zostala aktywowana z moca %d pktow", statsID, points);Tylko ze sama funkcjia nam nic nie da, musimy jeszcze powiadomic silnik aby ja wywolywal, w tym celu pod funkcjia odpowiadajaca za opis dodajemy:
testStats.hookActivate(onActivate);Ale chwileczke nie zapomnielismy o czyms? Jest to bardzo wazne, do funkcji OnPluginEnd() dodajemy nastepujacy kod:
testStats.remove();Odpowiada to za wyrejestrowanie statystyki z silnika.
Skonczone

Finnalnie nasz kod powinnien wygladac tak:
#include <sourcemod> #include <cmod> StatsID testStats; public void OnPluginStart() { testStats = new StatsID("TestStats"); testStats.setDesc("bla bla moja statystyka"); testStats.hookActivate(onActivate); } public void OnPluginEnd() { testStats.remove(); } public void onActivate(StatsID statsID, int client, int points) { PrintToChat(client, "Statystyka o id %d zostala aktywowana z moca %d pktow", statsID, points); }Czas na testy,
Activate jest wywolywane po chwilke po respawnie przez plugin Cmod_Client,
Wiec mozemy czekac na respawn, lub posluzyc sie ponizszym kodem:
#include <sourcemod> #include <cmod> CmodStats cmodStats; public void OnPluginStart() { RegConsoleCmd("sm_teststats", cmd_sm_teststats); } public Action cmd_sm_teststats(int client, int argc) { StatsID statsID = cmodStats.findIDByName("TestStats"); // uzyskujemy id statystyki przez jej nazwe statsID.sendActivate(client, GetRandomInt(1, 100)); // aktywujemy statystyke dla gracza ktory wpisal komende, z losowa iloscia pktow (od 1 do 100) }Teraz wystarczy wklepac w konsole sm_teststats i mozemy podziwiac efekty

Ale chwilke, dlaczego musze recznie podawac liczbe pktow?
Na czas pisania poradnika nie zostalo jeszcze zaimplementowane

Ale juz nie bawem na pewnno sie pojawi (zapewnne znajdzie sie on w pluginie Cmod_Client)
(Czesc) Stats API z Polskim opisem:
methodmap StatsID __nullable__ { // Tworzy nowa statystyke // Do dzialania wymaga Cmod_StatsCore // // @param name Nazwa statystyki // @return Jesli statatystyka o danej nazwie istnieje zwraca StatsID_Invalid, // W przeciwnym przypadku zwraca id statystyki public native StatsID(char[] name); // Pobiera nazwe statystyki // Do dzialania wymaga Cmod_StatsCore // // @param buffor Buffor gdzie bedzie skopiowana nazwa // @param maxLength Maksymalna wielkosc buffora public native void getName(char[] buffor, int maxLength); // Ustawia opis statystyki // Do dzialania wymaga Cmod_StatsCore // // @param desc Opis jaki ma ustawic public native void setDesc(char[] desc); // Pobiera opis statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param buffer Buffor gdzie bedzie skopiowany opis // @param maxLength Maksymalna wielkosc buffora public native void getDesc(char[] buffer, int maxLength); // Usuwa statystyke // Do dzialania wymaga Cmod_StatsCore public native void remove(); // Sprawdza czy statustyla jest prawidlowa // Do dzialania wymaga Cmod_StatsCore // // @return True jesli statysyka jest poprawna // False w kazdym innym przypadku public native bool isValid(); // Hookuje aktywacje statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookActivate(StatsActivateCB callback); // Odhookowuje aktywacje statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookActivate(StatsActivateCB callback); // Wysyla aktywacjie statystyki // Do dzialania wymaga Cmod_StatsCore // // @param client ID clienta dla ktorego aktywujemy statystyke // @param points Liczba pktow statystyki public native void sendActivate(int client, int points); }; methodmap CmodStats { // Zwraca maksymalna dlugosc nazwy // Do dzialania wymaga Cmod_StatsCore property int maxNameLength { public native get(); } // Zwraca maksymalna dlugosc opisu // Do dzialania wymaga Cmod_StatsCore property int maxDescLength { public native get(); } // Hookuje stworzenie nowej statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookCreateStats(StatsCreateCB callback); // Odhookowuje stworzenie nowej statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookCreateStats(StatsCreateCB callback); // Hookuje usuniecie statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param callback Funkcja ktora ma byc wywolana // @return True jesli zahookowalo // False w kazdym innym przypadku public native bool hookRemoveStats(StatsRemoveCB callback); // Odhookowuje usuniecie statatystyki // Do dzialania wymaga Cmod_StatsCore // // @param callback Funkcja ktora byla wywolana // @return True jesli odhookowalo // False w kazdym innym przypadku public native bool unhookRemoveStats(StatsRemoveCB callback); // Zwraca ID statystyki o danej nazwie // Do dzialania wymaga Cmod_StatsCore // // @param name Nazwa statystyki // @return StatsID_Invalid jesli statystyka o danej nazwie nie istnieje // W przeciwnym wypadku StatsID statystyki public native StatsID getIDByName(char[] name); };Wiecej w API (nie stety bez opisow)