HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <cstrike>
  4. #include <engine>
  5. #include <fakemeta>
  6. #include <xs>
  7.  
  8. #define PLUGIN "Defuse Progress Bar"
  9. #define VERSION "1.0"
  10. #define AUTHOR "R3X"
  11.  
  12. new const gszModel[] = "sprites/progress.spr";
  13.  
  14. new giBars[33];
  15.  
  16.  
  17. public plugin_init()
  18. {
  19. register_plugin(PLUGIN, VERSION, AUTHOR);
  20.  
  21. register_event("BarTime", "eventBarTime", "be");
  22.  
  23. register_think("progress_bar", "thinkProgressBar");
  24.  
  25. register_forward(FM_PlayerPostThink, "fwPlayerPostThink", 1);
  26. register_forward(FM_AddToFullPack, "fwAddToFullPack", 1);
  27. }
  28.  
  29. public plugin_precache()
  30. {
  31. precache_model( gszModel );
  32. }
  33.  
  34. public client_putinserver(id)
  35. {
  36. createPublicBar(id);
  37. }
  38.  
  39. public client_disconnect(id)
  40. {
  41. createPublicBar(id);
  42. }
  43.  
  44. public eventBarTime(id)
  45. {
  46. createPublicBar(id, read_data(1) );
  47. }
  48.  
  49. public fwAddToFullPack(es_handle, e, ENT, HOST, hostflags, player, set)
  50. {
  51.  
  52. if(!player && pev_valid(ENT))
  53. {
  54. new owner = pev(ENT, pev_owner);
  55. if(is_user_alive(owner) && giBars[owner] == ENT)
  56. {
  57. new CsTeams:team = cs_get_user_team(HOST);
  58. if(team != CS_TEAM_SPECTATOR && cs_get_user_team(owner) != team)
  59. {
  60. set_es(es_handle, ES_RenderAmt, 0);
  61. return FMRES_HANDLED;
  62. }
  63. }
  64. }
  65. return FMRES_IGNORED;
  66. }
  67.  
  68. public fwPlayerPostThink(id)
  69. {
  70. new ent = giBars[id];
  71.  
  72. if(isValidBarEntity(id, ent))
  73. {
  74. if(is_user_alive(id))
  75. {
  76. setBarEntityPos(id, ent);
  77. }
  78. else
  79. {
  80. removeBarEntity(id, ent);
  81. }
  82. }
  83. }
  84.  
  85. public thinkProgressBar(ent)
  86. {
  87. new Float:fNow = get_gametime();
  88. new Float:fLTime;
  89. pev(ent, pev_ltime, fLTime);
  90.  
  91. if(fLTime <= fNow)
  92. removeBarEntity(pev(ent, pev_owner), ent);
  93. else
  94. {
  95. new Float:fFrameRate;
  96. pev(ent, pev_framerate, fFrameRate);
  97.  
  98. set_pev(ent, pev_nextthink, get_gametime() + 1.0/fFrameRate);
  99.  
  100. new Float:fFrame;
  101. pev(ent, pev_frame, fFrame);
  102. fFrame += 1.0;
  103. set_pev(ent, pev_frame, fFrame);
  104. }
  105. }
  106.  
  107. new giSerials[33];
  108.  
  109.  
  110. createPublicBar(id, bartime = 0)
  111. {
  112. new ent = giBars[id];
  113.  
  114. if(isValidBarEntity(id, ent))
  115. {
  116. if(bartime == 0)
  117. {
  118. removeBarEntity(id, ent);
  119. }
  120. else
  121. {
  122. removeBarEntity(id, ent);
  123. ent = createBarEntity(id, bartime);
  124. }
  125. }
  126. else
  127. {
  128. if(bartime == 0)
  129. {
  130. return;
  131. }
  132. else
  133. {
  134. ent = createBarEntity(id, bartime);
  135. }
  136. }
  137.  
  138. giBars[id] = ent;
  139. }
  140.  
  141. isValidBarEntity(id, ent)
  142. {
  143. return (pev_valid(ent) && giSerials[id] == pev_serial(ent));
  144. }
  145.  
  146. createBarEntity(id, bartime)
  147. {
  148.  
  149. new const iFrames = 16;
  150.  
  151. //Life of ent
  152. new Float:fLifeTime = float(bartime);
  153. //Animation frame rating
  154. new Float:fFrameRate = float(iFrames) / fLifeTime;
  155.  
  156.  
  157. new ent = create_entity("env_sprite");
  158.  
  159. giSerials[id] = pev_serial(ent);
  160.  
  161. set_pev(ent, pev_classname, "progress_bar");
  162. set_pev(ent, pev_solid, SOLID_NOT);
  163. set_pev( ent, pev_movetype, MOVETYPE_FLY );
  164.  
  165. entity_set_model(ent, gszModel);
  166. entity_set_size(ent, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});
  167. set_rendering(ent, kRenderFxNone, 255, 255, 255, kRenderTransAdd, 255);
  168.  
  169. set_pev(ent, pev_scale, 0.7);
  170. set_pev(ent, pev_owner, id);
  171. set_pev(ent, pev_framerate, fFrameRate);
  172.  
  173. set_pev(ent, pev_ltime, get_gametime()+fLifeTime);
  174. set_pev(ent, pev_nextthink, get_gametime() + 1.0/fFrameRate);
  175.  
  176. setBarEntityPos(id, ent);
  177. return ent;
  178. }
  179.  
  180.  
  181. removeBarEntity(id, ent)
  182. {
  183. giBars[id] = giSerials[id] = 0;
  184. set_pev(ent, pev_flags, FL_KILLME);
  185. }
  186.  
  187. setBarEntityPos(id, ent)
  188. {
  189. static Float:fAntySpam = 0.0;
  190. new Float:fNow = get_gametime();
  191.  
  192. if((fNow - fAntySpam) > 0.3)
  193. {
  194. fAntySpam = fNow;
  195.  
  196. }
  197. static Float:fOrigin[3];
  198. static Float:fTemp[3];
  199.  
  200. pev(id, pev_origin, fOrigin);
  201. pev(id, pev_view_ofs, fTemp);
  202.  
  203. xs_vec_add(fOrigin, fTemp, fOrigin);
  204.  
  205. fOrigin[2] += 32.0;
  206.  
  207. set_pev(ent, pev_origin, fOrigin);
  208. }
  209.