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

Jak pisać pluginy - przykład Exp Mod


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 wonsz żeczny

    Wszechwidzący

  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 17.01.2016 15:12

*
Popularny

Witam.

W tym poradniku zaprezentuję Ci jak pisać pluginy i jeżeli nigdy nie napisałeś żadnego pluginu to będzie to twój pierwszy dobry plugin.

A teraz rozluźnij się, włącz cichą muzykę oraz zadbaj aby w twoim otoczeniu nikt Ci nie przeszkadzał.

Jeżeli chcesz naprawdę się czegoś nauczyć to przeczytaj cały post dokładnie i staraj się wszystko zrozumieć.

Gotowy? Do dzieła!

 

Stwórz sobie plik .sma

Aby to zrobić stwórz zwykły plik tekstowy i otwórz go po czym w lewym górnym rogu wybierz Zapisz jako.

W pole Nazwa pliku wpisz ExpMod.sma a niżej w typ zaznacz Wszystkie pliki.

 

Okej. Otwórz go i dodaj podstawową biblioteke

#include <amxmodx>

dalej zadefiniuj nazwę pluginu, wersję oraz autora.

#define PLUGIN "ExpMod"
#define VERSION "1.0"
#define AUTHOR "Nick"

Jako Nick wpisz swoją nazwę, tak ty będziesz autorem tego pluginu.

 

Teraz trzeba zapublikować podstawową funkcję czyli

public plugin_init()
{

tutaj najpierw rejestrujemy to co zadefiniowaliśmy.

	register_plugin( PLUGIN, VERSION, AUTHOR )

Okej. Jako, że to jest Exp Mod musimy też zarejestrować Zabicie gracza aby dostawać exp za zabicie.

Robimy to za pomocą tego:

	register_event( "DeathMsg", "DeathMsg", "a" )

Drugie DeathMsg odnosi nas do zapublikowania tej rejestracji, więc robimy to.

public DeathMsg()
{

Dobrze Ci idzie! :D

Teraz tworzymy zmienne przechowujące informacje o osobie która Zabija oraz Ginie.

	new Zabojca = read_data( 1 )
	new Ofiara = read_data( 2 )

Teraz bardzo ważna rzecz. Trzeba stworzyć warunek.

	if( Zabojca == Ofiara )
	return PLUGIN_HANDLED

Pytanie. Kiedy Zabójca jest Ofiarą? Jest wtedy gdy popełnia samobójstwo np. spadając z dużej wysokości lub ginie poprzez elementy na mapie jak lawa czy jakieś kolce.

A co robi return PLUGIN_HANDLED ? Linijka ta "zatrzymuje" działanie pluginu jeżeli Zabójca jest Ofiarą.

Wszystko jasne? Lecim dalej.

Teraz trzeba stworzyć warunek czy osoba zabijająca jest "Graczem". Wygląda to tak.

	if( Gracz( Zabojca ) )
	{

Zaraz zaraz. Skąd silnik ma to wiedzieć? Dowiesz się w dalszej części poradnika. Gracz() odpowiednio zapublikujemy!

Teraz jeżeli te warunki są spełnione możemy dodać graczowi Exp.

	DodajExp( Zabojca )

To też zapublikujemy.

Ale też po dodaniu Expa trzeba sprawdzić czy czasem nie trzeba dodać poziomu. Więc dodajemy linjke

	SprawdzPoziom( Zabojca )

oraz

	return PLUGIN_CONTINUE
}

Sprawę zabijania mamy za sobą!

Teraz publikujemy dodawanie expa.

public DodajExp( id )
{

Pokażę ci jak również dodać exp dla vipa!

	if(get_user_flags(id) & ADMIN_LEVEL_H)
	{
	Exp[ id ] = Exp[ id ] + 20
	} else {
	Exp[ id ] = Exp[ id ] + 10
	}
}

Jak widzisz dodaliśmy warunek, jeżeli gracz posiada flage ADMIN_LEVEL_H dostanie 20 expa.

po czym dałem "else" znaczy ono dokładnie "jeśli nie" czyli jeśli gracz nie ma tej flagi dostanie 10 expa.

Pokazała się nowa rzecz czyli Exp[ id ]

Na samej górze pod definiami dodajemy więc 

new Exp[33]

Zmienna która będzie przechowywała informacje o naszym expie.

Teraz publikujemy sprawdzanie naszego expa.

public SprawdzPoziom( id )
{

pod czym dodajemy też warunek ale troszeczkę inny ale nie będę Ci nim mieszał w głowie i mówił dlaczego on tutaj się znajduje.

	while( Exp[ id ] >= POZIOMY[ Poziom[ id ] ] && Poziom[ id ] < MAXPOZIOM )
		Poziom[ id ] ++

Co tu się dzieje?

Oznacza to, jeśli Exp gracza jest "większy lub równy" od wymaganego poziomu to doda nam poziom w góre.

Jest też drugi warunek po && oznacza on, że doda nam poziom tylko wtedy gdy poziom ma być mniejszy niż maxymalny poziom.

Pokazały się nowe rzeczy jak m.in. Poziom[ id ]

Przechowuje on informacje o naszym poziomie więc musimy dodać zmienną. Wiesz gdzie ją dodać z przykładu zmiennej expa.

new Poziom[33]

Pokazało się nawet MAXPOZIOM

To już rzeba zadefiniować

#define MAXPOZIOM 100

Oraz coś jak POZIOMY[ Poziom[ id ] ]

Do tego też trzeba stworzyć zmienną do przechowywania tych informacji.

//Wygenerowane na amxx.pl
new const POZIOMY[ MAXPOZIOM ] = {
	0,
	81, 102, 251, 475, 766, 1120, 1577, 2093, 2644, 3263, 
	4040, 4888, 5785, 6745, 7829, 8926, 10119, 11340, 12809, 14402, 
	16042, 17686, 19365, 21050, 22818, 24625, 26584, 28702, 30985, 33332, 
	35762, 38212, 40758, 43443, 46212, 49003, 51956, 54933, 58010, 61135, 
	64261, 67489, 70734, 74087, 77444, 80864, 84447, 88269, 92166, 96063, 
	100095, 104191, 108329, 112555, 116927, 121347, 125838, 130332, 134840, 139401, 
	144071, 148823, 153579, 158594, 163792, 169027, 174347, 179702, 185179, 190663, 
	196194, 201775, 207372, 213145, 218925, 224925, 230931, 237143, 243361, 249714, 
	256163, 262627, 269118, 275795, 282515, 289287, 296152, 303085, 310096, 317283, 
	324512, 331833, 339156, 346534, 354000, 361544, 369225, 376999, 384826
}

Zaraz zaraz.. tutaj mamy POZIOMY[ MAXPOZIOM ] a tam POZIOMY[ Poziom[ id ] ]

To określa jaki mamy poziom czyli np. mamy poziom expa 102 czyli poziom 2 bodajże :D

 

Teraz jescze zamykamy naszą publikacje SprawdzPoziom( id ) za pomocą tego

	return PLUGIN_CONTINUE
}

Okej. Mieliśmy jeszcze zapublikować Gracza.

public Gracz( id )
{

i dodajemy waruneczek :)

	if( is_user_connected( id ) && is_user_alive( id ) )
		return true
	
	return false 
}

Oznacza on, że jeżeli gracz jest połączony oraz gracz jest żywy to wtedy zwraca "true" czyli prawdziwość.

Po czym jeżeli to się stało zwracamy fałszywość.

 

Szkielet expa mamy za sobą, zmienne przechowują informacje ale chwilowo czyli na 1 mape.

Trzeba je zapisać na kolejne mapy, użyjemy do tego zapis nvault na nick.

Jest to już w innej bibliotece niż <amxmodx> więc dodajemy ją na górze.

#include <nvault> 

Potem dodajemy 2 publikacje.

public client_connect( id )
{
	WczytajExp( id )
}

Czyli przy połączeniu się gracza z serwerem wczyta exp, oczywiście musimy to potem zapublikować.

Ale teraz dodajmy jeszcze 

public client_disconnect( id )
{
	ZapiszExp( id )
}

Zapisujemy exp przy rozłączeniu gracza z serwerem.

Teraz nasze kochane publikacje:

public WczytajExp( id )
{

Pod czym dodajemy nasz zapis na nick

	new name[ 35 ]
	new vaultdata[ 256 ]
	new vaultkey[ 64 ]
	get_user_name( id, name, 34 )
			
	format( vaultkey, 63, "%s-NAME", name )	
	format( vaultdata,255, "%i#%i#", Poziom[ id ], Exp[ id ] ) 	
	nvault_get( vault, vaultkey, vaultdata, 255 ) 
	replace_all( vaultdata , 255, "#", " " )

	new poziom[ 32 ], exp[ 32 ]

	parse( vaultdata, poziom, 31, exp, 31 ) 
	Poziom[ id ] = str_to_num( poziom )
	Exp[ id ] = str_to_num( exp ) 

	return PLUGIN_CONTINUE
}

O co tutaj chodzi.. :D

Na początku mamy zmienne które przechowają informacje o nazwie gracza oraz dane nvault po czym te informacje zostaną zapisane w pliku na serwerze.

Dalej tworzymy tzw. format czyli co ma się znajdować w tym pliku. Znajdować się będzie np. takie coś:

Wonsz żeczny-name

oraz

10#1346

czyli mamy 10 poziom i 1347 expa. (przykład)

Te informacje będą wczytywane.

Publikujemy 

public ZapiszExp( id )
{

pod czym znów zmienne oraz dane do zapisywania

	new name[ 35 ]
	get_user_name( id, name, 34 )
	new vaultdata[ 256 ]
	new vaultkey[ 64 ]
			
	format( vaultkey, 63, "%s-NAME", name )
	format( vaultdata, 255, "%i#%i#", Poziom[ id ], Exp[ id ] )
	nvault_set( vault , vaultkey, vaultdata ) 
}

Mamy też rzecz nową czyli vault

Chwilowa informacja, musimy oczywiście stworzyć z tym zmienną na samej górze czyli

new vault

Teraz zajmiemy się utworzeniem pliku na serwerze w którym zapisywać się będą dane.

Robimy to w publikacji plugin_init

	vault = nvault_open( "ZapisExpMod" ) 

Gdzie "ZapisExpMod" to będzie nazwa pliku.

 

 

Okej mamy piękny zapis a teraz stworzymy sobie napis na ekranie gdzie będzie pokazywany nasz poziom oraz exp.

Do tego tworzymy od razu zmienną do przechowania informacji o tym

new HUD

oraz użwamy tego

	HUD = CreateHudSyncObj()

Dodajemy to do publikacji plugin_init

 

Publikujemy naszego huda np. tak:

public PokazHUD( id )
{

oraz dodajemy warunek aby wszystko pięknie grało:

	if( !Gracz( id ) )
	return PLUGIN_HANDLED

A po co tam ten wykrzyknik? Wykrzyknik przed daną rzeczą oznacza jego przeciwność. Czyli jeżeli osoba nie jest graczem to 

zatrzymujemy plugin za pomocą return PLUGIN_HANDLED

 

Teraz tworzymy informacje o położeniu naszych napisów:

	set_hudmessage(255, 0, 0, 0.03, 0.30, 0, 0.0, 0.3, 0.0, 0.0)

Informacje o tym znajdziecie tutaj: http://amxx.pl/topic...domości-na-hud/

A dalej lecimy z napisami jakie mają być na tym ekranie 

	ShowSyncHudMsg(id, HUD , "Poziom: %d ^nExp: %d / %d", Poziom[ id ], Exp[ id ], POZIOMY[ Poziom[ id ] ] )

%d przenosi nas poza napisy i bierze informacje z danej zmiennej.

A dlaczego nie %s ? Z literką s bierzemy "słowa" a literka %d lub %i  liczby.

 

Zamykamy teraz naszą publikację 

	return PLUGIN_HANDLED
}

Zatrzymujemy działanie huda, ponieważ został on wyświetlony wiec aby się nie wyświetlał on nam cały czas.

Teraz musimy pokazać ten hud w danym momencie.

My pokażemy ten hud przy odrodzeniu gracza czyli w publikacji plugin_init rejestrujemy to odrodzenie

	RegisterHam( Ham_Spawn, "player", "Odrodzenie", 1 )

Pokazała się rejestracja z nowej biblioteki więc na samej górze dodajemy 

#include <hamsandwich>

A teraz nasze Odrodzenie zapublikujemy:

public Odrodzenie( id )
{
	set_task( 0.1, "PokazHUD", id, _, _, "b" )
}

W środku znajduje się set_task czyli po 0.1 sekundzie przejdzie do publikacji PokazHUD która nam ten hud wyświetli.

 
Jeżeli wam się podoba, mogę zrobić kolejny poradnik na przykładnie tworzenia np. sklepu oraz waluty do niego.
 

  • +
  • -
  • 10

#2 RaS_

    Wszechwidzący

  • Użytkownik

Reputacja: 20
Życzliwy

  • Postów:261
  • GG:
  • Steam:steam
  • Imię:Kacper
  • Lokalizacja:De_Dust2
Offline

Napisano 17.01.2016 21:27

Morzesz jeszcze napisac jak sie robi menu dla kogos sie przyda ale masz +
  • +
  • -
  • 0

#3 diablo9816

    Życzliwy

  • Użytkownik

Reputacja: 7
Nowy

  • Postów:29
  • Lokalizacja:lublin
Offline

Napisano 18.01.2016 17:12

@up Jak już to pisze się "możesz"


  • +
  • -
  • 1

#4 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 18.01.2016 19:37

@kryjryj tutaj masz wszystko wyjaśnione jeżeli chodzi o menu.

http://amxx.pl/topic...menu-przykłady/

 

+Poprawka co do tutoriala, to 

	while( Exp[ id ] >= POZIOMY[ Poziom[ id ] ] && Poziom[ id ] < MAXPOZIOM )
		Poziom[ id ] ++

zamieniamy na

	while( Exp[ id ] >= POZIOMY[ Poziom[ id ] ] && Poziom[ id ] <= MAXPOZIOM )
		Poziom[ id ] ++

Teraz gdy mamy max 100 lvl to będzie można wbić 100 a nie 99.

 

Oraz to 

new const POZIOMY[ MAXPOZIOM ] = {

można łatwo wygenerować na amxx.pl/generator


  • +
  • -
  • 1

#5 Robiin

    Godlike

  • Support Team

Reputacja: 1 106
Super Hero

  • Postów:2 049
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 19.01.2016 16:27

.


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#6 SkillCIty

    Życzliwy

  • Użytkownik

Reputacja: 0
Nowy

  • Postów:20
Offline

Napisano 19.01.2016 17:36

Dodaj gotowe *SMA oraz poradnik jak dodać do tego staty (Zdrowie,Kondycha)


  • +
  • -
  • 0

#7 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 19.01.2016 20:09

@asik

W kompilatorze pisze w jakiej to linijce.

Masz:

 

Scieszka do pliku/plugin.sma<tutaj jest linijka> : error 000: nazwa erroru

 

Otwierasz .sma w notatniku, wciskasz na raz CTRL+G i wpisujesz linjkę z kompilatora.

Tam poszukaj błędu, pokombinuj poprzekręcaj jak nie wyjdze to napisz tutaj :D

 

@SkillClty

staty np. zdrowie czy kondycha już musisz sam napisać. Polecam zerkać już do gotowych pluginów, przykłady:

 

http://amxx.pl/topic...-mw-mod-update/

http://amxx.pl/topic...lder-skill-mod/

 


  • +
  • -
  • 1

#8 Robiin

    Godlike

  • Support Team

Reputacja: 1 106
Super Hero

  • Postów:2 049
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 20.01.2016 18:21

@Up wiem o co chodzi ;>

Kompiluję parenaście/dziesiąt pluginów tygodniowo więc wiem :>

Lokalnie te same błędy, wszystkei biblioteki są, sam kod jest wadliwy, dlatego chciałem całe .sma, żeby porównać to co napisałem i przeobiłem Ja, z tym co jest oryginalnie i poprawnie w pluginie 


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#9 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 24.01.2016 01:13

Nie dodałem 1 rzeczy i pewnie dlatego.

Zamknij 

public plugin_init()

czyli za 

	register_event( "DeathMsg", "DeathMsg", "a" )

daj 

}

Nie dodałem tego tam i pewnie przez to wam nie chce się skompilować.

 

Proszę admina o edycję tego w 1 poście.


  • +
  • -
  • 1

#10 Snuffi

    Początkujący

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:17
  • Imię:Adrian
  • Lokalizacja:PTB
Offline

Napisano 02.02.2016 18:22

Powiedz mi co tu nie jest nie tak ?

Spoiler

  • +
  • -
  • 0

sygnaturka.png

 


#11 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 02.02.2016 18:31

public SprawdzPoziom( id )
{
    while( Exp[ id ] >= POZIOMY[ Poziom[ id ] ] && Poziom[ id ] < MAXPOZIOM )
        Poziom[ id ] ++

tutaj brakuje ci klamry do zamknięcia.

 

Dokładnie to

new const POZIOMY[ MAXPOZIOM ] = {
    0,
    81, 102, 251, 475, 766, 1120, 1577, 2093, 2644, 3263,
    4040, 4888, 5785, 6745, 7829, 8926, 10119, 11340, 12809, 14402,
    16042, 17686, 19365, 21050, 22818, 24625, 26584, 28702, 30985, 33332,
    35762, 38212, 40758, 43443, 46212, 49003, 51956, 54933, 58010, 61135,
    64261, 67489, 70734, 74087, 77444, 80864, 84447, 88269, 92166, 96063,
    100095, 104191, 108329, 112555, 116927, 121347, 125838, 130332, 134840, 139401,
    144071, 148823, 153579, 158594, 163792, 169027, 174347, 179702, 185179, 190663,
    196194, 201775, 207372, 213145, 218925, 224925, 230931, 237143, 243361, 249714,
    256163, 262627, 269118, 275795, 282515, 289287, 296152, 303085, 310096, 317283,
    324512, 331833, 339156, 346534, 354000, 361544, 369225, 376999, 384826
}

przenieś gdzieś na górę kodu, zmienne najlepiej tam wpychać :D

public DeathMsg()
{
    new Zabojca = read_data( 1 )
    new Ofiara = read_data( 2 )
    
    if( Zabojca == Ofiara )
    
    if( Gracz( Zabojca ) )
    
    DodajExp( Zabojca )
    
    SprawdzPoziom( Zabojca )
    
    return PLUGIN_CONTINUE
}

popraw tutaj na to: 

    if( Zabojca == Ofiara )
        return PLUGIN_HANDLED

oraz popraw też na to:

    if( !Gracz( Zabojca ) )
        return PLUGIN_HANDLED

  • +
  • -
  • 2

#12 Snuffi

    Początkujący

  • Użytkownik

Reputacja: 1
Nowy

  • Postów:17
  • Imię:Adrian
  • Lokalizacja:PTB
Offline

Napisano 02.02.2016 18:44

zrobiłe to co napisałeś lecz nadal wywala błędy

Dam ci SS

gjwIHED.png


  • +
  • -
  • 0

sygnaturka.png

 


#13 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 07.02.2016 01:55

Macie poprawne sma do porównania :)

 

 

Załączony plik  ExpMod.sma   2,53 KB  119 Ilość pobrań
  ExpMod.amxx


Użytkownik wonsz żeczny edytował ten post 07.02.2016 02:10

  • +
  • -
  • 1




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

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