Arma Reforger Explorer  1.1.0.42
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
SCR_FactionRequestUIComponent.c
Go to the documentation of this file.
1 
6 {
7  [Attribute("FactionList", desc: "Container for available factions' buttons")]
8  protected string m_sFactionList;
9  protected Widget m_wFactionList;
10 
11  [Attribute("NoFactions")]
12  protected string m_sNoFactions;
13  protected Widget m_wNoFactions;
14 
15  [Attribute("{8A77FAE1C3B1F827}UI/layouts/Menus/DeployMenu/FactionButton.layout", desc: "Layout for faction button, has to have SCR_FactionButton attached to it.")]
16  protected ResourceName m_sFactionButton;
17 
18  protected SCR_PlayerFactionAffiliationComponent m_PlyFactionAffilComp;
19  protected SCR_FactionManager m_FactionManager;
20 
21  protected ref ScriptInvoker<SCR_PlayerFactionAffiliationComponent, int, bool> m_OnFactionRequested;
22 
23  //------------------------------------------------------------------------------------------------
24  override void HandlerAttached(Widget w)
25  {
26  super.HandlerAttached(w);
27 
28  m_wFactionList = w.FindAnyWidget(m_sFactionList);
29  if (!m_wFactionList)
30  return;
31 
32  m_wNoFactions = w.FindAnyWidget(m_sNoFactions);
33 
34  m_FactionManager = SCR_FactionManager.Cast(GetGame().GetFactionManager());
35  if (m_FactionManager)
36  m_FactionManager.GetOnPlayerFactionCountChanged().Insert(UpdateFactionButtons);
37 
38  PlayerController pc = GetGame().GetPlayerController();
39  if (pc)
41 
42  ShowAvailableFactions();
43  }
44 
46  void ShowAvailableFactions()
47  {
48  if (!m_wFactionList || !m_PlyFactionAffilComp)
49  return;
50 
51  // Clear the list
52  Widget child = m_wFactionList.GetChildren();
53  while (child)
54  {
55  Widget sibling = child.GetSibling();
56  if (SCR_FactionButton.Cast(child.FindHandler(SCR_FactionButton))) // Don't clear widgets that are not SCR_FactionButton
57  child.RemoveFromHierarchy();
58  child = sibling;
59  }
60 
61  m_aButtons.Clear();
62 
63  // fetch factions and create their button layouts
64  array<Faction> availableFactions = {};
65  int factionCount = m_FactionManager.GetFactionsList(availableFactions);
66 
67  Faction playerFaction = m_PlyFactionAffilComp.GetAffiliatedFaction();
68  bool canChangeFaction = SCR_BaseGameMode.Cast(GetGame().GetGameMode()).IsFactionChangeAllowed();
69 
70  int playableFactionCount = 0;
71 
72  for (int i = 0; i < factionCount; ++i)
73  {
74  SCR_Faction scriptedFaction = SCR_Faction.Cast(availableFactions[i]);
75  if (!scriptedFaction)
76  continue;
77 
78  scriptedFaction.GetOnFactionPlayableChanged().Insert(OnPlayableFactionChanged);
79 
80  Widget btnW = GetGame().GetWorkspace().CreateWidgets(m_sFactionButton, m_wFactionList);
81 
82  SCR_FactionButton btnComp;
83  if (m_bUseListFromButton)
84  btnComp = SCR_FactionButton.Cast(btnW.FindAnyWidget("Button").FindHandler(SCR_FactionButton));
85  else
86  btnComp = SCR_FactionButton.Cast(btnW.FindHandler(SCR_FactionButton));
87 
88  btnComp.SetFaction(scriptedFaction);
89  btnComp.m_OnClicked.Insert(OnButtonClicked);
90  btnComp.m_OnFocus.Insert(OnButtonFocused);
91  btnComp.m_OnMouseEnter.Insert(OnButtonFocused);
92  btnComp.m_OnMouseLeave.Insert(OnMouseLeft);
93 
94  if (!canChangeFaction && playerFaction)
95  {
96  btnComp.SetShouldUnlock(playerFaction == scriptedFaction);
97  btnComp.SetEnabled(playerFaction == scriptedFaction);
98  }
99 
100  btnComp.SetVisible(scriptedFaction.IsPlayable(), false);
101 
102  if (scriptedFaction.IsPlayable())
103  playableFactionCount++;
104 
105  m_aButtons.Insert(btnComp);
106  }
107 
108  if (m_wNoFactions)
109  m_wNoFactions.SetVisible(playableFactionCount == 0);
110  }
111 
113  void OnPlayerFactionAssigned(Faction assignedFaction)
114  {
115  bool canChangeFaction = SCR_BaseGameMode.Cast(GetGame().GetGameMode()).IsFactionChangeAllowed();
116 
117  foreach (SCR_DeployButtonBase btn : m_aButtons)
118  {
119  SCR_FactionButton factionBtn = SCR_FactionButton.Cast(btn);
120  if (factionBtn)
121  {
122  if (!canChangeFaction)
123  {
124  bool enabled = assignedFaction == factionBtn.GetFaction();
125  factionBtn.m_OnClicked.Remove(OnButtonClicked);
126  factionBtn.SetEnabled(enabled);
127  factionBtn.SetShouldUnlock(enabled);
128  }
129 
130  if (assignedFaction == factionBtn.GetFaction())
131  factionBtn.HideTooltip();
132  factionBtn.SetSelected(assignedFaction == factionBtn.GetFaction());
133  }
134  }
135  }
136 
138  protected void OnPlayableFactionChanged(SCR_Faction faction, bool playable)
139  {
140  int playableFactionCount = 0;
141  foreach (SCR_DeployButtonBase btn : m_aButtons)
142  {
143  SCR_FactionButton factionBtn = SCR_FactionButton.Cast(btn);
144  if (!factionBtn)
145  continue;
146  if (factionBtn.GetFaction() == faction)
147  factionBtn.SetVisible(playable, false);
148  if (factionBtn.GetFaction().IsPlayable())
149  playableFactionCount++;
150  }
151 
152  if (m_wNoFactions)
153  m_wNoFactions.SetVisible(playableFactionCount == 0);
154  }
155 
157  protected void UpdateFactionButtons(Faction faction, int newCount)
158  {
159  foreach (SCR_DeployButtonBase btn : m_aButtons)
160  {
161  SCR_FactionButton factionBtn = SCR_FactionButton.Cast(btn);
162  if (factionBtn)
163  factionBtn.UpdatePlayerCount();
164  }
165  }
166 
168  protected void OnButtonFocused(Widget w)
169  {
170  SCR_FactionButton factionBtn = SCR_FactionButton.Cast(w.FindHandler(SCR_FactionButton));
171  if (!factionBtn)
172  return;
173 
174  factionBtn.SetTooltipAvailable(m_PlyFactionAffilComp.GetAffiliatedFaction() != factionBtn.GetFaction());
175  m_OnButtonFocused.Invoke(factionBtn.GetFaction());
176  }
177 
179  protected void RequestPlayerFaction(SCR_FactionButton factionBtn)
180  {
181  if (m_PlyFactionAffilComp.GetAffiliatedFaction() == factionBtn.GetFaction())
182  {
183  GetOnFactionRequested().Invoke(m_PlyFactionAffilComp, m_FactionManager.GetFactionIndex(m_PlyFactionAffilComp.GetAffiliatedFaction()), true);
184  return;
185  }
186 
187  Lock(factionBtn);
188  Faction faction = factionBtn.GetFaction();
189  m_PlyFactionAffilComp.RequestFaction(faction);
190  }
191 
193  protected void OnButtonClicked(SCR_FactionButton factionBtn)
194  {
195  if (SCR_BaseGameMode.Cast(GetGame().GetGameMode()).IsFactionChangeAllowed())
196  {
197  RequestPlayerFaction(factionBtn);
198  }
199  else
200  {
201  int factionIndex = m_FactionManager.GetFactionIndex(factionBtn.GetFaction());
202  SCR_PersistentFactionDialog dialog = SCR_PersistentFactionDialog.CreatePersistentFactionDialog(factionIndex);
203  dialog.m_OnConfirm.Insert(OnFactionDialogConfirm);
204  }
205  }
206 
208  protected void OnFactionDialogConfirm(SCR_PersistentFactionDialog dialog)
209  {
210  SCR_FactionButton btn = SCR_FactionButton.Cast(GetFactionButton(dialog.GetRequestedFactionIndex()));
211  if (btn)
212  RequestPlayerFaction(btn);
213  }
214 
215  void RequestRandomFaction()
216  {
217  array<Faction> factions = {};
218  m_FactionManager.GetFactionsList(factions);
219  m_PlyFactionAffilComp.RequestFaction(factions.GetRandomElement());
220  }
221 
226  SCR_FactionButton GetFactionButton(int factionId)
227  {
228  Faction faction = m_FactionManager.GetFactionByIndex(factionId);
229  foreach (SCR_DeployButtonBase btn : m_aButtons)
230  {
231  SCR_FactionButton factionBtn = SCR_FactionButton.Cast(btn);
232  if (factionBtn && factionBtn.GetFaction() == faction)
233  return factionBtn;
234  }
235 
236  return null;
237  }
238 
239  ScriptInvoker GetOnFactionRequested()
240  {
241  if (!m_OnFactionRequested)
242  m_OnFactionRequested = new ScriptInvoker();
243 
244  return m_OnFactionRequested;
245  }
246 };
247 
248 //------------------------------------------------------------------------------------------------
250 {
251  [Attribute("FactionName")]
252  protected string m_sFactionName;
253  protected TextWidget m_wFactionName;
254 
255  [Attribute("PlayerCountText")]
256  protected string m_sPlayerCount;
257  protected TextWidget m_wPlayerCount;
258 
259  [Attribute("PlayerIcon")]
260  protected string m_sPlayerIcon;
261  protected Widget m_wPlayerIcon;
262 
263  [Attribute("Arrow")]
264  protected string m_sArrowIcon;
265  protected ImageWidget m_wArrowIcon;
266 
267  protected SCR_Faction m_Faction;
268  protected int m_iPlayerCount;
269 
270  //------------------------------------------------------------------------------------------------
271  override void HandlerAttached(Widget w)
272  {
273  super.HandlerAttached(w);
274 
275  m_wFactionName = TextWidget.Cast(w.FindAnyWidget(m_sFactionName));
276  m_wPlayerCount = TextWidget.Cast(w.FindAnyWidget(m_sPlayerCount));
277  m_wPlayerIcon = ImageWidget.Cast(w.FindAnyWidget(m_sPlayerIcon));
278  m_wArrowIcon = ImageWidget.Cast(w.FindAnyWidget(m_sArrowIcon));
279  }
280 
282  void SetFaction(SCR_Faction faction)
283  {
284  m_Faction = faction;
285 
286  SetFactionName(faction.GetFactionName());
287  SetImage(faction.GetFactionFlag());
288 
289  UpdatePlayerCount();
290  }
291 
293  SCR_Faction GetFaction()
294  {
295  return m_Faction;
296  }
297 
299  int GetPlayerCount()
300  {
301  return m_iPlayerCount;
302  }
303 
305  void UpdatePlayerCount()
306  {
307  SCR_Faction scrFaction = SCR_Faction.Cast(m_Faction);
308  if (scrFaction && m_wPlayerCount)
309  {
310  m_iPlayerCount = scrFaction.GetPlayerCount();
311  m_wPlayerCount.SetText(m_iPlayerCount.ToString());
312  }
313  }
314 
316  void SetFactionName(string name)
317  {
318  if (m_wFactionName)
319  m_wFactionName.SetText(name);
320  }
321 
323  override void SetSelected(bool selected)
324  {
325  super.SetSelected(selected);
326  if (!m_wArrowIcon)
327  return;
328 
329  if (selected)
330  m_wArrowIcon.SetRotation(90);
331  else
332  m_wArrowIcon.SetRotation(270);
333  }
334 };
SCR_BaseGameMode
Definition: SCR_BaseGameMode.c:137
SCR_PersistentFactionDialog
Definition: SCR_PersistentFactionDialog.c:1
SetImage
void SetImage(BackendImage image)
image can be null
Definition: SCR_BackendImageComponent.c:36
Lock
void Lock(Managed source, bool auth)
Definition: SCR_SpawnLockComponent.c:35
GetGame
ArmaReforgerScripted GetGame()
Definition: game.c:1424
desc
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
Definition: SCR_RespawnBriefingComponent.c:17
m_PlyFactionAffilComp
protected SCR_PlayerFactionAffiliationComponent m_PlyFactionAffilComp
Definition: SCR_DeployMenuBase.c:119
GetGameMode
SCR_BaseGameMode GetGameMode()
Definition: SCR_BaseGameModeComponent.c:15
SCR_DeployRequestUIBaseComponent
Definition: SCR_DeployRequestUIBaseComponent.c:2
m_FactionManager
protected SCR_FactionManager m_FactionManager
Definition: SCR_NotificationSenderComponent.c:28
Attribute
typedef Attribute
Post-process effect of scripted camera.
SCR_FactionButton
Definition: SCR_FactionRequestUIComponent.c:249
Faction
Definition: Faction.c:12
SCR_PlayerFactionAffiliationComponent
Definition: SCR_PlayerFactionAffiliationComponent.c:16
SCR_FactionRequestUIComponent
Definition: SCR_FactionRequestUIComponent.c:5
SCR_FactionManager
void SCR_FactionManager(IEntitySource src, IEntity parent)
Definition: SCR_FactionManager.c:461
m_Faction
Faction m_Faction
Definition: SCR_AITargetInfo.c:18
m_aButtons
protected ref array< ref SCR_BrowserTooltipButtonPresetData > m_aButtons
Definition: SCR_BrowserHoverTooltipComponent.c:9
SCR_Faction
Definition: SCR_Faction.c:6
SCR_DeployButtonBase
Definition: SCR_DeployRequestUIBaseComponent.c:141