123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- /*
- 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( GetGame().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 ( GetGame() && ( !GetGame().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();
- }
- }
|