Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[Cmod][Poziom podstawowy] Tworzenie skilla

cmod skill skillid tworzenie

  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 plx211

    Wszechpomocny

  • Użytkownik

Reputacja: 231
Wszechwidzący

  • Postów:397
  • Lokalizacja:Polska
Offline

Napisano 25.03.2016 21:24

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)


  • +
  • -
  • 3





Również z jednym lub większą ilością słów kluczowych: cmod, skill, skillid, tworzenie

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych