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ć.
To równanie zostało stworzone przy pomocy kodu LaTeX:
Edytor LaTeX online: CodeCogs.com/latex/eqneditor.php
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.
|
Napisane przez DarkGL
w 27.01.2021 23:09
Napisane przez ChceszCiastkoKupSe
w 24.11.2016 20:21
Napisane przez xWangan
w 06.08.2016 10:29
Napisane przez Rivit
w 01.08.2016 07:02
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:
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
Budowa gettera jest taka sama jak zwykłej funkcji, ma natomiast narzucone kilka rzeczy:
Przykład gettera:
int zmiennaPozaMethodmap; methodmap Nazwa { /... property int zmienna { public get() { return zmiennaPozaMethodmap; } } /... };
Krótki opis:
Teraz czas przyszedł na setter, jego budowa także jest podobna do normalnej funkcji, i tak samo jak getter ma narzucone kilka rzeczy:
Przykład settera:
int zmiennaPozaMethodmap; methodmap Nazwa { /... property int zmienna { public set(int wartosc) { zmiennaPozaMethodmap = wartosc; } } /... };
Krótki opis:
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:
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)
Napisane przez Linux'
w 28.10.2015 19:46
Napisane przez Puchate
w 29.10.2015 11:24
Napisane przez borbet
w 20.02.2014 00:04
# # General rule for modifying this file: # DONT CHANGE ANYTHING IF YOU DONT KNOW WHAT IT MEANS # # ======================================================== # DPROTO CONFIGURATION # ======================================================== # LoggingMode: # 1 = Console # 2 = Log Files # 3 = Both LoggingMode = 2 # ======================================================== # AUTHID MANAGEMENT # ======================================================== # ClientID types (for cid_* options) # 1: Real (or generated by HW) steam (STEAM_xx:xx:xx) # 2: Real (or generated by HW) valve (VALVE_xx:xx:xx) # 3: STEAM_ by IP # 4: VALVE_ by IP # 5: Deprecated - client will be rejected # 6: reserved for future use # 7: HLTV # 8: STEAM_ID_LAN # 9: STEAM_ID_PENDING # 10: VALVE_ID_LAN # 11: VALVE_ID_PENDING # 12: STEAM_666:88:666 # Use these options to set authid's for clients # for HLTV (default is HLTV [7] ) cid_HLTV = 7 # for p.47 clients that do not support unique id generation (default is STEAM_ID_LAN [8] ) cid_NoSteam47 = 3 # for p.48 clients that do not support unique id generation (default is VALVE_ID_LAN [10] ) cid_NoSteam48 = 3 # For Legit Steam clients (default is real STEAM_xx:xx:xx [1]) cid_Steam = 1 # Client recognized as pending when they sucessfully authorized, but did not get steam id # REMARK: Actually, it got steamid, but it is useless (STEAM_0:0:0 for example) # default is STEAM_ID_PENDING [9] cid_SteamPending = 9 # For players having revEmu ( >= 9.74) on client-side: # default is real STEAM_xx:xx:xx [1] cid_RevEmu = 1 # For players having RevEmu 2013 on client-side: # default is real STEAM_xx:xx:xx [1] cid_RevEmu2013 = 1 # For players having SteamClient 2009 / revEmu > 9.82 on client-side: # default is real STEAM_xx:xx:xx [1] cid_SC2009 = 1 # For players having old revEmu on client-side: # default is real STEAM_xx:xx:xx [1] cid_OldRevEmu = 1 # For players having hCupa's SteamEmu on client-side: # default is real STEAM_xx:xx:xx [1] cid_SteamEmu = 1 # For players having AVSMP (Cracked Steam) on client-side: # default is real STEAM_xx:xx:xx [1] cid_AVSMP = 1 # For SETTI ServerScanner # default is STEAM_xx:xx:xx generated by IP [3] cid_Setti = 3 # For SXEI Clients # default is real STEAM_xx:xx:xx [1] cid_SXEI = 1 # EnableSXEIdGeneration (0 / 1) # Turns on steamid generation based on info sent by sXeI client # Enable this only if you have sXeI server installed! EnableSXEIdGeneration = 0 # SC2009_RevCompatMode (0 / 1) # Enable fix to make steamids generated for SC2009 compatible with revEmu SC2009_RevCompatMode = 1 # SteamEmuCompatMode (0 / 1) # An analog for eSTEAMATiON's EnforceSteamEmuCompatIDMode option. # Affects only Old RevEmu and SteamEmu emulators. SteamEmuCompatMode = 1 # OldEstCompatMode (0 / 1) # Enables/Disables fix for steamids generated by eST in 0.3.1 version. # Set this to 1 if you want to make steamids generated by eST as in < 0.3.0 versions. OldEstCompatMode = 0 # IPGen_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by IP IPGen_Prefix1 = 0 # IPGen_Prefix2 (int) # STEAM_a:b:c # second prefix (b) for authids generated by IP IPGen_Prefix2 = 4 # Native_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by native auth method (Steam) Native_Prefix1 = 0; # RevEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by Steamclient 2009 SC2009_Prefix1 = 1; # RevEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by RevEmu RevEmu_Prefix1 = 2; # RevEmu2013_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by RevEmu2013 RevEmu2013_Prefix1 = 3; # OldRevEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by old RevEmu OldRevEmu_Prefix1 = 4; # SteamEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by SteamEmu SteamEmu_Prefix1 = 5; # SteamEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids assigned for AVSMP Clients (Cracked steam) AVSMP_Prefix1 = 6; # Setti_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids assigned for Setti server scanner Setti_Prefix1 = 7; # SXEI_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids assigned for sXeI clients SXEI_Prefix1 = 8; # Note that banid will use steamid WITHOUT any prefixes! # ======================================================== # ATTACKS SUPRESSION # ======================================================== # FakePlayers_ConnectInitiationCheck (seconds) # Sets the time, in seconds, in which client should initiate # game session (in other words, send the "new" command) after it has # been connected. If client did not initiated game session, it will be marked as # fake and kicked. # Default is 6 seconds. # Use 0 to disable this check. FakePlayers_ConnectInitiationCheck = 12 # FakePlayers_ClientValidationCheck (seconds) # Sets the time, in seconds, in which client should answer to random unique command # sent by server. If client did not answered for this command, it will be marked as # fake and kicked. # Default is 8 seconds. # Use 0 to disable this check. FakePlayers_ClientValidationCheck = 16 # FakePlayers_AntiReconnect (0/1) # Enables detection of fakeplayers that reconnects quickly (every < 10 seconds) # before fake players checks have completed. # This check will work only if FakePlayers_ClientValidationCheck and # FakePlayers_ConnectInitiationCheck are enabled. # Default is 1 (ON). FakePlayers_AntiReconnect = 1 # FakePlayers_CommandsOrderCheck (0/1) # Enable commands order checking on the start of initiated connection # Default is 1 (ON). FakePlayers_CommandsOrderCheck = 1 # FakePlayers_BanTime (minutes) # Dproto will ban IP spamming fakeplayers for time (in minutes) specified in this variable # use 0 for permanent ban # use negative vaules to disable ban (fake players will only be kicked) FakePlayers_BanTime = 120 # Exploits_CheckDownloads (0/1) # Enable checking of requested download files against precached resources # Default is 1 (ON). Exploits_CheckDownloads = 1 # Exploits_DisableUploads (0/1) # Disable file uploads (not customizations) to the server # Default is 1 (ON). Exploits_DisableUploads = 1 # ======================================================== # OTHER STUFF # ======================================================== # DisableNativeAuth (0/1) # Disables valve/steam auth system. # For p.47 Based: Server will not connect to auth servers. # For All: Server will not call authorization functions. # This is a fix for startup freeze for old (p.47) servers. DisableNativeAuth = 0 # ServerInfoAnswerType (0/1/2) # Sets server answer type for query requests # 0 = New style (Source Engine) # 1 = Old Style (Fix favorites list for p.47 clients) # 2 = Hybrid mode - Server is visible anywhere, but there are 3 packets generated for every serverinfo request ServerInfoAnswerType = 2 # Game_Name (string) # Sets game name displayed for clients # If Game_Name is empty, native game name will be used Game_Name = # Enables fix for proper player id displaing on HLStats server monitoring # Enable this only if you have HLStats HLStatsPlayerIdFix = 0 # ExportVersion (0 / 1) # Enables/Disables exporting of dp_version cvar # 1 = dp_version cvar will be exported to server rules. It will be visible in server monitoring tools (like HLSW) # 0 = dp_version cvar will not be exported to server rules. ExportVersion = 1 # HLTVExcept_IP (ip addr) # HLTV from this IP will be able to join the server even if cid_HLTV is set to 5 (deprectaed) HLTVExcept_IP = 127.0.0.1
# RevEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by Steamclient 2009 SC2009_Prefix1 = 1; # RevEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by RevEmu RevEmu_Prefix1 = 2; # RevEmu2013_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by RevEmu2013 RevEmu2013_Prefix1 = 3; # OldRevEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by old RevEmu OldRevEmu_Prefix1 = 4; # SteamEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids generated by SteamEmu SteamEmu_Prefix1 = 5; # SteamEmu_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids assigned for AVSMP Clients (Cracked steam) AVSMP_Prefix1 = 6; # Setti_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids assigned for Setti server scanner Setti_Prefix1 = 7; # SXEI_Prefix1 (int) # STEAM_a:b:c # first prefix (a) for authids assigned for sXeI clients SXEI_Prefix1 = 8;
# for p.47 clients that do not support unique id generation (default is STEAM_ID_LAN [8] ) cid_NoSteam47 = 4 # for p.48 clients that do not support unique id generation (default is VALVE_ID_LAN [10] ) cid_NoSteam48 = 4 # For Legit Steam clients (default is real STEAM_xx:xx:xx [1]) cid_Steam = 1 # Client recognized as pending when they sucessfully authorized, but did not get steam id # REMARK: Actually, it got steamid, but it is useless (STEAM_0:0:0 for example) # default is STEAM_ID_PENDING [9] cid_SteamPending = 9 # For players having revEmu ( >= 9.74) on client-side: # default is real STEAM_xx:xx:xx [1] cid_RevEmu = 2 # For players having RevEmu 2013 on client-side: # default is real STEAM_xx:xx:xx [1] cid_RevEmu2013 = 2 # For players having SteamClient 2009 / revEmu > 9.82 on client-side: # default is real STEAM_xx:xx:xx [1] cid_SC2009 = 2 # For players having old revEmu on client-side: # default is real STEAM_xx:xx:xx [1] cid_OldRevEmu = 2 # For players having hCupa's SteamEmu on client-side: # default is real STEAM_xx:xx:xx [1] cid_SteamEmu = 2 # For players having AVSMP (Cracked Steam) on client-side: # default is real STEAM_xx:xx:xx [1] cid_AVSMP = 2 # For SETTI ServerScanner # default is STEAM_xx:xx:xx generated by IP [3] cid_Setti = 4 # For SXEI Clients # default is real STEAM_xx:xx:xx [1] cid_SXEI = 2
Napisane przez KrwioPijca
w 08.08.2015 16:28
Napisane przez StevePro
w 04.05.2015 14:50
Napisane przez Linux'
w 04.05.2015 14:32
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.@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 constantChodź ustawie sobie:new const PATTERN[] = "((\d{1,3}[^\d]+){3,})";To dalej to samo.
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.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 ?
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.
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
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...