Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_SpawnRequestComponent.c
Go to the documentation of this file.
2{
3 static override bool DependsOn(string className)
4 {
5 if (className == "SCR_RespawnComponent")
6 return true;
7
8 return false;
9 }
10}
11
20class SCR_SpawnRequestComponent : ScriptComponent
21{
24 private SCR_SpawnLockComponent m_LockComponent;
25 private RplComponent m_RplComponent;
26
27 private SCR_SpawnHandlerComponent m_HandlerComponent;
28 private bool m_bIsPreloading;
29
30 //------------------------------------------------------------------------------------------------
32 PlayerController GetPlayerController()
33 {
34 return m_PlayerController;
35 }
36
37 //------------------------------------------------------------------------------------------------
40 {
42 return 0;
43
44 return m_PlayerController.GetPlayerId();
45 }
46
47 //------------------------------------------------------------------------------------------------
52
53 //------------------------------------------------------------------------------------------------
55 SCR_SpawnHandlerComponent GetHandlerComponent()
56 {
57 return m_HandlerComponent;
58 }
59
60 //------------------------------------------------------------------------------------------------
62 protected SCR_SpawnLockComponent GetLock()
63 {
64 return m_LockComponent;
65 }
66
70 private ref SCR_SpawnData m_ConfirmationPendingData;
71
72 //------------------------------------------------------------------------------------------------
75 typename GetHandlerType()
76 {
77 return SCR_SpawnHandlerComponent;
78 }
79
80 //------------------------------------------------------------------------------------------------
83 typename GetDataType()
84 {
85 return SCR_SpawnData;
86 }
87
88 //------------------------------------------------------------------------------------------------
89 protected bool IsOwner()
90 {
91 return !m_RplComponent || m_RplComponent.IsOwner();
92 }
93
94 //------------------------------------------------------------------------------------------------
95 protected bool IsProxy()
96 {
97 return m_RplComponent && m_RplComponent.IsProxy();
98 }
99
100 //------------------------------------------------------------------------------------------------
103 protected override void OnPostInit(IEntity owner)
104 {
105 super.OnPostInit(owner);
106
107 if (!GetGame().InPlayMode())
108 return;
109
112 {
113 Print(string.Format("%1 is not attached in %2 hierarchy! (%1 should be a child of %3!)",
115 LogLevel.ERROR);
116 }
117
118 m_RplComponent = RplComponent.Cast(owner.FindComponent(RplComponent));
119 if (!m_RplComponent)
120 {
121 Print(string.Format("%1 could not find %2!",
122 Type().ToString(), RplComponent),
123 LogLevel.ERROR);
124 }
125
128 {
129 Print(string.Format("%1 could not find %2!",
131 LogLevel.ERROR);
132 }
133
134 m_LockComponent = SCR_SpawnLockComponent.Cast(owner.FindComponent(SCR_SpawnLockComponent));
135 if (!m_LockComponent)
136 {
137 Print(string.Format("%1 could not find %2!",
138 Type().ToString(), SCR_SpawnLockComponent),
139 LogLevel.ERROR);
140 }
141
142 SCR_RespawnSystemComponent respawnSystem = SCR_RespawnSystemComponent.GetInstance();
143 if (!respawnSystem)
144 {
145 Print(string.Format("%1 could not find %2!",
146 Type().ToString(), SCR_RespawnSystemComponent),
147 LogLevel.ERROR);
148 }
149
150 m_HandlerComponent = SCR_SpawnHandlerComponent.Cast(respawnSystem.FindComponent(GetHandlerType()));
151 if (!m_HandlerComponent)
152 {
153 Print(string.Format("%1 could not find %2!",
155 LogLevel.ERROR);
156 }
157 }
158
159 //------------------------------------------------------------------------------------------------
164 {
165 #ifdef _ENABLE_RESPAWN_LOGS
166 Print(string.Format("%1::CanRequestRespawn(data: %2)", Type().ToString(), data), LogLevel.NORMAL);
167 #endif
168
169 SCR_SpawnLockComponent lock = GetLock();
170 if (lock && !lock.TryLock(this, false))
171 {
172 //Print("SCR_SpawnRequestComponent::CanRequestRespawn - Caught request on locked player!", LogLevel.DEBUG); //~ No need to error as it simply returns on locked. As requests can be made in various situations
173 return false;
174 }
175
176 // Notify that request began
177 if (IsOwner())
178 m_RespawnComponent.GetOnCanRespawnRequestInvoker_O().Invoke(this, data);
179
180 if (!IsProxy())
181 m_RespawnComponent.GetOnCanRespawnRequestInvoker_S().Invoke(this, data);
182
183 // Now that we ensured that there will be no more outgoing requests,
184 // store the user constructed data to be passed onto response later on
185 m_ConfirmationPendingData = data;
186
187 // Send the ask request
188 bool success = DoCanRequestRespawn(m_ConfirmationPendingData);
189
190 // Notify self on local failure, early-reject.
191 if (!success)
193
194 return success;
195 }
196
197 //------------------------------------------------------------------------------------------------
202 {
203 Debug.Error("Not implemented!");
204 return false;
205 }
206
207 //------------------------------------------------------------------------------------------------
212 {
213 #ifdef _ENABLE_RESPAWN_LOGS
214 Print(string.Format("%1::ProcessCanRequest_S(data: %2)", Type().ToString(), data), LogLevel.NORMAL);
215 #endif
216
217 // Server lock
218 SCR_SpawnLockComponent lock = GetLock();
219 if (lock && !lock.TryLock(this, true))
220 {
221 Print("SCR_SpawnRequestComponent::ProcessCanRequest_S - Caught request on locked player!", LogLevel.DEBUG);
222 return;
223 }
224
225 SCR_RespawnComponent respawnComponent = GetRespawnComponent();
226 respawnComponent.GetOnCanRespawnRequestInvoker_S().Invoke(this, data);
227
228 // Find handler
229 SCR_SpawnHandlerComponent handler = GetHandlerComponent();
230 if (!handler)
231 {
232 Print("GameMode does not support this method of spawning!", LogLevel.WARNING);
233 SendCanResponse_S(SCR_ESpawnResult.UNSUPPORTED_SPAWN_METHOD, data);
234 return;
235 }
236
237 // Dispatch message
238 SCR_ESpawnResult response = handler.CanHandleRequest_S(this, data);
239 SendCanResponse_S(response, data);
240 }
241
242 //------------------------------------------------------------------------------------------------
248 {
249 #ifdef _ENABLE_RESPAWN_LOGS
250 Print(string.Format("%1::SendCanResponse_S(resp: %2, data: %3)", Type().ToString(), typename.EnumToString(SCR_ESpawnResult, response), data), LogLevel.NORMAL);
251 #endif
252
253 // End server request
254 SCR_SpawnLockComponent lock = GetLock();
255 if (lock)
256 {
257 lock.Unlock(this, true);
258 lock.Unlock(this, false);
259 }
260
261 // Notify authority
262 SCR_RespawnComponent respawnComponent = GetRespawnComponent();
263 respawnComponent.GetOnCanRespawnResponseInvoker_S().Invoke(this, response, data);
264
265 // Send client response
266 Rpc(Rpc_SendCanResponse_O, response);
267 }
268
269 //------------------------------------------------------------------------------------------------
273 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
275 {
276 #ifdef _ENABLE_RESPAWN_LOGS
277 Print(string.Format("%1::Rpc_SendCanResponse_O(resp: %2)", Type().ToString(), typename.EnumToString(SCR_ESpawnResult, response)), LogLevel.NORMAL);
278 #endif
279
280 // End client request
281 SCR_SpawnLockComponent lock = GetLock();
282 if (lock)
283 lock.Unlock(this, false);
284
285 // Notify
286 SCR_RespawnComponent respawnComponent = GetRespawnComponent();
287 respawnComponent.GetOnCanRespawnResponseInvoker_O().Invoke(this, response, m_ConfirmationPendingData);
288
289 // Release stored data
290 m_ConfirmationPendingData = null;
291 }
292
293 //------------------------------------------------------------------------------------------------
299 {
300 #ifdef _ENABLE_RESPAWN_LOGS
301 Print(string.Format("%1::RequestRespawn(data: %2)", Type().ToString(), data), LogLevel.NORMAL);
302 #endif
303
304 // Lock client
305 SCR_SpawnLockComponent lock = GetLock();
306 if (lock && !lock.TryLock(this, false))
307 {
308 Print("SCR_SpawnRequestComponent::RequestRespawn - Caught request spawn on locked player!", LogLevel.DEBUG);
309 return false;
310 }
311
312 // Notify that request began
313 if (IsOwner())
314 m_RespawnComponent.GetOnRespawnRequestInvoker_O().Invoke(this);
315
316 if (!IsProxy())
317 m_RespawnComponent.GetOnRespawnRequestInvoker_S().Invoke(this);
318
319 // Request
320 bool success = DoRequestRespawn(data);
321
322 // Notify self on local failure, early-reject.
323 if (!success)
325
326 return success;
327 }
328
329 //------------------------------------------------------------------------------------------------
335 {
336 Debug.Error("Not implemented!");
337 return false;
338 }
339
340 //------------------------------------------------------------------------------------------------
345 {
346 #ifdef _ENABLE_RESPAWN_LOGS
347 Print(string.Format("%1::ProcessRequest_S(data: %2)", Type().ToString(), data), LogLevel.NORMAL);
348 #endif
349
350 // Server lock
351 SCR_SpawnLockComponent lock = GetLock();
352 if (lock && !lock.TryLock(this, true))
353 {
354 Print("SCR_SpawnRequestComponent::ProcessRequest_S - Caught request on locked player!", LogLevel.DEBUG);
355 return;
356 }
357
358 // Find handler
359 SCR_SpawnHandlerComponent handler = GetHandlerComponent();
360 if (!handler)
361 {
362 Print("GameMode does not support this method of spawning!", LogLevel.WARNING);
363 SendResponse_S(SCR_ESpawnResult.UNSUPPORTED_SPAWN_METHOD, data);
364 return;
365 }
366
367 // Dispatch message
368 IEntity spawnedEntity;
369 SCR_ESpawnResult response = handler.HandleRequest_S(this, data, spawnedEntity);
370
371 // Entity was not spawned correctly, notify the requester and no finalisation
372 if (response != SCR_ESpawnResult.OK)
373 {
374 SendResponse_S(response, data);
375 return;
376 }
377
378 // For entities that can technically be controlled by an AI agent, notify the agent
379 // that such entity is the result of a spawning process and is pending for a player
380 SCR_ChimeraAIAgent agent = FindAIAgent(spawnedEntity);
381 if (agent)
382 agent.SetPlayerPending_S(m_PlayerController.GetPlayerId());
383
384 // Editor needs to be aware of whether the pending character is for a player or not in order to update the Editor Budget during spawning.
385 // TODO: Remove this after the Editor's Respawn Sytem refactor.
386 SCR_EditableCharacterComponent editorCharacter = SCR_EditableCharacterComponent.Cast(spawnedEntity.FindComponent(SCR_EditableCharacterComponent));
387 if (editorCharacter)
388 editorCharacter.SetIsPlayerPending(m_PlayerController.GetPlayerId());
389
390 // Entity was spawned, so we can await finalisation.
392 OnFinalizeBegin_S(handler, data, spawnedEntity);
393 GetGame().GetCallqueue().CallLater(AwaitFinalization_S, 0, true, handler, data, spawnedEntity);
394 }
395
396 //------------------------------------------------------------------------------------------------
401 protected void OnFinalizeBegin_S(SCR_SpawnHandlerComponent handler, SCR_SpawnData data, IEntity spawnedEntity)
402 {
403 #ifdef _ENABLE_RESPAWN_LOGS
404 Print(string.Format("%1::OnFinalizeBegin_S(handler: %1, data: %2, entity: %3)", Type().ToString(),
405 handler, data, spawnedEntity), LogLevel.NORMAL);
406 #endif
407 handler.OnFinalizeBegin_S(this, data, spawnedEntity);
408 }
409
410 //------------------------------------------------------------------------------------------------
415 protected void AwaitFinalization_S(SCR_SpawnHandlerComponent handler, SCR_SpawnData data, IEntity spawnedEntity)
416 {
417 #ifdef _ENABLE_RESPAWN_LOGS
418 Print(string.Format("%1::AwaitFinalization_S(handler: %2, data: %3, entity: %4)", Type().ToString(),
419 handler, data, spawnedEntity), LogLevel.NORMAL);
420 #endif
421
422 if (CanFinalize_S(handler, data, spawnedEntity))
423 {
424 FinalizeRequest_S(handler, data, spawnedEntity);
425 GetGame().GetCallqueue().Remove(AwaitFinalization_S);
426
427 // For entities that were previously marked as pending player
428 // spawn, clear their state as the process is done
429 SCR_ChimeraAIAgent agent = FindAIAgent(spawnedEntity);
430 if (agent)
431 agent.SetPlayerPending_S(0);
432 }
433 }
434
435 //------------------------------------------------------------------------------------------------
441 protected bool CanFinalize_S(SCR_SpawnHandlerComponent handler, SCR_SpawnData data, IEntity spawnedEntity)
442 {
443 #ifdef _ENABLE_RESPAWN_LOGS
444 Print(string.Format("%1::CanFinalize_S(handler: %2, data: %3, entity: %4)", Type().ToString(),
445 handler, data, spawnedEntity), LogLevel.NORMAL);
446 #endif
447 return handler.CanFinalize_S(this, data, spawnedEntity);
448 }
449
450 //------------------------------------------------------------------------------------------------
456 protected void FinalizeRequest_S(SCR_SpawnHandlerComponent handler, SCR_SpawnData data, IEntity spawnedEntity)
457 {
458 #ifdef _ENABLE_RESPAWN_LOGS
459 Print(string.Format("%1::FinalizeRequest_S(handler: %1, data: %2, entity: %3)", Type().ToString(),
460 handler, data, spawnedEntity), LogLevel.NORMAL);
461 #endif
462 SCR_ESpawnResult response = handler.FinalizeRequest_S(this, data, spawnedEntity);
463 SendResponse_S(response, data);
464
465 // Authority-side notification for systems to understand a spawn occurred
466 if (response != SCR_ESpawnResult.OK)
467 return;
468
469 m_RespawnComponent.NotifySpawn(spawnedEntity);
470 }
471
472 //------------------------------------------------------------------------------------------------
478 {
479 #ifdef _ENABLE_RESPAWN_LOGS
480 Print(string.Format("%1::SendResponse_S(resp: %2, data: %3)", Type().ToString(), typename.EnumToString(SCR_ESpawnResult, response), data), LogLevel.NORMAL);
481 #endif
482
483 // End server request
484 SCR_SpawnLockComponent lock = GetLock();
485 if (lock)
486 {
487 lock.Unlock(this, true);
488 lock.Unlock(this, false);
489 }
490
491 // Notify manager
492 SCR_RespawnComponent respawnComponent = GetRespawnComponent();
493 respawnComponent.GetOnRespawnResponseInvoker_S().Invoke(this, response, data);
494
495 // Send client response
496 Rpc(Rpc_SendResponse_O, response);
497 }
498
499 //------------------------------------------------------------------------------------------------
501 protected void SendFinalizationBegin_S()
502 {
503 #ifdef _ENABLE_RESPAWN_LOGS
504 Print(string.Format("%1::SendFinalizationBegin_S()", Type().ToString()), LogLevel.NORMAL);
505 #endif
506
508 }
509
510 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
512 {
513 SCR_RespawnComponent respawnComponent = GetRespawnComponent();
514 respawnComponent.GetOnRespawnFinalizeBeginInvoker_O().Invoke(this);
515 }
516
517 //
518 // Preload handling
519 //
520
521 //------------------------------------------------------------------------------------------------
524 {
525 return m_bIsPreloading;
526 }
527
528 //------------------------------------------------------------------------------------------------
532 {
535 RplComponent.InsertMPObserver(m_PlayerController.GetRplIdentity(), position[0], position[2]);
537 }
538
539 //------------------------------------------------------------------------------------------------
540 protected void NotifyPreloadStarted_S()
541 {
542 m_bIsPreloading = true;
544 }
545
546 //------------------------------------------------------------------------------------------------
547 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
549 {
550 m_bIsPreloading = true;
551 }
552
553 //------------------------------------------------------------------------------------------------
554 protected void NotifyPreloadFinished_S()
555 {
556 m_bIsPreloading = false;
558 }
559
560 //------------------------------------------------------------------------------------------------
561 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
563 {
564 m_bIsPreloading = false;
566 RplComponent.RemoveMPObserver(m_PlayerController.GetRplIdentity());
567 }
568
569 //------------------------------------------------------------------------------------------------
570 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
577
578 //------------------------------------------------------------------------------------------------
582 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
583 protected void Rpc_SendResponse_O(SCR_ESpawnResult response)
584 {
585 #ifdef _ENABLE_RESPAWN_LOGS
586 Print(string.Format("%1::Rpc_SendResponse_O(resp: %2)", Type().ToString(), typename.EnumToString(SCR_ESpawnResult, response)), LogLevel.NORMAL);
587 #endif
588
589 // End client request
590 SCR_SpawnLockComponent lock = GetLock();
591 if (lock)
592 lock.Unlock(this, false);
593
594 // Notify client
595 SCR_RespawnComponent respawnComponent = GetRespawnComponent();
596 respawnComponent.GetOnRespawnResponseInvoker_O().Invoke(this, response, m_ConfirmationPendingData);
597 SCR_RespawnComponent.SGetOnLocalPlayerSpawned().Invoke();
598 auto respawnSystem = SCR_RespawnSystemComponent.GetInstance();
599 if (respawnSystem)
600 respawnSystem.DestroyLoadingPlaceholder();
601 }
602
603 //------------------------------------------------------------------------------------------------
607 {
608 if (entity)
609 {
610 AIControlComponent controlComponent = AIControlComponent.Cast(entity.FindComponent(AIControlComponent));
611 if (controlComponent)
612 {
613 SCR_ChimeraAIAgent agent = SCR_ChimeraAIAgent.Cast(controlComponent.GetControlAIAgent());
614 return agent;
615 }
616 }
617
618 return null;
619 }
620
621 //------------------------------------------------------------------------------------------------
622 // destructor
624 {
626 RplComponent.RemoveMPObserver(m_PlayerController.GetRplIdentity());
627 }
628
629 #ifdef ENABLE_DIAG
630 //------------------------------------------------------------------------------------------------
632 void DrawDiag()
633 {
634 if (!m_Diag)
635 m_Diag = CreateDiag();
636 if (m_Diag)
637 m_Diag.DrawDbgUI(GetPlayerController());
638 }
639
640 protected ref SCR_BaseRespawnDiag m_Diag;
641
642 //------------------------------------------------------------------------------------------------
643 protected ref SCR_BaseRespawnDiag CreateDiag()
644 {
645 return null;
646 }
647 #endif
648}
649
650#ifdef ENABLE_DIAG
652class SCR_BaseRespawnDiag
653{
654 //------------------------------------------------------------------------------------------------
657 void DrawDbgUI(PlayerController playerController);
658}
659
661class SCR_RespawnDiag<Class TReqComponent> : SCR_BaseRespawnDiag
662{
663 protected TReqComponent m_RequestComponent;
664
665 //------------------------------------------------------------------------------------------------
666 override void DrawDbgUI(PlayerController playerController)
667 {
668 if (m_RequestComponent == null)
669 m_RequestComponent = TReqComponent.Cast(playerController.FindComponent(TReqComponent));
670
671 if (!m_RequestComponent)
672 return;
673
674 int playerId = m_RequestComponent.GetPlayerId();
675 string label = string.Format("%1 [playerId: %2, playerName: %3])",
676 m_RequestComponent.Type().ToString(),
677 playerId,
678 GetGame().GetPlayerManager().GetPlayerName(playerId)
679 );
680
681 DbgUI.Begin(label);
682 {
683 DrawContent();
684 }
685 DbgUI.End();
686 }
687
688 //------------------------------------------------------------------------------------------------
689 protected void DrawContent()
690 {
691 SCR_SpawnHandlerComponent handlerComponent = m_RequestComponent.GetHandlerComponent();
692 if (handlerComponent != null)
693 DbgUI.Text(string.Format("Handler: %1", handlerComponent));
694 else
695 DbgUI.Text("Handler: Not found!");
696
697 DbgUI.Text(string.Format("Data: %1", m_RequestComponent.GetDataType()));
698
699 if (DbgUI.Button("Can Request"))
700 OnAskPressed();
701
702 if (DbgUI.Button("Do Request"))
703 OnRequestPressed();
704 }
705
706 //------------------------------------------------------------------------------------------------
707 protected void OnAskPressed()
708 {
709 SCR_SpawnData data = CreateData();
710 m_RequestComponent.CanRequestRespawn(data);
711 }
712
713 //------------------------------------------------------------------------------------------------
714 protected void OnRequestPressed()
715 {
716 SCR_SpawnData data = CreateData();
717 m_RequestComponent.RequestRespawn(data);
718 }
719
720 //------------------------------------------------------------------------------------------------
721 protected SCR_SpawnData CreateData()
722 {
723 Debug.Error("Not implemented");
724 return null;
725 }
726}
727#endif
ArmaReforgerScripted GetGame()
Definition game.c:1398
SCR_BaseGameMode GetGameMode()
RplComponent m_RplComponent
vector position
SCR_ESpawnResult
Get all prefabs that have the spawner data
SCR_FastTravelComponentClass m_PlayerController
SCR_FreeSpawnRequestComponentClass SCR_SpawnRequestComponentClass GetHandlerType()
override GetDataType()
SCR_PlayerDeployMenuHandlerComponentClass m_RespawnComponent
Component responsible for deploy menu management.
void RequestRespawn()
Sends a respawn request based on assigned loadout and selected spawn point.
void SCR_RespawnComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
bool CanFinalize_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
SCR_ESpawnResult FinalizeRequest_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
void OnFinalizeBegin_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnData data, IEntity entity)
Called when the finalisation process begins.
void SendFinalizationBegin_S()
Send a notification from the authority that the finalisation has started.
void Rpc_StartPreload_O(vector position)
bool DoRequestRespawn(SCR_SpawnData data)
void Rpc_NotifyPreloadFinished_S()
SCR_SpawnLockComponent GetLock()
void Rpc_OnFinalizationBegin_O()
void ProcessRequest_S(SCR_SpawnData data)
void ~SCR_SpawnRequestComponent()
void ProcessCanRequest_S(SCR_SpawnData data)
void StartSpawnPreload(vector position)
void Rpc_SendResponse_O(SCR_ESpawnResult response)
bool IsPreloading()
bool DoCanRequestRespawn(SCR_SpawnData data)
void Rpc_SendCanResponse_O(SCR_ESpawnResult response)
SCR_SpawnHandlerComponent GetHandlerComponent()
SCR_ChimeraAIAgent FindAIAgent(IEntity entity)
void NotifyPreloadFinished_S()
void SendResponse_S(SCR_ESpawnResult response, SCR_SpawnData data)
void SendCanResponse_S(SCR_ESpawnResult response, SCR_SpawnData data)
void Rpc_NotifyPreloadStarted_S()
void NotifyPreloadStarted_S()
void AwaitFinalization_S(SCR_SpawnHandlerComponent handler, SCR_SpawnData data, IEntity spawnedEntity)
int Type
Super root of all classes in Enforce script.
Definition Types.c:35
Definition Debug.c:13
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
proto external Managed FindComponent(typename typeName)
OnPreloadFinishedInvoker GetOnPreloadFinished()
void StartSpawnPreload(vector position)
void SetPlayerPending_S(int playerId)
bool IsOwner()
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
proto external PlayerController GetPlayerController()
proto external bool CanRequestRespawn()
proto external RespawnComponent GetRespawnComponent()
proto external int GetPlayerId()
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
proto external string ToString()
Plain C++ pointer, no weak pointers, no memory management.
void Debug()
Definition Types.c:327