Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_DataCollectorAchievementsModule.c
Go to the documentation of this file.
3{
4 protected const FactionKey FACTION_CIVILIAN = "CIV";
5 protected const float DEADEYE_RANGE = 300;
6 protected const float DEADEYE_RANGE_SQ = DEADEYE_RANGE * DEADEYE_RANGE;
7 protected const int DEADEYE_KILL_COUNT = 10;
8 protected const int NIGHT_STALKER_KILL_COUNT = 5;
9 protected const int LAST_ONE_STANDING_KILL_COUNT = 10;
10
11 protected ref map<int, int> m_mDeadeyeKillCounter = new map<int, int>();// <playerID, counter>
12 protected ref map<int, int> m_mLastOneStandingKillCounter = new map<int, int>();// <playerID, counter>
13 protected ref map<int, int> m_mNightStalkerKillCounter = new map<int, int>();// <playerID, counter>
14
17
18 //------------------------------------------------------------------------------------------------
19 protected override void InitModule()
20 {
21 // Achievement COMBAT_HYGIENE
23
24 BaseGameMode gameMode = GetGame().GetGameMode();
25 if (!gameMode)
26 return;
27
28 RplComponent rplComp = RplComponent.Cast(gameMode.FindComponent(RplComponent));
29 if (rplComp.IsMaster())
30 {
31 m_Conflict = SCR_GameModeCampaign.Cast(gameMode);
32
33 // Invoke thhose only as authority
34 // Achievement NUTCRACKER
35 SCR_VehicleDamageManagerComponent.GetOnVehicleDestroyed().Insert(VehicleDestroyed);
36 // Achievement TRUCKER_JOE
38 // Achievements HELPING_HAND, BATTLEFIELD_ANGEL (Support stations)
40 if (supportStationManager)
41 {
43 }
44
45 // allowed only in conflict mode
46 if (m_Conflict)
47 {
48 // Achievement RESCUE_TECHNICIAN
49 SCR_RepairSupportStationComponent.GetOnFireExtinguished().Insert(OnFireExtinguished);
50
51 // Achievement CHANGING_CHANNELS
53
54 // Achievement NIGHT_STALKER
55 ChimeraWorld world = GetGame().GetWorld();
56 if (world)
57 m_TimeManager = world.GetTimeAndWeatherManager();
58
59 // Achievement REQUISTIONED
61 }
62 }
63
64 // Achievement MAJOR_PROMOTION
65 SCR_CharacterRankComponent.s_OnRankChanged.Insert(RankedUp);
66
67 // Achievement MINED_OUT
68 SCR_MineInventoryItemComponent.GetOnMinePlaced().Insert(MinePlaced);
69
70 // Achievement IVORY_TICKLER || PIPING_UP
72 }
73
74 //------------------------------------------------------------------------------------------------
75 protected override void AddInvokers(IEntity player)
76 {
77 // Achievement HELPING_HAND || BATTLEFIELD_ANGEL
78 SCR_ChimeraCharacter chimeraPlayer = SCR_ChimeraCharacter.Cast(player);
79 if (!chimeraPlayer)
80 return;
81
82 SCR_CharacterControllerComponent characterController = SCR_CharacterControllerComponent.Cast(chimeraPlayer.GetCharacterController());
83 if (!characterController)
84 return;
85
86 characterController.m_OnItemUseEndedInvoker.Insert(OnItemUsed);
87 }
88
89 //------------------------------------------------------------------------------------------------
90 protected override void RemoveInvokers(IEntity player)
91 {
92 SCR_ChimeraCharacter chimeraPlayer = SCR_ChimeraCharacter.Cast(player);
93 if (!chimeraPlayer)
94 return;
95
96 SCR_CharacterControllerComponent characterController = SCR_CharacterControllerComponent.Cast(chimeraPlayer.GetCharacterController());
97 if (!characterController)
98 return;
99
100 characterController.m_OnItemUseEndedInvoker.Remove(OnItemUsed);
101 }
102
103 //------------------------------------------------------------------------------------------------
104 //Removing the invokers that do not belong to an entity
106 {
108 SCR_VehicleDamageManagerComponent.GetOnVehicleDestroyed().Remove(VehicleDestroyed);
109 SCR_CharacterRankComponent.s_OnRankChanged.Remove(RankedUp);
110 SCR_MineInventoryItemComponent.GetOnMinePlaced().Remove(MinePlaced);
113
115 if (supportStationManager)
116 {
118 }
119
121 SCR_RepairSupportStationComponent.GetOnFireExtinguished().Remove(OnFireExtinguished);
123 }
124
125 //------------------------------------------------------------------------------------------------
126 override void OnPlayerKilled(int playerId, IEntity playerEntity, IEntity killerEntity, notnull Instigator instigator, notnull SCR_InstigatorContextData instigatorContextData)
127 {
128 // Only players are counted towards stats & achievements
129 if (instigator.GetInstigatorType() != InstigatorType.INSTIGATOR_PLAYER)
130 return;
131
132 const int killerId = instigator.GetInstigatorPlayerID();
133
134 // zeroing counter for LAST_ONE_STANDING Achievement
135 m_mLastOneStandingKillCounter.Set(playerId, 0);
136
137 //~ Not a player kill so ignore (Like suicide)
138 if (!instigatorContextData.HasAnyVictimKillerRelation(SCR_ECharacterDeathStatusRelations.KILLED_BY_ENEMY_PLAYER | SCR_ECharacterDeathStatusRelations.KILLED_BY_FRIENDLY_PLAYER))
139 return;
140
141 // Handle achievement statistic PLAYER_KILLED (achievement TRUE_GRIT)
142 // Note: PLAYER_KILLED is counted even for friendlies - oopsies makes fun
143 IncrementAchievementProgress(playerId, AchievementStatId.PLAYER_KILLED);
144
145 // Teamkills don't count
146 if (instigatorContextData.HasAnyVictimKillerRelation(SCR_ECharacterDeathStatusRelations.KILLED_BY_FRIENDLY_PLAYER))
147 return;
148
149 // Increment stat for the killer
150 IncrementAchievementProgress(killerId, AchievementStatId.ENEMIES_NEUTRALIZED);
151
152 // allowed only in conflict mode
153 if (m_Conflict)
154 {
155 // Increment counter for LAST_ONE_STANDING Achievement
156 int lastOneStandingKillCount = m_mLastOneStandingKillCounter.Get(killerId) + 1;
157 if (lastOneStandingKillCount >= LAST_ONE_STANDING_KILL_COUNT)
158 {
159 Print("Player with id " + killerId + " Unlocked - Last one standing", LogLevel.DEBUG);
160 UnlockAchievement(killerId, AchievementId.LAST_ONE_STANDING);
161 }
162 m_mLastOneStandingKillCounter.Set(killerId, lastOneStandingKillCount);
163
164 // Increment counter for NIGHT_STALKER Achievement
165 if (m_TimeManager && m_TimeManager.IsNightHour(m_TimeManager.GetTimeOfTheDay()))
166 {
167 int nightStalkerKillCount = m_mNightStalkerKillCounter.Get(killerId) + 1;
168 if (nightStalkerKillCount >= NIGHT_STALKER_KILL_COUNT)
169 {
170 Print("Player with id " + killerId + " Unlocked - Night stalker", LogLevel.DEBUG);
171 UnlockAchievement(killerId, AchievementId.NIGHT_STALKER);
172 }
173 m_mNightStalkerKillCounter.Set(killerId, nightStalkerKillCount);
174 }
175
176 if (!playerEntity || !killerEntity)
177 return;
178
179 // Increment counter for DEADEYE Achievement
180 if (vector.DistanceSq(playerEntity.GetOrigin(), killerEntity.GetOrigin()) >= DEADEYE_RANGE_SQ)
181 {
182 int count = m_mDeadeyeKillCounter.Get(killerId) + 1;
183 if (count >= DEADEYE_KILL_COUNT)
184 {
185 Print("Player with id " + killerId + " Unlocked - DEADEYE", LogLevel.DEBUG);
186 UnlockAchievement(killerId, AchievementId.DEADEYE);
187 }
188
189 m_mDeadeyeKillCounter.Set(killerId, count);
190 }
191 }
192 }
193
194 //------------------------------------------------------------------------------------------------
195 override void OnGameModeEnd()
196 {
197 array<int> players = {};
198 GetGame().GetPlayerManager().GetPlayers(players);
199
200 SCR_GameModeCombatOpsManager combatOps = SCR_GameModeCombatOpsManager.Cast(GetGame().GetGameMode().FindComponent(SCR_GameModeCombatOpsManager));
202
203 if (!combatOps && !conflict)
204 return;
205
206 SCR_TaskSystem taskSystem = SCR_TaskSystem.GetInstance();
207 if (!taskSystem)
208 return;
209
210 array<SCR_Task> activeTasks = {};
211 array<SCR_Task> finishedTasks = {};
212 taskSystem.GetTasksByState(activeTasks, SCR_ETaskState.CREATED);
213 taskSystem.GetTasksByState(finishedTasks, SCR_ETaskState.COMPLETED);
214
215 if (combatOps)
216 {
217 /* Achievement CLEAN_SWEEP || PAPER_PUSHER */
218
219 bool foundIntel, cleanSweep;
220 foreach (SCR_Task task : finishedTasks)
221 {
222 if (!task)
223 continue;
224
225 if (task.GetTaskName().Contains("Intel"))
226 {
227 foundIntel = true;
228 break;
229 }
230 }
231
232 if (activeTasks.IsEmpty()) // all tasks finished
233 cleanSweep = true;
234
235 if (finishedTasks.Count() > activeTasks.Count()) // mission successful
236 {
237 foreach(int player: players)
238 {
239 if (cleanSweep)
240 CleanSweepCombatOps(player);
241
242 if (foundIntel)
243 SecureIntelCombatOps(player);
244 }
245 }
246 else // mission lost
247 {
248 foreach (SCR_Task task : activeTasks)
249 {
250 if (!task || task.GetTaskState() != SCR_ETaskState.COMPLETED)
251 continue;
252
253 if (task.GetTaskName().Contains("Intel")) // should be in finished tasks, no?!
254 {
255 foreach(int player: players)
256 {
257 SecureIntelCombatOps(player);
258 }
259 break;
260 }
261 }
262 }
263 }
264 else if (conflict && conflict.IsTutorial())
265 {
266 /* Achievement SWEAT_SAVES_BLOOD */
267 if (finishedTasks.Count() >= activeTasks.Count())
268 {
269 foreach(int player: players)
270 {
271 CleanSweepTutorial(player);
272 }
273 return;
274 }
275 /* Achievement SWEAT_SAVES_BLOOD */
276 }
277 }
278
279 //------------------------------------------------------------------------------------------------
280 protected void OnItemUsed(IEntity item, bool actionCompleted, ItemUseParameters animParams)
281 {
282 // This is invoked for multiple items being used, including mines, but mines are handled separately
283 if (!item || !actionCompleted)
284 {
285 return;
286 }
287
288 // We are interested only in consumables
289 SCR_ConsumableItemComponent consumableComp = SCR_ConsumableItemComponent.Cast(item.FindComponent(SCR_ConsumableItemComponent));
290 if (!consumableComp)
291 {
292 return;
293 }
294
295 // We are interested only in medical consumables
296 SCR_EConsumableType consumType = consumableComp.GetConsumableType();
297
298 // All consumables are medical at this time, but I try to make check, that would skip any newly added consumables
299 // and should produce error, if the existing medical consumable is removed/changed in SCR_EConsumableType
300 // TODO: Turn into something more serious when general "medical" type is available
301 if (consumType != SCR_EConsumableType.BANDAGE &&
302 consumType != SCR_EConsumableType.HEALTH &&
303 consumType != SCR_EConsumableType.TOURNIQUET &&
304 consumType != SCR_EConsumableType.SALINE &&
305 consumType != SCR_EConsumableType.MORPHINE &&
306 consumType != SCR_EConsumableType.MED_KIT)
307 {
308 return;
309 }
310
311 IEntity userCharacter = consumableComp.GetCharacterOwner();
312 if (!userCharacter)
313 {
314 return;
315 }
316
317 IEntity targetCharacter = consumableComp.GetTargetCharacter();
318
319 OnHealItemUsed(consumType, userCharacter, targetCharacter);
320
321 if (!targetCharacter)
322 {
323 return;
324 }
325
326 // Self usage doesn't count
327 if (userCharacter == targetCharacter)
328 {
329 return;
330 }
331
332 // Only player as a user is counted
333 int userPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(userCharacter);
334 if (userPlayerId == 0)
335 {
336 return;
337 }
338
339 // Only player as a target is counted
340 int targetPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(targetCharacter);
341 if (targetPlayerId == 0)
342 {
343 return;
344 }
345
346 // Tracking for achievements HELPING_HAND, BATTLEFIELD_ANGEL
347 IncrementAchievementProgress(userPlayerId, AchievementStatId.MEDICAL_ASSISTS);
348 }
349
350 //------------------------------------------------------------------------------------------------
351 protected void OnHealItemUsed(SCR_EConsumableType consumType, IEntity userCharacter, IEntity targetCharacter)
352 {
353 if (!userCharacter)
354 return;
355
356 // Only player as a user is counted
357 int userPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(userCharacter);
358 if (userPlayerId == 0)
359 {
360 return;
361 }
362
363 // if targetCharacter is null, he used the item on himself, and this is allowed
364 if (targetCharacter)
365 {
366 // Only player as a target is counted
367 int targetPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(targetCharacter);
368 if (targetPlayerId == 0)
369 {
370 return;
371 }
372 }
373
374 // allowed only in conflict mode
375 if (!m_Conflict)
376 return;
377
378 // Achievement READY_SALTED
379 if (consumType == SCR_EConsumableType.SALINE)
380 {
381 Print("Player with id " + userPlayerId + " used a saline solution!", LogLevel.DEBUG);
382 IncrementAchievementProgress(userPlayerId, AchievementStatId.SALINE_SOLUTION_USED);
383 }
384 }
385
386 //------------------------------------------------------------------------------------------------
387 protected void OnSupportStationUsed(SCR_BaseSupportStationComponent supportStation, ESupportStationType supportStationType, IEntity actionTarget, IEntity actionUser, SCR_BaseUseSupportStationAction action)
388 {
389 // Achievements are interested only in HEAL type
390 if (supportStationType != ESupportStationType.HEAL)
391 {
392 return;
393 }
394
395 // Not interested in self aplication
396 if (actionTarget == actionUser)
397 {
398 return;
399 }
400
401 // Only player as a user is counted
402 int userPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(actionUser);
403 if (userPlayerId == 0)
404 {
405 return;
406 }
407
408 // Only player as a target is counted
409 int targetPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(actionTarget);
410 if (targetPlayerId == 0)
411 {
412 return;
413 }
414
415 // Increment the stat of HELPING_HAND, BATTLEFIELD_ANGEL achievement
416 IncrementAchievementProgress(userPlayerId, AchievementStatId.MEDICAL_ASSISTS);
417 }
418
419 //------------------------------------------------------------------------------------------------
420 protected void InstrumentPlayed(int playerId, SCR_EInstrumentType instrumentType)
421 {
422 // Achievement IVORY_TICKLER || PIPING_UP
423
424 switch (instrumentType)
425 {
426 case SCR_EInstrumentType.PIANO:
427 PianoPlayed(playerId);
428 break;
429 case SCR_EInstrumentType.ORGAN:
430 OrganPlayed(playerId);
431 break;
432 }
433 }
434
435 //------------------------------------------------------------------------------------------------
436 protected void UnlockAchievement(int playerId, AchievementId achievementId)
437 {
438 PlayerController playerController = GetGame().GetPlayerManager().GetPlayerController(playerId);
439 if (!playerController)
440 return;
441
442 SCR_AchievementsHandler handler = SCR_AchievementsHandler.Cast(playerController.FindComponent(SCR_AchievementsHandler));
443 if (!handler)
444 return;
445
446 handler.UnlockAchievement(achievementId);
447 }
448
449 //------------------------------------------------------------------------------------------------
450 protected void IncrementAchievementProgress(int playerId, AchievementStatId achievementStatId)
451 {
452 PlayerController playerController = GetGame().GetPlayerManager().GetPlayerController(playerId);
453 if (!playerController)
454 return;
455
456 SCR_AchievementsHandler handler = SCR_AchievementsHandler.Cast(playerController.FindComponent(SCR_AchievementsHandler));
457 if (!handler)
458 return;
459
460 handler.IncrementAchievementProgress(achievementStatId);
461 }
462
463 //------------------------------------------------------------------------------------------------
464 protected void ToiletFlushed(int playerId)
465 {
466 // Achievement COMBAT_HYGIENE
467 Print("Player with id " + playerId + " flushed a toilet!", LogLevel.DEBUG);
468 UnlockAchievement(playerId, AchievementId.COMBAT_HYGIENE);
469 }
470
471 //------------------------------------------------------------------------------------------------
472 protected void VehicleDestroyed(int playerId)
473 {
474 // Achievement NUTCRACKER
475 IncrementAchievementProgress(playerId, AchievementStatId.VEHICLES_DESTROYED);
476 }
477
478 //------------------------------------------------------------------------------------------------
479 protected void RankedUp(SCR_ECharacterRank prevRank, SCR_ECharacterRank newRank, IEntity playerEntity, bool silent)
480 {
481 // Achievement MAJOR_PROMOTION
482 if (newRank != SCR_ECharacterRank.MAJOR || prevRank > newRank)
483 return;
484
485 int playerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(playerEntity);
486 if (playerId <= 0)
487 return;
488
489 Print("Player with id " + playerId + " ranked up to major!", LogLevel.DEBUG);
490 UnlockAchievement(playerId, AchievementId.MAJOR_PROMOTION);
491 }
492
493 //------------------------------------------------------------------------------------------------
494 protected void SuppliesDelivered(int playerId, int suppliesDelivered, int totalSuppliesDelivered)
495 {
496 // Achievement TRUCKER_JOE
497 const int TARGET_AMOUNT = 5000;
498
499 if (totalSuppliesDelivered < TARGET_AMOUNT)
500 return;
501
502 Print("Player with id " + playerId + " delivered lots of supplies!", LogLevel.DEBUG);
503 UnlockAchievement(playerId, AchievementId.TRUCKER_JOE);
504 }
505
506 //------------------------------------------------------------------------------------------------
507 protected void CleanSweepCombatOps(int playerId)
508 {
509 // Achievement CLEAN_SWEEP
510 Print("Player with id " + playerId + " cleanswept combat ops!", LogLevel.DEBUG);
511 UnlockAchievement(playerId, AchievementId.CLEAN_SWEEP);
512 }
513
514 //------------------------------------------------------------------------------------------------
515 protected void SecureIntelCombatOps(int playerId)
516 {
517 // Achievement PAPER_PUSHER
518 Print("Player with id " + playerId + " has secured the intel!", LogLevel.DEBUG);
519 UnlockAchievement(playerId, AchievementId.PAPER_PUSHER);
520 }
521
522 //------------------------------------------------------------------------------------------------
523 protected void CleanSweepTutorial(int playerId)
524 {
525 //Achievement SWEAT_SAVES_BLOOD
526 Print("Player with id " + playerId + " has cleanswept the tutorial!", LogLevel.DEBUG);
527 UnlockAchievement(playerId, AchievementId.SWEAT_SAVES_BLOOD);
528 }
529
530 //------------------------------------------------------------------------------------------------
531 protected void MinePlaced(int playerId)
532 {
533 // Achievement MINED_OUT
534 Print("Player with id " + playerId + " placed a mine!", LogLevel.DEBUG);
535 IncrementAchievementProgress(playerId, AchievementStatId.MINES_PLACED);
536 }
537
538 //------------------------------------------------------------------------------------------------
539 protected void PianoPlayed(int playerId)
540 {
541 // Achievement IVORY_TICKLER
542 Print("Player with id " + playerId + " played a Piano!", LogLevel.DEBUG);
543 UnlockAchievement(playerId, AchievementId.IVORY_TICKLER);
544 }
545
546 //------------------------------------------------------------------------------------------------
547 protected void OrganPlayed(int playerId)
548 {
549 //Achievement PIPING_UP
550 Print("Player with id " + playerId + " played an Organ!", LogLevel.DEBUG);
551 UnlockAchievement(playerId, AchievementId.PIPING_UP);
552 }
553
554 //------------------------------------------------------------------------------------------------
555 protected void OnEntityRefundPerformed(IEntity refundedEntity, IEntity playerEntity)
556 {
557 // Achievement REQUISTIONED
558 if (!refundedEntity || !playerEntity)
559 return;
560
562 if (!factionComponent)
563 return;
564
565 if (factionComponent.GetDefaultFactionKey() != FACTION_CIVILIAN)
566 return;
567
568 int playerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(playerEntity);
569
570 Print("Player with id " + playerId + " refunded a civilian vehicle!", LogLevel.DEBUG);
571 IncrementAchievementProgress(playerId, AchievementStatId.CIV_VEHICLE_DECOMMISSIONED);
572 }
573
574 //------------------------------------------------------------------------------------------------
575 protected void OnFireExtinguished(IEntity playerEntity)
576 {
577 // Achievement RESCUE_TECHNICIAN
578 int playerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(playerEntity);
579 Print("Player with id " + playerId + " extinguished a fire!", LogLevel.DEBUG);
580 IncrementAchievementProgress(playerId, AchievementStatId.FIRE_EXTINGUISHED);
581 }
582
583 //------------------------------------------------------------------------------------------------
585 {
586 // Achievement CHANGING_CHANNELS
587 if (!base)
588 return;
589
590 if (base.GetType() != SCR_ECampaignBaseType.RELAY)
591 return;
592
593 if (playerId == 0) // is AI
594 return;
595
596 Print("Player with id " + playerId + " reconfigured a radio relay!", LogLevel.DEBUG);
597 IncrementAchievementProgress(playerId, AchievementStatId.RADIO_RELAY_RECONFIGURED);
598 }
599};
ESupportStationType
ArmaReforgerScripted GetGame()
Definition game.c:1398
SCR_AIAnimation_Loitering BaseContainerProps
Commanding menu commanding element class.
SCR_BaseGameMode GetGameMode()
void SCR_CharacterRankComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
SCR_EConsumableType
Type of consumable gadget.
void SCR_GameModeCampaign(IEntitySource src, IEntity parent)
SCR_EInstrumentType
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
SCR_ETaskState
Definition SCR_Task.c:3
void SCR_VehicleDamageManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
static ScriptInvokerBase< OnBaseCapturedDelegate > GetOnBaseCaptured()
Takes care of Campaign-specific server <> client communication and requests.
static ScriptInvokerInt3 GetOnSuppliesDelivered()
override void OnPlayerKilled(int playerId, IEntity playerEntity, IEntity killerEntity, notnull Instigator instigator, notnull SCR_InstigatorContextData instigatorContextData)
void OnSupportStationUsed(SCR_BaseSupportStationComponent supportStation, ESupportStationType supportStationType, IEntity actionTarget, IEntity actionUser, SCR_BaseUseSupportStationAction action)
void RankedUp(SCR_ECharacterRank prevRank, SCR_ECharacterRank newRank, IEntity playerEntity, bool silent)
void OnBaseCaptured(SCR_CampaignMilitaryBaseComponent base, int playerId)
void OnItemUsed(IEntity item, bool actionCompleted, ItemUseParameters animParams)
void OnHealItemUsed(SCR_EConsumableType consumType, IEntity userCharacter, IEntity targetCharacter)
void SuppliesDelivered(int playerId, int suppliesDelivered, int totalSuppliesDelivered)
void UnlockAchievement(int playerId, AchievementId achievementId)
void InstrumentPlayed(int playerId, SCR_EInstrumentType instrumentType)
void OnEntityRefundPerformed(IEntity refundedEntity, IEntity playerEntity)
void IncrementAchievementProgress(int playerId, AchievementStatId achievementStatId)
static ScriptInvokerInt GetOnToiletFlushed()
static ScriptInvokerInt2 GetOnInstrumentPlayed()
static ScriptInvokerEntity2 GetOnRefundPerformed()
ScriptInvokerBase< SupportStation_OnSupportStationExecuted > GetOnSupportStationExecutedSuccessfully()
static SCR_SupportStationManagerComponent GetInstance()
Definition Types.c:486
AchievementStatId
AchievementId
InstigatorType
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