DIFF

ActionTakeArrow.c

class ActionTakeArrow: ActionTakeItem
{
	void ActionTakeArrow()
	{
		m_CommandUID        = DayZPlayerConstants.CMD_ACTIONMOD_PICKUP_HANDS;
		m_Text 				= "#take";
	}

	override void CreateConditionComponents()  
	{
		m_ConditionItem 	= new CCINone();
		m_ConditionTarget 	= new CCTObject(UAMaxDistances.DEFAULT);
	}

	override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
	{
		EntityAI targetEntity = EntityAI.Cast(target.GetObject());
		if (!targetEntity || (targetEntity && targetEntity.IsManagingArrows() && !targetEntity.IsDamageDestroyed()))
			return false;
		
		ArrowManagerBase arrowManager = targetEntity.GetArrowManager();
		if (arrowManager)
		{
			ItemBase arrow = ItemBase.Cast(arrowManager.GetFirstArrow());
			if (arrow)
			{
				if (player.GetInventory().CanAddEntityIntoInventory(arrow))
					return true;
			}
		}
		
		return false;
	}
	
	override Object GetDisplayInteractObject(PlayerBase player, ActionTarget target)
	{
		EntityAI targetEntity = EntityAI.Cast(target.GetObject());
		if (!targetEntity || (targetEntity && targetEntity.IsManagingArrows() && !targetEntity.IsDamageDestroyed()))
			return null;
		
		ArrowManagerBase arrowManager = targetEntity.GetArrowManager();
		if (arrowManager)
		{
			return arrowManager.GetFirstArrow();
		}
		
		return null;
	}
	
	override bool CanBeUsedOnBack()
	{
		return false;
	}
	
	override bool InventoryReservation(ActionData action_data)
	{
		bool success = true;
		
		InventoryLocation il = new InventoryLocation();
		
		EntityAI targetEntity;
		if (EntityAI.CastTo(targetEntity, action_data.m_Target.GetObject()))
		{
			ArrowManagerBase arrowManager = targetEntity.GetArrowManager();
			if (arrowManager)
			{
				ItemBase targetArrow = ItemBase.Cast(arrowManager.GetFirstArrow());
				if (targetArrow)
				{
					action_data.m_Player.GetInventory().FindFreeLocationFor(targetArrow , FindInventoryLocationType.ANY, il);
					if (action_data.m_Player.GetInventory().HasInventoryReservation(targetArrow, il))
					{
						success = false;
					}
					else
					{
						action_data.m_Player.GetInventory().AddInventoryReservationEx(targetArrow, il, GameInventory.c_InventoryReservationTimeoutMS);
					}
				}
			}
		}	
		
		if (success)
		{
			if (il)
				action_data.m_ReservedInventoryLocations.Insert(il);
		}
		
		return success;
	}

	
	override void OnExecute(ActionData action_data)
	{
		if (g_Game.IsDedicatedServer())
		{
			ClearActionJuncture(action_data);
			return;
		}		
		
		InventoryLocation il = action_data.m_ReservedInventoryLocations.Get(0);
		
		ClearInventoryReservationEx(action_data);
		
		ItemBase arrow = ItemBase.Cast(il.GetItem());
		InventoryLocation arrowInventoryLocation = new InventoryLocation;
		arrow.GetInventory().GetCurrentInventoryLocation(arrowInventoryLocation);
		
		float stackable = arrow.GetTargetQuantityMax(il.GetSlot());
		
		if ( stackable == 0 || stackable >= arrow.GetQuantity() )
		{
			action_data.m_Player.PredictiveTakeToDst(arrowInventoryLocation, il);
		}
		else
		{
			arrow.SplitIntoStackMaxToInventoryLocationClient( il );
		}
	}
}