Advertisement
MrNobody31489

Monsters.c

Apr 21st, 2024
786
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 44.32 KB | Gaming | 0 0
  1. class PITSTOP_Monsters_Werewolf_Base extends ZombieMaleBase
  2. {
  3.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  4.     {
  5.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  6.         {
  7.             // we attack only in chase & fight state
  8.             int mindState = pInputController.GetMindState();
  9.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  10.             {
  11.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  12.             }
  13.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  14.             {
  15.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  16.             }
  17.         }
  18.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  19.         {
  20.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  21.             if( attackCommand && attackCommand.WasHit() )
  22.             {
  23.                 if( m_ActualTarget != NULL )
  24.                 {
  25.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  26.                     {
  27.                         return false;
  28.                     }
  29.                     bool playerInBlockStance = false;
  30.                     vector targetPos = m_ActualTarget.GetPosition();
  31.                     vector hitPosWS = targetPos;
  32.  
  33.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  34.                     if( playerTarget )
  35.                     {
  36.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  37.                     }
  38.  
  39.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  40.                     {
  41.                         //! player is in block stance
  42.                         if( playerInBlockStance )
  43.                         {
  44.                             //! infected is playing heavy attack - decrease the dmg to light
  45.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  46.                             {
  47.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  48.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleeWerewolfPitstop", hitPosWS);
  49.                             }
  50.                             else
  51.                             {
  52.                                 //! infected is playing light attack - do not send damage, play animation instead
  53.                                 if( GetGame().IsServer() )
  54.                                 {
  55.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  56.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleeWerewolfPitstop", hitPosWS, 1.0);
  57.                                 }
  58.                             }
  59.                         }
  60.                         else
  61.                         {
  62.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  63.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleeWerewolfPitstop", hitPosWS);
  64.                         }
  65.                     }
  66.                 }
  67.             }
  68.            
  69.             return true;
  70.         }
  71.                
  72.         return false;
  73.     }
  74.    
  75.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  76.     {
  77.         return false;
  78.     }
  79. };
  80. class PITSTOP_Monsters_Werewolf_Skin extends PITSTOP_Monsters_Werewolf_Base {};
  81. class PITSTOP_Monsters_Werewolf_White extends PITSTOP_Monsters_Werewolf_Base {};
  82. class PITSTOP_Monsters_Werewolf_Black extends PITSTOP_Monsters_Werewolf_Base {};
  83.  
  84. class PITSTOP_Monsters_Werebear_Base extends ZombieMaleBase
  85. {
  86.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  87.     {
  88.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  89.         {
  90.             // we attack only in chase & fight state
  91.             int mindState = pInputController.GetMindState();
  92.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  93.             {
  94.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  95.             }
  96.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  97.             {
  98.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  99.             }
  100.         }
  101.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  102.         {
  103.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  104.             if( attackCommand && attackCommand.WasHit() )
  105.             {
  106.                 if( m_ActualTarget != NULL )
  107.                 {
  108.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  109.                     {
  110.                         return false;
  111.                     }
  112.                     bool playerInBlockStance = false;
  113.                     vector targetPos = m_ActualTarget.GetPosition();
  114.                     vector hitPosWS = targetPos;
  115.  
  116.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  117.                     if( playerTarget )
  118.                     {
  119.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  120.                     }
  121.  
  122.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  123.                     {
  124.                         //! player is in block stance
  125.                         if( playerInBlockStance )
  126.                         {
  127.                             //! infected is playing heavy attack - decrease the dmg to light
  128.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  129.                             {
  130.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  131.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleeWerebearPitstop", hitPosWS);
  132.                             }
  133.                             else
  134.                             {
  135.                                 //! infected is playing light attack - do not send damage, play animation instead
  136.                                 if( GetGame().IsServer() )
  137.                                 {
  138.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  139.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleeWerebearPitstop", hitPosWS, 1.0);
  140.                                 }
  141.                             }
  142.                         }
  143.                         else
  144.                         {
  145.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  146.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleeWerebearPitstop", hitPosWS);
  147.                         }
  148.                     }
  149.                 }
  150.             }
  151.            
  152.             return true;
  153.         }
  154.                
  155.         return false;
  156.     }
  157.    
  158.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  159.     {
  160.         return false;
  161.     }
  162. };
  163.  
  164. class PITSTOP_Monsters_Yeti_Base extends ZombieMaleBase
  165. {
  166.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  167.     {
  168.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  169.         {
  170.             // we attack only in chase & fight state
  171.             int mindState = pInputController.GetMindState();
  172.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  173.             {
  174.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  175.             }
  176.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  177.             {
  178.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  179.             }
  180.         }
  181.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  182.         {
  183.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  184.             if( attackCommand && attackCommand.WasHit() )
  185.             {
  186.                 if( m_ActualTarget != NULL )
  187.                 {
  188.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  189.                     {
  190.                         return false;
  191.                     }
  192.                     bool playerInBlockStance = false;
  193.                     vector targetPos = m_ActualTarget.GetPosition();
  194.                     vector hitPosWS = targetPos;
  195.  
  196.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  197.                     if( playerTarget )
  198.                     {
  199.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  200.                     }
  201.  
  202.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  203.                     {
  204.                         //! player is in block stance
  205.                         if( playerInBlockStance )
  206.                         {
  207.                             //! infected is playing heavy attack - decrease the dmg to light
  208.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  209.                             {
  210.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  211.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleeWerebearPitstop", hitPosWS);
  212.                             }
  213.                             else
  214.                             {
  215.                                 //! infected is playing light attack - do not send damage, play animation instead
  216.                                 if( GetGame().IsServer() )
  217.                                 {
  218.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  219.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleeWerebearPitstop", hitPosWS, 1.0);
  220.                                 }
  221.                             }
  222.                         }
  223.                         else
  224.                         {
  225.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  226.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleeWerebearPitstop", hitPosWS);
  227.                         }
  228.                     }
  229.                 }
  230.             }
  231.            
  232.             return true;
  233.         }
  234.                
  235.         return false;
  236.     }
  237.    
  238.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  239.     {
  240.         return false;
  241.     }
  242. };
  243.  
  244. class PITSTOP_Monsters_Wendigo_Base extends ZombieMaleBase
  245. {
  246.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  247.     {
  248.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  249.         {
  250.             // we attack only in chase & fight state
  251.             int mindState = pInputController.GetMindState();
  252.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  253.             {
  254.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  255.             }
  256.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  257.             {
  258.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  259.             }
  260.         }
  261.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  262.         {
  263.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  264.             if( attackCommand && attackCommand.WasHit() )
  265.             {
  266.                 if( m_ActualTarget != NULL )
  267.                 {
  268.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  269.                     {
  270.                         return false;
  271.                     }
  272.                     bool playerInBlockStance = false;
  273.                     vector targetPos = m_ActualTarget.GetPosition();
  274.                     vector hitPosWS = targetPos;
  275.  
  276.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  277.                     if( playerTarget )
  278.                     {
  279.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  280.                     }
  281.  
  282.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  283.                     {
  284.                         //! player is in block stance
  285.                         if( playerInBlockStance )
  286.                         {
  287.                             //! infected is playing heavy attack - decrease the dmg to light
  288.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  289.                             {
  290.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  291.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleeWendigoPitstop", hitPosWS);
  292.                             }
  293.                             else
  294.                             {
  295.                                 //! infected is playing light attack - do not send damage, play animation instead
  296.                                 if( GetGame().IsServer() )
  297.                                 {
  298.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  299.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleeWendigoPitstop", hitPosWS, 1.0);
  300.                                 }
  301.                             }
  302.                         }
  303.                         else
  304.                         {
  305.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  306.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleeWendigoPitstop", hitPosWS);
  307.                         }
  308.                     }
  309.                 }
  310.             }
  311.            
  312.             return true;
  313.         }
  314.                
  315.         return false;
  316.     }
  317.    
  318.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  319.     {
  320.         return false;
  321.     }
  322. };
  323.  
  324. class PITSTOP_Monsters_Lechen_Base extends ZombieMaleBase
  325. {
  326.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  327.     {
  328.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  329.         {
  330.             // we attack only in chase & fight state
  331.             int mindState = pInputController.GetMindState();
  332.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  333.             {
  334.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  335.             }
  336.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  337.             {
  338.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  339.             }
  340.         }
  341.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  342.         {
  343.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  344.             if( attackCommand && attackCommand.WasHit() )
  345.             {
  346.                 if( m_ActualTarget != NULL )
  347.                 {
  348.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  349.                     {
  350.                         return false;
  351.                     }
  352.                     bool playerInBlockStance = false;
  353.                     vector targetPos = m_ActualTarget.GetPosition();
  354.                     vector hitPosWS = targetPos;
  355.  
  356.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  357.                     if( playerTarget )
  358.                     {
  359.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  360.                     }
  361.  
  362.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  363.                     {
  364.                         //! player is in block stance
  365.                         if( playerInBlockStance )
  366.                         {
  367.                             //! infected is playing heavy attack - decrease the dmg to light
  368.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  369.                             {
  370.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  371.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleeLechenPitstop", hitPosWS);
  372.                             }
  373.                             else
  374.                             {
  375.                                 //! infected is playing light attack - do not send damage, play animation instead
  376.                                 if( GetGame().IsServer() )
  377.                                 {
  378.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  379.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleeLechenPitstop", hitPosWS, 1.0);
  380.                                 }
  381.                             }
  382.                         }
  383.                         else
  384.                         {
  385.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  386.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleeLechenPitstop", hitPosWS);
  387.                         }
  388.                     }
  389.                 }
  390.             }
  391.            
  392.             return true;
  393.         }
  394.                
  395.         return false;
  396.     }
  397.    
  398.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  399.     {
  400.         return false;
  401.     }
  402. };
  403.  
  404. class PITSTOP_Monsters_Syther_Base extends ZombieMaleBase
  405. {
  406.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  407.     {
  408.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  409.         {
  410.             // we attack only in chase & fight state
  411.             int mindState = pInputController.GetMindState();
  412.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  413.             {
  414.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  415.             }
  416.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  417.             {
  418.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  419.             }
  420.         }
  421.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  422.         {
  423.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  424.             if( attackCommand && attackCommand.WasHit() )
  425.             {
  426.                 if( m_ActualTarget != NULL )
  427.                 {
  428.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  429.                     {
  430.                         return false;
  431.                     }
  432.                     bool playerInBlockStance = false;
  433.                     vector targetPos = m_ActualTarget.GetPosition();
  434.                     vector hitPosWS = targetPos;
  435.  
  436.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  437.                     if( playerTarget )
  438.                     {
  439.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  440.                     }
  441.  
  442.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  443.                     {
  444.                         //! player is in block stance
  445.                         if( playerInBlockStance )
  446.                         {
  447.                             //! infected is playing heavy attack - decrease the dmg to light
  448.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  449.                             {
  450.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  451.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleePSSyther", hitPosWS);
  452.                             }
  453.                             else
  454.                             {
  455.                                 //! infected is playing light attack - do not send damage, play animation instead
  456.                                 if( GetGame().IsServer() )
  457.                                 {
  458.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  459.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleePSSyther", hitPosWS, 1.0);
  460.                                 }
  461.                             }
  462.                         }
  463.                         else
  464.                         {
  465.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  466.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleePSSyther", hitPosWS);
  467.                         }
  468.                     }
  469.                 }
  470.             }
  471.            
  472.             return true;
  473.         }
  474.                
  475.         return false;
  476.     }
  477.    
  478.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  479.     {
  480.         //! anim type
  481.         pAnimType = 0; // belly
  482.        
  483.         //! direction
  484.         pAnimHitDir = ComputeHitDirectionAngle(pSource);
  485.         //! shock GetDamage
  486.         m_ShockDamage = GetGame().ConfigGetFloat( "CfgAmmo " + pAmmoType + " DamageApplied " + "Shock " + "damage");
  487.         return true;
  488.     }
  489. };
  490. //class PITSTOP_Monsters_Syther extends PITSTOP_Monsters_Syther_Base {};
  491.  
  492. class PITSTOP_Monsters_Syther extends PITSTOP_Monsters_Syther_Base
  493. {
  494.     protected float m_Scale = 1.5;
  495.    
  496.     void PITSTOP_Monsters_Syther()
  497.     {
  498.         SetEventMask(EntityEvent.POSTFRAME);
  499.         RegisterNetSyncVariableFloat("m_Scale");
  500.     }
  501.  
  502.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  503.     {
  504.         vector rotation = GetYawPitchRoll();
  505.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  506.     }
  507.        
  508.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  509.     {
  510.         vector mat[4];
  511.         GetTransform(mat);
  512.  
  513.         mat[0] = mat[0].Normalized() * m_Scale;
  514.         mat[1] = mat[1].Normalized() * m_Scale;
  515.         mat[2] = mat[2].Normalized() * m_Scale;
  516.  
  517.         SetTransform(mat);
  518.     }
  519.  
  520.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  521.     {
  522.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  523.    
  524.         m_DamageHitToProcess = false;    
  525.     }
  526. }
  527.  
  528. class PITSTOP_Monsters_Reaper_Base extends ZombieMaleBase
  529. {
  530.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  531.     {
  532.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  533.         {
  534.             // we attack only in chase & fight state
  535.             int mindState = pInputController.GetMindState();
  536.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  537.             {
  538.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  539.             }
  540.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  541.             {
  542.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  543.             }
  544.         }
  545.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  546.         {
  547.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  548.             if( attackCommand && attackCommand.WasHit() )
  549.             {
  550.                 if( m_ActualTarget != NULL )
  551.                 {
  552.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  553.                     {
  554.                         return false;
  555.                     }
  556.                     bool playerInBlockStance = false;
  557.                     vector targetPos = m_ActualTarget.GetPosition();
  558.                     vector hitPosWS = targetPos;
  559.  
  560.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  561.                     if( playerTarget )
  562.                     {
  563.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  564.                     }
  565.  
  566.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  567.                     {
  568.                         //! player is in block stance
  569.                         if( playerInBlockStance )
  570.                         {
  571.                             //! infected is playing heavy attack - decrease the dmg to light
  572.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  573.                             {
  574.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  575.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleePSReaper", hitPosWS);
  576.                             }
  577.                             else
  578.                             {
  579.                                 //! infected is playing light attack - do not send damage, play animation instead
  580.                                 if( GetGame().IsServer() )
  581.                                 {
  582.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  583.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleePSReaper", hitPosWS, 1.0);
  584.                                 }
  585.                             }
  586.                         }
  587.                         else
  588.                         {
  589.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  590.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleePSReaper", hitPosWS);
  591.                         }
  592.                     }
  593.                 }
  594.             }
  595.            
  596.             return true;
  597.         }
  598.                
  599.         return false;
  600.     }
  601.    
  602.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  603.     {
  604.         //! anim type
  605.         pAnimType = 0; // belly
  606.        
  607.         //! direction
  608.         pAnimHitDir = ComputeHitDirectionAngle(pSource);
  609.         //! shock GetDamage
  610.         m_ShockDamage = GetGame().ConfigGetFloat( "CfgAmmo " + pAmmoType + " DamageApplied " + "Shock " + "damage");
  611.         return true;
  612.     }
  613. };
  614.  
  615. class PITSTOP_Monsters_Reaper extends PITSTOP_Monsters_Reaper_Base
  616. {
  617.     protected float m_Scale = 2.5;
  618.    
  619.     void PITSTOP_Monsters_Reaper()
  620.     {
  621.         SetEventMask(EntityEvent.POSTFRAME);
  622.         RegisterNetSyncVariableFloat("m_Scale");
  623.     }
  624.  
  625.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  626.     {
  627.         vector rotation = GetYawPitchRoll();
  628.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  629.     }
  630.        
  631.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  632.     {
  633.         vector mat[4];
  634.         GetTransform(mat);
  635.  
  636.         mat[0] = mat[0].Normalized() * m_Scale;
  637.         mat[1] = mat[1].Normalized() * m_Scale;
  638.         mat[2] = mat[2].Normalized() * m_Scale;
  639.  
  640.         SetTransform(mat);
  641.     }
  642.  
  643.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  644.     {
  645.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  646.    
  647.         m_DamageHitToProcess = false;    
  648.     }
  649. }
  650.  
  651. class PITSTOP_Monsters_Gorgund_Base extends ZombieMaleBase
  652. {
  653.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  654.     {
  655.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  656.         {
  657.             // we attack only in chase & fight state
  658.             int mindState = pInputController.GetMindState();
  659.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  660.             {
  661.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  662.             }
  663.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  664.             {
  665.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  666.             }
  667.         }
  668.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  669.         {
  670.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  671.             if( attackCommand && attackCommand.WasHit() )
  672.             {
  673.                 if( m_ActualTarget != NULL )
  674.                 {
  675.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  676.                     {
  677.                         return false;
  678.                     }
  679.                     bool playerInBlockStance = false;
  680.                     vector targetPos = m_ActualTarget.GetPosition();
  681.                     vector hitPosWS = targetPos;
  682.  
  683.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  684.                     if( playerTarget )
  685.                     {
  686.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  687.                     }
  688.  
  689.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  690.                     {
  691.                         //! player is in block stance
  692.                         if( playerInBlockStance )
  693.                         {
  694.                             //! infected is playing heavy attack - decrease the dmg to light
  695.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  696.                             {
  697.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  698.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleePSGorgund", hitPosWS);
  699.                             }
  700.                             else
  701.                             {
  702.                                 //! infected is playing light attack - do not send damage, play animation instead
  703.                                 if( GetGame().IsServer() )
  704.                                 {
  705.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  706.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleePSGorgund", hitPosWS, 1.0);
  707.                                 }
  708.                             }
  709.                         }
  710.                         else
  711.                         {
  712.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  713.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleePSGorgund", hitPosWS);
  714.                         }
  715.                     }
  716.                 }
  717.             }
  718.            
  719.             return true;
  720.         }
  721.                
  722.         return false;
  723.     }
  724.    
  725.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  726.     {
  727.         //! anim type
  728.         pAnimType = 0; // belly
  729.        
  730.         //! direction
  731.         pAnimHitDir = ComputeHitDirectionAngle(pSource);
  732.         //! shock GetDamage
  733.         m_ShockDamage = GetGame().ConfigGetFloat( "CfgAmmo " + pAmmoType + " DamageApplied " + "Shock " + "damage");
  734.         return true;
  735.     }
  736. };
  737.  
  738. class PITSTOP_Monsters_Gorgund extends PITSTOP_Monsters_Gorgund_Base
  739. {
  740.     protected float m_Scale = 1.7;
  741.    
  742.     void PITSTOP_Monsters_Gorgund()
  743.     {
  744.         SetEventMask(EntityEvent.POSTFRAME);
  745.         RegisterNetSyncVariableFloat("m_Scale");
  746.     }
  747.  
  748.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  749.     {
  750.         vector rotation = GetYawPitchRoll();
  751.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  752.     }
  753.        
  754.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  755.     {
  756.         vector mat[4];
  757.         GetTransform(mat);
  758.  
  759.         mat[0] = mat[0].Normalized() * m_Scale;
  760.         mat[1] = mat[1].Normalized() * m_Scale;
  761.         mat[2] = mat[2].Normalized() * m_Scale;
  762.  
  763.         SetTransform(mat);
  764.     }
  765.  
  766.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  767.     {
  768.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  769.    
  770.         m_DamageHitToProcess = false;    
  771.     }
  772. }
  773.  
  774. class PITSTOP_Monsters_Gargoyvile_Base extends ZombieMaleBase
  775. {
  776.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  777.     {
  778.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  779.         {
  780.             // we attack only in chase & fight state
  781.             int mindState = pInputController.GetMindState();
  782.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  783.             {
  784.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  785.             }
  786.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  787.             {
  788.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  789.             }
  790.         }
  791.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  792.         {
  793.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  794.             if( attackCommand && attackCommand.WasHit() )
  795.             {
  796.                 if( m_ActualTarget != NULL )
  797.                 {
  798.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  799.                     {
  800.                         return false;
  801.                     }
  802.                     bool playerInBlockStance = false;
  803.                     vector targetPos = m_ActualTarget.GetPosition();
  804.                     vector hitPosWS = targetPos;
  805.  
  806.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  807.                     if( playerTarget )
  808.                     {
  809.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  810.                     }
  811.  
  812.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  813.                     {
  814.                         //! player is in block stance
  815.                         if( playerInBlockStance )
  816.                         {
  817.                             //! infected is playing heavy attack - decrease the dmg to light
  818.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  819.                             {
  820.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  821.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleePSGargoyvile", hitPosWS);
  822.                             }
  823.                             else
  824.                             {
  825.                                 //! infected is playing light attack - do not send damage, play animation instead
  826.                                 if( GetGame().IsServer() )
  827.                                 {
  828.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  829.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleePSGargoyvile", hitPosWS, 1.0);
  830.                                 }
  831.                             }
  832.                         }
  833.                         else
  834.                         {
  835.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  836.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleePSGargoyvile", hitPosWS);
  837.                         }
  838.                     }
  839.                 }
  840.             }
  841.            
  842.             return true;
  843.         }
  844.                
  845.         return false;
  846.     }
  847.    
  848.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  849.     {
  850.         //! anim type
  851.         pAnimType = 0; // belly
  852.        
  853.         //! direction
  854.         pAnimHitDir = ComputeHitDirectionAngle(pSource);
  855.         //! shock GetDamage
  856.         m_ShockDamage = GetGame().ConfigGetFloat( "CfgAmmo " + pAmmoType + " DamageApplied " + "Shock " + "damage");
  857.         return true;
  858.     }
  859. };
  860.  
  861. class PITSTOP_Monsters_Gargoyvile_1 extends PITSTOP_Monsters_Gargoyvile_Base
  862. {
  863.     protected float m_Scale = 1.6;
  864.    
  865.     void PITSTOP_Monsters_Gargoyvile_1()
  866.     {
  867.         SetEventMask(EntityEvent.POSTFRAME);
  868.         RegisterNetSyncVariableFloat("m_Scale");
  869.     }
  870.  
  871.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  872.     {
  873.         vector rotation = GetYawPitchRoll();
  874.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  875.     }
  876.        
  877.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  878.     {
  879.         vector mat[4];
  880.         GetTransform(mat);
  881.  
  882.         mat[0] = mat[0].Normalized() * m_Scale;
  883.         mat[1] = mat[1].Normalized() * m_Scale;
  884.         mat[2] = mat[2].Normalized() * m_Scale;
  885.  
  886.         SetTransform(mat);
  887.     }
  888.  
  889.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  890.     {
  891.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  892.    
  893.         m_DamageHitToProcess = false;    
  894.     }
  895. }
  896. class PITSTOP_Monsters_Gargoyvile_2 extends PITSTOP_Monsters_Gargoyvile_Base
  897. {
  898.     protected float m_Scale = 1.6;
  899.    
  900.     void PITSTOP_Monsters_Gargoyvile_2()
  901.     {
  902.         SetEventMask(EntityEvent.POSTFRAME);
  903.         RegisterNetSyncVariableFloat("m_Scale");
  904.     }
  905.  
  906.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  907.     {
  908.         vector rotation = GetYawPitchRoll();
  909.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  910.     }
  911.        
  912.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  913.     {
  914.         vector mat[4];
  915.         GetTransform(mat);
  916.  
  917.         mat[0] = mat[0].Normalized() * m_Scale;
  918.         mat[1] = mat[1].Normalized() * m_Scale;
  919.         mat[2] = mat[2].Normalized() * m_Scale;
  920.  
  921.         SetTransform(mat);
  922.     }
  923.  
  924.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  925.     {
  926.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  927.    
  928.         m_DamageHitToProcess = false;    
  929.     }
  930. }
  931. class PITSTOP_Monsters_Gargoyvile_3 extends PITSTOP_Monsters_Gargoyvile_Base
  932. {
  933.     protected float m_Scale = 1.6;
  934.    
  935.     void PITSTOP_Monsters_Gargoyvile_3()
  936.     {
  937.         SetEventMask(EntityEvent.POSTFRAME);
  938.         RegisterNetSyncVariableFloat("m_Scale");
  939.     }
  940.  
  941.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  942.     {
  943.         vector rotation = GetYawPitchRoll();
  944.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  945.     }
  946.        
  947.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  948.     {
  949.         vector mat[4];
  950.         GetTransform(mat);
  951.  
  952.         mat[0] = mat[0].Normalized() * m_Scale;
  953.         mat[1] = mat[1].Normalized() * m_Scale;
  954.         mat[2] = mat[2].Normalized() * m_Scale;
  955.  
  956.         SetTransform(mat);
  957.     }
  958.  
  959.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  960.     {
  961.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  962.    
  963.         m_DamageHitToProcess = false;    
  964.     }
  965. }
  966.  
  967. class PITSTOP_Monsters_MaskedMoose_Base extends AnimalBase
  968. {
  969.     protected float m_Scale = 1.3;
  970.    
  971.     void PITSTOP_Monsters_MaskedMoose_Base()
  972.     {
  973.         SetEventMask(EntityEvent.POSTFRAME);
  974.         RegisterNetSyncVariableFloat("m_Scale");
  975.     }
  976.  
  977.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  978.     {
  979.         vector rotation = GetYawPitchRoll();
  980.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  981.     }
  982.        
  983.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  984.     {
  985.         vector mat[4];
  986.         GetTransform(mat);
  987.  
  988.         mat[0] = mat[0].Normalized() * m_Scale;
  989.         mat[1] = mat[1].Normalized() * m_Scale;
  990.         mat[2] = mat[2].Normalized() * m_Scale;
  991.  
  992.         SetTransform(mat);
  993.     }
  994.  
  995.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  996.     {
  997.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  998.    
  999.         m_DamageHitToProcess = false;    
  1000.     }
  1001.    
  1002.     override void RegisterHitComponentsForAI()
  1003.     {
  1004.         m_DefaultHitComponent = "Zone_Chest";
  1005.         m_DefaultHitPositionComponent = "Pelvis";
  1006.        
  1007.         DayZAIHitComponentHelpers.RegisterHitComponent(m_HitComponentsForAI, "Zone_Head", 2);
  1008.         DayZAIHitComponentHelpers.RegisterHitComponent(m_HitComponentsForAI, "Zone_Neck", 65);
  1009.         DayZAIHitComponentHelpers.RegisterHitComponent(m_HitComponentsForAI, "Zone_Chest", 50);
  1010.         DayZAIHitComponentHelpers.RegisterHitComponent(m_HitComponentsForAI, "Zone_Legs_Back", 75);
  1011.         DayZAIHitComponentHelpers.RegisterHitComponent(m_HitComponentsForAI, "Zone_Legs_Front", 70);
  1012.     }
  1013.    
  1014.     override bool IsDanger()
  1015.     {
  1016.         return true;
  1017.     }
  1018.    
  1019.     override string CaptureSound()
  1020.     {
  1021.         return "DeerRoarLong_SoundSet";
  1022.     }
  1023.    
  1024.     override string ReleaseSound()
  1025.     {
  1026.         return "DeerRoarShort_SoundSet";
  1027.     }
  1028. }
  1029. class PITSTOP_Monsters_MaskedMoose_Bloody extends PITSTOP_Monsters_MaskedMoose_Base {};
  1030. class PITSTOP_Monsters_MaskedMoose_Clean extends PITSTOP_Monsters_MaskedMoose_Base {};
  1031.  
  1032. class PITSTOP_Monsters_Gharlog_Base extends ZombieMaleBase
  1033. {
  1034.     protected float m_Scale = 1.8;
  1035.    
  1036.     void PITSTOP_Monsters_Gharlog_Base()
  1037.     {
  1038.         SetEventMask(EntityEvent.POSTFRAME);
  1039.         RegisterNetSyncVariableFloat("m_Scale");
  1040.     }
  1041.  
  1042.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  1043.     {
  1044.         vector rotation = GetYawPitchRoll();
  1045.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  1046.     }
  1047.        
  1048.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  1049.     {
  1050.         vector mat[4];
  1051.         GetTransform(mat);
  1052.  
  1053.         mat[0] = mat[0].Normalized() * m_Scale;
  1054.         mat[1] = mat[1].Normalized() * m_Scale;
  1055.         mat[2] = mat[2].Normalized() * m_Scale;
  1056.  
  1057.         SetTransform(mat);
  1058.     }
  1059.  
  1060.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  1061.     {
  1062.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  1063.    
  1064.         m_DamageHitToProcess = false;    
  1065.     }
  1066.    
  1067.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  1068.     {
  1069.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  1070.         {
  1071.             // we attack only in chase & fight state
  1072.             int mindState = pInputController.GetMindState();
  1073.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  1074.             {
  1075.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  1076.             }
  1077.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  1078.             {
  1079.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  1080.             }
  1081.         }
  1082.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  1083.         {
  1084.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  1085.             if( attackCommand && attackCommand.WasHit() )
  1086.             {
  1087.                 if( m_ActualTarget != NULL )
  1088.                 {
  1089.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  1090.                     {
  1091.                         return false;
  1092.                     }
  1093.                     bool playerInBlockStance = false;
  1094.                     vector targetPos = m_ActualTarget.GetPosition();
  1095.                     vector hitPosWS = targetPos;
  1096.  
  1097.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  1098.                     if( playerTarget )
  1099.                     {
  1100.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  1101.                     }
  1102.  
  1103.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  1104.                     {
  1105.                         //! player is in block stance
  1106.                         if( playerInBlockStance )
  1107.                         {
  1108.                             //! infected is playing heavy attack - decrease the dmg to light
  1109.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  1110.                             {
  1111.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  1112.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleePSGharlog", hitPosWS);
  1113.                             }
  1114.                             else
  1115.                             {
  1116.                                 //! infected is playing light attack - do not send damage, play animation instead
  1117.                                 if( GetGame().IsServer() )
  1118.                                 {
  1119.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  1120.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleePSGharlog", hitPosWS, 1.0);
  1121.                                 }
  1122.                             }
  1123.                         }
  1124.                         else
  1125.                         {
  1126.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  1127.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleePSGharlog", hitPosWS);
  1128.                         }
  1129.                     }
  1130.                 }
  1131.             }
  1132.            
  1133.             return true;
  1134.         }
  1135.                
  1136.         return false;
  1137.     }
  1138.    
  1139.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  1140.     {
  1141.         return false;
  1142.     }
  1143. };
  1144. class PITSTOP_Monsters_Gharlog extends PITSTOP_Monsters_Gharlog_Base {};
  1145.  
  1146. class PITSTOP_Monsters_FireDemon_Base extends ZombieMaleBase
  1147. {
  1148.     protected float m_Scale = 1.7;
  1149.    
  1150.     void PITSTOP_Monsters_FireDemon_Base()
  1151.     {
  1152.         SetEventMask(EntityEvent.POSTFRAME);
  1153.         RegisterNetSyncVariableFloat("m_Scale");
  1154.     }
  1155.  
  1156.     override void EOnFrame(IEntity other, float timeSlice) // | EntityEvent.FRAME
  1157.     {
  1158.         vector rotation = GetYawPitchRoll();
  1159.         SetYawPitchRoll(Vector(rotation[0], 0, 0));
  1160.     }
  1161.        
  1162.     override void EOnPostFrame(IEntity other, int extra) // | EntityEvent.POSTFRAME
  1163.     {
  1164.         vector mat[4];
  1165.         GetTransform(mat);
  1166.  
  1167.         mat[0] = mat[0].Normalized() * m_Scale;
  1168.         mat[1] = mat[1].Normalized() * m_Scale;
  1169.         mat[2] = mat[2].Normalized() * m_Scale;
  1170.  
  1171.         SetTransform(mat);
  1172.     }
  1173.  
  1174.     override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  1175.     {
  1176.         super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  1177.    
  1178.         m_DamageHitToProcess = false;    
  1179.     }
  1180.    
  1181.     override bool FightLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
  1182.     {
  1183.         if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE )
  1184.         {
  1185.             // we attack only in chase & fight state
  1186.             int mindState = pInputController.GetMindState();
  1187.             if( mindState == DayZInfectedConstants.MINDSTATE_CHASE )
  1188.             {
  1189.                 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
  1190.             }
  1191.             else if( mindState == DayZInfectedConstants.MINDSTATE_FIGHT )
  1192.             {
  1193.                 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
  1194.             }
  1195.         }
  1196.         else if( pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK )
  1197.         {
  1198.             DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
  1199.             if( attackCommand && attackCommand.WasHit() )
  1200.             {
  1201.                 if( m_ActualTarget != NULL )
  1202.                 {
  1203.                     if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE )
  1204.                     {
  1205.                         return false;
  1206.                     }
  1207.                     bool playerInBlockStance = false;
  1208.                     vector targetPos = m_ActualTarget.GetPosition();
  1209.                     vector hitPosWS = targetPos;
  1210.  
  1211.                     PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
  1212.                     if( playerTarget )
  1213.                     {
  1214.                         playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
  1215.                     }
  1216.  
  1217.                     if( vector.DistanceSq(targetPos, this.GetPosition()) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance )
  1218.                     {
  1219.                         //! player is in block stance
  1220.                         if( playerInBlockStance )
  1221.                         {
  1222.                             //! infected is playing heavy attack - decrease the dmg to light
  1223.                             if( m_ActualAttackType.m_IsHeavy != 0 )
  1224.                             {
  1225.                                 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  1226.                                 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleePSFireDemon", hitPosWS);
  1227.                             }
  1228.                             else
  1229.                             {
  1230.                                 //! infected is playing light attack - do not send damage, play animation instead
  1231.                                 if( GetGame().IsServer() )
  1232.                                 {
  1233.                                     hitPosWS = m_ActualTarget.GetDefaultHitPosition(); //! override hit pos by pos defined in type
  1234.                                     m_ActualTarget.EEHitBy(null, 0, this, -1, m_ActualTarget.GetDefaultHitComponent(), "MeleePSFireDemon", hitPosWS, 1.0);
  1235.                                 }
  1236.                             }
  1237.                         }
  1238.                         else
  1239.                         {
  1240.                             hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition()); //! override hit pos by pos defined in type
  1241.                             DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(),  "MeleePSFireDemon", hitPosWS);
  1242.                         }
  1243.                     }
  1244.                 }
  1245.             }
  1246.            
  1247.             return true;
  1248.         }
  1249.                
  1250.         return false;
  1251.     }
  1252.    
  1253.     override bool EvaluateDamageHitAnimation(EntityAI pSource, string pComponent, string pAmmoType, out bool pHeavyHit, out int pAnimType, out float pAnimHitDir)
  1254.     {
  1255.         return false;
  1256.     }
  1257. };
  1258. class PITSTOP_Monsters_FireDemon extends PITSTOP_Monsters_FireDemon_Base {};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement