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?[pawn]#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;
}[/pawn]
Kako se koristi?[pawn]ProxDetector(playerid, 15.0, 0x8e4585AA, "* %s radi neku akciju...", PlayerUsername[playerid])[/pawn]
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):
[pawn]ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)[/pawn]
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:
[pawn]#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;
}[/pawn]
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)