geysertrigger.c 4.9 KB

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