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
 

LoZt - zdjęcie

LoZt

Rejestracja: 14.01.2013
Aktualnie: Nieaktywny
Poza forum Ostatnio: 05.02.2013 16:48
-----

#340551 Tabela serwerów Online v2.0 *AKTUALIZACJA*

Napisane przez Zapalka w 27.12.2011 17:53

Witam, chciałbym przedstawić wam Tabelę serwerów Online, jeden styl jest zaczerpnięty i odświeżony z tabeli od Dj ^^ d(-.-)b.

Tabelka standardowo posiada 3 style, oto one:
Standardowy:
Dołączona grafika

Black(z tabelki Dj ^^ d(-.-)b):
Dołączona grafika

oraz Blue:
Dołączona grafika


Tabelka standardowo odświeża informacje co 30 sekund, informacje odświeżane są AJAX'em, czyli bez odświeżania strony. Cała tabelka się nie przeładowywuje, odświeżają się same dane.
Oczywiście odstępy czasowe między odświeżeniami można dowolnie zmieniać.
Tabela obsługuje gry:
- Counter Strike 1.6
- Counter Strike: Source
- Counter Strike: Global Offensive
- Call of Duty 2
- Call of Duty 4
- Team Fortress 2
oraz serwery głosowe:
- Team Speak 3
- Ventrilo

Lista informacji, które pokazuje tabela:
- Status(online/offline),
- Nazwa serwera,
- IP serwera,
- Liczba graczy,
- Aktualnie grana mapa,
- Hasło(Tak/Nie),
- Cvary, które można dowolnie ustawić,
- Lista graczy wraz z ilością fragów (Po najechaniu myszką na liczbę graczy),
- Następną mapę (Po najechaniu myszką na aktualnie graną mapę, tylko serwery cs 1.6),
- Czas do zmiany mapy (Po najechaniu myszką na aktualnie graną mapę, tylko serwery cs 1.6),
- Link do HLTV (jeśli dodany)

Wszystkie pobierane informacje są zapisywane w cache aby przyśpieszyć ładowanie strony i odciążyć zarówno serwery gry jak i serwer www.

Tabela w żaden sposób nie ogranicza ilości wstawianych serwerów.

Teraz opiszę trochę edytowalną część pliku config.php
Linijka 8:
$main['cache_time']=30;

Na jaki czas mają zostawać zapisywane informacje.

Linijka 11:
$automatyczne_odswiezanie=30;

Co jaki czas informacje w tabelce mają być odświeżane
0 - wyłącza

Linijka 13:
$licz['ts3']=0;

Czy serwery Team Speak 3 mają być uwzględniane w podsumowaniu(pod serwerami)
0 - Nie
1 - Tak

Linijka 14:

$licz['ventrilo']=0;

Czy serwery Ventrilo mają być uwzględniane w podsumowaniu(pod serwerami)
0 - Nie
1 - Tak

Linijka 16:
$podsumowanie=1;

Czy podsumowanie ma być pokazywane(pod serwerami)
0 - Nie
1 - Tak


Linijka 18:
$nazwa_serwera=0;

Pobierać nazwę serwera przy połączeniu czy używać tej wpisanej niżej.

0 - Stała nazwa serwera pobierana z tego pliku
1 - Nazwa serwera pobierana przy połączeniu z serwerem.


Dalej ustawia się cvary, które mają być pobierane i widoczne po najechaniu myszką na nazwę serwera:
$cvars[]= array(
'cs'=>array(0=>array(0=>'amxmodx_version',1=>'Wersja amxx:'),1=>array(0=>'amxbans_version',1=>'Wersja amxbans:'),2=>array(0=>'mp_timelimit',1=>'Czas mapy:')),
'csgo'=>array(0=>array(0=>'sourcemod_version',1=>'Wersja SourceMod:'),1=>array(0=>'mp_maxrounds',1=>'Liczba rund:'),2=>array(0=>'deathmatch',1=>'DeathMatch:')),
'cssource'=>array(0=>array(0=>'sourcemod_version',1=>'Wersja SourceMod:'),1=>array(0=>'mp_maxrounds',1=>'Liczba rund:'),2=>array(0=>'deathmatch',1=>'DeathMatch:')),
'tf2'=>array(0=>array(0=>'mp_allowNPCs',1=>'NPC Włączone:'),1=>array(0=>'mp_timelimit',1=>'Czas mapy:'),2=>array(0=>'deathmatch',1=>'DeathMatch:')), 'ventrilo'=>array(0=>array(0=>'version',1=>'Wersja:'),1=>array(0=>'channelcount',1=>'Liczba kanałów:'),2=>array(0=>'uptime',1=>'Czas online:')), 'ts3'=>array(0=>array(0=>'virtualserver_version',1=>'Wersja:'),1=>array(0=>'virtualserver_channelsonline',1=>'Liczba kanałów:'),2=>array(0=>'virtualserver_uptime',1=>'Czas online:')),
'cod2'=>array(0=>array(0=>'g_gametype',1=>'Typ gry:'),1=>array(0=>'shortversion',1=>'Wersja:'),2=>array(0=>'scr_friendlyfire',1=>'FriendlyFire:')), 'cod4'=>array(0=>array(0=>'g_gametype',1=>'Typ gry:'),1=>array(0=>'shortversion',1=>'Wersja:'),2=>array(0=>'_Mod',1=>'Mod:')),
);

Cvary ustawia się dla danej gry, nie dla serwera.

Następnie można ustawić nazwę gry pokazującą się po najechaniu na ikonkę przy serwerze:
$games[]=array(
'cs'=>'Counter Strike 1.6',
'csgo'=>'Counter Strike: Global Offensive',
'cssource'=>'Counter Strike: Source',
'tf2'=>'Team Fortress 2',
'ventrilo'=>'Ventrilo',
'ts3'=>'Team Speak 3',
'cod2'=>'Call of Duty 2',
'cod4'=>'Call of Duty 4',
);


No i w końcu możemy ustawić swoje serwery ;)
$serwers[]=array(
'nazwa'=>'Nazwa serwera',
'ip'=>'adres IP serwera',
'game'=>'skrót od nazwy gry', // lista skrótów dostępna niżej
'hltv'=>'adres do hltv serwera',
'on'=>1, // Czy serwer ma być włączony(jeśli ustawisz na 0 to nie będzie go na liście)
'new'=>0, // Czy przy nazwie serwera ma być pokazywana ikonka "new" 0-nie 1-tak
'offline'=>0 // Czy serwer ma być pokazywany na liście jako wyłączony
);


Skróty nazw gier, które należy wstawiać przy dodawaniu serwera:
ts3 - Team Speak 3
cs - Counter Strike 1.6
ventrilo - Ventrilo
tf2 - Team Fortress 2
csgo - Counter Strike: Global Offensive
cod2 - Call of Duty 2
cod4 - Call of Duty 4
cssource - Counter Strike: Source

Z ostatniej opcji, 'offline' należy skorzystać, jeśli serwer jest ciągle wyłączony a ma być pokazywany w tabeli.
Dzięki zaznaczeniu tej opcji przyśpieszymy ładowanie tabeli.

Style dostępne są w folderze status. Aby użyć danego stylu wchodzimy do tego folderu, następnie wchodzimy do folderu do folderu z wybranym stylem no i kopiujemy plik style.css podmieniając ten znajdujący się w folderze status.

Jeśli chcemy stworzyć własny styl tabelki otwieramy plik style.css znajdujący się w folderze status, i tam mamy wszystko co jest potrzebne do zmian.
Własne kolory tła tabelki można pobrać ze strony: http://colorzilla.com/gradient-editor
.srvgora - tło górnego paska(Gra, Nazwa serwera...)
.srodek - cała reszta tabelki



Instrukcja instalacji tabelki

Tabelkę można zainstalować na dwa sposoby.
UWAGA! Nie można zmieniać nazw folderów ani plików, po zmianie nie ma gwarancji na działanie tabelki!

Jeśli posiadamy forum phpbb by przemo:
Zawartość pobranego archiwum wgrywamy bezpośrednio do głównego folderu forum(nie może być żadnych podkatalogów), tak aby plik status.php był wraz z innymi plikami forumowymi.
Wchodzimy do folderu status i ustawiamy CHMODY folderu cache na 777.
W tym momencie można dokonać konfiguracji pliku config.php.
No i ostatni krok, otwieramy plik index.php w głównym folderze forum i szukamy linijki na końcu pliku: "// display the index" i przed lub pod nią wklejamy ten kawałek kodu:
include($phpbb_root_path . 'status.php');

I tabelka gotowa, będzie się ona pokazywała na stronie głównej forum pod headerem i menu.


Jeśli posiadamy inne forum lub chcemy dodać tabelkę za pomocą ramki(iframe):
Jest to gorszy sposób ze względu na to, że chmurki pokazujące np. listę graczy na serwerach mogą być ucinane jeśli będą wykraczały poza ustaloną wielkość ramki.
Początek instalacji jest taki sam, zawartość pobranego archiwum wgrywamy bezpośrednio do głównego folderu forum(nie może być żadnych podkatalogów), tak aby plik status.php był wraz z innymi plikami forumowymi.
Wchodzimy do folderu status i ustawiamy CHMODY folderu cache na 777.
W tym momencie można dokonać konfiguracji pliku config.php.

No i ostatni krok, wchodzimy do panelu administracyjnego forum i dodajemy nowe ogłoszenie na stronę główną.
W treści ogłoszenia wpisujemy:
<iframe src="http://twojeforum.pl/status.php" width="100%" height="100%" frameborder="0" scrolling="no"/>

Instalacja zakończona, na stronie głównej forum powinna pojawić się tabelka.



W tej wersji tabelki poprawiłem wszystkie błędy, które ja lub wy spotykaliście i zgłosiliście.

Wszystkie problemy z tabelką oraz nowe pomysły dotyczące jej opisujcie w tym temacie.
Gdy tylko znajdę trochę więcej czasu to dodam panel, dzięki któremu będzie można w bardzo łatwy sposób zarządzać całą tabelką.


Wersja demonstracyjna tabelki: http://zapalka.net.pl/phpbb/

download
Załączony plik  Tabela serwerów v2.0.rar   192,99 KB  2740 Ilość pobrań

Załączone pliki


  • +
  • -
  • 39


#503239 gmAMXBans 1.6.1 nie wyswietla banow i nie ma powodow, mimo ze jes

Napisane przez Kawon w 18.01.2013 21:43

amxbans_use_admins_file 1

ustaw na 0

brak w plugins.ini wpisu amxbans_core/main.amxx ... :crazy:
  • +
  • -
  • 1


#492337 Skrypty do pisania klas

Napisane przez MAGNET w 21.12.2012 21:39

Witam :)
Jest to mój pierwszy post w tym dziale, wiec proszę o wyrozumiałość ^^
Krotki wstęp:
Ostatnio miałem problem z szukaniem skryptów do pisania klas, wiec zapisywałem je sobie w jednym miejscu. Tak wyszło sporo dodatkow do klas, które postanowiłem opublikować w całości.
W przyszłości też będę robił podobne tematy ;)
A więc zaczynajmy:

1.Przerabianie klasy na premium:

Spoiler


2. Niewidzialność postaci:
Spoiler


3. Grawitacja:
Spoiler

4. Multijump:
Spoiler


5. BH
Spoiler


6. Cichy bieg:
Spoiler


7. Exp za fraga:
Spoiler


8. Unlimited multijump:
Spoiler


9. Nie zabiera dmg po upadku:
Spoiler



10. Niewidzialnosc, gdy sie nie ruszasz:
Spoiler

11. 1/x na odbicie pocisku:
Spoiler


12. Lina spidermana:
Spoiler


13. Dodatkowe dmg:
Spoiler


14. 1/x z wybranej broni:
Spoiler

15. Teleport:
Spoiler


16. Model gracza w zaleznosci od teamu
Spoiler


17. Zmiana stroju CT/TT z broniami:
Spoiler

 

18. No-Recoil

Spoiler

 

19. Szansa na pojawienie się u wroga

Spoiler

 

20. Ubranie Wroga

Spoiler

 

21. Widzisz wrogów na radarze

Spoiler

 

22. Klasa od poziomu

Spoiler

 

23. Nieśmiertelność

Spoiler


  • +
  • -
  • 52


#501840 w wyborze klas, przed klasa jest litera y, np ySniper

Napisane przez Jadek w 15.01.2013 20:26

mistrzu @up nazwa pluginu nie ma nic do nazwy w grze :) moze być nawet koziadu*a :)
Dodaje dobry plugin :)

Załączone pliki


  • +
  • -
  • 2


#41466 Jak napisac plugin ?

Napisane przez rS. w 07.02.2009 17:10

Serdecznie witam wszystkich , tak więc zaczynamy .



Pierwsze Kroki jakie musimy zrobic to:

AMXx Studio - program do kompilacji, przerabiania i pisania własnych pluginów (można go pobrać z http://www.amxmodx.org , znajduje się w packu AMX Mod X Full Installer, lub można go pobrać samodzielnie AMX Mod X Studio)


Tutaj opiszę jak skonfigurować AMXx Studio aby można było kompilować pluginy:

Po otworzeniu AMXx Studio widzimy taki ekran:

screen1.jpg - Rozmiar oryginalny - Fotosik.pl

Wchodzimy w Tools-->Settings (F12)

screen2.jpg - Rozmiar oryginalny - Fotosik.pl

Następnie Compiler Settings w pierwszym białym polu podajemy adres do naszego pliku (amxxpc.exe - to kompilator znajduje sie w folderze tam gdzie masz CS addons/amxmodx/scripting)


screen3.jpg - Rozmiar oryginalny - Fotosik.pl


Klikamy ok i od tej pory kompilowanie pluginów nie powinno stwarzać problemu tylko otwieram i klikamy compile.

Ciekawostka:
Wybrałem amx studio ponieważ uczyłem się na nim od początku od kolegi


Tak więc zaczynamy:

Otwieramy program AMX Mod X Studio
Co gdzie i jak?:
Dołączona grafika

W tych 3 okienkach będziemy widzieć :

a/1 - W tym okienku, po zaznaczeniu danego fragmentu kodu, zobaczymy, jak zostaje sklasyfikowana poszczególna jego część (czy jest to funkcja, metoda, etc.).
b/2 - W tym okienku zobaczymy (po kliknięciu na dany folder) ile razy użyliśmy danej funkcji, metody, zmiennej, etc.
c/3 - Główne okno programu. To w nim piszemy kod plugin'u.


Teraz musimy podać ścieżkę do kompilatora. W tym celu klikamy F12.
Pojawi sie nam to :

Dołączona grafika

W Compiler (amxxpc.exe) podajemy ścieżkę do kompilatora. Znajdziesz ją w :

addons/amxmodx/scripting

W Default Output Directory podajemy miejsce, gdzie będą zapisywały się skompilowane pliki.


Tak więc przygotowaliśmy amxstudio do pracy więc można zaczynac :)

Zmienne: Zmienne są to struktury, które mają przechowywać pewne informacje przez jakiś okres czasu.

Jakie może mieć typy zmiennych:

•|1Zmienne logiczne.
•|2Integer'y.
•|3Liczby dziesiętne.


Zmienne Logiczne: Zmienne logiczne są bardzo proste wy wykonaniu i obsłudze. Można im nadać jedynie dwie wartości a mianowicie:

"true"
"false"

new bool:
CzyJestWlączone // Tworzę nową zmienną "CzyJestWlaczone", która jest automatycznie ustawiona na "false"

new bool:
JestWlaczone=true //Tworzę nową zmienną JestWlaczone i nadaje jej wartość "true".


Integer'y Są to najprostsze struktury w języku skryptowym Pawn , aby umieścić taką zmienną w kodzie, musimy użyć instrukcji new nazwa_zmiennej.


new c=5.0
//Ta zmienna jest niewłaściwa

new a
//Tworzymy pustą zmienną "a"

new b=5
//Tworzymy nową zmienną "b" i ustawiamy jej wartość na 5.

new d="siema"
//"siema" nie jest liczbą, dlatego ta zmienna też jest niewłaściwa.


Liczby dziesiętne Jeżeli chcemy w kodzie plugin'u umieścić liczbę dziesiętną, musimy określić typ zmiennej jako "float". By to wykonać musimy zrobić to w następujący sposób :

new Float
nazwa_zmiennej

new d="siema"
//Ta zmienna nadal nie jest właściwa

new Float:c=5.0
//Ta zmienna była niewłaściwa. Teraz, gdy określiliśmy typ zmiennej na "float" stała się właściwa <img src='http://img.amxx.pl/public/style_emoticons/default/wink.gif' class='bbc_emoticon' alt=';)' />.

new Float:b=5.1
//Tworzymy nową zmienną "b" i ustawiamy jej wartość na 5.1.

Teraz będzie sporo czytania ze zrozumieniem musicie wszystko po kolei ładnie przeczytaj to jest najgłówniejsza rzecz , będziemy się uczyć jak działa plugin , i budową pluginu:

Włączamy AMX MOD X Studio i klikamy CTRL + N.
Otworzy nam się nowe okno z plugin'em, który wygląda tak :

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"


public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
   
    // Add your code here...
}

Teraz o budowie pluginu .

Instrukcje w pluginie zawierają się w funkcjach. Owe funkcje można porównać to spiętych kartek w zeszycie (oryginalne porównanie by Seba :] ) - instrukcje są po kolei wykonywane (tak jak zapisujemy kartki w zeszycie). Każdą funkcję w plugin'ie musimy zarejestrować w kodzie. Robimy to tak :

public nazwa_funkcji(wartości_jakie_przyjmuje_funkcja)
{
//Tutaj będzie nasz kod
}

Kod w funkcji zapisujemy między nawiasami klamrowymi. Funkcje mogą być wywoływane przez gracza (gracz zrobił coś, np. otrzymał obrażenia - nasza funkcja się wykonuje) lub przez inne funkcje.
Wiem, że możecie tego nie zrozumieć, ale przeczytajcie to jeszcze kilka razy i obraz Wam się rozjaśni. Zabieramy się za nasz plugin :) .
Na początku musimy pod nasz plugin podpiąć odpowiednie moduły.
Co to są moduły? Są to zbiory instrukcji. Jeżeli w pluginie użyjemy instrukcji, która wymaga zadeklarowania odpowiedniego modułu - plugin się nie skompiluje.
Otwórzmy okno z AMX MOD X Studio.

#include <amxmodx>
#include <amxmisc>

dopiszmy :

#include <fun>

oraz :

#include <cstrike>

Fun jest to moduł, który zawiera instrukcje związane z "zabawą" (zmienianiem HP oraz armor'a gracza, wyrzucaniem jego wszystkich broni, itp.).
Cstrikezawiera instrukcje, które pozwalają nam np. na zmienianie ilości pieniędzy gracza oraz także na zmienianie jego armor'a (jak w fun'ie) z tym, że tutaj możemy dodatkowo określić rodzaj kamizelki (sama kamizelka czy z hełmem).
Następną czynnością, jaką musimy wykonać jest zadeklarowanie zmiennej do naszej pcvark'i ( jeżeli nie wiecie jak to się robi - odsyłam Was do poprzedniej lekcji). Pcvark'i są szybsze od zwykłych cvar'ek, ale czym różni się deklarowanie pcvarek od deklarowania cvar'ek?
Pcvark'i muszą zostać przypisane do zmiennej, więc zadeklarujmy takową.
Nasza pcvark'a będzie odpowiadać za koszt skorzystania z usługi zmiany HP, więc nadajmy jej nazwę (na przykład) hp_koszt.
Zadeklarujmy zmienną. Dla czystości kodu robimy to pod :

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

new hp_koszt

Teraz musimy zadeklarować naszą pcvarkę.
Robimy to w funkcji plugin_inti(). W funkcji ten deklarujemy wszystkie event'y, cvarki, itp.
Pod :

register_plugin(PLUGIN, VERSION, AUTHOR)

dopisujemy :

hp_koszt = register_cvar("hp_koszt","6000")

Instrukcja register_cvar("nazwa_cvarki","jaką_domyślną_wartość_przypisujemy") odpowiada za rejestrowanie cvar'ek. W nawiasie musimy podać nazwę cvarki oraz domyślną wartość. Domyślny koszt skorzystania z usługi zmiany HP ustawiłem na 6000.
Teraz zarejestrujemy co musi wpisać gracz, aby mógł skorzystać z usługi zmiany HP.
Umożliwia nam to instrukcja register_clcmd("jaką_komendę_musi_wpisać_gracz","którą_funkcję_wywołuje_wpisana_komenda")
Dopisujemy w plugin_init() :

register_clcmd("say /hpme","hp")

/hpmejest to komenda, którą gracz musi wpisać w say'u. Owa komenda wywołuje funkcję hp. Musimy tą funkcję teraz stworzyć.
Za ostatnim nawiasem klamrowym w naszym pluginie (za nawiasem zamykającym funkcję plugin_init()) dopisujemy :

public hp(id){
}

Wartość id w nawiasie jest to unikalny identyfikator gracza. Można go oczywiście nazwać inaczej, jak player lub gracz, ale id jest najtrafniejsze :) .
Dodamy teraz pierwszą instrukcję warunkową, która uniemożliwi skorzystanie z usługi zmiany HP gdy gracz jest nieżywy.
W funkcji hp(id) dopisujemy :

if(!is_user_alive(id)){
}

Wykrzyknik przed instrukcją is_user_alive(id) sprawia, że dana instrukcja zostanie wykonana tylko wtedy, gdy gracz nie jest żywy. !można przetłumaczyć jako nie,a całą instrukcję jako jeżeli gracz nie jest żywy wykonaj
Teraz przydałoby się zawiadomić gracza, że nie może skorzystać z naszej usługi.
W tym celu przyda nam się instrukcja client_print(), czyli wypisz graczowi.

Wygląda ona tak :

code_print(id,rodzaj_wypisanej_wiadomości (print_chat - wypisuje ją tak jak say lub print_center - wypisuje ją tam, gdzie wiadomości "Counter Terrorist win, itp.","Co_chcemy_wypisać")

Dopiszmy w naszej instrukcji warunkowej (za nawiasem klamrowym naszej instrukcji warunkowej) instrukcję :

client_print(id,print_chat,"[Zmiana HP] Nie mozesz skorzystac z tej uslugi ziom, bo jestes niezywy ;-(")

Przydałoby się teraz zastopować plugin. Dlaczego?
Dlatego, że nasza instrukcja nie została spełniona i nie chcemy, aby to co jest po niej wykonało się.
W naszej instrukcji warunkowej dopisujemy :

return PLUGIN_HANDLED

co oznacza - zwróć zastopowany plugin lub nie wykonuj dalej.
Teraz kolejna instrukcja warunkowa, uniemożliwiająca skorzystanie z usługi gdy nasze HP już wynosi 200.
Deklarujemy kolejną instrukcję warunkową. Do sprawdzenia życia gracza przyda nam się instrukcja get_user_health(id).

    if(get_user_health(id)>=200)){
       
    }

Teraz wzorem poprzedniej funkcji zaalarmujmy użytkownika, że nie może wykonać danej czynności. Tak jak wtedy posłuży nam do tego client_print().

client_print(id,print_chat,"[Zmiana HP] Juz skorzystales z tej uslugi!")

Standardowo dodajemy też zastopowanie plugin'u :

return PLUGIN_HANDLED

Dotychczas nasz kod powinien wyglądać tak :

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

new hp_koszt

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_cvar("hp_koszt","6000")
    register_clcmd("/say hpme","hp")
}

public hp(id){
    if(!is_user_alive(id)){
        client_print(id,print_chat,"[Zmiana HP] Nie mozesz skorzystac z tej uslugi ziom, bo jestes niezywy ;-(")
        return PLUGIN_HANDLED
    }
    if(get_user_health(id)>=200){
        client_print(id,print_chat,"[Zmiana HP] Juz skorzystales z tej uslugi!")
        return PLUGIN_HANDLED
    }
}

Teraz w końcu dodamy zmianę HP :) .
Umożliwi nam to instrukcja set_user_health(id,ile_HP).
Za klamrą zamykającą ostatnią instrukcję warunkową dopisujemy :

set_user_health(id,200)

Teraz pozostaje nam tylko odjęcie odpowiedniej ilości pieniędzy.
Posłuży nam do tego instrukcja cs_set_user_money(id,ilosc_pieniedzy) oraz
cs_get_user_money(id).
Pierwsza umożliwia ustawienie ilości pieniędzy a druga pobranie ilości pieniędzy posiadanej przez gracza.
Potrzebujemy jeszcze teraz instrukcji, która pobierze z pcvark'i hp_koszt koszt naszej usługi. Posłuży nam do tego get_pcvar_num(nazwa_cvarki).Pobiera ona wartość liczbową zapisaną w cvarc'e.
Dopisujemy pod instrukcją ustawiania życia :

cs_set_user_money(id,cs_get_user_money(id)-get_pcvar_num(hp_koszt))

Teraz dla czystej kosmetyki i poprawnego działania plugin'u dodajemy jeszcze pod ostatnią instrukcją :

return PLUGIN_HANDLED

No tak własnie ty , to koniec! CONGRATULATION . Jeżeli coś zle wypaliło napisz mi jeżeli masz z czymś problem . Jeżeli jest jakiś błąd w poradniku .

Teraz pozostaje Wam tylko skompilowanie plugin'u i zainstalowanie go na serwerze.
Finałowy kod powinien wyglądać tak :

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>

#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

new hp_koszt

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_cvar("hp_koszt","6000")
    register_clcmd("/say hpme","hp")
}

public hp(id){
    if(!is_user_alive(id)){
        client_print(id,print_chat,"[Zmiana HP] Nie mozesz skorzystac z tej uslugi ziom, bo jestes niezywy ;-(")
        return PLUGIN_HANDLED
    }
    if(get_user_health(id)>=200){
        client_print(id,print_chat,"[Zmiana HP] Juz skorzystales z tej uslugi!")
        return PLUGIN_HANDLED
    }
    set_user_health(id,200)
    cs_set_user_money(id,cs_get_user_money(id)-get_pcvar_num(hp_koszt))
    return PLUGIN_HANDLED
}



Poradnik wykonany w całości przez Paweł
  • +
  • -
  • 51


#485254 "Zrozumieć Plugin."

Napisane przez dasiek w 30.11.2012 21:26

Na wstępnie - nie jestem jakiś pr0 - jednak chciałbym wam przybliżyć pisanie pluginów przez ten poradnik ponieważ żeby zacząć cokolwiek robić trzeba to zrozumieć ;)
Pragnę wam przedstawić mój sposób rozumienia pisania pluginów. Co prawda może być w nim wiele sprzeczności, nie dopowiedzeń i innych badziewów ale chcę uniknąć pisania regułek definicji i innych sformułowań których 98% z was (w tym i ja) nie zrozumie...

Zacznijmy stwierdzeniem ze plugin to 'opisany zestaw czynności' które serwer wykonuje. Nie jasne?
Wyobraźmy Sobie że człowiek to taki 'serwer' i ma ochotę na zupę chińską w 5 minut (który jest pluginem). Więc bierze opakowanie z zupką otwiera ją , wlewa do jakiegoś tam garnka z wodą miesza, gotuje, wlewa do miski , bierze łyżkę i je. Na opakowaniu mamy zestaw takowych instrukcji co mamy wykonać zeby zrobić zupkę - które człowiek rozumie. Tak samo nasz plugin - gdy chcemy np dać graczowi hp za zabójstwo musimy opisać w pluginie takowe dodawanie.

Do scriptingu nie wiele nam potrzeba. Wystarczy dowolne narzędzie do edycji plików tekstowych (tak jak nontatnik , notepad++ etc) otwieramy plik i piszemy. Jak wiadomo - plugin na serwer ma rozszerzenie amxx. Ale nasze kody mają rozszerzenie sma których serwer nie rozumie. Etap zmiany pliku sma na amxx to kompilacja (nie komplikacjia, konfrontacja, konwencja czy inne stwierdzenia z tego forum) czyli zamiana naszego pluginu na taką postać którą zrozumie nasz serwer. Odwołując się do przykładu wyżej. Zupa chińska jak sama nazwa wskazuje jest po chińsku i nie wszyscy rozumieją ten język. Więc ludzie z biedry (tu jako kompilator) przetłumaczyli instrukcje robienia takowej zupki tak żeby każdy polak ją zrozumiał.i Wuola.

Czas na trochę teori (tak tak, obiecałem że jej nie będzie ale cuż - niektórych rzeczy inaczej się wyjaśnić nie da) opisanej Łopatologicznie.
Na początku ważna rzecz. Nasz plugin (w innych językach programowania jest ta sama bajka) musi działać (to wiadomo), być jak najkrótszy (Plugin dłuższy nie oznacza że jest lepszy ale o optymalizacji Kodu powiem potem) i być jak najszybszy (i nie chodzi tu o to żeby zamiast czegoś na 5 sekund dawać na 3 - chodzi o szybkie działanie - To też przybliżę potem).

Patrząc na sam początek widzimy biblioteki. Są one zbiorem konkrenych funkcji z których będziemy korzystać aby nasz plugin działał tak jak chcemy. Bardzo Trudno mi to opisać więc odwołam się do naszego smakowitego przykładu - Zapakowana zupa chińska. Aby cokolwiek z nią zrobić trzeba ją najpierw otworzyć. Więc zaglądamy do szuflady i tam znajdujemy nożyczki. Bierzemy je i przecinamy opakowanie. Gdy chcemy wsypać jej zawartość szukamy naczynia, więc bierzemy miskę i do niej wsypujemy makaron z niej. Przydało by się wstawić gorącą wodę na nią i zalać miskę , więc bierzemy czajnik z kuchenki , podchodzimy do kranu, nalewamy wodę do niego i wstawiamy. W tym przykładzie Kolejno szuflada, Szafka z miskami, Kuchenka i Kran to biblioteki a w nich znajdują się konkretne rzeczy. Nie rozumiecie? Trochę wyobraźni. To teraz trzasnę kodzik do "przygotowania zupy" to co już tu opisałem :)

Uświadamiamy naszemu pseudo "serwerowi" żeby przygotował się na skorzystanie z tych rzeczy

#include <szuflada>
#include <szafka>
#include <kuchenka>
#include <kran>

No dobra. Czas na funkcje.

Głowna funkcją w naszych pluginach będzie plugin_init() . Służy on tak naprawdę do przygotowania serwera na pewne wydarzenia i rzeczy. W nim rejestrujemy moment śmierci, Obrażeń, startu rundy, odrodzeniu gracza i wszystkiego innego co dzieje się na serwerze (a jest tego naprawdę dużo). Rejestracje omówię na podstawie - czyli rejestracji wpisanej rzeczy w kosnoli.
register_clcmd (żeby zrozumieć przetłumaczę - rejestruj_klientakomende) uświadamiamy nasz plugin żeby zwrócił uwagę gdy gracz wpisze coś w konsoli. Po otwarciu nawiasów wpisujemy to na co ma plugin zwrócić uwagę - przecinek - co ma wykonać (funckje) po wpisaniu tego (złapaniu momentu).
Tyle chyba o tym. Brak takiej funkcji nie spodoba się serwerowi i odmówi on posłuszeństwa (plugin nie będzie działał).

Drugą funkcją z której często będziecie korzystać to plugin_precache. Łopatologicznie - w nim przygotowujemy pliki z których będziemy korzystać w pluginie tj. modele, dźwięki, spr'y i inne. Bez takiego przygotowania plików plugin Nie będzie działał a nawet wyłączy nam serwer. Znasz uczucie kiedy robisz Sobie płatki na mleku, wsypujesz płatki do miski a okazuje się że nie ma mleka? "Nasz serwer czuje to samo!" kiedy chce skorzystać z modelu/dźwięku na któy nie był przygotowany.

Dobra - żeby nie było że jesteśmy sadystami. Serwer ma swoje ograniczenia Większość może zapytać - jak to ? Czemu? A temu. Sytuacja jest podobna jak święta lub rodzinne spotkania u babci. Siedzisz , nigdzie nie wyjdziesz a na dodatek słyszysz miłe babcine "Może coś jeszcze? Na pewno nie jesteś głodny?" i mimo wyraźnego i stanowczego "Oj nie babciu" dostajesz porcje "dla pułku wojska". Wedle świętej zasady "nie czyń drugiemu co Tobie nie miłe" dotyczącej również naszych serwerów i stanowisk pracy nie mścimy się na nim po babcinych obiadach. Im serwer ma więcej modeli/dźwięków/Sprów/Plików/wadów itp do obsłużenia tym woliej pracuje i gracze są niezadowoleni. Oczywiście nie dotyczy się tylko i wyłącznie plików obsługiwanych. Również zmienne ( o których później ) mają swoje ograniczenia. Wszystko starajmy się robić jak najprościej.

To lecimy ze zmiennymi. Po co one? Bez nich ciężko cokolwiek pisać (aczkolwiek - można) Są to "rzeczy" którymi operujemy w pluginie żeby ułatwić sobie (i naszemu serwerowi) życie. Nie jasne? To teraz spróbuje to wyjaśnić.
Przyjmijmy że interesuje nas Życie gracza. Naszym pluginem pytamy o to serwer.
My - "Siema Serwer. Słuchaj - rzuć informacją o życiu Gracza o ID 1" (przypominam że (prawie) wszystko bazuje na liczbach)
Serwer - "Ty Stary no ja nie wiem."
Co w takim razie? W dokumentacji znajdujemy że w pewnej bibliotece jest możliwość zapytania o życie gracza. Więc dajemy znać serwerowi.

My - "Serwer słuchaj - amxmodx wie ile Gracz 1 ma hp. Weź go zapytaj bo ja nie umiem"
Serwer - "Te amxmodx Ile gracz 1 ma hp"
amxmodx - "100!"
Serwer - "Ma 100 Hp "
My - "dzięki"

W tym momencie mamy 5 operacji. Każemy serwerowi pytać o daną rzecz bibliotekę serwer wykonuję tą operacje, operacja zwraca wynik, wynik jest przejmowany przez serwer i serwer przekazuje go nam. No dobra Wszystko fajnie tylko to dla nas nie korzystne gdy robimy kilka operacji.

My - "Serwer rzuć hp gracza 2"
Serwer - "amxmodx daj hp gracza 2"
amxmodx - "95"
Serwer - "95"
My - "dzięki."
--Wykonuje operacje--
My - "Daj znowu hp gracza 2 bo nie pamiętam"
Serwer - amxmodx-serwer-my
-- operacja --
My - "daj znowu"

Serwer-amxmodx-serwer-my

Nie długo? Nie łatwiej byłoby Stworzyć zmienną w której zapamietamy takowe Hp? Wtedy wykonamy tylko jedno zapytanie - wykorzystamy serwer raz i wszyscy będą zadowoleni.


My - "Serwer rzuć hp 3 - ja zapiszę sobie ją"
Serwer - "amxmodx daj hp 3ki"
amxmodx - "50"
Serwer - "50!"
My - zapisujemy 50 do zmiennej.


Pomaga to też zautomatyzować plugin. wyobraź Sobie - że do życia mamy dodać 5. i co szybciej wykonać? Stworzyć zmienną i do niej dodać 5 czy sprawdzić każdą mozliwą kombinacje? Odpowiedź wiadoma ;)

Wracając do Funkcji. Z nimi jest zasada podobna jak ze zmiennymi - ułatwiamy Sobie nimi życie. Nie we wszystkich miejscach możemy operować konkretnymi danymi (sprawdzenie zadanych obrażeń gracza przy jego Respie - chyba ze w odpowiednim momencie Zapiszemy ją do zmiennej) ale przede wszystkim by zmienić nasze 100 linijek w 20. Jak? z Grubsza wyjaśnię to na zasadzie dodawania kilku broni do gracza.

Jeśli nasz gracz "Zrobi coś!" ma dodawać mu 3 bronie i ammo do nich. Za to jak gracz zrobi "Co innego!" ma mu dodać tamte 3 bronie , ammo do nich i dodatkowe dwie. Jak to wygląda?

if(Zrobi coś)
{
//Dodaje Bron1//Dodaje Ammo2

//Dodaje Bron2
//Dodaje Ammo2
//Dodaje Bron3
//Dodaje Ammo4
}
if(Coś innego!)
{

//Dodaje Bron1//Dodaje Ammo2

//Dodaje Bron2
//Dodaje Ammo2
//Dodaje Bron3
//Dodaje Ammo4

//Dodaje Bron_dodatkową1//Dodaje Ammo_dodatkową2

//Dodaje Bron_dodatkową2
//Dodaje Ammo_dodatkową2
}


Działa? No zadziała. Ale to nie to. Wykonamy jedna rzecz dla obu i kiedy będziemy chcieli zmienić musimy to robic w dwóch miejscach. A gdybyśmy uświadomili serwerowi żeby wykonał jedną rzecz w której będzie dodawanie 3 broni a w "Cos innego!" dodali dodatkowe dwie? Wygląda to tak


public nasza_funkcja()
{

//Dodaje Bron1//Dodaje Ammo2

//Dodaje Bron2
//Dodaje Ammo2
//Dodaje Bron3
}
if(Zrobi coś)
{
nasza_funkcja();
}
if(Coś innego!)
{

nasza_funkcja();
//Dodaje Ammo4

//Dodaje Bron_dodatkową1//Dodaje Ammo_dodatkową2

//Dodaje Bron_dodatkową2
//Dodaje Ammo_dodatkową2
}

Jakim Cudem To działa? :blink: Otóż w momencie kiedy gracz "Zrobi Coś!" Dajemy znak serwerowi żeby Wykonał nasza_funkcja() a jak już wykona to żeby dalej Działał od momentu wywołania Funkcji. Czyli w "Coś Innego!" doda bronie i doda Dodatkową. Tworzenie funkcji jest nam potrzebne w wyłapaniu momentów (Eventów) na serwerze - a w niej dajemy obsługę. Tadam :)


Mam nadzieję ze w pewnym sensie "Rozjaśniłem" wam Sprawę z Kodowaiem. Poradnik ten będzie Uzupełniany w miarę potrzeb (jak będzie kilka osób które czegoś nie rozumieją proszę pisać - swoimi sławami będe to dodawał o ile będe miał o tym pojęcie:D )

Niedługo zrobie na nim porządki - pogrupuję Poradnik tak żeby był przejrzysty. ;)

ZAKAZ KOPIOWANIA! Poradnik ma prawo być tylko tu i na moim blogu.
  • +
  • -
  • 49


#306326 Edytowanie klasy na perk (na szybko)

Napisane przez d0naciak w 11.10.2011 15:41

Jak w najłatwiejszy sposób przerobić klase na perk ? Wszystko w niecałe 40 sek (jak się sprężysz :D)


1. Ok, otwieramy nasze *.sma klasy najlepiej za pomocą notatnika i tak :
Szukamy


new const nazwa[] = "Nazwa";
new const opis[] = "Opis.";
new const bronie = 1<
new const zdrowie = 0;
new const kondycja = 0;
new const inteligencja = 0;
new const wytrzymalosc = 0;



zamieniamy na

new const perk_name[] = "nazwa perku";
new const perk_desc[] = "opis perku";



tera znajdujemy :

cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);

Zamieniamy na
cod_register_perk(perk_name, perk_desc);



oraz :
register_plugin(nazwa, "1.0", "QTM_Peyote")

trzeba zamienić na :
register_plugin(perk_name, "1.0", "QTM_Peyote")


2. W lewym górnym rogu mamy menu edytowania wybieramy Edytuj a następnie Zamień...

3. W pierwszym polu wpisujemy klasa a w 2 piszemy perk i i używamy opcji Zamień wszystko

4. Powtarzamy czynność w/w tylko zamiast pisać klasa piszemy klase

5. I znowu to samo co wyżej tylko że zamiast pisać klase piszemy class

6. I po wykonaniu wymienionych czynności robimy coś takiego
Szukamy :
public cod_perk_skill_used(id)

zamieniamy na :
public cod_perk_used(id)

Chciałbym tutaj zaznaczyć że nie zawsze znajdziemy to co podałem, jeżeli tego po prostu nie znajdziemy, dany punkt należy pominąć :)
7. UWAGA! Jeżeli wystąpią errory (tylko wtedy kiedy one wystąpią) zamieniamy wszelkie
perkname


na

classname


  • +
  • -
  • 25