Realan RolePlay Chat (ProxDetector opt.)


Započeo PabloK, Maj 08, 2020, 12:58:18 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

ProxDetector


Šta je ProxDetector?
ProxDetector je funkcija koja se koristi (čitaj bi trebalo da se koristi) na RolePlay serverima.


Kako on funkcioniše?
ProxDetector ima jednu svrhu - da svim igračima oko igrača koji vrši neku akciju (npr /me /do) pošalje poruku.
Boja poruke varira od toga koliko je igrač udaljen od igrača koji vrši neku radnju (što je igrač dalje - to boja više menja svoju nijansu).


Kako je on napisan?
#include <a_samp>
#include <YSI_Data\y_iterate> //YSI 5.x

stock ProxDetector(playerid, Float:max_range, color, const string[], va_args<>)
{
	new
		f_string[YSI_MAX_STRING],
		Float:pos_x,
		Float:pos_y,
		Float:pos_z,
		Float:range,
		Float:range_ratio,
		Float:range_with_ratio,
		clr_r, clr_g, clr_b,
		Float:color_r, Float:color_g, Float:color_b;

	if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
		return 0;
	}

	va_format(f_string, sizeof(f_string), string, va_start<4>);

	color_r = float(color >> 24 & 0xFF);
	color_g = float(color >> 16 & 0xFF);
	color_b = float(color >> 8 & 0xFF);
	range_with_ratio = max_range * 1.6;

	foreach (new i : StreamedPlayer[playerid])
	{
		range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
		if (range > max_range) {
			continue;
		}

		range_ratio = (range_with_ratio - range) / range_with_ratio;
		clr_r = floatround(range_ratio * color_r);
		clr_g = floatround(range_ratio * color_g);
		clr_b = floatround(range_ratio * color_b);

		SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), f_string);
	}

	SendClientMessage(playerid, color, f_string);
	return 1;
}



Kako se koristi?
ProxDetector(playerid, 15.0, 0x8e4585AA, "* %s radi neku akciju...", PlayerUsername[playerid])



Koristim mod koji ima 200+ ProxDetector-a i koristi format, šta da radim?


Ukoliko je reč o ovom ili sličnom ProxDetectoru (ne mora da ima 5 boja, moze i jednu kao u Ath editima):
ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)

Potrebno ja da upalite RegEx (Regular Expression), obicno se nalazi u istom prozoru kao REPLACE opcija, kao dodatak/checkbox,
Search:
.*?format\(.*?,.*?,(.*?)
(.*?)ProxDetector\((.*?),(.*?),(.*?),(.*?),.*

Replace:
$2ProxDetector($4, $3, $6, $1

I svih 100-200-300 koliko vec imate format-a ce nestati i biti smesteni direkt u funkciju!

Ukoliko ne koristite y_iterate ili ukoliko Vam nešto ne funkcioniše, možete da koristite i ovu verziju:
#include <a_samp>
#include <YSI_Data\y_iterate> //YSI 5.x

stock ProxDetector(playerid, Float:max_range, color, const string[], va_args<>)
{
	new
		f_string[YSI_MAX_STRING],
		Float:pos_x,
		Float:pos_y,
		Float:pos_z,
		Float:range,
		Float:range_ratio,
		Float:range_with_ratio,
		clr_r, clr_g, clr_b,
		Float:color_r, Float:color_g, Float:color_b;

	if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
		return 0;
	}

	va_format(f_string, sizeof(f_string), string, va_start<4>);

	color_r = float(color >> 24 & 0xFF);
	color_g = float(color >> 16 & 0xFF);
	color_b = float(color >> 8 & 0xFF);
	range_with_ratio = max_range * 1.6;

	foreach (new i : Player)
	{
		if(!IsPlayerStreamedIn(i, playerid)) {
			continue;
		}
		
		range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
		if (range > max_range) {
			continue;
		}

		range_ratio = (range_with_ratio - range) / range_with_ratio;
		clr_r = floatround(range_ratio * color_r);
		clr_g = floatround(range_ratio * color_g);
		clr_b = floatround(range_ratio * color_b);

		SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), f_string);
	}

	SendClientMessage(playerid, color, f_string);
	return 1;
}


Prva funkcija bi trebalo da bude mnogo brža od druge ali takođe zauzima dodatnih MAX_PLAYERS + MAX_PLAYERS mesta što može praviti problem (a i ne mora) u starijim i loše pisanim skriptama!

Takođe, nisam toliko siguran šta je bolje koristiti, verziju sa ili bez StreamedPlayer-a, verovatno je da što više igrača imate to je StreamedPlayer iterator efikasniji, na primer ukoliko planirate 200-300-400+ aktivnih igrača onda bih Vam preporučio StreamedPlayer verziju, u suprotnom je svejedno (jer i za StreamedPlayer postoji backend unutar YSIa :D)
Dok ne prestanete da gledate front i zapravo malo pogledate svoj back-end od vas skriptera nikada neće biti niti bilo čega drugoga.


a lepo je  :D
PAWN DEVELOPER - 2016

KAD JE NAJTEZE BUDI CVRST KAO CELIK
I SJAJI KAO NAJSKUPLJI DIJAMANT

VER MONT COMMUNITY

Kontakti:
FB: https://www.facebook.com/zmajko.youtube
IG: https://www.instagram.com/zmajkobrate

- Znate ono kada ljudi na instagramu stavljaju neke mudre poruke u biografiji?
E pa ja cu isto. -


"Kad zatvorim oci, ne vidim nista."