volcanictrigger.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //! Volcanic area trigger
  2. class VolcanicTrigger : EffectTrigger
  3. {
  4. static VolcanicTrigger 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 string GetDisplayName()
  18. {
  19. return "#STR_volcanicarea";
  20. }
  21. override void EEDelete( EntityAI parent )
  22. {
  23. if (m_VaporParticle)
  24. m_VaporParticle.Stop();
  25. super.EEDelete(parent);
  26. }
  27. override void OnEnterServerEvent( TriggerInsider insider )
  28. {
  29. super.OnEnterServerEvent(insider);
  30. if (insider)
  31. {
  32. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  33. if (playerInsider)
  34. playerInsider.SetInEffectAreaTypeFlag(EEffectAreaType.VOLCANIC);
  35. }
  36. }
  37. override void OnLeaveServerEvent( TriggerInsider insider )
  38. {
  39. super.OnLeaveServerEvent(insider);
  40. if (insider)
  41. {
  42. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  43. if (playerInsider)
  44. playerInsider.UnsetInEffectAreaTypeFlag(EEffectAreaType.VOLCANIC);
  45. }
  46. }
  47. override void OnEnterClientEvent( TriggerInsider insider )
  48. {
  49. super.OnEnterClientEvent(insider);
  50. if (insider)
  51. {
  52. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  53. if (playerInsider)
  54. playerInsider.SetInEffectAreaTypeFlag(EEffectAreaType.VOLCANIC);
  55. }
  56. }
  57. override void OnLeaveClientEvent( TriggerInsider insider )
  58. {
  59. super.OnLeaveClientEvent(insider);
  60. if (insider)
  61. {
  62. PlayerBase playerInsider = PlayerBase.Cast(insider.GetObject());
  63. if (playerInsider)
  64. playerInsider.UnsetInEffectAreaTypeFlag(EEffectAreaType.VOLCANIC);
  65. }
  66. }
  67. protected void SpawnVaporEffect()
  68. {
  69. vector pos = GetPosition();
  70. pos[1] = GetGame().SurfaceY(pos[0], pos[2]) + 0.5;
  71. m_VaporParticle = ParticleManager.GetInstance().PlayInWorld(ParticleList.VOLCANO, pos);
  72. int randSize = Math.RandomIntInclusive(-1,2);
  73. int randRate = Math.RandomIntInclusive(-1,2);
  74. m_VaporParticle.IncrementParticleParam(EmitorParam.SIZE, randSize);
  75. m_VaporParticle.IncrementParticleParam(EmitorParam.BIRTH_RATE, randRate);
  76. }
  77. // Server side effect application
  78. static void ApplyEffects(PlayerBase player)
  79. {
  80. player.ProcessDirectDamage(DamageType.CUSTOM, m_SourceDamageInstance, "", "HeatDamage", "0 0 0", HEAT_DAMAGE_MULTIPLIER);
  81. }
  82. }