Arma Reforger Explorer
1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Toggle main menu visibility
Loading...
Searching...
No Matches
SCR_AICombatMoveLogic_MoveFromGrenade.c
Go to the documentation of this file.
1
class
SCR_AICombatMoveLogic_MoveFromGrenade
:
AITaskScripted
2
{
3
// Inputs
4
protected
static
const
string
PORT_POSITION
=
"Position"
;
5
6
// Outputs
7
protected
static
const
string
PORT_COMPLETE_ACTION
=
"CompleteAction"
;
8
9
protected
SCR_AICombatMoveState
m_State
;
10
11
//--------------------------------------------------------------------------------------------
12
override
void
OnInit
(AIAgent owner)
13
{
14
SCR_AIUtilityComponent utility = SCR_AIUtilityComponent.Cast(owner.FindComponent(SCR_AIUtilityComponent));
15
if
(utility)
16
m_State
= utility.m_CombatMoveState;
17
}
18
19
20
//--------------------------------------------------------------------------------------------
21
override
ENodeResult
EOnTaskSimulate
(AIAgent owner,
float
dt)
22
{
23
if
(!
m_State
)
24
return
ENodeResult
.FAIL;
25
26
vector
threatPos;
27
GetVariableIn
(
PORT_POSITION
, threatPos);
28
if
(threatPos ==
vector
.Zero)
29
return
ENodeResult
.FAIL;
30
31
bool
completeAction =
false
;
32
CombatMoveLogic
(threatPos, completeAction);
33
34
SetVariableOut
(
PORT_COMPLETE_ACTION
, completeAction);
35
36
return
ENodeResult
.SUCCESS;
37
}
38
39
//--------------------------------------------------------------------------------------------
40
void
CombatMoveLogic
(
vector
threatPos, out
bool
outCompleteAction)
41
{
42
if
(!
m_State
)
43
return
;
44
45
bool
completeAction =
false
;
46
47
if
(
ConditionPushMoveRequest
(threatPos))
48
{
49
SCR_AICombatMoveRequest_Move
rq =
new
SCR_AICombatMoveRequest_Move
();
50
51
rq.m_eReason = SCR_EAICombatMoveReason.MOVE_FROM_DANGER;
52
53
rq.m_vTargetPos = threatPos;
54
rq.m_vMovePos = rq.m_vTargetPos;
55
rq.m_bTryFindCover =
true
;
56
rq.m_bUseCoverSearchDirectivity =
true
;
57
rq.m_bCheckCoverVisibility =
false
;
58
rq.m_bFailIfNoCover =
false
;
59
rq.m_eStanceMoving =
ECharacterStance
.STAND;
60
rq.m_eStanceEnd =
ECharacterStance
.CROUCH;
61
rq.m_eMovementType =
EMovementType
.SPRINT;
62
rq.m_fCoverSearchDistMax = 15;
63
rq.m_fCoverSearchDistMin = 4;
64
rq.m_fMoveDuration_s = rq.m_fCoverSearchDistMax /
SCR_AICombatMoveUtils
.CHARACTER_SPEED_STAND_SPRINT;
65
rq.m_eDirection = SCR_EAICombatMoveDirection.BACKWARD;
66
rq.m_fCoverSearchSectorHalfAngleRad =
Math
.PI_HALF;
// 90 deg
67
68
rq.m_bAimAtTarget =
false
;
69
rq.m_bAimAtTargetEnd =
true
;
70
71
m_State
.ApplyNewRequest(rq);
72
}
73
else
if
(
m_State
.m_bInCover &&
m_State
.IsAssignedCoverValid() &&
IsCoverSafeAgainstGrenade
(
m_State
.GetAssignedCover(), threatPos))
74
{
75
// Found good enough cover, complete the action
76
completeAction =
true
;
77
return
;
78
}
79
80
outCompleteAction = completeAction;
81
}
82
83
//--------------------------------------------------------------------------------------------
84
bool
ConditionPushMoveRequest
(
vector
tgtPos)
85
{
86
if
(
m_State
.IsMoving())
87
{
88
if
(
m_State
.IsMovingToCover())
89
{
90
// Already moving to cover, continue moving there even if it's not cover to hide from this grenade
91
return
false
;
92
}
93
else
94
{
95
SCR_AICombatMoveRequest_Move
rqMove =
SCR_AICombatMoveRequest_Move
.Cast(
m_State
.GetRequest());
96
if
(rqMove && rqMove.m_eReason == SCR_EAICombatMoveReason.MOVE_FROM_DANGER)
97
return
false
;
98
else
99
{
100
// Moving not to cover, but this is not our request, make a new request
101
return
true
;
102
}
103
}
104
}
105
else
if
(
m_State
.m_bInCover &&
m_State
.IsAssignedCoverValid())
106
{
107
// Not moving, but we are in cover
108
if
(!
IsCoverSafeAgainstGrenade
(
m_State
.GetAssignedCover(), tgtPos))
109
return
true
;
110
else
111
return
false
;
112
}
113
else
114
{
115
// Not moving, not in cover, run somewhere
116
return
true
;
117
}
118
119
return
false
;
120
}
121
122
//--------------------------------------------------------------------------------------------
123
bool
IsCoverSafeAgainstGrenade
(notnull
SCR_AICoverLock
coverLock,
vector
threatPos)
124
{
125
float
coverDistToThreatSq =
vector
.DistanceSq(threatPos, coverLock.m_vCoverPos);
126
127
// So close is not safe
128
if
(coverDistToThreatSq < 3*3)
// TODO make it constant
129
return
false
;
130
131
// Far enough, check angle
132
float
cosAngleCoverToTgt =
m_State
.GetAssignedCover().CosAngleToThreat(threatPos);
133
return
cosAngleCoverToTgt > 0.707;
// This should match or be close to value in cover query properties
134
}
135
136
//------------------------------------------------------------------------------------
137
protected
static
ref
TStringArray
s_aVarsIn
= {
PORT_POSITION
};
138
override
TStringArray
GetVariablesIn
() {
return
s_aVarsIn
; }
139
140
protected
static
ref
TStringArray
s_aVarsOut
= {
PORT_COMPLETE_ACTION
};
141
override
TStringArray
GetVariablesOut
() {
return
s_aVarsOut
; }
142
143
static
override
bool
VisibleInPalette
() {
return
true
; }
144
}
SCR_AICombatMoveRequest_Move
void SCR_AICombatMoveRequest_Move()
Definition
SCR_AICombatMoveRequest.c:145
AITaskScripted
Definition
AITaskScripted.c:13
Math
Definition
Math.c:13
Node::SetVariableOut
proto void SetVariableOut(string name, void val)
Node::GetVariableIn
proto bool GetVariableIn(string name, out void val)
SCR_AICombatMoveLogic_MoveFromGrenade
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:2
SCR_AICombatMoveLogic_MoveFromGrenade::VisibleInPalette
static override bool VisibleInPalette()
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:143
SCR_AICombatMoveLogic_MoveFromGrenade::PORT_POSITION
static const string PORT_POSITION
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:4
SCR_AICombatMoveLogic_MoveFromGrenade::GetVariablesOut
override TStringArray GetVariablesOut()
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:141
SCR_AICombatMoveLogic_MoveFromGrenade::s_aVarsOut
static ref TStringArray s_aVarsOut
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:140
SCR_AICombatMoveLogic_MoveFromGrenade::s_aVarsIn
static ref TStringArray s_aVarsIn
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:137
SCR_AICombatMoveLogic_MoveFromGrenade::IsCoverSafeAgainstGrenade
bool IsCoverSafeAgainstGrenade(notnull SCR_AICoverLock coverLock, vector threatPos)
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:123
SCR_AICombatMoveLogic_MoveFromGrenade::GetVariablesIn
override TStringArray GetVariablesIn()
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:138
SCR_AICombatMoveLogic_MoveFromGrenade::CombatMoveLogic
void CombatMoveLogic(vector threatPos, out bool outCompleteAction)
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:40
SCR_AICombatMoveLogic_MoveFromGrenade::OnInit
override void OnInit(AIAgent owner)
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:12
SCR_AICombatMoveLogic_MoveFromGrenade::PORT_COMPLETE_ACTION
static const string PORT_COMPLETE_ACTION
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:7
SCR_AICombatMoveLogic_MoveFromGrenade::EOnTaskSimulate
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:21
SCR_AICombatMoveLogic_MoveFromGrenade::m_State
SCR_AICombatMoveState m_State
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:9
SCR_AICombatMoveLogic_MoveFromGrenade::ConditionPushMoveRequest
bool ConditionPushMoveRequest(vector tgtPos)
Definition
SCR_AICombatMoveLogic_MoveFromGrenade.c:84
SCR_AICombatMoveRequest_Move
Definition
SCR_AICombatMoveRequest.c:88
SCR_AICombatMoveUtils
Definition
SCR_AICombatMoveUtils.c:6
SCR_AICoverLock
Definition
SCR_AICoverLock.c:20
vector
Definition
vector.c:13
ENodeResult
ENodeResult
Definition
ENodeResult.c:13
ECharacterStance
ECharacterStance
Definition
ECharacterStance.c:13
EMovementType
EMovementType
Definition
EMovementType.c:13
TStringArray
array< string > TStringArray
Definition
Types.c:385
scripts
Game
AI
Movement
SCR_AICombatMoveLogic_MoveFromGrenade.c
Generated by
1.17.0