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
 

ZixI - zdjęcie

ZixI

Rejestracja: 30.04.2010
Aktualnie: Nieaktywny
Poza forum Ostatnio: 23.01.2012 19:18
-----

#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


#235429 Znacznik <select> a php

Napisane przez Pittero w 10.04.2011 21:59

Witam. Chodzi mi o to, jak podpiąć znacznik <select> pod skrypt php, a dokładniej - jeżeli w:
<select>
<option> 1 </option>
<option> 2 </option>
</select>
Wybiorę 1 - to weźmie pod uwagę np. zmienną $1, a jeżeli 2 to np. $2.
Naprowadźcie mnie na dobrą drogę :P

<form action="" method="post">
<select name="dzial" onchange="this.form.submit()">
<option value="">Wybierz dział</option>
<option value="kadry">Kadry</option>
<option value="ksiegowosc">Księgowość</option>
<option value="produkcja">Produkcja</option>
</select>
</form>
a w php
if($_POST['dzial'] == 'kadry')
{
echo "opcja kadry";
}

  • +
  • -
  • 1


#210083 Struktury

Napisane przez DarkGL w 27.01.2011 21:22

W temacie o enum R3X , goq i owner podjęli temat ale nie omówili go dokładnie :>
struktury tworzymy przy pomocy enum i operatora new pozwalają one w łatwy sposób w jednej tablicy przechowywać różne informacje Float,liczby całkowite,stringi według mnie po co rozbijać informacje o graczu na kilka różnych tablic jeśli można posługiwać się jedną ;)

Prosta struktura:


#include <amxmisc>

#define PLUGIN "DarkGL"
#define VERSION "1.0"
#define AUTHOR "Simple Structure"

enum player
{
userid,
deaths,
kills
}

new players[33][player]

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

register_clcmd("say /test","test")
}

public test(id){
players[id][userid] = get_user_userid ( id)
players[id][deaths] = get_user_deaths(id);
players[id][kills] = get_user_frags(id);
client_print(id,print_chat,"Twoje userid to : %d | Masz %d fragow i %d dedow",players[id][userid],players[id][kills],players[id][deaths])
}


nie ma jednak możliwości zrobienia czegoś takiego:

#include <amxmisc>

#define PLUGIN "DarkGL"
#define VERSION "1.0"
#define AUTHOR "Simple Structure"

enum player{
origin[3]
}

new players[33][player]

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

register_clcmd("say /test","test")
}

public test(id){
get_user_origin(id,players[id][origin])
client_print(id,print_chat,"Origin x,y,z : %d | %d | %d",players[id][origin][0],players[id][origin][1],players[id][origin][2])
}


chyba że zrobimy to tak:


#include <amxmisc>

#define PLUGIN "DarkGL"
#define VERSION "1.0"
#define AUTHOR "Simple Structure"

enum player{
origin[3]
}

new players[33][player]

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

register_clcmd("say /test","test")
}

public test(id){
new iTmp[3];
get_user_origin(id,iTmp)
players[id][origin][0] = iTmp[0];
players[id][origin][1] = iTmp[1];
players[id][origin][2] = iTmp[2];
client_print(id,print_chat,"Origin x,y,z : %d | %d | %d",players[id][origin][0],players[id][origin][1],players[id][origin][2])
}


Przechowywanie wartości Float
z tym trzeba już kombinowac :)


#include <amxmisc>
#include <fun>

#define PLUGIN "DarkGL"
#define VERSION "1.0"
#define AUTHOR "Simple Structure"

enum player{
speed
}

new players[33][player]

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

register_clcmd("say /test","test")
}

public test(id){
players[id][speed] = _:get_user_maxspeed(id);
client_print(id,print_chat,"Twoja predkosc to %f",Float:players[id][speed])
}

co robi znacznik _: zapraszm do tutoriala R3X na ten temat :)
Turorial _:

Stringi


#include <amxmisc>

#define PLUGIN "DarkGL"
#define VERSION "1.0"
#define AUTHOR "Simple Structure"

enum player{
nick[64]
}

new players[33][player]

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

register_clcmd("say /test","test")
}

public test(id){
new szName[64];
get_user_name(id,szName,charsmax(szName));
copy(players[id][nick],63,szName)
client_print(id,print_chat,"Twoj nick to %s",players[id][nick])
}


w linijce z instrukcja copy drugi parametr to ilosc znakow niestety nie da sie sprawdzic ile ma tablica zadeklarowana w enum
i to by było wszystko zachęcam do stosowania struktur w swoich pluginach
coś niejasne , piszcie :)
  • +
  • -
  • 17


#191146 Takie pytanko odnośnie

Napisane przez R3X w 23.11.2010 20:46

Pamiętaj o dokładnym wypełnieniu tablic klasy[][]

Załączone pliki


  • +
  • -
  • 1


#189541 Takie pytanko odnośnie

Napisane przez R3X w 18.11.2010 15:14

gdy przeczytasz już cały plik to możesz użyć wbudowanych funkcji jak SortCustom1D

możesz też zaoszczędzić na pamięci i zrobić proste sortowanie przez wstawianie, czyli czytasz element i sprawdzasz gdzie w Twojej tablicy Top15 powiedzmy możesz umieścić ten wpis. Program wyglądałby tak:

new TOP[15]
new Nazwa[32], Wartosc[32];


while ( czytaj(nazwa, wartosc)){
    for(new i=0;i<15;i++)
        if(Warosc > TOP[i])
            wstaw(Nazwa, Wartosc, i);
}
Taki pseudokod :P jak chcesz gotowy kod to źle zacząłeś temat
  • +
  • -
  • 1


#188891 Takie pytanko odnośnie

Napisane przez R3X w 15.11.2010 18:46

musisz przeszukać plik .value otwierając go binarnie

jeśli nie znasz / nie chcesz poznać schematu zapisu nVault to możesz skorzystać z gotowca: [INC] nVault Utility - AlliedModders
  • +
  • -
  • 1


#83575 Wpływanie na obrażenia

Napisane przez R3X w 21.09.2009 18:31

Wpływanie na obrażenia
używając modułu hamsandwich

Aby mieć możliwość edycji obrażeń należy złapać zdarzenie Ham_TakeDamage z post=0

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>

#define PLUGIN "HamSandwich Damage"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_TakeDamage, "player","fwTakeDamage",0);
}

event łapiemy w funkcji (ja nazwałem ją "fwTakeDamage"), której parametry są następujące
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	return HAM_IGNORED;
}

this - atakowany gracz
idinflictor - byt zadający obrażenia
idattacker - byt powodujący obrażenia
damage - wielkość obrażeń
damagebits - typ obrażeń

jeśli idattacker to gracz zazwyczaj idinflictor to również id atakującego, wyjątek stanowi granat: w tym przypadku idinflictor to indeks bytu granatu
w przeciwnym razie (!is_user_connected(idattacker)), idinflictor może być bytem typu trigger_hurt lub po prostu 0

damagebits przekazuje informacje o obrażeniach na podstawie składowych flag:
#define DMG_GENERIC                     0           // Generic damage was done
#define DMG_CRUSH                       (1<<0)      // Crushed by falling or moving object
#define DMG_BULLET                      (1<<1)      // Shot
#define DMG_SLASH                       (1<<2)      // Cut, clawed, stabbed
#define DMG_BURN                        (1<<3)      // Heat burned
#define DMG_FREEZE                      (1<<4)      // Frozen
#define DMG_FALL                        (1<<5)      // Fell too far
#define DMG_BLAST                       (1<<6)      // Explosive blast damage
#define DMG_CLUB                        (1<<7)      // Crowbar, punch, headbutt
#define DMG_SHOCK                       (1<<8)      // Electric shock
#define DMG_SONIC                       (1<<9)      // Sound pulse shockwave
#define DMG_ENERGYBEAM                  (1<<10)     // Laser or other high energy beam 
#define DMG_NEVERGIB                    (1<<12)     // With this bit OR'd in, no damage type will be able to gib victims upon death
#define DMG_ALWAYSGIB                   (1<<13)     // With this bit OR'd in, any damage type can be made to gib victims upon death.
#define DMG_DROWN                       (1<<14)     // Drowning
#define DMG_PARALYZE                    (1<<15)     // Slows affected creature down
#define DMG_NERVEGAS                    (1<<16)     // Nerve toxins, very bad
#define DMG_POISON                      (1<<17)     // Blood poisioning
#define DMG_RADIATION                   (1<<18)     // Radiation exposure
#define DMG_DROWNRECOVER                (1<<19)     // Drowning recovery
#define DMG_ACID                        (1<<20)     // Toxic chemicals or acid burns
#define DMG_SLOWBURN                    (1<<21)     // In an oven
#define DMG_SLOWFREEZE                  (1<<22)     // In a subzero freezer
#define DMG_MORTAR                      (1<<23)     // Hit by air raid (done to distinguish grenade from mortar)
#define DMG_TIMEBASED                   (~(0x3fff)) // Mask for time-based damage
np.
if(damagebits&DMG_BLAST){ //gracz prawdopodobnie zginął od wybuchu bomby
}

Zarejestrowanie Ham_TakeDamage z post = 0 daje możliwość ingerencji w przebieg tego wydarzenia.

Możemy po prostu anulować obrażenia przez zwrócenie HAM_SUPERCEDE lub HAM_OVERRIDE
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	return HAM_SUPERCEDE;
}

albo zmienić dowolny parametr funkcji przy użyciu funkcji SetHamParam*, gdzie * to typ argumentu.

SetHamParamInteger - dla liczby całkowitej
SetHamParamFloat - dla liczby rzeczywistej
SetHamParamVector - dla wektora (Float:v[3])
SetHamParamEntity - dla bytu (np. id gracza)
SetHamParamString - tekst

Po operacjach zwracamy HAM_HANDLED, aby zatwierdzić zmiany.

Przykład:
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
	SetHamParamFloat(4, 100.0);
	return HAM_HANDLED;
}
Zmieniamy czwarty argument (damage) typu Float: na 100.0, co spowoduje, że praktycznie każde uderzenie czy upadek skończy się śmiercią.

W połączeniu z warunkami daje to nam całkowitą kontrolę nad obrażeniami.


Uwaga:
Broń z jakiej zadane zostały obrażenia (przy podłączony idattacker) to:
- w przypadku idinflictor==idattacker
new bron = get_user_weapon(idattacker);
- w przypadku idinflictor!=idattacker
new bron = CSW_HEGRENADE;

  • +
  • -
  • 25


#173204 Counter Fortress

Napisane przez Kemsan w 21.09.2010 20:23

Dołączona grafika
Witam! Po rocznej absencji w sprawie moda chciałbym znów napisać temat i przedstawić coś nad czym działam spory czas, a za skończenie biorę się dopiero teraz - mianowicie TF2 mod dla Counter Strike 1.6 (ofc. nazwa modu to Counter Fortress).
Mod napisany jest w Pawn - AMXX i może współpracować z innymi pluginami.

Co oferuje?
Praktycznie przeniesionego TF2 do silnika HL1 - CS 1.6, odwzorowałem większość rzeczy z tf'a - prócz komend radiowych (nie są one potrzebne, prócz sławnego MEDIC!) oraz tauntów, bo to jest praktycznie niewykonywalne. Wszystko inne - począwszy on sentry, skończywszy na ubercharge jest i działa.

Co w przyszłości?
W przyszłości mam zamiar dodać achievementy i bronie dodatkowe - na początek zrobię coś innego - nie "wydam" paczek tych od VALVE ( czyli Medic update itd.) tylko nowiuśkie bronie prosto z mego dłuta - w końcu wyróżniać się trza!

3x filmiki na zachętę (2 filmik pokazuje stary wygląd sentry, 3 pokazuje już normalny :) )
http://www.youtube.com/watch?v=N4ud_VsUPxs
http://www.youtube.com/watch?v=lAg1DKl5tJE
http://www.youtube.com/watch?v=ju76K_p333M
http://www.youtube.com/watch?v=um_-OsRhbBw
  • +
  • -
  • 2


#116768 Sprawdzanie liczby klamer w funkcjach

Napisane przez mgr inż. Pavulon w 06.03.2010 14:50

Bracket Counter by Pavulon 4 amxx.pl

Jest to mały programik napisany w Delphi 7 mający na celu sprawdzenie czy dana funkcja (public lub stock) posiada taką samą liczbę klamer otwierających "{" co zamykających "}". W przypadku gdy liczby te są różne wyświetla stosowną informację w której funkcji klamry się nie zgadzają.

Dołączona grafika


Znane błędy:
Program nie radzi sobie z dyrektywami preprocesora #if constant expression, #elseif, #else, #endif
Ma problemy jeżeli dyrektywy zaczynają się poza funkcjami

Załączone pliki


  • +
  • -
  • 29


#165485 DeathRun Timer + Save Records

Napisane przez Knopers w 29.08.2010 14:20

Plugin : DeathRun Timer + Save Records v2.1
Autor : Knopers UnBugged by Owner123



Opis :
Plugin odmierza każdemu (w CT) czas od spawnu aż do zabicia siebie lub zabicia terrorysty.
Po zabiciu terrorysty wyświetla wszystkim kolorową wiadomość z czasem jakim przeszedł dany gracz mapę.
Dodatkowo Plugin zapisuje najlepszy czas mapy (rekord). Można go zobaczyć wpisując w say /best.
Rekordy zapisują się w Nvaulcie lub Bazie MySQL.
Plugin posiada również funkcję tworzenia przycisków Startu i Końca.


Opis przycisków: Jeśli postawicie start a konca nie to koniec będzie w momencie zabicia TT, jeśli postawicie koniec a początku nie to początek będzie po zrespieniu się, jeśli żadnego nie ustawicie będzie wszystko po staremu.
Przyciski posiadają model c4 czyli paki jeśli chcecie mieć własne wystarczy w pliku timer.sma zmienić linijkę
//#define _CustomButtons
na
#define _CustomButtons
Po kompilacji modele będą brane z dwóch ścieżek :
"models/drtimer/button_start.mdl"
"models/drtimer/button_end.mdl"
aby je zmienić trzeba edytować plik timer/button.inl.
Uwaga!! Aby przyciski działały, zapisywały się należy utworzyć folder o nazwie "drtimer" w addons/amxmodx/configs

Moduły : nvault or mysql, hamsandwich, engine, fakemeta

Komenda : /best
Komenda dla admina : /drtimermenu - Otwiera menu ustawiania przycisków (Flaga ADMIN_CFG)

Cvar : amx_timer_type "2" //1 - Timer wyświetlany w hud, 2- Timer wyświetlany w statusie (pod sayem)

Standardowo Plugin ustawiony jest na zapis do Nvaulta aby to zmienić należy edytować plik timer.sma :
Znaleźć:
#define RecordsSaveTo 1 // 1 - Nvault, 2 - MySQL (Standardowo linijka 10)
Zamienić na :
#define RecordsSaveTo 2 // 1 - Nvault, 2 - MySQL
Skompilować i zainstalować.

Cvary w trybie MySQL :

timer_sql_host "127.0.0.1" //Host MySQL'a
timer_sql_user "root" //Użytkownik MySQL
timer_sql_pass "password" //Hasło Użytkownika MySQL
timer_sql_database "baza123" //Nazwa Bazy danych

Changelog
v 1.0 - Pierwsza wersja
v 1.1 - Poprawiony Bug przy zapisie do Nvault
v 1.2 - Dodany tryb zapisu MySQL
v 1.3 - Dodano Dodatkowe komunikaty oraz czas gracza obserwowanego (po śmierci lub na spect.)
v 2.0 - Dodano możliwość tworzenia guzików startu i końca + naprawiono kilka bugów.
v 2.1 - Poprawione Bugi Guzików oraz Naliczana Czasu (by Owner)
WWW Stats (Tylko pod zapis do MySQL'a)
Statystyki pisane od zera by Me :P
Cała Konfiguracja statystyk znajduje się w pliku config.php (wszystko opisane).
Nie wymaga żadnej instalacji wystarczy wrzucić na serwer www i działa (oczywiście jeśli wszystko jest skonfigurowane)

Dodałem statystyki ponieważ niektórzy już mi chcą flaki wyrwać i zamęczyć mnie na śmierć więc nie czepiać się o wygląd i nieczytelność/nie optymalność kodu w plikach *.php .

Demo: http://knopers.com.pl/stat/

Download: Załączony plik  stat.rar   126,98 KB  704 Ilość pobrań
Załączony plik  stat.rar   127 KB  2790 Ilość pobrań


PS: Przyciski jak by ktoś chciał to można pobrać stąd: Załączony plik  models.rar   5,96 KB  2768 Ilość pobrań


Zakaz kopiowania na inne fora bez podania źródła oraz autora pluginu

Załączone pliki


  • +
  • -
  • 30


#102376 Amx_Give Pomocy.

Napisane przez Adminek AMXX.PL w 30.12.2009 10:40

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Rozumiem że problem rozwiązany

Jeśli się z tym nie zgadzasz, zgłoś ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL


#171848 Przechwycenie rzutu granatem

Napisane przez G[o]Q w 17.09.2010 17:28

public plugin_init() {
    register_event("SendAudio","rzucil_granat","bc","2=%!MRAD_FIREINHOLE")
}

public rzucil_granat(){
             new id = read_data(1)
}
jesli chcesz sprawdzic jaki granat rzucony zostal to mozesz uzyc get_grenade() zwracajaca index bytu granata :D
  • +
  • -
  • 1


#163722 Prośba o kawałek kodu :)

Napisane przez Knopers w 25.08.2010 10:09

chyba najlepszy sposób :

#include <amxmodx>
#include <fun>
#include <hamsandwich>

new cvar;
new bool:gmm = false;
public plugin_init()
{
cvar = register_cvar("god_mode_map", "de_dust2");
RegisterHam(Ham_Spawn, "player", "SpawnPlayer", 1);
}
public plugin_cfg()
{
new sMap[33], sCvarMap[33];
get_mapname(sMap, 32);
get_pcvar_string(cvar, sCvarMap, 32);
if(equal(sMap, sCvarMap))
gmm = true;
}
public SpawnPlayer(id)
{
if(gmm)
set_user_godmode(id, 1);
}

  • +
  • -
  • 1


#26162 Tłumaczenie funkcji

Napisane przez grankee w 01.12.2008 10:06

Tutorial będzie edytowany w miarę mojego wolnego czasu

Funkcje Core-tłumaczenie:


access ( id, level ) -sprawdza czy dany gracz ma daną flagę
*id to numer gracza
*level to flaga gracza jaką chcemy sprawdzić (np. ADMIN_KICK)
#Zwraca wartość false jeśli gracz nie ma danej flagi lub true jeśli ją ma.

Przykład:
if(access(id,ADMIN_LEVEL_C))
         client_print(id,print_chat,"TAK")
else
         client_print(id,print_chat,"NIE")
W rezultacie jeśli gracz posiada flage "o(admin_level_c)" zostanie mu wypisane TAK, jeśli nie posiada zostanie wypisane mu NIE


////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////




add ( dest[], len, const src[], [ max ] ) -dodaje jeden napis do drugiego
*dest[] to tablica znaków do której będziemy dodawać (po wykonaniu operacji napis docelowy) tak więc musi ona mieć taką wielkość, aby po dodaniu drugiego napisu(być może i trzeciego oraz czwartego itd) ilość znaków napisu docelowego nie była większa niż wielkość tej tablicy.
*len to maksymalna długość docelowego wyrazu
*const src[] to napis, który chcemy dodać do drugiego (do dest[])
*[ max ] to maksymalna ilość znaków z tablicy const src[], którą pozwalamy dodać do dest[]
#Zwraca długość napisu wyjściowego

Przykład:
new napis[32]="To jest napis testowy" //ad1
new napisik[]="-a-to drugi" //ad2
new ile=add(napis,sizeof(napis),napisik,sizeof(napisik)) //ad3

ad1) tablica przewiduje 32 znaki, czyli dokładnie tyle ile potrzebujemy aby zmieścić te dwa napisy, jeśli nie będziemy pewni ile miejsc może nam to zając (wartości do tablic zostaną przypisane w czasie działania pluginu(np. get_user_name-nick może być różnej długości)) najlepiej jest przewidzieć maksymalną możliwą długość.

ad2)może to być też tablica o określonej ilości znaków, jeśli będziemy chcieli sczytać do niej np. nick

ad3)funkcja zwraca długość docelowego napisu(po dodaniu), użycie funkcji sizeof pozwala nam sprawdzić jaką ma długość(może mieć różną zależnie od potrzeb, może być sczytany nick-nie wiemy wtedy jaką będzie miał długość-sprawdzamy ją funkcją sizeof)dany napis i takiej długości używamy-dość optymalne rozwiązanie i chyba jedyne w przypadku kiedy pisząc plugin nie możemy przewidzieć jaką długość będzie miał nasz string. Jak widać tutaj jako maksymalną długość napisu wyjściowego mamy wielkość tablicy dest, która jak wcześniej pisałem musi przewidzieć maksymalną długość docelowego napisu.










////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////










AddMenuItem
callfunc_begin
callfunc_begin_i
callfunc_end
callfunc_push_float
callfunc_push_floatrf
callfunc_push_int
callfunc_push_intrf
callfunc_push_str
change_task
clamp



////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////





client_authorized(id) - funkcja wywoływana zaraz po client_connect(id), jednak w momencie gdy już gracz zostaje wpuszczony na serwer i zostały mu już przydzielone odpowiednie flagi
*id - numer gracza, który został rozpoznany

Przykład:

public client_authorized(id)
{
       set_user_name(id,"Polaczylem sie")
}


////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////



client_cmd(index,const command[]) - wykonuje komendę w consoli gracza.
*index to id gracza(1-32 (0 aby wykonać u wszystkich)), któremu chcemy w consoli wykonać komendę.
const command[] -komenda jaką chcemy wykonać

Przykład:
client_cmd(0,"volume 0")
lub
new nick[]="Nick testowy"
 
client_cmd(0,"%s",nick)





////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////



client_command(id) -wywoływana jeśli gracz użyje komendy w swojej konsoli (nie działa dla wszystkich)
*id - id gracza, który wykonał komende
#Do użycia w public

Przykład:(wpisaliśmy w consoli komenda_testowa test tescik testunio testowo)
public client_command(id)
{
	new komenda[19],arg1[12],arg2[12],arg3[12],arg4[12],linijka[128]
	
	read_argv(0,komenda,18)
	read_argv(1,arg1,11)
	read_argv(2,arg2,11)
	read_argv(3,arg3,11)
	read_argv(4,arg4,11)
	read_args(linijka,127)
	new ile_argumentow=read_argc()
	
	client_print(id,print_chat,"komenda:%s",komenda)
	client_print(id,print_chat,"arg1:%s",arg1)
	client_print(id,print_chat,"arg2:%s",arg2)
	client_print(id,print_chat,"arg3:%s",arg3)
	client_print(id,print_chat,"arg4:%s",arg4)
	client_print(id,print_chat,"linijka:%s",linijka)
	client_print(id,print_chat,"ilosc:%d",ile_argumentow)
}
W wyniku takiej operacji zostanie wypisane nam:
komenda:komenda_testowa //komenda-czyli pierwszy wyraz jaki wpiszemy
arg1:test //pierwszy argument jaki podaliśmy
arg2:tescik //drugi argument jaki podaliśmy
arg3:testunio //trzeci argument jaki podaliśmy
arg4:testowo //czwarty argument jaki podaliśmy
linijka:test tescik testunio testowo //wszystkie argumenty jakie podaliśmy
ilosc:5 //ilość wszystkich argumentów (łącznie z komendą)

Oczywiście nie ma obowiązku zczytywania dokładnie 4 argumentów a jedynie tylu ile nam potrzeba, może to być 1, a może i 10.





////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////




client_connect(id) - wykonuje się w momencie kiedy wykryto próbę połączenia się gracza
*id to numer gracza którego połączenie się wykryto

Przykład:
public client_connect(id)
{
     server_cmd("echo ^"gracz o id=%d laczy sie^"",id)
}




////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////





client_disconnect(id) - wykonuje się w momencie gdy gracz opuszcza serwer
*id to numer gracza który opuszcza serwer

Przykład:
public client_disconnect(id)
{
     server_cmd("echo ^"gracz o id=%d opuscil serwer^"",id)
}




////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

client_infochanged
client_print
client_putinserver
close_dir
cmd_access
cmd_target
colored_menus
console_cmd
console_print
contain
containi
copy
copyc
cstrike_running
cvar_exists
date
delete_file
dir_exists
emit_sound
engclient_cmd
engclient_print
equal
equali
fclose
feof
fflush
fgetc
fgetf
fgeti
fgetl
fgets
file_exists
file_size
find_player
find_plugin_byfile
float
floatabs
floatacos
floatadd
floatasin
floatatan
floatatan2
floatcmp
floatcos
floatdiv
floatfract
floatlog
floatmul
floatpower
floatround
floatsin
floatsqroot
floatstr
floatsub
floattan
float_to_str
fopen
force_unmodified
format
format_args
format_time
fputc
fputf
fputi
fputl
fputs
fread
fseek
ftell
funcidx
fwrite
getarg
get_array
get_array_f
get_basedir
get_clcmd
get_clcmdsnum
get_concmd
get_concmdsnum
get_configsdir
get_cvar_flags
get_cvar_float
get_cvar_num
get_cvar_string
get_datadir
get_distance
get_distance_f
get_flags
get_float_byref
get_func_id
get_gametime
get_localinfo
get_mapname
get_maxplayers
get_modname
get_module
get_modulesnum
get_param
get_param_byref
get_param_f
get_players
get_playersnum
get_plugin
get_pluginsnum
get_srvcmd
get_srvcmdsnum
get_string
get_systime
get_time
get_timeleft
get_user_aiming
get_user_ammo
get_user_armor
get_user_attacker
get_user_authid
get_user_deaths
get_user_flags
get_user_frags
get_user_health
get_user_index
get_user_info
get_user_ip
get_user_menu
get_user_msgid
get_user_name
get_user_origin
get_user_ping
get_user_team
get_user_time
get_user_userid
get_user_weapon
get_user_weapons
get_vaultdata
get_weaponname
get_xvar_float
get_xvar_id
get_xvar_num
heapspace
inconsistent_file
isalnum
isalpha
isdigit
isspace
is_dedicated_server
is_linux_server
is_map_valid
is_module_loaded
is_plugin_loaded
is_running
is_user_admin
is_user_alive
is_user_bot
is_user_connected
is_user_connecting
is_user_hltv
jit_enabled
log_amx
log_error
log_message
log_to_file
max
md5
md5_file
menu_additem
menu_create
menu_display
menu_find_id
menu_items
menu_item_getinfo
menu_item_setcall
menu_item_setcmd
menu_item_setname
menu_makecallback
menu_pages
message_begin
message_end
min
next_file
numargs
num_to_str
num_to_word

open_dir
param_convert
parse
parse_loguser
parse_time
pause
plugin_cfg
plugin_end
plugin_flags
plugin_init
plugin_log
plugin_modules
plugin_natives
plugin_pause
plugin_precache
plugin_unpause
power
precache_model
precache_sound
query_client_cvar
random
random_float
random_num
read_argc
read_args
read_argv
read_data
read_datanum
read_dir
read_file
read_flags
read_logargc
read_logargv
read_logdata
register_clcmd
register_concmd
register_cvar
register_dictionary
register_event
register_library
register_logevent
register_menu
register_menucmd
register_menuid
register_native
register_plugin
register_srvcmd
remove_cvar_flags
remove_quotes
remove_task
remove_user_flags
remove_vaultdata
replace
require_module
rewind
server_cmd
server_exec
server_print
setarg
setc
set_array
set_array_f
set_cvar_flags
set_cvar_float
set_cvar_num
set_cvar_string
set_error_filter
set_float_byref
set_hudmessage
set_localinfo
set_param_byref
set_string
set_task
set_user_deaths
set_user_flags
set_user_frags
set_user_info
set_vaultdata
set_xvar_float
set_xvar_num
show_activity
show_hudmessage
show_menu
show_motd

sqroot
strbreak
strcat
strcmp
strfind
strlen
strpack
strtolower
strtoupper
strunpack
str_to_float
str_to_num
swapchars
task_exists
tickcount
time
tolower
toupper
trim
ucfirst
unlink
unpause
user_has_weapon
user_kill
user_slap
vaultdata_exists
write_angle
write_byte
write_char
write_coord
write_entity
write_file
write_long
write_short
write_string
xvar_exists
  • +
  • -
  • 1


#16428 a++ czy ++a?

Napisane przez grankee w 21.09.2008 21:11

Zapewne wielu z was spotkało się z czymś takim:
zmienna++
oraz takim
++zmienna

Wielu z was pewnie zastanawiało się jaka jest różnica.

Różnica polega na tym, że jeśli damy ++zmienna to najpierw zmienna zwiększy się o 1 a dopiero po tym zostanie użyta, a jeśli damy zmienna++ to najpierw zmienna zostanie użyta a dopiero po tym zwiększy się o 1.

Podam przykład:
new a=4     //tutaj a = 4
new b=++a     //tutaj a zwiększa się o 1 i ta wartość zostaje przypisana do b (czyli a+1=4+1=5):b=5
new c=7    //tutaj c=7
new d=c++     //tutaj wartość c (czyli 7) zostaje przypisana do d (czyli d=7) a następnie wartość c zostaje zwiększona o 1 (c=8, ale d=7)


Mam nadzieję, że pomoże to niektórym :)
  • +
  • -
  • 5