Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AIFindFirePositionBehavior.c
Go to the documentation of this file.
1
4
5class SCR_AIFindFirePositionBehavior : SCR_AIBehaviorBase
6{
7 static const float SNIPER_MIN_DISTANCE = 70.0;
8 static const float SNIPER_MAX_DISTANCE = 180.0;
9 static const float SNIPER_DURATION_S = 3*60.0;
10
11 ref SCR_BTParam<vector> m_vTargetPosition = new SCR_BTParam<vector>("TargetPos");
12 ref SCR_BTParam<float> m_fMinDistance = new SCR_BTParam<float>("MinDist");
13 ref SCR_BTParam<float> m_fMaxDistance = new SCR_BTParam<float>("MaxDist");
14 ref SCR_BTParam<float> m_fDuration_s = new SCR_BTParam<float>("Duration_s");
15
16 EAIUnitType m_eTargetUnitType;
17
18 //---------------------------------------------------------------------------------------------------------------------------------
19 override int GetCause()
20 {
21 return SCR_EAIBehaviorCause.COMBAT;
22 }
23
24 //----------------------------------------------------------------------------------------------------------------
25 void InitParameters(vector targetPos, float minDistance, float maxDistance, float duration)
26 {
27 m_vTargetPosition.Init(this, targetPos);
28 m_fMinDistance.Init(this, minDistance);
29 m_fMaxDistance.Init(this, maxDistance);
30 m_fDuration_s.Init(this, duration);
31 }
32 //----------------------------------------------------------------------------------------------------------------
33 void SCR_AIFindFirePositionBehavior(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity, vector targetPos,
34 float minDistance, float maxDistance, EAIUnitType targetUnitType, float duration, float priorityLevel = PRIORITY_LEVEL_NORMAL)
35 {
36 InitParameters(targetPos, minDistance, maxDistance, duration);
37
38 m_eTargetUnitType = targetUnitType;
39
40 m_sBehaviorTree = "{905124EEBF36D180}AI/BehaviorTrees/Chimera/Soldier/FindFirePosition.bt";
41 SetPriority(PRIORITY_BEHAVIOR_FIND_FIRE_POSITION);
42 m_fPriorityLevel.m_Value = priorityLevel;
43 m_bAllowLook = true;
44 }
45
46 //----------------------------------------------------------------------------------------------------------------
47 override float CustomEvaluate()
48 {
49 // Complete when we have found some target to attack
50 if (m_Utility.m_CombatComponent.GetCurrentTarget())
51 {
52 Complete();
53 return 0;
54 }
55
56 return GetPriority();
57 }
58
59 //-----------------------------------------------------------------------------------------------------
60 override void OnActionSelected()
61 {
62 super.OnActionSelected();
63
64 m_Utility.m_CombatComponent.SetExpectedEnemyType(m_eTargetUnitType);
65 }
66}
67
68class SCR_AIGetFindFirePositionNextPos : SCR_AIActionTask
69{
70 protected static const string PORT_NEXT_POSITION = "NextPosition";
71
72 // When searching for next position, it will be within this range from our current position
73 protected const float NEXT_POS_MIN_DIST = 13.0;
74 protected const float NEXT_POS_MAX_DIST = 20.0;
75
76 // When walking towards or away from target, the position will be randomized by this radius
77 protected const float WALK_DIRECTLY_RANDOM_RADIUS = 4.0;
78
79 //-----------------------------------------------------------------------------------------------------
80 override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
81 {
82 if (!m_UtilityComp)
83 return ENodeResult.FAIL;
84
85 SCR_AIActionBase executedAction = GetExecutedAction();
87 if (!behavior)
88 return ENodeResult.FAIL;
89
90 vector targetPos = behavior.m_vTargetPosition.m_Value;
91 IEntity myEntity = owner.GetControlledEntity();
92 vector myPos = myEntity.GetOrigin();
93
94 vector vFromTarget = vector.Direction(targetPos, myPos);
95 vFromTarget[1] = 0;
96 float distanceToTarget = vFromTarget.Length();
97 vector vDirFromTarget = vFromTarget.Normalized(); // Direction vector from target to us
98 vDirFromTarget.Normalize();
99
100 vector nextMovePos;
101 float minDist = behavior.m_fMinDistance.m_Value;
102 float maxDist = behavior.m_fMaxDistance.m_Value;
103 if (distanceToTarget > minDist &&
104 distanceToTarget < maxDist)
105 {
106 // We are within optimal range, walk around
107 nextMovePos = s_AIRandomGenerator.GenerateRandomPointInRadius(NEXT_POS_MIN_DIST, NEXT_POS_MAX_DIST, myPos);
108 }
109 else
110 {
111 float randomDistance = Math.RandomFloat(10, 20);
112 float dirMultiplier = 1;
113 if (distanceToTarget > maxDist)
114 {
115 // We are too far, move closer
116 dirMultiplier = -1;
117 }
118
119 vector nextMovePosCenter = myPos + dirMultiplier * randomDistance * vDirFromTarget;
120 nextMovePos = s_AIRandomGenerator.GenerateRandomPointInRadius(0, WALK_DIRECTLY_RANDOM_RADIUS, nextMovePosCenter);
121 }
122
124
125 return ENodeResult.SUCCESS;
126 }
127
128 //-----------------------------------------------------------------------------------------------------
129 static override bool VisibleInPalette() { return true; }
130
131 //-----------------------------------------------------------------------------------------------------
132 protected static ref TStringArray s_aVarsOut = { PORT_NEXT_POSITION };
133 override TStringArray GetVariablesOut() { return s_aVarsOut; }
134}
135
137{
138 static ref TStringArray s_aVarsOut = (new SCR_AIFindFirePositionBehavior(null, null, vector.Zero, 0, 0, 0, 0)).GetPortNames();
139 override TStringArray GetVariablesOut() { return s_aVarsOut; }
140
141 static override bool VisibleInPalette() { return true; }
142};
ref SCR_BTParam< float > m_fPriorityLevel
enum EAIActionFailReason PRIORITY_LEVEL_NORMAL
TStringArray GetPortNames()
ResourceName m_sBehaviorTree
override void OnActionSelected()
int GetCause()
void SCR_AIActivityBase(SCR_AIGroupUtilityComponent utility, AIWaypoint relatedWaypoint)
enum SCR_EAIActivityCause m_Utility
void SCR_AIBehaviorBase(SCR_AIUtilityComponent utility, SCR_AIActivityBase groupActivity)
SCR_EAIBehaviorCause
bool m_bAllowLook
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
const float NEXT_POS_MAX_DIST
const float NEXT_POS_MIN_DIST
SCR_AIFindFirePositionBehavior PORT_NEXT_POSITION
const float WALK_DIRECTLY_RANDOM_RADIUS
override TStringArray GetVariablesOut()
override float CustomEvaluate()
SCR_AIPickupInventoryItemsBehavior s_aVarsOut
AIBaseUtilityComponent m_UtilityComp
class SCR_AINodePortsHelpers s_AIRandomGenerator
proto external vector GetOrigin()
Definition Math.c:13
proto void SetVariableOut(string name, void val)
bool VisibleInPalette()
TStringArray GetVariablesOut()
Definition Node.c:28
SCR_AIActionBase GetExecutedAction()
Returns current action from the utility component.
static override bool VisibleInPalette()
ENodeResult
Definition ENodeResult.c:13
EAIUnitType
Definition EAIUnitType.c:13
array< string > TStringArray
Definition Types.c:385