DIFF

ActionUnlockContainerDoor.c

class ActionUnlockShippingContainer: ActionUnlockDoors
{
	//custom condition, wrong key unlock attempt is allowed
	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		ContainerLockedBase shipCont;
		if (Class.CastTo(shipCont, target.GetObject()))
		{
			int doorIndex = TranslateLockSelectionIntoDoorIdx(target);
			if (doorIndex != -1)
				return shipCont.IsDoorLocked(doorIndex);
		}		
		return false;
	}
	
	override void OnFinishProgressServer( ActionData action_data )
	{
		ShippingContainerKeys_ColorBase key = ShippingContainerKeys_ColorBase.Cast(action_data.m_MainItem);
		ContainerLockedBase shipCont = ContainerLockedBase.Cast(action_data.m_Target.GetObject());
		if (shipCont && key && ((shipCont.GetLockCompatibilityType(shipCont.GetDoorIndex(action_data.m_Target.GetComponentIndex())) & key.GetKeyCompatibilityType()) == 0))
		{
			key.DestroyKeyServer();
		}
		else
		{
			UnlockDoor(action_data.m_Target);
			MiscGameplayFunctions.DealAbsoluteDmg(action_data.m_MainItem, APPLIED_DMG);
		}
	}
	
	override protected void UnlockDoor(ActionTarget target)
	{
		Building building;
		if (Class.CastTo(building, target.GetObject()))
		{
			int doorIndex = TranslateLockSelectionIntoDoorIdx(target);
			if (doorIndex != -1)
			{
				building.UnlockDoor(doorIndex,false);
			}
		}
	}
	
	//! Returns door idx
	protected int TranslateLockSelectionIntoDoorIdx(ActionTarget target)
	{
		//side1_lock
		ContainerLockedBase shipCont;
		if (Class.CastTo(shipCont, target.GetObject()))
		{
			string selectionName = shipCont.GetActionComponentName( target.GetComponentIndex() );
			
			if (selectionName.Contains("_lock"))
				return (selectionName.Substring(4,1).ToInt() - 1);
		}
		
		return -1;
	}
};