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
 

sebul - zdjęcie

sebul

Rejestracja: 10.07.2010
Aktualnie: Nieaktywny
Poza forum Ostatnio: 23.12.2024 23:13
****-

#770108 Aktualizacje

Napisane przez DarkGL w 27.01.2021 23:09

Forum zostało przeniesione na całkowicie nowego dedyka.

 

W razie wykrycia jakiś problemów zachęcam do informowania postaramy się na bieżąco wszystko poprawiać.


  • +
  • -
  • 5


#770983 Witam

Napisane przez sharkowy w 05.03.2021 14:24

Siema, na dzień dobry warn za reklamę :lol:


  • +
  • -
  • 2


#732657 [ROZWIĄZANE] Plungin

Napisane przez ChceszCiastkoKupSe w 24.11.2016 20:21

10 sec szukania.

 

Może + ?

 

Załączone pliki


  • +
  • -
  • 0


#728997 Team Balancer Manager

Napisane przez xWangan w 06.08.2016 10:29

Po dzisiejszym update CS:GO plugin na sourcemodzie w wersji 1.8 powoduje crashe serwera, wystarczy iż ktokolwiek wejdzie na serwer i już leci crash ;/


  • +
  • -
  • 1


#728776 Dodanie broni dla gracza + ammo

Napisane przez Rivit w 01.08.2016 07:02

Dodaj broń przez give_item i ustaw ammo przez cs_set_user_bpammo i elo
  • +
  • -
  • -1


#716782 Methodmap

Napisane przez plx211 w 25.12.2015 16:01

Wprowadzenie



Methodmap'y są jedną z nowości wprowadzonych w sm 1.7, służą one do mapowania funkcji (jak sama nazwa wskazuje). Pozwalają one nam na abstrakcyjne myślenie, zobaczmy poniższy przykład.

Ten kod odpowiada za stworzenie menu wyboru z opcjami Tak i Nie:

Handle menu = CreateMenu(MenuHandler1);
SetMenuTitle(menu, "Czy przeczytałeś to na AMXX.PL?");
AddMenuItem(menu, "yes", "Yes");
AddMenuItem(menu, "nie", "Nie");
SetMenuExitButton(menu, false);
DisplayMenu(menu, client, 20);

Ten sam kod z użyciem methodmap możemy zapisać tak:

Menu menu = new Menu(MenuHandler1);
menu.SetTitle("Czy przeczytałeś to na AMXX.PL?");
menu.AddItem("tak", "Tak");
menu.AddItem("nie", "Nie");
menu.ExitButton = false;
menu.Display(client, 20);

Od razu widać że kod jest czytelniejszy


Budowa Methodmap



Definiowanie methodmap jest podobne do definiowania enum'a:

methodmap Nazwa {
    //...
};

Tak samo się tworzy zmienną typu methodmap:

Nazwa zmienna;

Funkcje methodmap



Jeśli się przyjrzymy zobaczymy że definicja funkcji z methodmap prawie w ogóle nie różni się od zwykłej funkcji (po za tym gdzie się znajdują).

methodmap Nazwa {
    /...

    public void funkcja() {
        PrintToServer("Wywołano funkcje z methodmap Nazwa");
    }
    
    /...
};

Różnica natomiast od razu jest odczuwalna gdy chcemy wywołać funkcje, gdyż wpierw musimy stworzyć "obiekt"

Nazwa zmienna;
zmienna.funkcja();

Setter i Getter



Nie ma możliwości aby w methodmap utworzyć zmienną, możemy natomiast utworzyć pseudo zmienną. Czym to się różni od zwykłej zmiennej? Tym że zamiast bezpośrednich operacjach na zmiennej są wywoływane 2 funkcjie:

  • setter - kiedy wartość do pseudo zmiennej jest zapisywana
  • getter - kiedy wartość z pseudo zmiennej jest odczytywana

Przykład:

int zmiennaPozaMethodmap;

methodmap Nazwa {
    /...

    property int zmienna {
        public get() {
               return zmiennaPozaMethodmap;
        }

        public set(int wartosc) {
                zmiennaPozaMethodmap = wartosc;
        }
    }

    /...
};

A teraz opis przykłądu:

property int zmienna
  • property - informujemy kompilator że tworzymy pseudo zmienną
  • int - jakiego typu jest pseudo zmienna
  • zmienna - nazwa pseudo zmiennej

Budowa gettera jest taka sama jak zwykłej funkcji, ma natomiast narzucone kilka rzeczy:

  • nie przyjmuje on żadnych argumentów
  • zawsze musi wywołać funkcje return
  • zwraca typ taki jaki był podany przy 'property' (dlatego nie musimy podawać typu zwracanego, jak w normalnej funkcji)
  • musi się nazywa się get

Przykład gettera:

int zmiennaPozaMethodmap;

methodmap Nazwa {
    /...

    property int zmienna {
        public get() {
               return zmiennaPozaMethodmap;
        }
    }

    /...
};

Krótki opis:

  • public get() - tworzymy getter dla zmiennej
  • return zmiennaPozaMethodmap; - zwraca zmienną 'zmiennaPozaMethodmap'

Teraz czas przyszedł na setter, jego budowa także jest podobna do normalnej funkcji, i tak samo jak getter ma narzucone kilka rzeczy:

  • nie zwraca żadnej wartości
  • przyjmuje tylko 1 argument
  • musi się nazywać set

Przykład settera:

int zmiennaPozaMethodmap;

methodmap Nazwa {
    /...

    property int zmienna {
        public set(int wartosc) {
                zmiennaPozaMethodmap = wartosc;
        }
    }

    /...
};

Krótki opis:

  • public set(int wartosc) - tworzymy setter z wejściem dla argumentu typu 'int' o nazwie 'wartosc'
  • zmiennaPozaMethodmap = wartosc; - ustawiamy zmiennej 'zmiennaPozaMethodmap' wartość zmiennej 'wartosc'

Jak pisałem wcześniej getter służy do pobierania wartości a setter do ustawiania, dlatego poniższy zapi jest logiczny

Nazwa mojMethodmap;
mojMethodmap.zmienna = 20; //setter - ustawiamy wartość 20
PrintToChat(client, "zmienna = %d", mojMethodmap.zmienna); //getter - pobieramy wartość (w tym przypadku 20)

Alias



Jeśli chcemy stworzyć alias (tak naprawdę twórcy nazywają to "inline method", ale dla zobrazowania będę to nazywał alias'em) na jakąś funkcje możemy zrobić to w szybki sposób, poniższy przykład powinien to zilustrować:

public void innaFunkcja() {
    PrintToServer("Wywołano innaFunkcje");
}

methodmap Nazwa {
    /...
    
    public void funkcja = innaFunkcja;

    /...
};

Jak widać różnicą między zwykłą funkcją są od razu zauważane, parametry funkcji zostają bez zmian dlatego znikły '(' i '),' znaki '{' oraz '}' zostały zastąpione przez '=' ponieważ podczas kompilacji 'funkcja' zostanie zamieniona na 'innaFunkcja' a nie wywołana z funkcji 'funkcja'

Alias wywołuję się tak samo jak zwykłą funkcjie:

Nazwa mojMethodmap;
mojMethodmap.funkcja();

Dziedziczenie



Po co pisać 2 razy to samo? Właśnie tutaj z pomocą przychodzi nam dziedziczenie, ale co tutaj pisać, najlepiej to zilustruje poniższy przykład:
 

methodmap Rodzic {
    public void funkcja() {
        PrintToServer("fun1");
    }
};

methodmap Dziecko < Rodzic {
    public void innaFunkcja() {
        PrintToServer("fun2");
    }

};

Jak widać powyżej zapis dziedziczenia wygląda następująco:

methodmap nazwa < od_kogo_dziedziczy

Dzięki dziedziczeniu możemy w methodmap'ie 'Dziecko' wywołać funkcje z methodmap'y 'Rodzic', ale na odwrót już nie (wywali błąd przy kompilacji)

Magiczne this



Pisałem wcześniej że methodmap nie ma zmienych, nie jest to do końca prawda, ponieważ ma 1 zmieną która jest w każdym methodmap, a mianowicie zmienną this, nie potrafię tego zbytnio wyjaśnić dlatego może przykład wam to bardziej przybliży :)

int jakasZmienna = 211;

methodmap Nazwa {
    property int zmienna {
        public get() {
            return jakasZmienna;
        }
    }
    public void funkcja() {
        PrintToServer("this wynosi = %d", this");
        PrintToServer("zmienna wynosi = %d", this.zmienna); //gdyby nie było this szukało by zmiennej po za methodmap
    }
};

...

Nazwa mojMethodmap = view_as<Nazwa>(3); //trzeba this jest typu Nazwa, więcej o view_as znajdziesz w poradniku o składni
mojMethodmap.funkcja(); //Wypisze "this wynosi = 3" oraz "zmienna wynosi = 211"

Methodmap a enum



Jedną z głównych zalet methodmap jest to że może służyć jako rozszerzenie enum'a, wystarczy że będą miały taką samą nazwę:

enum Nazwa {
    PIERWSZY = 0,
    DRUGI = 1,
    TRZECI = 2
};

Methodmap Nazwa {
    public bool jestPierwszy() {
        return this == PIERWSZY;
    }
};

...

Nazwa varA = PIERWSZY;
Nazwa varB = TRZECI;

PrintToServer("%s", varA.jestPierwszy() ? "tak" : "nie"); // wypisze "tak", więcej na temat {wyrazenie} ? {prawda} : {fałsz} znajdziecie w opisie składni
PrintToServer("%s", varB.jestPierwszy() ? "tak" : "nie"); // wypisze "nie"

Daję to nam też dodatkową korzyść, zobaczmy ten przykład:

methodmap AdminId {
    public int pobierzFlagi() {
        return GetAdminFlags(this);
    }
};

...

GetPlayerAdmin(id).pobierzFlagi();

Na pierwszy rzut oka może wydać się to nie zrozumiałe, już tłumaczę dlaczego możemy skrócić kod takim zapisem:

  • w bibliotece admin istnieje enum o nazwie 'AdminId'
  • funkcja 'GetPlayerAdmin' zwraca wartość o type AdminId

Powyższy kod jest równo znaczny z poniższymi:

GetAdminFlags(GetPlayerAdmin(id));

//oraz

AdminId zmienna = GetPlayerAdmin(id);
zmienna.pobierzFlagi();

Konstruktor i Dekonstruktor



Powinienem o tym wspomnieć wcześniej, ale postanowiłem to zostawić na później.
Konstruktor wywołuję się przy tworzeniu "obiektu", a dekonstruktor przy jego usuwaniu. O to cała filozofia, a teraz zobaczmy na kod:

methodmap Nazwa {
    public Nazwa() {
        PrintToServer("Konstruktor Nazwa");
    }

    public ~Nazwa() {
        PrintToServer("Dekonstruktor Nazwa");
    }
};

Od razu widać że konstruktor musi mieć taką samą nazwę jak methodmap, należy też dodać że może on przyjąć jakieś parametry oraz że zwraca wartość o typie methodmap'y.
Budowę dekonstruktora ma prawie taka sama nazwę funkcji jak konstruktor, tylko że na początek musimy dać znak '~', w przeciwieństwie do konstruktora nie zwraca żadnej wartości oraz nie przyjmuje żadnych parametrów.
Zatem przetestujmy:

Nazwa mojMethodmap = Nazwa();
PrintToServer("amxx.pl");
delete mojMethodmap;

powyższy kod zwróci nam:

Konstruktor Nazwa
amxx.pl
Dekonstruktor Nazwa

__nullable__



Zbyt dużo o '__nullable__' nie znajdziemy w sieci, służy to do powiadomienia kompilatora że methodmap nie przyjmuję żadnej wartości (czyli jest null'em), zastosowanie go wymusza od nas użycia new, więcej zobaczycie w poniższym przykładzie:

methodmap Nazwa _nullable__ {
    public Nazwa() {
        /...
    }

};

...

Nazwa mojMethodmap = new Nazwa();

Methodmap a obiektowość



Specjalnie wczęsniej słowo obiekt brałem w cudzysłowie, ponieważ sourcepawn 1.7 nadal NIE JEST OBIEKTOWE.
Jeśli nazwali byśmy methodmap klasą, to byśmy zobaczyli że wszystkie funkcje (a raczej metody) oraz 'zmienne' należą do klasy a nie do obiektu (z wyjątkiem this)


  • +
  • -
  • 6


#713917 Serwer do przekierowywania

Napisane przez Linux' w 28.10.2015 19:46

Jeszcze zostaja tylko zbedne moduly z ktorych sie nie korzysta wiec mozna i je wylaczyc, a tak to chyba wszystko.


  • +
  • -
  • 2


#713942 Serwer do przekierowywania

Napisane przez Puchate w 29.10.2015 11:24

Ustawić maksymalnie długi czas rundy i mapy, załadować mapy z małą ilością entity, można kombinować w tą stronę


  • +
  • -
  • 1


#618275 Zabezpieczenie przed hackiem SteamID

Napisane przez borbet w 20.02.2014 00:04

Wstęp




Witam! Jako, że nie znalazłem żadnego artykułu dot. zabezpieczenia przed ww. hackiem postanowiłem napisać własny :)
Hack ten istnieje już jakiś czas i wiele serwerów jest przed nie zabezpieczonych, gdyż ich H@ nie wiedzą o jego istnieniu lub nie wiedzą jak się przed nim ochronić.

Ale co to robi?




Hack ten umożliwia zmianę SteamID na dowolny, dosłownie JAKI CHCEMY!
Mały przykład:
sid.png

Widzimy tam mój SteamID (H@) oraz SteamID "Hackera", który postanowił ustawić sobie SID taki sam jaki mam ja. Akurat Screen już po zastosowaniu Fix'a ( :spadowa: hakerze), ale pomyślcie sobie co osoba ze wszystkimi flagami mogłaby zrobić z serwerem?! :o

Jak się przed tym chronić?




Ochronić się przed tym jest bardzo łatwo (podobnie jak zmienić SteamID...) - należy odpowiednio skonfigurować dproto ;)

Skonfigurować?! Jak???




Konfiguracja sprowadza się raptem do zmiany tych paskudnych cyferek w dproto.cfg :^D

Dproto.cfg
Spoiler

Co tu zostało zmienione?
Spoiler

A no zostały zmienione prefix'y "a" :)
Przykładowo dla klienta RevEmu SteamID będzie następujący: "STEAM_2:0:XXXX", a dla klienta RevEmu 2013 - "STEAM_3:0:XXXX" itd.

Można także zmienić początek STEAM_ na VALVE_:
Spoiler

Od tej pory każdy NS wchodzący na serwer będzie miał SteamID VALVE_X:X:XXXX :) Łatwiej rozróżnić, który jest NS'em, a który Steam'em oraz jakiego ma klienta - [VALVE(NS)/STEAM]_[KLIENT]:[0 - SID wygenerowany przez HardwareID, 4 - Przez IP]:XXXX :D

Wady




Niestety zmiana ww. ustawień w dproto niesie za sobą konsekwencje - po ich zmianie bany w AMXBans na graczy z wygenerowanym SID'em stają się wygasłe, gdyż jak już zauważyliście zmieniliśmy prefix'y w ich SteamID i wchodząc na serwer ktoś kto miał wcześniej SID STEAM_0:0:12345 od teraz będzie miał przykładowo STEAM_2:0:12345.

Na zakończenie




To by było na tyle. W załączniku dodaję najnowsze dproto wraz z odpowiednio skonfigurowanym dproto.cfg.
Mam nadzieję, że pomogłem ;)

P.S. Istnieje także plugin wykrywający ten hack i banujący ich, ale niestety autor nie udostępnia .sma no i... plugin jest za $$$ :/

Załączone pliki

  • Załączony plik  dproto.zip   75,03 KB  1002 Ilość pobrań

  • +
  • -
  • 10


#708937 cod mod nowy jak dodać klasie niewidzialnośc

Napisane przez KrwioPijca w 08.08.2015 16:28

Dobra nie zauważyłem ze o sm chodzi, lecz według mnie są bardziej odpowiednie fora nastawione na programowanie do sourcemoda o wiele lepsze niż amxx.pl które wyraźnie wskazuję na typ programowania


  • +
  • -
  • -1


#699622 Ilość FPSów a grafika

Napisane przez StevePro w 04.05.2015 14:50

Odpowiedzi na pytania radim'a :

 

"Pytanie za 100 punktów?"

-Było się uczyć do sprawdzianu, a nie liczysz tylko na to ,że ktoś za Ciebie zrobi zadanie.

 

"Po jakiego to odkopujesz?"

-Żeby zakopać tam jakiś skarb.


  • +
  • -
  • 2


#699620 NO-IP - plugin blokujący reklamujące boty (IP spam)

Napisane przez Linux' w 04.05.2015 14:32

 

 

@sebul
W którym miejscu zrobiłeś błąd w PATTERN nr 1. :

((\d{1,3}[^\d]+){3,})
Bo przy kompilacji wyskakuje error:
error 027: invalid character constant
Chodź ustawie sobie:
new const PATTERN[] = "((\d{1,3}[^\d]+){3,})";
To dalej to samo.

 

Błąd jest w tym, że znak ^ jest znakiem specjalnym, dlatego żeby działało trzeba dać dwa razy ^, niby wiedziałem o tym od dawna, ale tutaj jakoś zapomniałem.
 

PATTERN nr2. :

((\d{1,3}[^\d]+){3}\d{1,3})
Byłby ok, tylko jest za mocny ;/ np. gdy ktoś wpisze na say'u: mam 2/10 i już ma kicka/bana.
Dałoby się ogarnąć jakoś ten PATTERN ?

 

2/10 nie zostanie wykryte, bo tutaj masz tylko dwie liczby oddzielone znakiem /, ktoś musiałby napisać 4 liczby oddzielone jakimś znakiem. A w przypadku tego pierwszego, plugin wykrywa gdy ktoś napisze 3 liczby oddzielone jakimś znakiem oraz na końcu będzie jeszcze jakiś znak inny od cyfry.


https://regex101.com/

 

Fakt nie dopisałem, ktoś napisał na say'u że posiada jakiś perk który ma tam jakoś 2/10 i chciałby mieć 1/5 i wtedy dostał bana ;/

 

 

Dlatego chyba najlepszym zabezpieczeniem bedzie zrobienie takiego tricku

([0-9].*[qwertyuiopasdfghjklzxcvbnm`,./;'-= ].*[0-9].*[qwertyuiopasdfghjklzxcvbnm`,./;'-= ].*[0-9].*[qwertyuiopasdfghjklzxcvbnm`,./;'-= ].*[0-9])

Dziala jak nalezy, jezeli ktos wpisze co kolwiek pomiedzy trzeba dwucyfrowymi liczbami to zostanie wykryty. Praktycznie nie ma sposobu obejscia tego, zabezpieczone sa wszystkie znaki i litery na standardowej klawiaturze.


  • +
  • -
  • 0


#698688 XPMOD Core [nVault/SQLx]

Napisane przez ParadisO w 26.04.2015 08:53

3 sprawy, dlaczego dałeś zapis sqlx/nvault w osobnych plikach ? Myślę, ze lepiej by było zrobić wybór cvarem sposób zapisu.

 

Druga sprawa: Przy używaniu zapytań do sql, szczególnie INSERT/UPDATE/DELETE zawsze używaj WHERE. W tym momencie Twój mod przy zapisie sql robie wpisy jednego gracza, tzn

Jeżeli mamy na serwerze np 6 graczy to zrobi 6 wpisów z player_authorization i player_data = danym pierwszego gracza.

 

Trzecia sprawa w bazie danych po to są kolumny, żeby ich używać :) Rozbij poziom, doświadczenie i monety na 3 kolumny.

 

P.S.

Zawsze warto jest nadawać w tabeli jakieś ID AI :)


  • +
  • -
  • 1


#695017 Ad-Block

Napisane przez aquax w 31.03.2015 16:47

Wielkie dzięki za udostępnienie pluginu na blokadę tego dziadostwa.
Może wreszcie ludzie jak się zabezpieczą przestaną pozywać moją sieć, że reklamuje.
 
Pozdro. <ciach>.
  • +
  • -
  • -6


#693489 Kilka pytań odnośnie menu

Napisane przez Ossal w 19.03.2015 21:03

Nie skomentuje tego inaczej niż to że miałem napisać aby jakiś linków nie podsyłać co ***** załatwiają.

Ciekaw jestem czy odpowiesz chociaż w małym stopniu na powyższe pytania posługując się tymi poradnikami...

 

 


Tylko nowe menu

Nigdy nie korzystałem ze starego, ale chyba 

 

 


menu_destroy

Jasno określa że chodzi o nowe menu...

 


  • +
  • -
  • 0