hotspringtrigger.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //! Hot spring area trigger
  2. class HotSpringTrigger : EffectTrigger
  3. {
  4. static HotSpringTrigger m_SourceDamageInstance; // this is used only server side for logging damage source in admin log
  5. static const float HEAT_DAMAGE_MULTIPLIER = 5;
  6. static const float HEAT_DAMAGE_TICK_TIME = 2;
  7. protected ParticleSource m_VaporParticle;
  8. override void EEInit()
  9. {
  10. if (GetGame().IsServer() && !m_SourceDamageInstance)
  11. m_SourceDamageInstance = this;
  12. super.EEInit();
  13. #ifndef SERVER
  14. SpawnVaporEffect();
  15. #endif
  16. }
  17. override void EEDelete( EntityAI parent )
  18. {
  19. if (m_VaporParticle)
  20. m_VaporParticle.Stop();
  21. super.EEDelete(parent);
  22. }
  23. override void OnEnterServerEvent( TriggerInsider insider )
  24. {
  25. super.OnEnterServerEvent(insider);
  26. if (insider)
  27. {
  28. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  29. if (playerInsider)
  30. playerInsider.SetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
  31. }
  32. }
  33. override void OnLeaveServerEvent( TriggerInsider insider )
  34. {
  35. super.OnLeaveServerEvent(insider);
  36. if (insider)
  37. {
  38. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  39. if (playerInsider)
  40. playerInsider.UnsetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
  41. }
  42. }
  43. override void OnEnterClientEvent( TriggerInsider insider )
  44. {
  45. super.OnEnterClientEvent(insider);
  46. if (insider)
  47. {
  48. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  49. if (playerInsider)
  50. playerInsider.SetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
  51. }
  52. }
  53. override void OnLeaveClientEvent( TriggerInsider insider )
  54. {
  55. super.OnLeaveClientEvent(insider);
  56. if (insider)
  57. {
  58. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  59. if (playerInsider)
  60. playerInsider.UnsetInEffectAreaTypeFlag(EEffectAreaType.HOT_SPRING);
  61. }
  62. }
  63. protected void SpawnVaporEffect()
  64. {
  65. vector pos = GetPosition();
  66. pos[1] = GetGame().SurfaceY(pos[0], pos[2]) + 0.5;
  67. m_VaporParticle = ParticleManager.GetInstance().PlayInWorld(ParticleList.HOTPSRING_WATERVAPOR, pos);
  68. int randSize = Math.RandomIntInclusive(-1,2);
  69. int randRate = Math.RandomIntInclusive(-1,2);
  70. m_VaporParticle.IncrementParticleParam(EmitorParam.SIZE, randSize);
  71. m_VaporParticle.IncrementParticleParam(EmitorParam.BIRTH_RATE, randRate);
  72. }
  73. static void ApplyEffects(PlayerBase player)
  74. {
  75. float waterLevel = player.GetCurrentWaterLevel();
  76. if (waterLevel > 0.5)
  77. player.ProcessDirectDamage(DamageType.CUSTOM, m_SourceDamageInstance, "", "HeatDamage", "0 0 0", HEAT_DAMAGE_MULTIPLIER * waterLevel);
  78. }
  79. }