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
 

Owner123 - zdjęcie

Owner123

Rejestracja: 12.10.2009
Aktualnie: Nieaktywny
Poza forum Ostatnio: 18.12.2011 18:32
*----

#144825 MySQL - z czym to się je.

Napisane przez G[o]Q w 17.06.2010 16:19

hmm zamiast pojemnik uzyl bym uchwyt ale to twoj tutek

a co do


native SQL_ThreadQuery(Handle:db_tuple, const handler[], const query[], const data[]="", dataSize=0);

to data to jakby tablica parametrow a dataSize to ich ilosc tak jak parametry w set_task o czym jest osobny poradnik

+ bo widac ze jednak sie nameczyles i dobrze jest to zrobione :D
  • +
  • -
  • 1


#144823 MySQL - z czym to się je.

Napisane przez R3X w 17.06.2010 16:14

Na pewno przydatny artykuł :)

Drobna poprawka
- SQL to nazwa języka, MySQL to popularna odmiana serwera, które potrafi przetwarzać zapytania w tym jezyku.
  • +
  • -
  • 1


#144137 Invalid string

Napisane przez G[o]Q w 14.06.2010 17:56

new szFile[512]

        new iFile

        get_configsdir(szFile, 511)

        format(szFile, 511, "%s/diablo_items.ini", szFile)

        

        if(!file_exists(szFile))

        {

                new error[101]

                formatex(error, 100, "Nie mozna otworzyc pliku: %s", szFile) // Linia 749

                set_fail_state(error)

                return

        }

  • +
  • -
  • 1


#139579 Cin i automatyczne wykonanie się fragmentu kodu.

Napisane przez R3X w 29.05.2010 11:38

jeśli automatycznie to np. WinApi (3.3) Mysz i klawiatura Paragraf

Wykorzystanie klawiatury


  • +
  • -
  • 1


#139597 Cin i automatyczne wykonanie się fragmentu kodu.

Napisane przez Miczu w 29.05.2010 12:37

if(getchar()=='q') funkcja();

Ale to będzie czekać aż coś wciśniesz (zawiesi program), by to ominąć... osobny wątek albo użyć innej biblioteki.

Ostatnio zacząłem bawić się z SDL, ma bardzo duże możliwości (ale składa się raczej z prostszych funkcji), pozwala na prace z: myszką, klawiaturą, dżojstik, ekranem, obrazami*, wątkami, audio, cd-rom, czasem, opóźnieniami, plikami... Z tego co wiem, wiele gier na tym powstało, jak coś mogę zapodać wszystkie linki co mam o SDL.
  • +
  • -
  • 1


#139608 Cin i automatyczne wykonanie się fragmentu kodu.

Napisane przez Gotar w 29.05.2010 12:58

Z tego co się domyślam, to chyba konsolowy program w c++ ?
Jeżeli tak, to masz ode mnie prosty przykład poniżej.
Jeżeli nie wiesz jaki kod ASCII ma dany znak, to wywołaj sobie funkcje znaki, która Ci je wyświetli.

Użyłem toupper w celu ignorowania wielkości liter, jeżeli potrzebujesz rozpoznać duze i małe osobno to po prostu usuń tą linijkę.

#include "stdafx.h"
#include <conio.h>
#include <iostream>

using namespace std;

void znaki()
{
	
	for(int i=0;i<255;i++)
	{
	cout<<i<<"\t"<<(char)i<<"\n";
	}
	
}
int _tmain(int argc, _TCHAR* argv[])
{
	int znak;
	znak=_getch();
	znak=toupper(znak);
	
	switch(znak)
	{

	case 89:
		{
			//tutaj co ma się wykonać po naciśnięciu y
			break;
		}
	case 84: 
		{
			//tutaj co ma się wykonać po naciśnięciu t
			break;	
		}


	}
	
	system("pause");
	return 0;
}


  • +
  • -
  • 1


#137866 Tworzenie bytu.

Napisane przez R3X w 23.05.2010 16:00

Po utworzeniu, a przez ustawianiem parametrów i spawnem warto sprawdzić czy byt udało się utworzyć. pev_valid
  • +
  • -
  • 1


#135772 Memory Access

Napisane przez R3X w 16.05.2010 20:55

rezerwujesz 64 bajty
new q_command[64]
i pakujesz tam długi tekst (sam nick może mieć 32 bajty)
format(q_command, 511, "INSERT INTO %s VALUES('%s', 'Brak', 0, 0);", g_sqlUserTable, name)

zwiększ bufor lub zmniejsz maxlen formata
  • +
  • -
  • 2


#120780 ExecuteHam

Napisane przez Miczu w 25.03.2010 22:18

ExecuteHam(Ham_TakeDamage, id2, CSW_KNIFE, id, 65.0, DMG_SLASH)

Zamiast CSW_KNIFE użyj entu który zadaje obrażenia (polecam gracza). Musisz lepiej sprawdzać działanie funkcji na google :F
  • +
  • -
  • 1


#120553 Zadawanie obrażeń.

Napisane przez R3X w 24.03.2010 00:09

fakemeta/engine można też na zasadzie set_user_health

przykład fm
set_pev(id. pev_health, pev(id, pev_health)-50.0);

  • +
  • -
  • 1


#120760 Zadawanie obrażeń.

Napisane przez kyku w 25.03.2010 20:15

mozesz stworzyc byt tigger_hurt w miejscu gdzie jest gracz :P
  • +
  • -
  • 1


#120517 Zadawanie obrażeń.

Napisane przez G[o]Q w 23.03.2010 20:29

hmm strzal z AK :?:

a tak na serio to mozesz AMX Mod X - Half-Life Scripting for Pros!
  • +
  • -
  • 1


#114224 Tworzenie pliku

Napisane przez Ortega w 24.02.2010 10:13

You can't read client's files. You can precache them though.


  • +
  • -
  • 1


#110507 Reputacja [Rangi]

Napisane przez mgr inż. Pavulon w 08.02.2010 11:09

Mniej niż zer0.		-1

zer0.			0

Nowy			1

Początkujący		10

Życzliwy		20

Pomocny			40

Zaawansowany		75

Profesjonalista		150

Wszechwidzący		225

Wszechpomocny		300

Wszechobecny		400

Wszechwiedzący		500

Wszechmogący		600

Guru			700

Czempion		800

Master			900

Hero			1000

SuperHero		1100

Godlike			1200

  • +
  • -
  • 11


#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