Skocz do zawartości
bocian941

Przydatne funkcje

Rekomendowane odpowiedzi

Muszę się przyznać, że o tym nie wiedziałem. Sądziłem, że te funkcje, które posiadają referencje jako parametry nie zwracają żadnych wartości. Dzięki za tą cenną informację :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Floatexp

Składnia:

stock Float:floatexp(Float:value);
Argumenty:

Funkcja przyjmuje jeden argument za pomocą którego określa wykładnik funkcji ekspotencjalnej.

Zwracanie:

Funkcja zwraca wartość funkcji ekspotencjalnej dla określonego wartościowania.

Przykładowo weźmy liczbę 5 - po użyciu tej funkcji, otrzymamy: 148.413192

Uwaga! Funkcja zwróci wynik bez przepełnienia wartości.

Źródło:

forward stock Float:floatexp(Float:value);
stock Float:floatexp(Float:value) {
	new Float:sum=1.0+value,
		Float:term=value;
	
	for(new i=2; i<50 /* 50, by uniknac przepelnien */; i++) {
		term=term*value/i;
		sum=sum+term;
	}
	return sum;
}
Uwagi:

Funkcja ekspotencjalna jest to funkcja wykładnicza, w której podstawa jest równa stałej Eulera e.

Na koniec, do czego funkcja może się nam przydać? A na przykład do zaprogramowania ruchu ukośnego z oporem wiatru, przykład takiego kodu:

#define PI_REVERSE 3.1415926/180.0

// PSYHICS::RUCH Z OPOREM WIATRU
stock Float:psyhics::ruch_z_oporemwiatru(Float:m, Float:v, Float:alfa, Float:c, Float:dt) {
	new Float:x=0.0, Float:y=0.0,
		Float:t=0.0,
		Float:r, Float:r1,
		n,
		Float:g=9.81; // przyspieszenie ziemskie
		
	r=c/m;
	r1=m*v/c;
	new Float:co=floatcos(PI_REVERSE*alfa);
	new Float:si=floatsin(PI_REVERSE*alfa);
	
	do {
		x=r1*co*(1+floatexp(-r*t));
		y=(r*1*si+g/(r*r))*(1-floatexp(-r*t))-g*t/r;
		// tutaj na przyklad poruszanie obiektem:
		MoveDynamicObject(object, 1.0+x, 1.0+y, 4.0+x/y, v, si*90, si*-si, co*co);
		t=t+dt;
		n++;
	} while(t<2.0);
}
Edytowane przez l0nger

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie jest to funkcja lecz pewna łatka. Ponieważ w SA-MP wpisując np. {FFFFFF} wysylamy pusty string dzięki czemu możemy rozwiązać (na nie których serverach) test reakcji, przepisać kod itp. 

Wiec postanowiłem Wam to tu dać. 

 

Na początek OnPlayerText dajemy. 

	if(!text[0])
	{
		SendClientMessage(playerid, 0xFFFFFFCC, " »(E) Nie możesz wysłać pustej wiadomości. :(");
		
		
		return 0;
	}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PreloadAnimLibraries

Funkcja wczytuje wszystkie biblioteki animacji, dzięki czemu animacje nie będą się uruchamiać za drugim razem, tylko za pierwszym.

new const AnimLibraries[][] =

{

	"AIRPORT","Attractors","BAR","BASEBALL","BD_FIRE","BEACH","benchpress",

	"BF_injection","BIKED","BIKEH","BIKELEAP","BIKES","BIKEV","BIKE_DBZ","BMX",

	"BOMBER","BOX","BSKTBALL","BUDDY","BUS","CAMERA","CAR","CARRY","CAR_CHAT",

	"CASINO","CHAINSAW","CHOPPA","CLOTHES","COACH","COLT45","COP_AMBIENT",

	"COP_DVBYZ","CRACK","CRIB","DAM_JUMP","DANCING","DEALER","DILDO","DODGE",

	"DOZER","DRIVEBYS","FAT","FIGHT_B","FIGHT_C","FIGHT_D","FIGHT_E","FINALE",

	"FINALE2","FLAME","Flowers","FOOD","Freeweights","GANGS","GHANDS",

	"GHETTO_DB","goggles","GRAFFITI","GRAVEYARD","GRENADE","GYMNASIUM",

	"HAIRCUTS","HEIST9","INT_HOUSE","INT_OFFICE","INT_SHOP","JST_BUISNESS",

	"KART","KISSING","KNIFE","LAPDAN1","LAPDAN2","LAPDAN3","LOWRIDER",

	"MD_CHASE","MD_END","MEDIC","MISC","MTB","MUSCULAR","NEVADA","ON_LOOKERS",

	"OTB","PARACHUTE","PARK","PAULNMAC","ped","PLAYER_DVBYS","PLAYIDLES",

	"POLICE","POOL","POOR","PYTHON","QUAD","QUAD_DBZ","RAPPING","RIFLE","RIOT",

	"ROB_BANK","ROCKET","RUSTLER","RYDER","SCRATCHING","SHAMAL","SHOP",

	"SHOTGUN","SILENCED","SKATE","SMOKING","SNIPER","SPRAYCAN","STRIP",

	"SUNBATHE","SWAT","SWEET","SWIM","SWORD","TANK","TATTOOS","TEC","TRAIN",

	"TRUCK","UZI","VAN","VENDING","VORTEX","WAYFARER","WEAPONS","WUZI"

};

#define PreloadAnimLibraries(%0) for(new i; i < sizeof AnimLibraries; i++)\

	ApplyAnimation(%0, AnimLibraries[i], "null", 0.0, 0, 0, 0, 0, 0);

Jak tutaj pozbyć się warningu:

warning 203: symbol is never used: "AnimLibraries"

Edytowane przez Drakon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Daj tak:

#define PreloadAnimLibraries(%0) for(new i; i < sizeof AnimLibraries; i++) { ApplyAnimation(%0, AnimLibraries[i], "null", 0.0, 0, 0, 0, 0, 0); }
@Down A u mnie dizala normalnie Edytowane przez l0nger

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Daj tak:


#define PreloadAnimLibraries(%0) for(new i; i < sizeof AnimLibraries; i++) { ApplyAnimation(%0, AnimLibraries[i], "null", 0.0, 0, 0, 0, 0, 0); }

Nadal to samo ;D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

GetTimeToDate

 

Opis: Funkcja przypisuje do tablicy czas do określonej daty w postaci stringu. 

 

Argumenty: Funkcja posiada dwa argumenty, pierwszy time_start - czas w sekundach do określonej daty, drugi time_str - string do którego funkcja przypisuje dane. 

 

Funkcja

stock GetTimeToDate(time_start, time_str[])
{  
		new secs = time_start - gettime();
		if( secs < 0 ) 
		{
			format( time_str, 20, "-");
			return 0;
		}
 		new Lat = secs / 31556926 % 12;
        new Miesiecy = secs / 604800 % 52;
        new Dni = secs / 86400 % 7;
        new Godzin = secs / 3600 % 24;
        new Minut = secs / 60 % 60;
        new time = secs % 60;
		
		#if defined dli
			#undef dli
		#endif
		#define dli(%1,%2,%3,%4) ((%1==1)?(%2)((%1% 10>1)&&(%1% 10<5)&&!((%1% 100>=10)&&(%1% 100<=21)))?(%3)%4)))

		if( Lat > 0 ) format( time_str, 20, "%d %s", dli(Lat, "roku", "lat", "lat"));
		else if( Miesiecy > 0 ) format( time_str, 20, "%d %s",Miesiecy, dli(Miesiecy,"miesiąca","Miesiecy","Miesiecy"));
		else if( Dni > 0 ) format( time_str, 20, "%d %s",Dni, dli(Dni,"dnia","dni","dni"));
		else if( Godzin > 0 ) format( time_str, 20, "%d %s",Godzin, dli(Godzin,"godzina", "godziny","godzin"));
		else if( Minut > 0 ) format( time_str, 20, "%d %s",Minut, dli(Minut,"minuta","minuty","minut"));
		else if( time > 0 ) format( time_str, 20, "%d %s",secs, dli(secs,"sekunda","sekundy","sekund"));
		
		#undef dli
		
		return 1;
}

Przykład użycia:

new sttr[30];
	GetTimeToDate(gettime() + 500, sttr);
	printf("zostaniesz odbanowany za %s", sttr );

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ParzystaCyfra

Funkcja zwraca true, gdy cyfra jest parzysta, false jeśli jest nieparzysta

 

Kod:

stock ParzystaCyfra(cyfra)
{
  new parzysta = cyfra % 2;
  if(parzysta > 0)
  return false;
  else
  {
  return true;
  }
}

Przykład:

ParzystaCyfra(5); //false
ParzystaCyfra(24); //true
ParzystaCyfra(12); //true

GetPlayerSpeed

Funkcja zwraca prędkość z jaką porusza się gracz (wzorowałem się na funkcji z forum SA-MP'a)

stock GetPlayerSpeed(playerid)
{
    new Float:Speed[4];
    if(IsPlayerInAnyVehicle(playerid))
    {
    GetVehicleVelocity(GetPlayerVehicleID(playerid),Speed[0],Speed[1],Speed[2]);
    }
    else
    {
    GetPlayerVelocity(playerid,Speed[0],Speed[1],Speed[2]);
    }
    Speed[3] = floatsqroot(floatpower(floatabs(Speed[0]), 2.0) + floatpower(floatabs(Speed[1]), 2.0) + floatpower(floatabs(Speed[2]), 2.0)) * 179.28625;
    return floatround(Speed[3]);
}
Edytowane przez Kojojowy_Ninja_Milk

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PasswordCheck
Funkcja sprawdza poziom trudności hasła, zwracając w wartość w przedziale 0-4.

#define isLower(%0) ((%0>=97)&&(%0<=122)) //mala literka
#define isUpper(%0) ((%0>=65)&&(%0<=90)) 
#define isNumber(%0) ((%0>=48)&&(%0<=57)) 

stock PasswordCheck(password[]) //by mrdrifter
{
	new bool:check[1], rank, i, len = strlen(password); 
	
	if(len >= 6) rank++;
	
	while(((isLower(password[i])&&!check{0})?(check{0}=true,rank++):(0),(isUpper(password[i])&&!check{1})?(check{1}=true,rank++):(0),(isNumber(password[i])&&!check{2})?(check{2}=true,rank++):(0)),(len>i++)){}
	
	return rank;
}

Przykład użycia:

	new x;
	printf("Czy to hasło jest mocne?: %s %d/%d", (x = PasswordCheck("słabe"), x>2?("Tak"):("Nie")), x, 4);
	printf("Czy to hasło jest mocne?: %s %d/%d", (x = PasswordCheck("MocneHasło11"), x>2?("Tak"):("Nie")), x, 4);

 

@down tak, bo nie zrobiłem milion warunków, więcej zmiennych i nie rozpisałem kodu na dwa razy dłużysz jak Ty.

Edytowane przez mrdrifter

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#define ParzystaCyfra(%0) (%0 % 2)

Makro.

Tylko błąd wprowadzasz bo w twoim przypadku gdy liczba nie jest parzysta zwróci 1 z gdy jest parzysta zwróci 0.

	#define ParzystaCyfra(%0) (%0 % 2) 
	if(ParzystaCyfra(5)) printf("parzysta"); else printf("nie");
Dodatkowo ten warning

y.pwn(7) : warning 206: redundant test: constant expression is non-zero
Można zrobić w prosty sposób żeby to dobrze zwracało

	#define ParzystaCyfra(%0) ((%0 % 2)==0) 
	if(ParzystaCyfra(5)) printf("parzysta"); else printf("nie");
Edytowane przez mrdrifter

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może nie jest to funkcja ale pomoże to tymm co mają problemy z klawiszami że nie wiedzą jakie ma id np klawisz ' N '

Do :

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
Dajemy
new string[256];
format(string, 256, "Klawisz ma ID: %d", newkeys);
SendClientMessage(playerid, 0xFF00FF, string);

Na serverze klikacie guzik i pokaże wam to jakie id ma guzik, jeśli sie nic nie pokaże to znaczy ze nie mozna uzyc tego guzika

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Te operacje można skrócić do postaci:

#define isLower(%0) (97<= %0 <=122) //mala literka
#define isUpper(%0) (65<= %0 <=90) 
#define isNumber(%0) (48<= %0 <=57) 
W sumie to tez mozna zoptymalizować.

stock GetPlayerSpeed(playerid)
{
    new Float:Speed[4];
    if(IsPlayerInAnyVehicle(playerid))
    {
    GetVehicleVelocity(GetPlayerVehicleID(playerid),Speed[0],Speed[1],Speed[2]);
    }
    else
    {
    GetPlayerVelocity(playerid,Speed[0],Speed[1],Speed[2]);
    }
    Speed[3] = floatsqroot(floatpower(floatabs(Speed[0]), 2.0) + floatpower(floatabs(Speed[1]), 2.0) + floatpower(floatabs(Speed[2]), 2.0)) * 179.28625;
    return floatround(Speed[3]);
}

stock GetPlayerSpeed(plr)
{
	new vid=GetPlayerVehicleID(plr), Float:PV[3];
	
	if(!vid) {
		GetPlayerVelocity(plr, PV[0], PV[1], PV[2]);
		return ( (PV[0]*PV[0])+(PV[1]*PV[1])+(PV[2]*PV[2]) ) * 150;
	} else {
		GetVehicleVelocity(vid, PV[0], PV[1], PV[2]);
		return ( (PV[0]*PV[0])+(PV[1]*PV[1])+(PV[2]*PV[2]) ) * 150;
	}
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skrócona wersja poprawionego kodu od AXV + mała optymalizacja (poza tym twoja wersja wypluwała tag mismatch przy tym):

return ((PV[0] * PV[0]) + (PV[1] * PV[1]) + (PV[2] * PV[2])) * 150;
Poprawiony kod:

stock GetPlayerSpeed(p) {
	new Float:PV[3];
	switch(GetPlayerVehicleID(p)) {
		case true: GetVehicleVelocity(GetPlayerVehicleID(p), PV[0], PV[1], PV[2]);
		default: GetPlayerVelocity(p, PV[0], PV[1], PV[2]);
	}
	return floatround(floatmul(floatmul(PV[0], PV[0]) + floatmul(PV[1], PV[1]) + floatmul(PV[2], PV[2]), 150.0));
}
Edytowane przez Shiny

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Te operacje można skrócić do postaci:

Po co? nie widzę większego sensu. 

 

 

SetAlpha(color, alpha)

Funkcja ustawia poziom 'Przeźroczystości' w kolorze. 

 

Parametry: 

  • color - kolor w którym ustawiamy poziom 'Przeźroczystości'. 
  • alpha - 'Przeźroczystość' koloru (przykład 0x50). 
SetAlpha(color, alpha)
{
	new c[1];
	c[0] = color;
	c{3} = alpha;
	return c[0];
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ładowanie obiektów z pliku: http://pastebin.com/4EtgsBhQ

Nie rozumie tego

 sscanf(line, "p<,>iffffffi", SpawnX, SpawnY, SpawnZ, SpawnRX, SpawnRY, SpawnRZ, draw);
Przy SpawnX w sscanfie pobierasz z lini jako 'i' czyli integer lliczbe, a to jest float ;)

I tak patrze to to i jest nie potrzebne.

Taki little bug :D

Ale funjcja fajna :)

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

×