actionemptymagazine.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. class EmptyMagazineActionData : ActionData
  2. {
  3. Magazine m_magazinePile;
  4. }
  5. class ActionEmptyMagazineCB : ActionContinuousBaseCB
  6. {
  7. override void CreateActionComponent()
  8. {
  9. m_ActionData.m_ActionComponent = new CAContinuousRepeat(UATimeSpent.MAG_EMPTY);
  10. }
  11. };
  12. class ActionEmptyMagazine: ActionContinuousBase
  13. {
  14. void ActionEmptyMagazine()
  15. {
  16. m_CallbackClass = ActionEmptyMagazineCB;
  17. m_CommandUID = DayZPlayerConstants.CMD_ACTIONMOD_EMPTYMAG;
  18. m_CommandUIDProne = DayZPlayerConstants.CMD_ACTIONFB_EMPTYMAG;
  19. m_Text = "#empty_magazine";
  20. }
  21. override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL)
  22. {
  23. if ( super.SetupAction( player, target, item, action_data, extra_data))
  24. {
  25. EmptyMagazineActionData emActionData = EmptyMagazineActionData.Cast(action_data);
  26. emActionData.m_magazinePile = NULL;
  27. return true;
  28. }
  29. return false;
  30. }
  31. override ActionData CreateActionData()
  32. {
  33. EmptyMagazineActionData action_data = new EmptyMagazineActionData;
  34. return action_data;
  35. }
  36. override void CreateConditionComponents()
  37. {
  38. m_ConditionItem = new CCINonRuined;
  39. m_ConditionTarget = new CCTNone;
  40. }
  41. override bool HasProneException()
  42. {
  43. return true;
  44. }
  45. bool CanEmpty(ItemBase item)
  46. {
  47. Magazine mag;
  48. return ( item && Class.CastTo(mag, item) && mag.GetAmmoCount() > 0 );
  49. }
  50. override bool ActionConditionContinue( ActionData action_data )
  51. {
  52. return CanEmpty(action_data.m_MainItem);
  53. }
  54. override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
  55. {
  56. Magazine itm;
  57. return CanEmpty(item);
  58. }
  59. override bool HasTarget()
  60. {
  61. return false;
  62. }
  63. override void OnExecuteServer( ActionData action_data )
  64. {
  65. EmptyMagazineActionData emActionData = EmptyMagazineActionData.Cast(action_data);
  66. Magazine mag;
  67. if (!Class.CastTo(mag, action_data.m_MainItem))
  68. return;
  69. float dmg;
  70. string ammoType;
  71. if (!mag.ServerAcquireCartridge(dmg,ammoType))
  72. return;
  73. mag.ApplyManipulationDamage();
  74. string magazineTypeName;
  75. GetGame().ConfigGetText( "CfgAmmo " + ammoType + " spawnPileType" , magazineTypeName);
  76. if (!DayZPlayerUtils.HandleStoreCartridge(action_data.m_Player, NULL, -1, dmg, ammoType, magazineTypeName, false))
  77. {
  78. array< Magazine > piles;
  79. vector posHead;
  80. MiscGameplayFunctions.GetHeadBonePos(action_data.m_Player,posHead);
  81. vector posTarget = action_data.m_Player.GetPosition() + (action_data.m_Player.GetDirection() * DEFAULT_SPAWN_DISTANCE);
  82. if (!emActionData.m_magazinePile)
  83. {
  84. piles = MiscGameplayFunctions.CreateMagazinePilesDispersed(magazineTypeName,posHead,posTarget,UAItemsSpreadRadius.NARROW,1,dmg,action_data.m_Player);
  85. if (piles.Count() > 0)
  86. emActionData.m_magazinePile = piles[0];
  87. }
  88. else
  89. {
  90. if (emActionData.m_magazinePile.GetAmmoMax() > emActionData.m_magazinePile.GetAmmoCount() && emActionData.m_magazinePile.GetType() == magazineTypeName && (vector.DistanceSq(action_data.m_Player.GetPosition(), emActionData.m_magazinePile.GetPosition()) < (UAMaxDistances.DEFAULT * UAMaxDistances.DEFAULT)))
  91. {
  92. emActionData.m_magazinePile.ServerStoreCartridge(dmg,ammoType);
  93. }
  94. else
  95. {
  96. piles = MiscGameplayFunctions.CreateMagazinePilesFromBulletDispersed(ammoType,posHead,posTarget,UAItemsSpreadRadius.VERY_NARROW,1,dmg,action_data.m_Player);
  97. if (piles.Count() > 0)
  98. emActionData.m_magazinePile = piles[0];
  99. }
  100. }
  101. }
  102. }
  103. };