Jest nieaktywny, ponieważ szukamy Opiekuna serwera, który by chciał się nim zająć
Czyli jelenia który opłaci wasz serwer.
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 Engi w 16.12.2022 13:39
Napisane przez DarkGL w 27.01.2021 23:09
Napisane przez Scorpion Flail w 26.01.2020 21:21
Od siebie powiem, że od listopada testuję tę konfigurację na pukawce z najnowszym buildem rehltv:
rate 100000 updaterate 100
Wystarczy dopisać to do pliku hltv.cfg.
Wnioski: na pewno upłynniło to strzelanie full auto na demkach. Nie jest idealnie, ale poprawa znacząca. Rozmiar demek na serwerze Only DD2 przy ~30 graczach wzrósł do 160-200 MB.
Napisane przez Rivit w 09.09.2019 20:44
Jest to modyfikacja tego pluginu: https://amxx.pl/topi...buyzone-respie/
Z tym, że plugin ma możliwośc ustawienia stref, czyli nie jesteśmy ograniczeni przez buyzone, ale możemy sobie rozciągnąć strefy jak nam się podoba.
Z góry dziękuję autorowi Toldi za jego kod, który dostosowałem na potrzeby moich zmian. Dużo zostało przerobione.
// Ile sekund po starcie rundy (koniec zamrozenia) ma sprawdzac czy gracz jest na respawnie. respawn_guard_start "30.0" // Co ile sekund ma sprawdzac czy gracz znajduje się na respawnie respawn_guard_interval "3.0" // Po ilu warnach ma zaczac karac gracza respawn_guard_max_warns "3" // Typ kary // 0 - Slapowanie gracza (zabiera hp + rzuca graczem) // 1 - Zabiera pieniadze // 2 - Zabija // 3 - Kickuje gracza respawn_guard_penalty_type "0" // Ile hp ma zabierac graczowi w przypadku gdy Penatly = 0 (nie radzę dawac wiecej niz 10) respawn_guard_hp "20" // Ile pieniedzy $ ma zabrac graczowi gdy Penatly = 1 respawn_guard_money "2000" // Czy admini tez maja byc sprawdzani // 0 - Tak // 1 - Nie respawn_guard_admin_immunity "0"
Plugin posiada możliwość ustawiania własnej strefy spawnu.
Menu kreatora stref mamy pod komendą: /strefy , a także pod klawiszami Z,X,C (radio1,2,3).
Menu jest na flage: ADMIN_RCON czyli flaga "l" (l jak lama)
https://amxx.pl/topi...-pluginów-amxx/
Jeśli chcesz użyć gotowej strefy spawnu to:
plik .ini wrzucamy do folderu configs/respawn_zone/ (jeśli nie istnieje folder to trzeba stworzyć)
tu jest pokazowa strefa, którą zrobiłem (jesli ktoś chce zrobić lepsze lub dla innych map to proszę wrzucić do tematu a ja dodam tu):
Strefa sięga tak:
1.png 1,32 MB 28 Ilość pobrań
2.png 1,36 MB 25 Ilość pobrań
Jeśli nie chcesz używać gotowej strefy użyj kreatora wspomnianego wcześniej.
05.02.2020 - Poprawa bugu z slapowaniem po killu, ogólna poprawki, zmiana cvarów, optymalizacja paru rzeczy, usunięcie pliku .cfg
11.02.2020 - Drobne zmiany i poprawki, cvary odświeżane co runde
Napisane przez Robiin w 15.08.2019 21:15
Na wstępnie chciałbym zaznaczyć, że próbując zrozumieć tablice musimy mieć podstawowe (choć w pełni opanowane) informacje co do zwyczajnych zmiennych.
Zakładam również, że wiemy jak wyglądają tablice oraz znamy zasadę liczenia od 0.
Po przeczytaniu tego przyjdzie czas na poprawną naukę - to tylko wstęp, do którego można wracać i uzupełniać wiedzę.
Czym są tablice?
Tablice to nic innego jak zbiór wielu wartości w jednej zmiennej. Pozwalają nam na przechowywanie wielu danych z mniejszą ilością kodu, a co najważniejsze - pozwalają nam na zapis stringów (a właściwie napisów, nie stringów, bo to nie to samo [przynajmniej w tym przypadku]).
Żeby w pełni zrozumieć zasadę tablic, trzeba uciec się do zrozumienia tego, jak zbudowany jest język, w którym piszemy.
AMXX (lub też pawn) zmienne przechowuje w czymś, co nazywamy komórką ('cell', z j. ang.), w której przetrzymuje tylko i wyłącznie jedną wartość.
Pojęcia
Jak działają tablice?
Sprawa jest bardzo prosta, choć często wyolbrzymiana do tego stopnia, że niejeden sobie odpuścił i zrobił tak:
Zwykła zmienna będzie miała możliwość przechowania tylko jednej wartości w ten sposób:
Zmienna o nazwie 'var' przechowująca wartość '5'.
new var = 5;
Tablice dają nam możliwość przechowania więcej niż jednej wartości, w ten sposób:
Tablica o nazwie 'arr' przechowująca wartości '5' i '6' na indeksach '0' i '1'.
new arr[2]; // Inicjacja tablicy o rozmiarze 2. arr[0] = 5; // Przypisywanie wartosci '5' do indeksu '0' tablicy 'arr'. arr[1] = 6; // Przypisywanie wartosci '6' do indeksu '1' tablicy 'arr'.
Możemy ich używać np. do przechowywania informacji o graczach. W tym celu musimy stworzyć tablicę o wielkości o 1 większej niż ilość graczy (domyślnie 32).
Stwórzmy trzy tablice, które będą przechowywać:
new Float:userMoney[33];
new userLevel[33];
new bool:isVip[33];
Dlaczego rozmiar to 33:
Przypuśćmy, że na serwerze mamy obecnych trzech graczy. Oto ich dane dla poszczególnych tablic:
// Gracz o indeksie 1: userMoney[index] = 7.15; userLevel[index] = 10; isVip[index] = false; // Gracz o indeksie 2: userMoney[index] = 4.19; userLevel[index] = 3; isVip[index] = true; // Gracz o indeksie 3: userMoney[index] = 9.18; userLevel[index] = 9; isVip[index] = true;
Jak wygląda to od strony tablicy:
userMoney[0] = 0.0; userMoney[1] = 7.15; userMoney[2] = 4.19; userMoney[3] = 9.18; userLevel[0] = 0; userLevel[1] = 10; userLevel[2] = 3; userLevel[3] = 9; isVip[0] = false; isVip[1] = false; isVip[2] = true; isVip[3] = true;
Dlaczego wszystkie pola z indeksem '0' są równe zero? Dlatego, że nigdy ich nie ustawiliśmy. Gracze na serwerze mają indeksy 1, 2 oraz 3, tak więc tylko te indeksy tablicy będą zmienione.
Napisy
Sprawa z napisami nie jest skomplikowana. Oczywistym powinno już być, że do przechowania napisu musimy mieć tablicę.
Przykładowym napisem będzie "amxx" - chcemy go zapisać do tablicy.
Tworzenie tablicy o wielkości 10, żeby na pewno zmieścić nasz napis:
new text[10];
Dodawanie napisu:
formatex(text, charsmax(text), "amxx");
Gotowe - ale co tak naprawdę się stało; do tablicy 'text' przypisane zostały litery, więc tablica teraz wygląda tak:
text[0] = 'a'; text[1] = 'm'; text[2] = 'x'; text[3] = 'x';
Dostęp do konkretnych wartości
Aby dostać się do konkretnych wartości, jakie przechowuje tablica musimy mieć indeks - numer 'pola' w tablicy, z którego chcemy wyciągnąć dane.
W przypadku graczy nie jest to dużym problemem - wystarczy podać indeks gracza, a w rezultacie otrzymamy jego dane (dlatego, że byliśmy mądrzejsi i zrobiliśmy tablicę o rozmiarze 33, a nie 32).
Jeśli chodzi o pozostałe przypadki, tutaj sprawa się komplikuje - choć nieznacznie.
Wystarczy nam tylko trzeźwe myślenie i trochę wyobraźni.
Aby wyświetlić napis, musimy do funkcji wyświetlającej podać jako argument tę tablicę, w której przechowywany jest dany napis, na którym nam zależy - w tym przypadku nie musimy podawać indeksu, bo nie chcemy pobierać jednej wartości, ale każdą komórkę. (nie chcemy wyświetlać jednej litery, tylko cały napis)
W amxxie nie możemy zwrócić napisu, bo jest to tablica (a zwrócić możemy tylko jedną wartość). Obejściem tego problemu jest przekazywanie tablicy.
Sposób zły (zwracający tylko jedną wartość, w przypadku napisu tylko jedną literę):
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" public plugin_init() { register_plugin("x", "v0.1", AUTHOR); new text[64]; text = getSomeMessage(); } getSomeMessage() { new arr[3]; formatex(arr, charsmax(arr), "abc"); return arr; }
Sposób dobry:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" public plugin_init() { register_plugin("x", "v0.1", AUTHOR); new text[64]; getSomeMessage(text, charsmax(text)); } getSomeMessage(output[], outputSize) { formatex(output, outputSize, "abc"); }
Sedno - przykłady
Przechowywanie danych o statusie vip każego gracza z osobna:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" new bool:userVip[33]; public plugin_init() { register_plugin("x", "v0.1", AUTHOR); } public client_authorized(index) { if(get_user_flags(index) & ADMIN_LEVEL_H) { userVip[index] = true; } else { userVip[index] = false; } }
Wyświetlanie napisu "Informacja w konsoli serwera" w konsoli serwera:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" public plugin_init() { register_plugin("x", "v0.1", AUTHOR); new text[33]; formatex(text, charsmax(text), "Informacja w konsoli serwera"); log_amx(text); }
Zwiększanie kasy graczowi, który wpisze komendę (z ograniczeniem do jednego na mapę) [nie zwracać uwagi na sam fakt, że można to obejść reconnectując, to tylko przykład :) ]:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" new Float:userMoney[33], bool:usedCommand[33]; public plugin_init() { register_plugin("x", "v0.1", AUTHOR); register_clcmd("say /kasa", "addMoney"); } public addMoney(index) { if(usedCommand[index]) { client_print(index, print_chat, "Uzyles juz tej komendy!"); return; } userMoney[index] += 5.0; usedCommand[index] = true; }
Formatowanie tekstu "amxx" w funkcji:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" new text[64]; public plugin_init() { register_plugin("x", "v0.1", AUTHOR); formatText(text, charsmax(text)); } formatText(arr[], size) { formatex(arr, size, "amxx"); }
Poszczególne indeksy (dla zobrazowania tablicy):
new const cel_misji_dwa[][]= { //0 "Brak.", //1 "Zabij 10 razy CT z AK-47", //2 "Zabij 10 razy CT z Piesci", //3 "Zabij 10 razy CT z M4A1", //4 "Zabij 10 razy CT z HE", //5 "Zabij 10 razy CT z AWP", //6 "Zabij 15 osob z swojej druzyny z AK-47", //7 "Zabij 15 osob z swojej druzyny z M4A1", //8 "Zabij 15 osob z swojej druzyny z AWP", //9 "Zabij 10 osob w glowe", //10 "Zabij 20 osob w glowe", //11 "Zabij 30 osob w glowe", //12 "Zabij 20 razy CT z Piesci", //13 "Zabij 20 razy CT z AK-47", //14 "Zabij 20 razy CT z M4A1", //15 "Zabij CT 50 razy", //16 "Zabij CT 100 razy", //17 "Zabij CT 150 razy", //18 "Zabij 150 osob", //19 "Zabij 250 osob", //20 "Zabij 400 osob" };
Wyobrażenie tablicy kluczem do jej zarządzania
Jeśli będziemy w stanie wyobrazić sobie jak wygląda tablica, z łatwością będziemy mogli nią zarządzać.
Tablica o rozmiarze 4, która przechowuje dane 3 graczy:
new userData[4]; userData[0] = 0; userData[1] = 100; userData[2] = 25; userData[3] = 7;
Żeby dostać się do poszczególnych wartości, wystarczy, że jako indeks pola użyjemy indeksu gracza:
userData[index];
Jeśli jesteśmy sami na serwerze, nasz indeks będzie (prawdopodobnie) 1, tak więc operacja pokazana powyżej zwróci 100.
Lektura wyczerpująca, niedokładna i pewnie nudna - dlatego jest to tylko wstęp, a o właściwe korzystanie z tablic należy zadbać samemu. Zadawanie pytań na forum nie jest niczym złym, do tego też zachęcamy.
Napisane przez Robiin w 09.08.2019 15:46
Poprzedni tutorial napisany w tym temacie przez R3X był nieco pomieszany i moim zdaniem skupiał sie na niepotrzebnych elementach.
Czym są natywy?
Kluczowym elementem programowania jest API, którym w AMXXie są natywy.
Natywy to sposób komunikacji pomiędzy dwoma pluginami.
Pluginy podzielę na dwa typy:
Dzięki natywom możemy z pluginu źródłowego pobrać dane w pluginie docelowym lub je dowolnie modyfikować.
Przykładem idealnie odwzorowującym zasadę działania natywów jest exp mod.
Plugin exp moda może mieć w sobie zmienne pokroju
Co jeśli chcemy wiedzieć jaki poziom ma gracz, lub ile ma expa?
Nie ma najmniejszego problemu w pluginie exp moda - w końcu mamy zmienne userExp i userLevel, ale co jeśli chcemy wiedzieć ile gracz ma expa i potrzebujemy tych danych w innym pluginie?
Z odpowiedzią przychodzą natywy - jak już wcześniej wspomniałem, pozwalają nam na komunikacje między pluginami.
Jak wykorzystać natywy?
Mimo, że w tutorialu rexa wydawało się to bardzo skomplikowane, natywy są bardzo proste w swojej zasadzie działania.
Prosty przykład, jak pobrać jakąś wartość z innego pluginu:
Plugin źródłowy:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" new const jakasWartosc = 7; public plugin_init() { register_plugin("x", "v0.1", AUTHOR); } // Natywy musza byc rejestrowane w plugin_natives za pomocą register_native. public plugin_natives() { // Rejestracja natywu o nazwie "pobierzWartosc", który wykona funkcję "publicNatywuPobierzWartosc". register_native("pobierzWartosc", "publicNatywuPobierzWartosc"); } // Co się wykona, kiedy w innym pluginie zostanie użyte pobierzWartosc. public publicNatywuPobierzWartosc() { return jakasWartosc; }
Plugin docelowy:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" native pobierzWartosc(); public plugin_init() { register_plugin("x", "v0.1", AUTHOR); new wartosc = pobierzWartosc(); log_amx("Wartosc = %i", wartosc); // "Wartosc = 7" }
Pliki .inc
Pliki z roszerzeniem 'inc' to nic innego jak pliki tekstowe, które zawierają zbiór natywów (i nie tylko).
Jak wygląda plik .inc w pluginie dodającym nową walutę:
#if defined _moneySystem_included #endinput #endif #define _moneySystem_included native SetMoney(id, value); native GetMoney(id); native AddMoney(id, value);
Po krótce: pliki .inc są używane po to, żeby za każdym razem nie pisać 15 linijek z "native SetMoney(id, value);" i całą resztą natywów.
Na co pozwalają natywy
Dzięki nim wiemy jaki gracz ma poziom, exp, ile ma AP, JBPacków czy jaką ma klasę. To tylko powierzchowne przykłady, a natywy mogą zostać wykorzystane na tak wiele sposobów, że kiedy je lepiej poznamy, otwierają nam się drzwi na tak wiele opcji zaprogramowania pluginu, że ogranicza nas już tylko wyobraźnia.
Co dalej?
Jeśli dopiero nauczyłeś się czym są natywy - idź spróbuj sam. Oczywiście po przeczytaniu tego nie masz prawa zrozumieć wszystkiego ot tak, ale z drugiej strony nikt nie będzie Cię trzymał za rączkę.
Podrzucam parę tematów, z których można wyciągnąć informacje o tym, jak natywy zostały użyte w praktyce:
Po przeczytaniu różnych kodów nadejdzie czas na zapoznanie się z takimi rzeczami jak:
Do podglądu zostawiam również stronę dokumentacji: register_native.
Napisane przez K@MILOVVSKY w 27.06.2019 15:32
Napisane przez Robiin w 03.06.2019 09:14
Napisane przez DarkGL w 30.04.2019 13:17
MetaMod-R to zoptymalizowana wersja metamod wraz z zmianami z metamod-p działająca tylko na ReHLDS.
Projekt zawiera duza ilość optymalizacji i wyczyszczonego kodu. Głowna cześć została napisana przy pomocy kompilatora JIT.
MetaMod-R jest niekompatybilny z HLDS działa tylko na ReHLDS ( API 3.1+ ).
Lista supportowanych gier : https://github.com/t...Supported-games
Jak samemu skompilować kod: https://github.com/t...lling-metamod-r
Link do projektu https://github.com/t...modai/metamod-r
Wersja 1.3.0.128 do pobrania w załączniku
Napisane przez Robiin w 14.05.2019 19:49
Napisane przez O'Zone w 02.05.2019 13:10
Plugin typu all-in-one do zarządzania głosem graczy.
Posiada zunifikowane funkcjonalności:
// Baza danych vm_sql_host "127.0.0.1" // Host bazy danych vm_sql_user "user" // Uzytkownik bazy danych vm_sql_pass "password" // Haslo uzytkownika bazy danych vm_sql_db "database" // Nazwa bazy danych // Ustawienia vm_alive "0" // 0: Żywi członkowie drużyny j 1: Żywi gracze j 2: Wszyscy członkowie drużyny j 3: Wszyscy gracze (Domyślnie: 0) vm_dead "1" // 0: Martwi członkowie drużyny j 1: Martwi gracze j 2: Wszyscy członkowie drużyny j 3: Wszyscy gracze (Domyślnie: 1) vm_info_time "5" // Czas w sekundach na przekazanie informacji do swojej drużyny - 0 aby wyłączyć (Domyślnie: 5) vm_admin_mute_menu "1" // Menu admina dla blokowania głosu/czatu globalnie dla graczy - 0 aby wyłączyć (Domyślnie: 1) vm_player_mute_menu "1" // Menu gracza do samodzielnego blokowania głosu innych graczy - 0 aby wyłączyć (Domyślnie: 1) vm_admin_voice "1" // Komenda admina do mówienia do wszystkich graczy pomimo ustawień dead / alive - 0 aby wyłączyć (Domyślnie: 1) vm_admin_voice_override "1" // Nadpisz ustawienia graczy tak, aby nawet gracze z nieaktywnym dźwiękiem słyszeli admina - 0 aby wyłączyć (Domyślnie: 1) vm_admin_intervoice "1" // Prywatny czat adminów - 0 aby wyłączyć (Domyślnie: 1) vm_admin_listen "1" // Komenda admina do podsłuchiwania wszystkich graczy pomimo ustawień dead / alive - 0 aby wyłączyć (Domyślnie: 1)
/mute, /mutuj, /ucisz, /unmute, /odmutuj - menu gracza do mutowania / odmutowania innych graczy
amx_mute, amx_unmute, amx_mute_menu, amx_unmute_menu, amx_gag, amx_ungag - menu admina do mutowania / odmutowania graczy
/vm, /voice, /glos - wyświetla aktualne ustawienia głosu
+adminvoice - komenda głosu admina
+adminintervoice - komenda czatu adminów
+adminlisten - komenda admina do podsłuchiwania graczy
Mirror dostępny w AMXXLegacy.
Napisane przez Robiin w 09.03.2019 01:47
Napisane przez Sinner w 08.03.2019 13:30
Napisane przez DarkGL w 24.02.2019 02:35
httpx.amxx proxy_check.amxx
Napisane przez White w 18.02.2019 19:50