HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define VERSION "0.7.0"
  6.  
  7. //Maxplayers. I like it this way, not the "new g_Maxplayers = get_maxplayers() / for(i = 1; i < g_Maxplayers; i++)" way.
  8. #define MAXPLAYERS 32 + 1
  9.  
  10. //Handler think time
  11. #define HANDLER_THINK_TIME 0.01
  12.  
  13. //Time player can stay underwater, until he starts receiving damage
  14. #define UNDERWATER_MAX_TIME 12.012
  15.  
  16. //Lines in the oxygen bar
  17. #define BAR_LINES 12
  18.  
  19. //Time per line in oxygen bar
  20. #define TIME_PER_LINE UNDERWATER_MAX_TIME / BAR_LINES
  21.  
  22. //Bar array size // 6 - name 'oxygen' // 2 - '^n' // 2 - '[' and ']'
  23. #define BAR_STRING_LENGTH BAR_LINES + 6 + 2 + 2
  24.  
  25. //Oxygen bar chars.
  26. #define FULL_CHAR "|"
  27. #define EMPTY_CHAR "="
  28.  
  29. //pev_waterlevel 3 - head is underwater
  30. #define UNDERWATER 3
  31.  
  32. //Handler entity id
  33. new g_HandlerEnt
  34.  
  35. //Is player alive?
  36. new bool:g_PlayerAlive[MAXPLAYERS]
  37.  
  38. //Hold the time when player dived into the water
  39. new Float:g_PlayerWaterGametime[MAXPLAYERS]
  40.  
  41. //Holds the gametime of players last bar update.
  42. new Float:g_PlayerUpdateGametime[MAXPLAYERS]
  43.  
  44. public plugin_init() {
  45.  
  46. register_plugin("Oxygen Bar",VERSION,"shine")
  47.  
  48. register_cvar("oxygenbar",VERSION,FCVAR_SERVER|FCVAR_SPONLY)
  49.  
  50. //Events
  51. register_event("DeathMsg","PlayerDeath","a")
  52.  
  53. //Ham Forwards
  54. RegisterHam(Ham_Spawn,"player","PlayerSpawn",1)
  55. RegisterHam(Ham_Think,"info_target","HandlerThink",1)
  56.  
  57. //Make handler
  58. MakeHandler()
  59. }
  60.  
  61. public MakeHandler() {
  62.  
  63. g_HandlerEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
  64.  
  65. set_pev(g_HandlerEnt,pev_classname,"OxyHandler")
  66.  
  67. set_pev(g_HandlerEnt,pev_nextthink,get_gametime() + HANDLER_THINK_TIME)
  68. }
  69.  
  70. public client_disconnect(id) {
  71.  
  72. g_PlayerAlive[id] = false
  73.  
  74. g_PlayerWaterGametime[id] = 0.0
  75.  
  76. g_PlayerUpdateGametime[id] = 0.0
  77. }
  78.  
  79. public PlayerDeath() g_PlayerAlive[read_data(2)] = false
  80.  
  81. public PlayerSpawn(id) if(is_user_alive(id)) g_PlayerAlive[id] = true
  82.  
  83. public HandlerThink(Ent) {
  84.  
  85. if(Ent == g_HandlerEnt) {
  86.  
  87. static Float:Gametime, i, x
  88. Gametime = get_gametime()
  89.  
  90. set_hudmessage(255,0,0,-1.0,0.9,0,6.0,TIME_PER_LINE + 0.01)
  91.  
  92. for(i = 1; i < MAXPLAYERS; i++) {
  93.  
  94. if(g_PlayerAlive[i]) {
  95.  
  96. if(pev(i,pev_waterlevel) == UNDERWATER && !g_PlayerWaterGametime[i]) {
  97.  
  98. g_PlayerWaterGametime[i] = Gametime
  99. }
  100. else if(pev(i,pev_waterlevel) != UNDERWATER) {
  101.  
  102. g_PlayerWaterGametime[i] = 0.0
  103. }
  104. else if(Gametime - g_PlayerUpdateGametime[i] >= TIME_PER_LINE) {
  105.  
  106. static sBar[BAR_STRING_LENGTH], Float:UnderWaterGametime
  107.  
  108. //Static looks cooler
  109. sBar[0] = 0
  110.  
  111. UnderWaterGametime = UNDERWATER_MAX_TIME - (Gametime - g_PlayerWaterGametime[i])
  112.  
  113. add(sBar,BAR_STRING_LENGTH - 1,"Oxygen^n[")
  114.  
  115. for(x = 0; x < BAR_LINES; x++) {
  116.  
  117. if(UnderWaterGametime >= x * TIME_PER_LINE) add(sBar,BAR_STRING_LENGTH - 1,FULL_CHAR)
  118. else add(sBar,BAR_STRING_LENGTH - 1,EMPTY_CHAR)
  119. }
  120.  
  121. add(sBar,BAR_STRING_LENGTH - 1,"]")
  122.  
  123. show_hudmessage(i,sBar)
  124.  
  125. g_PlayerUpdateGametime[i] = Gametime
  126. }
  127. }
  128. }
  129.  
  130. set_pev(Ent,pev_nextthink,get_gametime() + HANDLER_THINK_TIME)
  131. }
  132. }