playerstatbase.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. class PlayerStatBase
  2. {
  3. protected Man m_Player;
  4. int m_Type;
  5. void OnStoreSave( ParamsWriteContext ctx );
  6. bool OnStoreLoad( ParamsReadContext ctx);
  7. void OnRPC(ParamsReadContext ctx);
  8. void OnAfterStoreLoad();
  9. float Get();
  10. string GetLabel();
  11. void SetByFloat(float value);
  12. void SetByFloatEx(float value, string system = "" );
  13. bool IsSynced();
  14. array<PlayerStatRecord> GetRecords();
  15. void Init(int id);
  16. void SerializeValue(array<ref StatDebugObject> objects, int flags);
  17. float GetNormalized();
  18. float GetMax();
  19. float GetMin();
  20. int GetType()
  21. {
  22. return m_Type;
  23. }
  24. void SetPlayer(Man player)
  25. {
  26. m_Player = player;
  27. }
  28. }
  29. class PlayerStat<Class T> extends PlayerStatBase
  30. {
  31. protected T m_MinValue;
  32. protected T m_MaxValue;
  33. protected T m_Value;
  34. protected T m_ValueLastSynced;
  35. protected string m_ValueLabel;
  36. protected int m_Flags;
  37. ref array<PlayerStatRecord> m_Records;
  38. void PlayerStat(T min, T max, T init, string label, int flags)
  39. {
  40. m_MinValue = min;
  41. m_MaxValue = max;
  42. m_Value = init;
  43. m_ValueLabel = label;
  44. m_Flags = flags;
  45. m_Records = new array<PlayerStatRecord>;
  46. }
  47. override void Init(int id)
  48. {
  49. m_Type = id;
  50. }
  51. override void SerializeValue(array<ref StatDebugObject> objects, int flags)
  52. {
  53. objects.Insert(new StatDebugObject(GetLabel(), Get(), eRemoteStatType.PLAYER_STATS));
  54. }
  55. override bool IsSynced()
  56. {
  57. return m_Flags & EPSstatsFlags.SYNCED == EPSstatsFlags.SYNCED;
  58. }
  59. override void OnRPC(ParamsReadContext ctx)
  60. {
  61. if (IsSynced())
  62. {
  63. Param2<int, T> data;
  64. if (ctx.Read(data))
  65. {
  66. int type = data.param1;
  67. T value = data.param2;
  68. if (m_Type == type)
  69. Set(value);
  70. }
  71. }
  72. }
  73. void Set(T value, string system = "")
  74. {
  75. if (value > m_MaxValue)
  76. {
  77. m_Value = m_MaxValue;
  78. }
  79. else if (value < m_MinValue)
  80. {
  81. m_Value = m_MinValue;
  82. }
  83. else
  84. {
  85. m_Value = value;
  86. }
  87. #ifdef SERVER
  88. if (IsSynced())
  89. {
  90. if (m_ValueLastSynced != m_Value)
  91. {
  92. //! limits the sync for bigger changes of float stats
  93. if (T == float && Math.AbsFloat(m_ValueLastSynced - m_Value) < 0.05)
  94. return;
  95. Param2<int, T> data = new Param2<int, T>(-1, 0);
  96. data.param1 = m_Type;
  97. data.param2 = m_Value;
  98. m_Player.RPCSingleParam(ERPCs.RPC_PLAYER_STAT, data, true, m_Player.GetIdentity());
  99. m_ValueLastSynced = m_Value;
  100. }
  101. }
  102. #endif
  103. }
  104. void SetByFloat(float value, string system = "")
  105. {
  106. T f = value;
  107. Set(f, system);
  108. }
  109. override void SetByFloatEx(float value, string system = "")
  110. {
  111. SetByFloat(value, system);
  112. }
  113. void Add( T value, string system = "" )
  114. {
  115. Set(m_Value+value, system);
  116. }
  117. override float Get()
  118. {
  119. return m_Value;
  120. }
  121. override string GetLabel()
  122. {
  123. return m_ValueLabel;
  124. }
  125. override float GetMax()
  126. {
  127. return m_MaxValue;
  128. }
  129. override float GetMin()
  130. {
  131. return m_MinValue;
  132. }
  133. override float GetNormalized()
  134. {
  135. return Math.InverseLerp(GetMin(), GetMax(), Get());
  136. }
  137. override array<PlayerStatRecord> GetRecords()
  138. {
  139. return m_Records;
  140. }
  141. void CreateRecord(float value, string system)
  142. {
  143. m_Records.Insert( new PlayerStatRecord(value, GetGame().GetTime(), system ) );
  144. }
  145. override void OnStoreSave(ParamsWriteContext ctx)
  146. {
  147. ctx.Write(m_Value);
  148. }
  149. override bool OnStoreLoad( ParamsReadContext ctx)
  150. {
  151. T value;
  152. if (ctx.Read(value))
  153. {
  154. m_Value = value;
  155. }
  156. else
  157. {
  158. return false;
  159. }
  160. return true;
  161. }
  162. override void OnAfterStoreLoad()
  163. {
  164. // forces the sync
  165. Set(Get());
  166. }
  167. //! DEPRECATED
  168. PlayerStats m_Manager;
  169. PlayerStats GetManager()
  170. {
  171. return m_Manager;
  172. }
  173. }