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
 

TakiJedenPan - zdjęcie

TakiJedenPan

Rejestracja: 08.01.2012
Aktualnie: Nieaktywny
Poza forum Ostatnio: 30.01.2013 15:28
-----

#486600 Byty, istotne zdarzenia i studium pluginu

Napisane przez Gość w 03.12.2012 20:04

Tutorial dla początkujących
Byty, istotne zdarzenia i studium pluginu
Scripting AMXX


[kotwica=cel]Cel[/kotwica]
  • Nauka o istocie bytów
  • Przedstawienie istotnych zdarzeń
  • Tworzenie optymalnych pluginów
[kotwica=wymagania]Wymagania[/kotwica]
  • Znajomość podstawowych metod komunikacji gracza z serwerem
  • Informacje wstępne
    Spoiler
  • Zrozumienie istoty działania AMXX
  • Znajomość podstawowych funkcji
  • Umiejętność importowania bibliotek
  • Zwracanie odpowiedniej wartości funkcji
  • Odczytywanie argumentów wiadomości
[kotwica=forwardy_klienta]Forwardy klienta[/kotwica]
Poza poznanymi już funkcjami związanymi z samym pluginem,
istnieją także forwardy, wywoływane na podstawie czynności gracza.

Przykładowe funkcje to:[kotwica=client_ingame]client_ingame[/kotwica]
Uwaga! Podczas, gdy client_connect jest pierwszą czynnością dokonywaną w momencie łączenia się gracza z serwerem,
nie można ustalić kolejności wykonywania funkcji client_authorized oraz client_putinserver, mogą być one wykonane w różnej kolejności.
Dlatego zaleca się dla niektórych instrukcji, sprawdzenie wywołania obydwu tych funkcji poprzez utworzenie prostej funkcji client_ingame

Warto znać parę tych podstawowych forwardów z biblioteki amxmodx, gdyż często się przydają.

[kotwica=client_cmd]client_cmd[/kotwica]
Serwer może wykonać pewne komendy u klienta tak, jakby on sam je wykonał.
Służy ku temu funkcja client_cmd, która za pierwszy argument
przyjmuje numer identyfikacyjny gracza, a za drugi komendę do wykonania u klienta.
Pozostałe opcjonalne argumenty uzupełniają zmienne w ciągu polecenia z 2. argumentu.

Przykład zastosowania. Funkcja ustawia graczowi interp na 0.01 w momencie pełnego połączenia z serwerem:
public client_ingame(){
new Float:interp=0.01;
client_cmd(id, "ex_interp %d", interp);
}


[kotwica=HLTV_event]HLTV event[/kotwica]
Pierwszym, użytecznym zdarzeniem, jakie warto zanotować, to event HLTV.
register_event("HLTV", "newRound", "a", "1=0", "2=0");

Jest to zdarzenie, które wysyłane jest do HLTV, jednak można je wykorzystać,
by ustalić moment rozpoczęcia Freezetime, bądź, jak kto woli, początku rundy.

Wziąć należy jednak pod uwagę, że zdarzenie wykonywane jest, poza początkiem
rundy, także tuż po zakończeniu wykonywania się komend startowych serwera.

Uwaga! Podczas, gdy forwardy takie, jak client_authorized czy client_disconnect,
event HLTV ejst eventem globalnym, a więc wywoływany jest jednokrotnie i nie przyjmuje parametru gracza.
Oznacza to, że użycie newRound(id) jest nieprawidłowe, gdyż id nie jest identyfikatorem gracza.

[kotwica=Spawn_graczy]Spawn graczy[/kotwica]
Spawn, czyli pojawienie się gracza na mapie, jest zdarzeniem, które powinniśmy wykorzystać,
jeśli chcemy operować na graczu, zanim ten przystąpi do gry, ale po rozpoczęciu nowej rundy.
to tutaj dodajemy bonusowe bronie, lub ustawiamy dodatkowe życie dla danego gracza.
W celu kompleksowej rejestracji spawnu, skorzystamy z eventu Ham_Spawn funkcji RegisterHam z biblioteki HamSandwich.
RegisterHam(Ham_Spawn, "player", "spawned", 1);

Pierwszy parametr oznacza typ rejestrowanego zdarzenia, w tym przypadku spawn, drugi parametr to klasa bytu.

[kotwica=Byty]Byty[/kotwica]
I tutaj warto wspomnieć o bytach. Otóż niemal każdy obiekt na mapie to byt, czyli istota wirtualna.
Ponadto, każdy byt ma swój unikalny numer identyfikacyjny, klasę i pewne właściwości, jak np. model.
Specjanymi bytami są gracze o numerach identyfikacyjnych od 1 do maksymalnej liczby graczy,
których maksymalną liczbą może być 32. Każdy byt posiada pewną klasę, klasą gracza jest "player".

Ponadto, każdy byt posiada pewne dane prywatne, jak np. model, życie, czy czas następnego procesu myślenia.
Proces myślenia to zdarzenie cykliczne wykonywane co pewien czas, który może być modyfikowany.
Przykładowo, granat wybuchowy posiada proces myślenia, który dokonuje jego eksplozji.
Modyfikacja czasu procesu myślenia tego bytu, czyli wpływanie na dane prywatne bytu,
pozwoli na szybszy, bądź wolniejszy wybuch granatu, lub całkowitą blokadę wybuchu.

Pobieranie danych prywatnych z bytu możliwe jest dzięki następującym funkcjom.
Na forum znajdziemy listę niektórych danych prywatnych bytów w temacie R3Xa, Offsety pdata.

Większość funkcji tak naprawdę operuje na bytach, jak np. funkcja cs_get_user_money,
która pobiera jedynie wartość prywatną od określonego gracza.

[kotwica=Spawn_graczy_cd]Spawn graczy, c.d.[/kotwica]
Trzecim argumentem użytej funkcji RegisterHam jest nazwa funkcji, która zostanie wywołana po spawnie,
a ostatni argument ustawiony na 1, odpowiada za wykonanie funkcji po skończonym procesie ożywiania gracza.

W przeciwieństwie do zdarzenia HLTV, funkcja spawned przyjmie za argument id gracza ożywianego.
Jednakże, funkcja spawnu wykonywana jest także podczas wchodzenia gracza na serwer, będącego
jeszcze martwym, dlatego chcąc operować na właśnie ożywionym graczu, należy sprawdzić, czy żyje.
Funkcja Ham_Spawned dla każdego gracza wykonywana jest zawsze po evencie HLTV, ale przed startem rundy.

[kotwica=Start_rundy]Start rundy[/kotwica]
Po ożywieniu wszystkich graczy i zakończeniu czasu zamrożenia (freezetime), następuje event globalny Round_Start.
register_logevent("roundStart", 2, "1=Round_Start");

Jest to zdarzenie notowane, więc użyjemy funkcji register_logevent, filtrując drugi parametr do równego "Round_Start"

[kotwica=Koniec_rundy]Koniec rundy[/kotwica]
Alternatywnie do początku rundy, koniec rundy rejestrujemy dzięki informacji logowanej.
register_logevent("roundEnd", 2, "1=Round_End");

Koniec rundy może nastąpić na wskutek wielu innych czynników, co należy mieć na uwadze.
Ponadto, koniec rundy nie musi nastąpić nigdy, lub nastąpić rzadziej, niż początek rundy.

[kotwica=Reset_rundy]Reset rundy[/kotwica]
register_logevent("GameCommencing", 2, "1=Game_Commencing");

Każdorazowo, w momencie dołączenia do gry pierwszego gracza do drużyny, której przeciwna posiada już wrogów,
dokonywany jest reset gry poprzez wywołanie eventu GameCommencing. Należy to wziąć pod uwagę przy liczeniu rund.

[kotwica=Liczenie_rund]Liczenie rund[/kotwica]
W celu policzenia rundy, potrzebować będziemy zmiennej globalnej, którą zainicjujemy tuż po imporcie bibliotek.
#include <amxmodx>

new runda;

public plugin_init(){
register_plugin("Liczenie rund", "0.1", "benio101");
}
Zmienna globalna zostanie początkowo zainicjowana wartością zero, co nam odpowiada, gdyż runda się jeszcze nie rozpoczęła.
Co rundę będziemy inkrementować zmienną runda, a zrobimy to w funkcji newRound eventu HLTV.
#include <amxmodx>

new runda;

public plugin_init(){
register_plugin("Liczenie rund", "0.1", "benio101");
register_event("HLTV", "newRound", "a", "1=0", "2=0");
}

public newRound(){
++runda;
}
Jednakże, ponieważ funkcja HLTV wykonywana jest tuż po starcie serwera,
a po dołączeniu zazwyczaj drugiego gracza, wykonywany jest reset, przez co ponownie
wywoływany będzie event HLTV, rozpoczęlibyśmy grę właściwą ze zmienną runda równą 2 zamiast 0.
Dlatego też zarejestrujemy event Game_Commencing i w momencie jego wystąpienia, zresetujemy licznik rund.

I tym samym sposobem, uzyskamy zmienną runda, która przechowuje numer aktualnej rundy:
#include <amxmodx>

new runda;

public plugin_init(){
register_plugin("Liczenie rund", "0.1", "benio101");
register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}


[kotwica=studium]Studium pluginu: Bonus pieniężny[/kotwica]
Teraz, w ramach praktyki, napiszemy prosty plugin, który w 2., 5. i 10. rundzie,
jednemu, losowemu graczowi przyzna 5000 dolarów na zachętę lepszej gry.
Ponadto, postaramy się, by jeden gracz nie uzyskał nagrody kilkukrotnie.
Zaczniemy od powyższej bazy, liczącej rundy, będzie to nam potrzebne.
Dodamy event nowej rundy i kod będzie wyglądał następująco:
#include <amxmodx>

new runda;

public plugin_init(){
register_plugin("Bonus pieniezny", "0.1", "benio101");

register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("roundStart", 2, "1=Round_Start");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}

public roundStart(){
// dodanie w 2., 5. i 10. rundzie losowemu graczowi 5000$
}
Zacznijmy od warunku. Najprostsza metoda:
public roundStart(){
if(runda==2){
// dodanie losowemu graczowi 5000$
}
if(runda==5){
// dodanie losowemu graczowi 5000$
}
if(runda==10){
// dodanie losowemu graczowi 5000$
}
}
Jednak niepotrzebnie się powtarzamy, stąd pomysł na
public roundStart(){
if(runda==2 || runda==5 || runda==10){
// dodanie losowemu graczowi 5000$
}
}
to rozwiązanie jest dobre, ale nie najlepsze. Dlaczego?
Dokonujemy tak naprawdę trzech porównań, choć zawsze porównujemy zmienną runda.

[kotwica=switch]Switch[/kotwica]
Do porównywania jednej zmiennych do kolejno wielu różnych, nadaje się idealnie funkcja switch.
Dzięki zastosowaniu funkcji switch, zaoszczędzimy zasoby sprzętowe i skrócimy czas wykonywania skryptu. Poprawne rozwiązanie:
public roundStart(){
switch(runda){
case 2,5,10:{
// dodanie losowemu graczowi 5000$
}
}
}

Teraz przejdziemy do losowania gracza. w tym celu będziemy musieli poszukać wśród żywych graczy na serwerze poprzez funkcję for.
W tym celu utworzymy sobie tablicę gracze i w niej będziemy przechowywać numery identyfikacyjne osób, kwalifikujących się do losowania.
Dodatkowo, utworzymy zmienną liczbaGraczy, która będzie przechowywać liczbę kandydatów do nagrody, czyli, de facto, żywych graczy.
każdy gracz, który jest żywy, zostanie dodany to tablicy gracze, a następnie liczbaGraczy ulegnie inkrementacji.
#include <amxmodx>

new runda;

public plugin_init(){
register_plugin("Bonus pieniezny", "0.1", "benio101");

register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("roundStart", 2, "1=Round_Start");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}

public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=32; ++id){
if(is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
}
}
}
Jednakże, maksymalna liczba graczy nie musi wynosić 32.
Maksymalna liczba graczy (czy też liczba slotów), może być inna.

[kotwica=get_maxplayers]get_maxplayers[/kotwica]
Aby pobrać liczbę slotów, użyjemy funkcji get_maxplayers.
public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=get_maxplayers(); ++id){
if(is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
}
}
}
Jednakże, przy każdej iteracji pętli for, dokonujemy zapytania, poprzez MetaModa:P
aż do silnika gry, co jest istotnym błędem i powinniśmy to zoptymalizować.
W tym celu, zainicjujemy zmienną globalną maxPlayers i uzupełnimy ją
w funkcji plugin_cfg i nie będziemy musieli więcej zmiennej pobierać.

Jest to rozwiązanie na tyle dobre, że funkcja plugin_cfg wykonywana jest tylko jednokrotnie
i dzięki pobraniu liczby slotów do zmiennej globalnej, oszczędzimy kolejnych, identycznych
zapytań, do silnika gry. Oczywiście, w naszej pętli, zastąpimy funkcję get_maxplayers zmienną maxPlayers.
#include <amxmodx>

new runda, maxPlayers;

public plugin_init(){
register_plugin("Bonus pieniezny", "0.1", "benio101");

register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("roundStart", 2, "1=Round_Start");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public plugin_cfg(){
maxPlayers=get_maxplayers();
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}

public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=maxPlayers; ++id){
if(is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
}
}
}


[kotwica-losowanie]Losowanie[/kotwica]
Teraz przejdziemy do losowania zwycięzcy.
W tym celu, użyjemy funkcji random, która dla jedynego argumentu x,
przyjmuje pseudo-losową liczbę naturalną z zakresu [0;x)
Funkcja jest świetnie przystosowana do naszej tablicy gracze,
przyjęwszy za argument zmienną liczbaGraczy, od razu wyłoni nam zwycięzcę.
public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=maxPlayers; ++id){
if(is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
new zwyciezca=gracze[random(liczbaGraczy)];
}
}
}
Podobną funkcją do random, jest funkcja random_num,
która losuje liczbę z zakresu od pierwszego argumentu, do drugiego włącznie.
Funkcja random jest zatem szczególnym przypadkiem funkcji random_num.
random(x) ⇔ random_num(0, x-1)

Pomimo jednoznaczności, zawsze używanie funkcji random_num z pierwszym argumentem równym zero zamiast
jego prostszej wersji random, jest irracjonalne, gdyż trwa dłużej i zużywa więcej zasobów sprzętowych.

[kotwica=nagroda]Nagroda[/kotwica]
Mając wyłonionego zwycięzcę, dodamy mu 5000$ i poinformujemy o tym jedynie zwycięzcę, by innym nie było smutno.
W tym celu, będziemy tak naprawdę modyfikować jedną z informacji prywatnych pdata zwycięskiego gracza, co można
byłoby zrobić funkcją set_pdata_int i get_pdata_int, jednak skorzystamy z prostszych natywów biblioteki cstrike.
#include <amxmodx>
#include <cstrike>

new runda, maxPlayers;

public plugin_init(){
register_plugin("Bonus pieniezny", "0.1", "benio101");

register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("roundStart", 2, "1=Round_Start");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public plugin_cfg(){
maxPlayers=get_maxplayers();
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}

public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=maxPlayers; ++id){
if(is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
new zwyciezca=gracze[random(liczbaGraczy)];
cs_set_user_money(zwyciezca, cs_get_user_money(zwyciezca)+5000);
client_print(zwyciezca, print_chat, "Na zachete lepszej gry, wygrales 5000 dolarow!");
}
}
}


[kotwica=define]#define[/kotwica]
Zamiast pisać długą linijkę
cs_set_user_money(zwyciezca, cs_get_user_money(zwyciezca)+5000);
zwłaszcza, jeśli wykorzystywalibyśmy ją wielokrotnie,
warto stworzyć sobie definicję preprocesora, udającą funkcję dodawania pieniędzy.
Zaimplementujemy zatem funkcję add_user_money(id, ammount). W tym celu,
stworzymy pod importowanymi bibliotekami, definicję preprocesora:
#define add_user_money(%1,%2) cs_set_user_money(%1,cs_get_user_money(%1)+%2)

I w miejsce starej, długiej linijki, wstawimy nowo utworzoną funkcję preprocesora add_user_money
#include <amxmodx>
#include <cstrike>

#define add_user_money(%1,%2) cs_set_user_money(%1,cs_get_user_money(%1)+%2)

new runda, maxPlayers;

public plugin_init(){
register_plugin("Bonus pieniezny", "0.1", "benio101");

register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("roundStart", 2, "1=Round_Start");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public plugin_cfg(){
maxPlayers=get_maxplayers();
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}

public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=maxPlayers; ++id){
if(is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
new zwyciezca=gracze[random(liczbaGraczy)];
add_user_money(zwyciezca, 5000);
client_print(zwyciezca, print_chat, "Na zachete lepszej gry, wygrales 5000 dolarow!");
}
}
}


[kotwica=limitacja_nagrod]Limitacja nagród[/kotwica]
Teraz dodamy ostatnią rzecz, czyli ograniczymy możliwość wygrania kilkukrotnie przez tę samą osobę.
W tym celu utworzymy sobie tablicę globalną typu logicznego i będziemy przechowywać informację o tym,
który gracz wygrał już swoją nagrodę. Łącznie, nasz plugin ma teraz dwie zmienne i jedną tablicę logiczną:
new runda, maxPlayers, bool:nagrodzeni[33];

W momencie sprawdzania danego gracza w pętli, dodamy warunek na brak bycia nagrodzonym:
public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=maxPlayers; ++id){
if(!nagrodzeni[id] && is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
new zwyciezca=gracze[random(liczbaGraczy)];
add_user_money(zwyciezca, 5000);
client_print(zwyciezca, print_chat, "Na zachete lepszej gry, wygrales 5000 dolarow!");
}
}
}
Dlaczego jednak warunek w koniunkcji umieściłem po lewej stronie?

[kotwica=dzialanie_koniunkcji_i_alternatywy]Działanie koniunkcji i alternatywy[/kotwica]
Koniunkcja działa w taki sposób, że spełniona jest, gdy wszystkie warunki są spełnione.
Gdy choć jeden z nich nie jest spełniony, to cała koniunkcja nie jest spełniona i
nie ma potrzeby sprawdzać kolejnych warunków. Podobnie jest z alternatywą, jeśli
choć jeden z warunków zostanie spełniony, nie ma potrzeby sprawdzać kolejnych.

[kotwica=optymalizacja_warunkow_logicznych]Optymalizacja warunków logicznych[/kotwica]
Tak samo działa nasz AMXX, jeśli jeden z warunków koniunkcji nie zostanie spełniony,
to kolejne nie są sprawdzane. Istotne uwagi jest, że warunki sprawdzane są kolejno od lewej strony.
Wiedząc to, powinniśmy najbardziej prawdopodobne warunki koniunkcji ustalać możliwie najbardziej po prawej stronie,
a te mniej prawdopodobne po lewej, a dla alternatywy zaś odwrotnie, warunki najbardziej prawdopodobne winny być po lewej stronie.

[kotwica=unikanie_zapytan_do_HLDS]Unikanie zapytań do HLDS[/kotwica]
Dlaczego więc umieściłem nasz warunek !nagrodzeni[id] po lewej stronie, gdy wydaje się, że jest on bardziej prawdopodobny,
niż to, że gracz jest martwy? Ponieważ staram się możliwie unikać mocno obciążających maszynę i długich zapytań do
silnika HLDS poprzez Metamoda:P, a funkcja is_user_alive, niewątpliwie do takich należy, dlatego zawsze należy
wszelkie warunki nie wykonujące zapytań do silnika, umieszczać możliwie po lewej stronie koniunkcji czy alternatyw.

[kotwica=kolejne_warunki_studium]Kolejne warunki studium[/kotwica]
W przypadku braku odpowiednich kandydatów, nie dodajemy losujemy zwycięzcy, nie dajemy pieniędzy ani nie informujemy gracza o zwycięstwie.
W tym celu, musimy te 3 instrukcje wykonać warunkowo, o ile zmienna liczbaGraczy jest niezerowa.
if(liczbaGraczy){
new zwyciezca=gracze[random(liczbaGraczy)];
add_user_money(zwyciezca, 5000);
client_print(zwyciezca, print_chat, "Na zachete lepszej gry, wygrales 5000 dolarow!");
}
Tworzenie zapytania if(x!=0) gdzie x to warunek jest niepotrzebne i wystarczy samo if(x)
Ostatecznie, funkcja if i tak zwraca prawdę lub fałsz, jedynkę lub zero.

Zwycięzcę trzeba oznaczyć jako wygranego, więc wewnątrz warunku, dopisujemy
nagrodzeni[zwyciezca]=true;

Od teraz, do końca mapy, gracz nie będzie miał szansy wygrać 5000 dolarów.

Jednakże, zwycięski gracz mógł w międzyczasie wyjść z serwera, a w miejsce jego numeru identyfikacyjnego mógł wejść inny gracz.
Dlatego, w momencie wchodzenia gracza na serwer, ustawimy mu wartość zwycięstwa na false, by miał szansę brać udział w losowaniu.
Możliwość reconnecta zwycięzcy nie przeraża nas pomimo otrzymania kolejnej szansy na zwycięstwo, gdyż całą gotówkę w
momencie opuszczenia serwera straci, a jeśli serwer korzysta z pluginu, zapisującego stan gracza, jak np. pieniędzy,
można dodać prosty natyw do tego pluginu, który zapisywałby także i tę, zerojedynkową informację o graczu.

W tym celu, skorzystamy z forwardu client_putinserver, ustawiając zmienną nagrodzeni na fałsz
public client_putinserver(id){
nagrodzeni[id]=false;
}


Gotowy kod z naszego studium, plugin na bonus 5000$ dla losowego gracza z limitem 1 wygranej na mapę w 2., 5. i 10. rundzie:
#include <amxmodx>
#include <cstrike>

#define add_user_money(%1,%2) cs_set_user_money(%1,cs_get_user_money(%1)+%2)

new runda, maxPlayers, bool:nagrodzeni[33];

public plugin_init(){
register_plugin("Bonus pieniezny", "0.1", "benio101");

register_event("HLTV", "newRound", "a", "1=0", "2=0");
register_logevent("roundStart", 2, "1=Round_Start");
register_logevent("GameCommencing", 2, "1=Game_Commencing");
}

public plugin_cfg(){
maxPlayers=get_maxplayers();
}

public newRound(){
++runda;
}

public GameCommencing(){
runda=0;
}

public roundStart(){
switch(runda){
case 2,5,10:{
new gracze[32];
new liczbaGraczy;
for(new id=1; id<=maxPlayers; ++id){
if(!nagrodzeni[id] && is_user_alive(id)){
gracze[liczbaGraczy]=id;
++liczbaGraczy;
}
}
if(liczbaGraczy){
new zwyciezca=gracze[random(liczbaGraczy)];
add_user_money(zwyciezca, 5000);
client_print(zwyciezca, print_chat, "Na zachete lepszej gry, wygrales 5000 dolarow!");
nagrodzeni[zwyciezca]=true;
}
}
}
}

public client_putinserver(id){
nagrodzeni[id]=false;
}



#506888 Klasa AirStriker

Napisane przez PatyK w 26.01.2013 14:44

opis
Siema, jest to klasa AirStriker przerobiona z perku AirStrike, nie widziałem na forum takowej klasy więc dodaje ją ;)

W razie problemów z klasą proszę pisać pod tematem.

instalacja
plik codclass_airstriker.amxx do folderu plugins.
plik codclass_airstriker.sma do folderu scripting.
dopisać codclass_airstriker.amxx do plugins-codmod.ini.
folder cstrike wrzucić przez FTP na serwer.

download
- Pliki do pobrania w załączniku.

Załączone pliki


  • +
  • -
  • 4


#488354 Tworzenie klasy do Diablo Mod Core by DarkGL

Napisane przez Fili:P w 08.12.2012 21:42

Tworzenie klasy do Diablo Mod Core by DarkGL
Na początku oczywiście musimy pobrać include diablo_nowe:
#include <diablo_nowe.inc>

Następnie, aby kod był bardziej czytelny zapiszmy sobie w stałych, podstawowe rzeczy związane z rejestracją klasy:
new const szNazwaKlasy[] = "Demon";
new const iHealth = 120;
new const szOpis[] = "Przykładowy opis klasy";

szNazwaKlasy to jak sama nazwa wskazuje nazwa naszej klasy
iHealth to ilość punktów życie na spawnie naszej klasy
szOpis to po prostu opis naszej klasy
Jeżeli chcemy by nasza klasa była na konkretną flagę co userzy popularnie nazywają klasą premium zapiszmy sobie też naszą flagę:
new const iFlags = ADMIN_LEVEL_H;

Jeżeli natomiast chcemy by nasza klasa miała swoją frakcjE ( kategorię ) zapiszmy sobie stałą odpowiadającą za nazwę frakcji:
new const szFraction[] = "Piekielni";

Dobrze kiedy mamy już wszystkie stałe przejdźmy do rejestrowania klasy. W plugin init zapiszmy:
diablo_register_class( szNazwaKlasy, iHealth, szOpis );

Jeżeli chcemy aby klasa była na flage dodajemy 4 argument, aby wyglądało to tak:
diablo_register_class( szNazwaKlasy, iHealth, szOpis, iFlags );

Jeżeli chcemy dodać frakcję dodajemy 5 argument szFraction, tego już nie będę demonstrował, bo nie ma takiej potrzeby. Oczywiście flaga ma argument domniemany i możemy ustawić frakcję nie ustawiając flagi wpisująć w pole flagi po prostu -1, FLAG_ALL lub _.
Dobrze teraz musimy się zastanowić czy chcemy mieć moc na nożu ( po naładowaniu paska na nożu ).
Jeżeli tak:
Spoiler

Jeżeli nie:
Spoiler

W tym przypadku akurat nie, ale czasem może nam się przydać wiedza o tym czy gracz posiada klasę.
Wersja optymalniejsza - ale "więcej roboty":
Spoiler

Wersja mniej optymalna - ale prostsza w użyciu:
Spoiler


Myślę, że tyle informacji wystarczy aby dowiedzięć się podstaw o tworzeniu klasy. Jeżeli masz pomysł co dodać do tego poradnika, pisz w komentarzach.
Pozdrawiam.
  • +
  • -
  • 5


#494846 Klasa MasterSoldier

Napisane przez MAGNET w 28.12.2012 07:52

Witam :)
Postanowiłem zrobić klasę, której jeszcze nie było (tak myślę ^^)
Bez zbędnych przedłużeń, zaczynajmy

Nazwa klasy: MasterSoldier
Opis: Ma 1/5 na wyrzucenie broni, 3 miny, widzi niewidzialnych, no recoil, 2x wieksza szybkostrzelnosc.
Bronie: Ak, Krieg, AUG

Jest to prawdziwa maszyna do zabijania:
1. Nie uchronią się przed nią żadne ninje itp.
2. Posiada 3 bronie, dzięki czemu może atakować ciągłym ogniem
3. Dzięki eliminatorowi rozrzutu, 2x szybkostrzelności oraz dropu broni klasa nie daje szansy na odpowiedź przeciwnika

W załączniku dam wam klasę zwykła, jak i premium :)

Jest to moja pierwsza klasa, więc proszę o zrozumienie w razie ewentualnych błędów ^^

Załączone pliki


  • +
  • -
  • 12


#495074 Przekazywanie monet przez graczy.

Napisane przez Play 4FuN w 28.12.2012 16:52

Wersja 1.1 (proszę admina żeby zmienił wersje w pierwszym poście na tą).

Naprawiono:
Teraz nie można przekazać 0 monet i mniej niż 0 monet.
Można przekazać tyle monet ile się ma np. masz 5 to możesz oddać 5 (wcześniej nie można było).
Jeśli przekazaliśmy komuś -100 monet to jemu odejmowało 100 monet a nam dawało 100 monet.

Załączony plik  cod_dajmonety.sma   3,01 KB  136 Ilość pobrań
  cod_dajmonety.amxx


W pierwszym poście wersja 1.2 (dodano nowy colorchat :))
  • +
  • -
  • 1


#493345 Ruletka

Napisane przez Gość w 24.12.2012 22:22

Opis domyślnych nagród:
Spoiler



#487930 Diablo Mod Core 1.1.0 PL

Napisane przez DarkGL w 07.12.2012 20:22

Diablo Mod Core 1.1.0 PL by DarkGL

Diablo Mod Core jest całkowicie nowym silnikiem Diablo Mod'a napisanym przezemnie jakiś czas temu ( dawno ^^ )

Dzięki zastosowaniu Forwardów i Natywów uzyskujemy łatwą możliwość rozbudowy moda bez zmian w głównym silnikiem
co przekłada się na możliwość łatwiejszej rozbudowy naszego serwera ( klas , itemów itp. )

Posiada on w sobie funkcje które nie są zaimplementowane w oryginalnej wersji diablomoda a które po prostu muszą być na serwerze DiabloMod

Co możemy znaleźć w silniku
  • Klasy i itemy to odzielne pluginy
  • System zarządzania renderem gracza
  • Nowy system zapisu sql
  • Dynamiczny zapis sql ( klasy mogą być dowolnie dodawane i usuwane )
  • Wbudowane anty kopiowanie leveli
  • Możliwość zapisu na steamid , nick , mieszane ( steamid dla steam i nick dla ns )
  • Prefixy w say
  • Większe możliwości konfiguracji
  • Poprawiony kod kuszy , granatów na ziemi i rzucanych nozy
  • Zestaw natywów i forwardów do rozbudowy moda
  • Wbudowany anty 0 HP Bug
  • Lista itemów
  • Kod jest znacznie lepszy od wersji diablo Micza
  • Dodatkowe opcje w menu rozdawania punktów
  • Informacje o awansie gracza w say
  • Poprawiony wygląd motd
  • Nowy system itemów
  • Wbudowana nowa wymiana itemami
  • Komendy na dawanie itemów i expa
  • Menu moda
  • Szybkie rozdawanie statystyk
  • Obsługa botów
  • Komenda /exp
  • Dwie nowe statystyki Pancerz i Szczescie
  • Event Diablo
  • System frakcji
  • Komendy /daj i /oddaj
  • Ustawianie nazwy gry
  • Zabezpieczenie przeciwko nabijaniu expa ( wymagana ilość graczy na serwerze ustawiane cvarem )
  • Krótkie komendy
  • Damage jest teraz modyfikowane w lepszy sposób niż poprzez event Damage
  • Wytrzymałość itemu
  • Event Diablo jest to tryb w którym wybierany jest jeden gracz i staje się on "Diablo" reszta graczy musi go zabić jeśli to się uda otrzymają oni dodatkowy exp. Oczywiście Diablo ma ułatwienia tzn. dużą ilość hp , fireballe , ma on też inny model
  • I jeszcze kilka innych rzeczy :)
Lista komend
Takie komendy jak
  • /czary
  • /skille
  • /exp
  • /menu
  • /wymiana
  • /wymien
  • /item
  • /przedmiot
  • /klasy
  • /klasa
  • /reset
  • /drop
  • /rune
  • /daj
  • /komendy
  • /event
Krótkie komendy
  • /k
  • /r
  • /d
  • /p
  • /i
  • /g
  • /ru
  • /w
  • /p
  • /h
  • /ko
  • /m
10_screenshots_2012-01-25_00005.jpg

Opisy klas
http://amxx.pl/topic...549-opisy-klas/

Jak napisałem wcześniej siłą tego moda jest możliwość konfiguracji więc teraz zajmiemy się tym

Najpierw konfiguracja w sma

#define HUD_TEXT ""
#define SQL_TABLE "diablo_nowe_klasy"
#define MAX_LEN_NAME 128
#define MAX_LEN_DESC 256
#define MAX_LEN_NAME_PLAYER 64
#define MAX_LEN_FRACTION 128
#define MAX 32
#define MAX_LEVEL 200
#define MAX_SKILL 100
#define BASE_SPEED 250.0
#define TASK_DEATH 100
#define TASK_RENDER 200
#define THROW_KNIFE_MODEL "models/diablomod/w_throwingknife.mdl"
#define THROW_KNIFE_CLASS "throwing_knife"
#define CLASS_NAME_CORSPE "fakeCorpse"
#define XBOW_ARROW "xbow_arrow"
#define TIME_HUD 1.0
#define GAME_DESCRIPTION "Diablo Mod"
#define ADMIN_FLAG_GIVE ADMIN_IMMUNITY
#define HELP_TASK_ID 91321
#define DIABLO_EVENT_SOUND "sound/diablo_taunt.mp3"
jest tego trochę ale najważniejsze dla nas to

HUD_TEXT
w którym ustawiamy czy jakiś tekst ma się wyświetlić nad hudem z informacjami gracza ( klasa etc. )
możemy tu dodać np. "Forum Serwera www.xyz.pl"

SQL_TABLE
Nazwa tabeli w sql

MAX
Ilość slotów dzięki tej opcji oszczędzimy pamięć serwerowi a i mod będzie działał lepiej

MAX_LEVEL
Maksymalny level

MAX_SKILL
Maksymalny poziom skilli ( umiejętności zręczność etc. )

ADMIN_FLAG_GIVE
Flaga którą musi mieć admin aby używać komend na dawanie Expa i Itemów

#define BOTY
//#define DEBUG
#define DEBUG_LOG "addons/amxmodx/logs/debug.log"
#define BOTY
zakomentuwujemy jeśli nie mamy botów na serwerze
usuwamy komentarz jeśli mamy ( komentarz czyli // )

#define DEBUG
Tryb debug dostajemy więcej informacji co aktualnie robi mod używane raczej tylko jeśli coś nie działa
jeśli wszystko jest ok lepiej to zakomentować

Możemy znaleźć jeszcze coś takiego

#define PREFIX_SAY "^x04[ DiabloMOD ]^x01"
jest to prefix jaki mają wiadomości wysyłane przez mod

Cvary
//sql
diablo_host host
diablo_user user
diablo_pass pass
diablo_db db
//typ zapisu 1 - nick 2 - steam id 3 - steamid lub nick zalezy czy gracz ma steam czy nie
diablo_save_type 3
//sredni level dla nowego gracza
diablo_avg 1
//ustawienia maga
flashlight_custom 1
flashlight_drain 1.0
flashlight_charge 0.5
flashlight_radius 8
flashlight_decay 90
//minimalna ilosc graczy aby dostawac exp
diablo_player_num 2
//ilosc dmg aby dostac 1 exp'a
diablo_dmg_exp 20
//xpbonus
diablo_xpbonus 5
/xpbonus2
diablo_xpbonus2 100
//ustawienia nekromanty czas odradzania
diablo_revival_time 3
//hp po ozywieniu ( + inteligencja wskrzeszajacego )
diablo_revival_health 25
//minimalny dystans od zwlok
diablo_revival_distance 70.0
//szybkosc rzuconego noza
diablo_knife_speed 1000
//dmg zadawane przez rzucony noz
diablo_knife 80.0
//dmg strzaly z kuszy
diablo_arrow 120.0
//mnoznik dla inteligencji przy obliczaniu dmg
diablo_arrow_multi 2.0
//szybkosc strzaly z kuszy
diablo_arrow_speed 1500
//ilosc wytrzymalosci itemu zabieranej przy zginieciu
diablo_durability 10
//koszt expa w rune
diablo_exp_price 14500
//koszt losowego przedmiotu w rune
diablo_random_price 9000
//koszt ulepszenia w rune
diablo_upgrade_price 5000
//koszt w /daj
diablo_price_daj 5000
//event on/off
diablo_event 1
//ilosc wymaganych dropow
diablo_drop_need 100
//hp diablo ( mnozone przez ilosc graczy )
diablo_diablo_hp 1000
//ilosc xp rozdzielane na tych ktozy zabija diablo
diablo_event_exp 10000
//kamera przy diablo 1 - widok zza plecow
diablo_camera 1
//ilosc punktow do rozdania za lvl
diablo_points 2
//ile hp za jeden punkt sily
diablo_strength_power 2
//ile reduckji za jeden punkt zrecznosci
diablo_reduce_power 0.03
//Miejsce wyświetlania informacji o klasie itemie etc. 0 - standardowy lewy dolny róg 1 - informacja hud ( podobnie jak w cod mod )
diablo_hud_mode 1
Cvary ustawiamy w pliku diablomod.cfg

Komendy admina
  • amx_giveexp - daje exp graczowi Użycie amx_giveexp <nick> <ile>
  • amx_giveitem - daje item graczowi Użycie amx_giveitem <nick> <iditemu>
Komendy techniczne
  • diablomod_version - zwraca używana wersję diablomoda
Opis komend
  • /klasy - otwiera listę klas
  • /klasa - otwiera menu klas do wyboru
  • /reset - resetuje rozdane punkty umiejętności
  • /drop - wyrzuca aktualnie posiadany przedmiot
  • /item - opis aktualnie posiadanego przedmiotu
  • /przedmiot - takie samo działanie jak /item
  • /gracze - lista graczy wraz z ich levelami i klasami
  • /czary - twoje statystyki
  • /skille - tak jak /czary
  • /rune - menu gdzie można kupić różne rzeczy
  • /wymiana - wymiana itemami
  • /wymien - tak jak /wymiana
  • /daj - oddaj item za kasę
  • /pomoc - krotka notatka o modzie
  • /komendy - ta lista
  • /exp - informacje o stanie twojego expa
  • /menu - menu moda
  • diablomod_version - wersja diablomoda używana na serwerze
Najważniejsza zmiana to umieszczenie item i klas w odzielnnych pluginach nowe pluginy dopisujemy do plugins-diablomod.ini w folderze configs
Jeżeli ktoś jest zainteresowany tworzeniem nowych itemów , klas lub dodatków radzę zapoznać się z dostepnymi sma i plikiem diablo_nowe.inc gdzie znajdziecie opis natywów i forwardów.

Natywy
  • rejestruje klase
    diablo_register_class(const szNazwa[],const iHealth,const szOpis[] = "" , iFlags = FLAG_ALL , const szFraction[] = "");
  • zwraca klase gracza
    diablo_get_user_class(id);
  • nazwe klasy pobiera
    diablo_get_class_name(classID , Return[] , len);
  • zwraca level
    diablo_get_user_level(id);
  • zwraca exp
    diablo_get_user_exp(id);
  • zwraca points
    diablo_get_user_points(id);
  • zwraca punkty agi
    diablo_get_user_agi(id);
  • zwraca punkty str
    diablo_get_user_str(id);
  • zwraca punkty dex
    diablo_get_user_dex(id);
  • zwraca punkty int
    diablo_get_user_int(id);
  • czy klasa gracza to klasa z tego pluginu
    diablo_is_class_from(id);
  • ustawia rendering graczowi
    diablo_set_user_render(id, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16 , Float:fTime = 0.0 )
  • diablo_add_extra_str( id , iIle );
  • diablo_add_extra_int( id , iIle );
  • diablo_add_extra_agi( id , iIle );
  • diablo_add_extra_dex( id , iIle );
  • czy ma taka klase
    diablo_is_this_class(id,szClass[]);
  • dodawanie speed graczowi
    diablo_set_speed(id,Float:fAmount);
  • ustawianie speed
    diablo_add_speed(id,Float:fAmount);
  • pobranie speed
    Float:diablo_get_speed(id)
  • pobranie dodatkowe speed
    Float:diablo_get_speed_extra(id);
  • diablo_reset_speed( id );
  • zadanie dmg
    diablo_damage(iVictim,iKiller,Float:fDamage,DiabloDamageBits:damageBits);
  • zabij
    diablo_kill(iVictim,iKiller,DiabloDamageBits:damageBits);
  • zadanie dmg w zasiegu
    diablo_create_explode(iKiller,Float:fOrigin[3],Float:fDamage,Float:fDist,bool:bExplode);
  • dodaje hp
    diablo_add_hp(id,iHp);
  • czy jest freezetime
    diablo_is_freezetime();
  • uruchom write hud
    diablo_write_hud_(id);
  • diablo_get_xpbonus();
  • diablo_get_xpbonus2();
  • daje xp
    diablo_add_xp(id,ile);
  • zabiera xp
    diablo_take_xp(id,ile);
  • dodaje noze
    diablo_add_knife(id,iIle);
  • diablo_set_user_grav(id,Float:fGrav);
  • diablo_add_user_grav(id,Float:fGrav);
  • Float:diablo_get_user_grav(id)
  • diablo_reset_grav( id );
  • diablo_give_user_trap(id,bool:give = true);
  • diablo_give_user_bow(id,bool:give = true);
  • diablo_show_hudmsg( id , Float:fTime , const szMessage[] , any:... );
  • diablo_render_cancel( id );
  • diablo_display_icon( id , enable , szNameIcon[] , red , green , blue );
  • diablo_display_fade( id,duration,holdtime,fadetype,red,green,blue,alpha );
  • diablo_give_xp( id , ile );
  • diablo_add_max_hp( id , ile );
  • diablo_register_item( Name[] , durability = 250 );
  • diablo_screen_shake( id , amplitude , duration , frequency );
  • diablo_set_max_hp( id , ile );
  • diablo_get_max_hp( id );
Forwardy
  • gdy klasa zostanie wybrana
    diablo_class_enabled(id);
  • gdy klasa zostanie zmieniona
    diablo_class_disabled(id);
  • przy zmianie broni
    diablo_weapon_deploy(id,wpnID,weaponEnt);
  • czyszczenie wewnetrznych zmiennych klasy
    diablo_clean_data(id);
  • ustawianie wewnetrznych zmiennych klasy
    diablo_set_data(id);
  • prethink gracza
    diablo_preThink(id);
  • diablo_preThinkItem(id);
  • posthink gracza
    diablo_postThink(id);
  • podczas zmiany renderu wysylany do wszystkich pluginów
    diablo_render_change(id);
  • zwracasz czas call cast 0.0 powoduje zatrzymanie
    Float:diablo_cast_time(id,Float:standardTime );
  • call cast wykonany niech plugin dziala
    diablo_call_cast(id);
  • ustawiania speed
    diablo_speed_change(id);
  • przy spaawnie klasy
    diablo_class_spawned(id);
  • przy zabiciu klasy
    diablo_class_killed(id);
  • przy exp killu zwracaj 0 jak nic nie robisz
    diablo_kill_xp(id,iIle);
  • przy exp damage 0 jak nic nie robisz
    diablo_exp_damage(id,iIle);
  • przy uzyciu skillu klasy
    diablo_class_skill_used(id);
  • when cast stop can return diablo_stop
    diablo_cast_stop(id);
  • can move when cast
    diablo_cast_move(id);
  • write hud
    diablo_hud_write(id,szMessage[],iLen);
  • damage
    diablo_damage_taken_post(iKiller,iVictim,iDamage);
  • diablo_damage_taken_pre(iKiller , iVictim , &Float:fDamage );
  • zmiana damage klasy dostaje
    diablo_damage_class_taken(iVictim,iAttacker,&Float:fDamage,damageBits);
  • zmiana damage klasy zadaje
    diablo_damage_class_do(iVictim,iAttacker,&Float:fDamage,damageBits);
  • gracz zespawnowany
    diablo_player_spawned(id);
  • diablo_user_change_class( id , class )
  • diablo_death(iKiller , killerClass , iVictim , victimClass );
  • diablo_item_give( id , szRet[] , iLen );
  • diablo_item_reset( id );
  • diablo_item_drop( id );
  • diablo_item_info( id , szMessage[] , iLen , bool:bList );
  • diablo_upgrade_item( id );
  • diablo_item_set_data( id );
  • diablo_damage_item_taken(iVictim,iAttacker,&Float:fDamage,damageBits);
  • diablo_damage_item_do(iVictim,iAttacker,&Float:fDamage,damageBits);
  • diablo_item_skill_used( id );
  • diablo_item_player_spawned( id );
  • gravity zmieniona
    diablo_grav_change(id);
  • diablo_new_round();
  • wymiana itemami
    diablo_copy_item( iFrom , iTo );
W paczce znajdziemy też dwa dodatkowe pluginy ( znajdują się one w folderze dodatki )
  • Diablo Questy
  • Exp od godzinny
Działają one tak samo jak te opublikowane już na forum więc nie będę się rozpisywał o konfiguracji

Instalacja odbywa się poprzez wrzucenie plików z paczki na serwer

Jeżeli doceniasz ilość pracy włożoną w ten mod nie usuwaj drobnej informacji o autorze wyświetlanej graczowi , dla osób które chcą to ukryć podpowiadam linijka 4719
Zapraszam też na DarkGL Blog | Programowanie Python , Pawn , C++ i Webdeveloping oraz Kanał użytkownika GitzZz14 - YouTube ewentualnie DarkGL3 - YouTube ;)

TutorialeZałączony plik  Diablo Mod Core.rar   6,91 MB  4190 Ilość pobrań

  • +
  • -
  • 87


#412825 [KLASA] Assasin

Napisane przez Oporowiec w 20.05.2012 22:55

Klasa posiada 5 sekund niewidzialnosci, 1/5 z deagla.
Przerobiona klasa z perku: http://amxx.pl/topic...staw-assassina/

Załączone pliki




#412347 Exp w "%" nie w liczbach

Napisane przez dasiek w 19.05.2012 20:58

http://darkgl.amxx.p...procentowy-exp/
  • +
  • -
  • 1


#412122 [ROZWIĄZANE] Problemy z komplikacją lokalną - Klasa Cod Mod

Napisane przez Engi w 19.05.2012 10:37

#include <amxmodx>
#include <amxmisc>
#include <codmod>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
new const nazwa[] = "Pro Strzelec";
new const opis[] = "Eliminator rozrzutu , 2 miny , znacznie szybszy";
new const bronie = (1<<CSW_M4A1);
new const zdrowie = 10;
new const kondycja = 50;
new const inteligencja = 10;
new const wytrzymalosc = 10;
new const modelMiny[] = "models/QTM_CodMod/mine.mdl"
new sprite_blast_miny;
new ilosc_min_gracza[33];
new bool:ma_klase[33];

public plugin_init()
{
register_plugin(nazwa, "1.0", "amxx.pl");
cod_register_advance(cod_get_classid("Elit.Strzelec"), 201, nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
register_touch("mine", "player", "DotykMiny");
register_event("HLTV", "NowaRunda_Miny", "a", "1=0", "2=0");
RegisterHam(Ham_Spawn, "player", "fwSpawn_Miny", 1);

register_forward(FM_PlayerPreThink, "PreThink");
register_forward(FM_UpdateClientData, "UpdateClientData", 1)
}
public plugin_precache()
{
precache_model(modelMiny);
sprite_blast_miny = precache_model("sprites/dexplo.spr");
}
public client_disconnect(id)
{
new entMiny = find_ent_by_class(0, "mine");
while(entMiny > 0)
{
if(entity_get_edict(entMiny, EV_ENT_owner) == id)
remove_entity(entMiny);
entMiny = find_ent_by_class(entMiny, "mine");
}
}
public cod_class_enabled(id)
{
ma_klase[id] = false;
ilosc_min_gracza[id] = 2;
}
public cod_perk_disabled(id)
{
ma_klase[id] = false;
}
public cod_class_skill_used(id)
{

if (!ilosc_min_gracza[id])
{
client_print(id, print_center, "Wykorzystales juz wszystkie miny!");
}
else
{
ilosc_min_gracza[id]--;
new Float:origin[3];
entity_get_vector(id, EV_VEC_origin, origin);
new ent = create_entity("info_target");
entity_set_string(ent ,EV_SZ_classname, "mine");
entity_set_edict(ent ,EV_ENT_owner, id);
entity_set_int(ent, EV_INT_movetype, MOVETYPE_TOSS);
entity_set_origin(ent, origin);
entity_set_int(ent, EV_INT_solid, SOLID_BBOX);
entity_set_model(ent, modelMiny);
entity_set_size(ent,Float:{-16.0,-16.0,0.0},Float:{16.0,16.0,2.0});
drop_to_floor(ent);
set_rendering(ent,kRenderFxNone, 0,0,0, kRenderTransTexture,50);
}
}
public fwSpawn_Miny(id)
{
if(is_user_alive(id))
ilosc_min_gracza[id] = 2;
}
public DotykMiny(ent, id)
{
if(!is_valid_ent(ent))
return;
new attacker = entity_get_edict(ent, EV_ENT_owner);
if (get_user_team(attacker) != get_user_team(id))
{
new Float:fOrigin[3];
entity_get_vector( ent, EV_VEC_origin, fOrigin);
new iOrigin[3];
for(new i=0;i<3;i++)
iOrigin[i] = floatround(fOrigin[i]);
message_begin(MSG_BROADCAST,SVC_TEMPENTITY, iOrigin);
write_byte(TE_EXPLOSION);
write_coord(iOrigin[0]);
write_coord(iOrigin[1]);
write_coord(iOrigin[2]);
write_short(sprite_blast_miny);
write_byte(32);
write_byte(20);
write_byte(0);
message_end();
new entlist[33];
new numfound = find_sphere_class(ent,"player", 90.0 ,entlist, 32);
for (new i=0; i < numfound; i++)
{
new pid = entlist[i];
if (!is_user_alive(pid) || get_user_team(attacker) == get_user_team(pid))
continue;
cod_inflict_damage(attacker, pid, 70.0, 0.8, ent, (1<<24));
}
remove_entity(ent);
}
}
public NowaRunda_Miny()
{
new entMiny = find_ent_by_class(-1, "mine");
while(entMiny > 0)
{
remove_entity(entMiny);
entMiny = find_ent_by_class(entMiny, "mine");
}
}
public PreThink(id)
{
if(ma_klase[id])
set_pev(id, pev_punchangle, {0.0,0.0,0.0})
}
public UpdateClientData(id, sw, cd_handle)
{
if(ma_klase[id])
set_cd(cd_handle, CD_PunchAngle, {0.0,0.0,0.0})
}

  • +
  • -
  • 1


#367376 [ROZWIĄZANE] Prośba o przeróbkę klasy - 2 błędy w komplikacji (kod sma)

Napisane przez Play 4FuN w 19.02.2012 14:33

dodaj ")" za "if(ma_klase[idattacker] && random_num(1, 5)"
całość powinna wyglądać tak:
#include <amxmodx>
#include <codmod>
new const nazwa[] = "Dezerter";
new const opis[] = "1/5 szansy na oslepienie wroga";
new const bronie = (1<<CSW_HEGRENADE)|(1<<CSW_FAMAS);
new const zdrowie = 30;
new const kondycja = 20;
new const inteligencja = 30;
new const wytrzymalosc = 20;
new g_msg_screenfade;
new bool: ma_klase[33];
public plugin_init()
{
register_plugin(nazwa, "1.0", "amxx.pl");
cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
register_event("Damage", "Damage", "b", "2!=0");

g_msg_screenfade = get_user_msgid("ScreenFade");
}
public cod_class_enabled(id)
{
ma_klase[id] = true;

}
public cod_class_disabled(id)
{
ma_klase[id] = false;
}
public Damage(id)
{
new idattacker = get_user_attacker(id);
if(!is_user_connected(idattacker) || get_user_team(id) == get_user_team(idattacker))
return PLUGIN_CONTINUE;
if(ma_klase[idattacker] && random_num(1, 5))
return PLUGIN_CONTINUE;
}
stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha)
{
message_begin( MSG_ONE, g_msg_screenfade,{0,0,0},id );
write_short( duration );
write_short( holdtime );
write_short( fadetype );
write_byte ( red );
write_byte ( green );
write_byte ( blue );
write_byte ( alpha );
message_end();
}

  • +
  • -
  • 1


#362707 [ROZWIĄZANE COD NOWY] Zrobienie klasy (dokładny opis)

Napisane przez Jerem96 w 11.02.2012 20:08

nie o zrobnie a o przerobienie !!


Nie płacz...
Przerobienie by było wtedy jakby dał .sma więc się nie kłóć i idź tam do piaskownicy się mądrować.


#364056 [ROZWIĄZANE COD NOWY] Zrobienie klasy (dokładny opis)

Napisane przez adek209 w 13.02.2012 20:03

5.0 oznacza + ile inta czyli "Master" 5+int obrażeń z Famasa czyli jak napiszesz 10 to dostajesz +10 inta
  • +
  • -
  • 1


#342111 Paczka FFA by DeaLeR^

Napisane przez DeaLeR^ w 30.12.2011 08:42

Witam!
Ostatnio z nudów zrobiłem paczkę FFA.
Przedstawię od razu plugins.ini, amxx,cfg.

backweapons.amxx                               ; bronie na plecach
abd.amxx                                           ; widoczne obrazenia
afkkicker.amxx                                         ; kickowanie afk players
bomb_explode.amx                                ; 3 losowe soundy 10 sek przed wybuchem bomby
ex.interp.amxx                                          ; wymuszanie interpu
galileo.amxx                                               ; rockthevote czyli votowanie map
grenade_trail.amxx                                      ;trail za granatami
ultimate_sounds_pl.amxx                               ; ultiamte sounds po polsku
sillyc4.amxx                                               ; klejaca paka
amx_parachute.amxx                                   ; spadochron
reasonkicker.amxx                                        ; kick z powodem
bcd_hudtimer.amxx                                      ; czas w hud (C4)
automaticknifeduel.amxx                                 ; duel na noze
ad_manager.amxx                                       ; reklamy w sayu


|- BULLET DAMAGE -|

amx_bulletdamage_recieved "1"  // 1 - włącza, 0 - wyłacza pokazywanie otrzymanych obrażeń.
amx_bulletdamage "2"  // 0 - plugin wyłączony, 1 - pokazuje zadane obrażenia, 2 - pokazuje zadane obrażenia, ale nie przez ściane


|- AFK KICKER -|

afk_kicktime 150 - Po jakim czasie gracz ma być wykopany.
afk_slaytime 60 - Po jakim czasie gracz ma być zgładzony.
afk_minplayers 4 - Minimalna ilość graczy przy których ma pracować plugin.
afk_slayplayers 1 - Czy zabijać gracza gdy jest zbyt długo AFK.
afk_adminimmunity 1 - Admin, gracz z immunitetem jest nietykalny. 
afk_adminkickimmunity 1 - Admin, gracz z immunitetem nie może być wykopany.
afk_options 1 - Wykopanie gracza po upływie dozwolonego czasu 0 - przełącza gracza na spec. następnie wykopuje.
afk_show_counter 0 - Ustaw na 0 to będzie pokazywać "AFK-Counter" od czasu do czasu.
afk_rename 0 - Zmiana nicku gracza na "[AFK] nick" kiedy jest AFK.
afk_speckick 1 - Wykopywanie graczy z spec.
afk_speckicktime 300 - Czas po jakim gracze będą wykopywani ze spec. ( dobrze uwzględnić więcej sekund ponieważ często gracze kręcą demo oszustom ).


|- ex_interp -|

amx_interp_style 1 - Włączony 0 - Wyłączony plugin 


|- Galileo -|

amx_extendmap_max 90 //Maksymalny czas jaki mapa może być grana. Jeśli gracze będą wybierać przedłużenie mapy. Tylko do tego czasu będzie to możliwe.

amx_extendmap_step 15 //ile mapa ma być przedłużana jeśli gracze wybiorą ta opcje (w minutach)

gal_cmd_votemap 0 // Jaki powinny działac wzykłe komendy HL dotyczące Vota 1- Wyłączone 0- wyłączone

gal_cmd_listmaps 2 // Jak ma się zachowywać komenda listmaps
// 0 - disable
// 1 - behave normally
// 2 - behave the same as the "gal_listmaps" command (galileo default)
gal_banrecent 3 // Ile map ostatnio granych jest niedozwolonych w Vote


gal_banrecentstyle 1 // jak maja być wyświetlane mapy po wpisaniu recentmaps
// 1 - all maps on one line
// 2 - each map on a separate line

gal_rtv_commands 3 // na jak komenda ma reagować plugin przy rtv
//1- Rockthevote
//2-rtv
//3 dynamiczna

gal_rtv_wait 6
//ile czasu po starcie mapy może być rozpoczęte rtv

gal_rtv_ratio 0.60
//Ile % graczy musi wpisać rtv żeby zostało odpalone.

gal_nom_playerallowance 2 //ile nominacji może zrobić każdy gracz

gal_nom_mapfile mapcycle.txt// skąd maja być sczytywane mapy

gal_nom_prefixes 0
// prefix przy mapie wymagany?

gal_nom_qtyused 0 // ile nominacji ma być używanych w następnym głosowaniu.

//Glosowanie rozstrzygające następuje wtedy kiedy żadna z map nie otrzyma 50% w normalnym glosowaniu. Wtedy dawane są dwie z największym %

gal_runoff_enabled 1
//Mozliwe glosowanie rozstrzygające

gal_runoff_duration 15
//po ilu sekundach ma się rozpaczać

gal_vote_weight 1
//Czy ma być większa waga głosu admina?

gal_vote_weightflags y
//Flaga z jaka admin ma większy głos (dowolna)

gal_endonround 1
//Ma czekać do skończenia rundy ze zmianą mapy?

gal_vote_showstatus 1
// postęp głosowania ma być pokazywany gracza?
//0-nigdy
//1- po zagłosowaniu
//2- zawsze

gal_vote_showstatustype 2
//Jak ma być to przedstawiane gracza
//1- liczba
//2- procenty na mapie


gal_srv_start 3
// jeśli serwer się zrestartuje lub będzie miał krasza jak ma reagować plugin
//0- nic nie robi
//1- zmienia mapę na ta przed restartem
//2- zmienia mapę na ta która powinna być wybrana
//3- robi Vote
//4- zmienia na jedna z nominowanych

gal_endofmapvote 1

gal_listmaps_paginate 10 // ile map na stronie ma być pokazywanych po użyciu gal_listmaps

gal_vote_mapchoices 5
//Ile map ma być dawanych do vote

gal_vote_duration 15 // ile sekund powinien trwać vote

gal_vote_mapfile mapcycle.txt // skąd ma pobierać mapy

gal_vote_expirationcountdown 1
gal_vote_uniqueprefixes 0

gal_vote_announcechoice 1 //pokazuje jaka mapę wybrał gracz?
//1- tak
//0- Nie

gal_emptyserver_wait 0
// ile sekund ma czekać zanim uruchomi emptyserwer mapcykle,

gal_emptyserver_mapfile emptycycle.txt
// Plik z którego czyta empty serwer mapcyke

gal_sounds_mute 0
// wycisza dane dźwięki
// 1 - "get ready to choose a map"
// 2 - "7", "6", "5", "4", "3", "2", "1"
// 4 - "time to choose"
// 8 - "runoff voting is required"


|- C4 Timer -|

amx_showc4timer 3 - Wyłączone | Tylko TT | Tylko CT | Wszyscy (Optymalnie: 3)
amx_showc4flash 0 - Sprite flashing (Optymalnie: 0)
amx_showc4sprite 1 - Choose from 2 sprites (Optymalnie: 1)
amx_showc4msg 0 - Shows a hud message about the timer (Optymalnie: 0)

|- Grenade Trail -|

grenade_tr 1 ( Optymalnie: 2 )
0 - wcale
1 - wybrane kolory
2 - odmienny/własny/specyficzny - nie jestem pewien
3 - teamu/druzyny
grenade_he "255000000" ustaw kolor dla granatu HE (            255 000 000       - czerowny)
grenade_fb "000000255" ustaw kolor dla Flashbang (000 000 255 - niebieski)
grenade_sg "000255000" ustaw kolor dla Smokegrenade (000 255 000 - zielony)

|- Minibans -|

amx_minibans_forum "http://Cs-TFK.eu" // okresla forum na ktorym mozna zlozyc zazalenie
amx_minibans_hudmsg "1" // okresla czy pokazywac zielony napis na hud
amx_minibans_moreinfo "0" // dla developerow, loguje wiecej informacji
amx_minibans_logs "1" // wlacza / wylacza logi 
amx_minibans_logstype "1" // rodzaj logow, 1 - loguje w logach amxx, 2 - loguje w oddzielnym pliku
amx_minibans_kickdelay "10.0" // czas, po jakim od odtrzymaniu bana gracz zostanie wykopany
amx_minibans_bantype "0" // na co banować graczy? 0 - wykryj automatycznie, 1 - na ip, 2 - na steamid
amx_minibans_bantimes 0 15 30 45 60 180 1440 10080

amx_minibans_reason "Czitujesz!"
amx_minibans_reason "Wstaw SS!"
amx_minibans_reason "Kampisz"
amx_minibans_reason "Obrazasz"
amx_minibans_reason "Lamisz"
amx_minibans_reason ""
amx_minibans_reason ""

|- Reason Kicker -|

amx_kick_r1 "Kampisz"
amx_kick_r2 "Obrazasz"
amx_kick_r3 "Uwaga 1/3"
amx_kick_r4 "Uwaga 2/3"
amx_kick_r5 "Uwaga 3/3"
amx_kick_r6 "Cele Mapy!"
amx_kick_r7 ""

Zapraszam do oceniania !!
I do sciągania:
1. http://www39.zippysh...72031/file.html
2. http://www.przeklej....003adi05u0gj3sp
  • +
  • -
  • 4