←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

[Cmod] Tworzenie podst. klasy + mały opis api

  • +
  • -
plx211 - zdjęcie plx211 06.04.2015

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 :D
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
Spoiler

 
Cmod_GetClientBonusWeapons
Spoiler

 
Cmod_GetAllowWeapons
Spoiler

 
Cmod_GetClientWeapons
Spoiler

 

2.2 Forwardy



Cmod_OnClassEnabled
Spoiler

 
Cmod_OnClassDisabled
Spoiler

 
Cmod_OnClientUseSkill
Spoiler

 
Cmod_OnGetNewClassID
Spoiler

 
[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
Odpowiedz

  • +
  • -
Z!3L0ny - zdjęcie Z!3L0ny 06.04.2015

Przyda się + dla ciebie za robotę

Odpowiedz

Wiktor.? - zdjęcie Wiktor.? 07.04.2015

Bardzo przydatne, gdyż się będe uczył je pisać...

Odpowiedz

  • +
  • -
Xeane - zdjęcie Xeane 26.05.2015

zamierzone czy bug że co rundę klasa dostaje znów broń? (ma np famasa, nowa runda wyrzuca famasa i dostaje nowego)

Odpowiedz

  • +
  • -
plx211 - zdjęcie plx211 26.05.2015

zamierzone i to nie tyczy sie klasy (pisania) a silnika


Użytkownik plx211 edytował ten post 26.05.2015 20:51
Odpowiedz

  • +
  • -
Andrew123 - zdjęcie Andrew123 15.07.2015

Skąd mogę wziąć kompilator sourcemoda z api cmod?

Odpowiedz

bas233 - zdjęcie bas233 06.08.2015

Dlaczego jak chcę skompilować klasę to wyskakuje fatal error 

 

Klasa :

 

#include <sdktools>
#include <sdkhooks>
#include <sourcemod>
#include <cmod>
 
//Tworzymy zmienne przechowujące informacje o klasie oraz je wypełniamy
new const String:nazwaKlasy[] = "Madafaka";
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 = "Madafaka",
    author = "Kamper",
    description = "Przy każdym użyciu skilla dostaj flash'a",
    version = "1.0",
    url = "sadasdsa.pl"
}
 
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");
}
 
 
Odpowiedz