DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
DayZPlayerMeleeFightLogic_LightHeavy.c
См. документацию.
1
6
8{
10 const float EVADE_COOLDOWN = 0.5;
11
12 //
13 const float CLOSE_TARGET_DISTANCE = 1.5;
14
16 const string DUMMY_LIGHT_AMMO = "Dummy_Light";
17 const string DUMMY_HEAVY_AMMO = "Dummy_Heavy";
18
23 protected Mission m_Mission;
24
25 protected bool m_IsInBlock;
26 protected bool m_IsEvading;
27
28 protected bool m_IsInComboRange;
30
35
37 {
38 m_DZPlayer = player;
39 m_Player = PlayerBase.Cast(player);
40 m_MeleeCombat = m_Player.GetMeleeCombat();
42
43 m_IsInBlock = false;
44 m_IsEvading = false;
47
49 }
50
52
53 bool IsInBlock()
54 {
55 return m_IsInBlock;
56 }
57
58 void SetBlock(bool block)
59 {
60 m_IsInBlock = block;
61 }
62
63 bool IsEvading()
64 {
65 return m_IsEvading;
66 }
67
69 {
70 return m_HitType;
71 }
72
73 bool CanFight()
74 {
75 if (m_Player.IsEmotePlaying())
76 return false;
77
78 if (m_Player.GetActionManager() && m_Player.GetActionManager().GetRunningAction())
79 return false;
80
81 return true;
82 }
83
89
91 {
92 if (pInputs.IsMeleeFastAttackModifier() && m_Player.CanConsumeStamina(EStaminaConsumers.MELEE_HEAVY))
93 {
94 return EMeleeHitType.HEAVY;
95 }
96
97 return EMeleeHitType.LIGHT;
98 }
99
101 {
102 if (!m_Player.CanConsumeStamina(EStaminaConsumers.MELEE_HEAVY))
103 {
104 return EMeleeHitType.NONE;
105 }
106
108 if (pEntity.HasBayonetAttached())
109 {
110 return EMeleeHitType.WPN_STAB;
111 }
112 else if (pEntity.HasButtstockAttached())
113 {
114 return EMeleeHitType.WPN_HIT_BUTTSTOCK;
115 }
116
117 return EMeleeHitType.WPN_HIT;
118 }
119
120 protected float GetAttackTypeByDistanceToTarget(EntityAI pTarget, EMeleeTargetType pTargetType = EMeleeTargetType.ALIGNABLE)
121 {
122 if (pTargetType == EMeleeTargetType.NONALIGNABLE)
123 {
124 return 1.0;
125 }
126
129 {
130 return 1.0;
131 }
132
134 return 0.0;
135 }
136
137 bool HandleFightLogic(int pCurrentCommandID, HumanInputController pInputs, EntityAI pEntityInHands, HumanMovementState pMovementState, out bool pContinueAttack)
138 {
139 HumanInventoryWithFSM invFSM = HumanInventoryWithFSM.Cast(m_Player.GetHumanInventory());
140 if (invFSM && !invFSM.IsIdle())
141 return false;
142
143 HumanCommandMove hcm = m_Player.GetCommand_Move();
144 InventoryItem itemInHands = InventoryItem.Cast(pEntityInHands);
145 bool isFireWeapon = itemInHands && itemInHands.IsWeapon();
146
148 if (HandleHitEvent(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack))
149 return false;
150
152 if ((pInputs.IsAttackButtonDown() && !isFireWeapon) || (pInputs.IsMeleeWeaponAttack() && isFireWeapon) || (pContinueAttack && isFireWeapon))
153 {
154 //Debug.MeleeLog(m_Player, string.Format("HandleFightLogic[1] attackButtonDown=%1, meleeWeaponAttack=%2, pContinueAttack=%3, isFireWeapon=%4", pInputs.IsAttackButtonDown(), pInputs.IsMeleeWeaponAttack(), pContinueAttack, isFireWeapon));
155
158 return false;
159
161 if (itemInHands && !itemInHands.IsMeleeWeapon() && !isFireWeapon)
162 return false;
163
165 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_MOVE)
166 {
167 //Debug.MeleeLog(m_Player, "HandleFightLogic[1a]");
169 if (isFireWeapon)
170 {
171 return HandleInitialFirearmMelee(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
172 }
173 else
174 {
176 if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
177 {
178 return HandleInitialMeleeErc(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
179 }
181 else if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
182 {
183 return HandleProneKick(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
184 }
186 else if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT && m_Player.IsSprintFull())
187 {
188 return HandleSprintAttack(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
189 }
190 }
191 }
193 else if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_MELEE2)
194 {
195 m_IsInComboRange = m_Player.GetCommand_Melee2().IsInComboRange();
197 {
198 return HandleComboHit(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
199 }
200 }
201 }
203 else if (!isFireWeapon && pCurrentCommandID == DayZPlayerConstants.COMMANDID_MOVE)
204 {
206 if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
207 {
208 int roll = pInputs.IsMeleeLREvade();
209 if (roll != 0)
210 {
212 if (!m_Player.CanConsumeStamina(EStaminaConsumers.MELEE_EVADE))
213 {
214 return false;
215 }
216
217 float angle;
218 if (roll == 1)
219 {
220 angle = -90; // left
221 }
222 else
223 {
224 angle = 90; // right
225 }
226
227 // start melee evade
228 m_IsEvading = true;
230 hcm.StartMeleeEvadeA(angle);
231 m_Player.DepleteStamina(EStaminaModifiers.MELEE_EVADE);
232
233 //Inflict shock when sidestepping with broken legs
234 if (m_Player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
235 {
237 m_Player.m_ShockHandler.CheckValue(true);
238 }
239 }
240 }
241
243 if (pInputs.IsWeaponRaised() && pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH)
244 {
245 //Debug.MeleeLog(m_Player, "HandleFightLogic[2b]");
246 if (DayZPlayerUtils.PlayerCanChangeStance(m_Player, DayZPlayerConstants.STANCEIDX_RAISEDERECT))
247 {
248 //Debug.MeleeLog(m_Player, "HandleFightLogic[2c]");
249 hcm.ForceStance(DayZPlayerConstants.STANCEIDX_RAISEDERECT);
250
251 return false;
252 }
253 }
254
257 if (!isFireWeapon && (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT || pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE))
258 {
259 float angle2;
260
261 if (hcm.GetCurrentInputAngle(angle2) && (angle2 < -130.0 || angle2 > 130))
262 {
263 hcm.SetMeleeBlock(true);
264 SetBlock(true);
265 }
266 else
267 {
268 hcm.SetMeleeBlock(false);
269 SetBlock(false);
270 }
271 }
272 else
273 {
274 hcm.SetMeleeBlock(false);
275 SetBlock(false);
276 }
277 }
278
279 return false;
280 }
281
283 protected bool HandleHitEvent(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
284 {
286 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_MELEE2)
287 {
288 HumanCommandMelee2 hmc2a = m_Player.GetCommand_Melee2();
289 if (hmc2a)
290 {
292 if (hmc2a.WasHit())
293 {
294 //Debug.MeleeLog(m_Player, "HandleHitEvent[START]");
295 //Debug.MeleeLog(m_Player, string.Format("HandleHitEvent[1] target=%1, hitPos=%2, hitZoneIdx=%3, finisherType=%4", m_MeleeCombat.GetTargetEntity(), m_MeleeCombat.GetHitPos().ToString(), m_MeleeCombat.GetHitZoneIdx(), m_MeleeCombat.GetFinisherType()));
296 if (m_MeleeCombat.GetFinisherType() == -1)
297 {
298 //Debug.MeleeLog(m_Player, string.Format("HandleHitEvent[2] target=%1, hitPos=%2, hitZoneIdx=%3, finisherType=%4", m_MeleeCombat.GetTargetEntity(), m_MeleeCombat.GetHitPos().ToString(), m_MeleeCombat.GetHitZoneIdx(), m_MeleeCombat.GetFinisherType()));
300 m_MeleeCombat.Update(itemInHands, m_HitType, true);
301 }
302
304 EvaluateHit(itemInHands);
305
306 //Get gloves
307 ClothingBase gloves;
308 if (m_HitType == EMeleeHitType.KICK)
309 {
310 //We kick so "gloves" will be the shoes
311 gloves = ClothingBase.Cast(m_Player.GetItemOnSlot("FEET"));
312 }
313 else
314 {
315 gloves = ClothingBase.Cast(m_Player.GetItemOnSlot("GLOVES"));
316 }
317
318 //If we hit something, inflict damage
319 DamageHands(m_Player, gloves, itemInHands);
320
321 m_MeleeCombat.ResetTarget();
322
324
326
327 //Debug.MeleeLog(m_Player, "HandleHitEvent[END]");
328
329 return true;
330 }
331 }
332 }
333
334 return false;
335 }
336
338 protected bool HandleInitialFirearmMelee(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
339 {
341 Weapon_Base weapon = Weapon_Base.Cast(itemInHands);
342 if (weapon.IsWaitingForActionFinish())
343 return false;
344
345 HumanCommandMove hcm = m_Player.GetCommand_Move();
346
348 if (hcm.GetCurrentMovementSpeed() <= 2.05 && (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT || pContinueAttack) && !m_Player.IsFighting())
349 {
351 if ( m_HitType == EMeleeHitType.NONE )
352 {
353 pContinueAttack = false;
354 return false;
355 }
356
357 m_MeleeCombat.Update(itemInHands, m_HitType);
358
359 EntityAI target;
360 EMeleeTargetType targetType;
361 GetTargetData(target, targetType);
362 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
363
364 m_Player.StartCommand_Melee2(target, m_HitType == EMeleeHitType.WPN_STAB, attackByDistance, m_MeleeCombat.GetHitPos());
365 m_Player.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
367
368 pContinueAttack = false; // reset continueAttack flag
369
370 return true;
371 }
373 else if ( pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH )
374 {
375 if (hcm)
376 {
377 hcm.ForceStance(DayZPlayerConstants.STANCEIDX_RAISEDERECT);
378 pContinueAttack = true;
379 return false;
380 }
381 }
382
383 return false;
384 }
385
387 protected bool HandleInitialMeleeErc(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
388 {
389 //Debug.MeleeLog(m_Player, "HandleInitialMeleeErc[1]");
390
392 m_MeleeCombat.Update(itemInHands, m_HitType);
393
394 //Debug.MeleeLog(m_Player, string.Format("HandleInitialMeleeErc[2] %1", EnumTools.EnumToString(EMeleeHitType, m_HitType)));
395
396 EntityAI target;
397 EMeleeTargetType targetType;
398 GetTargetData(target, targetType);
399 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
400
401 // finisher attack hittype override
402 int finisherType = m_MeleeCombat.GetFinisherType();
403 if (finisherType != -1)
404 {
405 int animationType = DetermineFinisherAnimation(finisherType);
406 if (animationType > -1)
407 {
408 //Debug.MeleeLog(m_Player, string.Format("HandleInitialMeleeErc[3a] target=%1, finisherType=%2, animationType=%3, hitPositionWS=%4", target, finisherType, animationType, m_MeleeCombat.GetHitPos().ToString()));
409 m_Player.StartCommand_Melee2(target, animationType, attackByDistance, m_MeleeCombat.GetHitPos());
410 }
411 else
412 {
413 //Debug.MeleeLog(m_Player, string.Format("HandleInitialMeleeErc[3b] target=%1, finisherType=%2, animationType=%3, hitPositionWS=%4", target, finisherType, (m_HitType == EMeleeHitType.HEAVY).ToString(), m_MeleeCombat.GetHitPos().ToString()));
414 m_Player.StartCommand_Melee2(target, m_HitType == EMeleeHitType.HEAVY, attackByDistance, m_MeleeCombat.GetHitPos());
415 }
416
417 m_HitType = finisherType;
418 target.SetBeingBackstabbed(finisherType);
419 }
420 else
421 {
422 //Debug.MeleeLog(m_Player, string.Format("HandleInitialMeleeErc[3d] target=%1, animationType=%2, hitPositionWS=%3", target, (m_HitType == EMeleeHitType.HEAVY).ToString(), m_MeleeCombat.GetHitPos().ToString()));
423 m_Player.StartCommand_Melee2(target, m_HitType == EMeleeHitType.HEAVY, attackByDistance, m_MeleeCombat.GetHitPos());
424 }
425
426 if (m_HitType == EMeleeHitType.HEAVY)
427 {
428 m_Player.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
429 if (m_Player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
430 {
432 m_Player.m_ShockHandler.CheckValue(true);
433 }
434 }
435 else
436 {
437 m_Player.DepleteStamina(EStaminaModifiers.MELEE_LIGHT);
438 if (m_Player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
439 {
441 m_Player.m_ShockHandler.CheckValue(true);
442 }
443 }
444
446
448
449 return true;
450 }
451
453 protected bool HandleProneKick(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
454 {
455 HumanCommandWeapons hcw = m_Player.GetCommandModifier_Weapons();
456
457 float hcw_angle = hcw.GetBaseAimingAngleLR();
460 if ( ( hcw_angle < -90 || hcw_angle > 90 ) && m_Player.GetBrokenLegs() != eBrokenLegs.BROKEN_LEGS )
461 {
462 // targetting
464 m_MeleeCombat.Update(itemInHands, m_HitType);
465
466 EntityAI target;
467 EMeleeTargetType targetType;
468 GetTargetData(target, targetType);
469 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
470
471 // command
472 m_Player.StartCommand_Melee2(target, false, attackByDistance, m_MeleeCombat.GetHitPos());
473 m_Player.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
475
476 return true;
477 }
478
479 return false;
480 }
481
483 protected bool HandleSprintAttack(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
484 {
486 m_HitType = EMeleeHitType.SPRINT;
487 m_MeleeCombat.Update(itemInHands, m_HitType);
488
489 EntityAI target;
490 EMeleeTargetType targetType;
491 GetTargetData(target, targetType);
492 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
493
495 //Debug.MeleeLog(m_Player, string.Format("HandleSprintAttack[1] target=%1, animationType=%2, hitPositionWS=%3", target, false, m_MeleeCombat.GetHitPos().ToString()));
496 m_Player.StartCommand_Melee2(target, false, attackByDistance, m_MeleeCombat.GetHitPos());
497 m_Player.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
499
500 return true;
501 }
502
504 protected bool HandleComboHit(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
505 {
506 //Debug.MeleeLog(m_Player, "HandleComboHit::");
507 m_IsInComboRange = false;
508
511 return false;
512
514 if (itemInHands && itemInHands.IsWeapon())
516 else
518
520 if (m_HitType == EMeleeHitType.NONE)
521 return false;
522
524 if (m_MeleeCombat.GetFinisherType() > -1)
525 return false;
526
527 EntityAI target;
528 EMeleeTargetType targetType;
529 GetTargetData(target, targetType);
530 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
531
533 //Debug.MeleeLog(m_Player, string.Format("HandleComboHit:: %1", EnumTools.EnumToString(EMeleeHitType, m_HitType)));
534 m_MeleeCombat.Update(itemInHands, m_HitType);
535
537 bool isHeavy = (m_HitType == EMeleeHitType.HEAVY || m_HitType == EMeleeHitType.WPN_STAB);
538 m_Player.GetCommand_Melee2().ContinueCombo(isHeavy, attackByDistance, target, m_MeleeCombat.GetHitPos());
540
542 if (m_Player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
543 {
545
546 if (!isHeavy)
548
550 m_Player.m_ShockHandler.CheckValue(true);
551 }
552
554 switch (m_HitType)
555 {
556 case EMeleeHitType.HEAVY:
557 case EMeleeHitType.SPRINT:
558 case EMeleeHitType.WPN_STAB:
559 case EMeleeHitType.WPN_HIT_BUTTSTOCK:
560 case EMeleeHitType.WPN_HIT:
561 m_Player.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
562 break;
563 default:
564 m_Player.DepleteStamina(EStaminaModifiers.MELEE_LIGHT);
565 break;
566 }
567
568 return true;
569 }
570
571 protected void EvaluateHit(InventoryItem weapon)
572 {
573 EntityAI target = m_MeleeCombat.GetTargetEntity();
574
575 if (target)
576 {
577 if (target.IsInherited(DayZPlayer))
578 {
579 EvaluateHit_Player(weapon, target);
580 }
581 else if (target.IsInherited(DayZInfected))
582 {
583 EvaluateHit_Infected(weapon, target);
584 }
585 else if (target.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE)
586 {
587 EvaluateHit_NonAlignableObjects(weapon, target);
588 }
589 else
590 {
591 EvaluateHit_Common(weapon, target);
592 }
593
594 m_MeleeCombat.CheckMeleeItem();
595 }
596 }
597
598 protected void EvaluateHit_Player(InventoryItem weapon, Object target)
599 {
600 int hitZoneIdx = m_MeleeCombat.GetHitZoneIdx();
601 int weaponMode = m_MeleeCombat.GetWeaponMode();
602 int forcedWeaponMode = -1;
603 vector hitPosWS;
604 bool forcedDummy = false;
605
606 PlayerBase targetPlayer = PlayerBase.Cast(target);
608 if (targetPlayer)
609 {
610 vector targetPos = targetPlayer.GetPosition();
611 vector agressorPos = m_Player.GetPosition();
612
613 // We get the angle from which an infected hit the blocking player
614 float hitAngle = Math.RAD2DEG * Math.AbsFloat(Math3D.AngleFromPosition(targetPos, MiscGameplayFunctions.GetHeadingVector(targetPlayer), agressorPos));
615
617 if (targetPlayer.GetMeleeFightLogic() && targetPlayer.GetMeleeFightLogic().IsInBlock() && hitAngle <= GameConstants.PVP_MAX_BLOCKABLE_ANGLE)
618 {
619 if (weaponMode > 0)
620 {
621 forcedWeaponMode = --weaponMode; // Heavy -> Light shift
622 }
623 else
624 forcedDummy = true; // dummy hits, cannot shift lower than 0
625 }
626 }
627
628 EvaluateHit_Common(weapon, target, forcedDummy, forcedWeaponMode);
629 }
630
631 protected void EvaluateHit_Infected(InventoryItem weapon, Object target)
632 {
633 //If the finisher attack haven't been performed, then use normal hit
634 if (!EvaluateFinisherAttack(weapon, target))
635 EvaluateHit_Common(weapon, target);
636 }
637
639 protected bool EvaluateFinisherAttack(InventoryItem weapon, Object target)
640 {
641 //Debug.MeleeLog(m_Player, string.Format("EvaluateFinisherAttack[1] target=%1, hitPos=%2, hitZoneIdx=%3, finisherType=%4", m_MeleeCombat.GetTargetEntity(), m_MeleeCombat.GetHitPos().ToString(), m_MeleeCombat.GetHitZoneIdx(), m_MeleeCombat.GetFinisherType()));
642
643 if (m_MeleeCombat.GetFinisherType() > -1)
644 {
645 if (GetGame().IsServer())
646 DamageSystem.CloseCombatDamage(m_Player, target, m_MeleeCombat.GetHitZoneIdx(), DetermineFinisherAmmo(m_MeleeCombat.GetFinisherType()), m_MeleeCombat.GetHitPos(), ProcessDirectDamageFlags.NO_ATTACHMENT_TRANSFER);
647
648 return true;
649 }
650
651 return false;
652 }
653
654 protected void EvaluateHit_Common(InventoryItem weapon, Object target, bool forcedDummy=false, int forcedWeaponMode = -1)
655 {
656 int hitZoneIdx = m_MeleeCombat.GetHitZoneIdx();
657 int weaponMode = m_MeleeCombat.GetWeaponMode();
658 vector hitPosWS;
659 string ammo;
660
661 if (forcedWeaponMode > -1)
662 weaponMode = forcedWeaponMode;
663
664 EntityAI targetEntity = EntityAI.Cast(target);
665
667 if (!DummyHitSelector(m_HitType, ammo) && !forcedDummy)
668 {
670 if (hitZoneIdx >= 0)
671 {
672 hitPosWS = targetEntity.ModelToWorld(targetEntity.GetDefaultHitPosition());
673
674 if (WeaponDestroyedCheck(weapon, ammo))
675 {
676 DamageSystem.CloseCombatDamage(m_Player, target, hitZoneIdx, ammo, hitPosWS);
677 //Debug.MeleeLog(m_Player, string.Format("EvaluateHit_Common[a]::CloseCombatDamage:: target: %1, hitzone: %2, ammo: %3", target, hitZoneIdx, ammo));
678 }
679 else
680 {
681 m_Player.ProcessMeleeHit(weapon, weaponMode, target, hitZoneIdx, hitPosWS);
682 //Debug.MeleeLog(m_Player, string.Format("EvaluateHit_Common[b]::ProcessMeleeHit:: target: %1, hitzone: %2, meleeMode: %3, forcedWeaponMode:%4", target, hitZoneIdx, weaponMode));
683 }
684 }
685 }
686 else
687 {
689 if (GetGame().IsServer() && targetEntity)
690 {
692 hitPosWS = targetEntity.ModelToWorld(targetEntity.GetDefaultHitPosition());
693 DamageSystem.CloseCombatDamage(m_Player, target, hitZoneIdx, ammo, hitPosWS);
694 //Debug.MeleeLog(m_Player, string.Format("EvaluateHit_Common[c]::CloseCombatDamage:: target: %1, hitzone: %2, meleeMode: %3, ammo: %4", target, hitZoneIdx, weaponMode, ammo));
695 }
696 }
697 }
698
700 {
701 int hitZoneIdx = m_MeleeCombat.GetHitZoneIdx();
702 vector hitPosWS;
703 string ammo;
704
705 if (hitZoneIdx >= 0)
706 {
707 if (WeaponDestroyedCheck(weapon,ammo))
708 DamageSystem.CloseCombatDamage(m_Player, target, hitZoneIdx, ammo, m_MeleeCombat.GetHitPos());
709 else
710 m_Player.ProcessMeleeHit(weapon, m_MeleeCombat.GetWeaponMode(), target, hitZoneIdx, m_MeleeCombat.GetHitPos());
711 }
712
713 return;
714 }
715
716 bool WeaponDestroyedCheck(InventoryItem weapon, out string ammo)
717 {
718 if (!weapon)
719 return false;
720
721 Weapon_Base firearm = Weapon_Base.Cast(weapon);
722 ItemBase bayonet = ItemBase.Cast(weapon.GetInventory().FindAttachment(weapon.GetBayonetAttachmentIdx()));
723
724 if ( firearm && bayonet && bayonet.IsRuined() )
725 {
726 ammo = bayonet.GetRuinedMeleeAmmoType();
727 return true;
728 }
729 else if (weapon.IsRuined())
730 {
731 ammo = weapon.GetRuinedMeleeAmmoType();
732 return true;
733 }
734 else
735 {
736 return false;
737 }
738 }
739
740 protected void GetTargetData(out EntityAI target, out EMeleeTargetType targetType)
741 {
742 target = m_MeleeCombat.GetTargetEntity();
743 targetType = EMeleeTargetType.ALIGNABLE;
744
745 // If there is no hitzone defined, then we won't be able to hit the target anyways..
746 if (m_MeleeCombat.GetHitZoneIdx() < 0)
747 {
748 target = null;
749 }
750
751 if ( target )
752 {
753 targetType = target.GetMeleeTargetType();
754 }
755
757 if ( targetType == EMeleeTargetType.NONALIGNABLE )
758 {
759 target = null;
760 }
761 }
762
764 protected bool DummyHitSelector(EMeleeHitType hitType, out string ammoType)
765 {
766 switch (hitType)
767 {
769 case EMeleeHitType.KICK:
770 ammoType = DUMMY_HEAVY_AMMO;
771 return true;
772 break;
773 }
774
775 ammoType = DUMMY_LIGHT_AMMO;
776
777 return false;
778 }
779
781 protected bool IsBehindEntity(int angle, DayZPlayer source, Object target)
782 {
783 return false;
784 }
785
786 protected void SetCooldown(float time, EFightLogicCooldownCategory cooldownCategory)
787 {
789 if ( m_CooldownTimers.Get(cooldownCategory).IsRunning() )
790 {
791 m_CooldownTimers.Get(cooldownCategory).Stop();
792 }
793
795 Param1<int> param = new Param1<int>(cooldownCategory);
796 m_CooldownTimers.Get(cooldownCategory).Run(time, this, "ResetCooldown", param);
797 }
798
799 protected void ResetCooldown(EFightLogicCooldownCategory cooldownCategory)
800 {
801 switch (cooldownCategory)
802 {
804 m_IsEvading = false;
805 break;
806 }
807 }
808
809 protected void EnableControls();
810 protected void DisableControls();
811
812 protected void DamageHands(DayZPlayer DZPlayer, ClothingBase gloves, InventoryItem itemInHands)
813 {
814 EntityAI target = m_MeleeCombat.GetTargetEntity();
815
816 //We did not hit anything
817 if (itemInHands || !target || !DZPlayer)
818 return;
819
820 //Check if server side
821 if (GetGame().IsServer())
822 {
823 int randNum;
824
825 //If gloves, damage gloves
826 if (gloves && gloves.GetHealthLevel() < GameConstants.STATE_RUINED)
827 {
828 gloves.DecreaseHealth("", "", 1);
829 }
830 else
831 {
832 //Do not add bleeding if hitting player, zombie or animal
833 if (PlayerBase.Cast(target) || DayZCreatureAI.Cast(target))
834 return;
835
836 BleedingSourcesManagerServer bleedingManager;
837
838 //We don't inflict bleeding to hands when kicking
839 if (m_HitType != EMeleeHitType.KICK)
840 {
841 //Random bleeding source
842 randNum = Math.RandomIntInclusive(1, 15);
843 switch (randNum)
844 {
845 case 1:
846 if (m_Player)
847 {
848 bleedingManager = m_Player.GetBleedingManagerServer();
849 if (bleedingManager)
850 bleedingManager.AttemptAddBleedingSourceBySelection("RightForeArmRoll");
851 }
852 break;
853
854 case 2:
855 if (m_Player)
856 {
857 bleedingManager = m_Player.GetBleedingManagerServer();
858 if (bleedingManager)
859 bleedingManager.AttemptAddBleedingSourceBySelection("LeftForeArmRoll");
860 }
861 break;
862 }
863 }
864 else
865 {
866 //Random bleeding source
867 randNum = Math.RandomIntInclusive(1, 15);
868 //We only add bleeding to left foot as character kicks with left foot
869 switch (randNum)
870 {
871 case 1:
872 if (m_Player)
873 {
874 bleedingManager = m_Player.GetBleedingManagerServer();
875 if (bleedingManager)
876 bleedingManager.AttemptAddBleedingSourceBySelection("LeftToeBase");
877 }
878 break;
879
880 case 2:
881 if (m_Player)
882 {
883 bleedingManager = m_Player.GetBleedingManagerServer();
884 if (bleedingManager)
885 bleedingManager.AttemptAddBleedingSourceBySelection("LeftFoot");
886 }
887 break;
888 }
889 }
890 }
891 }
892 }
893
895 int DetermineFinisherAnimation(int finisher_type)
896 {
897 int animation = -1;
898
899 switch (finisher_type)
900 {
901 case EMeleeHitType.FINISHER_LIVERSTAB:
903 break;
904
905 case EMeleeHitType.FINISHER_NECKSTAB:
907 break;
908 }
909
910 return animation;
911 }
912
914 string DetermineFinisherAmmo(int finisher_type)
915 {
916 string ret = "";
917
918 switch (finisher_type)
919 {
920 case EMeleeHitType.FINISHER_NECKSTAB:
921 ret = "FinisherHitNeck";
922 break;
923
924 default:
925 ret = "FinisherHit";
926 break;
927 }
928
929 return ret;
930 }
931
932 protected bool IsShortDistance(EntityAI pTarget, float pDistanceSq)
933 {
934 return pTarget && vector.DistanceSq(m_Player.GetPosition(), m_MeleeCombat.GetHitPos()) <= pDistanceSq || vector.DistanceSq(m_Player.GetBonePositionWS(m_Player.GetBoneIndexByName("Head")), m_MeleeCombat.GetHitPos()) <= pDistanceSq)
935 }
936
940 protected bool m_IsFinisher;
941
943 {
944 return -1;
945 }
946
947 bool IsHitTypeFinisher(int type)
948 {
949 return false;
950 }
951
953 {
954 return -1;
955 }
956}
map
Определения ControlsXboxNew.c:4
override Widget Init()
Определения DayZGame.c:127
DayZPlayerImplement m_DZPlayer
Parent.
EMeleeHitType
Определения DayZPlayerImplementMeleeCombat.c:2
void DayZPlayerImplementMeleeCombat(DayZPlayerImplement player)
int GetFinisherType()
EMeleeHitType m_HitType
Hit type of the most recent attack.
int DetermineSpecificFinisherType(ItemBase weapon)
bool HandleProneKick(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
kick from raised pne
bool m_IsInComboRange
void EvaluateHit_Player(InventoryItem weapon, Object target)
bool IsInBlock()
void EnableControls()
bool IsShortDistance(EntityAI pTarget, float pDistanceSq)
EFightLogicCooldownCategory
Light / Heavy punches.
@ EVADE
void DamageHands(DayZPlayer DZPlayer, ClothingBase gloves, InventoryItem itemInHands)
void ~DayZPlayerMeleeFightLogic_LightHeavy()
ref DayZPlayerImplementMeleeCombat m_MeleeCombat
bool HandleHitEvent(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
Handle the event that our melee hit something.
EMeleeHitType GetAttackTypeFromInputs(HumanInputController pInputs)
enum EFightLogicCooldownCategory EVADE_COOLDOWN
cooldown timers settings
void RegisterCooldowns()
bool IsBehindEntity(int angle, DayZPlayer source, Object target)
DEPRECATED - moved into DayZPlayerImplementMeleeCombat.
bool EvaluateFinisherAttack(InventoryItem weapon, Object target)
Check and evaluate stealth kill, if applicable.
Mission m_Mission
bool m_IsFinisher
string DetermineFinisherAmmo(int finisher_type)
Picks a specific finisher ammo fot the hit type. This gets synchronized and guides further behaviour ...
void DayZPlayerMeleeFightLogic_LightHeavy(DayZPlayerImplement player)
bool IsHitTypeFinisher(int type)
bool m_IsEvading
bool CanFight()
const float CLOSE_TARGET_DISTANCE
void EvaluateHit_NonAlignableObjects(InventoryItem weapon, Object target)
bool m_IsInBlock
void SetBlock(bool block)
ref map< int, ref Timer > m_CooldownTimers
bool HandleInitialFirearmMelee(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
NOTE: Only singular (or first) hits, combo attacks are handled in combo.
int DetermineFinisherAnimation(int finisher_type)
Picks a specific finisher animation. Not used for mounted bayonet stabs.
void GetTargetData(out EntityAI target, out EMeleeTargetType targetType)
bool HandleFightLogic(int pCurrentCommandID, HumanInputController pInputs, EntityAI pEntityInHands, HumanMovementState pMovementState, out bool pContinueAttack)
bool HandleSprintAttack(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
sprint attack in erc stance
bool DummyHitSelector(EMeleeHitType hitType, out string ammoType)
evaluation of hit player vs. player
void EvaluateHit_Infected(InventoryItem weapon, Object target)
float GetAttackTypeByDistanceToTarget(EntityAI pTarget, EMeleeTargetType pTargetType=EMeleeTargetType.ALIGNABLE)
const string DUMMY_HEAVY_AMMO
void EvaluateHit(InventoryItem weapon)
bool HandleComboHit(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
combo hits - when we are already in Melee command and clicking UseButton
bool m_WasPreviousHitProcessed
EMeleeHitType GetAttackTypeByWeaponAttachments(EntityAI pEntity)
bool IsEvading()
bool WeaponDestroyedCheck(InventoryItem weapon, out string ammo)
const string DUMMY_LIGHT_AMMO
dummy ammo types
void ResetCooldown(EFightLogicCooldownCategory cooldownCategory)
void EvaluateHit_Common(InventoryItem weapon, Object target, bool forcedDummy=false, int forcedWeaponMode=-1)
void DisableControls()
bool HandleInitialMeleeErc(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
First attack in raised erc (light or heavy if modifier is used). Also added support for finishers.
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
eBrokenLegs
Определения EBrokenLegs.c:2
EMeleeTargetType
Определения EMeleeTargetType.c:2
EStaminaConsumers
Определения EStaminaConsumers.c:2
EStaminaModifiers
Определения EStaminaModifiers.c:2
DayZPlayer m_Player
Определения Hand_Events.c:42
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
ProcessDirectDamageFlags
Определения Object.c:2
void SetCooldown(float val)
Определения StaminaHandler.c:161
proto native Mission GetMission()
Определения DallasMask.c:2
do not process rotations !
Определения DayZAnimal.c:612
Определения ZombieBase.c:2
Определения ManBase.c:2
override int GetMeleeTargetType()
Определения Building.c:247
Определения Building.c:6
Определения constants.c:659
proto native bool WasHit()
is true only once after hit event
static const int HIT_TYPE_FINISHER
Определения human.c:543
static const int HIT_TYPE_FINISHER_NECK
Определения human.c:544
Определения human.c:537
proto native void StartMeleeEvadeA(float pDirAngle)
marks command to continue to combo, pDirAngle specifies angle
proto native float GetCurrentMovementSpeed()
0,1,2..3 idle, walk, run, sprint
proto native void ForceStance(int pStanceIdx)
proto bool GetCurrentInputAngle(out float pAngle)
proto native void SetMeleeBlock(bool pBlock)
this enables/disables block
Определения human.c:434
proto native float GetBaseAimingAngleLR()
returns base aiming angle LR - without sway/offsets/...
Определения human.c:994
proto native int IsMeleeLREvade()
returns 0,1,2 = none,left,right
proto native bool IsWeaponRaised()
returns true if weapon is raised
proto native bool IsMeleeWeaponAttack()
return weapon melee attack modifier
proto native bool IsAttackButtonDown()
returns true if 'UAFire' button has just been pressed (== true for 1 tick only). Synced.
proto native bool IsMeleeFastAttackModifier()
returns SHIFT down (melee fast/heavy) attack modifier
Определения human.c:18
HumanInventory... with FSM (synchronous, no anims)
Определения HumanInventoryWithFSM.c:6
int m_iStanceIdx
current command's id
Определения human.c:1141
Определения human.c:1139
Определения ItemBase.c:15
Определения InventoryItem.c:731
Определения EnMath3D.c:28
Определения EnMath.c:7
Mission class.
Определения gameplay.c:687
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
static const float BROKEN_LEGS_LIGHT_MELEE_SHOCK
Определения PlayerConstants.c:227
static const float BROKEN_LEGS_HEAVY_MELEE_SHOCK
Определения PlayerConstants.c:228
Определения PlayerConstants.c:2
Определения DayZPlayerImplement.c:63
shorthand
Определения BoltActionRifle_Base.c:6
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
Определения EnConvert.c:106
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
proto native CGame GetGame()
const float PVP_MAX_BLOCKABLE_ANGLE
Определения constants.c:1084
const int STATE_RUINED
Определения constants.c:846
static proto float AngleFromPosition(vector origin, vector originDir, vector target)
Angle that a target is from the direction of an origin.
static proto float SqrFloat(float f)
Returns squared value.
static const float RAD2DEG
Определения EnMath.c:16
static proto float AbsFloat(float f)
Returns absolute value.
static int RandomIntInclusive(int min, int max)
Returns a random int number between and min [inclusive] and max [inclusive].
Определения EnMath.c:54
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetCurrentHitType()