Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_EstablishBaseTaskEntity.c
Go to the documentation of this file.
4
5class SCR_EstablishBaseTaskEntity : SCR_Task
6{
7 protected RplComponent m_RplComponent;
8 protected bool m_bPlayerInArea;
12 protected int m_iBaseMinDistanceSq;
14 protected SCR_CampaignBuildingManagerComponent m_BuildingManagerComponent;
18
19 protected const int DELETE_TASK_DELAY = 600;
20
21 protected static ref ScriptInvokerVoid s_OnPlayerEnteredEstablishingArea;
22
23 //------------------------------------------------------------------------------------------------
24 static ScriptInvokerVoid GetOnPlayerEnteredEstablishingArea()
25 {
26 if (!s_OnPlayerEnteredEstablishingArea)
27 s_OnPlayerEnteredEstablishingArea = new ScriptInvokerVoid();
28
29 return s_OnPlayerEnteredEstablishingArea;
30 }
31
32 //------------------------------------------------------------------------------------------------
33 protected void AddXPReward()
34 {
35 SCR_XPHandlerComponent comp = SCR_XPHandlerComponent.Cast(GetGame().GetGameMode().FindComponent(SCR_XPHandlerComponent));
36 if (!comp || !m_RplComponent || m_RplComponent.IsProxy())
37 return;
38
39 // add XP to all players in the assigned group
40 array<int> assigneePlayerIDs = GetTaskAssigneePlayerIDs();
41 if (!assigneePlayerIDs)
42 return;
43
44 foreach (int playerID : assigneePlayerIDs)
45 {
46 comp.AwardXP(playerID, SCR_EXPRewards.ESTABLISH_BASE_COMPLETED, 1.0, false);
47 }
48 }
49
50 //------------------------------------------------------------------------------------------------
51 protected void CheckEstablishmentArea()
52 {
54 if (!player)
55 return;
56
57 float distanceSq = vector.DistanceSqXZ(player.GetOrigin(), GetOrigin());
58
59 if (!m_bPlayerInArea && distanceSq <= m_iBaseEstablishingRadiusSq)
60 {
61 m_bPlayerInArea = true;
62 SCR_NotificationsComponent.SendLocal(ENotification.GROUP_TASK_ESTABLISH_BASE_ENABLED);
63
64 if (s_OnPlayerEnteredEstablishingArea)
65 s_OnPlayerEnteredEstablishingArea.Invoke();
66 }
67
69 {
70 m_bPlayerInArea = false;
71 SCR_NotificationsComponent.SendLocal(ENotification.GROUP_TASK_ESTABLISH_BASE_DISABLED);
72 }
73 }
74
75 //------------------------------------------------------------------------------------------------
77 {
79 return;
80
82 return;
83
85 GetGame().GetCallqueue().CallLater(CheckEstablishmentArea, SCR_GameModeCampaign.DEFAULT_DELAY, true);
86 }
87
88 //------------------------------------------------------------------------------------------------
90 {
92 return;
93
94 m_bPlayerInArea = false;
96 GetGame().GetCallqueue().Remove(CheckEstablishmentArea);
97 }
98
99 //------------------------------------------------------------------------------------------------
100 protected void OnTaskAssigneeAdded(SCR_Task task, SCR_TaskExecutor executor, int requesterID)
101 {
102 if (task != this)
103 return;
104
106 }
107
108 //------------------------------------------------------------------------------------------------
109 protected void OnTaskAssigneeRemoved(SCR_Task task, SCR_TaskExecutor executor, int requesterID)
110 {
111 if (task != this)
112 return;
113
115 }
116
117 //------------------------------------------------------------------------------------------------
118 protected SCR_MilitaryBaseComponent GetBase(vector position, bool isAllowedCampaignBase = false)
119 {
121 if (!baseSystem)
122 return null;
123
124 array<SCR_MilitaryBaseComponent> bases = {};
125 baseSystem.GetBases(bases);
126
127 foreach (SCR_MilitaryBaseComponent base : bases)
128 {
129 if (vector.DistanceSqXZ(base.GetOwner().GetOrigin(), position) <= (base.GetRadius() * base.GetRadius()))
130 {
131 if (!isAllowedCampaignBase && SCR_CampaignMilitaryBaseComponent.Cast(base))
132 continue;
133
134 return base;
135 }
136 }
137
138 return null;
139 }
140
141 //------------------------------------------------------------------------------------------------
142 protected void OnBaseBuilt(notnull SCR_CampaignMilitaryBaseComponent campaignBase, Faction faction)
143 {
144 float distanceSq = vector.DistanceSqXZ(campaignBase.GetOwner().GetOrigin(), GetOrigin());
145
146 if (distanceSq <= Math.Pow(m_iBaseEstablishingRadius + m_fProviderBuildingRadius, 2))
147 {
149 {
150 m_TaskSystem.SetTaskState(this, SCR_ETaskState.COMPLETED); // HQ was built and the hologram was placed by a builder with the same faction.
151
152 // change faction of the HQ composition if not match with builder's faction
153 if (campaignBase.GetCampaignFaction() != m_BuilderFaction)
154 {
155 campaignBase.SetFaction(m_BuilderFaction);
156
157 SCR_MilitaryBaseComponent base = GetBase(campaignBase.GetOwner().GetOrigin());
158 if (base)
159 base.SetFaction(m_BuilderFaction);
160 }
161 }
162 else
163 {
164 m_TaskSystem.SetTaskState(this, SCR_ETaskState.FAILED);
165 }
166
167 DeleteTask();
168 }
169 else if (distanceSq <= m_iBaseMinDistanceSq)
170 {
172 m_TaskSystem.SetTaskState(this, SCR_ETaskState.CANCELLED);
173 else
174 m_TaskSystem.SetTaskState(this, SCR_ETaskState.FAILED);
175
176 DeleteTask();
177 }
178 }
179
180 //------------------------------------------------------------------------------------------------
182 {
183 if (task != this)
184 return;
185
186 if (newState == SCR_ETaskState.COMPLETED)
187 {
188 AddXPReward();
189 }
190 }
191
192 //------------------------------------------------------------------------------------------------
193 protected void OnHQCompositionSpawned(bool spawned)
194 {
195 FactionManager factionManager = GetGame().GetFactionManager();
196 if (!factionManager)
197 return;
198
200
201 foreach (SCR_CampaignBuildingCompositionComponent buildingComposition, float buildingRadius : m_mPlacedHQs)
202 {
203 if (!buildingComposition || !buildingComposition.IsCompositionSpawned())
204 continue;
205
206 SCR_CampaignFaction builderFaction = SCR_CampaignFaction.Cast(SCR_FactionManager.SGetPlayerFaction(buildingComposition.GetBuilderId()));
207 if (!builderFaction)
208 continue;
209
210 SCR_CampaignFaction campaignFaction;
211 foreach (string factionKey : m_TaskData.m_aOwnerFactionKeys)
212 {
213 if (factionKey.IsEmpty())
214 continue;
215
216 campaignFaction = SCR_CampaignFaction.Cast(factionManager.GetFactionByKey(factionKey));
217 if (!campaignFaction)
218 continue;
219
220 if (campaignFaction == builderFaction)
221 {
223 m_BuilderFaction = builderFaction;
224 m_fProviderBuildingRadius = buildingRadius;
225 return;
226 }
227 }
228 }
229 }
230
231 //------------------------------------------------------------------------------------------------
232 protected void OnEntitySpawnedByProvider(int prefabID, SCR_EditableEntityComponent editableEntity, int playerId, SCR_CampaignBuildingProviderComponent provider)
233 {
234 if (!editableEntity || !provider)
235 return;
236
237 SCR_CampaignBuildingCompositionComponent buildingCompositionComponent = SCR_CampaignBuildingCompositionComponent.Cast(editableEntity.GetOwner().FindComponent(SCR_CampaignBuildingCompositionComponent));
238 if (!buildingCompositionComponent)
239 return;
240
241 if (!IsHQService(editableEntity))
242 return;
243
244 vector entityPos;
245 editableEntity.GetPos(entityPos);
246
247 float providerBuildingRadius = provider.GetBuildingRadius();
248 if (vector.DistanceSqXZ(entityPos, GetOrigin()) > m_iBaseMinDistanceSq)
249 return;
250
251 m_mPlacedHQs.Set(buildingCompositionComponent, providerBuildingRadius);
252
253 buildingCompositionComponent.GetOnCompositionSpawned().Insert(OnHQCompositionSpawned);
254 }
255
256 //------------------------------------------------------------------------------------------------
257 protected bool IsHQService(SCR_EditableEntityComponent editableEntity)
258 {
259 SCR_EditableEntityUIInfo prefabInfo = SCR_EditableEntityUIInfo.Cast(editableEntity.GetInfo());
260 if (!prefabInfo)
261 return false;
262
263 array<EEditableEntityLabel> entityLabels = {};
264 prefabInfo.GetEntityLabels(entityLabels);
265 return entityLabels.Contains(EEditableEntityLabel.SERVICE_HQ);
266 }
267
268 //------------------------------------------------------------------------------------------------
269 protected void DeleteTask()
270 {
271 if (!m_TaskSystem)
272 return;
273
274 m_TaskSystem.DeleteTask(this);
275 }
276
277 //------------------------------------------------------------------------------------------------
278 protected void OnDataLoaded()
279 {
281 }
282
283 //------------------------------------------------------------------------------------------------
284 override bool RplLoad(ScriptBitReader reader)
285 {
286 bool loaded = super.RplLoad(reader);
287 if (loaded)
288 OnDataLoaded();
289
290 return loaded;
291 }
292
293 //------------------------------------------------------------------------------------------------
294 override void EOnInit(IEntity owner)
295 {
296 super.EOnInit(owner);
297
298 if (SCR_Global.IsEditMode(this))
299 return;
300
301 SCR_CampaignFactionCommanderHandlerComponent handlerComponent = SCR_CampaignFactionCommanderHandlerComponent.Cast(SCR_FactionCommanderHandlerComponent.GetInstance());
302 if (!handlerComponent)
303 return;
304
305 m_iBaseEstablishingRadius = handlerComponent.GetBaseEstablishingRadius();
307 int baseMinDistance = SCR_CampaignFactionCommanderHandlerComponent.Cast(SCR_FactionCommanderHandlerComponent.GetInstance()).GetBaseMinDistance(SCR_ECampaignBaseType.BASE);
308 m_iBaseMinDistanceSq = baseMinDistance * baseMinDistance;
309
310 // run only on client with UI
311 if (!System.IsConsoleApp())
312 {
313 GetOnTaskAssigneeAdded().Insert(OnTaskAssigneeAdded);
314 GetOnTaskAssigneeRemoved().Insert(OnTaskAssigneeRemoved);
315 }
316
317 m_RplComponent = RplComponent.Cast(FindComponent(RplComponent));
318 if (!m_RplComponent || m_RplComponent.IsProxy())
319 return;
320
321 GetOnTaskStateChanged().Insert(OnTaskStateChanged);
322
323 SCR_GameModeCampaign gameMode = SCR_GameModeCampaign.GetInstance();
324 if (!gameMode)
325 return;
326
327 SCR_CampaignMilitaryBaseManager baseManager = gameMode.GetBaseManager();
328 if (baseManager)
329 baseManager.GetOnBaseBuilt().Insert(OnBaseBuilt);
330
331 m_BuildingManagerComponent = SCR_CampaignBuildingManagerComponent.Cast(gameMode.FindComponent(SCR_CampaignBuildingManagerComponent));
333 return;
334
335 m_BuildingManagerComponent.GetOnEntitySpawnedByProvider().Insert(OnEntitySpawnedByProvider);
336 }
337
338 //------------------------------------------------------------------------------------------------
340 {
341 GetOnTaskAssigneeAdded().Remove(OnTaskAssigneeAdded);
342 GetOnTaskAssigneeRemoved().Remove(OnTaskAssigneeRemoved);
343
344 GetOnTaskStateChanged().Remove(OnTaskStateChanged);
345
346 SCR_GameModeCampaign gameMode = SCR_GameModeCampaign.GetInstance();
347 if (!gameMode)
348 return;
349
350 SCR_CampaignMilitaryBaseManager baseManager = gameMode.GetBaseManager();
351 if (baseManager)
352 baseManager.GetOnBaseBuilt().Remove(OnBaseBuilt);
353
355 return;
356
357 m_BuildingManagerComponent.GetOnEntitySpawnedByProvider().Remove(OnEntitySpawnedByProvider);
358
359 foreach (SCR_CampaignBuildingCompositionComponent buildingComposition, float buildingRadius : m_mPlacedHQs)
360 {
361 if (!buildingComposition)
362 continue;
363
364 buildingComposition.GetOnCompositionSpawned().Remove(OnHQCompositionSpawned);
365 }
366 }
367}
EEditableEntityLabel
ENotification
ArmaReforgerScripted GetGame()
Definition game.c:1398
override bool RplLoad(ScriptBitReader reader)
vector GetOrigin()
void DeleteTask()
SCR_BaseGameMode GetGameMode()
RplComponent m_RplComponent
bool IsHQService(notnull SCR_EditableEntityComponent editableEntity)
SCR_CampaignBuildingManagerComponent m_BuildingManagerComponent
void OnTaskStateChanged(SCR_Task task, SCR_ETaskState newState)
void OnTaskAssigneeAdded(SCR_Task task, SCR_TaskExecutor executor, int requesterID)
void AddXPReward()
vector position
SCR_CampaignFaction m_BuilderFaction
SCR_MilitaryBaseComponent GetBase(vector position, bool isAllowedCampaignBase=false)
void OnTaskAssigneeRemoved(SCR_Task task, SCR_TaskExecutor executor, int requesterID)
int m_iBaseMinDistanceSq
bool m_bHasHQSameFactionAsTask
const int DELETE_TASK_DELAY
void StartCheckingEstablishmentArea()
void OnBaseBuilt(notnull SCR_CampaignMilitaryBaseComponent campaignBase, Faction faction)
int m_iBaseEstablishingRadiusSq
void StopCheckingEstablishmentArea()
void CheckEstablishmentArea()
bool m_bIsRunningCheckEstablishmentArea
void OnDataLoaded()
float m_fProviderBuildingRadius
void OnHQCompositionSpawned(bool spawned)
void OnEntitySpawnedByProvider(int prefabID, SCR_EditableEntityComponent editableEntity, int playerId, SCR_CampaignBuildingProviderComponent provider)
void ~SCR_EstablishBaseTaskEntity()
ref map< SCR_CampaignBuildingCompositionComponent, float > m_mPlacedHQs
bool m_bPlayerInArea
void SCR_FactionManager(IEntitySource src, IEntity parent)
void SCR_GameModeCampaign(IEntitySource src, IEntity parent)
ScriptInvokerBase< ScriptInvokerVoidMethod > ScriptInvokerVoid
array< int > GetTaskAssigneePlayerIDs()
Definition SCR_Task.c:458
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
ref SCR_TaskData m_TaskData
Definition SCR_Task.c:110
SCR_ETaskState
Definition SCR_Task.c:3
bool IsTaskAssignedTo(SCR_TaskExecutor executor, out SCR_TaskExecutor match=null)
Definition SCR_Task.c:493
SCR_TaskSystem m_TaskSystem
proto external vector GetOrigin()
Definition Math.c:13
SCR_UIInfo GetInfo(IEntity owner=null)
int GetEntityLabels(out notnull array< EEditableEntityLabel > entityLabels)
static bool IsEditMode()
Definition Functions.c:1566
int GetBases(notnull out array< SCR_MilitaryBaseComponent > bases)
static SCR_MilitaryBaseSystem GetInstance()
static int GetLocalPlayerId()
Returns either a valid ID of local player or 0.
static IEntity GetLocalControlledEntity()
Definition Types.c:486
override void EOnInit(IEntity owner)