triggereffectmanager.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Used for Effect based triggers ( such as Contaminated areas )
  2. // Allows us to unify these triggers and treat Enter / Exit events as if all triggers were one
  3. class TriggerEffectManager
  4. {
  5. static ref TriggerEffectManager m_This;
  6. // Player map will only be handled client side as it is most relevant
  7. ref map<string, ref map<PlayerBase, int>> m_PlayerInsiderMap; // Used to keep track of which players are in which effects
  8. void TriggerEffectManager()
  9. {
  10. m_PlayerInsiderMap = new map<string, ref map<PlayerBase, int>>;
  11. }
  12. static void DestroyInstance()
  13. {
  14. m_This = null;
  15. }
  16. // This is a SINGLETON so, if we can't get the instance, we create it
  17. static TriggerEffectManager GetInstance()
  18. {
  19. if ( !m_This )
  20. m_This = new TriggerEffectManager();
  21. return m_This;
  22. }
  23. void RegisterTriggerType( EffectTrigger effectTrigger )
  24. {
  25. if ( !m_PlayerInsiderMap.Contains( effectTrigger.GetType() ) )
  26. {
  27. map<PlayerBase, int> playerMap = new map<PlayerBase, int>;
  28. m_PlayerInsiderMap.Insert( effectTrigger.GetType(), playerMap );
  29. //Debug.Log( "We have : " + m_PlayerInsiderMap.Count() + " triggers");
  30. }
  31. }
  32. // When a player enters a trigger using this class, we add player to map or increase its trigger count
  33. void OnPlayerEnter( notnull PlayerBase player, notnull EffectTrigger trigger )
  34. {
  35. string trigger_type = trigger.GetType();
  36. map<PlayerBase, int> playerMap;
  37. if ( m_PlayerInsiderMap.Find( trigger_type, playerMap) )
  38. {
  39. if ( playerMap )
  40. {
  41. if ( playerMap.Contains( player ) )
  42. {
  43. int newTriggerCount = playerMap.Get( player ) + 1;
  44. playerMap.Set( player, newTriggerCount );
  45. //Debug.Log("We increase the amount of triggers a player is in");
  46. }
  47. else
  48. {
  49. // First time this player enters this type of trigger, we set the trigger count to 1
  50. playerMap.Insert( player, 1 );
  51. if (trigger.GetEffectArea())
  52. trigger.GetEffectArea().OnPlayerEnterServer(player, trigger);
  53. //Debug.Log("We insert a player");
  54. }
  55. //m_PlayerInsiderMap.Set( trigger_type, playerMap );
  56. }
  57. else
  58. {
  59. // We didn't have the map yet, we create it and register this player in it
  60. playerMap = new map<PlayerBase, int>;
  61. playerMap.Insert( player, 1 );
  62. if (trigger.GetEffectArea())
  63. trigger.GetEffectArea().OnPlayerEnterServer(player, trigger);
  64. m_PlayerInsiderMap.Insert( trigger_type, playerMap );
  65. }
  66. }
  67. }
  68. void OnPlayerInsideEffectAreaEnter(PlayerBase player);
  69. void OnPlayerInsideEffectAreaExit(PlayerBase player);
  70. // Same as OnPlayerEnter, but we decrease trigger count on each trigger leave and remove player from map when count is 0
  71. void OnPlayerExit( notnull PlayerBase player, notnull EffectTrigger trigger )
  72. {
  73. string trigger_type = trigger.GetType();
  74. map<PlayerBase, int> playerMap;
  75. if ( m_PlayerInsiderMap.Find( trigger_type, playerMap ) && playerMap )
  76. {
  77. if ( playerMap.Contains( player ))
  78. {
  79. if( playerMap.Get( player ) > 1 )
  80. {
  81. //Debug.Log("We reduced the amount of triggers the player is in");
  82. playerMap.Set( player, playerMap.Get( player ) - 1 );
  83. }
  84. else
  85. {
  86. // The player left the last trigger of this type they were in
  87. playerMap.Remove( player );
  88. if (trigger.GetEffectArea())
  89. trigger.GetEffectArea().OnPlayerExitServer(player,trigger);
  90. player.RemoveCurrentEffectTrigger();
  91. //Debug.Log("We removed this player from this trigger type");
  92. }
  93. }
  94. //m_PlayerInsiderMap.Set( trigger_type, playerMap );
  95. }
  96. }
  97. bool IsPlayerInTriggerType( notnull PlayerBase player, notnull EffectTrigger trigger )
  98. {
  99. map<PlayerBase, int> playerMap;
  100. if ( m_PlayerInsiderMap.Find( trigger.GetType(), playerMap ) )
  101. {
  102. return playerMap != null && playerMap.Contains( player );
  103. }
  104. return false;
  105. }
  106. }