Search the Community
Showing results for tags 'amxx'.
-
Witam zapraszam serdecznie do współpracy :D Design-4y.eu - Paczka Counter-Strike 1.6 CodMod AMXX -> Sourcemod CS:GO Przedmiot: Paczka AMXX Counter-Stike 1.6 Modyfikacja CodMod 201 Opis : 20 Klas zwykłych,8 Klas premium,Ponad 150 perków,VIP,MaxVIP,Klany,System CodTop15,System Monet,Paczki za zabicie,System asyst,Zaawansowany system sklepowy oraz menu.System asysty,system nagród dla najlepszych graczy,darmowy vip dla nowych graczy.Podstawowe pluginy takie jak menu admina,esp,reset statystyk,modele codmod,roundsound,amxbans,traile granatów,killstreak,antycheat,zabezpieczenia i wiele więcej. Kontakt: amxxpack@o2.pl / GG : 68452402 lub przez czat na stronie Płatność : Przelew,Allegro,Bitcoin,Paysafecard ew SMS Posiadam też inne mody na stanie,więcej informacji na priv :D Filmik https://www.youtube.com/watch?v=RqJaAWDhh7k
-
Witam zapraszam serdecznie do współpracy :D Design-4y.eu - Paczka Counter-Strike - Modyfikacja Twoja własna Paczka - Modyfikacja Counter-Strike 1.6 Przedmiot: Paczka AMXX Counter-Stike 1.6 Modyfikacja CodMod 201 Opis : 20 Klas zwykłych,8 Klas premium,Ponad 150 perków,VIP,MaxVIP,Klany,System CodTop15,System Monet,Paczki za zabicie,System asyst,Zaawansowany system sklepowy oraz menu.System asysty,system nagród dla najlepszych graczy,darmowy vip dla nowych graczy.Podstawowe pluginy takie jak menu admina,esp,reset statystyk,modele codmod,roundsound,amxbans,traile granatów,killstreak,antycheat,zabezpieczenia i wiele więcej. Kontakt: amxxpack@o2.pl / GG : 68452402 lub przez czat na stronie Płatność : Przelew,Allegro,Bitcoin,Paysafecard ew SMS Posiadam też inne mody na stanie. Robie też dowolne paczki od zera. Więcej informacji na priv Filmik https://www.youtube.com/watch?v=RqJaAWDhh7k
-
Witam posiadam na stanie Design-4y.eu - Paczka Counter-Strike 1.6 CS:GO MOD AMXX Przedmiot: Paczka CS:GO Mod AMXX Opis : Standardowy CS:GO Mod w którego skład wchodzą takie funkcje jak : Skrzynki,Klucze,Skiny,Ruletka,Misje,2 Vipy,System Monet,Dolarów,Sklep oraz podstawowe pluginy FFA i wiele więcej Kontakt: mpchentaro@vp.pl / GG : 68452402 lub przez czat na stronie Płatność : Przelew,Allegro,Bitcoin,Paysafecard ew SMS Posiadam też inne mody na stanie,więcej informacji na priv :D
-
Dawno już nie pisałem żadnego poradnika a taki ciekawy temat mi się ostatnio nasunął. Nie widziałem też podobnego w sieci na ten temat (no dobra jest tego sporo, lecz pomijają pewne rzeczy), być może dlatego że cały proces, który tu opiszę jest raczej prosty =) Nie obiecuje, że ten poradnik pokrywa wszystko, lecz będę się starał podzielić całym swoim doświadczeniem związanym z tym tematem. Proszę wziąć pod uwagę, że prezentuję tutaj swoje własne podejście. Być może spotkacie/spotkaliście się z innym, być może ktoś potrafi to zrobić lepiej. W takiej sytuacji proszę o komentarz. Ponad to wiele hostingów wspiera migracje na ReHLDS oraz pomaga w tym np. 1shot1kill. Pokażę również na przykładzie tego hostingu jak to wszystko jeszcze bardziej przyśpieszyć i uprościć. Od razu mówię, że nie dostaliśmy złamanego grosza za tą krypto reklamę. Ot, po prostu postanowiłem docenić firmę, która idzie z duchem czasu i jest otwarta na opensource Podkreślę jeszcze, że poradnik opisuje sam proces migracji starając się przy tym zachować jak najwięcej starych ustawień. Nie poruszam tu wszystkich wątków związanych z ogromem możliwości ReHLDS. I. Czym w ogóle jest ReHLDS ? ReHLDS jest przebudowanym silnikiem HLDS z wersji 6153, uzyskanym w wyniku procesu inżynierii wstecznej. Pozwoliło to wyeliminować liczne błędy z którymi zostawiło nas Valve oraz dokonać optymalizacji kodu. Poprawiło to znacząco bezpieczeństwo rozgrywki, płynność gry oraz zmniejszyło zapotrzebowanie na zasoby systemowe (zwłaszcza procesora, co można sprawdzić komendą "stats"). Obecnie projekt jest oznaczony jako stabilny. Mamy również do wyboru dwie wersje - jedna jest wersją zachowującą dużą kompatybilność wsteczną z HLDS oraz druga eksperymentalna, która wprowadza dużo bardziej agresywne poprawki i optymalizacje, lecz nie zachowuje kompatybilności wstecznej np. z niektórymi pluginami AMXX. Ogólnie jest zalecane używanie pierwszej wersji i tą będziemy się tutaj zajmować, druga powinna raczej służyć do zabawy i testów. Gdzie znajdziemy informacje o projekcie ? https://github.com/dreamstalker/rehlds Skąd ściągnę ReHLDS ? (niewymagane dla 1s1k) http://nexus.rehlds.org/nexus/content/repositories/rehlds-dev/rehlds/rehlds/ Zawsze ściągamy najnowszą wersje! Na ten moment pisania tego poradnika jest to wersja 3.4.0.656 II. Przygotowanie Po pierwsze i najważniejsze. Zanim przystąpimy do jakichkolwiek prac koniecznie wykonujemy kopię zapasową serwera! Każdy szanujący się hosting gier powinien zapewnić taką kopię do kilku dni wstecz, lecz dla pewności najlepiej ściągnąć sobie taką kopię na swój komputer (bądź wykonać samemu, jeśli hosting tego nie wspiera lub hostujemy na własnym serwerze dedykowanym / VPS). W przypadku jakiekolwiek niepowodzenia jesteśmy w stanie wrócić się do działającej wersji. W tym miejscu również przestrzegam, że nie ponoszę żadnej odpowiedzialności za ewentualne szkody, niepowodzenia, utratę danych itd. III. Instalacja silnika Skoro mamy już zapisaną kopię serwera to możemy przejść do właściwego działania. Osobiście jestem zwolennikiem podejścia, że jeżeli coś przebudowujemy to totalnie, od zera. Zatem zlecamy na hostingu reinstalacje serwera do zera! Możemy również podmienić tylko potrzebne pliki, lecz mogą z tego wyjść różne przykrości Jeżeli jesteśmy klientem 1s1k to przy reinstalacji oraz kupnie nowego serwera domyślnie instalowany jest silnik ReHLDS. Wersja na hostingu może być nie co starsza niż aktualna, wtedy możemy ręcznie dorzucić nowe pliki z repozytorium. Jednakże, wersja w instalatorze powinna być przetestowana na maszynach hostingu. W ten sposób mamy gwarancję, że się uruchomi bez problemu. Jeśli nie mamy opcji reinstalacji bezpośrednio do ReHLDS to wykonujemy ją do HLDS (najlepiej wersji przynajmniej 6153) i podmieniamy binarki w katalogu cstrike oraz cstrike/valve. Opcje ponumerowałem na screenie: Na sam koniec uruchamiamy serwer i sprawdzamy wersje silnika w konsoli za pomocą komendy "version". Jeśli zobaczymy wynik podobny do tego poniżej to znaczy, że się wszystko powiodło IV. Instalacja i konfiguracja modułów Kolejny krokiem będzie instalacja odpowiedników pluginów metamoda. Chodzi tutaj o znane wszystkim moduły jak Dproto czy VoiceTranscoder, bez których dziś serwery nie mogą funkcjonować. Kolejno ich odpowiednikami są: Dproto -> ReUnion VoiceTranscoder -> ReVoice FakeDetector -> ReAuthCheck (również warto zainstalować, chroni przed nalotami botów i fakeclientów na serwer) NetBufExtender (opcjonalnie - jest kompatybilny z ReHLDS i rozszerza zaufany bufor HUD u graczy, aby zapobiec jego przepełnieniu, co przy wolniejszych łączach powoduje u gracza wyrzucenie z gry) Jeśli mamy serwer na 1s1k to sprawa wygląda dosyć prosto, ponieważ mamy gotowe paczki w instalatorze. Wystarczy kliknąć kolejno "Instaluj". Należy również odczekać kilka sekund między każdą instalacją. Warto w tym miejscu zanim przystąpimy do instalacji zainstalować już AMXX'a wraz z najnowszym MetaMod'em, kwestia samego AMXX będzie poruszona dalej. Reszta modułów: Pozostali muszą ściągnąć bezpośrednio z internetu i zainstalować ręcznie tak jak każdy inny plugin metamod, czyli tworzymy folder w cstrike/addons i dopisujemy ścieżkę do binarki w cstrike/addons/metamod/plugins.ini Nie znalazłem również oficjalnych repozytorium z wszystkimi pluginami, lecz bez problemu znajdziecie je w Google Na co jeszcze warto zwrócić uwagę to konfiguracja. O ile ReVoice i ReAuthCheck nie trzeba specjalnie konfigurować, o tyle warto poświęcić chwilę na konfiguracje ReUnion, czyli naszego starego Dproto. Nie możemy tutaj po prostu wrzucić starego configu, ponieważ trochę się różni. Niektóre funkcje znikły (np. zmiana nazwy gry) oraz pojawiło się kilka nowych funkcji np. saltowanie steamid. Jak rozwiązujemy ten konflikt ? Możemy do tego wykorzystać dowolny edytor tekstu umożliwiający porównanie dwóch plików, ja to zaprezentuję na jednym z najpopularniejszych, czyli Notepad++. Będziemy potrzebowali również wtyczki Compare, znajdziemy ją na liście pluginów w Plugin Manager. Ważne również abyśmy używali domyślnego stylu, ponieważ na innych kolorystyka porównań może być nieczytelna. Wszystko jest pokazane na screenach: Aby dokonać porównania otwieramy stare dproto.cfg oraz nowe reunion.cfg. Następnie przy aktywnej zakładce dproto.cfg wybieramy: Otwieramy zakładkę z reunion.cfg i wybieramy: Uzyskujemy taki efekt: W ten sposób będziemy mieli pewność, że niczego nie pominęliśmy oraz możemy zaobserwować wszystkie zmiany. Każdy kolor oznacza coś innego, lecz zostały dobrane intuicyjnie, więc nie powinno być problemów z zrozumieniem: Zielony - Nowa linijka Czerwony - Brakująca linijka Niebieski - Linijka przesunięta na inną pozycję Żółty - Linijka częściowo zmieniona Szary - W tym miejscu znajdowałby się tekst z drugiego pliku Jeżeli uważamy, że wszystko już nanieśliśmy to możemy wykonać porównanie jeszcze raz, aby sprawdzić czy zostały jeszcze jakieś różnice. Pozwolę sobie trochę odbiec od tematu i dwie najważniejsze rzeczy jakie powinniśmy ustawić (nawet na zwykłym HLDS) to zabezpieczenie przed podszywaniem się pod cudze steamid oraz zabezpieczenie przed podszywaniem się pod HLTV. Chodzi o wartości z screena, w HLTVExcept_IP wpisujemy adres IP HLTV: Mamy również dostępny wachlarz innych modułów, lecz skoncentrowałem się tu tylko na tych najważniejszych. Najczęściej wprowadzają zupełnie nowe funkcjonalności, więc nie migrujemy już danych tylko traktujemy jako zupełną nowość. V. AMXX Przechodzimy teraz właściwie do sedna, do najważniejszego modułu, który urozmaica naszą rozrywkę. Autorzy postanowili również przebudować ten moduł i nazwali go ReAmxModX, lecz ma problemy z kompatybilnością wsteczną i zalecane jest używanie standardowego AMXX w wersji 1.8.3 (nie 1.8.2). Podobnie jak w poprzednim podpunkcie klienci 1s1k mogą zainstalować AMXX 1.8.3 z instalatora. Inne hostingi również powinny posiadać taką opcję, lecz gdyby jej brakło to zostawiam link do oficjalnego repozytorium: https://www.amxmodx.org/snapshots.php Również wybieramy najnowszą wersję i instalujemy tak jak inne moduły Metamod. W tej wersji również pojawiło się kilka nowych funkcji i usprawnień. Wrzucając z powrotem nasze configi i pluginy utracimy nad tym kontrole. Zatem w jaki sposób to pogodzić ? Wracamy do naszego utworzonego wcześniej backup'u i wypakowujemy cały folder z AMXX. Wysyłamy go na serwer w miejsce aktualnego AMXX, lecz powinniśmy użyć takiego klienta FTP żeby pytał nas co robić z takimi samymi plikami (np. polecam do tego FileZilla). Zaznaczamy w takiej sytuacji opcje jak na screenie. W efekcie zachowujemy wszystkie pliki związane z wersją 1.8.3, mamy wrzucone nasze stare pluginy i pliki konfiguracyjne do nich, lecz pominęliśmy niektóre szczególnie ważne configi. Configi, które możemy bez problemowo podmienić naszymi: clcmds.ini cmds.ini custommenuitems.cfg cvars.ini maps.ini plugins.ini modules.ini sql.cfg users.ini Natomiast plik konfiguracyjny nad którym warto się pochylić to amxx.cfg Celowo chciałem zapobiec jego podmiance, ponieważ tu mamy najwięcej zmian. Zatem powtarzamy tutaj proces z punktu IV z porównywaniem starego pliku z nowym. Widząc różnice wpisujemy do nowego wszystkie nasze wartości dla standardowych cvarów lub dopasowujemy je do nowych możliwości patrz np. cvar z screena. Resztę cvarów związanych z naszymi pluginami bez problemowo kopiujemy. VI. Inne uwagi Na tym etapie już większość powinna nam poprawnie działać, lecz zaobserwowałem też pewne niedogodności. Być może dlatego, że mimo wszystko AMXX 1.8.3 jest wydany jako wersja rozwojowa i od wielu lat oficjalnie nie jest stabilny, przez co mogą wystąpić problemy z: Pluginami łączącymi się z bazami danymi MySQL za pomocą funkcji SQL_Connect (należy wtedy podmienić moduł mysql na ten z wersji 1.8.2) Pluginami wykorzystującymi moduł Cstrike (należy wtedy podmienić moduł cstrike na ten z wersji 1.8.2) Pluginami wykorzystującymi moduł HamSandwich (tutaj nie ma uniwersalnego rozwiązania, najczęściej wymagają poprawek w kodzie) Pluginami wykorzystującymi moduł Orpheu (ten nie jest już w ogóle wspierany w ReHLDS, jest zastąpiony przez ReAPI, lecz takie pluginy muszą być przepisane na nowo) Warto również przetestować wszystkie inne pluginy czy zachowują się poprawnie. Natomiast jako dodatkowe rozszerzenie opłaca się zainstalować moduł ReGameDLL, który pozwala nam rozszerzyć rozgrywkę o takie elementy, które nie były osiągalne na HLDS (np. zwiększenie limitu pieniędzy) oraz pozwala zastąpić wiele pluginów jak np. admin freelook, deathmatch mod, nade drops itp. Repozytorium projektu - https://github.com/s1lentq/ReGameDLL_CS Jeśli ktoś się spotkał z jeszcze jakąś nietypową sytuacją lub wie jak jeszcze usprawnić cały proces to niech da znać i dopiszę to do poradnika Zakaz kopiowania poradnika na inne fora bez mojej wiedzy i podania źródła!
- 1 reply
-
- 4
-
Przedstawiam krótki poradnik, dzięki któremu będziecie mogli włączyć lub też wyłączyć na serwerze takie komendy jak: /hp ; /me ; i tym podobne. 1. Wchodzimy w menu admina i przechodzimy na kolejną stronę. 2. Następnie wchodzimy w Ustawienia statystyk i wybieramy co chcemy mieć włączone, a co wyłączone. Na samym końcu zapisujemy konfigurację i tyle. Poradnik krótki, ale myślę że wystarczająco treściwy Poradnik stworzony przeze mnie dla CSKatowice.com Zakaz kopiowania na inne fora.
-
Witam, mam dziwny problem. Wgrałem na serwer powody kicków Trampa i plugin ten działał bez zarzutów. Tworząc dalej swoją wizję serwera nagle napotkałem się na error logi właśnie z tym pluginem. Objawy? Działą wszystko prócz powodów, których nie wyświetla. Logi: Function is not present (function "ads") (plugin "reason_kick.amxx") [AMXX] Displaying debug trace (plugin "reason_kick.amxx") [AMXX] Run time error 10: native error (native "set_task") [AMXX] [0] reason_kick.sma::plugin_init (line 75) SMA: #include <amxmodx> #include <amxmisc> #include <cstrike> #define PLUGIN "Reason Kicker" #define AUTHOR "Tramp" #define VERSION "0.1" new g_menuPosition[33]; new g_menuPlayers[33][32]; new g_menuPlayersNum[33]; new g_coloredMenus; new g_kickReasons[7][128]; new g_lastCustom[33][128]; new g_inCustomReason[33]; new g_kickedPlayer; #define MAXSLOTS 32 enum Color { YELLOW = 1, // Yellow GREEN, // Green TEAM_COLOR, // Red, Grey, Blue GREY, // Grey RED, // Red BLUE, // Blue } new TeamInfo; new SayText; new MaxSlots; new TeamName[][] = { "", "TERRORIST", "CT", "SPECTATOR" } new bool:IsConnected[MAXSLOTS + 1]; public plugin_init() { register_dictionary("common.txt") register_dictionary("admincmd.txt") register_dictionary("plmenu.txt") register_plugin(PLUGIN, VERSION, AUTHOR) register_cvar(PLUGIN, VERSION, FCVAR_SERVER|FCVAR_SPONLY); register_clcmd("amx_kickmenu", "cmdKickMenu", ADMIN_KICK, "- displays kick menu") register_clcmd("amx_customkickreason", "setCustomKickReason", ADMIN_KICK, "- configures custom ban message") register_menucmd(register_menuid("Kick Menu"), 1023, "actionKickMenu") register_menucmd(register_menuid("Kick Reason Menu"), 1023, "actionKickMenuReason") register_cvar("amx_kick_r1",""); register_cvar("amx_kick_r2",""); register_cvar("amx_kick_r3",""); register_cvar("amx_kick_r4",""); register_cvar("amx_kick_r5",""); register_cvar("amx_kick_r6",""); register_cvar("amx_kick_r7",""); new k1[32], k2[32], k3[32], k4[32], k5[32], k6[32], k7[32]; get_cvar_string("amx_kick_r1",k1, 31); get_cvar_string("amx_kick_r2",k2, 31); get_cvar_string("amx_kick_r3",k3, 31); get_cvar_string("amx_kick_r4",k4, 31); get_cvar_string("amx_kick_r5",k5, 31); get_cvar_string("amx_kick_r6",k6, 31); get_cvar_string("amx_kick_r7",k7, 31); set_task(320.0, "ads", 7777, "", 0, "b"); g_kickReasons[0] = k1 g_kickReasons[1] = k2 g_kickReasons[2] = k3 g_kickReasons[3] = k4 g_kickReasons[4] = k5 g_kickReasons[5] = k6 g_kickReasons[6] = k7 TeamInfo = get_user_msgid("TeamInfo"); SayText = get_user_msgid("SayText"); MaxSlots = get_maxplayers(); } public cmdKickMenu(id, level, cid) { if (cmd_access(id, level, cid, 1)) displayKickMenu(id, g_menuPosition[id] = 0) return PLUGIN_HANDLED } displayKickMenu(id, pos) { if (pos < 0) return get_players(g_menuPlayers[id], g_menuPlayersNum[id]) new menuBody[512] new b = 0 new i new name[32] new start = pos * 8 if (start >= g_menuPlayersNum[id]) start = pos = g_menuPosition[id] = 0 new len = format(menuBody, 511, g_coloredMenus ? "\y%L\R%d/%d^n\w^n" : "%L %d/%d^n^n", id, "KICK_MENU", pos + 1, (g_menuPlayersNum[id] / 8 + ((g_menuPlayersNum[id] % 8) ? 1 : 0))) new end = start + 8 new keys = MENU_KEY_0 if (end > g_menuPlayersNum[id]) end = g_menuPlayersNum[id] for (new a = start; a < end; ++a) { i = g_menuPlayers[id][a] get_user_name(i, name, 31) if (access(i, ADMIN_IMMUNITY)) { ++b if (g_coloredMenus) len += format(menuBody[len], 511-len, "\d%d. %s^n\w", b, name) else len += format(menuBody[len], 511-len, "\d#. [\rIMMUNITET\d] %s^n", name) } else { keys |= (1<<b) if (is_user_admin(i)) len += format(menuBody[len], 511-len, g_coloredMenus ? "\r%d. \w[\rADMIN\w] %s ^n\w" : "\r%d. \w[\rADMIN\w] %s ^n", ++b, name) else len += format(menuBody[len], 511-len, "\r%d.\w %s^n", ++b, name) } } if (end != g_menuPlayersNum[id]) { format(menuBody[len], 511-len, "^n\r9.\w %L^n\r0.\w %L", id, "MORE", id, pos ? "BACK" : "EXIT") keys |= MENU_KEY_9 } else format(menuBody[len], 511-len, "^n\r0.\w %L", id, pos ? "BACK" : "EXIT") show_menu(id, keys, menuBody, -1, "Kick Menu") } public actionKickMenu(id, key) { switch (key) { case 8: displayKickMenu(id, ++g_menuPosition[id]) case 9: displayKickMenu(id, --g_menuPosition[id]) default: { /* new player = g_menuPlayers[id][g_menuPosition[id] * 8 + key] new authid[32], authid2[32], name[32], name2[32] get_user_authid(id, authid, 31) get_user_authid(player, authid2, 31) get_user_name(id, name, 31) get_user_name(player, name2, 31) new userid2 = get_user_userid(player) log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, name2, userid2, authid2) show_activity_key("ADMIN_KICK_1", "ADMIN_KICK_2", name, name2); server_cmd("kick #%d", userid2) server_exec() */ g_kickedPlayer = g_menuPlayers[id][g_menuPosition[id] * 8 + key] displayKickMenuReason(id) } } return PLUGIN_HANDLED } displayKickMenuReason(id) { new menuBody[1024] new len = format(menuBody,1023, g_coloredMenus ? "%s^n\w^n" : "%s^n^n", "\y[\ruXXX.PL\y] \wPowod :") new i = 0; while (i < 7) { if (strlen(g_kickReasons[i])) len+=format(menuBody[len],1023-len,"\r%d.\w %s^n",i+1,g_kickReasons[i]) i++ } len+=format(menuBody[len],1023-len,"^n\r8.\w Wlasny Powod^n") if (g_lastCustom[id][0]!='^0') len+=format(menuBody[len],1023-len,"^n\r9.\w %s^n",g_lastCustom[id]) len+=format(menuBody[len],1023-len,"^n\r0.\w %L^n",id,"EXIT") new keys = MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_7 | MENU_KEY_8 | MENU_KEY_0 if (g_lastCustom[id][0]!='^0') keys |= MENU_KEY_9 show_menu(id,keys,menuBody,-1,"Kick Reason Menu") } public actionKickMenuReason(id,key) { switch (key) { case 9: { displayKickMenu(id,g_menuPosition[id]) } case 7: { g_inCustomReason[id]=1 client_cmd(id,"messagemode amx_customkickreason") return PLUGIN_HANDLED } case 8: { kickUser(id,g_lastCustom[id]) } default: { kickUser(id,g_kickReasons[key]) } } displayKickMenu(id,g_menuPosition[id] = 0) return PLUGIN_HANDLED } public setCustomKickReason(id,level,cid) { if (!cmd_access(id,level,cid,1)) { return PLUGIN_HANDLED } new szReason[128] read_argv(1,szReason,127) copy(g_lastCustom[id],127,szReason) if (g_inCustomReason[id]) { g_inCustomReason[id]=0 kickUser(id,g_lastCustom[id]) } return PLUGIN_HANDLED } kickUser(id,kickReason[]) { new player = g_kickedPlayer; new name[32], name2[32], authid[32],authid2[32] get_user_name(player,name2,31) get_user_authid(player,authid2,31) get_user_authid(id,authid,31) get_user_name(id,name,31) new userid2 = get_user_userid(player); //client_print(0,print_chat,"Twoje id : %d ", userid2); log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>Powod: %s^"", name, get_user_userid(id), authid, name2, userid2, authid2, kickReason) set_hudmessage(0, 255, 0, 0.05, 0.35, 0, 6.0, 5.0, 0.5, 0.15, 7); show_hudmessage(0, "Gracz o nicku %s ^nZostal wyrzucony przez %s ^nPowod: %s", name2, name, kickReason); //client_print(0,print_chat,"Gracz o nicku %s ^nZostal wywalony przez %s ^nPowod: %s", name2, name, kickReason); server_cmd("kick #%d ^"%s^"",userid2,kickReason) } public client_putinserver(player) { IsConnected[player] = true; } public client_disconnect(player) { IsConnected[player] = false; } public ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...) { static message[256]; switch(type) { case YELLOW: // Yellow { message[0] = 0x01; } case GREEN: // Green { message[0] = 0x04; } default: // White, Red, Blue { message[0] = 0x03; } } vformat(message[1], 251, msg, 4); // Make sure message is not longer than 192 character. Will crash the server. message[192] = '^0'; new team, ColorChange, index, MSG_Type; if(!id) { index = FindPlayer(); MSG_Type = MSG_ALL; } else { MSG_Type = MSG_ONE; index = id; } team = get_user_team(index); ColorChange = ColorSelection(index, MSG_Type, type); ShowColorMessage(index, MSG_Type, message); if(ColorChange) { Team_Info(index, MSG_Type, TeamName[team]); } } ShowColorMessage(id, type, message[]) { message_begin(type, SayText, _, id); write_byte(id) write_string(message); message_end(); } Team_Info(id, type, team[]) { message_begin(type, TeamInfo, _, id); write_byte(id); write_string(team); message_end(); return 1; } ColorSelection(index, type, Color:Type) { switch(Type) { case RED: { return Team_Info(index, type, TeamName[1]); } case BLUE: { return Team_Info(index, type, TeamName[2]); } case GREY: { return Team_Info(index, type, TeamName[0]); } } return 0; } FindPlayer() { new i = -1; while(i <= MaxSlots) { if(IsConnected[++i]) { return i; } } return -1; } Bardzo prosiłbym o pomoc
-
Mod którego użyłem do mojego serwera: Skiny polecam brać z strony: (sprawdzone) Polecam! (pomogę przy instalacji) Compatible AMX versions AMX 1.8.0 [Not tested] AMX 1.8.1 [Not tested] AMX 1.8.2 [Tested] (It works) AMX 1.8.3 [Tested] (It works)
-
Opis: Plugin który dodaje automatycznie defa ct na początku rundy. Instalacja: Podstawowa CVARY Brak Link do pobrania: http://www109.zippyshare.com/v/clRJr5BD/file.html Źródlo: amxx.pl
-
Opis: Postanowiłem zrobić swoją paczkę AMXX z modem BF2. System: Windows Wersja Amxmodx: 1.8.2 Plugins.ini ; AMX Mod X plugins ; Admin Base - Always one has to be activated admin.amxx ; admin base (required for any admin-related) ;admin_sql.amxx ; admin base - SQL version (comment admin.amxx) ; Basic admincmd.amxx ; basic admin console commands adminhelp.amxx ; help command for admin console commands adminslots.amxx ; slot reservation multilingual.amxx ; Multi-Lingual management ; Menus menufront.amxx ; front-end for admin menus cmdmenu.amxx ; command menu (speech, settings) plmenu.amxx ; players menu (kick, ban, client cmds.) ;telemenu.amxx ; teleport menu (Fun Module required!) mapsmenu.amxx ; maps menu (vote, changelevel) pluginmenu.amxx ; Menus for commands/cvars organized by plugin ; Chat / Messages adminchat.amxx ; console chat commands antiflood.amxx ; prevent clients from chat-flooding the server scrollmsg.amxx ; displays a scrolling message imessage.amxx ; displays information messages adminvote.amxx ; vote commands ; Map related nextmap.amxx ; displays next map in mapcycle mapchooser.amxx ; allows to vote for next map timeleft.amxx ; displays time left on map ; Configuration pausecfg.amxx ; allows to pause and unpause some plugins statscfg.amxx ; allows to manage stats plugins via menu and commands ; Counter-Strike ;restmenu.amxx ; restrict weapons menu statsx.amxx ; stats on death or round end (CSX Module required!) ;miscstats.amxx ; bunch of events announcement for Counter-Strike ;stats_logging.amxx ; weapons stats logging (CSX Module required!) ; Enable to use AMX Mod plugins ;amxmod_compat.amxx ; AMX Mod backwards compatibility layer ; Custom - Add 3rd party plugins here bf2rank.amxx ;Główny plugin rang descriptive_fire_in_the_hole.amxx ; Informacja o rzuconym granacie. ad_manager.amxx ; Info na sayu. parachute.amxx ; Spadochron. abd.amxx ; Pokazuje ile zabraliśmy przeciwnikowi HP. inf_smierc.amxx ; Info po śmierci. kill_assist.amxx ; Asysty. niesmiertelne_hostage.amxx ; Hosty są nieśmiertelne. resetscore.amxx ; Reset statystyk. afkbombtransfer.amxx ; Bomba jest przenoszona automatycznie z afk na grającego gracza. c4timer.amxx ; Czas do wybuchu bomby. Allow_round_finish.amxx ; Można dograć runde. RoundSound.amxx ; Muzyka na serwerze. bs_limiter.amxx ; Kiedy Ct jest mniej niż 5 można grać tylko na A. adminlisten.amxx ; Admin widzi wszystkie rozmowy na say. sillyc4,amxx ; Można plantować na ścianie. galileo.amxx ; Plugin do votowania map. polski_cs.amxx ; Język Polski zamiana_modeli.amxx cwz.amxx bulletdamage.amxx Cvary: Brak. Instalacja: Standardowa. Pobierz: Paczka BF2 by Konis
-
Udostępniam mój plugin, który kiedyś sprzedawałem. Obecnie już go nie rozwijam, ponieważ arena PB się skurczyła. Wersja jest stabilna - to znaczy, większość funkcji powinno działać poprawnie. Ewentualny support lub dalsze go rozszerzenie na życzenie - za opłatą. Instalacja standardowa - umieść plugin w addons/amxmodx/plugins i dopisz w plugins.ini Menu dla klanów PB, z wszystkimi potrzebnymi funkcjami do gry i nie tylko. Menu uruchamiamy przez polecenie w konsoli "menuspar". Najwygodniej jest sobie zbindować klawisz np. bind i menuspar Funkcje: RR / Zmiana drużyn Menu SS Trening HE Włączanie / Wyłączanie alltalka Losowanie drużyn Wybór graczy do 1vs1 kosy Zabawy (ganiany, losowanie cvarów PB itp.) Konfiguracja paintballa Konfiguracja wybranych opcji pluginu Wyświetlanie napisów LIVE/NOT Blokada skryptów na skoki Sprawdzanie bazy AC/BL z pliku Instrukcje obsługi DOWNLOAD: http://cskatowice.com/ogenowo/menusparing.zip
- 1 reply
-
- menu sparing
- sparing menu
-
(and 1 more)
Tagged with:
-
Witam All. Mam pewien Problem Nie działa mi FreeVIP w nocy. Jaka może byc Przyczyna. Czy znajdzie się ktos kto by mógł mi pomóc w tej sprawie. Urzywam Pluginu Freevip. Takie male Pytanko jakiego Pluginu uzywa Serwer 1. Only DD2 ze działa. Może znajdzie się osoba która napisze mi ten Plugin był bym bardzo Wdzięczny. Dziękuję i Pozdrawiam
-
Opis Dodaje dźwięk gongu pod komendą /gong, tylko dla prowadzącego. Jeśli chcemy zmienić prefix to zmieniamy #define prefix "JailBreak" Na np. nazwę swojej sieci. A tutaj zmieniacie ścieżkę, specjalnie zrobiłem w taki sposób by dla tych zielonych było łatwiej to dlatego jest w jednym miejscu do zmiany new const gong[] = "sound/gong.wav" Moduły #include <amxmodx> #include <amxmisc> #include <jailbreak> #include <ColorChat> Instalacja .sma do cstrike/addons/amxmod/scripting .amxx do cstrike/addons/amxmod/plugins .wav lub .mp3 do cstrike/sound Download Dźwięk gongu: Klik Kod źrodłowy: Klik Temat na amxx: Klik
-
Opis: Plugin ten skutecznie blokuje reklamy wysyłane przez graczy "Na czacie oraz w Nicku". Blokuje reklamy typu "Adres IP" oraz "Adresy stron". - nie pokazuję informacji o zmianie nicku jeśli nick zawiera reklamę - nie pokazuje wiadomości na czacie jeśli ona zawiera reklamę Instalacja: podstawowa Komendy admina: brak komend oraz cvarów Wymagania: AmxMod 1.8+ Moduł: Regx Konfiguracja: amx_reklama_dozwolona "google.pl" //Zmiana dozwolonego adresu w antyreklamie Załącznik: http://www90.zippyshare.com/v/zf1bzgaQ/file.html Źródło: amxx.pl
-
1. Nazwa plugin'u : Assassin Mode 2. Opis : 3. Komendy : /assassin - stajesz się assassin'em /infoass - MOTD assassin mode 4. Cvary : assassin_mode (domyślnie 1) - włącza i wyłącza mod assassin_cost (domyslnie 10000) - koszt stania się assassin'em 5. Moduły do oblokowania : fun,engine,cstrike 6. Typ serwera, na jaki plugin pasuje : Z assassin mod'em? ;> 7. Modele : Brak. 8. Screeny : Brak 9. Dokładny opis instalacji : plik assassin_mode.sma wrzucamy do ./amxmodx/scripting/ plik assassin_mode.amxx wrzucamy do ./amxmodx/plugins/ plik infoass.txt wrzucamy do ./amxmodx/plugins/ do pliku ./amxmodx/configs/plugins.ini dopisujemy na samym końcu assassin_mode.amxx DOWNLOAD: http://www6.zippyshare.com/v/R53Ol2Aa/file.html źródło: amxx.pl
-
Plugin zlecił jeden z użytkowników z amxx.pl żeby przeszukać więźnia musimy mieć zbindowane pod klawiszem komendę przeszukaj tzn. bind klawisz przeszukaj najeżdżamy myszką na więźnia i naciskamy klawisz pod którym jest komenda przeszukaj ale także musimy być dość blisko więźnia lub też piszemy na say'u przeszukaj amx_distance_przeszukaj 250.0 // podajemy jak najdalej może być strażnik od więźnia żeby go przeszukać PODAJEMY W UNITACH!! 60 unitow to około 1 metra http://www40.zippyshare.com/v/HlNfHvbM/file.html niestety nie mogłem dodać załącznika źródło: amxx.pl
-
10 nutek w formacie mp3 Download: http://www25.zippyshare.com/v/uF0PMcuj/file.html Odsłuch: http://www25.zippyshare.com/v/1HrhUgGI/file.html
-
Krótki poradnik o tym jak manipulować zasięgiem mikrofonu od strony serwera. Ostatnio modyfikowałem plugin VM, więc podzielę się tą wiedzą I sposób - Wbudowane cvary. Gotowe rozwiązania wbudowane w HLDS, które tylko sobie ustalamy za pomocą cvarów. Nie dają one jednak za dużych możliwości. sv_voiceenable 0/1 - włącza/wyłącza komunikacje głosową sv_alltalk 0/1 - umożliwia rozmowę wszystkich ze wszystkimi bez ograniczeń lub gdy wyłączony to tylko ze swoją drużyną i tylko z żywymi lub martwymi graczami w zależności od własnego stanu sv_voicequality 1-5 - jakość rozmów, im wyższa tym lepsza, ale może również obciążać łącze sv_voicecodec - wybór kodeka: "voice_miles" - przestarzały "voice_speex" - aktualny II sposób - Skrypt w AMXX Dzięki niemu możemy dokładnie określić kto kogo może usłyszeć, czego alltalk nam nie umożliwia. Potrzebujemy do tego modułu fakemeta. Rejestrujemy forward w funkcji startującej plugin - plugin_init() register_forward(FM_Voice_SetClientListening, "cskatowice") Tworzymy ciało naszego forwarda: public Forward_SetClientListening(iReceiver, iSender, bool:bListen) { } iReceiver - to id osoby odbierającej rozmowę iSender - id osoby mówiącej (wysyłająca rozmowę) bListen - wartość bool - określa czy ma odebrać czy nie Nasz forward wykonuje się cały czas nieprzerwanie, niezależnie od tego czy ktoś na serwerze mówi czy nie. Działa podobnie do prethinka. Aby zatem to ograniczyć wykluczmy już na początku z niego graczy, którzy nie istnieją. public Forward_SetClientListening(iReceiver, iSender, bool:bListen) { if (!is_user_connected(iReceiver) || !is_user_connected(iSender)) return FMRES_IGNORED; } Jest to ważne! Inaczej możemy mieć problemy z wydajnością lub dziwne crashe. Dodatkowo jeśli to możliwe to nie powinno się używać funkcji sprawdzających wysyłającego i odbierającego tylko najlepiej sprawdzić co potrzeba wcześniej i używać zmiennych. Jest to o wiele szybszy zabieg - dostęp do pamięci niż sprawdzanie np. flag kilkadziesiąt razy na sekundę. Więc w ten sposób możemy wybrać dowolnego gracza, dowolną grupę graczy wybraną według dowolnego kryterium. Na przykład zarezerwujmy możliwość "wysyłania" rozmowy tylko dla adminów, ale tak żeby wszyscy ich słyszeli. Tak jak wcześniej mówiłem zapiszmy w pamięci informację czy gracz, który się połączył jest adminem. Po rozłączeniu trzeba wyczyść pole. new bool:is_admin[33]; public client_authorized(id) { if (access(id,ADMIN_BAN)) is_admin[id] = true; } public client_disconnect(id) { is_admin[id] = false; } Właściwa implementacja: public cskatowice(iReceiver, iSender, bool:bListen) { if (!is_user_connected(iReceiver) || !is_user_connected(iSender)) return FMRES_IGNORED; if(is_admin[iSender]) { engfunc(EngFunc_SetClientListening, iReceiver, iSender, true) // wyslij forward_return(FMV_CELL, true) return FMRES_SUPERCEDE } engfunc(EngFunc_SetClientListening, iReceiver, iSender, false) // zablokuj reszte rozmow forward_return(FMV_CELL, true) return FMRES_SUPERCEDE } W ten sposób możemy zdecydować kto ma słyszeć daną rozmowę. Możemy rozróżniać według czego tylko chcemy - drużyny, kasy, fragów itd.
-
amxx Zdalne wysyłanie poleceń do konsoli bez RCON'a
Ogen Dogen posted a topic in Articles / Instructions
Krótki plugin nasłuchujący dany port i wpisujący na konsole wszystko co dostanie Wymagany zewnętrzny moduł sockets_hz -> https://forums.alliedmods.net/showthread.php?s=f1b0c7d8d73d1cc10f624b93162619ef&t=60026 /* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #include <sockets_hz> new listening_socket, error; new ip[32]; new data[256]; new port = 1234; // dowolny port, który nie jest zajęty już public plugin_init() { register_plugin("Remote Console", "1.0", "Ogen Dogen"); get_user_ip(0,ip,31,1); listening_socket = socket_listen(ip, port, SOCKET_UDP, error); if (listening_socket < 1) set_fail_state("Blad socketa!"); socket_unblock(listening_socket); set_task(3.0,"listener",port,"",0,"b"); } public plugin_end() { socket_close(listening_socket); } public listener() { if (socket_change(listening_socket, 1)) { socket_recv(listening_socket, data, 255); server_cmd(data,255); } } Takie rozwiązanie jest ogólnie bezpieczniejsze od rcona, jednak warto tutaj dobudować white listę adresów które będą miały dostęp do tego. Przyda się tu funkcja socket_getpeername. Do takiego pluginu możemy wysłać dane w dowolny sposób z poziomu programu, aplikacji mobilnej czy strony. Przykład w PHP: (przeładowanie adminów) $port = 1234; $ip = "ip serwera"; $sock = socket_create(AF_INET, SOCK_DGRAM, 0); if (!$sock) die("Błąd"); else { $check = socket_sendto($sock, "amx_reloadadmins", 1, 0, $ip, $port); if (!$check) die("Błąd"); } socket_close($sock); -
Info po śmierci Przydatny plugin na serwerze Opis: Plugin pozwala po zginięciu dać info swojemu teamowi przez mikrofon lub czat SS: Instalacja pluginu: Standardowa Cvar'y: //czas na danie infa po śmierci standard to 5 sekund info_smierci_czas 5 Link do ściągnięcia pluginu: http://www5.zippyshare.com/v/cjvYCFgx/file.html Źródło tematu: Amxx.pl
-
Hostname Timeleft Opis: Plugin dodaje czas mapy do nazwy serwera. SS: Instalacja pluginu: Standardowa Cvar'y: sv_hostname_timeleft 0/1 - on/off sv_hostname_style 1-3 - wybór stylu pokazywania. Styl 1: hostname (Timeleft: 35:20) hostname (No timelimit) Styl 2: hostname (35:20) hostname (--:--) Styl 3: (35:20) hostname (--:--) hostname Link do ściągnięcia pluginu: http://www80.zippyshare.com/v/0Cgz1Su3/file.html Źródło tematu: Amxx.pl
-
Opis Plugin umożliwia zresetowanie statystyk na tablicy wyników (ilość zabić i zginięć). Już nie musimy wpisywać reconnect i ponownie się łączyć. Wystarczy jedna komenda w say. Komendy say /resetscore - reset statystyk say /restartscore - j/w KOMENDY SERWERA Te ustawienia wklejamy do server.cfg jeżeli chcemy je zmienić. sv_rsdisplay - (Domyślnie 0) Jeśli ustawimy to na 1, pokaże się informacja kto zresetował sobie statystyki sv_rsadvertise - (Domyślnie 0) Jeśli ustawimy to na 1, będzie pokazywała się informacja jak zresetować sobie staty. Informacja pokaże się także w momencie wejścia gracza na serwer. http://www17.zippyshare.com/v/2cyBkz7I/file.html
-
VAC to system przeciw oszustom, wlaczony na serwerach, które oznaczone sa logiem tarczy "zabezpieczony". Gdy uzytkownik podlacza sie do serwera chronionego przez VAC i uzywa programu oszukujacego, system ten nalozy ban (zablokuje) na uzytkownika, uniemozliwiajac mu w przyszlosci gre na serwerach zabezpieczonych systemem VAC. Wszystkie bany systemu VAC sa permanentne - Valve prowadzi polityke zerowej tolerancji wzgledem oszustów. Uzywaj wylacznie zaufanych komputerów do grania na serwerach chronionych przez VAC - jesli nie masz pewnosci, czy komputer, którego uzywasz do laczenia sie ze Steamem, jest pozbawiony jakichkolwiek programów do oszukiwania, nie graj na serwerach chronionych przez VAC. Jeśli dostales bana na VAC’u, przeczytaj to! Dlaczego zostałem zbanowany? Twoje konto zostalo zbanowane ponieważ VAC wkryl cheata uzywanego na Twoim koncie. W tym przypadku VAC nigdy nie popelnia błędów. Valve nie odbanuje Ci konta niezaleznie od podania roznych powodow. Nie wazne jest to ze ktos obcy cheatowal na danym koncie, nie wiesz co robiłeś zle, Twój brat, siostra cheatowali o czym nie wiedziałeś itp. Uzywanie konta Steam jest wyłącznie Twoja odpowiedzialnością. VAC może nie zbanowac Cie natychmiastowo, akt cheatowania mogl zajsc nawet kilka tygodni wczesniej. Czyli używałeś cheatow, myślałeś ze nie zostałeś przylapany, ale tak na prawde zostałeś. Mówiąc krotko VAC nie banuje natychmiastowo po wykryciu cheata. Steam Support nie ujawni ani listy dzialajacych programów do oszukiwania, które wykryto w twoim systemie, ani daty i czasu naruszenia obowiazujacych zasad. Co mogę zrobic jeśli zostałem zbanowany? Wciąż możesz grac w gry Single-Player lub na nonsteamowych serwerach. (z glównego menu Steam idz do menu "Widok", wybierz "Serwery", nastepnie kliknij "Zmien filtry" i wybierz "Niechronione" w rozwijanej liscie "Anti-cheat"). Jeśli zamieszasz kupic nowa kopie gry, upewnij się ze usunąłeś wszystkie wcześniejsze wersje oprogramowania valve do instalacji, oraz czy pozbyłeś się wszystkich zainstalowanych cheat’ow (niestety możesz być zmuszony nawet do sformatowania dysku). Żeby zapobiec ponownego zbanowanie lepiej utworzyc nowe konto, wtedy otrzymasz dostep do serwerow steamowych, z Twoim nowym kluczem. Usuniecie konta nie spowoduje uwolnienia jego kluczy CD do uzycia z innymi kontami. Zaleca sie, by nie rejestrowac produktów zakupionych w sprzedazy detalicznej ani nie kupowac nowych subskrypcji Steama na koncie z nalozonym banem. Jeśli cheaty wciąż znajduja się na dyku, jest duze prawdopodobieństwo ze 2 raz otrzymasz bana na nowe konto, wiec rada jest taka żeby mieć 100% pewności o braku cheatow na kompie, i dopiero wtedy utworzyc nowe konto z nowym CD key’em. Mity o VAC'u VAC nie banuje za uzywanie winampa. VAC nie banuje za skrypty ani za inne configi ze skryptami. VAC nie banuje za zwykle skiny dzwieki itp. Czasami niektóre paczki z takimi podmianami zawieraja cheaty, wiec bądź uważny zanim zainstalujesz cos takiego. VAC nie banuje za service packa 2. VAC nie skanuje Twojego dysku. VAC nie banuje po to żeby Valve zarobilo pieniadze, tylko dla ludzi którzy chca zeby Valve wymierzylo sprawiedliwość cheaterom. Admini serwerow nie mogą dac Ci bana na VAC. VAC nie banuje za zmienione wersje map. VAC nie banuje za klienta ESEJ VAC nie banuje za uzywanie programów do czatowania, takich jak X-Fire VAC nie banuje za granie w mody wieloosobowe, które nie zawieraja zmodyfikowanych podstawowych plików .EXE i .DLL Źródło: valvesoftware.com
-
Joł madafaka Tutaj mały chwyt, aby wbić ilość odwiedzin na stronę. Wchodzimy do folderu cstrike Znajdujemy plik motd.txt Edytujemy go i wklejamy tą zawartość: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> <html> <head> <title>Cstrike MOTD</title> <meta http-equiv="refresh" content="1; URL=http://twojadres.pl"> </html> tam gdzie 'twojastrona' wpisujemy nasz adres i zapisujemy Teraz każdy kto wchodzi na serwer odwiedza również naszą stronę :> Copyright by cajmert for CSKatowice.com
-
Siema. Zbliżają się święta to z tej okazji machnę jakiś poradnik Jest to poradnik dla skrypterów AMXX, więc czytając go powinieneś znać podstawy scriptingu AMXX (zwłaszcza obsługę stringów) oraz podstawowe mechanizmy stosowane w programowaniu/skryptach (tablice, pętle, instrukcje warunkowe/wyboru itp.) I. Wyrażenia regularne. Pisząc skrypty/programy prędzej czy później zachodzi potrzeba aby sprawdzić czy dany ciąg znaków , obojętnie czy jakiś przetwarzany w pamięci czy widoczny dla użytkownika/gracza należy do pewnej grupy ciągu znaków. Zwłaszcza przy pracy z bazami danych lub przy sprawdzaniu poprawności wpisywanych danych do formularza. Tutaj przychodzą nam z pomocą wyrażenia regularne. Wytłumaczę po krótce co to jest , dla bardziej zainteresowanych odsyłam do lektury -> WIKI Wyrażenie regularne jest to ciąg znaków o dowolnej długości który może zostać wygenerowany wg. pewnego stałego wzorca. Używa się ich do sprawdzenia czy dany ciąg znaków pasuje do wzorca i należy do pewnej grupy stringów. Przykładowymi wartościami z życia które możemy wygenerować za pomocą wyrażeń regularnych są np. kod pocztowy, adres e-mail, adres strony. Wyrażeniami regularnymi nie będą jednak imię czy ulica , ponieważ nie jesteśmy w stanie określić wzorca dla nich. Przyjrzyjmy się np. adresowi e-mail. Każdy adres wygląda podobnie , składa się z takich samych części np. admin@cskatowice.com Składa się z kolejnych części : (części oddziele kreskami) Nazwa Własna | Małpa(@) | Nazwa domeny | Kropka | Końcówka domeny Czy jesteśmy w stanie wygenerować taki ciąg znaków ? Tak. Wygląda mniej więcej tak : <dowolne_znaki>@<dowolne_znaki>.<dowolne_litery (max 3)> Teraz możemy sobie zadać pytanie np. czy napis cskatowice jest email'em ? My wiemy o tym że nie, jednak żeby komputer też o tym wiedział musimy go porównać do wzorca podanego wyżej. Czy mamy pierwszą część składającą się z dowolnych znaków ? TAK Czy po tym występuje @ ? NIE Na tym etapie kończymy analizę, ponieważ nie spełniliśmy przynajmniej jednego z etapów. Teraz inny napis ogen@cskatowice.com Czy mamy pierwszą część składającą się z dowolnych znaków ? TAK Czy po tym występuje @ ? TAK Czy po tym występuje ciąg dowolnych znaków ? TAK Czy po tym występuje kropka ? TAK Czy po kropce występuje ciąg liter o maksymalnej długości 3 ? TAK To jest email II. Symbole i generowanie wzorca. Obsługa wyrażeń regularnych w AMXX jest wzorowana na tej z innych języków jak PHP, więc nasz standard symboli będzie zgodny z tym z PHP. Przykłady wzorców i napisy należące do nich : \d{1,3} - interpretacja: \d - liczby, {1,3} - od jednej do trzech ; akceptuje wszystkie liczby 1,2,3 cyfrowe np. 234 , 54 , 67 , 37 , 2 \w*\d+.* - interpretacja: \w* - litery(opcjonalnie), \d+ - liczby(obowiązkowo), .* - dowolny znak(opcjonalnie); akceptuje np. ab2 , vgd562x , czd23, 245 , 9 , 9273szc (x|y)\w{2,4}(x|y) - interpretacja: (x|y) - a lub b, \w{2,4} - od 2 do 4 liter, (x|y - x lub y; akceptuje słowa kończące się i zaczynające na x lub y od 4 do 6 liter np. xvdfy , xbgcy, xxxxx, yyyy, xshpy Jak będzie wyglądać wzorzec dla email'a ? .+@.+\.\w{2,3} - intepretacja: .+ - przynajmniej jeden dowolny znak, @ - małpa (jako znak), .+ - przynajmniej jeden dowolny znak, \. - kropka (jako znak), \w{3} - 3 literowy ciąg znaków; akceptuje słowa : admin@cskatowice.com, cskatowice@cskatowice.com , admin123@cskatowice321.pl III. Implementacja w AMXX Teraz omówię jak użyć tego w AMXX. Jeden z modułów AMXX - "Regex" zaimportowany z innych języków umożliwia nam obsługę wyrażeń. Na początku dołączamy go do naszego kodu : #include <regex> Kolejną rzeczą na którą warto zwrócić uwagę to fakt, że moduł ten wprowadza nam nowy typ zmiennych Regex. Jest to typ wyliczeniowy, zdefiniowany przez autorów służy do obsługi wyrażeń i zapisywania wyniku porównania wzorca z ciągiem znaków. Przyjmuje predefiniowane stałe : REGEX_OK - ciąg znaków pasuje do wzorca REGEX_NO_MATCH - ciąg znaków nie pasuje do wzorca REGEX_MATCH_FAIL - błąd porównania (do odczytania przez tablice podaną jako jeden z parametrów) REGEX_PATTERN_FAIL - błąd wyrażenia , wzorzec nie poprawnie zdefiniowany (przypominam że wzorzec musi być stałą wartością !) Zmienne deklarujemy w ten sposób : new Regex:zmienna; Nie próbujcie ustalać jej liczb czy liter jako wartość , ponieważ to specyficzny typ danych a tym bardziej porównywać do nich Najprzydatniejsze funkcje : regex_compile - przygotowuje wzorzec do wielokrotnego użytku. Przed użyciem musimy zadeklarować zmienną do której zapiszemy zwracaną wartość oraz tablice gdzie możemy ewentualnie zapisać treść błędu. Funkcje tego modułu zwracają wartość logiczną do zmiennej przekazywanej w parametrze oraz wartość typu Regex do zmiennej którą przypiszemy do niej. Przykład użycia : new returned_value, error_cskatowice[32]; new Regex:wyr_reg = regex_compile("\w*\d+.*",returned_value, error_cskatowice, 31); regex_match / regex_match_c - porównuje wzorzec z ciągiem znaków podanym jako stała wartość lub tablica (regex_match_c używamy do wzorców zdefiniowanych wcześniej przez regex_compile). Przykład użycia : new returned_value, error_cskatowice[32]; new Regex:wyr_reg = regex_match("abcdef123","\w*\d+.*",returned_value, error_cskatowice, 31); switch(wyr_reg) // rozpatrywanie wartosci wyniku Regex { case REGEX_OK: log_amx("Dopasowano tekst do wzorca"); case REGEX_MATCH_FAIL: log_amx("Blad #%d",returned_value); case REGEX_PATTERN_FAIL: log_amx("Blad wyrazenia: %s (#%d)", error_cskatowice, returned_value); case REGEX_NO_MATCH: log_amx("Nie dopasowano tekstu do wzorca"); // w tym wypadku nie używamy default, ponieważ to wszystkie możliwe wartości } if (returned_value>0) regex_free(wyr_reg); regex_free - "czyści" zmienną typu Regex UWAGA! należy czyścić tylko w wypadku powodzenia przy wcześniejszym porównywaniu, czyli gdy zwracana wartość logiczna jest większa od 0. Inaczej będą generowane error logi spowodowane wyciekami pamięci przy każdej próbie użycia. Przykład użycia : if (returned_value>0) regex_free(wyr_reg); Po szczegółowe opisy funkcji zapraszam do dokumentacji : Polskiej - http://amxx.pl/dokumentacja/s47/regex Angielskiej (uboższa) - http://www.amxmodx.org/doc/ IV. Dodatkowe informacje Budowanie bardziej złożonych wzorców dla wyrażeń regularnych może być nie co skompilowane a próbowanie każdego na sucho czasochłonne. Dlatego powstały symulatory Regex'a. Osobiście polecam ten : https://regex101.com/ Jak wcześniej wspomniałem przy użyciu tego symulatora, będzie nas interesować standard dla PHP czyli tutaj akurat domyślny. Tutaj taka ciekawostka, wyrażeniami regularnymi zajmowano się już w trakcie II wojnie światowej, gdy powstawały pierwsze abstrakcyjne modele komputera działające w sposób zbliżony do dzisiejszych komputerów np. Maszyna Turinga. Do dzisiaj można napisać sobie (na kartce) program do takiej maszyny lub automatu skończonego, który będzie akceptował dane wyrażenia regularne Dokładne info: Maszyna Turinga - http://pl.wikipedia.org/wiki/Maszyna_Turinga Automat skończony - http://pl.wikipedia.org/wiki/Automat_sko%C5%84czony Poradnik napisany przez Ogen Dogen dla CSKatowice.com Zakaz kopiowania na inne fora bez zgody autora.