undergroundtrigger.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //! This entity exists both client andserver side
  2. //! when it enters into player's bubble and gets instantiated client-side, it will locally spawn UndergroundTrigger, which is the actual trigger
  3. class UndergroundTriggerCarrier extends UndergroundTriggerCarrierBase
  4. {
  5. ref JsonUndergroundAreaTriggerData m_Data;
  6. UndergroundTrigger m_Trigger;
  7. void UndergroundTriggerCarrier()
  8. {
  9. RegisterNetSyncVariableInt("m_TriggerIndex", -1, 255);
  10. }
  11. void ~UndergroundTriggerCarrier()
  12. {
  13. if (m_Trigger && !m_Trigger.IsSetForDeletion() && GetGame())
  14. {
  15. //RemoveChild(m_Trigger);
  16. m_Trigger.Delete();
  17. }
  18. }
  19. override void OnVariablesSynchronized()
  20. {
  21. super.OnVariablesSynchronized();
  22. if (!m_Trigger)
  23. {
  24. SpawnTrigger();
  25. }
  26. }
  27. bool CanSpawnTrigger()
  28. {
  29. return UndergroundAreaLoader.m_JsonData && m_TriggerIndex != -1;
  30. }
  31. void RequestDelayedTriggerSpawn()
  32. {
  33. //Print("RequestDelayedTriggerSpawn() " + this);
  34. GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(SpawnTrigger, 100);
  35. }
  36. void SpawnTrigger()
  37. {
  38. if (!CanSpawnTrigger())
  39. {
  40. RequestDelayedTriggerSpawn();
  41. return;
  42. }
  43. if (UndergroundAreaLoader.m_JsonData.Triggers && UndergroundAreaLoader.m_JsonData.Triggers.IsValidIndex(m_TriggerIndex))
  44. {
  45. JsonUndergroundAreaTriggerData data = UndergroundAreaLoader.m_JsonData.Triggers[m_TriggerIndex];
  46. UndergroundTrigger trigger = UndergroundTrigger.Cast(GetGame().CreateObjectEx( "UndergroundTrigger", GetPosition(), ECE_LOCAL ));
  47. if (trigger)
  48. {
  49. #ifdef DIAG_DEVELOPER
  50. trigger.m_Local = true;
  51. #endif
  52. trigger.SetPosition(vector.Zero);
  53. AddChild(trigger,-1);
  54. trigger.Init(data);
  55. m_Trigger = trigger;
  56. }
  57. }
  58. }
  59. }
  60. enum EUndergroundTriggerType
  61. {
  62. UNDEFINED,
  63. TRANSITIONING,
  64. OUTER,
  65. INNER
  66. }
  67. class UndergroundTrigger : ManTrigger
  68. {
  69. ref JsonUndergroundAreaTriggerData m_Data;
  70. EUndergroundTriggerType m_Type;
  71. float m_Accommodation;
  72. float m_InterpolationSpeed;
  73. void Init(JsonUndergroundAreaTriggerData data)
  74. {
  75. m_Data = data;
  76. //Print("Spawning trigger " + this + "at pos: " + GetPosition());
  77. vector extMax = data.GetSize() * 0.5;
  78. vector extMin = -extMax;
  79. SetExtents(extMin, extMax);
  80. m_Accommodation = data.EyeAccommodation;
  81. m_InterpolationSpeed = data.InterpolationSpeed;
  82. if (data.Breadcrumbs && data.Breadcrumbs.Count() > 0) //TODO: simpler check
  83. {
  84. if (data.Breadcrumbs.Count() > 32)
  85. {
  86. ErrorEx("max 'Breadcrumb' count is 32, found: " + data.Breadcrumbs.Count());
  87. }
  88. m_Type = EUndergroundTriggerType.TRANSITIONING;
  89. }
  90. else
  91. {
  92. if (m_Accommodation == 1)
  93. {
  94. m_Type = EUndergroundTriggerType.OUTER;
  95. }
  96. else
  97. {
  98. m_Type = EUndergroundTriggerType.INNER;
  99. }
  100. }
  101. }
  102. override protected bool CanAddObjectAsInsider(Object object)
  103. {
  104. if (!super.CanAddObjectAsInsider(object))
  105. {
  106. return false;
  107. }
  108. return ManBase.Cast(object).IsControlledPlayer();
  109. }
  110. override void EOnInit(IEntity other, int extra)
  111. {
  112. //disable parent behaviour
  113. }
  114. #ifdef DEVELOPER
  115. override protected void OnEnterServerEvent(TriggerInsider insider)
  116. {
  117. #ifndef SERVER//to make it work in single during development
  118. OnEnterClientEvent(insider);
  119. #endif
  120. }
  121. override protected void OnLeaveServerEvent(TriggerInsider insider)
  122. {
  123. #ifndef SERVER//to make it work in single during development
  124. OnLeaveClientEvent(insider);
  125. #endif
  126. }
  127. #endif
  128. override protected void OnEnterClientEvent(TriggerInsider insider)
  129. {
  130. //Print("OnEnterClientEvent " + this);
  131. //return;
  132. PlayerBase player = PlayerBase.Cast(insider.GetObject());
  133. if (player)
  134. {
  135. UndergroundHandlerClient handler = player.GetUndergroundHandler();
  136. if (handler)
  137. {
  138. handler.OnTriggerEnter(this);
  139. }
  140. }
  141. }
  142. override protected void OnLeaveClientEvent(TriggerInsider insider)
  143. {
  144. //Print("OnLeaveClientEvent " + this);
  145. //return;
  146. PlayerBase player = PlayerBase.Cast(insider.GetObject());
  147. if (player)
  148. {
  149. UndergroundHandlerClient handler = player.GetUndergroundHandler();
  150. if (handler)
  151. {
  152. handler.OnTriggerLeave(this);
  153. }
  154. }
  155. }
  156. };