HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4.  
  5. enum entity_data
  6. {
  7. entity_index,
  8. entity_solid
  9. };
  10.  
  11. #define TASK_ID_CHECK 10000
  12.  
  13. new Array:g_class;
  14. new Array:g_model;
  15. new g_total;
  16.  
  17. new bool:g_connected[33];
  18.  
  19. new g_ent[33];
  20. new g_ent_class[33][32];
  21. new g_ent_model[33][32];
  22.  
  23. new Array:g_undo[33];
  24. new g_total_undo[33];
  25.  
  26. new g_save_file[200];
  27.  
  28. new g_msgid_SayText;
  29. new g_max_players;
  30.  
  31. public plugin_precache()
  32. {
  33. g_class = ArrayCreate(32, 1);
  34. g_model = ArrayCreate(32, 1);
  35.  
  36. get_datadir(g_save_file, 199);
  37. add(g_save_file, 199, "/removed_entities", 0);
  38.  
  39. if( !dir_exists(g_save_file) )
  40. {
  41. mkdir(g_save_file);
  42. }
  43.  
  44. new map[64];
  45. get_mapname(map, 63);
  46. strtolower(map);
  47.  
  48. format(g_save_file, 199, "%s/%s.txt", g_save_file, map);
  49.  
  50. LoadEntities();
  51.  
  52. register_forward(FM_Spawn, "FwdSpawn", 0);
  53.  
  54. return PLUGIN_CONTINUE;
  55. }
  56.  
  57. public plugin_init()
  58. {
  59. register_plugin("Entity Remover", "0.4", "Exolent");
  60.  
  61. register_dictionary("common.txt");
  62. register_dictionary("entity_remover.txt");
  63.  
  64. register_clcmd("er_remove", "CmdRemove", ADMIN_KICK, "-- removes the entity you are currently looking at");
  65. register_clcmd("er_undo", "CmdUndo", ADMIN_KICK, "-- brings back last entity you deleted");
  66. register_concmd("er_reset", "CmdReset", ADMIN_KICK, "-- resets all deleted entities");
  67.  
  68. register_event("HLTV", "EventNewRound", "a", "1=0", "2=0");
  69. register_logevent("EventNewRound", 2, "1=Round_Start");
  70. register_logevent("EventNewRound", 2, "1=Round_End");
  71.  
  72. g_msgid_SayText = get_user_msgid("SayText");
  73. g_max_players = global_get(glb_maxClients);
  74.  
  75. for( new plr = 1; plr <= g_max_players; plr++ )
  76. {
  77. g_undo[plr] = ArrayCreate(2, 1);
  78. }
  79.  
  80. return PLUGIN_CONTINUE;
  81. }
  82.  
  83. public FwdSpawn(ent)
  84. {
  85. if( pev_valid(ent) )
  86. {
  87. set_task(0.1, "TaskDelayedCheck", ent + TASK_ID_CHECK, "", 0, "", 0);
  88.  
  89. return FMRES_HANDLED;
  90. }
  91.  
  92. return FMRES_IGNORED;
  93. }
  94.  
  95. public TaskDelayedCheck(ent)
  96. {
  97. ent -= TASK_ID_CHECK;
  98.  
  99. if( !pev_valid(ent) )
  100. {
  101. return PLUGIN_CONTINUE;
  102. }
  103.  
  104. new class[32], sModel[32];
  105. pev(ent, pev_classname, class, 32);
  106. pev(ent, pev_model, sModel, 32);
  107.  
  108. new saved_class[32], saved_model[32];
  109. for( new i; i < g_total; i++ )
  110. {
  111. ArrayGetString(g_class, i, saved_class, 32);
  112. ArrayGetString(g_model, i, saved_model, 32);
  113.  
  114. if( equal(class, saved_class, 0) && equal(sModel, saved_model, 0) )
  115. {
  116. RemoveEntity(ent);
  117. break;
  118. }
  119. }
  120.  
  121. return PLUGIN_CONTINUE;
  122. }
  123.  
  124. public client_connect(plr)
  125. {
  126. g_ent[plr] = 0;
  127. g_ent_class[plr][0] = '^0';
  128. g_ent_model[plr][0] = '^0';
  129.  
  130. ArrayClear(g_undo[plr]);
  131. g_total_undo[plr] = 0;
  132.  
  133. return PLUGIN_CONTINUE;
  134. }
  135.  
  136. public client_putinserver(plr)
  137. {
  138. g_connected[plr] = true;
  139.  
  140. return PLUGIN_CONTINUE;
  141. }
  142.  
  143. public client_disconnect(plr)
  144. {
  145. g_connected[plr] = false;
  146.  
  147. return PLUGIN_CONTINUE;
  148. }
  149.  
  150. public CmdRemove(plr, level, cid)
  151. {
  152. if( !cmd_access(plr, level, cid, 1) )
  153. {
  154. return PLUGIN_HANDLED;
  155. }
  156.  
  157. g_ent[plr] = GetAimAtEnt(plr);
  158.  
  159. if( pev_valid(g_ent[plr]) )
  160. {
  161. pev(g_ent[plr], pev_classname, g_ent_class[plr], 63);
  162.  
  163. if( equali(g_ent_class[plr], "player", 0) )
  164. {
  165. Print(plr, "%L", plr, "CANNOT_DELETE_PLAYER");
  166.  
  167. return PLUGIN_HANDLED;
  168. }
  169.  
  170. pev(g_ent[plr], pev_model, g_ent_model[plr], 63);
  171.  
  172. new title[96];
  173. formatex(title, 95, "%L", plr, "MENU_REMOVE_ENTITY");
  174. format(title, 95, "%s:\w %s", title, g_ent_class[plr]);
  175.  
  176. new menu = menu_create(title, "MenuDelete", 0);
  177.  
  178. new yes[64], yes_info[32], no[16];
  179. formatex(yes, 63, "%L", plr, "YES");
  180. formatex(yes_info, 31, "%L", plr, "MENU_YES_INFO");
  181. format(yes, 63, "%s \y(%s)", yes, yes_info);
  182. formatex(no, 15, "%L", plr, "NO");
  183.  
  184. menu_additem(menu, yes, "1", 0, -1);
  185. menu_additem(menu, no, "2", 0, -1);
  186.  
  187. menu_setprop(menu, MPROP_PERPAGE, 0);
  188. menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
  189.  
  190. menu_display(plr, menu, 0);
  191. }
  192. else
  193. {
  194. Print(plr, "%L", plr, "AIM_AT_ENTITY");
  195. }
  196.  
  197. return PLUGIN_HANDLED;
  198. }
  199.  
  200. public MenuDelete(plr, menu, item)
  201. {
  202. new _access, info[2], callback;
  203. menu_item_getinfo(menu, item, _access, info, 1, "", 0, callback);
  204.  
  205. if( info[0] == '1' )
  206. {
  207. new solid = pev(g_ent[plr], pev_solid);
  208.  
  209. RemoveEntity(g_ent[plr]);
  210.  
  211. ArrayPushString(g_class, g_ent_class[plr]);
  212. ArrayPushString(g_model, g_ent_model[plr]);
  213. g_total++;
  214.  
  215. SaveEntities();
  216.  
  217. new info[entity_data];
  218. info[entity_index] = g_ent[plr];
  219. info[entity_solid] = solid;
  220.  
  221. ArrayPushArray(g_undo[plr], info);
  222. g_total_undo[plr]++;
  223.  
  224. Print(plr, "%L", plr, "ENTITY_REMOVED");
  225. }
  226.  
  227. g_ent[plr] = 0;
  228. g_ent_class[plr][0] = '^0';
  229. g_ent_model[plr][0] = '^0';
  230.  
  231. menu_destroy(menu);
  232.  
  233. return PLUGIN_HANDLED;
  234. }
  235.  
  236. public CmdUndo(plr, level, cid)
  237. {
  238. if( !cmd_access(plr, level, cid, 1) )
  239. {
  240. return PLUGIN_HANDLED;
  241. }
  242.  
  243. if( !g_total_undo[plr] )
  244. {
  245. console_print(plr, "%L", plr, "NO_UNDO_ENTITIES");
  246.  
  247. return PLUGIN_HANDLED;
  248. }
  249.  
  250. new info[entity_data];
  251. ArrayGetArray(g_undo[plr], --g_total_undo[plr], info);
  252.  
  253. new ent = info[entity_index];
  254.  
  255. ArrayDeleteItem(g_undo[plr], g_total_undo[plr]);
  256.  
  257. if( !pev_valid(ent) )
  258. {
  259. console_print(plr, "%L", plr, "UNDO_INVALID_ENTITY");
  260.  
  261. return PLUGIN_HANDLED;
  262. }
  263.  
  264. set_pev(ent, pev_rendermode, kRenderNormal);
  265. set_pev(ent, pev_renderamt, 16);
  266.  
  267. set_pev(ent, pev_solid, info[entity_solid]);
  268.  
  269. new class[32];
  270. pev(ent, pev_classname, class, 31);
  271.  
  272. console_print(plr, "%L", plr, "UNDO_SUCCESS", class);
  273.  
  274. new model[32];
  275. pev(ent, pev_model, model, 31);
  276.  
  277. new saved_class[32], saved_model[32];
  278. for( new i = 0; i < g_total; i++ )
  279. {
  280. ArrayGetString(g_class, i, saved_class, 31);
  281.  
  282. if( !equal(class, saved_class, 0) )
  283. {
  284. continue;
  285. }
  286.  
  287. ArrayGetString(g_model, i, saved_model, 31);
  288.  
  289. if( equal(model, saved_model, 0) )
  290. {
  291. ArrayDeleteItem(g_class, i);
  292. ArrayDeleteItem(g_model, i);
  293. g_total--;
  294.  
  295. SaveEntities();
  296.  
  297. break;
  298. }
  299. }
  300.  
  301. return PLUGIN_HANDLED;
  302. }
  303.  
  304. public CmdReset(plr, level, cid)
  305. {
  306. if( !cmd_access(plr, level, cid, 1) )
  307. {
  308. return PLUGIN_HANDLED;
  309. }
  310.  
  311. ArrayClear(g_class);
  312. ArrayClear(g_model);
  313. g_total = 0;
  314.  
  315. delete_file(g_save_file);
  316.  
  317. for( new i = 1; i <= g_max_players; i++ )
  318. {
  319. if( g_connected[i] )
  320. {
  321. ArrayClear(g_undo[i]);
  322. g_total_undo[i] = 0;
  323. }
  324. }
  325.  
  326. console_print(plr, "%L", plr, "RESET_1");
  327. console_print(plr, "%L", plr, "RESET_2");
  328.  
  329. return PLUGIN_HANDLED;
  330. }
  331.  
  332. public EventNewRound()
  333. {
  334. if( !g_total )
  335. {
  336. return PLUGIN_CONTINUE;
  337. }
  338.  
  339. new ent, class[32], saved_model[32], ent_model[32];
  340. for( new i = 0; i < g_total; i++ )
  341. {
  342. ArrayGetString(g_class, i, class, 31);
  343. ArrayGetString(g_model, i, saved_model, 31);
  344.  
  345. ent = g_max_players;
  346. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", class)) )
  347. {
  348. pev(ent, pev_model, ent_model, 31);
  349.  
  350. if( equal(saved_model, ent_model, 0) )
  351. {
  352. RemoveEntity(ent);
  353. break;
  354. }
  355. }
  356. }
  357.  
  358. return PLUGIN_CONTINUE;
  359. }
  360.  
  361. LoadEntities()
  362. {
  363. if( file_exists(g_save_file) )
  364. {
  365. new f = fopen(g_save_file, "rt");
  366.  
  367. new data[70], class[32], model[32];
  368.  
  369. while( !feof(f) )
  370. {
  371. fgets(f, data, 69);
  372.  
  373. parse(data, class, 32, model, 32);
  374.  
  375. ArrayPushString(g_class, class);
  376. ArrayPushString(g_model, model);
  377. g_total++;
  378. }
  379.  
  380. fclose(f);
  381.  
  382. return 1;
  383. }
  384.  
  385. return 0;
  386. }
  387.  
  388. SaveEntities()
  389. {
  390. delete_file(g_save_file);
  391.  
  392. new f = fopen(g_save_file, "wt");
  393.  
  394. new data[70], class[32], model[32];
  395.  
  396. for( new i = 0; i < g_total; i++ )
  397. {
  398. ArrayGetString(g_class, i, class, 31);
  399. ArrayGetString(g_model, i, model, 31);
  400.  
  401. formatex(data, 69, "^"%s^" ^"%s^"^n", class, model);
  402.  
  403. fputs(f, data);
  404. }
  405.  
  406. fclose(f);
  407.  
  408. return 1;
  409. }
  410.  
  411. RemoveEntity(ent)
  412. {
  413. set_pev(ent, pev_rendermode, kRenderTransAlpha);
  414. set_pev(ent, pev_renderamt, 0);
  415.  
  416. set_pev(ent, pev_solid, SOLID_NOT);
  417.  
  418. return 1;
  419. }
  420.  
  421. GetAimAtEnt(plr)
  422. {
  423. static Float:start[3], Float:view_ofs[3], Float:dest[3], i;
  424.  
  425. pev(plr, pev_origin, start);
  426. pev(plr, pev_view_ofs, view_ofs);
  427.  
  428. for( i = 0; i < 3; i++ )
  429. {
  430. start[i] += view_ofs[i];
  431. }
  432.  
  433. pev(plr, pev_v_angle, dest);
  434. engfunc(EngFunc_MakeVectors, dest);
  435. global_get(glb_v_forward, dest);
  436.  
  437. for( i = 0; i < 3; i++ )
  438. {
  439. dest[i] *= 9999.0;
  440. dest[i] += start[i];
  441. }
  442.  
  443. engfunc(EngFunc_TraceLine, start, dest, DONT_IGNORE_MONSTERS, plr, 0);
  444.  
  445. return get_tr2(0, TR_pHit);
  446. }
  447.  
  448. Print(plr, const fmt[], any:...)
  449. {
  450. new i = plr ? plr : GetPlayer();
  451. if( !i )
  452. {
  453. return 0;
  454. }
  455.  
  456. new message[192];
  457. message[0] = 0x04;
  458. vformat(message[1], 191, fmt, 3);
  459.  
  460. message_begin(plr ? MSG_ONE : MSG_ALL, g_msgid_SayText, {0, 0, 0}, plr);
  461. write_byte(i);
  462. write_string(message);
  463. message_end();
  464.  
  465. return 1;
  466. }
  467.  
  468. GetPlayer()
  469. {
  470. for( new plr = 1; plr <= g_max_players; plr++ )
  471. {
  472. if( g_connected[plr] )
  473. {
  474. return plr;
  475. }
  476. }
  477.  
  478. return 0;
  479. }
  480.