Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CampaignDefendTask.c
Go to the documentation of this file.
1//------------------------------------------------------------------------------------------------
2//class SCR_CampaignDefendTaskClass: SCR_CampaignBaseTaskClass
3//{
4//};
5
6//------------------------------------------------------------------------------------------------
7//class SCR_CampaignDefendTask : SCR_CampaignBaseTask
8//{
9// static const float DEFEND_TASK_DEFAULT_MIN_ALLY_DISTANCE = 300;
10// static const float DEFEND_TASK_DEFAULT_MAX_ALLY_DISTANCE = 400;
11// static const float DEFEND_TASK_DEFAULT_MIN_ENEMY_DISTANCE = 300;
12// static const float DEFEND_TASK_DEFAULT_MAX_ENEMY_DISTANCE = 400;
13//
14// //**************************//
15// //PROTECTED STATIC VARIABLES//
16// //**************************//
17// protected static SCR_CampaignMilitaryBaseComponent s_ClosestBase; //This is the closest base to the local player's character (only updated when task list is open)
18//
19// //*********************//
20// //PUBLIC STATIC METHODS//
21// //*********************//
22//
23// //------------------------------------------------------------------------------------------------
24// static float GetMinAllyDistance()
25// {
26// if (!GetTaskManager())
27// return DEFEND_TASK_DEFAULT_MIN_ALLY_DISTANCE;
28//
29// SCR_CampaignDefendTaskSupportEntity supportEntity = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
30// if (supportEntity)
31// return supportEntity.GetMinAllyDistance();
32//
33// return DEFEND_TASK_DEFAULT_MIN_ALLY_DISTANCE;
34// }
35//
36// //------------------------------------------------------------------------------------------------
37// static float GetMaxAllyDistance()
38// {
39// if (!GetTaskManager())
40// return DEFEND_TASK_DEFAULT_MAX_ALLY_DISTANCE;
41//
42// SCR_CampaignDefendTaskSupportEntity supportEntity = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
43// if (supportEntity)
44// return supportEntity.GetMaxAllyDistance();
45//
46// return DEFEND_TASK_DEFAULT_MAX_ALLY_DISTANCE;
47// }
48//
49// //------------------------------------------------------------------------------------------------
50// static float GetMinEnemyDistance()
51// {
52// if (!GetTaskManager())
53// return DEFEND_TASK_DEFAULT_MIN_ENEMY_DISTANCE;
54//
55// SCR_CampaignDefendTaskSupportEntity supportEntity = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
56// if (supportEntity)
57// return supportEntity.GetMinEnemyDistance();
58//
59// return DEFEND_TASK_DEFAULT_MIN_ENEMY_DISTANCE;
60// }
61//
62// //------------------------------------------------------------------------------------------------
63// static float GetMaxEnemyDistance()
64// {
65// if (!GetTaskManager())
66// return DEFEND_TASK_DEFAULT_MAX_ENEMY_DISTANCE;
67//
68// SCR_CampaignDefendTaskSupportEntity supportEntity = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
69// if (supportEntity)
70// return supportEntity.GetMaxEnemyDistance();
71//
72// return DEFEND_TASK_DEFAULT_MAX_ENEMY_DISTANCE;
73// }
74//
75// //------------------------------------------------------------------------------------------------
76// static SCR_CampaignDefendTask FindDefendTask(SCR_CampaignMilitaryBaseComponent targetBase, SCR_CampaignFaction targetFaction)
77// {
78// array<SCR_BaseTask> tasks = new array<SCR_BaseTask>();
79// GetTaskManager().GetTasks(tasks);
80//
81// if (!tasks)
82// return null;
83//
84// for (int i = tasks.Count() - 1; i >= 0; i--)
85// {
86// SCR_CampaignDefendTask defendTask = SCR_CampaignDefendTask.Cast(tasks[i]);
87// if (!defendTask)
88// continue;
89//
90// if (defendTask.GetTargetBase() == targetBase && defendTask.GetTargetFaction() == targetFaction)
91// return defendTask;
92// }
93//
94// return null;
95// }
96//
97// //------------------------------------------------------------------------------------------------
98// static SCR_CampaignMilitaryBaseComponent FindClosestFriendlyBase(notnull IEntity controlledEntity, notnull Faction faction)
99// {
100//
101// array<SCR_MilitaryBaseComponent> bases = {};
102// SCR_MilitaryBaseSystem.GetInstance().GetBases(bases);
103//
104// if (!bases)
105// return null;
106//
107// int closestBaseIndex = -1;
108// float closestBaseDistance = float.MAX;
109// float minAllyDistanceSq = Math.Pow(GetMinAllyDistance(), 2);
110// vector controlledEntityOrigin = controlledEntity.GetOrigin();
111//
112// for (int i = bases.Count() - 1; i >= 0; i--)
113// {
114// SCR_CampaignMilitaryBaseComponent campaignBase = SCR_CampaignMilitaryBaseComponent.Cast(bases[i]);
115//
116// if (!campaignBase)
117// continue;
118//
119// if (!campaignBase.IsInitialized())
120// continue;
121//
122// if (campaignBase.GetFaction() != faction)
123// continue;
124//
125// float distance = vector.DistanceSq(campaignBase.GetOwner().GetOrigin(), controlledEntityOrigin);
126//
127// if (distance < minAllyDistanceSq && distance < closestBaseDistance)
128// {
129// closestBaseDistance = distance;
130// closestBaseIndex = i;
131// }
132// }
133//
134// if (closestBaseIndex != -1)
135// return SCR_CampaignMilitaryBaseComponent.Cast(bases[closestBaseIndex]);
136// return null;
137// }
138//
139// //------------------------------------------------------------------------------------------------
140// static bool CheckDefendRequestConditions(notnull SCR_PlayerController playerController, out SCR_CampaignMilitaryBaseComponent closestBase)
141// {
142// IEntity locallyControlledEntity = playerController.GetMainEntity();
143//
144// if (!locallyControlledEntity)
145// return false;
146//
147// FactionAffiliationComponent factionAffiliationComponent = FactionAffiliationComponent.Cast(locallyControlledEntity.FindComponent(FactionAffiliationComponent));
148// if (!factionAffiliationComponent)
149// return false;
150//
151// SCR_CampaignFaction faction = SCR_CampaignFaction.Cast(factionAffiliationComponent.GetAffiliatedFaction());
152// if (!faction)
153// return false;
154//
155// closestBase = FindClosestFriendlyBase(locallyControlledEntity, faction);
156//
157// if (!closestBase)
158// return false;
159// else
160// {
161// if (FindDefendTask(closestBase, faction))
162// return false;
163//
164// if (!FindEnemyPresence(closestBase, faction))
165// return false;
166//
167// return true;
168// }
169// }
170//
171// //------------------------------------------------------------------------------------------------
172// //! Set initialCheck to false if the task is already created for this base
173// static bool FindEnemyPresence(notnull SCR_CampaignMilitaryBaseComponent base, notnull SCR_CampaignFaction alliedFaction, bool initialCheck = true)
174// {
175// SCR_CampaignFaction enemyFaction = SCR_CampaignFactionManager.Cast(GetGame().GetFactionManager()).GetEnemyFaction(alliedFaction);
176// if (!enemyFaction)
177// return false;
178//
179// SCR_CampaignDefendTaskSupportEntity supportEntity = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
180// if (!supportEntity)
181// return false;
182//
183// float distanceSq;
184// if (initialCheck)
185// distanceSq = supportEntity.GetMinEnemyDistance();
186// else
187// distanceSq = supportEntity.GetMaxEnemyDistance();
188//
189// distanceSq *= distanceSq;
190//
191// array<SCR_ChimeraCharacter> enemyCharacters = supportEntity.GetCharactersByFaction(enemyFaction);
192// if (!enemyCharacters)
193// return false;
194//
195// vector baseOrigin = base.GetOwner().GetOrigin();
196// for (int i = enemyCharacters.Count() - 1; i >= 0; i--)
197// {
198// if (vector.DistanceSq(baseOrigin, enemyCharacters[i].GetOrigin()) < distanceSq)
199// return true;
200// }
201//
202// return false;
203// }
204//
205// //------------------------------------------------------------------------------------------------
206// static bool IsCharacterInAnyDefendTaskRange(SCR_ChimeraCharacter character)
207// {
208// array<SCR_BaseTask> tasks = new array<SCR_BaseTask>();
209// GetTaskManager().GetTasks(tasks);
210//
211// if (!tasks)
212// return false;
213//
214// SCR_CampaignDefendTaskSupportEntity supportEntity = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
215// if (!supportEntity)
216// return false;
217//
218// for (int i = tasks.Count() - 1; i >= 0; i--)
219// {
220// SCR_CampaignDefendTask defendTask = SCR_CampaignDefendTask.Cast(tasks[i]);
221// if (!defendTask)
222// continue;
223//
224// if (defendTask.IsCharacterInDefendTaskRange(character, supportEntity))
225// return true;
226// }
227//
228// return false;
229// }
230//
231// //*********************************//
232// //PROTECTED OVERRIDE MEMBER METHODS//
233// //*********************************//
234//
235// //------------------------------------------------------------------------------------------------
236// protected override void UpdateMapInfo()
237// {
238// //Insert task icon into base's map UI
239// //m_TargetBase cannot be null here
240// }
241//
242// //------------------------------------------------------------------------------------------------
243// //! Shows a message about this task being available again
244// protected override void ShowAvailableTask(bool afterAssigneeRemoved = false)
245// {
246// SCR_ECannotAssignReasons reason;
247// if (CanBeAssigned(reason))
248// {
249// SCR_GameModeCampaign campaign = SCR_GameModeCampaign.GetInstance();
250// if (campaign)
251// {
252// string text = TASK_AVAILABLE_TEXT + " " + GetTitle();
253// string baseName;
254//
255// if (m_TargetBase)
256// baseName = m_TargetBase.GetBaseNameUpperCase();
257//
258// SCR_PopUpNotification.GetInstance().PopupMsg(text, prio: SCR_ECampaignPopupPriority.TASK_AVAILABLE, param1: baseName, text2: TASK_HINT_TEXT, text2param1: SCR_PopUpNotification.TASKS_KEY_IMAGE_FORMAT);
259// }
260// }
261// }
262//
263// //------------------------------------------------------------------------------------------------
264// override protected void ShowTaskProgress(bool showMsg = true)
265// {
266// SCR_GameModeCampaign campaign = SCR_GameModeCampaign.GetInstance();
267// if (campaign && showMsg)
268// {
269// string baseName;
270//
271// if (m_TargetBase)
272// baseName = m_TargetBase.GetBaseNameUpperCase();
273//
274// SCR_PopUpNotification.GetInstance().PopupMsg(TASK_PROGRESS_TEXT + " " + GetTitle() + " " + TASK_AMOUNT_COMPLETED_TEXT, prio: SCR_ECampaignPopupPriority.TASK_PROGRESS, param1: baseName);
275// }
276// }
277//
278// //******************************//
279// //PUBLIC OVERRIDE MEMBER METHODS//
280// //******************************//
281//
282// //------------------------------------------------------------------------------------------------
283// override void SetDescriptionWidgetText(notnull TextWidget textWidget, string taskText)
284// {
285// string baseName;
286//
287// if (m_TargetBase)
288// baseName = m_TargetBase.GetBaseName();
289//
290// textWidget.SetTextFormat(taskText, baseName);
291// }
292//
293// //------------------------------------------------------------------------------------------------
294// override void Finish(bool showMsg = true)
295// {
296// showMsg = SCR_FactionManager.SGetLocalPlayerFaction() == m_TargetFaction;
297// super.Finish(showMsg);
298//
299// if (!m_TargetBase)
300// return;
301//
302// SCR_GameModeCampaign campaign = SCR_GameModeCampaign.GetInstance();
303// if (!campaign)
304// return;
305//
306// if (showMsg)
307// {
308// SCR_PopUpNotification.GetInstance().PopupMsg(TASK_COMPLETED_TEXT + " " + GetTitle(), prio: SCR_ECampaignPopupPriority.TASK_DONE, param1: m_TargetBase.GetBaseNameUpperCase(), sound: SCR_SoundEvent.TASK_SUCCEED, text2: SCR_BaseTask.TASK_HINT_TEXT, text2param1: SCR_PopUpNotification.TASKS_KEY_IMAGE_FORMAT);
309// }
310//
311// SCR_XPHandlerComponent comp = SCR_XPHandlerComponent.Cast(GetGame().GetGameMode().FindComponent(SCR_XPHandlerComponent));
312//
313// if (!comp)
314// return;
315//
316// // Reward XP for reconfiguring a relay
317// if (!GetTaskManager().IsProxy())
318// {
319// SCR_CampaignDefendTaskSupportEntity supportClass = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
320// if (!supportClass)
321// return;
322//
323// array<SCR_ChimeraCharacter> characters = supportClass.GetCharactersByFaction(SCR_CampaignFaction.Cast(GetTargetFaction()));
324// if (!characters)
325// return;
326//
327// for (int i = characters.Count() - 1; i >= 0; i--)
328// {
329// if (IsCharacterInDefendTaskRange(characters[i]))
330// comp.AwardXP(GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(characters[i]), SCR_EXPRewards.TASK_DEFEND, 1.0);
331// }
332// };
333// }
334//
335// //------------------------------------------------------------------------------------------------
336// //! Fails the task.
337// override void Fail(bool showMsg = true)
338// {
339// showMsg = SCR_FactionManager.SGetLocalPlayerFaction() == m_TargetFaction;
340// super.Fail(showMsg);
341//
342// if (!m_TargetBase)
343// return;
344//
345// SCR_GameModeCampaign campaign = SCR_GameModeCampaign.GetInstance();
346// if (campaign && showMsg)
347// {
348// SCR_PopUpNotification.GetInstance().PopupMsg(TASK_FAILED_TEXT + " " + GetTitle(), prio: SCR_ECampaignPopupPriority.TASK_DONE, param1: m_TargetBase.GetBaseNameUpperCase(), sound: SCR_SoundEvent.TASK_FAILED);
349// }
350// }
351//
352// //*********************//
353// //PUBLIC MEMBER METHODS//
354// //*********************//
355//
356// //------------------------------------------------------------------------------------------------
357// bool IsCharacterInDefendTaskRange(notnull SCR_ChimeraCharacter character, SCR_CampaignDefendTaskSupportEntity supportClass = null)
358// {
359// if (!supportClass)
360// {
361// supportClass = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
362// if (!supportClass)
363// return false;
364// }
365//
366// float maxDistanceSq;
367// // Is ally, use ally distance
368// if (character.GetFaction() == GetTargetFaction())
369// maxDistanceSq = supportClass.GetMaxAllyDistance();
370// else
371// maxDistanceSq = supportClass.GetMaxEnemyDistance();
372//
373// maxDistanceSq *= maxDistanceSq;
374//
375// float distanceSq = vector.DistanceSq(character.GetOrigin(), GetTargetBase().GetOwner().GetOrigin());
376//
377// return (distanceSq < maxDistanceSq);
378// }
379//
380// //***************************//
381// //PUBLIC MEMBER EVENT METHODS//
382// //***************************//
383//
384// //------------------------------------------------------------------------------------------------
385// void PeriodicalCheck()
386// {
387// SCR_CampaignFaction campaignFaction = SCR_CampaignFaction.Cast(m_TargetFaction);
388// if (!m_TargetBase || !campaignFaction)
389// return;
390//
391// if (!GetTaskManager())
392// return;
393//
394// SCR_BaseTaskSupportEntity supportEntity = GetTaskManager().FindSupportEntity(SCR_BaseTaskSupportEntity);
395// if (!supportEntity)
396// return;
397//
398// // Enemy presence not found == success
399// if (!FindEnemyPresence(m_TargetBase, campaignFaction, false))
400// supportEntity.FinishTask(this);
401// }
402//
403// //------------------------------------------------------------------------------------------------
404// void OnCharacterDeath(SCR_ChimeraCharacter character)
405// {
406// // Enemy died in range of this tasks target base, let's check if the town is safe
407// if (character.GetFaction() != GetTargetFaction() && IsCharacterInDefendTaskRange(character))
408// PeriodicalCheck();
409// }
410//
411// //------------------------------------------------------------------------------------------------
412// //! An event called when a base has been captured.
413// void OnBaseCaptured(SCR_MilitaryBaseComponent base, Faction faction)
414// {
415// if (!base || base != m_TargetBase || !GetTaskManager())
416// return;
417//
418// if (base.GetFaction() == m_TargetFaction)
419// return;
420//
421// SCR_BaseTaskSupportEntity supportEntity = GetTaskManager().FindSupportEntity(SCR_BaseTaskSupportEntity);
422// if (!supportEntity)
423// return;
424//
425// supportEntity.FailTask(this);
426// }
427//
428// //------------------------------------------------------------------------------------------------
429// override string GetMapDescriptorText()
430// {
431// return GetTaskListTaskText();
432// }
433//
434// //------------------------------------------------------------------------------------------------
435// void SCR_CampaignDefendTask(IEntitySource src, IEntity parent)
436// {
437// if (SCR_Global.IsEditMode(this))
438// return;
439//
440// if (GetTaskManager().IsProxy())
441// return;
442//
443// if (SCR_BaseTaskManager.s_OnPeriodicalCheck60Second)
444// SCR_BaseTaskManager.s_OnPeriodicalCheck60Second.Insert(PeriodicalCheck);
445//
446// SCR_MilitaryBaseSystem.GetInstance().GetOnBaseFactionChanged().Insert(OnBaseCaptured);
447//
448// SCR_CampaignDefendTaskSupportEntity supportClass = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
449// if (supportClass)
450// supportClass.GetOnCharacterDeath().Insert(OnCharacterDeath);
451// }
452//
453// //------------------------------------------------------------------------------------------------
454// void ~SCR_CampaignDefendTask(string description)
455// {
456// if (SCR_Global.IsEditMode(this) || !GetGame().GetGameMode())
457// return;
458//
459// if (GetTaskManager().IsProxy())
460// return;
461//
462// if (SCR_BaseTaskManager.s_OnPeriodicalCheck60Second)
463// SCR_BaseTaskManager.s_OnPeriodicalCheck60Second.Remove(PeriodicalCheck);
464//
465// SCR_MilitaryBaseSystem baseManager = SCR_MilitaryBaseSystem.GetInstance();
466//
467// if (baseManager)
468// baseManager.GetOnBaseFactionChanged().Remove(OnBaseCaptured);
469//
470// SCR_CampaignDefendTaskSupportEntity supportClass = SCR_CampaignDefendTaskSupportEntity.Cast(GetTaskManager().FindSupportEntity(SCR_CampaignDefendTaskSupportEntity));
471// if (supportClass)
472// supportClass.GetOnCharacterDeath().Remove(OnCharacterDeath);
473// }
474//};