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?
[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)
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."