Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Wicked. - zdjęcie

Wicked.

Rejestracja: 26.12.2015
Aktualnie: Przegląda stronę główną
Poza forum Ostatnio: wczoraj, 22:54
-----

Moje tematy

Time cycle, plugin sterujący oświetleniem.

27.12.2019 19:51

opis

Plugin steruje oświetleniem korzystając z set_lights z engine. Przeznaczenie na zombie moda, gdzie klasy zombie będą mogły dostać bonus, jeśli jest noc.

 

konfiguracja

Cvary:

dc_lighting_levels "bcdefghijklmnopqrs" // "a" - darkest, "z" - lightest. Cannot be mixed.
dc_lighting_interval "60.0" // Determines how often the lights change.
dc_lighting_default_level "k" // What level of light server starts with.
dc_lighting_night_start "k" // When does the night start.
dc_lighting_cycles_per_map "5" // How many day/night cycles there will be if interval is -1.0

download

https://github.com/W...hive/master.zip

Kod źródłowy : https://github.com/Wwicked/day-cycle

Windows 8.1 nie wykrywa mikrofonu

14.12.2019 03:22

Od kilku dni walczę wytrwale z windowsem o mikrofon. System w ogóle go nie widzi, a mikrofon ze słuchawek został wykryty ale nie daje odpowiedzi - tak jakby był kompletnie wyciszony.

 

Próbowałem:

  • Uninstall & Install sterowników: usb, dźwięku i 150 innych,
  • Testy na kreatorze,
  • Testy na innym sprzęcie (obydwa mikrofony działają),
  • Zabawę z ustawieniami w menedżerze urządzeń,
  • Zabawę z ustawieniami w urządzeniach nagrywania,
  • Przepinać z USB 2.0 na 3.0
  • Kilka innych, których już nawet nie pamiętam, żeby wymienić

Sięgnąłem już nawet po tak desperacką próbę jak "napraw problemy" w systemie  :starzec:

Kolumna z pieniędzmi w nowej tabelce

11.10.2019 23:00

Poniżej załączam plugin usuwający pieniądze z prawej częsci ekranu. Wykorzystać to możemy z cs_set_user_money, co w efekcie w tabeli da nam możliwość np. ustawienia poziomu na codach, AP na zombie, szlugów na jb itd. Niestety znak "$" wciąż zostaje w tabeli (ale może nie na długo, kto wie).

 

Spoiler

Zrozumieć istotę tablic - wstęp

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ę):

Spoiler

 

Sposób dobry:

Spoiler

 

Sedno - przykłady

 

 

Przechowywanie danych o statusie vip każego gracza z osobna:

Spoiler

 

Wyświetlanie napisu "Informacja w konsoli serwera" w konsoli serwera:

Spoiler

 

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 :) ]:

Spoiler

 

 

Formatowanie tekstu "amxx" w funkcji:

Spoiler

 

Poszczególne indeksy (dla zobrazowania tablicy):

Spoiler

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.

Natywy - zrozumienie API w amxxie

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:

Cod mod

Jailbreak

Zombie

 

 

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.