geysertrigger.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. class GeyserTrigger : EffectTrigger
  2. {
  3. const float MOUTH_ADJUST_RADIUS = 0.2; // maxium radius geyser effect can move when using randomized position adjustment
  4. const string SOUND_BUBBLING = "Boiling_Done_SoundSet";
  5. const string SOUND_ERUPTION = "pour_Water_Pot_SoundSet";
  6. const string SOUND_ERUPTION_TALL = "pour_Water_WatterBottle_SoundSet";
  7. protected bool m_bIsDormant;
  8. protected bool m_bIsErupting;
  9. protected bool m_bIsEruptingTall;
  10. protected float m_AdjustedX;
  11. protected float m_AdjustedY;
  12. protected vector m_DefaultPosition;
  13. protected EGeyserState m_GeyserState = EGeyserState.DORMANT; // synchronized state
  14. protected ParticleSource m_GeyserBubblesParticle;
  15. protected ParticleSource m_GeyserParticle;
  16. protected ParticleSource m_GeyserTallParticle;
  17. protected EffectSound m_SoundBubbling;
  18. protected EffectSound m_SoundEruption;
  19. protected EffectSound m_SoundEruptionSecondary;
  20. void GeyserTrigger()
  21. {
  22. RegisterNetSyncVariableInt("m_GeyserState", 0, 32);
  23. }
  24. override void EEInit()
  25. {
  26. super.EEInit();
  27. m_DefaultPosition = GetPosition();
  28. m_DefaultPosition[1] = GetGame().SurfaceY(m_DefaultPosition[0], m_DefaultPosition[2]);
  29. m_bIsDormant = false;
  30. m_bIsErupting = false;
  31. m_bIsEruptingTall = false;
  32. RandomizeMouthPos();
  33. }
  34. override string GetDisplayName()
  35. {
  36. return "#STR_geyser";
  37. }
  38. override void EEDelete( EntityAI parent )
  39. {
  40. StopEffects();
  41. super.EEDelete(parent);
  42. }
  43. override void OnEnterServerEvent( TriggerInsider insider )
  44. {
  45. super.OnEnterServerEvent(insider);
  46. if (insider && (m_GeyserState & EGeyserState.ERUPTING_PRIMARY))
  47. {
  48. EntityAI entity = EntityAI.Cast(insider.GetObject());
  49. if (entity)
  50. entity.ProcessDirectDamage(DamageType.CUSTOM, this, "", "HeatDamage", "0 0 0", 1000);
  51. }
  52. }
  53. override void OnLeaveServerEvent( TriggerInsider insider )
  54. {
  55. super.OnLeaveServerEvent(insider);
  56. }
  57. override void OnEnterClientEvent( TriggerInsider insider )
  58. {
  59. super.OnEnterClientEvent(insider);
  60. }
  61. override void OnLeaveClientEvent( TriggerInsider insider )
  62. {
  63. super.OnLeaveClientEvent(insider);
  64. }
  65. override void OnVariablesSynchronized()
  66. {
  67. super.OnVariablesSynchronized();
  68. UpdateGeyserState();
  69. }
  70. // Updated from OnVariablesSynchronized
  71. protected void UpdateGeyserState()
  72. {
  73. if (m_GeyserState == EGeyserState.DORMANT && !m_bIsDormant)
  74. {
  75. if (IsSubmerged())
  76. {
  77. RandomizeMouthPos();
  78. m_GeyserBubblesParticle = ParticleManager.GetInstance().PlayInWorld(ParticleList.GEYSER_BUBBLES, GetAdjustedPosition());
  79. m_SoundBubbling = SEffectManager.PlaySound(SOUND_BUBBLING, GetAdjustedPosition(), 0, 0, true);
  80. }
  81. m_bIsDormant = true;
  82. }
  83. else if (m_GeyserState != EGeyserState.DORMANT && m_bIsDormant)
  84. {
  85. m_GeyserBubblesParticle.Stop();
  86. m_SoundBubbling.Stop();
  87. m_bIsDormant = false;
  88. }
  89. if ((m_GeyserState & EGeyserState.ERUPTING_PRIMARY) && !m_bIsErupting)
  90. {
  91. vector posErupt = GetAdjustedPosition(3);
  92. m_GeyserParticle = ParticleManager.GetInstance().PlayInWorld(ParticleList.GEYSER_NORMAL, posErupt);
  93. m_SoundEruption = SEffectManager.PlaySound(SOUND_ERUPTION, posErupt, 0, 0, true);
  94. m_bIsErupting = true;
  95. }
  96. else if (((m_GeyserState & EGeyserState.ERUPTING_PRIMARY) == 0) && m_bIsErupting)
  97. {
  98. m_GeyserParticle.StopParticle();
  99. m_SoundEruption.Stop();
  100. m_bIsErupting = false;
  101. }
  102. if ((m_GeyserState & EGeyserState.ERUPTING_SECONDARY) && !m_bIsEruptingTall)
  103. {
  104. vector posTall = GetAdjustedPosition(5);
  105. m_GeyserTallParticle = ParticleManager.GetInstance().PlayInWorld(ParticleList.GEYSER_STRONG, posTall);
  106. m_SoundEruptionSecondary = SEffectManager.PlaySound(SOUND_ERUPTION_TALL, posTall, 0, 0, true);
  107. m_bIsEruptingTall = true;
  108. }
  109. else if (((m_GeyserState & EGeyserState.ERUPTING_SECONDARY) == 0) && m_bIsEruptingTall)
  110. {
  111. m_GeyserTallParticle.StopParticle();
  112. m_SoundEruptionSecondary.Stop();
  113. m_bIsEruptingTall = false;
  114. }
  115. }
  116. // Slightly adjust position of geyser particles between eruptions
  117. protected void RandomizeMouthPos()
  118. {
  119. m_AdjustedX = Math.RandomFloat(m_DefaultPosition[0] - MOUTH_ADJUST_RADIUS, m_DefaultPosition[0] + MOUTH_ADJUST_RADIUS);
  120. m_AdjustedY = Math.RandomFloat(m_DefaultPosition[2] - MOUTH_ADJUST_RADIUS, m_DefaultPosition[2] + MOUTH_ADJUST_RADIUS);
  121. }
  122. protected vector GetAdjustedPosition(float height = 0)
  123. {
  124. vector pos = m_DefaultPosition;
  125. pos[1] = pos[1] + height;
  126. if (IsSubmerged())
  127. {
  128. pos[0] = m_AdjustedX;
  129. pos[2] = m_AdjustedY;
  130. }
  131. return pos;
  132. }
  133. void StopEffects()
  134. {
  135. if (m_bIsDormant)
  136. {
  137. m_GeyserBubblesParticle.StopParticle();
  138. m_SoundBubbling.Stop();
  139. m_bIsDormant = false;
  140. }
  141. if (m_bIsErupting)
  142. {
  143. m_GeyserParticle.StopParticle();
  144. m_SoundEruption.Stop();
  145. m_bIsErupting = false;
  146. }
  147. if (m_bIsEruptingTall)
  148. {
  149. m_GeyserTallParticle.StopParticle();
  150. m_SoundEruptionSecondary.Stop();
  151. m_bIsEruptingTall = false;
  152. }
  153. }
  154. void AddGeyserState(EGeyserState state)
  155. {
  156. m_GeyserState |= state;
  157. SetSynchDirty();
  158. }
  159. void RemoveGeyserState(EGeyserState state)
  160. {
  161. m_GeyserState &= ~state;
  162. SetSynchDirty();
  163. }
  164. EGeyserState GetGeyserState()
  165. {
  166. return m_GeyserState;
  167. }
  168. // override for differences in logic between land & submerged geysers
  169. bool IsSubmerged()
  170. {
  171. return true;
  172. }
  173. }