DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ FightLogic()

bool DayZInfected::FightLogic ( int pCurrentCommandID,
DayZInfectedInputController pInputController,
float pDt )
inlineprotected

player is in block stance and facing the infected

infected is playing heavy attack - decrease the dmg to light

override hit pos by pos defined in type

infected is playing light attack - do not send damage, play animation instead

override hit pos by pos defined in type

См. определение в файле ZombieBase.c строка 607

608 {
609 if (pCurrentCommandID == DayZInfectedConstants.COMMANDID_MOVE)
610 {
611 // we attack only in chase & fight state
612 int mindState = pInputController.GetMindState();
613 if (mindState == DayZInfectedConstants.MINDSTATE_CHASE)
614 {
615 return ChaseAttackLogic(pCurrentCommandID, pInputController, pDt);
616 }
617 else if (mindState == DayZInfectedConstants.MINDSTATE_FIGHT)
618 {
619 return FightAttackLogic(pCurrentCommandID, pInputController, pDt);
620 }
621 }
622 else if (pCurrentCommandID == DayZInfectedConstants.COMMANDID_ATTACK)
623 {
624 DayZInfectedCommandAttack attackCommand = GetCommand_Attack();
625 if (attackCommand && attackCommand.WasHit())
626 {
627 if (m_ActualTarget != null)
628 {
629 if (m_ActualTarget.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE)
630 return false;
631
632 bool playerInBlockStance = false;
633 vector targetPos = m_ActualTarget.GetPosition();
634 vector hitPosWS = targetPos;
635 vector zombiePos = GetPosition();
636
637 PlayerBase playerTarget = PlayerBase.Cast(m_ActualTarget);
638 if (playerTarget)
639 {
640 playerInBlockStance = playerTarget.GetMeleeFightLogic() && playerTarget.GetMeleeFightLogic().IsInBlock();
641 }
642
643 if (vector.DistanceSq(targetPos, zombiePos) <= m_ActualAttackType.m_Distance * m_ActualAttackType.m_Distance)
644 {
646 if (playerInBlockStance && (Math.RAD2DEG * Math.AbsFloat(Math3D.AngleFromPosition(targetPos, MiscGameplayFunctions.GetHeadingVector(playerTarget), zombiePos))) <= GameConstants.AI_MAX_BLOCKABLE_ANGLE)
647 {
649 if (m_ActualAttackType.m_IsHeavy == 1)
650 {
651 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition());
652 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "MeleeZombie", hitPosWS);
653 }
654 else
655 {
657 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition());
658 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), "Dummy_Light", hitPosWS);
659 }
660 }
661 else
662 {
663 hitPosWS = m_ActualTarget.ModelToWorld(m_ActualTarget.GetDefaultHitPosition());
664 DamageSystem.CloseCombatDamageName(this, m_ActualTarget, m_ActualTarget.GetHitComponentForAI(), m_ActualAttackType.m_AmmoType, hitPosWS);
665 }
666 }
667 }
668 }
669
670 return true;
671 }
672
673 return false;
674 }
DayZInfectedConstants
Определения DayZInfected.c:2
EMeleeTargetType
Определения EMeleeTargetType.c:2
DayZInfectedAttackType m_ActualAttackType
Определения ZombieBase.c:605
EntityAI m_ActualTarget
Определения ZombieBase.c:603
bool FightAttackLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
Определения ZombieBase.c:717
bool ChaseAttackLogic(int pCurrentCommandID, DayZInfectedInputController pInputController, float pDt)
Определения ZombieBase.c:676
proto native int GetMindState()
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9

Перекрестные ссылки Math::AbsFloat(), GameConstants::AI_MAX_BLOCKABLE_ANGLE, Math3D::AngleFromPosition(), ChaseAttackLogic(), vector::DistanceSq(), FightAttackLogic(), DayZInfectedInputController::GetMindState(), GetPosition, m_ActualAttackType, m_ActualTarget и Math::RAD2DEG.

Используется в CommandHandler().