DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
DayZPlayerMeleeFightLogic_LightHeavy.c
Go to the documentation of this file.
1
3{
4 EVADE = 0
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
22 protected ref map <int, ref Timer> m_CooldownTimers;
23 protected Mission m_Mission;
24
25 protected bool m_IsInBlock;
26 protected bool m_IsEvading;
27 protected bool m_IsFinisher;
28
29 protected bool m_IsInComboRange;
31
33 {
34 Init(player);
35 }
36
38 {
39 m_DZPlayer = player;
40 m_MeleeCombat = m_DZPlayer.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 protected void RegisterCooldowns()
74 {
77 }
78
80 {
81 if (pInputs.IsMeleeFastAttackModifier() && m_DZPlayer.CanConsumeStamina(EStaminaConsumers.MELEE_HEAVY))
82 {
83 return EMeleeHitType.HEAVY;
84 }
85
86 return EMeleeHitType.LIGHT;
87 }
88
90 {
91 if (!m_DZPlayer.CanConsumeStamina(EStaminaConsumers.MELEE_HEAVY))
92 {
93 return EMeleeHitType.NONE;
94 }
95
97 if (pEntity.HasBayonetAttached())
98 {
99 return EMeleeHitType.WPN_STAB;
100 }
101 else if (pEntity.HasButtstockAttached())
102 {
103 return EMeleeHitType.WPN_HIT_BUTTSTOCK;
104 }
105
106 return EMeleeHitType.WPN_HIT;
107 }
108
109 protected float GetAttackTypeByDistanceToTarget(EntityAI pTarget, EMeleeTargetType pTargetType = EMeleeTargetType.ALIGNABLE)
110 {
111 if (pTargetType == EMeleeTargetType.NONALIGNABLE)
112 {
113 return 1.0;
114 }
115
118 {
119 return 1.0;
120 }
121
123 return 0.0;
124 }
125
126 bool HandleFightLogic(int pCurrentCommandID, HumanInputController pInputs, EntityAI pEntityInHands, HumanMovementState pMovementState, out bool pContinueAttack)
127 {
128 HumanInventoryWithFSM invFSM = HumanInventoryWithFSM.Cast(m_DZPlayer.GetHumanInventory());
129 if (invFSM && !invFSM.IsIdle())
130 return false;
131
132 HumanCommandMove hcm = m_DZPlayer.GetCommand_Move();
133 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
134 InventoryItem itemInHands = InventoryItem.Cast(pEntityInHands);
135 bool isFireWeapon = itemInHands && itemInHands.IsWeapon();
136
138 if (HandleHitEvent(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack))
139 {
140 return false;
141 }
142
144 if ((pInputs.IsAttackButtonDown() && !isFireWeapon) || (pInputs.IsMeleeWeaponAttack() && isFireWeapon) || (pContinueAttack && isFireWeapon))
145 {
146 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleFightLogic[1] attackButtonDown=%1, meleeWeaponAttack=%2, pContinueAttack=%3, isFireWeapon=%4", pInputs.IsAttackButtonDown(), pInputs.IsMeleeWeaponAttack(), pContinueAttack, isFireWeapon));
147
150 {
151 return false;
152 }
153
155 if (itemInHands && !itemInHands.IsMeleeWeapon() && !isFireWeapon)
156 {
157 return false;
158 }
159
161 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_MOVE)
162 {
163 //Debug.MeleeLog(m_DZPlayer, "HandleFightLogic[1a]");
165 if (isFireWeapon)
166 {
167 return HandleInitialFirearmMelee(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
168 }
169 else
170 {
172 if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
173 {
174 return HandleInitialMeleeErc(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
175 }
177 else if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
178 {
179 return HandleProneKick(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
180 }
182 else if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT && m_DZPlayer.IsSprintFull())
183 {
184 return HandleSprintAttack(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
185 }
186 }
187 }
189 else if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_MELEE2)
190 {
191 m_IsInComboRange = m_DZPlayer.GetCommand_Melee2().IsInComboRange();
193 {
194 return HandleComboHit(pCurrentCommandID, pInputs, itemInHands, pMovementState, pContinueAttack);
195 }
196 }
197 }
199 else if (!isFireWeapon && pCurrentCommandID == DayZPlayerConstants.COMMANDID_MOVE)
200 {
202 if (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
203 {
204 int roll = pInputs.IsMeleeLREvade();
205 if (roll != 0)
206 {
208 if (!m_DZPlayer.CanConsumeStamina(EStaminaConsumers.MELEE_EVADE))
209 {
210 return false;
211 }
212
213 float angle;
214 if (roll == 1)
215 {
216 angle = -90; // left
217 }
218 else
219 {
220 angle = 90; // right
221 }
222
223 // start melee evade
224 m_IsEvading = true;
226 hcm.StartMeleeEvadeA(angle);
227 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_EVADE);
228
229 //Inflict shock when sidestepping with broken legs
230 if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
231 {
232 player.m_ShockHandler.SetShock(PlayerConstants.BROKEN_LEGS_LIGHT_MELEE_SHOCK);
233 player.m_ShockHandler.CheckValue(true);
234 }
235 }
236 }
237
239 if (pInputs.IsWeaponRaised() && pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH)
240 {
241 //Debug.MeleeLog(m_DZPlayer, "HandleFightLogic[2b]");
242 if (DayZPlayerUtils.PlayerCanChangeStance(player, DayZPlayerConstants.STANCEIDX_RAISEDERECT))
243 {
244 //Debug.MeleeLog(m_DZPlayer, "HandleFightLogic[2c]");
245 hcm.ForceStance(DayZPlayerConstants.STANCEIDX_RAISEDERECT);
246
247 return false;
248 }
249 }
250
253 if (!isFireWeapon && (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT || pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE))
254 {
255 float angle2;
256
257 if (hcm.GetCurrentInputAngle(angle2) && (angle2 < -130.0 || angle2 > 130))
258 {
259 hcm.SetMeleeBlock(true);
260 SetBlock(true);
261 }
262 else
263 {
264 hcm.SetMeleeBlock(false);
265 SetBlock(false);
266 }
267 }
268 else
269 {
270 hcm.SetMeleeBlock(false);
271 SetBlock(false);
272 }
273 }
274
275 return false;
276 }
277
279 protected bool HandleHitEvent(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
280 {
282 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_MELEE2)
283 {
284 HumanCommandMelee2 hmc2a = m_DZPlayer.GetCommand_Melee2();
285 if (hmc2a)
286 {
288 if (hmc2a.WasHit())
289 {
290 //Debug.MeleeLog(m_DZPlayer, "HandleHitEvent[START]");
291 //Debug.MeleeLog(m_DZPlayer, 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()));
292 if (m_MeleeCombat.GetFinisherType() == -1)
293 {
294 //Debug.MeleeLog(m_DZPlayer, 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()));
296 m_MeleeCombat.Update(itemInHands, m_HitType, true);
297 }
298
300 EvaluateHit(itemInHands);
301
302 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
303
304 //Get gloves
305 ClothingBase gloves;
306 if (m_HitType == EMeleeHitType.KICK)
307 {
308 //We kick so "gloves" will be the shoes
309 gloves = ClothingBase.Cast(player.GetItemOnSlot("FEET"));
310 }
311 else
312 {
313 gloves = ClothingBase.Cast(player.GetItemOnSlot("GLOVES"));
314 }
315
316 //If we hit something, inflict damage
317 DamageHands(m_DZPlayer, gloves, itemInHands);
318
319 m_MeleeCombat.ResetTarget();
320
322
324
325 //Debug.MeleeLog(m_DZPlayer, "HandleHitEvent[END]");
326
327 return true;
328 }
329 }
330 }
331
332 return false;
333 }
334
336 protected bool HandleInitialFirearmMelee(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
337 {
339 Weapon_Base weapon = Weapon_Base.Cast(itemInHands);
340 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
341 if (weapon.IsWaitingForActionFinish() || player.GetActionManager().GetRunningAction())
342 return false;
343
344 HumanCommandMove hcm = m_DZPlayer.GetCommand_Move();
345
347 if (hcm.GetCurrentMovementSpeed() <= 2.05 && (pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT || pContinueAttack) && !m_DZPlayer.IsFighting())
348 {
350 if ( m_HitType == EMeleeHitType.NONE )
351 return false;
352
353 m_MeleeCombat.Update(itemInHands, m_HitType);
354
355 EntityAI target;
356 EMeleeTargetType targetType;
357 GetTargetData(target, targetType);
358 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
359
360 m_DZPlayer.StartCommand_Melee2(target, m_HitType == EMeleeHitType.WPN_STAB, attackByDistance, m_MeleeCombat.GetHitPos());
361 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
363
364 pContinueAttack = false; // reset continueAttack flag
365
366 return true;
367 }
369 else if ( pMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH )
370 {
371 if (hcm)
372 {
373 hcm.ForceStance(DayZPlayerConstants.STANCEIDX_RAISEDERECT);
374 pContinueAttack = true;
375 return false;
376 }
377 }
378
379 return false;
380 }
381
383 protected bool HandleInitialMeleeErc(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
384 {
385 //Debug.MeleeLog(m_DZPlayer, "HandleInitialMeleeErc[1]");
386 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
387
389 m_MeleeCombat.Update(itemInHands, m_HitType);
390
391 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleInitialMeleeErc[2] %1", EnumTools.EnumToString(EMeleeHitType, m_HitType)));
392
393 EntityAI target;
394 EMeleeTargetType targetType;
395 GetTargetData(target, targetType);
396 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
397
398 // finisher attack hittype override
399 int finisherType = m_MeleeCombat.GetFinisherType();
400 if (finisherType != -1)
401 {
402 int animationType = DetermineFinisherAnimation(finisherType);
403 if (animationType > -1)
404 {
405 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleInitialMeleeErc[3a] target=%1, finisherType=%2, animationType=%3, hitPositionWS=%4", target, finisherType, animationType, m_MeleeCombat.GetHitPos().ToString()));
406 m_DZPlayer.StartCommand_Melee2(target, animationType, attackByDistance, m_MeleeCombat.GetHitPos());
407 }
408 else
409 {
410 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleInitialMeleeErc[3b] target=%1, finisherType=%2, animationType=%3, hitPositionWS=%4", target, finisherType, (m_HitType == EMeleeHitType.HEAVY).ToString(), m_MeleeCombat.GetHitPos().ToString()));
411 m_DZPlayer.StartCommand_Melee2(target, m_HitType == EMeleeHitType.HEAVY, attackByDistance, m_MeleeCombat.GetHitPos());
412 }
413
414 m_HitType = finisherType;
415 target.SetBeingBackstabbed(finisherType);
416 }
417 else
418 {
419 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleInitialMeleeErc[3d] target=%1, animationType=%2, hitPositionWS=%3", target, (m_HitType == EMeleeHitType.HEAVY).ToString(), m_MeleeCombat.GetHitPos().ToString()));
420 m_DZPlayer.StartCommand_Melee2(target, m_HitType == EMeleeHitType.HEAVY, attackByDistance, m_MeleeCombat.GetHitPos());
421 }
422
423 if (m_HitType == EMeleeHitType.HEAVY)
424 {
425 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
426 if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
427 {
428 player.m_ShockHandler.SetShock(PlayerConstants.BROKEN_LEGS_HEAVY_MELEE_SHOCK);
429 player.m_ShockHandler.CheckValue(true);
430 }
431 }
432 else
433 {
434 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_LIGHT);
435 if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
436 {
437 player.m_ShockHandler.SetShock(PlayerConstants.BROKEN_LEGS_LIGHT_MELEE_SHOCK);
438 player.m_ShockHandler.CheckValue(true);
439 }
440 }
441
443
445
446 return true;
447 }
448
450 protected bool HandleProneKick(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
451 {
452 HumanCommandWeapons hcw = m_DZPlayer.GetCommandModifier_Weapons();
453
454 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
455
456 float hcw_angle = hcw.GetBaseAimingAngleLR();
459 if ( ( hcw_angle < -90 || hcw_angle > 90 ) && player.GetBrokenLegs() != eBrokenLegs.BROKEN_LEGS )
460 {
461 // targetting
463 m_MeleeCombat.Update(itemInHands, m_HitType);
464
465 EntityAI target;
466 EMeleeTargetType targetType;
467 GetTargetData(target, targetType);
468 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
469
470 // command
471 m_DZPlayer.StartCommand_Melee2(target, false, attackByDistance, m_MeleeCombat.GetHitPos());
472 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
474
475 return true;
476 }
477
478 return false;
479 }
480
482 protected bool HandleSprintAttack(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
483 {
485 m_HitType = EMeleeHitType.SPRINT;
486 m_MeleeCombat.Update(itemInHands, m_HitType);
487
488 EntityAI target;
489 EMeleeTargetType targetType;
490 GetTargetData(target, targetType);
491 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
492
494 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleSprintAttack[1] target=%1, animationType=%2, hitPositionWS=%3", target, false, m_MeleeCombat.GetHitPos().ToString()));
495 m_DZPlayer.StartCommand_Melee2(target, false, attackByDistance, m_MeleeCombat.GetHitPos());
496 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
498
499 return true;
500 }
501
503 protected bool HandleComboHit(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
504 {
505 //Debug.MeleeLog(m_DZPlayer, "HandleComboHit::");
506
508 if (m_HitType == EMeleeHitType.NONE)
509 return false;
510
512 if (m_MeleeCombat.GetFinisherType() > -1)
513 return false;
514
515 EntityAI target;
516 EMeleeTargetType targetType;
517 GetTargetData(target, targetType);
518 float attackByDistance = GetAttackTypeByDistanceToTarget(target, targetType);
519
520 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
521
523 if (itemInHands && itemInHands.IsWeapon())
524 {
526 }
527 else
528 {
530 }
531
533 //Debug.MeleeLog(m_DZPlayer, string.Format("HandleComboHit:: %1", EnumTools.EnumToString(EMeleeHitType, m_HitType)));
536 {
537 m_MeleeCombat.Update(itemInHands, m_HitType);
538 }
539
541 bool isHeavy = (m_HitType == EMeleeHitType.HEAVY || m_HitType == EMeleeHitType.WPN_STAB);
542 m_DZPlayer.GetCommand_Melee2().ContinueCombo(isHeavy, attackByDistance, target, m_MeleeCombat.GetHitPos());
544
546 if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
547 {
549
550 if (!isHeavy)
552
553 player.m_ShockHandler.SetShock(PlayerConstants.BROKEN_LEGS_HEAVY_MELEE_SHOCK);
554 player.m_ShockHandler.CheckValue(true);
555 }
556
558 switch (m_HitType)
559 {
560 case EMeleeHitType.HEAVY:
561 case EMeleeHitType.SPRINT:
562 case EMeleeHitType.WPN_STAB:
563 case EMeleeHitType.WPN_HIT_BUTTSTOCK:
564 case EMeleeHitType.WPN_HIT:
565 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_HEAVY);
566 break;
567 default:
568 m_DZPlayer.DepleteStamina(EStaminaModifiers.MELEE_LIGHT);
569 break;
570 }
571
572 m_IsInComboRange = false;
573
574 return true;
575 }
576
577 protected void EvaluateHit(InventoryItem weapon)
578 {
579 EntityAI target = m_MeleeCombat.GetTargetEntity();
580
581 if (target)
582 {
583 if (target.IsInherited(DayZPlayer))
584 {
585 EvaluateHit_Player(weapon, target);
586 }
587 else if (target.IsInherited(DayZInfected))
588 {
589 EvaluateHit_Infected(weapon, target);
590 }
591 else if (target.GetMeleeTargetType() == EMeleeTargetType.NONALIGNABLE)
592 {
593 EvaluateHit_NonAlignableObjects(weapon, target);
594 }
595 else
596 {
597 EvaluateHit_Common(weapon, target);
598 }
599
600 m_MeleeCombat.CheckMeleeItem();
601 }
602 }
603
604 protected void EvaluateHit_Player(InventoryItem weapon, Object target)
605 {
606 int hitZoneIdx = m_MeleeCombat.GetHitZoneIdx();
607 int weaponMode = m_MeleeCombat.GetWeaponMode();
608 vector hitPosWS;
609 bool forcedDummy = false;
610
611 PlayerBase targetPlayer = PlayerBase.Cast(target);
612
614 if ( targetPlayer )
615 {
616 vector targetPos = targetPlayer.GetPosition();
617 vector agressorPos = m_DZPlayer.GetPosition();
618
619 // We get the angle from which an infected hit the blocking player
620 float hitAngle = Math.RAD2DEG * Math.AbsFloat(Math3D.AngleFromPosition(targetPos, MiscGameplayFunctions.GetHeadingVector(targetPlayer), agressorPos));
621
623 if (targetPlayer.GetMeleeFightLogic() && targetPlayer.GetMeleeFightLogic().IsInBlock() && hitAngle <= GameConstants.PVP_MAX_BLOCKABLE_ANGLE)
624 {
625 if ( weaponMode > 0 )
626 {
627 weaponMode--; // Heavy -> Light shift
628 }
629 else
630 {
631 forcedDummy = true; // dummy hits, cannot shift lower than 0
632 }
633 }
634 }
635
636 EvaluateHit_Common(weapon, target, forcedDummy);
637 }
638
639 protected void EvaluateHit_Infected(InventoryItem weapon, Object target)
640 {
641 //If the finisher attack haven't been performed, then use normal hit
642 if (!EvaluateFinisherAttack(weapon, target))
643 EvaluateHit_Common(weapon, target);
644 }
645
647 protected bool EvaluateFinisherAttack(InventoryItem weapon, Object target)
648 {
649 //Debug.MeleeLog(m_DZPlayer, 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()));
650
651 if (m_MeleeCombat.GetFinisherType() > -1)
652 {
653 if (GetGame().IsServer())
654 DamageSystem.CloseCombatDamage(m_DZPlayer, target, m_MeleeCombat.GetHitZoneIdx(), DetermineFinisherAmmo(m_MeleeCombat.GetFinisherType()), m_MeleeCombat.GetHitPos(), ProcessDirectDamageFlags.NO_ATTACHMENT_TRANSFER);
655
656 return true;
657 }
658
659 return false;
660 }
661
662 protected void EvaluateHit_Common(InventoryItem weapon, Object target, bool forcedDummy=false)
663 {
664 int hitZoneIdx = m_MeleeCombat.GetHitZoneIdx();
665 int weaponMode = m_MeleeCombat.GetWeaponMode();
666 vector hitPosWS;
667 string ammo;
668
669 EntityAI targetEntity = EntityAI.Cast(target);
670
672 if (!DummyHitSelector(m_HitType, ammo) && !forcedDummy)
673 {
675 if (hitZoneIdx >= 0)
676 {
677 hitPosWS = targetEntity.ModelToWorld(targetEntity.GetDefaultHitPosition());
678
679 if (WeaponDestroyedCheck(weapon, ammo))
680 {
681 DamageSystem.CloseCombatDamage(m_DZPlayer, target, hitZoneIdx, ammo, hitPosWS);
682 //Debug.MeleeLog(m_DZPlayer, string.Format("EvaluateHit_Common[a]::CloseCombatDamage:: target: %1, hitzone: %2, ammo: %3", target, hitZoneIdx, ammo));
683 }
684 else
685 {
686 m_DZPlayer.ProcessMeleeHit(weapon, weaponMode, target, hitZoneIdx, hitPosWS);
687 //Debug.MeleeLog(m_DZPlayer, string.Format("EvaluateHit_Common[b]::ProcessMeleeHit:: target: %1, hitzone: %2, meleeMode: %3", target, hitZoneIdx, weaponMode));
688 }
689 }
690 }
691 else
692 {
694 if (GetGame().IsServer() && targetEntity)
695 {
697 hitPosWS = targetEntity.ModelToWorld(targetEntity.GetDefaultHitPosition());
698 DamageSystem.CloseCombatDamage(m_DZPlayer, target, hitZoneIdx, ammo, hitPosWS);
699 //Debug.MeleeLog(m_DZPlayer, string.Format("EvaluateHit_Common[c]::CloseCombatDamage:: target: %1, hitzone: %2, meleeMode: %3", target, hitZoneIdx, weaponMode));
700 }
701 }
702 }
703
705 {
706 int hitZoneIdx = m_MeleeCombat.GetHitZoneIdx();
707 vector hitPosWS;
708 string ammo;
709
710 if (hitZoneIdx >= 0)
711 {
712 if (WeaponDestroyedCheck(weapon,ammo))
713 DamageSystem.CloseCombatDamage(m_DZPlayer, target, hitZoneIdx, ammo, m_MeleeCombat.GetHitPos());
714 else
715 m_DZPlayer.ProcessMeleeHit(weapon, m_MeleeCombat.GetWeaponMode(), target, hitZoneIdx, m_MeleeCombat.GetHitPos());
716 }
717
718 return;
719 }
720
721 bool WeaponDestroyedCheck(InventoryItem weapon, out string ammo)
722 {
723 if (!weapon)
724 return false;
725
726 Weapon_Base firearm = Weapon_Base.Cast(weapon);
727 ItemBase bayonet = ItemBase.Cast(weapon.GetInventory().FindAttachment(weapon.GetBayonetAttachmentIdx()));
728
729 if ( firearm && bayonet && bayonet.IsRuined() )
730 {
731 ammo = bayonet.GetRuinedMeleeAmmoType();
732 return true;
733 }
734 else if (weapon.IsRuined())
735 {
736 ammo = weapon.GetRuinedMeleeAmmoType();
737 return true;
738 }
739 else
740 {
741 return false;
742 }
743 }
744
745 protected void GetTargetData(out EntityAI target, out EMeleeTargetType targetType)
746 {
747 target = m_MeleeCombat.GetTargetEntity();
748 targetType = EMeleeTargetType.ALIGNABLE;
749
750 // If there is no hitzone defined, then we won't be able to hit the target anyways..
751 if (m_MeleeCombat.GetHitZoneIdx() < 0)
752 {
753 target = null;
754 }
755
756 if ( target )
757 {
758 targetType = target.GetMeleeTargetType();
759 }
760
762 if ( targetType == EMeleeTargetType.NONALIGNABLE )
763 {
764 target = null;
765 }
766 }
767
769 protected bool DummyHitSelector(EMeleeHitType hitType, out string ammoType)
770 {
771 switch (hitType)
772 {
774 case EMeleeHitType.KICK:
775 ammoType = DUMMY_HEAVY_AMMO;
776 return true;
777 break;
778 }
779
780 ammoType = DUMMY_LIGHT_AMMO;
781
782 return false;
783 }
784
786 protected bool IsBehindEntity(int angle, DayZPlayer source, Object target)
787 {
788 return false;
789 }
790
791 protected void SetCooldown(float time, EFightLogicCooldownCategory cooldownCategory)
792 {
794 if ( m_CooldownTimers.Get(cooldownCategory).IsRunning() )
795 {
796 m_CooldownTimers.Get(cooldownCategory).Stop();
797 }
798
800 Param1<int> param = new Param1<int>(cooldownCategory);
801 m_CooldownTimers.Get(cooldownCategory).Run(time, this, "ResetCooldown", param);
802 }
803
804 protected void ResetCooldown(EFightLogicCooldownCategory cooldownCategory)
805 {
806 switch (cooldownCategory)
807 {
809 m_IsEvading = false;
810 break;
811 }
812 }
813
814 protected void EnableControls();
815 protected void DisableControls();
816
817 protected void DamageHands(DayZPlayer DZPlayer, ClothingBase gloves, InventoryItem itemInHands)
818 {
819 EntityAI target = m_MeleeCombat.GetTargetEntity();
820
821 //We did not hit anything
822 if ( itemInHands || !target || !DZPlayer )
823 return;
824
825 //Check if server side
826 if ( GetGame().IsServer() )
827 {
828 int randNum;
829
830 //If gloves, damage gloves
831 if ( gloves && gloves.GetHealthLevel() < GameConstants.STATE_RUINED )
832 {
833 gloves.DecreaseHealth("", "", 1);
834 }
835 else
836 {
837 //Do not add bleeding if hitting player, zombie or animal
838 if ( PlayerBase.Cast(target) || DayZCreatureAI.Cast( target ) )
839 return;
840
841 PlayerBase player;
842 BleedingSourcesManagerServer bleedingManager;
843
844 //We don't inflict bleeding to hands when kicking
845 if ( m_HitType != EMeleeHitType.KICK )
846 {
847 //If no gloves, inflict hand damage and bleeding
848 //DZPlayer.DecreaseHealth("hands", "", 10); IN CASE WE WANT TO DO STUFF WITH HAND HEALTH
849
850 //Random bleeding source
851 randNum = Math.RandomIntInclusive(1, 15);
852 switch ( randNum )
853 {
854 case 1:
855 player = PlayerBase.Cast( DZPlayer );
856 if ( player )
857 {
858 bleedingManager = player.GetBleedingManagerServer();
859 if ( bleedingManager )
860 {
861 bleedingManager.AttemptAddBleedingSourceBySelection("RightForeArmRoll");
862 }
863 }
864 break;
865
866 case 2:
867 player = PlayerBase.Cast( DZPlayer );
868 if ( player )
869 {
870 bleedingManager = player.GetBleedingManagerServer();
871 if ( bleedingManager )
872 {
873 bleedingManager.AttemptAddBleedingSourceBySelection("LeftForeArmRoll");
874 }
875 }
876 break;
877 }
878 }
879 else
880 {
881 //Random bleeding source
882 randNum = Math.RandomIntInclusive(1, 15);
883 //We only add bleeding to left foot as character kicks with left foot
884 switch ( randNum )
885 {
886 case 1:
887 player = PlayerBase.Cast( DZPlayer );
888 if ( player )
889 {
890 bleedingManager = player.GetBleedingManagerServer();
891 if ( bleedingManager )
892 {
893 bleedingManager.AttemptAddBleedingSourceBySelection("LeftToeBase");
894 }
895 }
896 break;
897
898 case 2:
899 player = PlayerBase.Cast( DZPlayer );
900 if ( player )
901 {
902 bleedingManager = player.GetBleedingManagerServer();
903 if ( bleedingManager )
904 {
905 bleedingManager.AttemptAddBleedingSourceBySelection("LeftFoot");
906 }
907 }
908 break;
909 }
910 }
911 }
912 }
913 }
914
917 {
918 return -1;
919 }
920
922 bool IsHitTypeFinisher(int type)
923 {
924 return false;
925 }
926
928 int DetermineFinisherAnimation(int finisher_type)
929 {
930 int animation = -1;
931
932 switch (finisher_type)
933 {
934 case EMeleeHitType.FINISHER_LIVERSTAB:
936 break;
937
938 case EMeleeHitType.FINISHER_NECKSTAB:
940 break;
941 }
942
943 return animation;
944 }
945
947 string DetermineFinisherAmmo(int finisher_type)
948 {
949 string ret = "";
950
951 switch (finisher_type)
952 {
953 case EMeleeHitType.FINISHER_NECKSTAB:
954 ret = "FinisherHitNeck";
955 break;
956
957 default:
958 ret = "FinisherHit";
959 break;
960 }
961
962 return ret;
963 }
964
967 {
968 return -1;
969 }
970
971 protected bool IsShortDistance(EntityAI pTarget, float pDistanceSq)
972 {
973 return pTarget && vector.DistanceSq(m_DZPlayer.GetPosition(), m_MeleeCombat.GetHitPos()) <= pDistanceSq || vector.DistanceSq(m_DZPlayer.GetBonePositionWS(m_DZPlayer.GetBoneIndexByName("Head")), m_MeleeCombat.GetHitPos()) <= pDistanceSq)
974 }
975}
override Widget Init()
Definition DayZGame.c:122
protected int DetermineSpecificFinisherType(ItemBase weapon)
protected DayZPlayerImplement m_DZPlayer
Parent.
void DayZPlayerImplementMeleeCombat(DayZPlayerImplement player)
protected EMeleeHitType m_HitType
Hit type of the most recent attack.
protected bool m_IsEvading
EFightLogicCooldownCategory
Light / Heavy punches.
protected bool m_IsInComboRange
DEPRECATED.
protected bool HandleProneKick(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
kick from raised pne
void ~DayZPlayerMeleeFightLogic_LightHeavy()
protected void RegisterCooldowns()
protected bool m_IsInBlock
protected void EvaluateHit_Common(InventoryItem weapon, Object target, bool forcedDummy=false)
enum EFightLogicCooldownCategory EVADE_COOLDOWN
cooldown timers settings
protected ref DayZPlayerImplementMeleeCombat m_MeleeCombat
protected void EvaluateHit_Player(InventoryItem weapon, Object target)
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)
protected EMeleeHitType GetAttackTypeByWeaponAttachments(EntityAI pEntity)
bool IsHitTypeFinisher(int type)
DEPRECATED.
protected bool m_IsFinisher
protected bool DummyHitSelector(EMeleeHitType hitType, out string ammoType)
evaluation of hit player vs. player
protected void DisableControls()
const float CLOSE_TARGET_DISTANCE
protected EMeleeHitType GetAttackTypeFromInputs(HumanInputController pInputs)
protected void EvaluateHit_NonAlignableObjects(InventoryItem weapon, Object target)
void SetBlock(bool block)
protected 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.
bool HandleFightLogic(int pCurrentCommandID, HumanInputController pInputs, EntityAI pEntityInHands, HumanMovementState pMovementState, out bool pContinueAttack)
protected bool EvaluateFinisherAttack(InventoryItem weapon, Object target)
Check and evaluate stealth kill, if applicable.
protected void DamageHands(DayZPlayer DZPlayer, ClothingBase gloves, InventoryItem itemInHands)
protected void EvaluateHit(InventoryItem weapon)
protected bool HandleSprintAttack(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
sprint attack in erc stance
protected void GetTargetData(out EntityAI target, out EMeleeTargetType targetType)
const string DUMMY_HEAVY_AMMO
protected bool HandleHitEvent(int pCurrentCommandID, HumanInputController pInputs, InventoryItem itemInHands, HumanMovementState pMovementState, out bool pContinueAttack)
Handle the event that our melee hit something.
protected ref map< int, ref Timer > m_CooldownTimers
protected 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.
protected 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
protected bool IsBehindEntity(int angle, DayZPlayer source, Object target)
DEPRECATED - moved into DayZPlayerImplementMeleeCombat.
protected Mission m_Mission
protected bool m_WasPreviousHitProcessed
protected void EvaluateHit_Infected(InventoryItem weapon, Object target)
protected bool IsShortDistance(EntityAI pTarget, float pDistanceSq)
protected void EnableControls()
bool WeaponDestroyedCheck(InventoryItem weapon, out string ammo)
const string DUMMY_LIGHT_AMMO
dummy ammo types
protected float GetAttackTypeByDistanceToTarget(EntityAI pTarget, EMeleeTargetType pTargetType=EMeleeTargetType.ALIGNABLE)
private void DayZPlayerUtils()
cannot be instantiated
eBrokenLegs
Definition EBrokenLegs.c:2
EMeleeTargetType
EStaminaConsumers
EStaminaModifiers
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
ProcessDirectDamageFlags
Definition Object.c:2
protected void ResetCooldown(int modifier=-1)
void SetCooldown(float val)
proto native Mission GetMission()
do not process rotations !
Definition DayZAnimal.c:437
override int GetMeleeTargetType()
Definition Building.c:46
proto native bool WasHit()
is true only once after hit event
static const int HIT_TYPE_FINISHER
Definition human.c:534
static const int HIT_TYPE_FINISHER_NECK
Definition human.c:535
proto bool GetCurrentInputAngle(out float pAngle)
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 native void SetMeleeBlock(bool pBlock)
this enables/disables block
proto native float GetBaseAimingAngleLR()
returns base aiming angle LR - without sway/offsets/...
proto native int IsMeleeLREvade()
returns 0,1,2 = none,left,right
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
proto native bool IsWeaponRaised()
returns true if weapon is raised
HumanInventory... with FSM (synchronous, no anims)
int m_iStanceIdx
current command's id
Definition human.c:1117
Definition EnMath.c:7
Mission class.
Definition gameplay.c:670
static const float BROKEN_LEGS_HEAVY_MELEE_SHOCK
static const float BROKEN_LEGS_LIGHT_MELEE_SHOCK
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
DayZPlayerConstants
defined in C++
Definition dayzplayer.c:602
proto native CGame GetGame()
const float PVP_MAX_BLOCKABLE_ANGLE
Definition constants.c:899
const int STATE_RUINED
Definition constants.c:742
static proto float AngleFromPosition(vector origin, vector originDir, vector target)
Angle that a target is from the direction of an origin.
static int RandomIntInclusive(int min, int max)
Returns a random int number between and min [inclusive] and max [inclusive].
Definition EnMath.c:53
static proto float SqrFloat(float f)
Returns squared value.
static proto float AbsFloat(float f)
Returns absolute value.
static const float RAD2DEG
Definition EnMath.c:16
const int CALL_CATEGORY_SYSTEM
Definition tools.c:8
proto native int GetCurrentHitType()