pluginremoteplayerdebugserver.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. class PluginRemotePlayerDebugServer extends PluginBase
  2. {
  3. ref set<PlayerBase> m_ClientList = new set<PlayerBase>;
  4. ref array<ref RemotePlayerStatDebug> m_PlayerDebugStats = new array<ref RemotePlayerStatDebug>;
  5. ref map<PlayerBase, ref RemotePlayerDamageDebug> m_PlayerDebugDamage = new map<PlayerBase, ref RemotePlayerDamageDebug>;
  6. float m_AccuTime;
  7. const int INTERVAL = 1;
  8. eRemoteDebugType m_DebugType;
  9. bool m_Watching;
  10. override void OnUpdate(float delta_time)
  11. {
  12. #ifdef SERVER
  13. if ( m_ClientList.Count() != 0 )
  14. {
  15. m_AccuTime += delta_time;
  16. if ( m_AccuTime > INTERVAL )
  17. {
  18. m_AccuTime = 0;
  19. SendDebug();
  20. }
  21. }
  22. #endif
  23. }
  24. void SetWatching(bool enable)
  25. {
  26. m_Watching = enable;
  27. }
  28. bool GetWatching()
  29. {
  30. return m_Watching;
  31. }
  32. void GatherPlayerInfo()
  33. {
  34. array<Man> players = new array<Man>;
  35. GetGame().GetPlayers(players);
  36. m_PlayerDebugStats.Clear();
  37. foreach (Man playerMan : players)
  38. {
  39. PlayerBase player = PlayerBase.Cast(playerMan);
  40. RemotePlayerStatDebug rpd = new RemotePlayerStatDebug(player);
  41. m_PlayerDebugStats.Insert(rpd);
  42. }
  43. }
  44. void SendDebug()
  45. {
  46. #ifdef DIAG_DEVELOPER
  47. GatherPlayerInfo();
  48. array<ref RemotePlayerDamageDebug> player_damage = new array<ref RemotePlayerDamageDebug>;
  49. for(int i = 0; i < m_ClientList.Count(); ++i)
  50. {
  51. PlayerBase player = m_ClientList[i];
  52. if (player)
  53. {
  54. ScriptRPC rpc = new ScriptRPC();
  55. rpc.Write(m_PlayerDebugStats);
  56. foreach (PlayerBase player2, RemotePlayerDamageDebug value : m_PlayerDebugDamage)
  57. {
  58. if (player2)
  59. {
  60. player_damage.Insert(value);
  61. }
  62. //int xs = 1 + 1;
  63. }
  64. rpc.Write(player_damage);
  65. rpc.Send(player, ERPCs.DEV_PLAYER_DEBUG_DATA, true, player.GetIdentity());
  66. m_PlayerDebugDamage.Clear();
  67. }
  68. else
  69. {
  70. m_ClientList.Remove(i);
  71. --i;
  72. }
  73. }
  74. #endif
  75. }
  76. void OnDamageEvent(PlayerBase player, TotalDamageResult damageResult)
  77. {
  78. if ( !GetWatching() || !damageResult )
  79. return;
  80. float damage_global = damageResult.GetDamage("","");
  81. float damage_blood = damageResult.GetDamage("","Blood");
  82. float damage_shock = damageResult.GetDamage("","Shock");
  83. if ( m_PlayerDebugDamage.Contains(player) )
  84. {
  85. m_PlayerDebugDamage.Get(player).AddDamage( damage_global, damage_blood, damage_shock );
  86. }
  87. else
  88. {
  89. RemotePlayerDamageDebug rpdd = new RemotePlayerDamageDebug(player);
  90. rpdd.AddDamage(damage_global, damage_blood, damage_shock);
  91. m_PlayerDebugDamage.Insert(player, rpdd);
  92. }
  93. }
  94. void OnRequestReceived(PlayerBase player, bool enable)
  95. {
  96. int index = m_ClientList.Find(player);
  97. if (enable)
  98. {
  99. m_ClientList.Insert(player);
  100. SetWatching(true);
  101. }
  102. else if (index != -1 && m_ClientList.Count() != 0)
  103. {
  104. m_ClientList.Remove(index);
  105. }
  106. if ( m_ClientList.Count() == 0 )
  107. {
  108. SetWatching(false);
  109. }
  110. }
  111. void OnRPC(ParamsReadContext ctx, PlayerBase player)
  112. {
  113. bool enable;
  114. ctx.Read(enable);
  115. OnRequestReceived(player, enable);
  116. }
  117. }