actiondestroypart.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. class ActionDestroyPartCB : ActionContinuousBaseCB
  2. {
  3. override void CreateActionComponent()
  4. {
  5. m_ActionData.m_ActionComponent = new CAContinuousRepeat( UATimeSpent.DEFAULT_DESTROY/ActionDestroyPart.Cast(m_ActionData.m_Action).CYCLES );
  6. }
  7. };
  8. class ActionDestroyPart: ActionContinuousBase
  9. {
  10. static int CYCLES = 4;
  11. void ActionDestroyPart()
  12. {
  13. m_CallbackClass = ActionDestroyPartCB;
  14. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DISASSEMBLE;
  15. m_FullBody = true;
  16. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
  17. m_SpecialtyWeight = UASoftSkillsWeight.ROUGH_HIGH;
  18. m_Text = "#destroy";
  19. }
  20. override void CreateConditionComponents()
  21. {
  22. m_ConditionItem = new CCINonRuined;
  23. m_ConditionTarget = new CCTNone;
  24. }
  25. override void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
  26. {
  27. ConstructionActionData construction_action_data = player.GetConstructionActionData();
  28. m_Text = "#destroy " + construction_action_data.GetTargetPart();
  29. }
  30. override bool CanBeUsedLeaning()
  31. {
  32. return false;
  33. }
  34. override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
  35. {
  36. //Action not allowed if player has broken legs
  37. if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
  38. return false;
  39. return DestroyCondition( player, target, item, true );
  40. }
  41. override bool ActionConditionContinue( ActionData action_data )
  42. {
  43. return DestroyCondition( action_data.m_Player, action_data.m_Target, action_data.m_MainItem , false );
  44. }
  45. override void OnFinishProgressServer( ActionData action_data )
  46. {
  47. BaseBuildingBase base_building = BaseBuildingBase.Cast( action_data.m_Target.GetObject() );
  48. Construction construction = base_building.GetConstruction();
  49. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  50. ConstructionPart construction_part = construction_action_data.GetTargetPart();
  51. if ( construction.CanDestroyPart( construction_part.GetPartName() ) )
  52. {
  53. //build
  54. string part_name = construction_part.GetPartName();
  55. string zone_name;
  56. DamageSystem.GetDamageZoneFromComponentName(base_building,part_name,zone_name);
  57. if (zone_name != "")
  58. {
  59. base_building.AddHealth(zone_name,"Health",-(base_building.GetMaxHealth(zone_name,"")/CYCLES));
  60. if ( base_building.GetHealth(zone_name,"Health") < 1 )
  61. construction.DestroyPartServer( action_data.m_Player, construction_part.GetPartName(), AT_DESTROY_PART );
  62. }
  63. else
  64. {
  65. construction.DestroyPartServer( action_data.m_Player, construction_part.GetPartName(), AT_DESTROY_PART );
  66. }
  67. //add damage to tool
  68. action_data.m_MainItem.DecreaseHealth( UADamageApplied.DESTROY, false );
  69. }
  70. }
  71. protected bool DestroyCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check )
  72. {
  73. Object target_object = target.GetObject();
  74. if ( target_object && target_object.CanUseConstruction() )
  75. {
  76. string part_name = target_object.GetActionComponentName( target.GetComponentIndex() );
  77. BaseBuildingBase base_building = BaseBuildingBase.Cast( target_object );
  78. Construction construction = base_building.GetConstruction();
  79. ConstructionPart construction_part = construction.GetConstructionPartToDestroy( part_name );
  80. if ( construction_part )
  81. {
  82. //camera and position checks
  83. if ( !player.GetInputController().CameraIsFreeLook() && IsInReach(player, target, UAMaxDistances.DEFAULT) && !player.GetInputController().CameraIsFreeLook() )
  84. {
  85. //Camera check (client-only)
  86. if ( camera_check )
  87. {
  88. if ( GetGame() && ( !GetGame().IsDedicatedServer() ) )
  89. {
  90. if ( !base_building.IsFacingCamera( part_name ) )
  91. {
  92. return false;
  93. }
  94. }
  95. }
  96. ConstructionActionData construction_action_data = player.GetConstructionActionData();
  97. construction_action_data.SetTargetPart( construction_part );
  98. return true;
  99. }
  100. }
  101. }
  102. return false;
  103. }
  104. override string GetAdminLogMessage(ActionData action_data)
  105. {
  106. return " destroyed " + action_data.m_Target.GetObject().GetDisplayName() + " with " + action_data.m_MainItem.GetDisplayName();
  107. }
  108. }