Jump to content

návod Scydovy YSI návody | #2 | YSI_Coding\y_hooks [*]


Scydo

Recommended Posts

YSI_Coding\y_hooks
*****


Jeden ze snad nejlehčích includů na naučení z knihovny. Abych vás uvedl do obrazu, tak hned tu pro vás mám kód. V případě, že děláte nějaký include, který chcete publikovat ostatním uživatelům, ale potřebovali jste využít některé callbacky, které obsahuje a_samp. Tak uděláte jednu ze snad nejstarších a nejznámějších metod. Přidáte vlastní callback, a v návodě zmíní, ať ho uživatelé pak ve svém gm/fs/jiné volají, a dopadá to nějak následovně:
forward House_OnPlayerConnect(playerid);
forward House_OnPlayerDisconnect(playerid);
forward House_OnFilterScriptInit();
forward House_OnFilterScriptExit();

public OnPlayerConnect(playerid) {
	
	House_OnPlayerConnect(playerid);
	DHS_OnPlayerConnect(playerid);
	DPS_OnPlayerConnect(playerid);
	Nem_OnPlayerConnect(playerid);
	return 1;
}


public OnPlayerDisconnect(playerid) {
	
	House_OnPlayerDisconnect(playerid);
	DHS_OnPlayerDisconnect(playerid);
	DPS_OnPlayerDisconnect(playerid);
	Nem_OnPlayerDisconnect(playerid);
	return 1;
}

public OnFilterScriptInit() {
	
	House_OnFilterScriptInit();
	DHS_OnFilterScriptInit();
	DPS_OnFilterScriptInit();
	Nem_OnFilterScriptInit();
	return 1;
}

public OnFilterScriptExit() {
	
	House_OnFilterScriptExit();
	DHS_OnFilterScriptExit();
	DPS_OnFilterScriptExit();
	Nem_OnFilterScriptExit();
	return 1;
}
Takový zmatek, že ano? Samozřejmě, pak je složitější, ale lepší možnost ještě využít tzv. _ALS_:
public OnPlayerConnect(playerid)
{
	
	#if defined Prefix_OnPlayerConnect
		return Prefix_OnPlayerConnect(playerid);
	#else
		return 1;
	#endif
}
#if defined _ALS_OnPlayerConnect
	#undef OnPlayerConnect
#else
	#define _ALS_OnPlayerConnect
#endif

#define OnPlayerConnect Prefix_Function
#if defined Prefix_Function
	forward Prefix_Function(playerid);
#endif
Ale to je pro některé uživatele skutečně těžké na naučení, a navíc tohle je _ALS_ jen na jediný callback. Pak je tu ale ještě jedna možnost, a to za pomocí y_hooks. Je to velice jednoduché, stačí napsat inf. slovíčko pro kompiler hook a jméno callbacku, které chcete hookovat, například:
hook OnPlayerConnect(playerid) {

	return 1;
}

public OnPlayerConnect(playerid) {

	SendClientMessage(playerid, -1, "Ahoj, kompiler ti nenapíše error, že OPC je již definován!");
	return 1;
}
Využití snad ani nemusím říkat, ale například při tvorbě include, který chcete publikovat a obsahuje callbacky ze a_sampu. Také je mužete využít do gamemode, aby jste si zkrátili obrovský obsah v jednom callbacku.

Jednoduché a prosté. Avšak je tu pár věcí, co by jste o y_hooks měli vědět:
  • musíte y_hooks nahrávat z celé knihovny jako nejdříve - některé hookované callbacky se ani nevyvolají. Stačí y_hooks nahrávat co pokud možno nejdříve a bude po problému.
  • hookovaný callback se volá dříve než obyčejný
  • lze hookovat pouze jednou jeden callback - v jednom zdrojovém kódu.
  • lze hookovat vícekrát, ale nefunguje to - i když to bude znít, že si protiřečím, tak v případě, že chcete skutečně hookovat vícekrát jeden callback a vyhnout se chybám, jde to pokud ihned za jménem hookovaného callbacku přiřadíte číslo. Sice se vám úspěšně kompiluje kód, ale vyvolá se jen public a první hook.
  • nelze si hookovat vlastní callbacky - alespoň co vím. Dle informací by to mělo být možné od nejnovější(a zároveň poslední) verze YSI.
Scydovy YSI návody, hlavní topic: odkaz
Link to comment
Share on other sites

  • Globální moderátor

Ještě by bylo fajn zmínit dva speciální returny z y_hooks a to -2, kde ukončuje celej ten callback (ten prvotní na kterej se hookuje) a vrátí hodnotu 1, -1 ukončí celej callback a vrátí 0

Link to comment
Share on other sites

Ještě by bylo fajn zmínit dva speciální returny z y_hooks a to -2, kde ukončuje celej ten callback (ten prvotní na kterej se hookuje) a vrátí hodnotu 1, -1 ukončí celej callback a vrátí 0

Ono toho je více zajímavého, co by se hodilo alespoň zmínit se v návodu ohledně y_hooks. Například, že i ten má zajímavé funkce. Nebo, že pod y_hooks spadají ještě pár includů pro pokročilejší uživatele. Avšak jsem fakt chtěl vytknout jen to nejpodstatnější. Nějaké tipy, triky a další dodatky k YSI jsem si chtěl schovat na speciální topic ještě(ps, za ty roky, jsem ty returny nikdy nepoužil :d)

Link to comment
Share on other sites

  • Globální moderátor

Ja je pouzivam docela casto a to jsem zacal po dlouhe dobe neco delat :d treba se hodi na detekci klaves kdyz vis ze se ma triggnout jen jedna akce a uz je zbytecne provolavavat zbytek callbacku. Dalsi vec co me napada je interakce s botama, kde nechces aby se triggly user veci (napr. onplayerspawn). No ja jsem teprv zacal s YSI a dost me nadchla, takze prave doufam, ze se dozvim vic :d

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