Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_PickupRequestedTaskEntity.c
Go to the documentation of this file.
4
5class SCR_PickupRequestedTaskEntity : SCR_BaseRequestedTaskEntity
6{
7 [Attribute("150", UIWidgets.EditBox, "Area radius [m]", "0 inf")]
8 protected float m_fAreaRadius;
9
10 protected float m_fAreaRadiusSq;
11 protected RplComponent m_RplComponent;
13 protected ref array<int> m_aFilteredRequesters = {};
15
16 static int PERIODICAL_CHECK_INTERVAL = 2000; // ms
17
18 //------------------------------------------------------------------------------------------------
19 protected void PeriodicalCheck()
20 {
21 if (!m_GroupsManager)
22 return;
23
24 SCR_AIGroup group = m_GroupsManager.FindGroup(GetRequesterId());
25 if (!group)
26 return;
27
28 array<int> assigneePlayerIDs = GetTaskAssigneePlayerIDs();
29 if (assigneePlayerIDs && !assigneePlayerIDs.IsEmpty() && !IsAnyPlayerAlive(assigneePlayerIDs))
30 {
31 // fail - all assigned are dead
32 m_TaskSystem.SetTaskState(this, SCR_ETaskState.FAILED);
33 DeleteTask();
34 return;
35 }
36
37 PlayerManager playerManager = GetGame().GetPlayerManager();
38 array<int> requesterIDs = group.GetPlayerIDs();
39 SCR_ChimeraCharacter requesterCharacter;
40 SCR_ChimeraCharacter assigneeCharacter;
41 vector taskPosition = GetTaskPosition();
42 bool isAnyRequesterAlive;
43
45
46 foreach (int requesterID : requesterIDs)
47 {
48 requesterCharacter = GetCharacter(requesterID);
49 if (!requesterCharacter)
50 continue;
51
52 isAnyRequesterAlive = true;
53
54 if (!requesterCharacter.IsInVehicle())
55 continue;
56
57 IEntity requesterVehicle = GetVehicle(requesterCharacter);
58 if (!requesterVehicle)
59 continue;
60
61 // check if a requester is inside of the area
62 if (vector.DistanceSqXZ(requesterCharacter.GetOrigin(), taskPosition) <= m_fAreaRadiusSq)
63 {
64 if (!m_aFilteredRequesters.Contains(requesterID))
65 m_aFilteredRequesters.Insert(requesterID);
66
67 continue;
68 }
69
70 // we need the requester to be in the area at least once.
71 if (!m_aFilteredRequesters.Contains(requesterID))
72 continue;
73
74 foreach (int assigneePlayerID : assigneePlayerIDs)
75 {
76 assigneeCharacter = GetCharacter(assigneePlayerID);
77 if (!assigneeCharacter || !assigneeCharacter.IsInVehicle())
78 continue;
79
80 IEntity assigneeVehicle = GetVehicle(assigneeCharacter);
81
82 // check if requester is in vehicle with assignee
83 if (assigneeVehicle == requesterVehicle)
84 {
86 break;
87 }
88 }
89 }
90
91 if (!isAnyRequesterAlive)
92 {
93 // fail - all requesters are dead
94 m_TaskSystem.SetTaskState(this, SCR_ETaskState.FAILED);
95 DeleteTask();
96 }
97 else if (m_iRequestersInVehicle > 0)
98 {
99 // completed - at least one requester and one assignee are in the vehicle and outside the zone
100 m_TaskSystem.SetTaskState(this, SCR_ETaskState.COMPLETED);
101 DeleteTask();
102 }
103 }
104
105 //------------------------------------------------------------------------------------------------
106 protected bool IsAnyPlayerAlive(notnull array<int> playerIDs)
107 {
108 foreach (int playerID : playerIDs)
109 {
110 if (!GetCharacter(playerID))
111 continue;
112
113 return true;
114 }
115
116 return false;
117 }
118
119 //------------------------------------------------------------------------------------------------
120 protected SCR_ChimeraCharacter GetCharacter(int playerID)
121 {
122 SCR_ChimeraCharacter character = SCR_ChimeraCharacter.Cast(GetGame().GetPlayerManager().GetPlayerControlledEntity(playerID));
123 if (!character)
124 return null;
125
126 CharacterControllerComponent charControl = character.GetCharacterController();
127 if (!charControl || charControl.IsDead())
128 return null;
129
130 return character;
131 }
132
133 //------------------------------------------------------------------------------------------------
134 protected IEntity GetVehicle(notnull IEntity character)
135 {
137 if (!compartmentAccess)
138 return null;
139
140 return compartmentAccess.GetVehicle();
141 }
142
143 //------------------------------------------------------------------------------------------------
144 protected void AddXPReward()
145 {
146 if (!m_RplComponent || m_RplComponent.IsProxy())
147 return;
148
149 SCR_XPHandlerComponent comp = SCR_XPHandlerComponent.Cast(GetGame().GetGameMode().FindComponent(SCR_XPHandlerComponent));
150 if (!comp)
151 return;
152
153 // add XP to all players in the assigned group
154 array<int> assigneePlayerIDs = GetTaskAssigneePlayerIDs();
155 if (!assigneePlayerIDs)
156 return;
157
158 foreach (int playerID : assigneePlayerIDs)
159 {
160 comp.AwardXP(playerID, SCR_EXPRewards.PICKUP_TASK_COMPLETED, m_iRequestersInVehicle, false);
161 }
162 }
163
164 //------------------------------------------------------------------------------------------------
165 override void SetTaskState(SCR_ETaskState state)
166 {
167 if (state == SCR_ETaskState.COMPLETED)
168 AddXPReward();
169
170 super.SetTaskState(state);
171 }
172
173 //------------------------------------------------------------------------------------------------
174 override void EOnInit(IEntity owner)
175 {
176 super.EOnInit(owner);
177
178 if (SCR_Global.IsEditMode(this))
179 return;
180
182 m_RplComponent = RplComponent.Cast(owner.FindComponent(RplComponent));
184
185 if (!m_RplComponent || m_RplComponent.IsProxy())
186 return;
187
188 GetGame().GetCallqueue().CallLater(PeriodicalCheck, PERIODICAL_CHECK_INTERVAL, true);
189 }
190
191 //------------------------------------------------------------------------------------------------
192 // destructor
194 {
195 GetGame().GetCallqueue().Remove(PeriodicalCheck);
196 }
197}
ArmaReforgerScripted GetGame()
Definition game.c:1398
void DeleteTask()
void PeriodicalCheck()
override void SetTaskState(SCR_ETaskState state)
float m_fAreaRadius
SCR_AttackTaskEntityClass PERIODICAL_CHECK_INTERVAL
float m_fAreaRadiusSq
SCR_BaseGameMode GetGameMode()
RplComponent m_RplComponent
void AddXPReward()
void SCR_GroupsManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
bool IsAnyPlayerAlive(notnull array< int > playerIDs)
ref array< int > m_aFilteredRequesters
SCR_GroupsManagerComponent m_GroupsManager
void ~SCR_PickupRequestedTaskEntity()
array< int > GetTaskAssigneePlayerIDs()
Definition SCR_Task.c:458
vector GetTaskPosition()
Definition SCR_Task.c:1282
SCR_ETaskState
Definition SCR_Task.c:3
SCR_TaskSystem m_TaskSystem
proto external Managed FindComponent(typename typeName)
array< int > GetPlayerIDs()
static bool IsEditMode()
Definition Functions.c:1566
override void EOnInit(IEntity owner)
proto external SCR_ChimeraCharacter GetCharacter()
Returns the current controlled character.
SCR_FieldOfViewSettings Attribute