ActionDestroyPart.c
class ActionDestroyPartCB : ActionContinuousBaseCB
{
override void CreateActionComponent()
{
m_ActionData.m_ActionComponent = new CAContinuousRepeat( UATimeSpent.DEFAULT_DESTROY/ActionDestroyPart.Cast(m_ActionData.m_Action).CYCLES );
}
};
class ActionDestroyPart: ActionContinuousBase
{
static int CYCLES = 4;
void ActionDestroyPart()
{
m_CallbackClass = ActionDestroyPartCB;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DISASSEMBLE;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
m_SpecialtyWeight = UASoftSkillsWeight.ROUGH_HIGH;
m_Text = "#destroy";
}
override void CreateConditionComponents()
{
m_ConditionItem = new CCINonRuined;
m_ConditionTarget = new CCTNone;
}
override void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
{
ConstructionActionData construction_action_data = player.GetConstructionActionData();
m_Text = "#destroy " + construction_action_data.GetTargetPart();
}
override bool CanBeUsedLeaning()
{
return false;
}
override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
{
//Action not allowed if player has broken legs
if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
return false;
return DestroyCondition( player, target, item, true );
}
override bool ActionConditionContinue( ActionData action_data )
{
return DestroyCondition( action_data.m_Player, action_data.m_Target, action_data.m_MainItem , false );
}
override void OnFinishProgressServer( ActionData action_data )
{
BaseBuildingBase base_building = BaseBuildingBase.Cast( action_data.m_Target.GetObject() );
Construction construction = base_building.GetConstruction();
ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
ConstructionPart construction_part = construction_action_data.GetTargetPart();
if ( construction.CanDestroyPart( construction_part.GetPartName() ) )
{
//build
string part_name = construction_part.GetPartName();
string zone_name;
DamageSystem.GetDamageZoneFromComponentName(base_building,part_name,zone_name);
if (zone_name != "")
{
base_building.AddHealth(zone_name,"Health",-(base_building.GetMaxHealth(zone_name,"")/CYCLES));
if ( base_building.GetHealth(zone_name,"Health") < 1 )
construction.DestroyPartServer( action_data.m_Player, construction_part.GetPartName(), AT_DESTROY_PART );
}
else
{
construction.DestroyPartServer( action_data.m_Player, construction_part.GetPartName(), AT_DESTROY_PART );
}
//add damage to tool
action_data.m_MainItem.DecreaseHealth( UADamageApplied.DESTROY, false );
}
}
protected bool DestroyCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check )
{
Object target_object = target.GetObject();
if ( target_object && target_object.CanUseConstruction() )
{
string part_name = target_object.GetActionComponentName( target.GetComponentIndex() );
BaseBuildingBase base_building = BaseBuildingBase.Cast( target_object );
Construction construction = base_building.GetConstruction();
ConstructionPart construction_part = construction.GetConstructionPartToDestroy( part_name );
if ( construction_part )
{
//camera and position checks
if ( !player.GetInputController().CameraIsFreeLook() && IsInReach(player, target, UAMaxDistances.DEFAULT) && !player.GetInputController().CameraIsFreeLook() )
{
//Camera check (client-only)
if ( camera_check )
{
if ( g_Game && ( !g_Game.IsDedicatedServer() ) )
{
if ( !base_building.IsFacingCamera( part_name ) )
{
return false;
}
}
}
ConstructionActionData construction_action_data = player.GetConstructionActionData();
construction_action_data.SetTargetPart( construction_part );
return true;
}
}
}
return false;
}
override string GetAdminLogMessage(ActionData action_data)
{
return " destroyed " + action_data.m_Target.GetObject().GetDisplayName() + " with " + action_data.m_MainItem.GetDisplayName();
}
}