Skocz do zawartości
bocian941

Przydatne funkcje

Rekomendowane odpowiedzi

#define GetDistanceBetweenPoints(%0,%1,%2,%3,%4,%5) (((%0 - %3) * (%0 - %3)) + ((%1 - %4) * (%1 - %4)) + ((%2 - %5) * (%2 - %5)))

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Odlicz(playerid, czas);

Funkcja odlicza daną liczbę podaną w drugim argumencie.

forward Odlicz(playerid, czas);
public Odlicz(playerid, czas)
{
	new str[16];
	if(czas > 0)
	{
		format(str, sizeof(str), "%d", czas);
		GameTextForPlayer(playerid, str, 1000, 3);
		SetTimerEx("Odlicz", 1000, false, "d", czas-1);
	}
	else
	{
		GameTextForPlayer(playerid, "GO!", 2500, 3);
	}
}
Zastosowanie:
CMD:odlicz(playerid, params[])
{
	Odlicz(playerid, 5);
	SendClientMessage(playerid, kolor, "Odliczanie...");
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Funkcja zmieniająca nazwę pliku lub go kopiująca,

oldname - stara nazwa pliku

newname - nowa nazwa pliku

delold - czy ma usunąć stary plik po przekopiowaniu danych (domyślnie tak)

stock frename(const oldname[], const newname[], bool:delold = true)
{
	new File:x = fopen(oldname, io_read);
	if(!x)
		return false;
	new File:x2 = fopen(newname, io_write);
	if(!x2)
	{
		fclose(x);
		return false;
	}
	new data[256], len = fblockread(x, data);
	while(len)
	{
		fblockwrite(x2, data, len);
		len = fblockread(x, data);
	}
	fclose(x);
	fclose(x2);
	if(delold)
		fremove(oldname);
	return true;
}

jest to najszybsza taka funckja, szybciej można tylko zrobić to w plugin'ie lub zmieniając wielkość tablicy data

co więcej funkcja kopiuje każdy rodzaj plików, nie tylko tekstowe (testowałem to z typami plików .mp3 .avi .jpg) pliki zostały skopiowane bez problemów, ich treść została nienaruszona

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

CutString

funkcja dzieli tekst na 2 części po 64 znaki, jeśli tekst jest krótszy od 64 zwraca 0 i start_txt, inaczej zwraca 1 oraz dzieli do start_txt i end_txt.

stock CutString(str[], start_txt[], end_txt[])
{
	if(strlen(str) < 64)
	{
		strmid(start_txt, str, 0, 64, 70);
		return 0;
	}

	strins(end_txt, "...", 0, 70);
	strcat(end_txt, str[64], 70);

	strmid(start_txt, str, 0, 64, 70);
	strins(start_txt, "...", 64, 70);
	return 1;
}
Przykład:
public OnFilterScriptInit()
{
	new start_txt[70], end_txt[70], str[128] = "Sed quis adipiscing purus. Ut nulla turpis, mattis nec blandit sit amet, interdum eu mauris. Nam condimentum aliquet eros me.";

	CutString(str, start_txt, end_txt);

	printf("cz 1. %s\ncz 2. %s", start_txt, end_txt);
}
Wynik: [tt][17:51:11] Sed quis adipiscing purus. Ut nulla turpis, mattis nec blandit s... [17:51:11] ...it amet, interdum eu mauris. Nam condimentum aliquet eros me.[/tt] Przykład 2:
CMD:aa(playerid, params[])
{
	if(isnull(params)) return 1;

	new start_txt[70], end_txt[70];
	if(CutString(params, start_txt, end_txt))
		SendClientMessage(playerid, 0xFFAA00AA, start_txt);
	else
	{
		SendClientMessage(playerid, 0xFFAA00AA, start_txt);
		SendClientMessage(playerid, 0xFFAA00AA, end_txt);
	}
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zrobiłem mini-funkcję (w oparciu na znalezionej w internecie pod Delphi), zamieniającą liczby rzymskie na arabskie.

stock rzNaAr( liczba[ 11 ] )
{
	new
	    suma, cyfra, najw
	;

	for( new i = strlen( liczba ); i >= 0; i-- )
	{
	    switch( liczba[ i ] )
	    {
	        case 'I': cyfra = 1;
	        case 'V': cyfra = 5;
	        case 'X': cyfra = 10;
	        case 'L': cyfra = 50;
	        case 'C': cyfra = 100;
	        case 'D': cyfra = 500;
	        case 'M': cyfra = 1000;
		}

		if( cyfra >= najw )
		{
		    najw 	= cyfra;
		    suma    += najw;
		}
		else
		    suma    -= cyfra;
		    
	}

	return suma;
}

Szczerze mówiąc, nie wiem jak z optymalizacją, ale działa bardzo dobrze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Funkcja podobna do Slash'a, lecz ta może zamienić kilka znaków:

stock ReplaceCharacter(string[256], char1[], char2[])
{
	new
		str[256];
	memcpy(str, string, 0, 256 * 4);

	for(new i; i < strlen(str); i++)
	{
		new
			p = strfind(str[i], char1, true);
		if(p != -1)
		{
			strdel(str, p, p+strlen(char1));
			format(str[p], sizeof(str), "%s%s", str[p], char2);
		}
	}
	return str;
}
Użycie:
new 
	str[256] = "Edek z krainy kredek, lubi placki!";
print(ReplaceCharacter(str, "ed", "Ban(playerid)"));

Zwróci:

Ban(playerid)ek z krainy krBan(playerid)ek, lubi placki!

@down Sorry, zapomniałem zmienić z tym == -1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

IsVehicleWithNumberPlate(model)
{
	switch(model)
	{
		case 406, 417, 425, 430, 432, 435, 441, 444,
		446, 447, 449, 450, 452, 453, 454, 457, 460,
		464, 465, 468, 469, 471, 472, 473, 476, 481,
		484, 485, 486, 487, 488, 493, 494, 497, 501,
		502, 503, 509, 510, 511, 512, 513, 514, 519,
	 	520, 522, 528, 530, 531, 532, 537, 538, 539,
	 	548, 553, 563, 564, 568, 569, 570, 571, 572,
		573, 577, 583, 584, 590, 591, 592, 593, 594,
		595, 601, 605, 606, 607, 608, 610, 611:
		return 0;
  	}
	return 1;
}

Sprawdza czy pojazd ma tablice rejestracyjne czy nie. Zwraca 1 jeśli tak, 0 jeśli nie.

Trochę nie potrzebna, ale mi się przydało. :D

edit: poprawiłem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

frandom(Float:value)

Funkcja podobna do random tyle że losuje nam liczbę float (z przecinkiem), funkcja tak samo jak czyste random nie przyjmuje wartości ujemnych, reszta za przecinkiem nie powinna być dłuższa niż 6 cyfr (standardy PAWN)

stock Float:frandom(Float:value)
{
	new str[16], x[3];
	x[0] = floatround(value, floatround_tozero);
	x[2] = random(x[0]);
	if(x[0] - 1 == x[2])
	{
		format(str, sizeof str, "%f", value - x[0]);
		x[1] = strval(str[2]);
		format(str, sizeof str, "%d.%06d", x[2], random(x[1]));
	}
	else
	    format(str, sizeof str, "%d.%06d", x[2], random(1000000));

	return floatstr(str);
}
(by nie mieć problemów z tym że funkcja zwraca Float polecam dać ją w jakiś plik .inc lub pod linijkami #include)
#define IsLetter(%0) (toupper(%0) != tolower(%0))
#define UpLetter(%0) (%0 == toupper(%0))
#define LowLetter(%0) (%0 == tolower(%0))
Przypominam też że przy string'ach powinno dawać się nawias kwadratowy by określić którą literę sprawdzamy czyli np.
public OnPlayerText(playerid, text[])
{ // przykład jak zrobić by automatycznie gracz pisał z dużej litery
	new str[128];
	if(IsLetter(text[0]) && LowLetter(text[0]))
	{
		strcat(str, text);
		str[0] = toupper(str[0]);
		SendPlayerMessageToAll(playerid, str);
		return 0;
	}
	return 1;
}

IsLetter UpLetter LowLetter 3 funkcje define, pierwsza Is sprawdza czy dany znak jest literą, druga Up sprawdza czy znak jest dużą literą i trzecia Low sprawdza czy jest małą literą

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

stock SendClientFormatMessage(playerid, color, const msg[], {Float,_}:...)

Funkcja Formatuje Tekst i Go Wysyła.

playerid - Jakiemu Graczu

color - Kolor Wiadomości

const msg[] - Treść Wiadomości

Float... - Argumenty ;d

stock SendClientFormatMessage(playerid, color, const msg[], {Float,_}:...)
{
	new len = strlen(msg),d=0,posArg = 3;
 	new dest[512];
	for(new i=0;i<len;i++)
	{
	    if(msg[i] == '%')
	    {
	        switch (msg[i+1])
	        {
	            case 's':
				{
	   				new pos,arg,tmppos;
	   				new str[128];
	       			while(getarg(posArg,pos)!='\0')
	   				{
        				arg=getarg(posArg,pos++);
						str[tmppos]=arg;
      					tmppos++;
	       			}
				    strins(dest,str,d,strlen(str));
				    d+=strlen(str);
					posArg++;
					i++;
				}
	            case 'i', 'd':
				{
				    new str[128];
				    format(str,sizeof(str),"%d",getarg(posArg));
				    strins(dest,str,d,strlen(str));
				    d+=strlen(str);
					posArg++;
					i++;
				}
	            case 'f':
				{
				    new str[128];
				    format(str,sizeof(str),"%f",getarg(posArg));
				    strins(dest,str,d,strlen(str));
				    d+=strlen(str);
					posArg++;
					i++;
				}
				case '.':
				{
				    new len2 = msg[i+2];
				    if(len2 == 0)
					{
						dest[d] = msg[i];
						d++;
					}
					else
					{
					    new str[32],formatting[5];
					    formatting[0] = '%';
					    formatting[1] = '.';
					    formatting[2] = len2;
					    formatting[3] = 'f';
					    format(str,sizeof(str),formatting,getarg(posArg));
					    strins(dest,str,d,len2);
					    d+=len;
						posArg++;
						i+= 2;
					}
				}
				default:
				{
					dest[d] = msg[i];
					d++;
				}
			}
		}
		else
		{
			dest[d] = msg[i];
			d++;
		}
	}
	return SendClientMessage(playerid,color,dest);
}
Przykład:
SendClientFormatMessage(playerid,COLOR_GREEN,"Twoje ID to: %d",playerid);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

SendClientFormattedText

#define SendClientFormattedText(%0,%1,%3,%4) \
	new msg%0[128]; \
	format(msg%0,sizeof(msg%0),%3,%4); \
	SendClientMessage(%0,%1,msg%0)
Połączenie funkcji format i SendClientMessage w jednej. Obsługuje wszystkie możliwości domyślnego format czyli np. "%.2f" czy "%02d". Nie wiem po co się męczycie tak jak kolega wyżej :) Wystarczy prosta definicja. Ta funkcja na pewno działa bo sam jej używam. Przykład:
new l1=1, l2=2, l3=3, l4=4, l5=5;
new str[10];
str = "lol";
SendClientFormattedText(playerid, C_GREEN, "Liczby: %02d, %d, %d, %d, %02d i %s", l1, l2, l3, l4, l5, str);
//wyświetli: Liczby: 01, 2, 3, 4, 05 i lol

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

cformat(color)

stock cformat(COLOR)
{
	new str[9];
	COLOR = COLOR >>> 8;

	if (COLOR > 0x0FFFFF){
	    format(str, 9, "{%x}",COLOR);
	}else if (COLOR < 0x100000 && COLOR > 0x0FFFFF){
	    format(str, 9, "{0%x}", COLOR);
	}else if (COLOR < 0x010000 && COLOR > 0x000FFF){
	    format(str, 9, "{00%x}", COLOR);
	}else if (COLOR < 0x001000 && COLOR > 0x0000FF){
	    format(str, 9, "{000%x}", COLOR);
	}else if (COLOR < 0x000100 && COLOR > 0x00000F){
	    format(str, 9, "{0000%x}", COLOR);
	}else if (COLOR < 0x000010 && COLOR > 0x000000){
	    format(str, 9, "{00000%x}", COLOR);
	}
	return str;
}
Funkcje "Koloruje" tekst np:
new str[124];
format(str,sizeof(str),"Cos %s%d%s bla",cformat(COLOR_RED),playerid,cformat(COLOR_GREEN));
SendClientMessage(playerid,-1,str);

Efekt:

Coś 0 bla

COLOR_GREEN i COLOR_RED To Definicja Koloru ;d

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

antiAdvertisement


Funkcja wyszukuje niedozwolone znaki adresów IP np. 91.202.192.1, czy też stron typu http://www.google.com/

Zwraca wartość logiczną (true) lub (false).


Kod

forward bool:antiAdvertisement(const string[]);
bool:antiAdvertisement(const string[]) {
    static 
		RegEx:rIP,RegEx:rSite;	
    if (!rIP) { 
		rIP=regex_build("(.*?)([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})(.*?)");
    } else if (!rSite) { 
		rSite=regex_build([\\w-]*://)?([\\w-]+\\.)+([\\w-]+)(/[^\\s]*)*");
    }
	if (regex_match_exid(string,rIP)) return true;
	else if (regex_match_exid(string,rSite)) return true;
	else return false;
}

Przykładowy skrypt
// < Librares >
#include a_samp
#include regex

// < Forwards callbacks/funtions >
forward bool:antiAdvertisement(const string[]);

// < Callback >
public OnPlayerText(playerid,text[]) {
	if (antiAdvertisement(text)) {
		SendClientMessage(playerid,-1,"Reklamowanie lub przedstawianie strony, adresu IP jest co najmniej idiotyczne.");
		return false;
	}
	return false;
}

// < Function >
bool:antiAdvertisement(const string[]) {
    static 
		RegEx:rIP,RegEx:rSite;	
    if (!rIP) { 
		rIP=regex_build("(.*?)([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})(.*?)");
    } else if (!rSite) { 
		rSite=regex_build([\\w-]*://)?([\\w-]+\\.)+([\\w-]+)(/[^\\s]*)*");
    }
	if (regex_match_exid(string,rIP)) return true;
	else if (regex_match_exid(string,rSite)) return true;
	else return false;
}
Uwaga! Do poprawnego działania funkcji wymagana jest wtyczka regex.
TextDrawDestroyEx(&Text:td) {
	if (_:td!=_:INVALID_TEXT_DRAW) {
		TextDrawDestroy(td);
		td=INVALID_TEXT_DRAW;
	}
}
isNull(const string[]) {
	if (string[0]>255) {
		return string{0}=='\0'||(string[0]&0xFFFF0000)==0x01000000;
	} else {
		return string[0]=='\0'||string[0]=='\1'&&string[1]=='\0';
	}
}

TextDrawDestroyEx
Mini funkcja niszczy textdraw.
Kod
isNull
Bezpieczniejsza wersja niż ze znanej funkcji isnull, ta posiada również wsparcie dla zapakowanych "packed" łańcuchów znaków.
Kod

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PlayAudioStreamForAlLL [MIN SA-MP 0.3D]

Prosta funkcja pozwalająca na puszczanie dzwięku dla wszystkich graczy na raz. Wymagana wersja SA-MP'a min 0.3d


stock PlayAudioStreamForAll(dzwiek[])

{

for(new i; i != GetMaxPlayers(); i++)

{

if(IsPlayerConnected(i))

{

PlayAudioStreamForPlayer(i, dzwiek);

}

}

return 1;

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

createDB

Funkcja:


/**

* createDB

*

* Funkcja tworzy plik .db i jednoczesnie tabele oraz kolumny z argumentow.

*

* Argumenty:

* @DB:datebase plik bazy danych (.db)

* @table[] nazwa tabeli

* @Ostatni argument (...) Pozwala na uzycie

* wlasnych argumentwo np. ("nick varchar unique", "haslo varchar")

*

* Zwracanie: Jezeli zapytanie sie wykona to zwroci prawde w przeciwnym wypadku wyniesie falsz.

*

* @author AXV

* @date released 2012-09-29

*

* (C) 2012, AXV

*/


createDB(DB:datebase, table[], ...) {

new args = numargs();

static buf[1024], column[32], str[32];


buf[0] = '\0', column[0] = '\0', str[0] = '\0';

format(buf, sizeof(buf), "CREATE TABLE IF NOT EXISTS %s (", table);

for (new i = 1; i < args; i += 1) {

for (new j = 0; j < sizeof(column); j += 1)

column[j] = getarg(i, j);

if (!strcmp(column, table)) continue;


format(str, sizeof(str), "%s", column), strcat(buf, str);

if (!(i == (args - 1)))

strcat(buf, ", ");

else

strcat(buf, ")");

}


return _:db_query(datebase, buf);

}

Przyklad uzycia:

public OnFilterScriptInit() {

new DB:db = db_open("test.db");

createDB(db, "players", "nick varchar unique", "haslo varchar", "score int default '0'", "ip varchar default '0.0.0.0'");

return 1;

}

Edytowane przez AXV

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

getstr(str[],param,size)

Rozwinięcie funkcji getarg, pobiera cały string.

  • str[] - tablica docelowa
  • param - numer argumentu funkcji (to samo co w getarg)
  • size - to wielkość tablicy docelowej, najlepiej dać sizeof str
#define getstr(%0,%1,%2) for(new i, ch = getarg(%1, 0); i < (%2) && ch; i++, ch = getarg(%1, i))\
(%0)[i] = ch

Przykład:

//przykład: funkcja("mama");

funkcja(...)
{
new str[20];
getstr(str, 1, sizeof str);
print(str);
}
Wyświetli w konsoli mama Edytowane przez Mr_Auto

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

RandomNumbers(liczby[], losowan = sizeof(liczby))

Jest to funkcja losująca liczby niepowtarzające się

  • liczby[] - tablica w której zapiszą się nasze liczby
  • losowan - domyślnie funkcja wylosuje tyle liczb ile "pojemności" ma tablica


stock RandomNumbers(liczby[], losowan = sizeof(liczby)) // By RPS

{

for(new i; i<losowan;)

{

start:

liczby[i] = random(MAX)+1;

for (new j; j < i; j++)

{

if (liczby[j] == liczby[i])

goto start;

}

i++;

}

}

Przykład:

#include <a_samp>

#define MAX 36-1

//------------------------------------------------

public OnFilterScriptInit()

{

new l[20];

RandomNumbers(l);

printf("Pon: %d Wt: %d Sr: %d Czw: %d Pt: %d\nPon: %d Wt: %d Sr: %d Czw: %d Pt: %d\nPon: %d Wt: %d Sr: %d Czw: %d Pt: %d\nPon: %d Wt: %d Sr: %d Czw: %d Pt: %d\n",

l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8], l[9], l[10], l[11], l[12], l[13], l[14], l[15], l[16], l[17], l[18], l[19]);

return 1;

}

//------------------------------------------------

stock RandomNumbers(liczby[], losowan = sizeof(liczby)) // By RPS

{

for(new i; i<losowan;)

{

start:

liczby[i] = random(MAX)+1;

for (new j; j < i; j++)

{

if (liczby[j] == liczby[i])

goto start;

}

i++;

}

}

P.S.

Macie zryte układanie kodu...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Find player

Funkcja zwraca ID gracza po:

- nick'u

- adresie IP

Gdy gracz nie jest podłączony do serwera zwraca wartość INVALID_PLAYER_ID.

Domyślnie wyszukiwanie jest po nicku.

 

#define FIND_TYPE_NICK (0)
#define FIND_TYPE_IP (1)
 
findPlayer(who[], findType = FIND_TYPE_NICK) {
 
   if (!who[0])
      return INVALID_PLAYER_ID;
 
   new _player_data[MAX_PLAYER_NAME + 1];
 
   for (new i = GetMaxPlayers() - 1; i >= 0; i--) {
      if (IsPlayerConnected(i)) {
         if (findType == FIND_TYPE_NICK) 
            GetPlayerName(i, _player_data, sizeof (_player_data));
         else if (findType == FIND_TYPE_IP)
            GetPlayerIp(i, _player_data, sizeof (_player_data));
         
         if (strcmp(who, _player_data, false) == 0)
            return i;
      }
   }
 
   return INVALID_PLAYER_ID;
}

 

Użycie (wyszukiwanie gracza po nick'u):

new player = findPlayer("MalinowyKox"); // Wyszukujemy gracza o nick'u 'MalinowyKox' 
if (player != INVALID_PLAYER_ID) { // Gdy znaleziono gracza o podanym nicku
   // Kod, np.:
   Kick(player);
}

 

Użycie (wyszukiwanie gracza po adresie IP):

new player = findPlayer("1.2.3.4", FIND_TYPE_IP); // Wyszukujemy gracza o adresie IP '1.2.3.4'
if (player != INVALID_PLAYER_ID) { // Gdy znaleziono gracza o podanym adresie IP
   // Kod, np.:
   Kick(player);
}
Edytowane przez MalinowyKox

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Marko fpublic

Makro Definicja którą nazwałem fpublic, teraz już nie musimy pisać:

forward(x);
public(x)

 
wystarczy

fpublic(x)

 
 
Marko:
 

 

 

#define fpublic(%0) forward(%0); public(%0)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Marko fpublic

Makro Definicja którą nazwałem fpublic, teraz już nie musimy pisać:

forward(x);
public(x)

 

wystarczy

fpublic(x)

 

 

Marko:

 

 

 

#define fpublic(%0) forward(%0); public(%0)

Nie wiem, czy wiesz ale tutaj podajemy tylko przydatne funkcje a nie makrodefinicje... A to co podałeś jest tak banalne, że szkoda mi pisać tego postu...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
#define strtolower(%0) for(new l = strlen(string) - 1; l >= 0; l--)\
		string[l] = tolower(string[l]); 

Zmiana wielkości znaków na mniejsze - Jakie dokładnie? Na czacie? Jak to działa?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

new buf[48] = "KOT MA ALE, ALE ALA SIE SPOCILA I JEJ NIE MA.";
format (buf, sizeof (buf), "%s", strtolower (buf));
Otrzymamy: kot ma ale, ale ala sie spocila i jej nie ma.

@Edit: Proszę o usunięcie spamu i zostawienia postów z przydatnymi nam funkcjami.

Edytowane przez Hesse

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×