areadamagecomponent.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. class AreaDamageComponentData
  2. {
  3. string Hitzone = "";
  4. vector Modelpos = "0.5 0.5 0.5";
  5. }
  6. class AreaDamageComponent : AreaDamageEvents
  7. {
  8. AreaDamageManager m_Parent;
  9. int m_DamageType;
  10. string m_AmmoName;
  11. ref array<typename> m_DamageableTypes
  12. void AreaDamageComponent(AreaDamageManager parent)
  13. {
  14. m_Parent = parent;
  15. m_DamageType = DT_CUSTOM;
  16. m_AmmoName = "MeleeDamage";
  17. m_DamageableTypes = new array<typename>;
  18. m_DamageableTypes.Insert(DayZPlayer);
  19. }
  20. override bool OnEvaluateDamage(TriggerInsider insider, float damageCoef)
  21. {
  22. // No need to damage if the coef is 0!
  23. if ( ShouldDamage(insider.GetObject()) && damageCoef > 0 )
  24. return EvaluateDamageInternal(insider, damageCoef);
  25. return false;
  26. }
  27. override void PreDamageActions()
  28. {
  29. m_Parent.PreDamageActions();
  30. }
  31. override void PostDamageActions()
  32. {
  33. m_Parent.PostDamageActions();
  34. }
  35. protected bool ShouldDamage(Object object)
  36. {
  37. return object && object.IsAlive() && object.IsAnyInherited( m_DamageableTypes );
  38. }
  39. protected AreaDamageComponentData GetAreaDamageComponentData(Object object)
  40. {
  41. return new AreaDamageComponentData;
  42. }
  43. private bool EvaluateDamageInternal(TriggerInsider insider, float damageCoef)
  44. {
  45. PreDamageActions();
  46. AreaDamageTriggerInsider dInsider;
  47. if ( CastTo( dInsider, insider ) )
  48. dInsider.lastDamaged = g_Game.GetTickTime();
  49. Object object = insider.GetObject();
  50. AreaDamageComponentData data = GetAreaDamageComponentData(object);
  51. object.ProcessDirectDamage(m_DamageType, m_Parent.GetParentObject(), data.Hitzone, m_AmmoName, data.Modelpos, damageCoef);
  52. PostDamageActions();
  53. return true;
  54. }
  55. }