HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Edit for Zombie Plague by CHyCMyMpNk */
  2. /* Work only for Swarm Round */
  3.  
  4. #include <amxmodx>
  5. #include <amxmisc>
  6. #include <cstrike>
  7. #include <engine>
  8. #include <fun>
  9. #include <zombieplague>
  10.  
  11. #define PLUGNAME "[ZP] Swarm Round Respawning"
  12. #define AUTHOR "Emp`"
  13. #define VERSION "1.31"
  14.  
  15. #define MAX_SPAWNS 60
  16. #define MAX_SPEAK 10
  17.  
  18. new Float:ZPSRtime[33]
  19. new SOrigin[33][3];
  20.  
  21. new Float:g_SpawnVecs[MAX_SPAWNS][3];
  22. new Float:g_SpawnAngles[MAX_SPAWNS][3];
  23. new Float:g_SpawnVAngles[MAX_SPAWNS][3];
  24. new g_TotalSpawns;
  25.  
  26. new zp_SRRespawn, zp_SRRspawns, zp_SRRtime, zp_SRRmaxtime
  27. public plugin_init()
  28. {
  29.  
  30. register_plugin(PLUGNAME, VERSION, AUTHOR)
  31.  
  32. zp_SRRespawn = register_cvar("zp_SRRespawn", "1")
  33. zp_SRRspawns = register_cvar("zp_SRRspawns", "0")
  34. zp_SRRtime = register_cvar("zp_SRRtime", "10.0")
  35. zp_SRRmaxtime = register_cvar("zp_SRRmaxtime", "3.0")
  36.  
  37. register_event("DeathMsg","DeathEvent","a")
  38.  
  39. readSpawns()
  40. set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET);
  41. }
  42.  
  43. readSpawns()
  44. {
  45.  
  46. new Map[32], config[32], MapFile[64];
  47.  
  48. get_mapname(Map, 31)
  49. get_configsdir(config, 31 )
  50. format(MapFile, 63, "%s\csdm\%s.spawns.cfg", config, Map);
  51. g_TotalSpawns = 0;
  52.  
  53. if (file_exists(MapFile))
  54. {
  55. new Data[124], len;
  56. new line = 0;
  57. new pos[12][8];
  58.  
  59. while(g_TotalSpawns < MAX_SPAWNS && (line = read_file(MapFile , line , Data , 123 , len) ) != 0 )
  60. {
  61. if (strlen(Data)<2 || Data[0] == '[')
  62. continue;
  63.  
  64. parse(Data, pos[1], 7, pos[2], 7, pos[3], 7, pos[4], 7, pos[5], 7, pos[6], 7, pos[7], 7, pos[8], 7, pos[9], 7, pos[10], 7);
  65.  
  66. g_SpawnVecs[g_TotalSpawns][0] = str_to_float(pos[1]);
  67. g_SpawnVecs[g_TotalSpawns][1] = str_to_float(pos[2]);
  68. g_SpawnVecs[g_TotalSpawns][2] = str_to_float(pos[3]);
  69.  
  70. g_SpawnAngles[g_TotalSpawns][0] = str_to_float(pos[4]);
  71. g_SpawnAngles[g_TotalSpawns][1] = str_to_float(pos[5]);
  72. g_SpawnAngles[g_TotalSpawns][2] = str_to_float(pos[6]);
  73.  
  74. g_SpawnVAngles[g_TotalSpawns][0] = str_to_float(pos[7]);
  75. g_SpawnVAngles[g_TotalSpawns][1] = str_to_float(pos[8]);
  76. g_SpawnVAngles[g_TotalSpawns][2] = str_to_float(pos[9]);
  77.  
  78.  
  79. g_TotalSpawns++;
  80. }
  81.  
  82. log_amx("Loaded %d spawn points for map %s.", g_TotalSpawns, Map)
  83. } else {
  84. log_amx("No spawn points file found (%s)", MapFile)
  85. }
  86.  
  87. return 1;
  88. }
  89.  
  90. public spawn_Preset(id)
  91. {
  92. if (g_TotalSpawns < 2)
  93. return PLUGIN_CONTINUE
  94.  
  95. new list[MAX_SPAWNS];
  96. new num = 0;
  97. new final = -1;
  98. new total=0;
  99. new players[32], n, x = 0;
  100. new Float:loc[32][3], locnum
  101.  
  102. get_players(players, num)
  103. for (new i=0; i<num; i++)
  104. {
  105. if (is_user_alive(players[i]) && players[i] != id)
  106. {
  107. entity_get_vector(players[i], EV_VEC_origin, loc[locnum])
  108. locnum++
  109. }
  110. }
  111.  
  112. num = 0
  113. while (num <= g_TotalSpawns)
  114. {
  115. if (num == g_TotalSpawns)
  116. break;
  117. n = random_num(0, g_TotalSpawns-1);
  118. if (!list[n])
  119. {
  120. list[n] = 1;
  121. num++;
  122. }
  123. else
  124. {
  125. total++;
  126. if (total > 100)
  127. break;
  128. continue;
  129. }
  130.  
  131. new trace = trace_hull(g_SpawnVecs[n],1);
  132. if (trace)
  133. continue;
  134.  
  135. if (locnum < 1)
  136. {
  137. final = n
  138. break
  139. }
  140.  
  141. final = n
  142. for (x = 0; x < locnum; x++)
  143. {
  144. new Float:distance = get_distance_f(g_SpawnVecs[n], loc[x]);
  145. if (distance < 250.0)
  146. {
  147. final = -1;
  148. break;
  149. }
  150. }
  151.  
  152. if (final != -1)
  153. break
  154. }
  155.  
  156. if (final != -1)
  157. {
  158. entity_set_origin(id, g_SpawnVecs[final]);
  159. entity_set_int(id, EV_INT_fixangle, 1);
  160. entity_set_vector(id, EV_VEC_angles, g_SpawnAngles[final]);
  161. entity_set_vector(id, EV_VEC_v_angle, g_SpawnVAngles[final]);
  162. entity_set_int(id, EV_INT_fixangle, 1);
  163.  
  164. return PLUGIN_HANDLED
  165. }
  166.  
  167. return PLUGIN_CONTINUE
  168. }
  169. public DeathEvent()
  170. {
  171. new attacker = read_data(1)
  172. new id = read_data(2)
  173.  
  174. if(get_pcvar_num(zp_SRRespawn)<1) return PLUGIN_CONTINUE
  175. if(1>get_user_team(id)>2) return PLUGIN_CONTINUE
  176.  
  177. switch(get_pcvar_num(zp_SRRespawn))
  178. {
  179. case 2:{
  180. if(is_user_connected(attacker)){
  181. if(get_user_team(id)==get_user_team(attacker) || id==attacker){
  182. ZPSRtime[attacker] += get_pcvar_num(zp_SRRtime)
  183. if(ZPSRtime[attacker] > get_pcvar_num(zp_SRRmaxtime))
  184. ZPSRtime[attacker] = get_pcvar_float(zp_SRRmaxtime)
  185. }
  186. }
  187. }
  188. case 1:{
  189. if(is_user_alive(attacker)){
  190. ZPSRtime[attacker] -= get_pcvar_num(zp_SRRtime)
  191. if(ZPSRtime[attacker]<1.0)
  192. ZPSRtime[attacker] = 1.0
  193. }
  194.  
  195. ZPSRtime[id] += get_pcvar_num(zp_SRRtime)
  196. if(ZPSRtime[id] > get_pcvar_num(zp_SRRmaxtime))
  197. ZPSRtime[id] = get_pcvar_float(zp_SRRmaxtime)
  198. }
  199. default: return PLUGIN_CONTINUE
  200. }
  201.  
  202. new time = floatround(ZPSRtime[id]) + 1
  203.  
  204. new parm[2]
  205. parm[0] = id
  206. parm[1] = time
  207.  
  208. set_task(0.1,"check_respawn",0,parm,2)
  209.  
  210. return PLUGIN_CONTINUE
  211. }
  212. public check_respawn(parm[])
  213. {
  214. new id = parm[0]
  215. parm[1]--
  216.  
  217. if(is_user_alive(id) || !zp_is_swarm_round())
  218. return
  219.  
  220. if(parm[1]==0){
  221. respawn(id)
  222. }
  223. else{
  224. if(parm[1]<MAX_SPEAK){
  225. new speak[30]
  226. num_to_word(parm[1], speak, 29)
  227. client_cmd(id,"spk ^"fvox/%s^"",speak)
  228. }
  229. client_print(id, print_center, "[ZP] Ujra fogsz eledni %d masodperc mulva.", parm[1])
  230. set_task(1.0,"check_respawn",0,parm,2)
  231. }
  232. }
  233. public respawn(id)
  234. {
  235. if(is_user_alive(id) || !is_user_connected(id) || !zp_is_swarm_round()) return -1
  236.  
  237. new team = get_user_team(id)
  238.  
  239. if(team==1 || team==2) {
  240. new parm[2]
  241. parm[0] = id
  242. parm[1] = 0
  243. set_task( 0.5, "actual_revive", 1, parm, 2)
  244. parm[1] = 1
  245. set_task( 0.7, "actual_revive", 1, parm, 2)
  246. return 1
  247. }
  248. return 0
  249. }
  250. public actual_revive(parm[])
  251. {
  252. new id = parm[0], a = parm[1]
  253. spawn(id)
  254. if(a==0)
  255. get_user_origin(id, SOrigin[id])
  256. else {
  257. if(get_pcvar_num(zp_SRRspawns) > 0)
  258. spawn_Preset(id)
  259. else
  260. set_user_origin(id, SOrigin[id])
  261. }
  262. }
  263.  
  264. public client_connect(id)
  265. {
  266. ZPSRtime[id] = get_pcvar_float(zp_SRRtime)
  267. }
  268.  
  269. public client_putinserver(id)
  270. {
  271. set_task(1.0,"first_respawn",id)
  272. }
  273.  
  274. public first_respawn(id)
  275. {
  276. if(!respawn(id))
  277. set_task(1.0,"first_respawn",id)
  278. }