0 postów
0 reputacji
0 informacji o osobie
1 dzień od rejestracji
"nie drogo" -> "niedrogo"
Brak jakichkolwiek argumentów przemawiających za dobrą ofertą
Nie zajedziesz daleko tak szybko
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 Robiin
w 01.07.2018 14:21
Napisane przez GwynBleidD
w 26.08.2015 10:51
Napisane przez MaxioR
w 23.08.2015 13:03
Nie ma pewności że ten mod utrzyma serwer a inny nie, ja mam zwykły serwer only dd2 32 slotowy który sam na siebie zarabia z vipów
Podstawa do tego jest ilość graczy bez tego nic nie dostaniesz
Ps Wiem że osoby które od razu nastawiają się że serwer postawiany po to aby zarabiać na nim zazwyczaj tylko tracą
Napisane przez DarkGL
w 13.08.2015 13:09
Napisane przez Linux'
w 07.08.2015 18:47
Z powodu braku czasu na zajmowanie sie wlasnym serwerem oraz checi niesienia pomocy innym postanowilem opublikowac za darmo wpelni odwzorowany silnik starego coda z cs 1.6. Ogolna zasada jest taka sama, wszystko modyfikujemy w jednym notatniku co jest glowna zaleta tego coda. Wkrotce postaram sie zamiescic kilka poradnikow z dokladna informacja jak modyfikowac klasy, itemy itp itd. Poza tym mam jeszcze pare nowosci ktorych nie ma w silniku wiec tez planuje wrzucic .
- Silnik nie posiada cvarow, nigdy ich nie lubilem wiec nie wstawialem. Wszystkie zmiany wprowadza sie na poczatku w zmiennych.
- W silniku znajduja sie 24 klasy oraz 49 itemow i konto vip, nizej zalaczam opis.
- Za strzelenie przeciwnikowi w glowe odgrywany jest losowy dzwiek + dostajemy dodatkowy exp.
- Od 24 do 6 rano dostajemy doswiadczenie x2 za zabicie strzalem w glowe.
- Dostajemy dodatkowy exp za zabicie gracza.
- Dostajemy dodatkowy exp za podlozenie, rozbrojenie c4 i uratowanie zakladnika (rowniez przez druzyne).
- Dostajemy dodatkowe doswiadczenie za wygranie rundy (rowniez przez druzyne).
- W srodku znajduje sie gotowe CodMenu, Sklepik, NaprawaItemu i to czego tam wam jeszcze potrzeba.
- Nie trzeba bindowac zadnego klawisza komenda. By uzyc umiejetnosci klasy lub itemu nalezy nacisnac E (uzywa sie tylko tych wskazanych). CodMenu wlacza sie standardowo naciskajac klawisz F3.
- Za kazde 10Lv dostajemy punkt ktory mozemy rozdac do inteligencji, zdrowia, obrazen, wytrzymalosci lub kondycji. Ilosc punktow za poziom oczywiscie mozemy zmienic wedle gustu.
Standardowa.
- Katalog z dzwiekami silnika nalezy wrzucic do sound/.
- By podlaczyc baze mysql pod zapis nalezy dodac do configs/databases.cfg ponizsze dane i uzupelnic (wersja >= 0.6).
"Databases" { "codmod_lvl_sql" { "driver" "mysql" "host" "" "database" "" "user" "" "pass" "" } }
Opis klas:
new String:nazwy_klas[][] = { "Brak", // 0 "Snajper", // 1 "Komandos", // 2 "Obronca", // 3 "Medyk", // 4 "Wsparcie Ogniowe", // 5 "Saper", // 6 "Rusher", // 7 "Kangur", // 8 "Admiral", // 9 "Rebeliant", // 10 "Szturmowiec", // 11 "Lekki Zolnierz", // 12 "Terrorysta [Od 500Lv]", // 13 "Kamikadze [Od 1000Lv]", // 14 "Thief [Od 1500Lv]", // 15 "Strzelec [Od 2000Lv]", // 16 "Partyzant [Od 2500Lv]", // 17 "DGLMaster [Od 3000Lv]", // 18 "Terminator [Od 3500Lv]", // 19 "Szpieg [Od 4000Lv]", // 20 "Mauser [Od 4500Lv]", // 21 "Scouter [Od 5000Lv]", // 22 "Szturmen [Od 6000Lv]", // 23 "Rambo [Od 7000Lv]" // 24 }; new String:opisy_klas[][] = { "Brak", // 0 "Zadaje obrazenia z awp +int. Posiada 120hp, 110% biegu, 100 wytrzymalosci", // 1 "Zadaje o 50 obrazen wiecej z noza +int (Uzycie: PPM). Posiada 135hp, 135% biegu, 100 wytrzymalosci", // 2 "Jest odporny na umiejetnosci wszystkich klas przeciwnika. Posiada 120hp, 80% biegu, 150 wytrzymalosci", // 3 "Posiada 100hp, 100% biegu, 100 wytrzymalosci", // 4 "Posiada 100hp, 100% biegu, 100 wytrzymalosci", // 5 "Posiada 100hp, 100% biegu, 100 wytrzymalosci", // 6 "Posiada 100hp, 120% biegu, 50 wytrzymalosci", // 7 "Posiada dlugi skok, 100hp, 100% biegu, 50 wytrzymalosci", // 8 "Posiada 150hp, 80% biegu, 150 wytrzymalosci", // 9 "Posiada 105hp, 80% biegu, 150 wytrzymalosci", // 10 "Posiada 140hp, 80% biegu, 150 wytrzymalosci", // 11 "Posiada 100hp, 115% biegu, 100 wytrzymalosci", // 12 "Wybucha po smierci zadajac 80 zdrowia +int. Posiada 120hp, 100% biegu, 50 wytrzymalosci", // 13 "Posiada 180hp, 120% biegu", // 14 "Moze podnosic wszystkie bronie. Posiada 80hp, 80% biegu, 80 wytrzymalosci", // 15 "Posiada 125hp, 80% biegu", // 16 "Zadaje o 50 obrazen wiecej z he +int. Posiada 120hp, 110% biegu, 25 wytrzymalosci", // 17 "Zadaje obrazenia z deagla +int. Posiada 115hp, 110% biegu, 25 wytrzymalosci", // 18 "Posiada 175hp, 100% biegu, 175 wytrzymalosci", // 19 "Posiada przebranie wroga, 125hp, 100% biegu, 100 wytrzymalosci", // 20 "Jest odporny na zadane obrazen w dol tulowia. Posiada 120hp, 110% biegu, 100 wytrzymalosci", // 21 "Posiada 1/3 szans na natychmiastowe zabicie z ssg08, 105hp, 105% biegu, 50 wytrzymalosci", // 22 "Moze wykonac podwojny skok (Uzycie: podczas skoku SPACE), dostaje 30 zdrowia za zabicie przeciwnika. Posiada 130hp, 115% biegu, 50 wytrzymalosci", // 23 "Regeneruje 50 procent zadanych obrazen w postaci zdrowia. Posiada natychmiastowe zabicie z noza, 200hp, 130% biegu, 100 wytrzymalosci", // 24 };
Opis Itemow:
new String:nazwy_itemow[][] = { "Brak", // 0 "Wytrenowany Weteran", // 1 "Wytrenowany Rekrut", // 2 "Wyszkolenie Wojenne", // 3 "Apteczka", // 4 "Adrenalina", // 5 "Regenerator", // 6 "Morfina", // 7 "Ksiega Expa", // 8 "Portfel Turysty", // 9 "Kamizelka Nasa", // 10 "Sandaly Gaudentego", // 11 "Mozg Einsteina", // 12 "Zestaw Predatora", // 13 "Notatki Kapitana", // 14 "Tytanowe Naboje", // 15 "Naboje Pulkownika", // 16 "Weteran Noza", // 17 "Noz Mysliwego", // 18 "Notatki Ninji", // 19 "Pancerny Helm", // 20 "Pancerz Neomexowy", // 21 "Modul Odrzutowy", // 22 "Zaskoczenie Wroga", // 23 "Plaszczowe Naboje", // 24 "Luneta Wojskowego", // 25 "Tajemnica Molotova", // 26 "Tajemnica Zabojcy", // 27 "Plonace Naboje", // 28 "Tarcza Swat", // 29 "Nano Kamizelka", // 30 "Ogranicznik Rozrzutu", // 31 "Podrecznik Szpiega", // 32 "Tajemnica Generala", // 33 "Bezdenny Magazynek", // 34 "Szybkostrzelnosc", // 35 "Buty Ninji", // 36 "Autodestrukcja", // 37 "Rozblysk Sloneczny", // 38 "Tajemnica Rambo", // 39 "Izraelskie Naboje", // 40 "Opaska Rambo", // 41 "Fart Strzelca", // 42 "Tajemnica Thiefa", // 43 "Pierscien Expa", // 44 "Sakwa Szczescia", // 45 "Oko Snajpera", // 46 "Platynowe Naboje", // 47 "Krytyczne Naboje", // 48 "Taktyczne Naboje" // 49 }; new String:opisy_itemow[][] = { "Zabij kogos aby dostac item", // 0 "Dostajesz dodatkowo 100 punktow zdrowia. Wolniej biegasz", // 1 "Dostajesz dodatkowo 50 punktow zdrowia. Wolniej biegasz", // 2 "Regenerujesz 10 zdrowia, co 5 sekund", // 3 "Regenerujesz zdrowie do pelna (Uzycie: E)", // 4 "Regenerujesz 50 zdrowia za zabicie przeciwnika", // 5 "Regenerujesz 30 procent zadanych obrazen w postaci zdrowia", // 6 "Posiadasz 1/LW szans na ponowne odrodzenia sie po smierci", // 7 "Dostajesz dodatkowo 300 doswiadczenia za zabicie przeciwnika", // 8 "Dostajesz dodatkowo 300 dolarow za zabicie przeciwnika", // 9 "Dostajesz dodatkowo 100 punktow wytrzymalosci", // 10 "Dostajesz dodatkowo 100 punktow kondycji", // 11 "Dostajesz dodatkowo 100 punktow inteligencji", // 12 "Dostajesz noktowizor (Uzycie: E). Jestes odporny na zadane obrazenia od upadku", // 13 "Jestes odporny na 3 pierwsze zadane obrazenia przez przeciwnika", // 14 "Zadajesz o 10 obrazen przeciwnikowi wiecej z kazdej broni", // 15 "Zadajesz o 20 obrazen przeciwnikowi wiecej z kazdej broni", // 16 "Zadajesz o 40 obrazen przeciwnikowi wiecej z noza", // 17 "Posiadasz natychmiastowe zabicie przeciwnika z noza", // 18 "Mozesz wykonac podwojny skok (Uzycie: podczas skoku SPACE)", // 19 "Jestes odporny na zadane obrazenia przez przeciwnika w glowe", // 20 "Posiadasz 1/LW szans na odbicie zadanych obrazen przez przeciwnika", // 21 "Zostajesz wyrzucony z duza predkoscia (Uzycie: podczas biegu i skoku E)", // 22 "Zadajesz 140 procent obrazen przeciwnikowi gdy atakujesz w dol tulowia", // 23 "Zadajesz 140 procent obrazen przeciwnikowi z kazdej pobocznej broni", // 24 "Posiadasz przyblizenie w kazdej broni palnej (Uzycie: ATTACK2)", // 25 "Dostajesz koktajl molotova, co 20 sekund", // 26 "Posiadasz 1/LW szans na wyrzucenie broni przeciwnika", // 27 "Posiadasz 1/LW szans na podpalenie przeciwnika", // 28 "Nie dzialaja na tobie itemy przeciwnika", // 29 "Nie dzialaja na tobie umiejetnosci klas przeciwnika", // 30 "Posiadasz zmniejszony rozrzutu broni", // 31 "Posiadasz 1/LW szans na natychmiastowe zabicie z he. Masz ubranie przeciwnika", // 32 "Posiadasz natychmiastowe zabicie z he. Zadajesz o LW obrazen wiecej", // 33 "Posiadasz nieskonczona ilosc amunicji", // 34 "Posiadasz zwiekszona szybkostrzelnosc broni", // 35 "Posiadasz zmniejszona grawitacje", // 36 "Wybuchasz po smierci zabijajac wszystkich przeciwnikow w poblizu", // 37 "Podpalasz wszystkich przeciwnikow w poblizu (Uzycie: E)", // 38 "Regenerujesz 20 zdrowia za zabicie przeciwnika. Nie dzialaja na tobie fb przeciwnika", // 39 "Dostajesz dodatkowo 50 punktow obrazen", // 40 "Dostajesz dodatkowo 25 punktow do kazdej statystyki", // 41 "Posiadasz 1/LW szans na natychmiastowe zabicie przeciwnika", // 42 "Mozesz podnosic bronie nalezace do wszystkich klas", // 43 "Dostajesz dodatkowo 500 doswiadczenia za zabicie przeciwnika", // 44 "Dostajesz dodatkowo 3000 dolarow podczas odrodzenia", // 45 "Posiadasz natychmiastowe zabicie przeciwnika w glowe", // 46 "Zadajesz o LW obrazen przeciwnikowi wiecej z kazdej broni", // 47 "Posiadasz 1/LW szans na zadanie 140 procent obrazen przeciwnikowi", // 48 "Posiadasz 1/LW szans na oproznienie magazynku przeciwnika" // 49 };
Opis Konta VIP:
- Dostaje +30% doswiadczenia za wszystko - Dostaje 20 punktow zdrowia, 30 punktow wytrzymalosci i kondycji - Posiada status [PREMIUM] w tabeli wynikow
(08.06.15)
Mala aktualizacja dotyczaca optymalizacji kodu.
(19.08.15)
Poprawa zapisu punktow statystyk. Zapisywanie punktow zostalo usuniete co zoptymalizuje troche zapis.
(10.09.15)
Optymalizacja kodu (wersja 0.2).
(18.09.15)
Optymalizacja kodu i naprawa bledow (wersja 0.4).
(30.09.15)
Naprawa bledow, optymalizacja kodu. Usuniecie zapisu sqllite i zastapienie go bezawaryjnym zapisem mysql. Podziekowania dla uzytkownika Sniper Elite za swoj wklad pracy i pomoc w opracowaniu zapisu (wersja 0.6)
(06.10.15)
Drobna poprawka dla posiadaczy konta premium, czasem występował problem z jego czytaniem. Zostało to naprawione.
Plany na przyszlosc:
- Wkrotce postaram sie zamienic aktualny zapis na mysql tak wiec problemy dotyczace lagow na serwerach hostingowanych przez serwery gier powinny sie skonczyc.
- Planuje ograniczyc ilosc funkcji znajdujacych sie w prethinku, te ktore wymagaja uzycia zostana przeniesione do specjalnej funkcji powolanej do tego tzn cmdplayer. W przyszlosci rowiez planuje calkowicie usunac funkcje prethink i zastapic ja taskiem z petla. Bedzie to owiele optymalniejsze rozwiazanie niz obecne.
Zapraszam do testow i oceniania, w razie jakis problemow pisac.
Napisane przez Mrufka.
w 27.07.2015 13:46
Nie, mi to nie jest potrzebne ponieważ wirtualne życie mam głęboko w d*pie i gram tylko 4 fun, ale wk***iają mnie ludzie co uważają się za nie wiadomo kogo, a mają problem z napisaniem poprawnie wyrazu który ma trzy litery.
Ps.: Wyjdź na dwór, może grafika nie jest taka idealna jak w csie, ale powinno Ci się spodobać ... x]
@EDIT
Do tego tematu wracać raczej nie będę, więc możesz sobie darować odpowiedzi bo i tak ich prawdopodobnie nie przeczytam
Napisane przez Misiaczek ;c
w 25.07.2015 00:00
Napisane przez Linux'
w 06.07.2015 14:48
Napisane przez DarkGL
w 06.07.2015 14:43
Napisane przez R3X
w 26.02.2014 21:56
Canvas
w ramach eksperymentu i `for the lolz` pracuję nad własnym rendererem wewnątrz serwera hlds. Canvas, czyli płótno. O co chodzi?
Plugin oddaje do dyspozycji API, dzięki któremu stworzymy płótno o dowolnych (niestety ograniczonych) rozmiarach. Na tym płótnie możemy rysować ustawiając odpowiednio kolor każdego z pikseli. Rysowaniem zajmuje się Program, rejestrując go podajemy nazwę publicznej funkcji, która będzie wołana co ramkę serwera i w ten sposób możemy aktualizować stan płótna.
Aktualnie płótna można dodawać i konfigurować jedyne z menu dostępnego pod komendą
amx_canvas
Można tam dodawać płótna, zmieniać wymiary, rozmiar i program.
Interakcja
Samo rysowanie to mało. Oczywiście, że chciałoby się mieć wpływ na to co jest rysowane będąc graczem. Podstawowa interakcja to pozostawanie w zasięgu. Główny plugin pozwala zarejestrować callbacki wołane gdy gracz wchodzi i wychodzi z zasięgu płótna. Pozwala to np. zmienić wyświetlany kolor, gdy ktoś patrzy.
Bardziej zaawansowany jest interfejs związany z klawiaturą. Jeśli zdecydujemy się zablokować kamerę gracza na płótnie, wysyłane będą forwardy (również dostępne jako rejestrowalne callbacki) gdy gracz naciska, puszcza lub przytrzymuje klawisz. Na razie nie ma żadnych blokad. Sterując mini-grą gracz będzie biegał i strzelał. Wkrótce się to zmieni
W planach jest także interfejs dotykowy, tzn gdyby jeden piksel był większy niż gracz to możliwe będzie precyzyjne określenie na którym z pikseli gracz stoi. Z tym wiąże się mnóstwo pomysłów do zrealizowania.
Innym typem interakcji może być strzał w piksel. Umożliwiłoby to np. grę w kółko i krzyżyk, gdzie gracze na przemian strzelają w pole gdzie chcą postawić swój znak.
Inicjalizacja
Głównie z powodów technicznych narodziła się idea inicjalizacji. Narysowanie dwustu pikseli na raz zawiesiło mi serwer na dobre kilka sekund, a chwilę potem dostawałem channel overflow. Jako obejście wybrałem liniowe rysowanie pikseli w pierwszych chwilach życia płótna. Podstawowy initializer rysuje po 4 piksele na ramkę, od pierwszego do ostatniego. Potem będzie więcej opcji.
Ograniczenia
Silnik hl pozwala klientowi rysować ~256 bytów. Każdy piksel płótna jest bytem, więc teoretycznie możemy osiągnąć kwadrat 16x16. Jednak kto pierwszy ten lepszy, więc od tej puli należy odjąć wszystko co jest narysowane na mapie + miejsce na nowe obiekty jak wypadające po śmierci bronie czy rzucone granaty. Będąc sam na serwerze bez zamiaru strzelania się z kimś używałem płótna 28x8. Gdyby ktoś chciał umieści płótno na żywym serwerze wątpię czy udałoby się to zrobić dla rozmiarów większych niż w sumie 100-150 (np. 15x10 ).
Demo
Podczas prac robiłem krótkie filmiki z postępów. Oto lista: http://www.youtube.c...hKwIexxiDB238rI
Źródło
https://github.com/e...iks/amxx-canvas
Na razie nie ma sensu robić paczki. Wersja jest dość wczesna. Da się już coś zrobić, ale raczej również jako ekperyment.
Napisane przez R3X
w 08.05.2011 21:18
Rodzaje funkcji w Pawnie
pod AMXX
Funkcja może być:
1. Funkcja wewnętrzna
Funkcja dostępna tylko dla innych funkcji w pluginie
Przeznaczenie:
- podział kodu na podprogramy
Uwagi:
- powinna zostać wywołana, inaczej powoduje ostrzeżenie (ale nieszkodliwe) podczas kompilacji
Przykład
funkcja(parametry, danej, funkcji) { }
stock funkcja(parametry, danej, funkcji) { }
public funkcja(parametry, danej, funkcji) { }
@funkcja(parametry, danej, funkcji) { }
native register_event(const event[],const function[],const flags[],const cond[]="", ... );
forward plugin_init();
Napisane przez NoLiFeR
w 04.06.2015 01:40
Sprawdzasz czy trwa zabawa (jail_get_play_game_id > 8).
przy forwarcie OnLastPrisonerTakeWish ustawiasz wartość zmiennej przykładowo "zyczenie" na true oraz przy starcie nowej rundy przestawiasz na false.
I sprawdzasz te warunki
if(jail_get_play_game_id > 8 || zyczenie)
Zmienną życzenie rejestrujesz w sposób
new bool:zyczenie
Mógłbym podać Ci gotowca, lecz nic byś się z tego nie nauczył, a nie o to chodzi
Napisane przez BlackPerfum
w 29.08.2013 00:18
A więc niedawno pewien użytkownik tego forum poprosił mnie o zrobienie pluginu dzięki któremu będzie możliwa podmiana tekstu nie ingerując w jakiś plugin.
A o to rezultaty mojego główkowania :D
Plugin umożliwia ingerowanie w wyświetlany tekst u gracza Menu/Hud/Say/DHud/Motd/Tutor.
Przydatne np. gdy nie posiadamy pliku .sma pluginu a chcemy w nim zmienić/usunąć jakieś napisy :D
Orpheu klik
Tekst do podmiany konfigurujemy w pliku pod ścieżką: addons/amxmodx/configs/BlokowanyTekst.ini
; 1 parametr to typ wiadomości ; 2 parametr to tekst do podmiany ; 3 parametr to tekst podmieniający ; ; Typy wiadomości: ; • Menu ; • Hud ; • Say ; • Director - popularny dhud ; • Motd ; • Tutor ; ; Ważne: ; Typy w pierwszym parametrze można łączyć ; Tekst z parametru 3 nie powinienł być dłuższy niż ten z parametru 2 ; Wielkość liter nie ma znaczenia ; ; Parę przykładów: ;"Menu" "Your text" "My Text" // Po takim ułożeniu parametrów jeżeli w jakimś menu będzie napis "Your text" ; zostanie on podmieniony na "My Text" ; Aby dodać np. say możemy zrobić tak: ; "Menu+Say" "Your text" "My Text" // Teraz także będzie wyłapywać jak ktoś napisze na say Your Text
Rozpakowujemy i wrzucamy do naszego folderu "cstrike"
- Tekst podmieniający nie powinien być równy dłuższy od podmienianego (czasu brak ale jak będzie to usunę to ograniczenie)
- Tekst podmieniany i podmieniający nie mogą przekroczyć 100 znaków
PodmianaZnakow.rar 10,41 KB 208 Ilość pobrań
Napisane przez sebul
w 07.07.2014 13:39
enum ValueType { ValueType_Int = 0, ValueType_Bool, ValueType_Float, ValueType_Flag }; enum ConVar { Handle:ConVarHandle, // Handle of the convar. ValueType:ConVarType, // Type of value. (int, bool, float) any:LastConVarValue, any:PrevConVarValue, // Previous value. any:ConVarValue // The value. }; stock AddConVar(newCon[ConVar], ValueType:type, ConVarChanged:callback, Handle:conVarHandle) { newCon[ConVarHandle] = conVarHandle; newCon[ConVarType] = type; if(conVarHandle != INVALID_HANDLE) { SetConVarDefault(newCon); HookConVarChange(conVarHandle, callback); } } stock AddConVarNoHook(newCon[ConVar], ValueType:type, Handle:conVarHandle) { newCon[ConVarHandle] = conVarHandle; newCon[ConVarType] = type; if(conVarHandle != INVALID_HANDLE) { SetConVarDefault(newCon); } } stock SetConVarDefault(setCon[ConVar]) { decl String:defCon[32]; GetConVarDefault(setCon[ConVarHandle], defCon, 32); switch(setCon[ConVarType]) { case ValueType_Int: setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = StringToInt(defCon); case ValueType_Bool: setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = bool:StringToInt(defCon); case ValueType_Float: setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = StringToFloat(defCon); case ValueType_Flag: setCon[ConVarValue] = setCon[PrevConVarValue] = setCon[LastConVarValue] = ReadFlagString(defCon); } } stock UpdateConVarValue(upCon[ConVar]) { upCon[PrevConVarValue] = upCon[ConVarValue]; switch(upCon[ConVarType]) { case ValueType_Int: upCon[ConVarValue] = GetConVarInt(upCon[ConVarHandle]); case ValueType_Bool: upCon[ConVarValue] = GetConVarBool(upCon[ConVarHandle]); case ValueType_Float: upCon[ConVarValue] = GetConVarFloat(upCon[ConVarHandle]); case ValueType_Flag: { decl String:flagCon[32]; GetConVarString(upCon[ConVarHandle], flagCon, 32); upCon[ConVarValue] = ReadFlagString(flagCon); } } } stock SetConVarValue(setCon[ConVar], {_,bool,Float}:conVarValue, bool:replicate=false, bool:notify=false) { setCon[PrevConVarValue] = setCon[ConVarValue]; switch(setCon[ConVarType]) { case ValueType_Int: SetConVarInt(setCon[ConVarHandle], _:conVarValue, replicate, notify); case ValueType_Bool: SetConVarBool(setCon[ConVarHandle], bool:conVarValue, replicate, notify); case ValueType_Float: SetConVarFloat(setCon[ConVarHandle], Float:conVarValue, replicate, notify); case ValueType_Flag: { decl String:flagCon[32]; FindFlagString(_:conVarValue, flagCon, 32); SetConVarString(setCon[ConVarHandle], flagCon, replicate, notify); } } setCon[ConVarValue] = conVarValue; } stock bool:IsConVarValueChanged(isCon[ConVar]) { return bool:(isCon[PrevConVarValue] != isCon[ConVarValue]); } stock CheckToggleConVarValue(cheCon[ConVar]) { if(cheCon[PrevConVarValue] && !cheCon[ConVarValue]) { return -1; } else if(!cheCon[PrevConVarValue] && cheCon[ConVarValue]) { return 1; } return 0; }Trzeba jeszcze dodać parę rzeczy
enum _:eCvary { // ustawiamy według własnych potrzeb CvarPierwszy = 0, CvarDrugi, CvarTrzeci // itd. }; new g_ConVars[eCvary][ConVar]; public OnConfigsExecuted() { for(new i=0; i<eCvary; ++i) { UpdateConVarValue(g_ConVars[i]); } } public OnConVarChange(Handle:conVar, const String:oldValue[], const String:newValue[]) { for(new i=0; i<eCvary; ++i) { if(conVar == g_ConVars[i][ConVarHandle]) { UpdateConVarValue(g_ConVars[i]); break; } } }A dodawanie cvaru robi się tak
AddConVar(g_ConVars[CvarPierwszy], ValueType_Int, OnConVarChange, CreateConVar("sm_cvarpierwszy", "150")); AddConVar(g_ConVars[CvarDrugi], ValueType_Bool, OnConVarChange, CreateConVar("sm_cvardrugi", "1")); AddConVar(g_ConVars[CvarTrzeci], ValueType_Float, OnConVarChange, CreateConVar("sm_cvartrzeci", "15.0"));Generalnie co nam to daje? W jednej zmiennej globalnej mamy dostęp do uchwytu, typu i wartości cvaru, czy to dobre rozwiązanie? Nie wiem, niech każdy sam zadecyduje.