HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <engine>
  5.  
  6. #define MAX_ZONES 5
  7. #define TASK_ID 1234
  8.  
  9. #define OriginX 0
  10. #define OriginY 1
  11. #define OriginZ 2
  12.  
  13. new cvar_delay
  14. new cvar_kzsize
  15. new cvar_kzsizez
  16. new cvar_height
  17. new cvar_nadepro
  18.  
  19. new bool:g_DirExist
  20. new g_ConfigsDir[64]
  21. new g_KnifeZoneDir[64]
  22.  
  23. new Float:g_fDelay[33]
  24. new g_ProtectionTime[33]
  25. new bool:g_InTheZone[33]
  26.  
  27. new zoneID
  28. new sprite_zbeam
  29. new g_KnifeZoneOrgins[MAX_ZONES][3]
  30. new bool:g_KnifeZoneLogos[MAX_ZONES]
  31.  
  32.  
  33.  
  34. static const PLUGIN_NAME[] = "Kes Zona"
  35. static const PLUGIN_AUTHOR[] = "Cheap_Suit"
  36. static const PLUGIN_VERSION[] = "1.6"
  37.  
  38. public plugin_init()
  39. {
  40. register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
  41. register_cvar(PLUGIN_NAME, PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER)
  42. register_clcmd("amx_kzmenu", "open_KnifeZone", ADMIN_LEVEL_A, "Knife Zone Menu")
  43. register_menucmd(register_menuid("Knife Zone Menu"), 1023, "action_KnifeZone")
  44.  
  45. cvar_delay = register_cvar("amx_kzdelay", "0") //menyi ido alat legyel halhatatlan
  46. cvar_height = register_cvar("amx_kzheight", "140") //zona Magasaga
  47. cvar_kzsize = register_cvar("amx_kzsize", "140") // Zona NAgysaga
  48. cvar_kzsizez = register_cvar("amx_kzsizez", "50") //Zona Szelesege
  49. cvar_nadepro = register_cvar("amx_kznadepro", "1") // Ezt Nemtudom :S
  50.  
  51. register_forward(FM_TraceLine, "fwd_TraceLine")
  52. register_directory()
  53. }
  54.  
  55. public plugin_precache()
  56. {
  57. precache_model("sprites/knifezone.spr")
  58. sprite_zbeam = precache_model("sprites/zbeam4.spr")
  59. }
  60.  
  61. register_directory()
  62. {
  63. get_configsdir(g_ConfigsDir, 63)
  64. format(g_KnifeZoneDir, 63, "%s/knifezone", g_ConfigsDir)
  65.  
  66. if(!dir_exists(g_KnifeZoneDir))
  67. {
  68. log_amx("Kes Zona Konyvtar Nem Letezik")
  69. g_DirExist = false
  70. }
  71. else
  72. {
  73. g_DirExist = true
  74.  
  75. new curMap[32]
  76. get_mapname(curMap, 31)
  77. load_origins(curMap)
  78.  
  79. set_task(1.0, "task_visuals", TASK_ID, _, _, "b")
  80. }
  81. }
  82.  
  83. public open_KnifeZone(id, level, cid)
  84. {
  85. if(!cmd_access(id, level, cid, 1))
  86. return PLUGIN_HANDLED
  87.  
  88. if(!g_DirExist)
  89. console_print(id, "Kes Zona Konyvtar Nem Letezik")
  90. else
  91. display_KnifeZone(id)
  92.  
  93. return PLUGIN_HANDLED
  94. }
  95.  
  96. public display_KnifeZone(id)
  97. {
  98. new menuBody[512]
  99. new len = format(menuBody, 511, "\yKnife Zone Menu^n")
  100. len += format(menuBody[len], 511-len, "^n\w1. Zona letrehozasa")
  101. len += format(menuBody[len], 511-len, "^n\r2. Toroli Az Osszes Zonat")
  102. len += format(menuBody[len], 511-len, "^n\d3. Kilepes")
  103.  
  104. new keys = (1<<0|1<<1|1<<2)
  105. show_menu(id, keys, menuBody, -1, "Kes Zona Menu")
  106. }
  107.  
  108. public action_KnifeZone(id, key)
  109. {
  110. switch(key)
  111. {
  112. case 0:
  113. {
  114. if(zoneID >= MAX_ZONES)
  115. {
  116. client_print(id, print_chat, "Elerted a Max Kes Zonak Szamat")
  117. return PLUGIN_HANDLED
  118. }
  119.  
  120. if(!is_user_alive(id))
  121. {
  122. client_print(id, print_chat, "Maradj eletben a Kes Zona Kesziteshez")
  123. return PLUGIN_HANDLED
  124. }
  125.  
  126. _makeZone(id)
  127. display_KnifeZone(id)
  128. client_print(id, print_chat, "Letrehoztal Egy kes Zonat")
  129. }
  130. case 1:
  131. {
  132. _removeZones()
  133. display_KnifeZone(id)
  134. client_print(id, print_chat, "Osszes Kes Zona Torolve")
  135. }
  136. }
  137. return PLUGIN_HANDLED
  138. }
  139.  
  140. public fwd_TraceLine(Float:v1[3], Float:v2[3], noMonsters, id)
  141. {
  142. if(!is_user_alive(id))
  143. return FMRES_IGNORED
  144.  
  145. new victim = get_tr(TR_pHit)
  146. if(!is_user_alive(victim))
  147. return FMRES_IGNORED
  148.  
  149. new tmp[2], weapon = get_user_weapon(victim, tmp[0], tmp[1])
  150. if(weapon == CSW_KNIFE && g_InTheZone[victim])
  151. set_tr(TR_flFraction, 1.0)
  152.  
  153. return FMRES_IGNORED
  154. }
  155.  
  156. public client_PreThink(id)
  157. {
  158. if(!task_exists(TASK_ID) || !is_user_alive(id))
  159. {
  160. g_ProtectionTime[id] = -1
  161. g_InTheZone[id] = false
  162.  
  163. return PLUGIN_CONTINUE
  164. }
  165.  
  166. if(!check_origin(id))
  167. {
  168. g_InTheZone[id] = false
  169. g_ProtectionTime[id] = -1
  170.  
  171. return PLUGIN_CONTINUE
  172. }
  173.  
  174. new protectionDelay = get_pcvar_num(cvar_delay)
  175. if(g_ProtectionTime[id] < protectionDelay)
  176. {
  177. if(g_fDelay[id] + 1.0 < get_gametime())
  178. {
  179. g_ProtectionTime[id] += 1
  180. g_fDelay[id] = get_gametime()
  181. }
  182.  
  183. set_hudmessage(255, 0, 0, -1.0, -1.0, _, _, 0.5, _, _, 4)
  184. show_hudmessage(id, "Protection in %d...", (protectionDelay - g_ProtectionTime[id]))
  185. }
  186. else if(g_ProtectionTime[id] >= protectionDelay)
  187. g_InTheZone[id] = true
  188.  
  189. new tmp[2], weap = get_user_weapon(id, tmp[0], tmp[1])
  190. if(weap != CSW_KNIFE) client_cmd(id, "weapon_knife")
  191.  
  192. return PLUGIN_CONTINUE
  193. }
  194.  
  195. stock check_origin(id)
  196. {
  197. new iOrigin[3]
  198. get_user_origin(id, iOrigin, 0)
  199.  
  200. for(new i = 0; i < MAX_ZONES; ++i)
  201. {
  202. if((g_KnifeZoneOrgins[i][OriginX] == 0)
  203. && (g_KnifeZoneOrgins[i][OriginY] == 0)
  204. && g_KnifeZoneOrgins[i][OriginZ] == 0)
  205. continue
  206.  
  207. new ZoneSizeX = get_pcvar_num(cvar_kzsize)
  208. new ZoneSizeY = get_pcvar_num(cvar_kzsize)
  209. new ZoneSizeZ = get_pcvar_num(cvar_kzsizez)
  210.  
  211. if((g_KnifeZoneOrgins[i][OriginX] - iOrigin[0] > ZoneSizeX) || (g_KnifeZoneOrgins[i][OriginX] - iOrigin[0] < -ZoneSizeX)
  212. || (g_KnifeZoneOrgins[i][OriginY] - iOrigin[1] > ZoneSizeY) || (g_KnifeZoneOrgins[i][OriginY] - iOrigin[1] < -ZoneSizeY)
  213. || (g_KnifeZoneOrgins[i][OriginZ] - iOrigin[2] > ZoneSizeZ) || (g_KnifeZoneOrgins[i][OriginZ] - iOrigin[2] < -ZoneSizeZ))
  214. continue
  215.  
  216. return true
  217. }
  218. return false
  219. }
  220.  
  221. stock check_GrenadeOrigin(Origin[3])
  222. {
  223. new Ent = -1
  224. while((Ent = find_ent_by_class(Ent, "grenade")))
  225. {
  226. new szModel[32]
  227. entity_get_string(Ent, EV_SZ_model, szModel, 31)
  228. if(equal(szModel, "models/w_smokegrenade.mdl")
  229. || equal(szModel, "models/w_hegrenade.mdl")
  230. || equal(szModel, "models/w_flashbang.mdl"))
  231. {
  232. new Float:vOrigin[3], iOrigin[3]
  233. entity_get_vector(Ent, EV_VEC_origin, vOrigin)
  234. FVecIVec(vOrigin, iOrigin)
  235.  
  236. if(get_distance(iOrigin, Origin) <= get_pcvar_num(cvar_kzsize))
  237. remove_entity(Ent)
  238. }
  239. }
  240. }
  241.  
  242. load_origins(mapname[])
  243. {
  244. new mapFile[64]
  245. format(mapFile, 63, "%s/%s.cfg", g_KnifeZoneDir, mapname)
  246.  
  247. if(!file_exists(mapFile))
  248. {
  249. server_print("Nincsenek Kes Zonak for %s", mapname)
  250. return PLUGIN_CONTINUE
  251. }
  252.  
  253. new Text[64], Line = 0, Len = 0
  254. while(read_file(mapFile, Line++, Text, 63, Len))
  255. {
  256. if((Text[0]==';') || !Len)
  257. continue
  258.  
  259. if(zoneID >= MAX_ZONES)
  260. {
  261. log_amx("Max Kes Zonak Elerve, increase MAX_ZONES")
  262. break
  263. }
  264.  
  265. new iOrigin[3][16]
  266. parse(Text, iOrigin[OriginX], 15, iOrigin[OriginY], 15, iOrigin[OriginZ], 15)
  267.  
  268. g_KnifeZoneOrgins[zoneID][OriginX] = str_to_num(iOrigin[OriginX])
  269. g_KnifeZoneOrgins[zoneID][OriginY] = str_to_num(iOrigin[OriginY])
  270. g_KnifeZoneOrgins[zoneID][OriginZ] = str_to_num(iOrigin[OriginZ])
  271.  
  272. zoneID += 1
  273. }
  274. return PLUGIN_CONTINUE
  275. }
  276.  
  277. save_origin(mapname[], Origin[3])
  278. {
  279. new mapFile[64], Text[64]
  280. format(mapFile, 63, "%s/%s.cfg", g_KnifeZoneDir, mapname)
  281. if(!file_exists(mapFile))
  282. {
  283. new Comments[64]
  284. format(Comments, 63, "; Knife Zone origins for %s", mapname)
  285. write_file(mapFile, Comments, -1)
  286. }
  287.  
  288. format(Text, 64, "%i %i %i", Origin[OriginX], Origin[OriginY], Origin[OriginZ])
  289. write_file(mapFile, Text, -1)
  290. }
  291.  
  292. public task_visuals()
  293. {
  294. for(new i = 0; i < MAX_ZONES; ++i)
  295. {
  296. if((g_KnifeZoneOrgins[i][OriginX] == 0)
  297. && (g_KnifeZoneOrgins[i][OriginY] == 0)
  298. && g_KnifeZoneOrgins[i][OriginZ] == 0)
  299. continue
  300.  
  301. create_kzring(g_KnifeZoneOrgins[i])
  302.  
  303. if(get_pcvar_num(cvar_nadepro))
  304. check_GrenadeOrigin(g_KnifeZoneOrgins[i])
  305.  
  306. if(!g_KnifeZoneLogos[i])
  307. {
  308. g_KnifeZoneLogos[i] = true
  309. create_logo(g_KnifeZoneOrgins[i])
  310. }
  311. }
  312. }
  313.  
  314. stock create_kzring(Origin[3])
  315. {
  316. new shape[4][2] = {{1,1}, {-1,1}, {-1,-1}, {1,-1}}
  317. new x1, y1, x2, y2, height, i, j
  318. new ZoneSize = get_cvar_num("amx_kzsize")
  319.  
  320. for(j = 0; j < 2; j++)
  321. {
  322. height = (30 * j - 30)
  323. for(i = 0; i < 4; i++)
  324. {
  325. x1 = (shape[i][0] * ZoneSize)
  326. y1 = (shape[i][1] * ZoneSize)
  327. if(i < 3)
  328. {
  329. x2 = (shape[i+1][0] * ZoneSize)
  330. y2 = (shape[i+1][1] * ZoneSize)
  331. }
  332. else
  333. {
  334. x2 = (shape[0][0] * ZoneSize)
  335. y2 = (shape[0][1] * ZoneSize)
  336. }
  337.  
  338. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  339. write_byte(0)
  340. write_coord(Origin[OriginX] + x1)
  341. write_coord(Origin[OriginY] + y1)
  342. write_coord(Origin[OriginZ] + height)
  343. write_coord(Origin[OriginX] + x2)
  344. write_coord(Origin[OriginY] + y2)
  345. write_coord(Origin[OriginZ] + height)
  346. write_short(sprite_zbeam)
  347. write_byte(0)
  348. write_byte(0)
  349. write_byte(30)
  350. write_byte(15)
  351. write_byte(0)
  352. write_byte(255)
  353. write_byte(0)
  354. write_byte(0)
  355. write_byte(100)
  356. write_byte(0)
  357. message_end()
  358. }
  359. }
  360. }
  361.  
  362. stock create_logo(Origin[3])
  363. {
  364. new Float:flOrigin[3]
  365. IVecFVec(Origin, flOrigin)
  366.  
  367. new sprite = create_entity("info_target")
  368. if(is_valid_ent(sprite))
  369. {
  370. entity_set_string(sprite, EV_SZ_classname, "kzlogo")
  371. entity_set_model(sprite, "sprites/knifezone.spr")
  372.  
  373. flOrigin[2] += get_pcvar_num(cvar_height)
  374. entity_set_origin(sprite, flOrigin)
  375. }
  376. }
  377.  
  378. _makeZone(id)
  379. {
  380. new iOrigin[3], CurMap[32]
  381. get_user_origin(id, iOrigin, 0)
  382. get_mapname(CurMap, 31)
  383.  
  384. zoneID = 0
  385. save_origin(CurMap, iOrigin)
  386. load_origins(CurMap)
  387.  
  388. if(task_exists(TASK_ID))
  389. remove_task(TASK_ID)
  390.  
  391. set_task(1.0, "task_visuals", TASK_ID, _, _, "b")
  392. }
  393.  
  394. _removeZones()
  395. {
  396. new MapFile[64], CurMap[32]
  397. get_mapname(CurMap, 31)
  398. format(MapFile, 63, "%s/%s.cfg", g_KnifeZoneDir, CurMap)
  399. if(file_exists(MapFile))
  400. delete_file(MapFile)
  401.  
  402. if(task_exists(TASK_ID))
  403. remove_task(TASK_ID)
  404.  
  405. zoneID = 0
  406.  
  407. for(new i = 0; i < MAX_ZONES; ++i)
  408. {
  409. g_KnifeZoneLogos[i] = false
  410. g_KnifeZoneOrgins[i][OriginX] = 0
  411. g_KnifeZoneOrgins[i][OriginY] = 0
  412. g_KnifeZoneOrgins[i][OriginZ] = 0
  413. }
  414.  
  415. new logo = -1
  416. while((logo = find_ent_by_class(logo, "kzlogo")))
  417. remove_entity(logo)
  418. }
  419. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  420. *{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1033{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
  421. */
  422.