HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <engine>
  4. #include <fakemeta_util>
  5. #include <hamsandwich>
  6.  
  7. #define PLUGIN "Ghost"
  8. #define VERSION "1.0"
  9. #define AUTHOR "OsuDesu"
  10.  
  11. #define MODEL_GHOST "models/ghost/ghost.mdl"
  12.  
  13. new bool:g_save_cpl
  14.  
  15. static Array:g_cp_id, Array:g_cp_origin_x, Array:g_cp_origin_y, Array:g_cp_origin_z
  16.  
  17. public plugin_precache() precache_model(MODEL_GHOST)
  18.  
  19. public plugin_init()
  20. {
  21. register_plugin(PLUGIN, VERSION, AUTHOR)
  22.  
  23. g_cp_id = ArrayCreate()
  24. g_cp_origin_x = ArrayCreate()
  25. g_cp_origin_y = ArrayCreate()
  26. g_cp_origin_z = ArrayCreate()
  27.  
  28. register_clcmd("say /szellem", "ghosts_menu")
  29.  
  30. get_maps_cfg()
  31. }
  32.  
  33. public get_maps_cfg()
  34. {
  35. new map[32]
  36. get_mapname(map, charsmax(map))
  37. formatex(map, charsmax(map),"%s.ini",map)
  38.  
  39. new cfgDir[64], i_Dir, i_File[128]
  40. get_configsdir(cfgDir, charsmax(cfgDir))
  41. formatex(cfgDir, charsmax(cfgDir), "%s/ghost", cfgDir)
  42.  
  43. i_Dir = open_dir(cfgDir, i_File, charsmax(i_File))
  44.  
  45. if(i_Dir)
  46. {
  47. while(next_file(i_Dir, i_File, charsmax(i_File)))
  48. {
  49. if (i_File[0] == '.')
  50. continue
  51.  
  52. if(equal(map, i_File))
  53. {
  54. format(i_File,128,"%s/%s",cfgDir, i_File)
  55. get_checkpoints(i_File)
  56. break
  57. }
  58. }
  59. }
  60. }
  61.  
  62. public set_maps_cfg()
  63. {
  64. new map[32]
  65. get_mapname(map, charsmax(map))
  66. formatex(map, charsmax(map),"%s.ini",map)
  67.  
  68. new cfgDir[64], i_File[128]
  69. get_configsdir(cfgDir, charsmax(cfgDir))
  70. formatex(cfgDir, charsmax(cfgDir), "%s/ghost", cfgDir)
  71. formatex(i_File, charsmax(i_File),"%s/%s",cfgDir, map)
  72.  
  73. if(!dir_exists(cfgDir))
  74. if(!mkdir(cfgDir))
  75. return
  76.  
  77. delete_file(i_File)
  78.  
  79. static cp_count; cp_count = ArraySize(g_cp_id)
  80. if(!cp_count)
  81. return
  82.  
  83. for(new i=0; i<cp_count; i++)
  84. {
  85. new text[128], Float:fOrigin[3], ent = ArrayGetCell(g_cp_id, i)
  86. pev(ent, pev_origin, fOrigin)
  87. format(text, charsmax(text),"^"%f^" ^"%f^" ^"%f^"",fOrigin[0], fOrigin[1], fOrigin[2])
  88. write_file(i_File, text, i)
  89. }
  90. }
  91.  
  92. public get_checkpoints(i_File[128])
  93. {
  94. new file = fopen(i_File,"rt")
  95.  
  96. while(file && !feof(file))
  97. {
  98. new sfLineData[512]
  99. fgets(file, sfLineData, charsmax(sfLineData))
  100.  
  101. if(sfLineData[0] == ';')
  102. continue
  103.  
  104. if(equal(sfLineData,""))
  105. continue
  106.  
  107. new i_origins[3][32], Float: fOrigins[3]
  108. parse(sfLineData, i_origins[0], 31, i_origins[1], 31, i_origins[2], 31)
  109.  
  110. fOrigins[0] = str_to_float(i_origins[0])
  111. fOrigins[1] = str_to_float(i_origins[1])
  112. fOrigins[2] = str_to_float(i_origins[2])
  113.  
  114. create_checkpoint(fOrigins)
  115. }
  116.  
  117. fclose(file)
  118. }
  119.  
  120. public ghosts_menu(id)
  121. {
  122. static cp_count; cp_count = ArraySize(g_cp_id)
  123.  
  124. new menu_name[90]
  125. format(menu_name, 90, "\rSzellem menü")
  126.  
  127. new i_menu = menu_create(menu_name, "menu_handler")
  128.  
  129. menu_additem(i_menu, "\wSzellem készités", "1", 0)
  130.  
  131. if(!cp_count)
  132. {
  133. menu_additem(i_menu, "\dSzellem visszavonás", "2", 0)
  134. menu_additem(i_menu, "\dÖsszes szellem törlése", "3", 0)
  135. }
  136. else
  137. {
  138. menu_additem(i_menu, "\wSzellem visszavonás", "2", 0)
  139. menu_additem(i_menu, "\wÖsszes szellem törlése", "3", 0)
  140. }
  141.  
  142. if(!g_save_cpl)
  143. menu_additem(i_menu, "\dMentés", "4", 0)
  144. else menu_additem(i_menu, "\wMentés", "4", 0)
  145.  
  146. menu_setprop(i_menu, MPROP_EXIT, MEXIT_ALL)
  147. menu_setprop(i_menu, MPROP_EXITNAME, "Kilépés")
  148. menu_display(id, i_menu, 0)
  149.  
  150. return PLUGIN_HANDLED
  151. }
  152.  
  153. public menu_handler(id, menu, item)
  154. {
  155. if (item == MENU_EXIT)
  156. {
  157. menu_destroy(menu)
  158. return PLUGIN_HANDLED
  159. }
  160.  
  161. static cp_count; cp_count = ArraySize(g_cp_id)
  162. switch(item)
  163. {
  164. case 0:
  165. {
  166. g_save_cpl = true
  167.  
  168. static Float:fOrigins[3]
  169. fm_get_aim_origin(id, fOrigins)
  170. fOrigins[2]+=60
  171.  
  172. create_checkpoint(fOrigins)
  173. ghosts_menu(id)
  174. }
  175. case 1:
  176. {
  177. if(!cp_count)
  178. {
  179. client_print(id, print_chat, "A térképen nincs egy szellem sem!")
  180. ghosts_menu(id)
  181. return PLUGIN_HANDLED
  182. }
  183.  
  184. g_save_cpl = true
  185.  
  186. remove_entity(ArrayGetCell(g_cp_id, cp_count-1))
  187. ArrayDeleteItem(g_cp_id, cp_count-1)
  188. ArrayDeleteItem(g_cp_origin_x, cp_count-1)
  189. ArrayDeleteItem(g_cp_origin_y, cp_count-1)
  190. ArrayDeleteItem(g_cp_origin_z, cp_count-1)
  191.  
  192. if(cp_count-1)
  193. {
  194. set_pev(ArrayGetCell(g_cp_id, cp_count-2), pev_body, 2)
  195. set_pev(ArrayGetCell(g_cp_id, cp_count-2), pev_skin, 0)
  196. }
  197.  
  198. ghosts_menu(id)
  199. }
  200. case 2:
  201. {
  202. if(!cp_count)
  203. {
  204. client_print(id, print_chat, "A térképen nincs egy szellem sem!")
  205. ghosts_menu(id)
  206. return PLUGIN_HANDLED
  207. }
  208.  
  209. g_save_cpl = true
  210. client_print(id, print_chat, "%d db szellem törölve!", cp_count)
  211.  
  212. for(new i=0; i<cp_count; i++)
  213. remove_entity(ArrayGetCell(g_cp_id, i))
  214.  
  215. ArrayClear(g_cp_id)
  216. ArrayClear(g_cp_origin_x)
  217. ArrayClear(g_cp_origin_y)
  218. ArrayClear(g_cp_origin_z)
  219. ghosts_menu(id)
  220. }
  221. case 3:
  222. {
  223. if(!g_save_cpl)
  224. {
  225. ghosts_menu(id)
  226. return PLUGIN_HANDLED
  227. }
  228.  
  229. g_save_cpl = false
  230. set_maps_cfg()
  231.  
  232.  
  233. ghosts_menu(id)
  234. }
  235. }
  236. return PLUGIN_HANDLED
  237. }
  238.  
  239. public create_checkpoint(Float: fOrigins[3])
  240. {
  241. static ent; ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  242. if(!pev_valid(ent)) return
  243.  
  244. ArrayPushCell(g_cp_id, ent)
  245.  
  246. ArrayPushCell(g_cp_origin_x, fOrigins[0])
  247. ArrayPushCell(g_cp_origin_y, fOrigins[1])
  248. ArrayPushCell(g_cp_origin_z, fOrigins[2])
  249.  
  250. engfunc(EngFunc_SetModel, ent, MODEL_GHOST)
  251.  
  252. set_pev(ent, pev_origin, fOrigins)
  253. set_pev(ent, pev_solid, SOLID_TRIGGER)
  254. set_pev(ent, pev_movetype, MOVETYPE_NONE)
  255. set_pev(ent, pev_sequence, 1)
  256. set_pev(ent, pev_gaitsequence, 1)
  257. set_pev(ent, pev_framerate, 1.0)
  258. set_pev(ent, pev_classname, "ghost")
  259.  
  260. entity_set_size(ent,Float:{-45.0, -45.0, -45.0}, Float:{45.0, 45.0, 45.0})
  261. }