HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <xs>
  5.  
  6.  
  7. #define CONFIG_FOLDERNAME "In-Game Ads" //cstrike/addons/amxmodx/configs/ --> IDE EZT A MAPPÁT!
  8. #define MAIN_PRECACHE_FILE "precache_list.cfg" //Itt precachelünk minden újonnan elkészített modell/sprite-t
  9. #define MAIN_PRECACHE_FILE_TEXT "// ha megszeretné tekinteni a modelljeit, akkor töltse fel a teljes listát.^n// Példa:^n//models/wall.mdl^n//models/player.mdl^n//sprites/custom/sprite.spr^n//^n^n^n"
  10.  
  11. #define ERROR_FILE_NOT_FOUND "Hiba: Nem sikerult betolteni (%s), model/sprite nem letezik."
  12. #define ERROR_USER_ALREADY_PLACING "Hiba: Egynel tobb felhasznalo hirdetest helyez el!"
  13. #define ERROR_USER_ALREADY_DELETING "Hiba: Egynel tobb felhasznalo torli a hirdetest!"
  14.  
  15. #define MENU_SAVE_TEXT "Mentés?^n^n1. Igen, elmentem.^n0. Nem, törlöm.^n"
  16. #define MENU_SELECT_TEXT_CHOOSE_MODEL "Válasszon: %i/%i^n^n"
  17. #define MENU_SELECT_TEXT_OPTIONS_1 "^n6. Fel^n7. Le^n^n8. Mentés!^n^n9. Több...^n0. %s"
  18. #define MENU_SELECT_TEXT_OPTIONS_2 "^n6. Fel^n7. Le^n^n8. Mentés!^n^n0. %s"
  19. #define MENU_DELETE_TEXT_HEADER "Alábbi törlése: %i/%i^n(Jelölje ki a pályán)^n^n"
  20. #define MENU_DELETE_TEXT_OPTIONS_1 "^n^n9.Több...^n0.%s"
  21. #define MENU_DELETE_TEXT_OPTIONS_2 "^n^n0.%s"
  22. #define MENU_DELETE_TEXT_CONFIRM "A kijelölt elem törlése?^n^n1. Igen, törlöm.^n0. Vissza.^n"
  23. #define MENU_TEXT_PREVIOUS "Előző oldal"
  24. #define MENU_TEXT_EXIT "Kilépés"
  25.  
  26.  
  27. //X másodpercenként frissíti a hírdetés szövegét
  28. #define PRETHINK_REFRESH_TIME 5
  29.  
  30. //Távolság a hírdetés szerkesztéséhez, mozgatásához
  31. #define MOVE_DISTANCE 5.0
  32.  
  33. //A skála mérete, példa, 1.00 - 0.01 = 0.99, 0.99 - 0.01 = 0.98
  34. #define SCALE_AMOUNT 0.01
  35.  
  36. //Olyan modell, amelyeket a hírdetés törlése előtt csökkenteni kell
  37. #define DELETE_ICON_PATH "models/chick.mdl"
  38.  
  39. //Max hírdetések az aktuális pályán
  40. #define MAX_NUMBER_OF_ADS 32
  41.  
  42. //A menükben kiválasztható modellek/spritek maximális száma.
  43. #define MAX_AD_MODELS 16
  44.  
  45. //A modell/sprite teljes fájlnév maximális hosszúsága, pl.: "sprites/advert/bloodservers.spr"
  46. #define MAX_MODEL_NAMELEN 48
  47.  
  48. //Osztály neve models/sprites
  49. #define MODEL_CLASSNAME "stupok_ad"
  50.  
  51. //Szükséges jog a használathoz
  52. #define ADMIN_ACCESS_LEVEL ADMIN_BAN
  53.  
  54. //Ne változtasd!!
  55. #define MENU_SELECT_SIZE (128 + (MAX_AD_MODELS * MAX_MODEL_NAMELEN))
  56. #define MENU_SELECT_OPTIONS_NUM 5
  57. #define MENU_DELETE_SIZE (128 + (MAX_AD_MODELS * MAX_MODEL_NAMELEN))
  58. #define MENU_DELETE_OPTIONS_NUM 7
  59. //Ne változtasd!!
  60.  
  61. //names of the models that are precached on the map
  62. new g_precached_model_list[MAX_AD_MODELS][MAX_MODEL_NAMELEN]
  63. new g_precached_model_list_len
  64.  
  65. //index of the model selected for creation or deletion
  66. new g_selected_model_index
  67. new g_delete_model_index
  68.  
  69. //current page on the menu
  70. new g_menu_select_current_page
  71. new g_menu_delete_current_page
  72.  
  73. //names/indexes of the models that are placed on the map
  74. new g_map_model_entindex_list[MAX_NUMBER_OF_ADS]
  75. new g_map_model_list[MAX_AD_MODELS][MAX_MODEL_NAMELEN]
  76. new g_map_model_list_len
  77.  
  78. //creating/deleting/modifying this ent
  79. new g_ent
  80. new Float:g_aim_origin[3]
  81. new Float:g_ent_angles[3]
  82.  
  83. //one user may use this plugin at a time
  84. new g_ad_placer_id = -1
  85. new bool:g_is_user_placing_ad = false
  86. new g_prethink_counter
  87.  
  88. //names
  89. new g_filename[256]
  90. new g_mapname[32]
  91.  
  92. //is the model for hiliting deletions precached?
  93. new bool:g_is_deleteicon_precached = false
  94.  
  95. //forward for player prethink
  96. new fw_ppt
  97.  
  98. public plugin_init()
  99. {
  100. register_plugin("In-Game Ads", "1.83", "stupok")
  101.  
  102. register_clcmd("+place_ad", "cmd_place_ad", ADMIN_ACCESS_LEVEL)
  103. register_clcmd("-place_ad", "cmd_place_ad", ADMIN_ACCESS_LEVEL)
  104.  
  105. register_clcmd("delete_ad", "cmd_delete_ad", ADMIN_ACCESS_LEVEL)
  106.  
  107. register_clcmd("iga_closer", "cmd_move_toward_client", ADMIN_ACCESS_LEVEL)
  108. register_clcmd("iga_farther", "cmd_move_away_from_client", ADMIN_ACCESS_LEVEL)
  109. register_clcmd("iga_further", "cmd_move_away_from_client", ADMIN_ACCESS_LEVEL)
  110.  
  111. register_menucmd(register_menuid("menu_save"), MENU_KEY_1|MENU_KEY_0, "Pressedmenu_save")
  112. register_menucmd(register_menuid("menu_select"), 1023, "Pressedmenu_select")
  113. register_menucmd(register_menuid("menu_delete"), 1023, "Pressedmenu_delete")
  114. register_menucmd(register_menuid("menu_confirm"), MENU_KEY_1|MENU_KEY_0, "Pressedmenu_confirm")
  115.  
  116. load_saved_ads(g_filename)
  117. }
  118.  
  119. public plugin_precache()
  120. {
  121. if(precache_model(DELETE_ICON_PATH))
  122. {
  123. g_is_deleteicon_precached = true
  124. }
  125. else
  126. {
  127. log_amx(ERROR_FILE_NOT_FOUND, DELETE_ICON_PATH)
  128. }
  129.  
  130. new configs_dir[64]
  131.  
  132. get_configsdir(configs_dir, 63)
  133. get_mapname(g_mapname, 31)
  134.  
  135. formatex(g_filename, 255, "%s/%s", configs_dir, CONFIG_FOLDERNAME)
  136.  
  137. if(!dir_exists(g_filename))
  138. {
  139. mkdir(g_filename)
  140. }
  141.  
  142. format(g_filename, 255, "%s/%s", g_filename, MAIN_PRECACHE_FILE)
  143.  
  144. if(!file_exists(g_filename))
  145. {
  146. write_file(g_filename, MAIN_PRECACHE_FILE_TEXT)
  147. }
  148.  
  149. precache_from_file(g_filename)
  150.  
  151. formatex(g_filename, 255, "%s/%s/%s.txt", configs_dir, CONFIG_FOLDERNAME, g_mapname)
  152.  
  153. precache_from_file(g_filename)
  154. }
  155.  
  156. public fw_playerprethink(id)
  157. {
  158. if(!g_is_user_placing_ad || id != g_ad_placer_id)
  159. return FMRES_HANDLED
  160.  
  161. if(g_prethink_counter++ > PRETHINK_REFRESH_TIME)
  162. {
  163. g_prethink_counter = 0
  164.  
  165. static Float:normal[3]
  166.  
  167. fm_get_aim_origin_normal(id, g_aim_origin, normal)
  168. normal[0] *= -1.0
  169. normal[1] *= -1.0
  170. if(contain(g_precached_model_list[g_selected_model_index], ".spr") == -1)
  171. {
  172. normal[2] *= -1.0
  173. }
  174. vector_to_angle(normal, g_ent_angles)
  175. engfunc(EngFunc_SetOrigin, g_ent, g_aim_origin)
  176. set_pev(g_ent, pev_angles, g_ent_angles)
  177. }
  178. return FMRES_HANDLED
  179. }
  180.  
  181. public cmd_place_ad(id)
  182. {
  183. if(!(get_user_flags(id) & ADMIN_ACCESS_LEVEL))
  184. {
  185. client_print(id, print_console, "Nincs hozzaferesed ehhez a parancshoz.")
  186. return PLUGIN_HANDLED
  187. }
  188.  
  189. g_ad_placer_id = id
  190. new cmd[2]
  191. read_argv(0, cmd, 1)
  192.  
  193. switch(cmd[0])
  194. {
  195. case '+':
  196. {
  197. if(g_is_user_placing_ad)
  198. {
  199. log_amx(ERROR_USER_ALREADY_PLACING)
  200. client_print(0, print_chat, ERROR_USER_ALREADY_PLACING)
  201. return PLUGIN_HANDLED
  202. }
  203.  
  204. if(!pev_valid(g_ent))
  205. {
  206. create_ad()
  207. }
  208. g_is_user_placing_ad = true
  209. fw_ppt = register_forward(FM_PlayerPreThink, "fw_playerprethink", 0)
  210. }
  211. case '-':
  212. {
  213. if(pev_valid(g_ent) && g_ent != 0)
  214. {
  215. Showmenu_select(id, g_menu_select_current_page)
  216. }
  217. g_is_user_placing_ad = false
  218. if(fw_ppt) unregister_forward(FM_PlayerPreThink, fw_ppt, 0)
  219. }
  220. }
  221. return PLUGIN_HANDLED
  222. }
  223.  
  224. public cmd_delete_ad(id)
  225. {
  226. if(!(get_user_flags(id) & ADMIN_ACCESS_LEVEL))
  227. {
  228. client_print(id, print_console, "Nincs hozzaferesed ehhez a parancshoz.")
  229. return PLUGIN_HANDLED
  230. }
  231.  
  232. new ent = -1
  233. new i = -1
  234.  
  235. while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", MODEL_CLASSNAME)) != 0)
  236. {
  237. g_map_model_entindex_list[++i] = ent
  238. }
  239.  
  240. g_map_model_list_len = i+1
  241.  
  242. for(new i = 0; i < g_map_model_list_len; i++)
  243. {
  244. pev(g_map_model_entindex_list[i], pev_model, g_map_model_list[i], MAX_MODEL_NAMELEN-1)
  245. }
  246.  
  247. Showmenu_delete(id, 0)
  248.  
  249. return PLUGIN_HANDLED
  250. }
  251.  
  252. //moves one unit on an axis, not directly towards the client's origin
  253. public cmd_move_toward_client(id)
  254. {
  255. if(!(get_user_flags(id) & ADMIN_ACCESS_LEVEL))
  256. {
  257. client_print(id, print_console, "Nincs hozzaferesed ehhez a parancshoz.")
  258. return PLUGIN_HANDLED
  259. }
  260.  
  261. move_on_axis(id, 1)
  262.  
  263. return PLUGIN_HANDLED
  264. }
  265.  
  266. //moves one unit on an axis, not directly away from the client's origin
  267. public cmd_move_away_from_client(id)
  268. {
  269. if(!(get_user_flags(id) & ADMIN_ACCESS_LEVEL))
  270. {
  271. client_print(id, print_console, "Nincs hozzaferesed ehhez a parancshoz.")
  272. return PLUGIN_HANDLED
  273. }
  274.  
  275. move_on_axis(id, -1)
  276.  
  277. return PLUGIN_HANDLED
  278. }
  279.  
  280. public Showmenu_select(id, page)
  281. {
  282. if(page < 0) return
  283.  
  284. static szMenuBody[MENU_SELECT_SIZE]
  285. new nCurrKey
  286. new nStart = page * MENU_SELECT_OPTIONS_NUM
  287.  
  288. if(nStart >= g_precached_model_list_len)
  289. nStart = page = g_menu_select_current_page = 0
  290.  
  291. new nLen = formatex(szMenuBody, MENU_SELECT_SIZE-1, MENU_SELECT_TEXT_CHOOSE_MODEL, page+1, (g_precached_model_list_len / MENU_SELECT_OPTIONS_NUM + ((g_precached_model_list_len % MENU_SELECT_OPTIONS_NUM) ? 1 : 0 )) )
  292. new nEnd = nStart + MENU_SELECT_OPTIONS_NUM
  293. new nKeys = (1<<9)
  294.  
  295. if( nEnd > g_precached_model_list_len )
  296. nEnd = g_precached_model_list_len
  297.  
  298. for(new i = nStart; i < nEnd; i++ )
  299. {
  300. nKeys |= (1<<nCurrKey++)
  301. nLen += formatex( szMenuBody[nLen], (MENU_SELECT_SIZE-1-nLen), "%i. %s^n", nCurrKey, g_precached_model_list[i] )
  302. }
  303.  
  304. if( nEnd != g_precached_model_list_len )
  305. {
  306. formatex( szMenuBody[nLen], (MENU_SELECT_SIZE-1-nLen), MENU_SELECT_TEXT_OPTIONS_1, page ? MENU_TEXT_PREVIOUS : MENU_TEXT_EXIT )
  307. nKeys |= (1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)
  308. }
  309. else
  310. {
  311. formatex( szMenuBody[nLen], (MENU_SELECT_SIZE-1-nLen), MENU_SELECT_TEXT_OPTIONS_2, page ? MENU_TEXT_PREVIOUS : MENU_TEXT_EXIT )
  312. nKeys |= (1<<7)|(1<<6)|(1<<5)|(1<<4)
  313. }
  314.  
  315. show_menu( id, nKeys, szMenuBody, -1, "menu_select" )
  316.  
  317. return
  318. }
  319.  
  320. public Pressedmenu_select(id, key)
  321. {
  322. switch(key)
  323. {
  324. case 5:
  325. {
  326. add_to_scale(g_ent, SCALE_AMOUNT)
  327. Showmenu_select(id, g_menu_select_current_page)
  328. }
  329. case 6:
  330. {
  331. add_to_scale(g_ent, -1.0 * SCALE_AMOUNT)
  332. Showmenu_select(id, g_menu_select_current_page)
  333. }
  334. case 7:
  335. {
  336. Showmenu_save(id)
  337. }
  338. case 8:
  339. {
  340. Showmenu_select(id, ++g_menu_select_current_page)
  341. }
  342. case 9:
  343. {
  344. if(--g_menu_select_current_page < 0)
  345. {
  346. engfunc(EngFunc_RemoveEntity, g_ent)
  347. g_menu_select_current_page = 0
  348. }
  349. else
  350. {
  351. Showmenu_select(id, g_menu_select_current_page)
  352. }
  353. }
  354. default:
  355. {
  356. g_selected_model_index = (g_menu_select_current_page * MENU_SELECT_OPTIONS_NUM + key)
  357.  
  358. engfunc(EngFunc_SetModel, g_ent, g_precached_model_list[g_selected_model_index])
  359.  
  360. Showmenu_select(id, g_menu_select_current_page)
  361. }
  362. }
  363. }
  364.  
  365. public Showmenu_save(id)
  366. {
  367. show_menu(id, (1<<0)|(1<<9), MENU_SAVE_TEXT, -1, "menu_save")
  368. }
  369.  
  370. public Pressedmenu_save(id, key)
  371. {
  372. switch (key)
  373. {
  374. case 0: save_ad()
  375. case 9: engfunc(EngFunc_RemoveEntity, g_ent)
  376. }
  377. }
  378.  
  379. public Showmenu_delete(id, page)
  380. {
  381. if(page < 0) return
  382.  
  383. static szMenuBody[MENU_DELETE_SIZE]
  384. new nCurrKey
  385. new nStart = page * MENU_DELETE_OPTIONS_NUM
  386.  
  387. if(nStart >= g_map_model_list_len)
  388. nStart = page = g_menu_delete_current_page = 0
  389.  
  390. new nLen = formatex(szMenuBody, MENU_DELETE_SIZE-1, MENU_DELETE_TEXT_HEADER, page+1, (g_map_model_list_len / MENU_DELETE_OPTIONS_NUM + ((g_map_model_list_len % MENU_DELETE_OPTIONS_NUM) ? 1 : 0 )) )
  391. new nEnd = nStart + MENU_DELETE_OPTIONS_NUM
  392. new nKeys = (1<<9)
  393.  
  394. if( nEnd > g_map_model_list_len )
  395. nEnd = g_map_model_list_len
  396.  
  397. for(new i = nStart; i < nEnd; i++ )
  398. {
  399. nKeys |= (1<<nCurrKey++)
  400. nLen += formatex( szMenuBody[nLen], (MENU_DELETE_SIZE-1-nLen), "%i. %s^n", nCurrKey, g_map_model_list[i] )
  401. }
  402.  
  403. if( nEnd != g_map_model_list_len )
  404. {
  405. formatex( szMenuBody[nLen], (MENU_DELETE_SIZE-1-nLen), MENU_DELETE_TEXT_OPTIONS_1, page ? MENU_TEXT_PREVIOUS : MENU_TEXT_EXIT )
  406. nKeys |= (1<<8)
  407. }
  408. else
  409. {
  410. formatex( szMenuBody[nLen], (MENU_DELETE_SIZE-1-nLen), MENU_DELETE_TEXT_OPTIONS_2, page ? MENU_TEXT_PREVIOUS : MENU_TEXT_EXIT )
  411. nKeys |= (1<<7)|(1<<8)
  412. }
  413.  
  414. show_menu( id, nKeys, szMenuBody, -1, "menu_delete" )
  415.  
  416. return
  417. }
  418.  
  419. public Pressedmenu_delete(id, key)
  420. {
  421. switch(key)
  422. {
  423. case 8:
  424. {
  425. Showmenu_delete(id, ++g_menu_delete_current_page)
  426. }
  427. case 9:
  428. {
  429. if(--g_menu_delete_current_page < 0)
  430. {
  431. g_menu_delete_current_page = 0
  432. }
  433. else
  434. {
  435. Showmenu_delete(id, g_menu_delete_current_page)
  436. }
  437. }
  438. default:
  439. {
  440. g_delete_model_index = g_map_model_entindex_list[(g_menu_delete_current_page * MENU_DELETE_OPTIONS_NUM + key)]
  441.  
  442. show_delete_icon(g_delete_model_index, 1)
  443.  
  444. Showmenu_confirm(id)
  445. }
  446. }
  447. }
  448.  
  449. public Showmenu_confirm(id)
  450. {
  451. show_menu(id, (1<<0)|(1<<9), MENU_DELETE_TEXT_CONFIRM, -1, "menu_confirm")
  452. }
  453.  
  454. public Pressedmenu_confirm(id, key)
  455. {
  456. switch (key)
  457. {
  458. case 0:
  459. {
  460. show_delete_icon(g_delete_model_index, 0)
  461. delete_ad(g_delete_model_index)
  462. cmd_delete_ad(id)
  463. }
  464. case 9:
  465. {
  466. show_delete_icon(g_delete_model_index, 0)
  467. Showmenu_delete(id, g_menu_delete_current_page)
  468. }
  469. }
  470. }
  471.  
  472. public create_ad()
  473. {
  474. g_ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  475. set_pev(g_ent, pev_classname, MODEL_CLASSNAME)
  476. engfunc(EngFunc_SetModel, g_ent, g_precached_model_list[g_selected_model_index])
  477. set_pev(g_ent, pev_scale, 1.0)
  478. }
  479.  
  480. public show_delete_icon(ent, show)
  481. {
  482. if(!g_is_deleteicon_precached)
  483. {
  484. return 0
  485. }
  486.  
  487. if(show)
  488. {
  489. if(!pev_valid(ent))
  490. {
  491. return 0
  492. }
  493.  
  494. new Float:origin[3]
  495.  
  496. pev(ent, pev_origin, origin)
  497. origin[2] += 5.0
  498.  
  499. new ent2
  500. ent2 = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  501. set_pev(ent2, pev_classname, "deleteicon")
  502. engfunc(EngFunc_SetModel, ent2, DELETE_ICON_PATH)
  503. set_pev(ent2, pev_scale, 1.0)
  504. engfunc(EngFunc_SetOrigin, ent2, origin)
  505. set_pev(ent2, pev_renderfx, kRenderFxGlowShell)
  506. set_pev(ent2, pev_rendercolor, {255.0, 0.0, 0.0})
  507. set_pev(ent2, pev_rendermode, kRenderTransAlpha)
  508. set_pev(ent2, pev_renderamt, 255.0)
  509. }
  510. else
  511. {
  512. new ent2 = -1
  513. while((ent2 = engfunc(EngFunc_FindEntityByString, ent2, "classname", "deleteicon")) != 0)
  514. {
  515. if(pev_valid(ent2))
  516. engfunc(EngFunc_RemoveEntity, ent2)
  517. }
  518. }
  519.  
  520. return 1
  521. }
  522.  
  523. public save_ad()
  524. {
  525. new Float:f_scale
  526. new text[256]
  527.  
  528. get_configsdir(g_filename, 255)
  529. format(g_filename, 255, "%s/%s/%s.txt", g_filename, CONFIG_FOLDERNAME, g_mapname)
  530.  
  531. pev(g_ent, pev_angles, g_ent_angles)
  532.  
  533. if(contain(g_precached_model_list[g_selected_model_index], ".spr") != -1)
  534. {
  535. pev(g_ent, pev_scale, f_scale)
  536. formatex(text, 255, "^n%s^norigin %f %f %f^nangles %f %f %f^nscale %f", g_precached_model_list[g_selected_model_index], g_aim_origin[0], g_aim_origin[1], g_aim_origin[2], g_ent_angles[0], g_ent_angles[1], g_ent_angles[2], f_scale)
  537. }
  538. else
  539. {
  540. formatex(text, 255, "^n%s^norigin %f %f %f^nangles %f %f %f", g_precached_model_list[g_selected_model_index], g_aim_origin[0], g_aim_origin[1], g_aim_origin[2], g_ent_angles[0], g_ent_angles[1], g_ent_angles[2])
  541. }
  542.  
  543. write_file(g_filename, text)
  544. g_ent = 0
  545. }
  546.  
  547. public delete_ad(ent)
  548. {
  549. new buffer[256]
  550. new Float:origin[3]
  551. new origin_str[64]
  552.  
  553.  
  554. get_configsdir(g_filename, 255)
  555. format(g_filename, 255, "%s/%s/%s.txt", g_filename, CONFIG_FOLDERNAME, g_mapname)
  556.  
  557. pev(ent, pev_origin, origin)
  558.  
  559. float_to_str(origin[0], buffer, 8)
  560. format(origin_str, 63, "origin %s", buffer)
  561.  
  562. new line = find_line_with_string(g_filename, origin_str, 15)
  563.  
  564. if(line < 0)
  565. return 0
  566.  
  567. new f1 = fopen(g_filename, "r")
  568. write_file("InGameAdsTEMP.txt", "", -1)
  569. new f2 = fopen("InGameAdsTEMP.txt", "w")
  570.  
  571. while(!feof(f1))
  572. {
  573. fgets(f1, buffer, 255)
  574. fputs(f2, buffer)
  575. }
  576.  
  577. fclose(f1)
  578. fclose(f2)
  579.  
  580. delete_file(g_filename)
  581. write_file(g_filename, "", -1)
  582.  
  583. f1 = fopen(g_filename, "w")
  584. f2 = fopen("InGameAdsTEMP.txt", "r")
  585.  
  586. new i = 0
  587.  
  588. while(!feof(f2))
  589. {
  590. fgets(f2, buffer, 255)
  591. fputs(f1, buffer)
  592. i++
  593. if(i == line - 1)
  594. {
  595. fgets(f2, buffer, 255)
  596. fgets(f2, buffer, 255)
  597. i += 2
  598. while((contain(buffer, ".mdl") == -1) && (contain(buffer, ".spr") == -1) && !feof(f2))
  599. {
  600. fgets(f2, buffer, 255)
  601. i++
  602. }
  603. fputs(f1, buffer)
  604. }
  605. }
  606.  
  607. fclose(f1)
  608. fclose(f2)
  609.  
  610. delete_file("InGameAdsTEMP.txt")
  611.  
  612. if(pev_valid(ent))
  613. return engfunc(EngFunc_RemoveEntity, ent)
  614.  
  615. return 0
  616. }
  617.  
  618. public find_line_with_string(file[], find_this[], len)
  619. {
  620. new buffer[256]
  621. new f1 = fopen(file, "r")
  622. new i = 0
  623.  
  624. while(!feof(f1))
  625. {
  626. fgets(f1, buffer, len)
  627. if(equal(buffer, find_this, len))
  628. {
  629. fclose(f1)
  630. return i
  631. }
  632. i++
  633. }
  634. fclose(f1)
  635. return -1
  636. }
  637.  
  638. public precache_from_file(filename[])
  639. {
  640. new file_handle = fopen(filename, "r")
  641.  
  642. if(!file_handle)
  643. {
  644. return PLUGIN_HANDLED
  645. }
  646.  
  647. new file_text[MAX_MODEL_NAMELEN]
  648.  
  649. while(!feof(file_handle))
  650. {
  651. fgets(file_handle, file_text, MAX_MODEL_NAMELEN - 1)
  652. trim(file_text)
  653.  
  654. if(equal(file_text, "//", 2) || !file_text[0])
  655. {
  656. continue
  657. }
  658.  
  659. if(contain(filename, MAIN_PRECACHE_FILE) != -1)
  660. {
  661. if(dir_exists(file_text))
  662. {
  663. new dirname[MAX_MODEL_NAMELEN]
  664. copy(dirname, MAX_MODEL_NAMELEN - 1, file_text)
  665. replace_all(dirname, MAX_MODEL_NAMELEN - 1, "\", "/")
  666.  
  667. new dirh = open_dir(file_text, file_text, MAX_MODEL_NAMELEN - 1)
  668.  
  669. while(next_file(dirh, file_text, MAX_MODEL_NAMELEN - 1))
  670. {
  671. if(contain(file_text, ".spr") != -1 || contain(file_text, ".mdl") != -1)
  672. {
  673. format(file_text, MAX_MODEL_NAMELEN - 1, "%s/%s", dirname, file_text)
  674. if(!file_exists(file_text))
  675. {
  676. log_amx(ERROR_FILE_NOT_FOUND, file_text)
  677. }
  678. else
  679. {
  680. precache_model(file_text)
  681.  
  682. for(new i = 0; i < MAX_AD_MODELS; i++)
  683. {
  684. if(equal(file_text, g_precached_model_list[i]))
  685. {
  686. break
  687. }
  688. else if(!g_precached_model_list[i][0])
  689. {
  690. g_precached_model_list[g_precached_model_list_len] = file_text
  691. g_precached_model_list_len++
  692. break
  693. }
  694. }
  695. }
  696. }
  697. }
  698.  
  699. close_dir(dirh)
  700. }
  701. }
  702.  
  703. if(contain(file_text, ".spr") != -1 || contain(file_text, ".mdl") != -1)
  704. {
  705. if(!file_exists(file_text))
  706. {
  707. log_amx(ERROR_FILE_NOT_FOUND, file_text)
  708. continue
  709. }
  710. else
  711. {
  712. precache_model(file_text)
  713.  
  714. for(new i = 0; i < MAX_AD_MODELS; i++)
  715. {
  716. if(equal(file_text, g_precached_model_list[i]))
  717. {
  718. break
  719. }
  720. else if(!g_precached_model_list[i][0])
  721. {
  722. g_precached_model_list[g_precached_model_list_len] = file_text
  723. g_precached_model_list_len++
  724. break
  725. }
  726. }
  727. }
  728. }
  729. }
  730.  
  731. fclose(file_handle)
  732.  
  733. return PLUGIN_HANDLED
  734. }
  735.  
  736. //from fakemeta_util.inc, modified by stupok
  737. stock fm_get_aim_origin_normal(index, Float:origin[3], Float:normal[3])
  738. {
  739. static Float:start[3], Float:view_ofs[3]
  740. pev(index, pev_origin, start)
  741. pev(index, pev_view_ofs, view_ofs)
  742. xs_vec_add(start, view_ofs, start)
  743.  
  744. static Float:dest[3]
  745. pev(index, pev_v_angle, dest)
  746. engfunc(EngFunc_MakeVectors, dest)
  747. global_get(glb_v_forward, dest)
  748. xs_vec_mul_scalar(dest, 9999.0, dest)
  749. xs_vec_add(start, dest, dest)
  750.  
  751. static tr, Float:dist
  752. tr = create_tr2()
  753. engfunc(EngFunc_TraceLine, start, dest, DONT_IGNORE_MONSTERS, index, tr)
  754. get_tr2(tr, TR_vecEndPos, origin)
  755. dist = get_distance_f(start, origin)
  756. origin[0] -= (origin[0] - start[0])/dist
  757. origin[1] -= (origin[1] - start[1])/dist
  758. origin[2] -= (origin[2] - start[2])/dist
  759. get_tr2(tr, TR_vecPlaneNormal, normal)
  760. free_tr2(tr)
  761. }
  762.  
  763. stock add_to_scale(entid, Float:amount)
  764. {
  765. if(!pev_valid(entid))
  766. return 0
  767.  
  768. new Float:f_scale
  769. pev(entid, pev_scale, f_scale)
  770. set_pev(entid, pev_scale, (f_scale + amount))
  771. return 1
  772. }
  773.  
  774. stock move_on_axis(id, toward)
  775. {
  776. static Float:player_origin[3], Float:distance[3], greatest
  777.  
  778. pev(id, pev_origin, player_origin)
  779.  
  780. distance[0] = floatabs(player_origin[0] - g_aim_origin[0])
  781. distance[1] = floatabs(player_origin[1] - g_aim_origin[1])
  782. distance[2] = floatabs(player_origin[2] - g_aim_origin[2])
  783.  
  784. for(new i = 0; i < 3; i++)
  785. {
  786. if(distance[i] > distance[greatest])
  787. {
  788. greatest = i
  789. }
  790. }
  791.  
  792. g_aim_origin[greatest] += (player_origin[greatest] > g_aim_origin[greatest] ? MOVE_DISTANCE * toward : -MOVE_DISTANCE * toward)
  793.  
  794. engfunc(EngFunc_SetOrigin, g_ent, g_aim_origin)
  795. }
  796.  
  797. stock load_saved_ads(filename[])
  798. {
  799. new file_handle = fopen(filename, "r")
  800.  
  801. if(!file_handle)
  802. {
  803. return PLUGIN_HANDLED
  804. }
  805.  
  806. new file_text[64]
  807. new ent, str_value[3][16], Float:f_value[3], Float:angles[3]
  808. new current_ad = -1
  809.  
  810. while(!feof(file_handle) && current_ad < MAX_NUMBER_OF_ADS)
  811. {
  812. fgets(file_handle, file_text, 63)
  813. trim(file_text)
  814.  
  815. if(equal(file_text, "//", 2) || !file_text[0])
  816. continue
  817.  
  818. if(contain(file_text, ".mdl") != -1 || contain(file_text, ".spr") != -1)
  819. {
  820. if(!file_exists(file_text))
  821. {
  822. log_amx(ERROR_FILE_NOT_FOUND, file_text)
  823. continue
  824. }
  825. ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
  826.  
  827. engfunc(EngFunc_SetModel, ent, file_text)
  828.  
  829. current_ad++
  830. }
  831. else if(equal(file_text, "origin", 6))
  832. {
  833. parse(file_text[6], str_value[0], 15, str_value[1], 15, str_value[2], 15)
  834.  
  835. f_value[0] = str_to_float(str_value[0])
  836. f_value[1] = str_to_float(str_value[1])
  837. f_value[2] = str_to_float(str_value[2])
  838.  
  839. engfunc(EngFunc_SetOrigin, ent, f_value)
  840. }
  841. else if(equal(file_text, "angles", 6))
  842. {
  843. parse(file_text[6], str_value[0], 15, str_value[1], 15, str_value[2], 15)
  844.  
  845. f_value[0] = str_to_float(str_value[0])
  846. f_value[1] = str_to_float(str_value[1])
  847. f_value[2] = str_to_float(str_value[2])
  848. angles = f_value
  849.  
  850. set_pev(ent, pev_angles, angles)
  851. }
  852. else if(equal(file_text, "scale", 5))
  853. {
  854. parse(file_text[5], str_value[0], 15)
  855.  
  856. set_pev(ent, pev_scale, str_to_float(str_value[0]))
  857. }
  858. else if(equal(file_text, "framerate", 9))
  859. {
  860. parse(file_text[9], str_value[0], 15)
  861.  
  862. set_pev(ent, pev_framerate, str_to_float(str_value[0]))
  863. set_pev(ent, pev_spawnflags, SF_SPRITE_STARTON)
  864. dllfunc(DLLFunc_Spawn, ent)
  865. set_pev(ent, pev_angles, angles)
  866. }
  867.  
  868. set_pev(ent, pev_classname, MODEL_CLASSNAME)
  869. }
  870.  
  871. fclose(file_handle)
  872.  
  873. return PLUGIN_HANDLED
  874. }
  875.