Jump to content

návod [YSI] Afk [*] #2


Scydo

Recommended Posts

YSI4 AFK #2
*****

Zdravím vás u dalšího návodu. Dnešní díl se bude týkat AFK systému. Opět jsem si pro vás připravil takovou ukázku, kde uživatel, který je jistě autorem tohoto kód, se snažil o naprogramování stejného scriptu, na který bude návod v tomto topicu, s opět využitím dcmd(ach jo):

 

#include <a_samp>

#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1

new bool:Afk[MAX_PLAYERS];
public OnPlayerCommandText(playerid, cmdtext[])
{
	dcmd(afk,3,cmdtext);
	return 1;
}

dcmd_afk(playerid, params[]) {

	new string[500];
	if(!Afk[playerid]){

		if(params[0]){

			format(string,sizeof(string),"{FF0000}[ AFK ] {1B1BE0}Hrac {37DB45}%s {1B1BE0}odesel na chvili od PC [Duvod: {37DB45}%s{1B1BE0}]",Jmeno(playerid),params);
			Afk[playerid] = true;
			SendClientMessageToAll(-1,string);
			TogglePlayerControllable(playerid, false);
		}else{

			format(string,sizeof(string),"{FF0000}[ AFK ] {1B1BE0}Hrac {37DB45}%s {1B1BE0}odesel na chvili od PC",Jmeno(playerid));
			Afk[playerid] = true;
			SendClientMessageToAll(-1,string);
			TogglePlayerControllable(playerid, false);
		}
	}else{
		format(string,sizeof(string),"{FF0000}[ AFK ] {1B1BE0}Hrac {37DB45}%s {1B1BE0}je zpet ve hre",Jmeno(playerid));
		Afk[playerid] = false;
		TogglePlayerControllable(playerid, true);
	}
	return 0;
}

stock Jmeno(playerid)
{
	new n[156];
	GetPlayerName(playerid, n,sizeof(n));
	return n;
}

 



Znalosti některých uživatelů jsou vskutku mimořádné. Děkujeme uživateli HelloJeffry, který nám tento "kód" poskytl na (ewolutions.cz/topic/1170). Teď si to zkusíme vytvořit s využitím YSI knihovny. Začneme s tím, že si rozmyslíme, co si nahrajeme:

  • y_commands - pro lepší, efektivnější práci s příkazy, včetně parametrů.
  • y_playerarray - ušetří využití paměti, hlavně u boolen proměnných s polem. Rozdíl mezi y_bit a y_playerarray prakticky není. Jen y_playerarray je určená pro hráče.
  • y_va - pro práci s již formátovanými fcemi nebo efektivnější zpracovávání vlastních form. fcí.

Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Začneme tím, že si deklarujeme jednu boolen proměnnou, ale pozor, s tagem PlayerArray!:



new
	PlayerArray: bIsAfk<MAX_PLAYERS>;

Pracování pak s tou proměnnou je sice jednoduché, ale pro vás to bude ze začátku celkem neefektivní, tak si na to můžeme udělat preprocesor:



#define IsPlayerAfk(%0) Bit_Get(bIsAfk, %0)

Nyní přidáme snad nejrozšířenější, nejčastější a nejvíce používanou funkci, a to funkci, která nám vrátí z fce GPN jméno hráče. Jelikož nepřidávám další velice známé slovíčko

stock, tak jméno naší fce trošku zkrášlíme:


GetPlayerNick(playerid) {

	new
		sNick[MAX_PLAYER_NAME + 1];
	GetPlayerName(playerid, sNick, sizeof(sNick));
	return (sNick);
}

Dále si přidáme (zjednodušeně) příkaz. Tak já nevím co vy, ale myslím, že příkaz afk je asi pro náš účel nejlepší volba:



YCMD:afk(playerid, params[], help) {

V případě, že by jste chtěli jiný příkaz, stačí jenom změnit slovíčko afk.. Tak, dále použijeme náš preprocesor a pomocí podmínky zjistíme, jestli není hráč již afk:



	if (IsPlayerAfk(playerid)) {

Nyní budeme zpracovávat blok, který proběhne v případě, že hráč je afk, tudíž jestliže bude proměnná true. Začneme tím, že přiřadíme naší proměnné hodnotu false, jelikož je afk a jakmile zadá příkaz, tak už nebude:



	Bit_Vet(bIsAfk, playerid);
	TogglePlayerControllable(playerid, true); /* K tomhle snad nemusím nic povídat... */

*****
Rozdíl mezi Bit_Vet a Bit_Let. I když je celkem jasný rozdíl, nejspíše se najdou jedinci, co ho nevidí, tak vysvětlím: Normálně při nastavování u takových-to proměnných musí uživatel používat fci Bit_Set.



Bit_Set(bIsAfk, playerid, true);
Bit_Set(bIsAfk, playerid, false);

Kdo tento způsob bude používat, tak maximálně bude upozorněn, že existuje lepší varianta a to zrovna Bit_Let, který nastaví proměnnou na true a Bit_Vet nastaví proměnnou zase na false:



Bit_Let(bIsAfk, playerid); /* true */
Bit_Vet(bIsAfk, playerid); /* false */

Krom toho, že jsou rychlejší v zápise jsou také mnohem rychlejší po stránce funkčnosti.

*****

A nakonec přidáme, že se všem odešle zpráva(již formátovaná), že se hráč úspěšně vrátil do hry:



	va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s se vrátil do hry", GetPlayerNick(playerid));

Ale nyní zpracovávat blok, který proběhne v případě, že hráč ještě není afk, tudíž jestliže bude proměnná false. Začneme tím samým akorát opačně, a to, že přiřadíme naší proměnné hodnotu true, jelikož není afk a jakmile zadá příkaz, tak už bude:



	Bit_Let(bIsAfk, playerid);
	TogglePlayerControllable(playerid, false);

A pozor. Teď vám ukážu takový magický trik. Pokud chcete odesílat afk s důvodem v případě, že nějaký napsal, tak nemusíte na to přidávat zbytečně další blok. Ale stačí vám jediné, a to if-else. Prvně podmínka, jestli tedy nezadal žádné parametry:



	if (!strlen(params)) va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK !", GetPlayerNick(playerid));

A teď jeho alternativu v případě, že napíše cokoliv, například ahoj, místo parametrů(/afk ahoj):



	else va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK [ DŮVOD: %s ]!", GetPlayerNick(playerid), params);

Neuvěřitelné, že? Z celých 2 bloků jsou pouhé 2 řádky!. A nakonec zakončíme blok a i celý příkaz a máme hotovo:



	}
	return (true);
}

Toť vše. Celý kód pro shlédnutí zde:

 

#include <a_samp>

#include <YSI_Visual\y_commands> // <YSI\y_commands>
#include <YSI_Coding\y_va> // <YSI\y_va>
#include <YSI_Data\y_playerarray>// <YSI\y_playerarray>

new
	PlayerArray: bIsAfk<MAX_PLAYERS>;

#define IsPlayerAfk(%0) Bit_Get(bIsAfk, %0)

GetPlayerNick(playerid) {

	new
		sNick[MAX_PLAYER_NAME + 1];
	GetPlayerName(playerid, sNick, sizeof(sNick));
	return (sNick);
}

YCMD:afk(playerid, params[], help) {

	if (IsPlayerAfk(playerid)) {

		Bit_Vet(bIsAfk, playerid);
		TogglePlayerControllable(playerid, true); 
		va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s se vrátil do hry", GetPlayerNick(playerid));
	}else{
		Bit_Let(bIsAfk, playerid);
		TogglePlayerControllable(playerid, false);
		if (!strlen(params)) va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK !", GetPlayerNick(playerid));
		else va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK [ DŮVOD: %s ]!", GetPlayerNick(playerid), params);
	}
	return (true);
}

 



Pak to dopadne nějak takto:
W1lq.png

Děkuji za pozornost a všem, kdo tento návod ohodnotí kladně a nebo repem.
PS: mám v plánu pokračovat.

 

Návod označen jako platný

Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný

  • Líbí se mi to! (+1) 3
Link to comment
Share on other sites

  • Hlavní moderátor

Zcela by se dalo obejít bez YSI, ale poněvadž je to návod právě na YSI utility, tak budiž. Dobré (pár postřehů jsem ti psal osobně).

Edited by vEnd
Link to comment
Share on other sites

Je to fajn návod na knižnicu YSI ako ukážka funkcií a ich využitia ale ten jeho script zase nie je zlý, áno možno ten dôvod sa dá spraviť o pár riadkov kratšie ale to je asi tak všetko čo sa tam dá vyčítať....používa dcmd? no a čo? nechápem prečo ti to vadí, 90% uživateľov na tomto fóre ani nevie že nejaký bool existuje a nehovoriac o tom že 90% z tých 90% nedokáže urobiť dôvod na afk...

 

Návod ako ukážka YSI fajn ale tá výčitka v prvom scripte....to nemuselo byť

Link to comment
Share on other sites

Zcela by se dalo obejít bez YSI, ale poněvadž je to návod právě na YSI utility, tak budiž. Dobré (pár postřehů jsem ti psal osobně).

~> Samozřejmě, že by se dalo zcela obejít i bez jakýchkoliv includů. Ale chtěl jsem přidat jenom návod, který by se týkal úpravy kódu, který jsem sem přidal jako ukázku, kdybych na něm pracoval s využitím YSI. Nemůžu říct, že tohle by byl výsledný afk systém přes YSI, jelikož jde k tomu využít ještě další hromada includů z knihovny.

 

Vyborne, vse funguje..

~> Jelikož vidím větší počet teček na konci, tak to zní jako ironie. Samozřejmě kód jsem i pro jistotu vyzkoušel, a ano skutečně funguje ten kód, který je v tomto návodě vysvětlený.

 

#define IsPlayerAfk(%0) Bit_Get(bIsAfk, playerid) - menšia chybička sa nájde všakže :klidek:

~> Jojo děkuju moc, opraveno.

 

Je to fajn návod na knižnicu YSI ako ukážka funkcií a ich využitia ale ten jeho script zase nie je zlý, áno možno ten dôvod sa dá spraviť o pár riadkov kratšie ale to je asi tak všetko čo sa tam dá vyčítať....používa dcmd? no a čo? nechápem prečo ti to vadí, 90% uživateľov na tomto fóre ani nevie že nejaký bool existuje a nehovoriac o tom že 90% z tých 90% nedokáže urobiť dôvod na afk...

 

Návod ako ukážka YSI fajn ale tá výčitka v prvom scripte....to nemuselo byť

~> Nikde jsem nenapsal, že ten kód je špatně, nebo, že by ho nikdo neměl využívat. Slouží pouze jako ukázka(píšu to i v samotném úvodu).

~> To stejné s využitím dcmd. Opět nikde jasně nepíšu, že mi to vadí, že je to nejhorší člověk na světě. Jen mi několik lidí již psalo, že jako ukázka by se hodil nějaký lepší kód se alespoň průměrnými includy (zcmd, dof2 aj.). Je pravda, že dcmd dini zrovna nemusím, ale raději povím, ať ho ten uživatel nepoužívá a zkusí něco lepšího, a také proč, než, abych ho kritizoval...

 

Co dělá Bit_Let a Bit_Vet ?

~> Díky za připomínku, už je to v návodě přidané. Zapomněl jsem to přidat již dříve.

 

Využití vyplývá z popisků, nicméně by mu tam nějaký menší komentář k těmto fcím neměl chybět. ;)

~> Už přidané. Také je to oddělené, aby to uživatelé nemátlo, že je to spíše vysvětlení, než, že to patří ke výslednému kódu.

BTW: upravil jsem i trochu topic. Snad už tam nejsou nějaká nesmyslná slova typu "scriptum".

Link to comment
Share on other sites

  • Hlavní moderátor

Je to fajn návod na knižnicu YSI ako ukážka funkcií a ich využitia ale ten jeho script zase nie je zlý, áno možno ten dôvod sa dá spraviť o pár riadkov kratšie ale to je asi tak všetko čo sa tam dá vyčítať....používa dcmd? no a čo? nechápem prečo ti to vadí, 90% uživateľov na tomto fóre ani nevie že nejaký bool existuje a nehovoriac o tom že 90% z tých 90% nedokáže urobiť dôvod na afk...

 

Návod ako ukážka YSI fajn ale tá výčitka v prvom scripte....to nemuselo byť

Já si myslím, že ten povzdech nad dcmd je na místě. Je rok 2016, máme rychlejší a stejně jednoduché metody. A argumentovat neznalostí zdejších uživatelů, nevím no... je to teda smutná a, bohužel, pravdivá poznámka. Možná by to chtělo pořádnou aktualizaci sekce návodů.

Link to comment
Share on other sites

SkiBig....narazam na to ze si to napisal takym stylom ze to vyznelo ako by to mal uplne zle napisane....viem ze si chcel ukazat len alternativu cez YSI, chapem ze mame rychlejsie funkcie na prikazy ale stale je dcmd pouzivane v hojnej miere a to len preto ze ludom sa nechce menit nieco co funguje spolahlivo a osobne si myslim(je to len moj osobny nazor) ze pri takomto prikaze tam rozdiel v rychlosti asi ani nebude, co keby si urobil nejake testy rychlosti na prikazy a systemy?

Link to comment
Share on other sites

Dobrí večer. 

Nedá mi nezareagovať na toto téma. 

V prvom rade by som chcel pochváliť autora kódu za pekný a priehľadný návod ktorí sa zameriava na YSI. Tak tiež musím súhlasiť s Scydo že DCMD aj keď je to tu veľa krát spomenuté by sa už nemal používať. Ako napísal Mattsy nebolo by zlé spraviť nové rýchlostné testy páč počítače a samotné serveri sú výkonnejšie než včera čiže v kvázi aj samotné DCMD zrýchľuje. 
Lenže vždy tu bude to samotné staré meranie kde už v tedy vyplývalo z rýchlostných testov že DCMD je veľmi pomalé. Tieto merania ktoré už boli budú síce iné než dnes ale poradie by malo zostať nezmenené.
Čiže autorove pohoršenie na systéme akceptujem a myslím si že je adekvátne k jeho prvotným slovám nad ktorými sa niektorý pohoršujete. Ako spomínal kolega vEnd je rok 2016 čiže právo na svoj názor má každý a sú rýchlejšie systémy ktoré by som skôr aj ja odporúčal ako staršie z roku 2008... . 
Kód je pekne napísaní len by trebalo tak tiež podotknúť na konci témy že funkcie ako bool, char a knižnice ako y_bite, y_playerarray sú veľmi pomalé páč pawn pracuje s  4 Byte čo je 32 bitov. Nižšie to pawn nedokáže vďaka SA:MP Teams ktorý očividne v časovej tiesni alebo lenivosťou zabudli na znalosti o bitoch samotných a použili iba tkz. DoubleWorld. 

Ďakujem za prečítanie a za skvelí tutoriál. 

  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

SkiBig....narazam na to ze si to napisal takym stylom ze to vyznelo ako by to mal uplne zle napisane....viem ze si chcel ukazat len alternativu cez YSI, chapem ze mame rychlejsie funkcie na prikazy ale stale je dcmd pouzivane v hojnej miere a to len preto ze ludom sa nechce menit nieco co funguje spolahlivo a osobne si myslim(je to len moj osobny nazor) ze pri takomto prikaze tam rozdiel v rychlosti asi ani nebude, co keby si urobil nejake testy rychlosti na prikazy a systemy?

~> Jak se již zmínili kolegové nademnou (vEnd, CMatus) včetně tebe samotného, ano jsou mnohem rychlejší includy. Ale nemysli jsi. Jsou i rychlejší než samotné YSI. Na kód, který jsem sem přidal jako ukázku, jsem pohlížel a komentoval jako Ysisák(uživatel, co používá výhradně jen YSI4 na obsahovější nebo složitější scripty), proto možná to zní tak kriticky. Ale nikde jsem nepsal, že ten kód není spolehlivý nebo, že by se neměl používat.

~> A bohužel, zase úplně tak spolehlivě nefunguje. Stačí jedno špatné písmenko, nebo někde něco vynechat, a už to nefunguje. Nemluvě o tom, že jsem i slýchal případy, kdy blblo params u dcmd.

 

Kód je pekne napísaní len by trebalo tak tiež podotknúť na konci témy že funkcie ako bool, char a knižnice ako y_bite, y_playerarray sú veľmi pomalé páč pawn pracuje s 4 Byte čo je 32 bitov. Nižšie to pawn nedokáže vďaka SA:MP Teams ktorý očividne v časovej tiesni alebo lenivosťou zabudli na znalosti o bitoch samotných a použili iba tkz. DoubleWorld.

~> Do takových podrobností jsem už nechtěl jít, jelikož tohle subfórum se zaobírá prací s YSI, nikoliv teorií. Samozřejmě, některé důležité informace napíšu, ale, kdybych měl u všeho napsat jak je to rychlé, jaký na to mám osobní názor, jestli je to vhodné, nevhodné, jestli by se to mělo používat... tak akorát tím zbytečně prodloužím tutoriál a nikomu se moc nechce číst 4 a více stránek v 1 návodů. btw taky děkuju

Link to comment
Share on other sites

V celém kodu tam máš include <a_samp>, ještě to #

~> To jsi neměl říkat... to bylo to super secret proti kopírákům :(.... #1d-a

Link to comment
Share on other sites

~> Jak se již zmínili kolegové nademnou (vEnd, CMatus) včetně tebe samotného, ano jsou mnohem rychlejší includy. Ale nemysli jsi. Jsou i rychlejší než samotné YSI. Na kód, který jsem sem přidal jako ukázku, jsem pohlížel a komentoval jako Ysisák(uživatel, co používá výhradně jen YSI4 na obsahovější nebo složitější scripty), proto možná to zní tak kriticky. Ale nikde jsem nepsal, že ten kód není spolehlivý nebo, že by se neměl používat.

~> A bohužel, zase úplně tak spolehlivě nefunguje. Stačí jedno špatné písmenko, nebo někde něco vynechat, a už to nefunguje. Nemluvě o tom, že jsem i slýchal případy, kdy blblo params u dcmd.

 

 

~> Do takových podrobností jsem už nechtěl jít, jelikož tohle subfórum se zaobírá prací s YSI, nikoliv teorií. Samozřejmě, některé důležité informace napíšu, ale, kdybych měl u všeho napsat jak je to rychlé, jaký na to mám osobní názor, jestli je to vhodné, nevhodné, jestli by se to mělo používat... tak akorát tím zbytečně prodloužím tutoriál a nikomu se moc nechce číst 4 a více stránek v 1 návodů. btw taky děkuju

Dovoľ mi zareagovať na tvoju reakciu ohľadom môjho príspevku. 

 

Plne súhlasím že ak by si mal popisovať samotní návod o Bitoch bolo by to asi zdĺhavejšie ale na druhej stránke musíš uznať že y_playerarray je hranie sa s Bytmi. Len že musíš brať aj ohľad na nováčika a je dobré napísať a upozorniť ho na samotné výhody a nevýhody. Páč pre príklad dnes veľa ľudí si robí viac FS v YSI pre svoj server nevedomky o tom že spomaľuje systém.

Tak tiež nemusíš robiť rýchlostné testy stačí to len decentne spomenúť.

Prosím neber môj príspevok ako dôraz znechutenia práce alebo opovrhovanie. Len som ťa chcel upozorniť na daný fakt pre seba zlepšenie v budúcich príspevkoch. 

 

S pozdravom CMatus.

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...