DIFF

ActionTakeHybridAttachment.c

//!DEPRECATED
class ActionTakeHybridAttachment: ActionInteractBase
{
	string m_ItemName = "";

	void ActionTakeHybridAttachment()
	{
		m_CommandUID        = DayZPlayerConstants.CMD_ACTIONMOD_PICKUP_INVENTORY;
		m_CommandUIDProne	= DayZPlayerConstants.CMD_ACTIONFB_PICKUP_INVENTORY;
		m_Text = "#take";
	}

	override void CreateConditionComponents()  
	{
		m_ConditionItem = new CCINone;
		m_ConditionTarget = new CCTCursor;
	}
	
	override bool HasProneException()
	{
		return true;
	}

	override bool ActionConditionContinue( ActionData action_data )
	{
		return true;
	}
	
	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		EntityAI tgt_entity = EntityAI.Cast( target.GetObject() );
		
		if ( tgt_entity && BaseBuildingBase.Cast(tgt_entity) &&!tgt_entity.IsBeingPlaced() )
		{
			string component_name = tgt_entity.GetActionComponentName( target.GetComponentIndex() );
			
			/*if (!tgt_entity.GetInventory().HasInventorySlot(InventorySlots.GetSlotIdFromString(component_name)))
				return false;*/
			
			ItemBase attachment = ItemBase.Cast(tgt_entity.FindAttachmentBySlotName(component_name));
			
			if ( attachment && player.GetInventory().CanAddEntityIntoInventory(attachment) && attachment.IsTakeable() )
			{
				return true;
			}
		}
		return false;
	}
	
	override bool CanBeUsedOnBack()
	{
		return true;
	}
	
	override bool InventoryReservation(ActionData action_data)
	{
		bool success = true;
		
		InventoryLocation il = new InventoryLocation;
		
		EntityAI tgt_entity = EntityAI.Cast( action_data.m_Target.GetObject() );
		string component_name = tgt_entity.GetActionComponentName( action_data.m_Target.GetComponentIndex() );
		ItemBase attachment;
		
		if ( tgt_entity && ItemBase.CastTo(attachment, tgt_entity.FindAttachmentBySlotName(component_name)) )
		{
			action_data.m_Player.GetInventory().FindFreeLocationFor( attachment , FindInventoryLocationType.ANY, il );
			if ( action_data.m_Player.GetInventory().HasInventoryReservation( attachment, il) )
			{
				success = false;
			}
			else
			{
				action_data.m_Player.GetInventory().AddInventoryReservationEx( attachment, 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;
		}
		
		//Debug.Log("[Action DEBUG] Start time stamp: " + action_data.m_Player.GetSimulationTimeStamp());
		EntityAI tgt_entity = EntityAI.Cast( action_data.m_Target.GetObject() );
		string component_name = tgt_entity.GetActionComponentName( action_data.m_Target.GetComponentIndex() );
		ItemBase attachment;
		
		if ( tgt_entity && ItemBase.CastTo(attachment, tgt_entity.FindAttachmentBySlotName(component_name)) )
		{
			InventoryLocation il = action_data.m_ReservedInventoryLocations.Get(0);	
			InventoryLocation targetInventoryLocation = new InventoryLocation;
			attachment.GetInventory().GetCurrentInventoryLocation(targetInventoryLocation);
			ClearInventoryReservationEx(action_data);
			//SplitItemUtils.TakeOrSplitToInventoryLocation( action_data.m_Player, il );
			
			float stackable = attachment.GetTargetQuantityMax(il.GetSlot());
			
			if( stackable == 0 || stackable >= attachment.GetQuantity() )
			{
				action_data.m_Player.PredictiveTakeToDst(targetInventoryLocation, il);
			}
			else
			{
				attachment.SplitIntoStackMaxToInventoryLocationClient( il );
			}
		}
		//action_data.m_Player.PredictiveTakeToDst(targetInventoryLocation, il);
	}
};