transfervalues.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. class TransferValues extends Managed
  2. {
  3. const int TYPE_HEALTH = 1;
  4. const int TYPE_BLOOD = 2;
  5. const float VALUE_CHECK_INTERVAL = 5;
  6. const float SENSITIVTY_PERCENTAGE = 1;//how much the value needs to change up/down from previous update to trigger a new update(in percent)
  7. const int BLOOD_THRESHOLD_LOW = 3000;
  8. PlayerBase m_Player;
  9. float m_TimeSinceLastTick = VALUE_CHECK_INTERVAL + 1;
  10. float m_LastHealthUpdate;
  11. float m_LastBloodUpdate;
  12. //float m_CumulatedHealthDiff;
  13. //float m_CumulatedBloodDiff;
  14. float m_HealthMaxValue;
  15. float m_BloodMaxValue;
  16. float m_BloodClient;
  17. float m_HealthClient;
  18. protected bool m_InitialSyncSent;
  19. void TransferValues(PlayerBase player)
  20. {
  21. m_Player = player;
  22. m_InitialSyncSent = false;
  23. Init();
  24. }
  25. void Init()
  26. {
  27. m_LastHealthUpdate = 0;
  28. m_LastBloodUpdate = 0;
  29. m_HealthMaxValue = m_Player.GetMaxHealth("", "Health");
  30. m_BloodMaxValue = m_Player.GetMaxHealth("", "Blood");
  31. m_BloodClient = 0;
  32. m_HealthClient = 0;
  33. }
  34. void OnScheduledTick(float deltatime)
  35. {
  36. #ifdef DIAG_DEVELOPER
  37. #ifndef SERVER
  38. ShowDebugValues(DiagMenu.GetBool(DiagMenuIDs.TRANSFER_VALUES_SHOW));
  39. #endif
  40. #endif
  41. if ( GetGame().IsClient() ) return;
  42. m_TimeSinceLastTick += deltatime;
  43. if (!m_InitialSyncSent)
  44. {
  45. SendInitValues();
  46. }
  47. else if ( m_TimeSinceLastTick > VALUE_CHECK_INTERVAL )
  48. {
  49. /*
  50. Print(m_TimeSinceLastTick.ToString());
  51. Print(VALUE_CHECK_INTERVAL.ToString());
  52. Print("--------------");
  53. */
  54. m_TimeSinceLastTick = 0;
  55. CheckValues();
  56. // send sync junctures if necessary
  57. // TODO: !!!! event is sent too often, please fix it
  58. /*
  59. float damage = 1 - m_Player.GetHealth("", "") / 100;
  60. DayZPlayerSyncJunctures.SendInjury(m_Player, true, damage);
  61. */
  62. }
  63. }
  64. void CheckValues()
  65. {
  66. CheckHealth();
  67. CheckBlood();
  68. }
  69. float GetBlood()
  70. {
  71. return m_BloodClient;
  72. }
  73. float GetHealth()
  74. {
  75. return m_HealthClient;
  76. }
  77. void CheckHealth()
  78. {
  79. float health_current = m_Player.GetHealth("","Health");
  80. float health_normalized = health_current / m_HealthMaxValue;
  81. float difference_normalized = health_normalized - m_LastHealthUpdate;
  82. float diff_abs = Math.AbsFloat(difference_normalized);
  83. if ( diff_abs > ( SENSITIVTY_PERCENTAGE / 100 ) )
  84. {
  85. SendValue(TYPE_HEALTH, health_normalized);
  86. m_LastHealthUpdate = health_normalized;
  87. }
  88. }
  89. void CheckBlood()
  90. {
  91. float blood_current = m_Player.GetHealth("","Blood");
  92. //float blood_normalized = blood_current / m_BloodMaxValue;
  93. float blood_normalized = Math.InverseLerp(BLOOD_THRESHOLD_LOW, m_BloodMaxValue, blood_current);
  94. blood_normalized = Math.Clamp(blood_normalized,0,1);
  95. float difference_normalized = blood_normalized - m_LastBloodUpdate;
  96. float diff_abs = Math.AbsFloat(difference_normalized);
  97. if ( diff_abs > ( SENSITIVTY_PERCENTAGE /100 ) )
  98. {
  99. SendValue(TYPE_BLOOD, blood_normalized);
  100. m_LastBloodUpdate = blood_normalized;
  101. }
  102. }
  103. //! Sends values on object creation
  104. void SendInitValues()
  105. {
  106. m_InitialSyncSent = true;
  107. //HP
  108. float health_current = m_Player.GetHealth("","Health");
  109. float health_normalized = health_current / m_HealthMaxValue;
  110. SendValue(TYPE_HEALTH, health_normalized);
  111. m_LastHealthUpdate = health_normalized;
  112. //Blood
  113. float blood_current = m_Player.GetHealth("","Blood");
  114. float blood_normalized = Math.InverseLerp(BLOOD_THRESHOLD_LOW, m_BloodMaxValue, blood_current);
  115. blood_normalized = Math.Clamp(blood_normalized,0,1);
  116. SendValue(TYPE_BLOOD, blood_normalized);
  117. m_LastBloodUpdate = blood_normalized;
  118. }
  119. void SendValue(int value_type, float value)
  120. {
  121. CachedObjectsParams.PARAM2_INT_FLOAT.param1 = value_type;
  122. CachedObjectsParams.PARAM2_INT_FLOAT.param2 = value;
  123. GetGame().RPCSingleParam(m_Player, ERPCs.RPC_DAMAGE_VALUE_SYNC, CachedObjectsParams.PARAM2_INT_FLOAT, true, m_Player.GetIdentity());
  124. }
  125. void ReceiveValue(int value_type, float value)
  126. {
  127. if ( value_type == TYPE_HEALTH )
  128. {
  129. m_HealthClient = value;
  130. }
  131. else if ( value_type == TYPE_BLOOD )
  132. {
  133. m_BloodClient = value;
  134. }
  135. }
  136. void OnRPC(ParamsReadContext ctx)
  137. {
  138. ctx.Read(CachedObjectsParams.PARAM2_INT_FLOAT);
  139. int value_type = CachedObjectsParams.PARAM2_INT_FLOAT.param1;
  140. float value = CachedObjectsParams.PARAM2_INT_FLOAT.param2;
  141. ReceiveValue(value_type, value);
  142. }
  143. void ShowDebugValues(bool show)
  144. {
  145. #ifdef DIAG_DEVELOPER
  146. if ( show )
  147. {
  148. DbgUI.BeginCleanupScope();
  149. DbgUI.Begin("Values", 50, 50);
  150. DbgUI.Text("Blood: " + m_BloodClient.ToString());
  151. DbgUI.Text("Health: " + m_HealthClient.ToString());
  152. DbgUI.End();
  153. DbgUI.EndCleanupScope();
  154. }
  155. else
  156. {
  157. DbgUI.BeginCleanupScope();
  158. DbgUI.Begin("Values", 50, 50);
  159. DbgUI.End();
  160. DbgUI.EndCleanupScope();
  161. }
  162. #endif
  163. }
  164. }