***** no nie... no po prostu ***** no nie
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
devil11
Rejestracja: 20.02.2014Aktualnie: Nieaktywny
Poza forum Ostatnio: 30.03.2024 09:17





Statystyki
- Grupa: Użytkownik
- Całość postów: 284
- Odwiedzin: 11 014
- Tytuł: Wszechwidzący
- Wiek: Wiek nie został ustalony
- Urodziny: Data urodzin nie została podana
-
Imię
nie ma
-
Płeć
Mężczyzna
-
Lokalizacja
ziemia
Kontakt
#761394 Prosba o dodanie Działek eventowych
Napisane przez Robiin
w 07.09.2019 16:51
#760746 Zrozumieć istotę tablic - wstęp
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
- Rozmiar tablicy - jest to maksymalna ilość komórek, jakie udostępni nam dana tablica.
- Typ danych tablicy - typ danych, jakie przechowuje tablica. Cała tablica musi przechowywać ten sam typ danych. (przykładowo Float - dla liczb zmiennoprzecinkowych, bool - dla wartości logicznych)
- Indeks gracza - unikalny identyfikator gracza przypisywany do niego przy wejściu na serwer (min. 1 max. 32)
- Indeks tablicy - identyfikator 'pola', z którego chcemy wyciągnąć dane z tablicy
- charsmax - funkcja w amxx zwracająca maksymalną ilość wartości, jaką możemy 'włożyć' do tablicy
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ć:
- Pieniądze gracza (float)
new Float:userMoney[33];
- Poziom gracza (int)
new userLevel[33];
- Informacje czy gracz ma vipa (bool)
new bool:isVip[33];
Dlaczego rozmiar to 33:
- Maksymalna ilość graczy to 32
- Liczymy od zera (tak wiec jeśli dalibyśmy 32, gracz z indeksem 32 byłby powodem wyjścia poza wielkość tablicy)
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.
#760517 Natywy - zrozumienie API w amxxie
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:
- Plugin źródłowy - ten, w którym tworzymy natywy i ich działanie
- Plugin docelowy - ten, w którym będziemy używać natywów
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
- userExp - zmienna, która przechowuje ilość expa, którą dany gracz posiada
- userLevel - zmienna, która przechowuje poziom gracza
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:
- Style natywów
- Typy danych zwracane przez natywy
- Formatowanie napisów / działanie na tablicach w natywach
Do podglądu zostawiam również stronę dokumentacji: register_native.
#759365 Konfiguracja rehlds
Napisane przez Ogen Dogen
w 24.05.2019 21:43
Cześć, mam taki pytanie małe które mnie nurtuje mianowicie staram się postawić serwer na rehlds niby mam wgrany na serwer acz kolwiek sam do końca nie wiem czy on działa czy nie i moje pytanie jak to moge sprawdzic
Wpisz w konsolę serwera:
version
Jeśli otrzymasz coś podobnego (zależnie od wersji jaką wgrałeś), to znaczy że został zainstalowany.
Protocol version 48 Exe version 1.1.2.7/Stdio (cstrike) ReHLDS version: 3.4.0.669-dev Build date: 18:21:09 Mar 29 2019 (1812) Build from: https://github.com/dreamstalker/rehlds/commit/f6822e3
O dzięki aj jeszcze jak byś powiedzial mi jak to ogarnać bo już zapomniałem nawet takich podstaw https://amxx.pl/topi...view=getnewpost
Wystarczy, że podmienisz plik w addons/metamod/metamod_i386.so na ten z paczki i zrestartujesz serwer. Upewnij się wcześniej, że ReHLDS został zainstalowany!
#759362 Konfiguracja rehlds
Napisane przez DarkGL
w 24.05.2019 17:46
#748843 Ukradzione konto steam, włamy na sieci, kradzieże paczek - wyjaśnienie sytuacji
Napisane przez Robiin
w 23.04.2018 21:15
Uprzedzając wszystko, co wróci do mojej osoby informuję, że konto steam:
http://steamcommunit...61198078537335/
nie należy do mnie już od ponad 2 lat.
Konto jest kradzione - steam support został poinformowany.
Nie jestem w żaden sposób powiązany z jego obecnym właścicielem, ani z jego 'dziwactwami', które wyczynia na jakiejkolwiek sieci.
Nie odpowiadam za nic, co będzie, lub już jest dla kogoś problemem w powiązaniu z tą osobą.
Używam tylko jednego konta steam, podanego w moim aktualnym profilu amxxa.
#732854 Usuwanie broni po wybraniu nowej
Napisane przez d0naciak
w 01.12.2016 00:01
Skorzystaj z biblioteki: http://amxx.pl/inc/StripWeapons.inc
A potem z funkcji: https://amxx.pl/doku...84/StripWeapons
#733397 Usuwanie broni po wybraniu nowej
Napisane przez Kmf!p
w 15.12.2016 02:30
poprostu przed daniem graczowi nowej broni wlej wyzej to:
StripWeapons(id, Primary);
czyli calosc ma wygladac mniej wiecej tak:
StripWeapons(id, Primary); give_item(id, "weapon_ak47");
usuwa to bronie ze slotu pierwszego, z drugiego slotu usuwa cos takiego:
StripWeapons(id, Secondary);
oczywiscie jesli masz wgrana biblioteke ktora podaja wyzej
uprzedzajac posta od razu napisze ze wrzucasz ja do folderu include w scripting i dziala
ta amunicie tez jakos dziwnie dodajesz pewnie dziala, ale tak chyba bylo by lepiej:
new m4a1_id; m4a1_id=find_ent_by_owner(-1, "weapon_m4a1", id); if(m4a1_id) { cs_set_weapon_ammo(m4a1_id, 30); cs_set_user_bpammo(id, CSW_M4A1, 90); }
aha i ludzie tu pisza o Primary czyli broniach z pierwszego slota, ale ty robisz menu z pistoletami wiec musisz uzyc Secondary, zeby usunac wczesniejszy pistolet chyba ze chcesz usuwac graczom bronie takie jak ak/m4
#716866 Brak pobierania nazwy
Napisane przez Kowalsky
w 26.12.2015 19:43
#708320 blokowanie broni
Napisane przez Alelluja
w 01.08.2015 10:58
#697119 [ROZWIĄZANE] Czy dodana flaga jest odpowiednio
Napisane przez grankee
w 12.04.2015 14:05
if(wid == CSW_KNIFE && get_user_team(id) & ADMIN_LEVEL_H)
od kiedy get_user_team sprawdzisz flage ?
ponadto remove_task wielokrotnie wykona się na nieistniejącym tasku = errory w logach
#include <amxmodx> #include <fakemeta_util> #define HP_ADD 1 #define HP_TIME 1 #define HP_MAX 100 public plugin_init() { register_plugin("Regeneracja HP", "1.0", "Raku"); register_event("CurWeapon","CurWeapon","be", "1=1") } public CurWeapon(id) { new wid = read_data(2); if(wid == CSW_KNIFE && (get_user_flags(id) & ADMIN_LEVEL_H) && !task_exists(id)) { set_task(float(HP_TIME), "recovery", id, _, _, "b"); } else { if(task_exists(id)) remove_task(id); } } public recovery(id) { if ( get_user_health(id) < HP_MAX ) fm_set_user_health(id, get_user_health(id) +HP_ADD); }
#658687 Plugin lista serwerów
Napisane przez Slawo
w 18.08.2014 20:42
#641000 Pomoc przy przerobieniu pluginu GHW Weapon
Napisane przez wiwi249
w 30.05.2014 18:52
Otwórz GHW_Weapon_Replacement.sma.
Linijka 209. to event CurWeapon:
public Changeweapon_Hook(id)wystarczy w tej funkcji sprawdzić, czy gracz ma odpowiednie flagi, ale dopiero po sprawdzeniu, czy gracz jest podłączony, czyli po prostu dopisz warunek. Cała funkcja ma wyglądać tak:
public Changeweapon_Hook(id) { if(!is_user_alive(id)) { return PLUGIN_CONTINUE } if(!(get_user_flags(id) & ADMIN_LEVEL_H)) //warunek - jesli ma flage "t". return PLUGIN_CONTINUE //nie wczytuj dalej, jesli warunek z linijki wyzej nie jest spelniony. static model[32], i, team team = get_user_team(id) pev(id,pev_viewmodel2,model,31) for(i=0;i<v_modelsnum;i++) { if(equali(model,old_v_models[i])) { if(v_models_team[i]==team || !v_models_team[i]) { set_pev(id,pev_viewmodel2,new_v_models[i]) break; } } } pev(id,pev_weaponmodel2,model,31) for(i=0;i<p_modelsnum;i++) { if(equali(model,old_p_models[i])) { if(p_models_team[i]==team || !p_models_team[i]) { set_pev(id,pev_weaponmodel2,new_p_models[i]) break; } } } return PLUGIN_CONTINUE }
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: devil11
- Regulamin