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

◆ TargetSelection()

void TargetSelection ( )
protected

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

335 {
336 // Prepare common variables
337 PlayerBase player = PlayerBase.Cast(m_DZPlayer);
338 vector pos = m_DZPlayer.GetPosition();
339 vector rayStart = m_DZPlayer.GetBonePositionWS(m_DZPlayer.GetBoneIndexByName("Head"));
340
341 vector cameraPos, cameraRot, cameraDir;
342 m_DZPlayer.GetCurrentCameraTransform(cameraPos, cameraDir, cameraRot);
343 vector dir = MiscGameplayFunctions.GetHeadingVector(player);
344 dir[1] = cameraDir[1];
345
346 // Calculate max distances
347 float dist = GetRange();
348 float angle = GetAngle();
349 float dist2 = Math.SqrFloat(dist);
350
351 // There's generally 2 TargetSelection calls per animation
352 // First to obtain target to move towards during animation
353 // Second one is to see if that target is still in range before applying damage to it
354 // m_WasHit means the hit event occured, so this is the second call
355
356 if (m_WasHit && GetFinisherType() == -1)
357 {
358 // See if the component is still in range
359 if (CanObjectBeTargeted(m_TargetObject) && ( vector.DistanceSq(rayStart, m_TargetObject.GetDamageZonePos(m_HitZoneName)) <= dist2 ))
360 {
362 // This result should still be cached, so no need to fill it in again
363 return;
364 }
365 }
366
367 // Find a new target
369
370 Object target;
371 vector hitPos;
372 int hitZone;
373
374 // First pass - Prefer what the player is looking at (only aligneable ones, we will try for nonaligneable later)
375 if (HitZoneSelectionRaycastHelper(hitPos, hitZone, target))
376 {
378 {
379 SetTarget(target, hitPos, hitZone);
380 return;
381 }
382
383 if (CanObjectBeTargeted(target) && vector.DistanceSq(rayStart, hitPos) <= dist2)
384 {
385 m_AllTargetObjects.Insert(target);
386
387 SetTarget(target, hitPos, hitZone);
388 return;
389 }
390 }
391
392 // Second pass - Try to obtain something aligneable closeby the player watching direction
394
395 if (targetData)
396 {
397 SetTarget(targetData.Obj, targetData.HitPos, targetData.HitComponent);
398 return;
399 }
400
401 // Third pass - We found no aligneable target, check if the target that we are directly looking at is nonalignable (big)
402 if (CanObjectBeTargeted(target, true) && vector.DistanceSq(rayStart, hitPos) <= dist2)
403 {
404 m_AllTargetObjects.Insert(target);
405
406 SetTarget(target, hitPos, hitZone);
407 return;
408 }
409 }
void SetTarget(Object obj, vector hitPos, int hitZone)
const float TARGETING_MIN_HEIGHT
Second Pass: How deep the cone goes in meters from player position.
bool m_WasHit
If most recent attack was.
ref array< string > m_BlacklistedDamageZones
List of blacklisted damage zone names (cannot use indices due to the possible changes when p3d compon...
void InternalResetTarget()
const float TARGETING_MAX_HEIGHT
Second Pass: How high the cone goes in meters from player position.
ref MeleeTargeting m_MeleeTargeting
Target selecting "component".
bool m_ForceUntargetable
Misc - cache.
ref array< Object > m_AllTargetObjects
All potential targets found during most recent TargetSelection.
float GetRange()
DayZPlayerImplement m_DZPlayer
Parent.
float GetAngle()
Object m_TargetObject
Targets - types.
bool HitZoneSelectionRaycastHelper(out vector hitPos, out int hitZone, out Object target)
int GetFinisherType()
const float TARGETING_RAY_RADIUS_EX
Second Pass: Max distance from ray projected from player looking direction.
ref array< typename > m_TargetableObjects
Typenames of all directly/preferred targetable objects (1st Pass + 2nd Pass)
bool CanObjectBeTargeted(Object obj, bool checkNonAligneAble=false)
string m_HitZoneName
Most recent target HitZone name.
ref array< typename > TargetableObjects void MeleeTargetSettings(vector coneOrigin, float coneLength, float coneHalfAngle, float coneMinHeight, float coneMaxHeight, vector rayStart, vector dir, float maxDist, EntityAI pToIgnore, array< typename > targetableObjects)
Определения MeleeTargeting.c:36
Определения EnMath.c:7
vector HitPos
Определения MeleeTargeting.c:4
int HitComponent
Определения MeleeTargeting.c:5
Object Obj
Определения MeleeTargeting.c:3
Определения MeleeTargeting.c:2
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
Определения EnConvert.c:106
static proto float SqrFloat(float f)
Returns squared value.

Перекрестные ссылки CanObjectBeTargeted(), vector::DistanceSq(), GetAngle(), GetFinisherType(), GetRange(), MeleeTargetData::HitComponent, MeleeTargetData::HitPos, HitZoneSelectionRaycastHelper(), InternalResetTarget(), m_AllTargetObjects, m_BlacklistedDamageZones, m_DZPlayer, m_ForceUntargetable, m_HitZoneName, m_MeleeTargeting, m_TargetableObjects, m_TargetObject, m_WasHit, MeleeTargetSettings(), MeleeTargetData::Obj, SetTarget(), Math::SqrFloat(), TARGETING_MAX_HEIGHT, TARGETING_MIN_HEIGHT и TARGETING_RAY_RADIUS_EX.

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