Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_GameModeCleanSweep.c
Go to the documentation of this file.
2{
3}
4
5class SCR_GameModeCleanSweep : SCR_BaseGameMode
6{
7 [Attribute("6")]
8 protected int m_iMinAiGroups;
9
10 [Attribute("10")]
11 protected int m_iMaxAiGroups;
12
13 [Attribute("1.5")]
14 protected float m_fAiGroupsPerPlayer;
15
16 [Attribute("", UIWidgets.ResourceNamePicker, "What group type should spawn")]
17 protected ResourceName m_GroupType;
18
19 [Attribute(defvalue: "{EBD2A7DA0A3C6E17}UI/layouts/Menus/CleanSweep/CleanSweepAreaSelection.layout", desc: "Layout for area selection")]
20 protected ResourceName m_AreaSelectionLayout;
21
22 [Attribute("0")]
23 protected bool m_bSwapSides;
24
25 protected Widget m_wRoot;
28
29 protected ref array<IEntity> m_aEnemySoldiers = {};
30 protected ref array<SCR_AIGroup> m_aGroups;
31 protected ref array<SCR_SpawnPoint> m_aEnemySpawnPoints;
32 protected ref array<SCR_SpawnPoint> m_aPlayerSpawnPoints;
33 protected AIWaypoint m_AttackWP;
34
35 protected int m_iGameMasterID = -1;
36
37 [RplProp(onRplName: "OnAreaChanged")]
39
40 protected const int INVALID_AREA_INDEX = -1;
41 protected const string ENEMY_PRESENCE_ELIMINATED_TEXT = "Enemy presence eliminated!\nNew area is being selected.\nPlease wait.";
42
43 //------------------------------------------------------------------------------------------------
44 protected void OnAreaChanged()
45 {
47 m_wAreaSelectionWidget.RemoveFromHierarchy();
48
51 else
52 m_aEnemySpawnPoints.Clear();
53
56 else
58
59 if (m_RplComponent && m_RplComponent.IsProxy())
60 return;
61
62 // Spawn setup:
63 // Select random spawn point
64
65 array<SCR_CleanSweepArea> activeAreas = {};
66 int activeAreasCount = GetActiveAreas(activeAreas);
67 if (activeAreasCount < 1)
68 {
69 Print("CleanSweep has not enough active playable areas. GameMode will not function.", LogLevel.ERROR);
70 return;
71 }
72
73 if (!activeAreas.IsIndexValid(m_iAreaID))
74 return;
75
76 SCR_CleanSweepArea area = activeAreas[m_iAreaID];
77 if (!area)
78 return;
79
80 // Move waypoint to the area
81 AIWaypoint wp = AIWaypoint.Cast(GetWorld().FindEntityByName("WP1"));
82 if (wp)
83 wp.SetOrigin(area.GetOrigin());
84
85 vector centerPos = area.GetOrigin();
86 float rangeSq = area.m_Range * area.m_Range;
87 array<IEntity> entities = {};
88 array<SCR_SpawnPoint> spawnPoints = SCR_SpawnPoint.GetSpawnPoints();
89 GetWorld().GetActiveEntities(entities);
90
91 foreach (SCR_SpawnPoint spawnPoint : spawnPoints)
92 {
93 if (vector.DistanceSqXZ(centerPos, spawnPoint.GetOrigin()) < rangeSq)
94 {
95 FactionKey faction = spawnPoint.GetFactionKey();
96 if (faction == "USSR")
97 {
98 if (!m_bSwapSides)
99 m_aEnemySpawnPoints.Insert(spawnPoint);
100 else
101 m_aPlayerSpawnPoints.Insert(spawnPoint);
102 }
103 if (faction == "US")
104 {
105 if (!m_bSwapSides)
106 m_aPlayerSpawnPoints.Insert(spawnPoint);
107 else
108 m_aEnemySpawnPoints.Insert(spawnPoint);
109 }
110 }
111 }
112
113 foreach (IEntity entity : entities)
114 {
115 // Vehicle spawn component ??
116 SCR_VehicleSpawner vehicleSpawner = SCR_VehicleSpawner.Cast(entity.FindComponent(SCR_VehicleSpawner));
117 if (!vehicleSpawner)
118 continue;
119
120 if (vector.DistanceSqXZ(centerPos, entity.GetOrigin()) < rangeSq)
121 vehicleSpawner.PerformSpawn();
122 }
123
124 SpawnEnemies();
125 m_bAutoPlayerRespawn = true;
126
128 }
129
130 //------------------------------------------------------------------------------------------------
131 protected void RespawnPlayers()
132 {
133 array<int> players = {};
134 int count = GetGame().GetPlayerManager().GetPlayers(players);
135 PlayerController playerController;
136 SCR_CleanSweepNetworkComponent networkComponent;
137 foreach (int player : players)
138 {
139 playerController = GetGame().GetPlayerManager().GetPlayerController(player);
140 if (!playerController)
141 continue;
142
143 networkComponent = SCR_CleanSweepNetworkComponent.Cast(playerController.FindComponent(SCR_CleanSweepNetworkComponent));
144 if (!networkComponent)
145 continue;
146
147 networkComponent.CommitSuicide();
148 }
149 }
150
151 //------------------------------------------------------------------------------------------------
153 void SetSwapSides(bool swapSides)
154 {
155 m_bSwapSides = swapSides;
156 }
157
158 //------------------------------------------------------------------------------------------------
160 void SetArea(int targetAreaID)
161 {
162 m_iAreaID = targetAreaID; // check if index is valid?
164 Replication.BumpMe();
165
166 if (m_RplComponent && !m_RplComponent.IsProxy())
167 GetGame().GetCallqueue().CallLater(CheckActiveAreaState, 1, true);
168 }
169
170 //------------------------------------------------------------------------------------------------
171 protected void CheckActiveAreaState()
172 {
173 ChimeraCharacter character;
174 DamageManagerComponent damageManager;
175 for (int i = m_aEnemySoldiers.Count() -1; i >= 0; i--)
176 {
177 if (!m_aEnemySoldiers[i])
178 {
179 m_aEnemySoldiers.Remove(i);
180 }
181 else
182 {
183 character = ChimeraCharacter.Cast(m_aEnemySoldiers[i]);
184 if (!character)
185 {
186 m_aEnemySoldiers.Remove(i);
187 continue;
188 }
189
190 damageManager = character.GetDamageManager();
191 if (!damageManager)
192 return;
193
194 if (damageManager.GetState() != EDamageState.DESTROYED)
195 return;
196 }
197 }
198
199 if (m_RplComponent && !m_RplComponent.IsProxy())
200 {
201 ReplicatedShowHint(0, 5);
202
203 if (RplSession.Mode() != RplMode.Dedicated)
204 ShowHint(0, 5);
205
207 Replication.BumpMe();
208 GetGame().GetCallqueue().Remove(CheckActiveAreaState);
210 }
211 }
212
213 //------------------------------------------------------------------------------------------------
214 protected override void EOnFrame(IEntity owner, float timeSlice)
215 {
216 super.EOnFrame(owner, timeSlice);
217
219 GetGame().GetInputManager().ActivateContext("MenuContext");
220 }
221
222 //------------------------------------------------------------------------------------------------
223 protected void ReplicatedShowHint(int hintID, float showTime)
224 {
225 Rpc(RPC_ShowHint, hintID, showTime);
226 }
227
228 //------------------------------------------------------------------------------------------------
229 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
230 protected void RPC_ShowHint(int hintID, float time)
231 {
232 ShowHint(hintID, time);
233 }
234
235 //------------------------------------------------------------------------------------------------
236 protected void ShowHint(int hintID, float showTime)
237 {
238 if (!m_wText || !m_wRoot)
239 return;
240
241 switch (hintID)
242 {
243 case 0:
244 {
246 break;
247 }
248 }
249
251
252 GetGame().GetCallqueue().CallLater(this.HideHint, showTime * 1000);
253 }
254
255 //------------------------------------------------------------------------------------------------
256 protected void HideHint()
257 {
258 if (m_wRoot)
260 }
261
262 //------------------------------------------------------------------------------------------------
263 protected void SpawnEnemies()
264 {
265 if (m_RplComponent && m_RplComponent.IsProxy())
266 return;
267
268 if (m_aEnemySpawnPoints.IsEmpty())
269 return;
270
271 // Clean up groups
272 foreach (SCR_AIGroup group : m_aGroups)
273 {
274 delete group;
275 }
276
277 m_aGroups.Clear();
278 m_aEnemySoldiers.Clear();
279
280 ArmaReforgerScripted game = GetGame();
281 int enemyGroupsCount = Math.ClampInt(Math.Ceil(game.GetPlayerManager().GetPlayerCount() * m_fAiGroupsPerPlayer), m_iMinAiGroups, m_iMaxAiGroups);
282
283 RandomGenerator generator = new RandomGenerator();
284 SCR_SpawnPoint spawnPoint;
286 Resource res;
287 SCR_AIGroup newGrp;
288 array<AIAgent> agents;
289 for (int i; i < enemyGroupsCount; i++)
290 {
291 generator.SetSeed(Math.RandomInt(0, 100));
292
293 spawnPoint = m_aEnemySpawnPoints.GetRandomElement();
294 if (!spawnPoint)
295 return;
296
297 vector position = generator.GenerateRandomPointInRadius(0, 2, spawnPoint.GetOrigin());
298 position[1] = spawnPoint.GetOrigin()[1];
300 params.TransformMode = ETransformMode.WORLD;
301 params.Transform[3] = position;
302
303 res = Resource.Load(m_GroupType);
304 if (!res.IsValid())
305 {
306 Print("Invalid Prefab " + m_GroupType, LogLevel.WARNING);
307 continue;
308 }
309
310 newGrp = SCR_AIGroup.Cast(game.SpawnEntityPrefab(res, null, params));
311 if (!newGrp)
312 continue;
313
314 m_aGroups.Insert(newGrp);
315
316 agents = {};
317 newGrp.GetAgents(agents);
318 foreach (AIAgent agent : agents)
319 {
320 if (agent)
321 m_aEnemySoldiers.Insert(agent.GetControlledEntity());
322 }
323
324 if (m_AttackWP)
325 newGrp.AddWaypoint(m_AttackWP);
326 }
327 }
328
329 //------------------------------------------------------------------------------------------------
335 protected override void OnPlayerKilled(int playerId, IEntity playerEntity, IEntity killerEntity, notnull Instigator killer)
336 {
337 super.OnPlayerKilled(playerId, playerEntity, killerEntity, killer);
338 m_aEnemySoldiers.RemoveItemOrdered(playerEntity);
339 }
340
341 //------------------------------------------------------------------------------------------------
343 {
344 array<int> players = {};
345 int count = GetGame().GetPlayerManager().GetPlayers(players);
346 if (count < 1)
347 return vector.Zero;
348
349 vector center = vector.Zero;
350 int countedEntities;
351
352 IEntity controlledEntity;
353 foreach (int player : players)
354 {
355 controlledEntity = SCR_PossessingManagerComponent.GetPlayerMainEntity(player);
356 if (!controlledEntity)
357 continue;
358
359 center += controlledEntity.GetOrigin();
360
361 countedEntities++;
362 }
363
364 if (countedEntities != 0)
365 center /= countedEntities;
366
367 return center;
368 }
369
370 //------------------------------------------------------------------------------------------------
371 protected int GetActiveAreas(notnull array<SCR_CleanSweepArea> activeAreas)
372 {
373 array<SCR_CleanSweepArea> areas = SCR_CleanSweepArea.GetInstances();
374 if (!areas)
375 return 0;
376
377 int areasCount;
378 foreach (SCR_CleanSweepArea area : areas)
379 {
380 ++areasCount;
381 if (!area || !area.m_Active)
382 continue;
383
384 activeAreas.Insert(area);
385 }
386
387 return areasCount;
388 }
389
390 //------------------------------------------------------------------------------------------------
391 protected void InitializeServer()
392 {
393 m_AttackWP = AIWaypoint.Cast(GetWorld().FindEntityByName("WP1"));
394 m_aGroups = {};
397 }
398
399 //------------------------------------------------------------------------------------------------
400 protected PlayerController GetGameMaster()
401 {
402 PlayerController playerController = GetGame().GetPlayerManager().GetPlayerController(m_iGameMasterID);
403 if (!playerController)
404 return PickNewGameMaster();
405
406 return playerController;
407 }
408
409 //------------------------------------------------------------------------------------------------
410 protected PlayerController PickNewGameMaster(int exclude = -1)
411 {
412 PlayerController playerController;
413
414 array<int> players = {};
415 PlayerManager playerManager = GetGame().GetPlayerManager();
416 playerManager.GetPlayers(players);
417 foreach (int player : players)
418 {
419 if (player == exclude)
420 continue;
421
422 playerController = playerManager.GetPlayerController(player);
423 if (playerController)
424 {
425 m_iGameMasterID = player;
426 break;
427 }
428 }
429
430 return playerController;
431 }
432
433 //------------------------------------------------------------------------------------------------
435 {
436 PlayerController playerController = GetGameMaster();
437 if (!playerController)
438 return;
439
440 SCR_CleanSweepNetworkComponent networkComponent = SCR_CleanSweepNetworkComponent.Cast(playerController.FindComponent(SCR_CleanSweepNetworkComponent));
441 if (!networkComponent)
442 return;
443
444 networkComponent.ShowAreaSelectionScreen();
445 }
446
447 //------------------------------------------------------------------------------------------------
450 {
451 if (m_iAreaID != INVALID_AREA_INDEX || m_AreaSelectionLayout.GetPath() == string.Empty)
452 return;
453
455 m_wAreaSelectionWidget = GetGame().GetWorkspace().CreateWidgets(m_AreaSelectionLayout);
456
457 XComboBoxWidget selectionBox = XComboBoxWidget.Cast(m_wAreaSelectionWidget.FindAnyWidget("SelectionBox"));
458 if (!selectionBox)
459 return;
460
461 array<SCR_CleanSweepArea> activeAreas = {};
462 GetActiveAreas(activeAreas);
463
464 foreach (SCR_CleanSweepArea activeArea : activeAreas)
465 {
466 selectionBox.AddItem(activeArea.GetName());
467 }
468
469 selectionBox.SetCurrentItem(0);
470 }
471
472 //------------------------------------------------------------------------------------------------
473 protected override void OnPlayerRegistered(int playerId)
474 {
475 super.OnPlayerRegistered(playerId);
476 Replication.BumpMe();
478 return;
479
481 //GetGame().GetCallqueue().CallLater(ShowAreaSelectionToGameMaster, 10000, false);
482 }
483
484 //------------------------------------------------------------------------------------------------
485 protected override void OnPlayerDisconnected(int playerId, KickCauseCode cause, int timeout)
486 {
487 super.OnPlayerDisconnected(playerId, cause, timeout);
488
489 Replication.BumpMe();
490 if (m_iAreaID != INVALID_AREA_INDEX || m_iGameMasterID != playerId)
491 return;
492
495 }
496
497 //------------------------------------------------------------------------------------------------
498 protected override void EOnInit(IEntity owner)
499 {
500 super.EOnInit(owner);
501 m_bAutoPlayerRespawn = false;
502
503 ArmaReforgerScripted game = GetGame();
504 if (m_RplComponent && !m_RplComponent.IsProxy())
505 {
506 SCR_BaseGameMode gameMode = SCR_BaseGameMode.Cast(game.GetGameMode());
507 if (gameMode)
508 gameMode.GetOnPlayerRegistered().Insert(OnPlayerRegistered);
509 }
510
511 if (m_RplComponent && !m_RplComponent.IsProxy())
513
514 m_wRoot = game.GetWorkspace().CreateWidgets("{DE9F713BE2C5D190}UI/layouts/HUD/HintFrame.layout");
515 if (!m_wRoot)
516 {
517 Print("Cannot create hint layout", LogLevel.ERROR);
518 return;
519 }
520
521 m_wText = TextWidget.Cast(m_wRoot.FindAnyWidget("MessageText"));
522 TextWidget title = TextWidget.Cast(m_wRoot.FindAnyWidget("TitleText"));
523 if (title)
524 title.SetText("CLEAN SWEEP");
525
526 m_wRoot.SetOpacity(0);
527 }
528}
ref DSGameConfig game
Definition DSConfig.c:81
ArmaReforgerScripted GetGame()
Definition game.c:1398
RplMode
Mode of replication.
Definition RplMode.c:9
SCR_CacheNoteComponentClass ScriptComponentClass RplProp()] protected ref array< string > m_aLines
RplComponent m_RplComponent
void SCR_CleanSweepArea(IEntitySource src, IEntity parent)
void SCR_CleanSweepNetworkComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
vector position
int m_iGameMasterID
void OnAreaChanged()
ref array< SCR_SpawnPoint > m_aPlayerSpawnPoints
PlayerController PickNewGameMaster(int exclude=-1)
ref array< IEntity > m_aEnemySoldiers
Widget m_wAreaSelectionWidget
void SetArea(int targetAreaID)
const string ENEMY_PRESENCE_ELIMINATED_TEXT
void RespawnPlayers()
void SpawnEnemies()
void ShowAreaSelectionUI()
Used by SCR_CleanSweepNetworkComponent.
vector GetPlayersCenter()
Widget m_wRoot
void CheckActiveAreaState()
ref array< SCR_AIGroup > m_aGroups
const int INVALID_AREA_INDEX
PlayerController GetGameMaster()
bool m_bSwapSides
void ReplicatedShowHint(int hintID, float showTime)
void SetSwapSides(bool swapSides)
AIWaypoint m_AttackWP
void RPC_ShowHint(int hintID, float time)
int m_iAreaID
void ShowAreaSelectionToGameMaster()
ref array< SCR_SpawnPoint > m_aEnemySpawnPoints
void InitializeServer()
int GetActiveAreas(notnull array< SCR_CleanSweepArea > activeAreas)
void HideHint()
TextWidget m_wText
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
static WidgetAnimationOpacity Opacity(Widget widget, float targetValue, float speed, bool toggleVisibility=false)
proto external vector GetOrigin()
Definition Math.c:13
Main replication API.
Definition Replication.c:14
Object holding reference to resource. In destructor release the resource.
Definition Resource.c:25
override void OnPlayerRegistered(int playerId)
override void EOnInit(IEntity owner)
ScriptInvokerBase< SCR_BaseGameMode_PlayerId > GetOnPlayerRegistered()
override void OnPlayerDisconnected(int playerId, KickCauseCode cause, int timeout)
override void EOnFrame(IEntity owner, float timeSlice)
override void OnPlayerKilled(int playerId, IEntity playerEntity, IEntity killerEntity, notnull Instigator killer)
Default player kill behaviour. Called when a player is killed (and HandlePlayerKilled returns true).
Spawn point entity defines positions on which players can possibly spawn.
void EntitySpawnParams()
Definition gameLib.c:130
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
SCR_FieldOfViewSettings Attribute
override void OnPlayerRegistered(int playerId)
EDamageState
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
Definition EnNetwork.c:95
RplRcver
Definition RplRcver.c:59
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.
Definition RplChannel.c:14