Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_SpawnHandlerComponent.c
Go to the documentation of this file.
4
13class SCR_SpawnHandlerComponent : ScriptComponent
14{
15 private SCR_RespawnSystemComponent m_RespawnSystemComponent;
16
17 //------------------------------------------------------------------------------------------------
19 protected SCR_RespawnSystemComponent GetRespawnSystemComponent()
20 {
22 }
23
24 [Attribute(category: "Respawn Handler", desc: "If enabled, previous controlled entity prior to respawn will be destroyed (killed).")]
26
27 [Attribute(category: "Respawn Handler", desc: "If enabled, previous controlled entity prior to respawn will be destroyed (killed).")]
29
30 //------------------------------------------------------------------------------------------------
33 protected override void OnPostInit(IEntity owner)
34 {
35 super.OnPostInit(owner);
36
37 m_RespawnSystemComponent = SCR_RespawnSystemComponent.Cast(owner.FindComponent(SCR_RespawnSystemComponent));
39 Debug.Error(string.Format("%1 could not find %2! (should be a child of)", Type().ToString(), SCR_RespawnSystemComponent));
40 }
41
42 //------------------------------------------------------------------------------------------------
46 SCR_ESpawnResult CanHandleRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data)
47 {
48 int playerId = requestComponent.GetPlayerController().GetPlayerId();
49 #ifdef _ENABLE_RESPAWN_LOGS
50 Print(string.Format("%1::CanHandleRequest_S(playerId: %2, data: %3)", Type().ToString(),
51 playerId,
52 data), LogLevel.NORMAL);
53 #endif
54
55 // The authority can activate and deactivate respawn handlers at will, but
56 // only the active ones should resolve incoming requests. This should allow
57 // the user to enable and disable individual respawning methods on the fly
58 if (!IsActive())
59 return SCR_ESpawnResult.UNSUPPORTED_SPAWN_METHOD;
60
61 // Now that data is updated, validate the data prior to
62 // doing any game specific checks. An invalid request
63 // is dropped without ever reaching the game.
64 if (!ValidateData_S(requestComponent, data))
65 return SCR_ESpawnResult.CANNOT_VALIDATE;
66
67 // See if player can be spawned with provided data,
68 // this can be e.g. based on gamemodes
69 SCR_ESpawnResult requestResult;
70 if (!CanRequestSpawn_S(requestComponent, data, requestResult))
71 return requestResult;
72
73 return SCR_ESpawnResult.OK;
74 }
75
76 //------------------------------------------------------------------------------------------------
82 SCR_ESpawnResult HandleRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, out IEntity spawnedEntity)
83 {
84 int playerId = requestComponent.GetPlayerController().GetPlayerId();
85 #ifdef _ENABLE_RESPAWN_LOGS
86 Print(string.Format("%1::HandleRequest_S(playerId: %2, data: %3)", Type().ToString(),
87 playerId,
88 data), LogLevel.NORMAL);
89 #endif
90
91 // Validate whether spawn can happen
92 SCR_ESpawnResult canSpawn = CanHandleRequest_S(requestComponent, data);
93 if (canSpawn != SCR_ESpawnResult.OK)
94 return canSpawn;
95
96 #ifdef ENABLE_DIAG
97 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_RESPAWN_COMPONENT_TIME))
98 Debug.BeginTimeMeasure();
99 #endif
100
101 // Process with spawn
102 SCR_ESpawnResult result = SpawnEntity_S(requestComponent, data, spawnedEntity);
103 if (result == SCR_ESpawnResult.OK && !spawnedEntity)
104 {
105 Debug.Error(string.Format("Bad %1 implementation! Result is %2, but entity is %3!",
106 Type().ToString(), typename.EnumToString(SCR_ESpawnResult, result), spawnedEntity));
107
108 result = SCR_ESpawnResult.INTERNAL_ERROR;
109 }
110
111 #ifdef ENABLE_DIAG
112 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_RESPAWN_COMPONENT_TIME))
113 Debug.EndTimeMeasure("SpawnEntity_S");
114 #endif
115
116 return result;
117 }
118
119 //------------------------------------------------------------------------------------------------
121 void OnFinalizeBegin_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
122 {
123 if (data && data.GetSkipPreload())
124 return;
125
126 if (SCR_BaseGameMode.Cast(GetGame().GetGameMode()).CanStartSpawnPreload())
127 requestComponent.StartSpawnPreload(data.GetPosition());
128 }
129
130 //------------------------------------------------------------------------------------------------
136 bool CanFinalize_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
137 {
138 return !requestComponent.IsPreloading();
139 }
140
141 //------------------------------------------------------------------------------------------------
147 SCR_ESpawnResult FinalizeRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
148 {
149 int playerId = requestComponent.GetPlayerId();
150 #ifdef _ENABLE_RESPAWN_LOGS
151 Print(string.Format("%1::FinalizeRequest_S(playerId: %2, data: %3)", Type().ToString(),
152 playerId,
153 data), LogLevel.NORMAL);
154 #endif
155
156 if (!AssignEntity_S(requestComponent, entity, data))
157 return SCR_ESpawnResult.CANNOT_ASSIGN;
158
159 SCR_RespawnSystemComponent respawnSystem = GetRespawnSystemComponent();
160 respawnSystem.OnPlayerSpawnFinalize_S(requestComponent, this, data, entity);
161 OnFinalizeDone_S(requestComponent, data, entity);
162 return SCR_ESpawnResult.OK;
163 }
164
165 //------------------------------------------------------------------------------------------------
170 void OnFinalizeDone_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity);
171
172 //------------------------------------------------------------------------------------------------
177 protected bool ValidateData_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data)
178 {
179 #ifdef _ENABLE_RESPAWN_LOGS
180 Print(string.Format("%1::ValidateData_S(playerId: %1, data: %2)", Type().ToString(), requestComponent.GetPlayerId(), data), LogLevel.NORMAL);
181 #endif
182 return data.IsValid();
183 }
184
185 //------------------------------------------------------------------------------------------------
193 bool CanRequestSpawn_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, out SCR_ESpawnResult result)
194 {
195 #ifdef _ENABLE_RESPAWN_LOGS
196 Print(string.Format("%1::CanRequestSpawn_S(playerId: %2, data: %3)", Type().ToString(),
197 requestComponent.GetPlayerId(), data), LogLevel.NORMAL);
198 #endif
199
200 SCR_RespawnSystemComponent respawnSystem = SCR_RespawnSystemComponent.GetInstance();
201 return respawnSystem.CanRequestSpawn_S(requestComponent, this, data, result);
202 }
203
204 //------------------------------------------------------------------------------------------------
214 protected SCR_ESpawnResult SpawnEntity_S(SCR_SpawnRequestComponent requestComponent, notnull SCR_SpawnData data, out IEntity spawnedEntity)
215 {
216 int playerId = requestComponent.GetPlayerId();
217 #ifdef _ENABLE_RESPAWN_LOGS
218 Print(string.Format("%1::SpawnEntity_S(playerId: %2, data: %3)", Type().ToString(),
219 playerId,
220 data), LogLevel.NORMAL);
221 #endif
222
223 ResourceName prefab = data.GetPrefab();
224 if (!ValidatePrefab_S(prefab))
225 return SCR_ESpawnResult.INVALID_PREFAB;
226
227 IEntity previousEntity = GetGame().GetPlayerManager().GetPlayerControlledEntity(playerId);
228
229 // Transformation
231 params.TransformMode = ETransformMode.WORLD;
232 vector angles = data.GetAngles();
233 vector yawPitchRoll = Vector(angles[1], angles[0], angles[2]);
234 Math3D.AnglesToMatrix(yawPitchRoll, params.Transform);
235 params.Transform[3] = data.GetPosition();
236
237 #ifdef ENABLE_DIAG
238 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_RESPAWN_COMPONENT_TIME))
239 Debug.BeginTimeMeasure();
240 #endif
241
242 // Spawn
243 Resource res = Resource.Load(prefab);
244
245 #ifdef ENABLE_DIAG
246 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_RESPAWN_COMPONENT_TIME))
247 {
248 Debug.EndTimeMeasure("Resource::Load");
249 Debug.BeginTimeMeasure();
250 }
251 #endif
252
253 IEntity entity = GetGame().SpawnEntityPrefab(res, null, params);
254
255 #ifdef ENABLE_DIAG
256 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_RESPAWN_COMPONENT_TIME))
257 Debug.EndTimeMeasure("Game::SpawnEntityPrefab");
258 #endif
259
260 if (!PrepareEntity_S(requestComponent, entity, data))
261 {
262 HandleSpawnEntityFailure_S(requestComponent, entity, data, SCR_ESpawnResult.CANNOT_PREPARE);
263 return SCR_ESpawnResult.CANNOT_PREPARE;
264 }
265
266 spawnedEntity = entity;
267 return SCR_ESpawnResult.OK;
268 }
269
270 //------------------------------------------------------------------------------------------------
275 {
276 #ifdef _ENABLE_RESPAWN_LOGS
277 Print(string.Format("%1::ValidatePrefab_S(pref: %2)", Type().ToString(), resourceName), LogLevel.NORMAL);
278 #endif
279
280 if (resourceName.IsEmpty())
281 return false;
282
283 Resource res = Resource.Load(resourceName);
284 if (!res.IsValid())
285 return false;
286
287 IEntityComponentSource rplComponent = SCR_BaseContainerTools.FindComponentSource(res, RplComponent);
288 if (!rplComponent)
289 return false;
290
291 IEntityComponentSource baseControllerComponent = SCR_BaseContainerTools.FindComponentSource(res, RplComponent);
292 if (!baseControllerComponent)
293 return false;
294
295 return true;
296 }
297
298 //------------------------------------------------------------------------------------------------
305 protected bool PrepareEntity_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data)
306 {
307 #ifdef _ENABLE_RESPAWN_LOGS
308 Print(string.Format("%1::PrepareEntity_S(playerId: %2, entity: %3, data: %4)", Type().ToString(),
309 requestComponent.GetPlayerController().GetPlayerId(),
310 entity,
311 data), LogLevel.NORMAL);
312 #endif
313
314 return GetRespawnSystemComponent().PreparePlayerEntity_S(requestComponent, this, data, entity);
315 }
316
317 //------------------------------------------------------------------------------------------------
323 protected bool AssignEntity_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data)
324 {
325 int playerId = requestComponent.GetPlayerController().GetPlayerId();
326 #ifdef _ENABLE_RESPAWN_LOGS
327 Print(string.Format("%1::AssignEntity_S(playerId: %2, entity: %3, data: %4)", Type().ToString(),
328 playerId,
329 entity,
330 data), LogLevel.NORMAL);
331 #endif
332
333 SCR_PlayerController playerController = SCR_PlayerController.Cast(GetGame().GetPlayerManager().GetPlayerController(playerId));
334
335 // Already controlling!
336 IEntity previous = playerController.GetControlledEntity();
337 if (previous == entity)
338 return false;
339
340 playerController.SetInitialMainEntity(entity);
341
342 // Notify the system of change
343 HandleEntityChange_S(requestComponent, previous, entity, data);
344 return true;
345 }
346
347 //------------------------------------------------------------------------------------------------
355 protected void HandleSpawnEntityFailure_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data, SCR_ESpawnResult reason)
356 {
357 #ifdef _ENABLE_RESPAWN_LOGS
358 Print(string.Format("%1::HandleSpawnEntityFailure_S(playerId: %2, entity: %2, data: %3, res: %4)", Type().ToString(),
359 requestComponent.GetPlayerId(), entity, data, typename.EnumToString(SCR_ESpawnResult, reason)), LogLevel.NORMAL);
360 #endif
361
362 SCR_RespawnSystemComponent respawnSystem = GetRespawnSystemComponent();
363 respawnSystem.OnSpawnPlayerEntityFailure_S(requestComponent, this, entity, data, reason);
364
365 if (entity && ShouldDeleteEntityOnSpawnFailure_S(requestComponent, entity, data, reason))
366 RplComponent.DeleteRplEntity(entity, false);
367 }
368
369 //------------------------------------------------------------------------------------------------
376 protected bool ShouldDeleteEntityOnSpawnFailure_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data, SCR_ESpawnResult reason)
377 {
378 return true;
379 }
380
381 //------------------------------------------------------------------------------------------------
387 protected void HandleEntityChange_S(SCR_SpawnRequestComponent requestComponent, IEntity previousEntity, IEntity newEntity, SCR_SpawnData data)
388 {
389 #ifdef _ENABLE_RESPAWN_LOGS
390 Print(string.Format("%1::HandleEntityChange_S(playerId: %2, previousEntity: %3, newEntity: %4, data: %5)", Type().ToString(),
391 requestComponent.GetPlayerController().GetPlayerId(),
392 previousEntity,
393 newEntity,
394 data), LogLevel.NORMAL);
395 #endif
396
397 // Notify manager
398 SCR_RespawnSystemComponent respawnSystem = GetRespawnSystemComponent();
399 respawnSystem.OnPlayerEntityChange_S(requestComponent, this, previousEntity, newEntity, data);
400
401 // No need to resolve
402 if (!previousEntity)
403 return;
404
406 {
408 if (damageManager)
409 damageManager.SetHealthScaled(0.0);
410 }
411
413 RplComponent.DeleteRplEntity(previousEntity, false);
414 }
415}
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition DebugMenuID.c:4
ArmaReforgerScripted GetGame()
Definition game.c:1398
ref array< string > angles
ResourceName resourceName
Definition SCR_AIGroup.c:66
SCR_BaseGameMode GetGameMode()
SCR_ESpawnResult
Get all prefabs that have the spawner data
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
bool ValidateData_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data)
SCR_RespawnSystemComponent GetRespawnSystemComponent()
bool AssignEntity_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data)
SCR_ESpawnResult CanHandleRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data)
void OnFinalizeDone_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
SCR_SpawnHandlerComponentClass m_RespawnSystemComponent
bool ShouldDeleteEntityOnSpawnFailure_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data, SCR_ESpawnResult reason)
bool CanFinalize_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
bool ValidatePrefab_S(ResourceName resourceName)
void HandleEntityChange_S(SCR_SpawnRequestComponent requestComponent, IEntity previousEntity, IEntity newEntity, SCR_SpawnData data)
bool CanRequestSpawn_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, out SCR_ESpawnResult result)
SCR_ESpawnResult SpawnEntity_S(SCR_SpawnRequestComponent requestComponent, notnull SCR_SpawnData data, out IEntity spawnedEntity)
bool m_bDestroyPreviousControlledEntity
void HandleSpawnEntityFailure_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data, SCR_ESpawnResult reason)
SCR_ESpawnResult FinalizeRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
bool m_bDeletePreviousControlledEntity
void OnFinalizeBegin_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
Called when the finalisation process begins.
bool PrepareEntity_S(SCR_SpawnRequestComponent requestComponent, IEntity entity, SCR_SpawnData data)
SCR_ESpawnResult HandleRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, out IEntity spawnedEntity)
int Type
enum EVehicleType IEntity
Definition Debug.c:13
Diagnostic and developer menu system.
Definition DiagMenu.c:18
proto external bool IsActive()
proto external Managed FindComponent(typename typeName)
Object holding reference to resource. In destructor release the resource.
Definition Resource.c:25
void SetInitialMainEntity(notnull IEntity entity)
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
proto external PlayerController GetPlayerController()
proto external string ToString()
Plain C++ pointer, no weak pointers, no memory management.
proto native vector Vector(float x, float y, float z)