
	/* Laser Mines API
	*
	* by g3cKpunTop (ToJI9IHGaa)
	*
	* vk.com/krisiso 
	*/

	#if defined G3LaserMinesIncluded
	  #endinput
	#endif
	#define G3LaserMinesIncluded
	
	#define LASER_MINE_CLASSNAME			"ent_LaserMine" //pev_classname
	#define LASER_MINE_KEY					84737365		//pev_impulse
	#define IsLaserMineKey(%1) 				(bool:(pev(%1,pev_impulse)==LASER_MINE_KEY))

	stock LaserMine_SetLaserPlayer( pId ) {
		if( callfun_begin( "ClCmd_LaserOn", "G3LaserMines.amxx" ) == 1 ) {
			callfunc_push_int( pId );
			callfunc_end();
		}
		return 1;
	}

	stock bool: IsLaserMine( iEntity ) {
		if( !pev_valid( iEntity ) )
			return false;

		if( pev( iEntity, pev_impulse ) != LASER_MINE_KEY )
			return false;

		static szClassName[ 35 ];
		pev( iEntity, pev_classname, szClassName, charsmax( szClassName ) );
		return equal( szClassName, LASER_MINE_CLASSNAME );
	}

	// типы возврата (return)
	enum eData_LaserReturnCallBack {
		LASER_SUPERCEDE = 1, //останавливает дальнейшее выполнение функции.
		LASER_CONTINUE = 0 //продолжает нормальную работу функции. 
		//в LaserMine_Set (LASER_SET_POST|LASER_SET_ERR_PLAYER|LASER_SET_ERR_MINE|LASER_SET_ERR_SPAWN) только LASER_CONTINUE
		//в LaserMine_Delete (LASER_DELETE_POST|LASER_DELETE_ALL|LASER_DELETE_ONE) только LASER_CONTINUE
	};

	// события в момент попытки удаление мины (НЕ УБИЙСТВА!!!).
	// убийство/урон ловить - Ham_Killed/Ham_TakeDamage - info_target + Key+ClassName
	enum eData_DeleteLaserCallback {
		LASER_DELETE_PRE = 0, //вызывает до начала удаления мины  (работает структура возврата eData_LaserReturnCallBack)
		LASER_DELETE_POST = 1,	//вызывается после успешного её удаления
		LASER_DELETE_ALL = 2, //вызывается когда удаляют все мины у игрока
		LASER_DELETE_ONE = 3 //вызывается когда удаляется определённая мина
	}

	// события в момент попытки установить мину.
	enum eData_SetLaserCallback {
		LASER_SET_PRE = 0,	//вызывается когда мина ставится (до установки) (работает структура возврата eData_LaserReturnCallBack)
		LASER_SET_POST = 1, //вызывается когда мина уже успешно поставлена.
		LASER_SET_ERR_PLAYER = 2, //вызывается когда мина не поставилась из-за того что рядом игрок
		LASER_SET_ERR_MINE = 3, //вызывается когда мина не поставилась из-за того что рядом мина
		LASER_SET_ERR_SPAWN = 4, //вызывается когда мина не поставилась из-за того что рядом спавн игроков
		LASER_SET_CMD = 5, //вызывается когда игрок только нажал на кнопку установки мины (работает структура возврата eData_LaserReturnCallBack)
		LASER_SET_CMD_PRE = 5
	};

	/*вызывается когда игрок пробует ставить мину.
	*	iType - В какой момент идет вызов,
		pId - Индекс игрока.
		iTypeBackup - Дублирование iType. На Amx190 почему-то происходит утечка, что iType может быть всегда "2". Если у вас такая проблема,
			используйте этот аргумент
		
		return: только на LASER_SET_PRE и LASER_SET_CMD.
	*/
	forward LaserMine_Set( eData_SetLaserCallback:iType, pId, eData_SetLaserCallback:iTypeBackup );

	/*вызывается когда у игрока удаляется мина.
	*	iType - В какой момент идет удаление,
		pId - Индекс игрока,
		iMineId - Индекс мины.

		return: только на LASER_DELETE_PRE.
	*/
	forward LaserMine_Delete( eData_DeleteLaserCallback: iType, pId, iMineId );

	/*вызывается когда мина пытается нанести урон врагу
	*	iVictim - жертва,
		iAttacker - Индекс мины,
		iOwner - Индекс владельца мины (игрок),
		iDamage - Наносимый урон.

		return: eData_LaserReturnCallBack
	*/
	forward LaserMine_Damage( iVictim, iAttacker, iOwner, iDamage );

	/*возвращает количество мин у игрока*/
	native LaserMine_UserGetInventory( pId );
	
	/*возвращает количество УСТАНОВЛЕННЫХ мин у игрока*/
	native LaserMine_UserGetWork( pId );

	/*устанавливает мины игроку (в инвентарь)*/
	native LaserMine_UserSetLaserNum( pId, iNum );

	/*возвращает лимит мин для игрока*/
	native LaserMine_GetMineLimit();

	/*удаляет мину и возвращает её в инвентарь
	*	iOwner - владелец мины (0 - мина сама находит владельца),
		iMineId - Индекс мины,
		bAllRemove - TRUE = удаляет все мины игрока, FALSE = только iMineId.
	*/
	native LaserMine_Remove( iOwner, iMineId, bool: bAllRemove );

	/*удаляет мину
	*	iOwner - владелец мины (0 - мина сама находит владельца),
		iMineId - Индекс мины,
		bAllRemove - TRUE = удаляет все мины игрока, FALSE = только iMineId.
	*/
	native LaserMine_Destroy( iOwner, iMineId, bool: bAllRemove );