class ActionUnrestrainTargetHandsCB : ActionContinuousBaseCB
{
	const float DEFAULT_STRUGGLE_TIME = 2;
	const float UNRESTRAIN_STRUGGLE_MULTIPLIER = 0.75;//multiplier for the struggle time normally used for the player unrestraining themselves, this allows unrestraining to be bound to the 'StruggleLength' config param
	
	override void CreateActionComponent()
	{
		float time = DEFAULT_STRUGGLE_TIME;
		PlayerBase targetPlayer = PlayerBase.Cast(m_ActionData.m_Target.GetObject());
		EntityAI item_in_hands = targetPlayer.GetItemInHands();
		
		if ( item_in_hands.ConfigIsExisting("StruggleLength") )
		{
			time = item_in_hands.ConfigGetFloat("StruggleLength") * UNRESTRAIN_STRUGGLE_MULTIPLIER;
		}
		#ifdef DEVELOPER
		if ( m_ActionData.m_Player.IsQuickRestrain() )
		{
			time = DEBUG_QUICK_UNRESTRAIN_TIME;
		}
		#endif
		
		m_ActionData.m_ActionComponent = new CAContinuousTime(time);
	}
};

class ActionUnrestrainTargetHands: ActionContinuousBase
{	
	void ActionUnrestrainTargetHands()
	{
		m_CallbackClass = ActionUnrestrainTargetHandsCB;
		m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_RESTRAINTARGET;
		m_FullBody = true;
		m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH;
		m_Text = "#unrestrain";
	}
	
	override typename GetInputType()
	{
		return ContinuousInteractActionInput;
	}
	
	
	
	override void OnStartServer(ActionData action_data)
	{
		super.OnStartServer(action_data);
		
		action_data.m_Player.TryHideItemInHands(true);
	}

	override void OnEndServer(ActionData action_data)
	{
		super.OnEndServer(action_data);
		
		action_data.m_Player.TryHideItemInHands(false);
	}
	
	override void CreateConditionComponents()  
	{
		m_ConditionItem = new CCINone;
		m_ConditionTarget = new CCTObject(UAMaxDistances.DEFAULT);
	}
	
	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		PlayerBase targetPlayer = PlayerBase.Cast(target.GetObject());
		return targetPlayer && targetPlayer.IsRestrained();
	}

	override void OnFinishProgressServer( ActionData action_data )
	{
		PlayerBase targetPlayer = PlayerBase.Cast(action_data.m_Target.GetObject());
		
		if (CanReceiveAction(action_data.m_Target) && targetPlayer.IsRestrained())
		{
			EntityAI item_in_hands = targetPlayer.GetItemInHands();
			targetPlayer.SetRestrained(false);
			if (item_in_hands)
			{
				MiscGameplayFunctions.TransformRestrainItem(item_in_hands, null, action_data.m_Player, targetPlayer);
			}
			else
			{
				ErrorEx("Failed to obtain item in target player's hands during empty handed unrestraining");
			}
		}
	}
	
	override void OnStartClient(ActionData action_data)
	{
		action_data.m_Player.TryHideItemInHands(true);
	}
	
	override void OnEndClient( ActionData action_data )
	{
		if ( action_data.m_Player ) action_data.m_Player.TryHideItemInHands(false);
	}
	
};