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
 

Itachi - zdjęcie

Itachi

Rejestracja: 31.01.2011
Aktualnie: Nieaktywny
Poza forum Ostatnio: 09.07.2012 13:11
-----

#429146 Link do bytów

Napisane przez DarkGL w 06.07.2012 12:50

tu jest trochę informacji
http://amxx.pl/topic...-do-scriptingu/

engfunc wywołuje odpowiednie funkcje silnika gry opis parametrów znajdziesz w fakemeta_const
  • +
  • -
  • 1


#424149 [ROZWIĄZANE] Warukni IF - Filozofia ...

Napisane przez Gość w 25.06.2012 12:25

OK, już rozumiem, jaki efekt chcesz uzyskać.

Tutaj masz opisane użycie returnów, nie będę powielał tematu.

if(!g_resp[id]){
if(get_user_flags(id) & ADMIN_LEVEL_ B){
client_print(id, print_center, "Jestes adminem, masz opcje dostepne poza respem")
return PLUGIN_CONTINUE;
} else {
return PLUGIN_HANDLED;
}
}
Taki kod w zupełności wystarczy.

Jeśli pierwszy warunek sprawdził, że gracz nie jest na respie, to ponowne sprawdzanie go wewnątrz tego ifa jest zbędne.
Jeśli warunek
!(get_user_flags(id) & ADMIN_LEVEL_ B)
nie został spełniony, to nie musisz na nowo sprawdzać
if (get_user_flags(id) & ADMIN_LEVEL_B
bo wynika to z niespełnienia poprzedniego warunku, zatem z całego
else if (get_user_flags(id) & ADMIN_LEVEL_B && !g_resp[id])
wystarczy samo if.


#423584 [ROZWIĄZANE] Zapytanie do give_weapon

Napisane przez GwynBleidD w 23.06.2012 16:23

Co do zbugowania kodu CheQ, bierze się on stąd, że zanim do gracza dojdzie polecenie, że ma broń wyrzucić, serwer już próbuje mu dać nową (client_cmd wysyła komendę i nie czeka, aż gracz ją wykona!). W tym przypadku musisz zrobić warunek dla dania graczowi broni, którą ma i potraktować to inaczej, np uzupełnić amunicję w magazynku ;)
  • +
  • -
  • 1


#423631 [ROZWIĄZANE] Zapytanie do give_weapon

Napisane przez DarkGL w 23.06.2012 19:02

A jeszcze jedno pytanie - tak jak GL napisal, jest do Hamsandwich

Ham_Item_Drop
  • +
  • -
  • 1


#423662 [ROZWIĄZANE] Zapytanie do give_weapon

Napisane przez sebul w 23.06.2012 19:50

Wyrzucić broń można w ten sposób
new wpname[32];
get_weaponname(get_user_weapon(id), wpname, 31);
engclient_cmd(id, "drop", wpname);

tylko po prostu trzeba najpierw sprawdzić, czy gracz ma już jakąś broń, ale od tego jest chociażby mój stock w gotowych funkcjach. A żeby się nie bugowało, to po prostu tak jak wyżej, dać taska z małym opóźnieniem na danie broni.
  • +
  • -
  • 1


#423002 [ROZWIĄZANE] Zapytanie do give_weapon

Napisane przez dasiek w 22.06.2012 07:29

client_cmd( id , "slot1" );
client_cmd( id , "drop" );
give_item(id,"weapon_galil");

taki kod powienien wywalić broń ze slotu 1 i dać nową.

broń ta jednak pozostanie na mapie. mozna użyc bodajrze fm_strip_user_weapon (nie jestem pewny ale gdzieś widziałem wyrzucanie jednej broni z plecaka)
  • +
  • -
  • 1


#422842 [ROZWIĄZANE] Zapytanie do give_weapon

Napisane przez DarkGL w 21.06.2012 18:28

Czy jest mozliwosc, by przy dawaniu broni, wyrzucalo poprzednia?

client_cmd( id , "drop" ) lub wywołanie odpowiedniej funkcji poprzez hamsandwich

Co wpisac w konsoli, by wybralo mi slot nr1

no właśnie wpisz slot1 :F
  • +
  • -
  • 1


#298741 Krotsza mozliwosc zapisu

Napisane przez ^Grzyboo w 21.09.2011 19:23


/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "Plugin do rate"
#define VERSION "1.0"
#define AUTHOR "Shakira"

/*
1- Ex_Interp 0.01
2- Ex_Interp 0.02
3- Ex_Interp 0.03
4- Ex_Interp 0.04
5- Ex_Interp 0.05
6- Menu wyboru
*/

new intoption[33];

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

register_event("HLTV", "Nowa_Runda", "a", "1=0", "2=0")
}


public Nowa_Runda(id)
{
if (!intoption[id])
{
wybierzinterp(id)
return PLUGIN_HANDLED;
}

set_hudmessage (0, 255, 255, -1.0, 0.1, 2, 2.0, 5.0, -1)
show_hudmessage(0, "Ex_Interp i rate Zostaly automatycznie ustawione ")


client_cmd(id, "ex_interp 0.0%d", intoption[id])
client_cmd(id, "cl_irate 25000")
return PLUGIN_HANDLED;
}
public client_putinserver(id){

intoption[id] = 0;
}
public wybierzinterp(id){
new menuinterp=menu_create("Jaki wybierasz interp?","cbwybierzinterp");

menu_additem(menuinterp,"Ex_interp 0.01");
menu_additem(menuinterp,"Ex_interp 0.02");
menu_additem(menuinterp,"Ex_interp 0.03");
menu_additem(menuinterp,"Ex_interp 0.04");
menu_additem(menuinterp,"Ex_interp 0.05");

menu_display(id, menuinterp,0);
return PLUGIN_HANDLED;
}
public cbwybierzinterp(id, menu, item)
{
intoption[id] = item+1;
menu_destroy(menu);
return PLUGIN_HANDLED;
}


Try this
  • +
  • -
  • 1


#109357 Natywy

Napisane przez R3X w 03.02.2010 00:34

Natywy

1. Opis

Funkcje natywne są dostępne dla każdego zainstalowanego pluginu AMXX. Udostępniają funkcje natywne tworzymy z naszego pluginu jakby dodatkową bibliotekę. Dzięki temu mamy możliwość podziału większego dzieła nie tylko na pliki, a na osobne pluginy. Pozwala to na dużą elastyczność kodu oraz pracę z krótszymi, mniej skomplikowanymi programami.

Krótko: Możemy korzystać z danych jednego pluginu w innym.


2. Przygotowanie

Aby to zadziałało potrzeba dwóch współgrających elementów:

  • pluginu-biblioteki, który obsługuje funkcje
  • pliku .inc, który pozwoli korzystać z tych funkcji w innym pluginie
No i pluginu, który będzie korzystał z dobrodziejstw biblioteki.


Na potrzeby tego artykułu stworzę testową bibliotekę <nicto> (czyt. "nic to")

INC
Weźmy się najpierw za plik .inc. Raz dołączony plik nie będzie więcej potrzebny, więc żeby nie powodował problemów ograniczymy jego wykonywanie:

#if defined _nicto_included
	#endinput
#endif

#define _nicto_included

sprawdzamy czy stała "_nicto_included" istnieje (wymyślamy coś własnego, nazwa powinna być unikatowa)
jeśli tak to kończymy plik (#endinput)
jeśli nie to ją definiujemy, potem dołączana jest reszta pliku

dalej informujemy kompilator, że korzystamy z biblioteki nicto:

#pragma library "nicto"

i dalej nagłówki funkcji(nasze natywy lub forwardy[o nich będzie następny artykuł ;P]), stałe, enumeracje lub całe funkcje (stocki)

cały plik inc może wyglądać np tak:

#if defined _nicto_included
	#endinput
#endif

#define _nicto_included

#pragma library "nicto"

enum stan{
	NIC,
	COS
}

native Float:nic();

native cokolwiek(id, stan:s);

native moze_cos(id, Float:fTime, const szMessage[]);

SMA(1)
Pierwszy kod sma to będzie nasza biblioteka. Sam plugin może działać sobie po swojemu tak jak każdy inny. Kluczowym elementem jest fragment:

public plugin_natives(){
	
}

Po pierwsze rejestrujemy bibliotekę:
register_library("nicto");

Po drugie, trzecie i czwarte:
register_native("nic", "n_nic");
register_native("cokolwiek", "n_cokolwiek");
register_native("moze_cos", "n_moze_cos");

register_native("funkcja_biblioteki", "funkcja_pluginu");
funkcja_biblioteki - to ta z inc`a, będzie wywoływana w innych pluginach
funkcja_pluginu - ona będzie odpowiedzialna za działanie tej pierwszej; jej parametry to id pluginu, w którym wywołano natyw oraz ilość argumentów, zwracany typ musi być zgodny z tym podanym dla funkcja_biblioteki w inc`u


Na tym etapie biblioteka wygląda tak:
#include <amxmodx>
#include <amxmisc>

#define PLUGIN "NicTo Lib"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
}
public plugin_natives(){
	register_library("nicto");
	register_native("nic", "n_nic");
	register_native("cokolwiek", "n_cokolwiek");
	register_native("moze_cos", "n_moze_cos");
}
//plugin - id pluginu
//params - ilość argumentów
public Float:n_nic(plugin, params){
	
}
public n_cokolwiek(plugin, params){
	
}
public n_moze_cos(plugin, params){
	
}

Funkcja nic ma nagłówek: native Float:nic();
=żadnych parametrów, a zwracać ma floata

skoro 'nic', to możemy zrobić np. to:
public Float:n_nic(plugin, params){
	return 0.0;
}



Funkcja cokolwiek korzysta z typu danych deklarowanego w samym incu. Nic nie stoi na przeszkodzie, aby go tu dołączyć. Problemy się zaczną, gdy będziemy wywoływać własne funkcje natywne w pluginie-bibliotece. Po prostu to nie przejdzie :D



w n_cokolwiek oczekujemy 2 parametrów id, i s; musimy mieć pewność, że są:



public n_cokolwiek(plugin, params){
 	if(params < 2){
 		log_amx("Zbyt malo parametrow funkcji cokolwiek!");
 		return 0;
 	}
 	return 1;

 }



Wartość samych parametrów pobrać nam pozwolą funkcje dla danego typu danych:



get_string(param, dest[], maxlen); // tekst

get_param(param); //komórka pamięci (int, char, bool)

Float:get_param_f(param); //float



get_param_byref(param); // komórka przez referencję

Float:get_float_byref(param); //float przez referencję



get_array(param, dest[], size); //tablica komórek

get_array_f(param, Float:dest[], size); //tablica float`ów




Jako, że tablice bez ‘const’ i jawne referencje pozwalają na zmianę wartości argumentów istnieją też odpowiedniki set_*



set_string(param, dest[], maxlen);


set_param_byref(param, value);

set_float_byref(param, Float:value);



set_array(param, const source[], size);

set_array_f(param, const Float:source[], size);






W każdym przypadku param to numer parametru licząc od lewej zaczynając od 1.





Skupmy się na pobieraniu. Natyw cokolwiek przekazuje id oraz stan:s. Ich wartości w n_cokolwiek to:



new id = get_param(1);
new stan:s = stan:get_param(2);


Aby zachować układ zmiennych i uniknąć ‘tag mismatch’ dokonałem rzutowania do stan:



Załóżmy, że id to index gracza, a funkcja pokazuje mu na czacie komunikat zależny od stanu COS/NIC. Biblioteka powinna teraz wyglądać tak:



#include <amxmodx>
 #include <amxmisc>
 #include <nicto>

 #define PLUGIN "NicTo Lib"
 #define VERSION "1.0"
 #define AUTHOR "R3X"


 public plugin_init() {
 	register_plugin(PLUGIN, VERSION, AUTHOR)
 }

 public plugin_natives(){
 	register_library("nicto");
 	register_native("nic", "n_nic");
 	register_native("cokolwiek", "n_cokolwiek");
 	register_native("moze_cos", "n_moze_cos");

 }
 //plugin - id pluginu
 //params - ilość argumentów
 public Float:n_nic(plugin, params){
 	return 0.0;
 }
 public n_cokolwiek(plugin, params){
 	if(params < 2){
 		log_amx("Zbyt malo parametrow funkcji cokolwiek!");
 		return 0;
 	}

 	new id = get_param(1);
 	if(!is_user_connected(id))
 		return 0;

 	new stan:s = stan:get_param(2);
 	switch(s){
 		case NIC: client_print(id, print_chat, "NIC");
 		case COS: client_print(id, print_chat, "COS");
 	default: return 0;
 	}
 	return 1;
 }

 public n_moze_cos(plugin, params){

 	

 }



Do pełniejszego obrazu natywu potrzebujemy danych z tego pluginu. Utwórzmy tablicę globalną giRandom [33], i przy wejściu na serwer przypiszmy graczowi losową liczbę 0-100.



Niech funkcja może_cos zwróci wartość tablicy z podanego indeksu (id) i wrzuci do logów wartości fTime i szMessage[].



public n_moze_cos(plugin, params){
 	if(params < 3){
 log_amx("Zbyt malo parametrow funkcji moze_cos!");
 		// -1 nie mieści się w przedziale 0-100, więc będzie można wychwycić błąd
 return -1; 
 	}

 	new id = get_param(1);
 	if(id < 0 || id > 32) //nie musi byc gracza, wystarczy ze jest taki indeks w tablicy
 		return -1;

 	new Float:fTime = get_param_f(2);
 	new szMessage[32];
 	get_string(3, szMessage, 31);
 	log_amx("fTime=%f, szMessage = %s",fTime, szMessage);

 	return giRandom[id];

 }

SMA(2)
Teraz pora na plugin, który będzie korzystał z biblioteki. Po prostu dołączamy <nicto> i używamy podanych funkcji np tak:

#include <amxmodx>
#include <amxmisc>
#include <nicto>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	log_amx("Nic:%f", nic());
	register_clcmd("say /cokolwiek","cmdCokolwiek");
}
public cmdCokolwiek(id){
	cokolwiek(id, NIC);
	moze_cos(id, 3.14, "Pi");
	return PLUGIN_CONTINUE;
}


Info:
ważne by plugin korzystający z biblioteki był niżej w plugins.ini niż sama biblioteka. W innym przypadku plugin korzystający z biblioteki musisz przefiltrować natywy:
set_native_filter

Załączone pliki


  • +
  • -
  • 45


#285946 true i false

Napisane przez Dwdov w 21.08.2011 12:01


if( tutaj_warunek_ze_wybral_jeden )
wybraljeden[id][1] = true
else
wybraljeden[id][1] = false

Cała filozofia, nie rozumiem z czym tu można mieć problem. Tylko przy deklaracji zmiennej

new bool:wybraljeden[33][4]

(numerki w klamrach sobie tak o wymyśliłem)


#257884 Funkcja Inteligencji

Napisane przez Goliath w 11.06.2011 17:26

ExecuteHam - funkcja wywołująca event z hamsandwich,
Ham_TakeDamage - wybrany event z hamsandwich (od niego zależą następne parametry),
pid - id gracza otrzymującego obrażenia,
ent - id bytu uszkadzającego,
attacker - id gracza zadającego obrażenia,
90.0+float(inteligencja_gracza[attacker]) - wartość obrażeń, podana we floacie,
1 - dodatkowe flagi.
  • +
  • -
  • 1


#257021 Co jest odpowiedzialne za bind?

Napisane przez Goliath w 08.06.2011 18:49

Można to dodać, choć i tak zadziała tu warunek:
    if (!ilosc_rakiet_gracza[id])
{
client_print(id, print_center, "Wykrzystales juz wszystkie rakiety!");
return PLUGIN_CONTINUE;
}

Więc nie będziesz mógł strzelać rakietami, jeżeli nie zdefiniowałeś dla klasy/itemu ilosc_rakiet_gracza[id] = ileśtam.
  • +
  • -
  • 1


#256988 Co jest odpowiedzialne za bind?

Napisane przez Goliath w 08.06.2011 17:07

To masz starego CoD'a, a nie nowego... W starym za używanie przedmiotów odpowiada to:
public EmitSound(id, iChannel, szSound[], Float:fVol, Float:fAttn, iFlags, iPitch ) 
{
if(equal(szSound, "common/wpn_denyselect.wav"))
{
UzyjPrzedmiotu(id);
return FMRES_SUPERCEDE;
}

return FMRES_IGNORED;
}

Czyli w skrócie - gdy graczowi odtworzy się dźwięk common/wpn_denyselect.wav (a tak się dzieje po naciśnięciu klawisza "E"), uruchomiona zostanie funkcja z odpalaniem rakiet itd.
  • +
  • -
  • 2


#211321 array index out of bounds (variable "player_class

Napisane przez LogiCC :D w 31.01.2011 16:07

Po 1. Wszystkiego nie naprawiłem.
Po 2. Jak rozdajesz staty to nie pisze jaki skill co robi, bo linijka była za długa.
Po 3. Masz bardzo bardzo namieszane w kodzie.
Po 4. Naprawiłem 2-5 błędy.

Załączone pliki


  • +
  • -
  • 1