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
 

devil11 - zdjęcie

devil11

Rejestracja: 20.02.2014
Aktualnie: Nieaktywny
Poza forum Ostatnio: 30.03.2024 09:17
-----

#761394 Prosba o dodanie Działek eventowych

Napisane przez Robiin w 07.09.2019 16:51

***** no nie... no po prostu ***** no nie


  • +
  • -
  • 6


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

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.


  • +
  • -
  • 15


#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:

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.


  • +
  • -
  • 14


#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!


  • +
  • -
  • 1


#759362 Konfiguracja rehlds

Napisane przez DarkGL w 24.05.2019 17:46

Użyj tego https://github.com/TheDoctor0/BasePack


  • +
  • -
  • 1


#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.


  • +
  • -
  • 2


#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

 


  • +
  • -
  • 1


#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 ;P

 

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


  • +
  • -
  • 1


#716866 Brak pobierania nazwy

Napisane przez Kowalsky w 26.12.2015 19:43

Zmień

new gNazwa[101];

na

new gNazwa[256];

i

get_user_name(0, gNazwa, 300);

na

get_user_name(0, gNazwa, 255);

Komputerowi łatwiej działa się w systemie dwójkowym :)

 

Jak to nie podziała to zmień get_user_name... na to:

get_cvar_string("hostname", gNazwa, 255)

i sprawdź :)


  • +
  • -
  • 1


#708320 blokowanie broni

Napisane przez Alelluja w 01.08.2015 10:58

Proszę.

Załączone pliki


  • +
  • -
  • 1


#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 ?  :facepalm2:

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);
}

  • +
  • -
  • 2


#658687 Plugin lista serwerów

Napisane przez Slawo w 18.08.2014 20:42

Sprawdź:

Załączone pliki


  • +
  • -
  • 1


#641000 Pomoc przy przerobieniu pluginu GHW Weapon

Napisane przez wiwi249 w 30.05.2014 18:52

Pomager'ek skądże znowu? Czytałeś posta?
 
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
}


  • +
  • -
  • 1


#641003 Pomoc przy przerobieniu pluginu GHW Weapon

Napisane przez wiwi249 w 30.05.2014 19:05

Dobra, łap od razu zrobioną wersje, działa też dla dźwięków.

W załączniku.

Załączone pliki


  • +
  • -
  • 1