#if defined _rtd2_included
  #endinput
#endif
#define _rtd2_included

public SharedPlugin:__pl_rtd2 = {
	name = "RollTheDice2",
	file = "rtd2.smx",
#if defined REQUIRE_PLUGIN
	required = 1,
#else
	required = 0,
#endif
};

#if !defined REQUIRE_PLUGIN
public __pl_rtd2_SetNTVOptional(){

	MarkNativeAsOptional("RTD2_GetClientPerkId");
	MarkNativeAsOptional("RTD2_GetClientPerkTime");
	
	MarkNativeAsOptional("RTD2_ForcePerk");
	MarkNativeAsOptional("RTD2_RollPerk");
	MarkNativeAsOptional("RTD2_RemovePerk");
	
	MarkNativeAsOptional("RTD2_GetPerkOfString");
	
	MarkNativeAsOptional("RTD2_RegisterPerk");
	MarkNativeAsOptional("RTD2_IsRegOpen");
	MarkNativeAsOptional("RTD2_SetPerkByToken");
	MarkNativeAsOptional("RTD2_SetPerkById");
	MarkNativeAsOptional("RTD2_DefaultCorePerk");
	
	MarkNativeAsOptional("RTD2_CanPlayerBeHurt");

}
#endif



	/****************************\
		-	F O R W A R D S  -
	\****************************/


/**
 * Called everytime rtd is activated to determine if the player can use the dice mod.
 * Return Plugin_Continue to allow, anything else denies them access.
 *
 * @note sm_forcertd command and RTD2_ForcePerk native does not call this.
 *
 * @param client		Client index.
 */
forward Action:RTD2_CanRollDice(client);


/**
 * Called when a perk (iPerkId) is about to be forced by an admin (client) on a target (iTarget).
 * Return Plugin_Continue to allow, anything else denies the force.
 *
 * @note Called only by sm_forcertd command and RTD2_ForcePerk native.
 *
 * @param client		Client index.
 * @param iTarget		Target client index.
 * @param iPerkId		ID of the perk about to be forced.
 */
forward Action:RTD2_CanForcePerk(client, iTarget, iPerkId);


/**
 * Called when a perk (iPerkId) is about to be removed by an admin (client) from a target (iTarget).
 * Return Plugin_Continue to allow, anything else denies the force.
 *
 * @note Called only by sm_removertd command and RTD2_RemovePerk native.
 *
 * @param client		Client index.
 * @param iTarget		Target client index.
 * @param iPerkId		ID of the perk about to be removed.
 */
forward Action:RTD2_CanRemovePerk(client, iTarget, iPerkId);


/**
 * Called when a perk has just been activated on a player.
 *
 * @param client		Client Index.
 * @param iPerk			Perk Index.
 * @param iDuration		Perk Duration (-1 if no time).
 */
forward RTD2_Rolled(client, iPerk, iDuration);


/**
 * Called when a perk has just been activated on a player.
 *
 * @param client		Client Index.
 * @param iPerk			Removed Perk's Index.
 * @param iReason		Reason Index (0=plugin unload, 1=death, 2=class change, 3=wear off, 4=disconnect, 5=custom/unknown).
 */
forward RTD2_Removed(client, iPerk, iReason);




	/**************************\
		-	N A T I V E S  -
	\**************************/


/**
 * Returns player's current perk index. Meant to check if player is using RTD.
 *
 * @param client		Client Index.
 *
 * @return				Perk index if client is using RTD, -1 otherwise.
 */
native RTD2_GetClientPerkId(client);


/**
 * Returns time in seconds the player has left to the perk end.
 *
 * @param client		Client Index.
 *
 * @return				Time in seconds if client is using RTD, -1 otherwise.
 */
native RTD2_GetClientPerkTime(client);


/**
 * Forces a perk on a player
 *
 * @param client		Client Index.
 * @param sPerk			Perk string, containing id, token or a tag. If invalid a roll will be used.
 * @param iTime			Custom perk's time. -1 = don't use.
 * @param bOvrClass		0/1 - If perk doesn't match player's class, should it be applied anyway?
 * @param initiator		Entity which initiated forcing the perk.
 * 
 * @return				-5 if RTD2_CanForcePerk forward was blocked,
 *						-4 if client index is not valid (bots are not valid either),
 *						-3 if client is using RTD,
 * 						-2 if client is dead,
 * 						-1 if there were no perks available,
 * 						<0 and more> forced perk's index.
 */
native RTD2_ForcePerk(client, String:sPerk[]="-1", iTime=-1, bOvrClass=0, initiator=0);


/**
 * Rolls a perk with given data.
 *
 * @note This does NOT apply the perk to the client.
 *
 * @param client				Client Index.
 * @param bOverrideDisabled		0/1 - Roll disabled perks?
 * @param bOverrideClass		0/1 - Roll perks NOT for player's class?
 * @param bCountRepeat			0/1 - Roll perks which repeated twice in 2 rolls for client? (sm_rtd2_repeat 1 ONLY)
 * @param bCountGreatRepeat		0/1 - Roll perks which repeated twice in 3 rolls for client? (sm_rtd2_repeatgreat 1 ONLY)
 * 
 * @return						Perk index on success, -1 otherwise
 */
native RTD2_RollPerk(client=0, bOverrideDisabled=0, bOverrideClass=0, bCountRepeat=1, bCountGreatRepeat=1);


/**
 * Removes current perk from the client.
 *
 * @param client		Client Index.
 * @param iReason		Reason Index (0=plugin unload, 1=death, 2=class change, 3=wear off, 4=disconnect, 5=custom/unknown).
 * @param sReason		Provide custom reason IF iReason=5.
 * 
 * @return				Perk index which got removed, -1 if client wasn't using RTD.
 */
native RTD2_RemovePerk(client, iReason=3, const String:sReason[]="");


/**
 * Gets the perk's index by either the actual index, perk's token or a single tag
 *
 * @param sString		String to search by.
 *
 * @return				Perk's index on success, -1 otherwise.
 */
native RTD2_GetPerkOfString(const String:sString[]="");




	/****************************\
	******************************
		-	E X T E R N A L  -
	******************************
	\****************************/

/*

		The following are grouped individually,
	because they are meant to be for plugins
	which register their own perks to the RTD.
	
		For a full tutorial on how to use those,
	see the RTD's thread on AlliedModders:
	
	https://forums.alliedmods.net/showthread.php?t=278579
	
*/

functag RTD2Manager public(client, iPerkId, bool:bEnable);

/**
 * Registers a perk from a different plugin to the core.
 * The parameters match the fields in the KV file.
 * Perks cannot be unregistered, disable them instead.
 * If a token was found in another perk, it will OVERRIDE that perk.
 * For in-depth information, see the RTD thread on AlliedModders.
 *
 * @param sToken	Unique token used for addressing the perk.
 * @param sName		Perk name.
 * @param iGood		0 - bad perk; 1 - good perk
 * @param sSound	Path to the initiation sound file.
 * @param iTime		-1 -> no timer; 0 -> ConVar default time; 0< -> Custom perk time.
 * @param sClass	Class string to limit the perk to.
 * @param sWeapon	Weapon classnames to limit the perk to.
 * @param sTags		Perk's tags used to find or address the perk.
 * @param funcPerk	Callback function; public(client, iPerkId, bool:bEnable)
 *
 * @return			Perk's index on success, -1 otherwise (not all paremeters filled).
 */
native RTD2_RegisterPerk(const String:sToken[], const String:sName[], iGood, const String:sSound[], iTime, const String:sClass[], const String:sWeapons[], const String:sTags[], RTD2Manager:funcPerk);


/**
 * Registering a perk via external plugin is possible only after all the core ones were registered.
 * You can register new perks in OnPluginStart() when this native returns 1 (if late-loaded).
 * Otherwise, register them in the RTD2_OnRegOpen() forward.
 *
 * @return			1 if registering is open, 0 otherwise.
 */
native RTD2_IsRegOpen();


/**
 * This forward will fire when RTD is ready handle perk registration.
 * RTD2_RegisterPerk() should ALWAYS be executed in this forward.
 */
forward RTD2_OnRegOpen();


/**
 * Enables/disables perk by token.
 *
 * @params sToken	The token to find the perk by.
 * @params iDir		(direction) -1 = disable, 0 = toggle, 1 = enable
 *
 * @return			ID of the perk, -1 if not found.
 */
native RTD2_SetPerkByToken(const String:sToken[], iDir=0);


/**
 * Enables/disables perk by ID.
 *
 * @params iId		Perk's ID.
 * @params iDir		(direction) -1 = disable, 0 = toggle, 1 = enable
 *
 * @return			1 if anything changed, 0 if was already in the requested state, -1 on error.
 */
native RTD2_SetPerkById(iId, iDir=0);


/**
 * If RTD2_RegisterPerk() was used to override functionality of a core perk,
 * this native can be used to set it back to the default one.
 * It will accept either the perk's ID or its token (id > token).
 * You should use it only on core perks.
 *
 * @params iId		Perk's ID.
 * @params sToken	Perk's token.
 *
 * @return			1 if anything was changed, 0 nothing was changed, -1 on error.
 */
native RTD2_DefaultCorePerk(iId=-1, const String:sToken[]="");


/**
 * A miscellaneous native which returns whether the client can be hurt.
 * Optionally, hurt by whom.
 * It is adived to use this as it checks if the client is in Friendly Mode.
 *
 * @params client	Can this client be hurt...
 * @params by		...by this client?
 *
 * @return			1 if yes, 0 if not or error.
 */
native RTD2_CanPlayerBeHurt(client, by=0);