ActionRepairPart.c
class RepairPartActionReciveDataclass RepairPartActionDataclass ActionRepairPartCBclass ActionRepairPart
/*
TODO:
No pairing with part and tool similar to 'CanUseToolToBuildPart' exists here, since only one type of part is damage-able at this point.
This should be handled by adding "repair_action_type" array to basebuilding and tool configs, this would allow for independent pairing of repair action.
*/
class RepairPartActionReciveData : ActionReciveData
{
int m_ComponentIndexRecived;
}
class RepairPartActionData : ActionData
{
int m_ComponentIndex;
}
class ActionRepairPartCB : ActionContinuousBaseCB
{
override void CreateActionComponent()
{
float time = SetCallbackDuration(m_ActionData.m_MainItem);
m_ActionData.m_ActionComponent = new CAContinuousRepeat( time );
}
float SetCallbackDuration( ItemBase item )
{
/*switch( item.Type() )
{
case WoodAxe:
return UATimeSpent.BASEBUILDING_REPAIR_SLOW;
default:
return UATimeSpent.BASEBUILDING_REPAIR_FAST;
}*/
return UATimeSpent.BASEBUILDING_REPAIR_FAST;
}
};
class ActionRepairPart: ActionDismantlePart
{
void ActionRepairPart()
{
m_CallbackClass = ActionRepairPartCB;
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_ASSEMBLE;
m_FullBody = true;
m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
m_SpecialtyWeight = UASoftSkillsWeight.ROUGH_HIGH;
m_Text = "#repair";
}
override void CreateConditionComponents()
{
m_ConditionItem = new CCINonRuined;
m_ConditionTarget = new CCTNonRuined( UAMaxDistances.BASEBUILDING );
}
override void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
{
ConstructionActionData construction_action_data = player.GetConstructionActionData();
m_Text = "#repair " + construction_action_data.GetTargetPart().GetName();
}
override string GetText()
{
PlayerBase player = PlayerBase.Cast( g_Game.GetPlayer() );
if ( player )
{
ConstructionActionData construction_action_data = player.GetConstructionActionData();
ConstructionPart constrution_part = construction_action_data.GetTargetPart();
if ( constrution_part )
{
return "#repair" + " " + constrution_part.GetName();
}
}
return "";
}
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 RepairCondition( player, target, item, true );
}
override bool ActionConditionContinue( ActionData action_data )
{
return RepairCondition( 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();
//repairing
string part_name = action_data.m_Target.GetObject().GetActionComponentName( RepairPartActionData.Cast(action_data).m_ComponentIndex );
string zone_name;
PluginRepairing module_repairing;
Class.CastTo(module_repairing, GetPlugin(PluginRepairing));
DamageSystem.GetDamageZoneFromComponentName(base_building,part_name,zone_name);
module_repairing.Repair(action_data.m_Player,action_data.m_MainItem,base_building,m_SpecialtyWeight,zone_name);
//consume materials
construction.TakeMaterialsServer(part_name,true);
//add damage to tool
action_data.m_MainItem.DecreaseHealth( UADamageApplied.REPAIR, false );
}
protected override void SetBuildingAnimation( ItemBase item )
{
switch( item.Type() )
{
case Pickaxe:
case Shovel:
case FarmingHoe:
case FieldShovel:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DIG;
break;
case Pliers:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_INTERACT;
break;
default:
m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_ASSEMBLE;
break;
}
}
override ActionData CreateActionData()
{
RepairPartActionData action_data = new RepairPartActionData;
return action_data;
}
override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
{
super.WriteToContext(ctx, action_data);
RepairPartActionData repair_action_data;
if( HasTarget() && Class.CastTo(repair_action_data,action_data) )
{
repair_action_data.m_ComponentIndex = action_data.m_Target.GetComponentIndex();
ctx.Write(repair_action_data.m_ComponentIndex);
}
}
override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
{
if(!action_recive_data)
{
action_recive_data = new RepairPartActionReciveData;
}
RepairPartActionReciveData recive_data_repair = RepairPartActionReciveData.Cast(action_recive_data);
super.ReadFromContext(ctx, action_recive_data);
if( HasTarget() )
{
int component_index;
if ( !ctx.Read(component_index) )
return false;
recive_data_repair.m_ComponentIndexRecived = component_index;
}
return true;
}
override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
{
super.HandleReciveData(action_recive_data, action_data);
RepairPartActionReciveData recive_data_repair = RepairPartActionReciveData.Cast(action_recive_data);
RepairPartActionData.Cast(action_data).m_ComponentIndex = recive_data_repair.m_ComponentIndexRecived;
}
protected bool RepairCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check )
{
string zone_name;
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.GetConstructionPart( part_name );
if ( construction_part )
{
//camera and position checks
if ( !base_building.IsFacingPlayer( player, part_name ) && !player.GetInputController().CameraIsFreeLook() && base_building.HasProperDistance( construction_part.GetMainPartName(), player ) )
{
//Camera check (client-only)
if ( camera_check )
{
if ( g_Game && ( !g_Game.IsDedicatedServer() ) )
{
if ( base_building.IsFacingCamera( part_name ) )
{
return false;
}
}
}
//damage check
DamageSystem.GetDamageZoneFromComponentName(base_building,part_name,zone_name);
if ( base_building.GetHealthLevel(zone_name) < GameConstants.STATE_WORN || base_building.GetHealthLevel(zone_name) == GameConstants.STATE_RUINED )
{
return false;
}
//materials check
if ( !construction.HasMaterials(part_name,true) )
{
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 " repaired " + action_data.m_Target.GetObject().GetDisplayName() + " with " + action_data.m_MainItem.GetDisplayName();
}
}