Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.97 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <xs>
  5.  
  6. #pragma semicolon 1
  7.  
  8. #define OBJECT_BHOP 1
  9. #define OBJECT_BLOCK 2
  10. #define OBJECT_BOOSTBLOCK 3
  11. #define OBJECT_ICEBHOP 4
  12. #define OBJECT_DELAYEDBHOP 5
  13. #define OBJECT_FALLBLOCK 6
  14. #define OBJECT_TELEPORTBLOCK 7
  15. #define OBJECT_FATALISBLOCK 8
  16. #define OBJECT_TINKBLOCK 9
  17. #define OBJECT_MAGICCARPET 10
  18. #define OBJECT_DUCKBLOCK 11
  19. #define OBJECT_SPEEDBLOCK 12
  20. #define OBJECT_SLOWBLOCK 13
  21.  
  22. #define MODEL_NORMAL 1
  23. #define MODEL_WALLZ 2
  24. #define MODEL_WALLX 3
  25. #define MODEL_WALLY 4
  26. #define MODEL_TINY 5
  27. #define MODEL_TELESTART 6
  28. #define MODEL_TELEDEST 7
  29.  
  30. #define TASK_ID_FALLBLOCK 101000
  31. #define TASK_ID_RESETVELOCITY 202000
  32. #define TASK_ID_UNSOLID 303000
  33. #define TASK_ID_SOLID 404000
  34. #define TASK_ID_SETVELOCITY 505000
  35. #define TASK_ID_MAXSPEED 606000
  36. #define TASK_ID_GRAB 707000
  37. #define TASK_ID_SHOWXYZ 808000
  38.  
  39. new const gPLUGIN[] = "BCM";
  40. new const gVERSION[] = "4";
  41. new const gAUTHOR[] = "FatalisDK@gmail.com";
  42.  
  43. new gDir[129] = "addons/amxmodx/data/kzm";
  44.  
  45. new const gTYPES[][] =
  46. {
  47. "",
  48. "_bhop.",
  49. "_block.",
  50. "_boost.",
  51. "_ice.",
  52. "_delayedbhop.",
  53. "_fall.",
  54. "",
  55. "_fatalis.",
  56. "_tink.",
  57. "_magiccarpet.",
  58. "_duck.",
  59. "_speed.",
  60. "_slow."
  61. };
  62.  
  63. new const gMODELTYPES[][] =
  64. {
  65. "",
  66. "normal",
  67. "wall",
  68. "wall",
  69. "wall",
  70. "tiny",
  71. "blue_",
  72. "orange_"
  73. };
  74.  
  75. new const gNORMALMODELS[][] =
  76. {
  77. "",
  78. "models/bcm4/bcm4_normal_bhop.mdl",
  79. "models/bcm4/bcm4_normal_block.mdl",
  80. "models/bcm4/bcm4_normal_boost.mdl",
  81. "models/bcm4/bcm4_normal_ice.mdl",
  82. "models/bcm4/bcm4_normal_delayedbhop.mdl",
  83. "models/bcm4/bcm4_normal_fall.mdl",
  84. "",
  85. "models/bcm4/bcm4_normal_fatalis.mdl",
  86. "models/bcm4/bcm4_normal_tink.mdl",
  87. "models/bcm4/bcm4_normal_magiccarpet.mdl",
  88. "models/bcm4/bcm4_normal_duck.mdl",
  89. "models/bcm4/bcm4_normal_speed.mdl",
  90. "models/bcm4/bcm4_normal_slow.mdl"
  91. };
  92.  
  93. new const gTINYMODELS[][] =
  94. {
  95. "",
  96. "models/bcm4/bcm4_tiny_bhop.mdl",
  97. "models/bcm4/bcm4_tiny_block.mdl",
  98. "models/bcm4/bcm4_tiny_boost.mdl",
  99. "models/bcm4/bcm4_tiny_ice.mdl",
  100. "models/bcm4/bcm4_tiny_delayedbhop.mdl",
  101. "models/bcm4/bcm4_tiny_fall.mdl",
  102. "",
  103. "models/bcm4/bcm4_tiny_fatalis.mdl",
  104. "models/bcm4/bcm4_tiny_tink.mdl",
  105. "models/bcm4/bcm4_tiny_magiccarpet.mdl",
  106. "models/bcm4/bcm4_tiny_duck.mdl",
  107. "models/bcm4/bcm4_tiny_speed.mdl",
  108. "models/bcm4/bcm4_tiny_slow.mdl"
  109. };
  110.  
  111. new const gWALLMODELS[][] =
  112. {
  113. "",
  114. "models/bcm4/bcm4_wall_bhop.mdl",
  115. "models/bcm4/bcm4_wall_block.mdl",
  116. "models/bcm4/bcm4_wall_boost.mdl",
  117. "models/bcm4/bcm4_wall_ice.mdl",
  118. "models/bcm4/bcm4_wall_delayedbhop.mdl",
  119. "models/bcm4/bcm4_wall_fall.mdl",
  120. "",
  121. "models/bcm4/bcm4_wall_fatalis.mdl",
  122. "models/bcm4/bcm4_wall_tink.mdl",
  123. "models/bcm4/bcm4_wall_magiccarpet.mdl",
  124. "models/bcm4/bcm4_wall_duck.mdl",
  125. "models/bcm4/bcm4_wall_speed.mdl",
  126. "models/bcm4/bcm4_wall_slow.mdl"
  127. };
  128.  
  129. new const gTELEPORTMODELS[][] =
  130. {
  131. "models/teleporter_blue_sprites.mdl",
  132. "models/teleporter_orange_rings.mdl"
  133. };
  134.  
  135. new const gGLOWS[][] =
  136. {
  137. {-1, -1, -1},// NULL
  138. {0, 0, 0}, // BHOP
  139. {0, 255, 0}, // BLOCK
  140. {255, 255, 0}, // BOOSTBLOCK
  141. {0, 255, 255}, // ICEBHOP
  142. {255, 0, 0}, // DELAYEDBHOP 100,0,0
  143. {0, 0, 255}, // FALLBLOCK
  144. {255, 255, 0}, // TELEPORTBLOCK
  145. {255, 255, 255}, // FATALISBLOCK
  146. {148, 0, 211}, // TINKBLOCK
  147. {50, 50, 100}, // MAGICCARPET
  148. {255, 150, 150}, // DUCKBLOCK
  149. {75, 200, 150}, // SPEEDBLOCK
  150. {139, 69, 19} // SLOWBLOCK
  151. };
  152.  
  153. new const Float:gMINS[][] =
  154. {
  155. {-1.0, -1.0, -1.0}, // NULL
  156. {-32.0, -32.0, -4.0}, // Normal
  157. {-64.0, -64.0, -4.0}, // Wall Z
  158. {-64.0, -4.0, -64.0}, // Wall X
  159. {-4.0, -64.0, -64.0}, // Wall Y
  160. {-8.0, -8.0, -4.0}, // Tiny
  161. {-16.0, -16.0, -16.0}, // Tele Start
  162. {-16.0, -16.0, -16.0} // NULL (Tele Dest)
  163. };
  164.  
  165. new const Float:gMAXS[][] =
  166. {
  167. {-1.0, -1.0, -1.0}, // NULL
  168. {32.0, 32.0, 4.0}, // Normal
  169. {64.0, 64.0, 4.0}, // Wall Z
  170. {64.0, 4.0, 64.0}, // Wall X
  171. {4.0, 64.0, 64.0}, // Wall Y
  172. {8.0, 8.0, 4.0}, // Tiny
  173. {16.0, 16.0, 16.0}, // Tele Start
  174. {16.0, 16.0, 16.0} // Tele Dest
  175. };
  176.  
  177. new const gOBJECTNAMES[][] =
  178. {
  179. "",
  180. "Bhop - Regular Bhop",
  181. "Block - Regular Block",
  182. "Boost Block - Boosts you in the air",
  183. "Ice Bhop - No slowdown when landing",
  184. "Delayed Bhop - 1 sec disappear delay",
  185. "Fall Block - No fall damage",
  186. "Teleport",
  187. "Fatalis Block - Damage 10hp/sec",
  188. "Tink Block - Heal 2hp/sec",
  189. "Magic Carpet Block - CT's can ride on it",
  190. "Duck Block - Spams duck repeatedly",
  191. "Speed Block - Gives speed boost",
  192. "Slow Block - Slows you after 3 seconds"
  193. };
  194.  
  195. new gMainMenu;
  196.  
  197. new gBuildMenu;
  198. new gMoveMenu;
  199. new gModelMenu;
  200.  
  201. new gMsgSayText;
  202. new gMaxPlayers;
  203.  
  204. new Float:gSlowedTime[33];
  205. new gEntSlowed[33];
  206. new gCvarLimit;
  207. new gCvarAccessBuild;
  208. new gCvarAccessMove;
  209. new gCvarAccessDelete;
  210. new gCvarAccessNoclip;
  211. new gCvarAccessLoad;
  212. new gCvarAccessNewConfig;
  213. new gCvarAccessSave;
  214. new gCvarAccessMagicCarpet;
  215.  
  216. new Float:gSetVelocity[33][3];
  217.  
  218. new gChoseModel[33];
  219. new gBeamSprite;
  220.  
  221. new gGrabLength[33];
  222. new gCurConfig[33] = "default";
  223.  
  224. public plugin_precache()
  225. {
  226. for( new i = 1; i < sizeof(gNORMALMODELS); i++ )
  227. {
  228. if( i != OBJECT_TELEPORTBLOCK )
  229. {
  230. precache_model(gNORMALMODELS[i]);
  231. }
  232. }
  233.  
  234. for( new i = 1; i < sizeof(gTINYMODELS); i++ )
  235. {
  236. if( i != OBJECT_TELEPORTBLOCK )
  237. {
  238. precache_model(gTINYMODELS[i]);
  239. }
  240. }
  241.  
  242. for( new i = 1; i < sizeof(gWALLMODELS); i++ )
  243. {
  244. if( i != OBJECT_TELEPORTBLOCK )
  245. {
  246. precache_model(gWALLMODELS[i]);
  247. }
  248. }
  249.  
  250. for( new i = 0; i < sizeof(gTELEPORTMODELS); i++ )
  251. {
  252. precache_model(gTELEPORTMODELS[i]);
  253. }
  254.  
  255. gBeamSprite = precache_model("sprites/zbeam4.spr");
  256.  
  257. return PLUGIN_CONTINUE;
  258. }
  259.  
  260. public plugin_init()
  261. {
  262. register_plugin(gPLUGIN, gVERSION, gAUTHOR);
  263.  
  264. gCvarLimit = register_cvar("bcm_limit", "320", 0, 0.0);
  265. register_cvar("bcm4", "kzmed", FCVAR_SERVER|FCVAR_SPONLY, 0.0);
  266.  
  267. gCvarAccessBuild = register_cvar("bcm_access_build", "c", FCVAR_SPONLY, 0.0);
  268. gCvarAccessMove = register_cvar("bcm_access_move", "c", FCVAR_SPONLY, 0.0);
  269. gCvarAccessDelete = register_cvar("bcm_access_delete", "c", FCVAR_SPONLY, 0.0);
  270. gCvarAccessNoclip = register_cvar("bcm_access_noclip", "c", FCVAR_SPONLY, 0.0);
  271. gCvarAccessLoad = register_cvar("bcm_access_load", "c", FCVAR_SPONLY, 0.0);
  272. gCvarAccessNewConfig = register_cvar("bcm_access_newconfig", "c", FCVAR_SPONLY, 0.0);
  273. gCvarAccessSave = register_cvar("bcm_access_save", "c", FCVAR_SPONLY, 0.0);
  274. gCvarAccessMagicCarpet = register_cvar("bcm_access_magiccarpet", "c", FCVAR_SPONLY, 0.0);
  275.  
  276. new szAccessFlag[2];
  277. get_pcvar_string(gCvarAccessBuild, szAccessFlag, 1);
  278. new accessBuild = read_flags(szAccessFlag);
  279.  
  280. get_pcvar_string(gCvarAccessMove, szAccessFlag, 1);
  281. new accessMove = read_flags(szAccessFlag);
  282.  
  283. get_pcvar_string(gCvarAccessDelete, szAccessFlag, 1);
  284. new accessDelete = read_flags(szAccessFlag);
  285.  
  286. get_pcvar_string(gCvarAccessNoclip, szAccessFlag, 1);
  287. new accessNoclip = read_flags(szAccessFlag);
  288.  
  289. get_pcvar_string(gCvarAccessNewConfig, szAccessFlag, 1);
  290. new accessNewConfig = read_flags(szAccessFlag);
  291.  
  292. get_pcvar_string(gCvarAccessSave, szAccessFlag, 1);
  293. new accessSave = read_flags(szAccessFlag);
  294.  
  295. get_pcvar_string(gCvarAccessMagicCarpet, szAccessFlag, 1);
  296. new accessMagicCarpet = read_flags(szAccessFlag);
  297.  
  298. register_forward(FM_Touch, "fwdTouch", 0);
  299.  
  300. register_event("HLTV", "msgNewRound", "a", "1=0", "2=0");
  301.  
  302. register_forward(FM_PlayerPreThink, "fwdPlayerPreThink", 0);
  303.  
  304. gMsgSayText = get_user_msgid("SayText");
  305. gMaxPlayers = get_maxplayers();
  306.  
  307. gMainMenu = menu_create("BCM4 by [KzM] Fatalis", "mnuMain", 0);
  308. menu_additem(gMainMenu, "Menu dos blocos", "1", 0, -1);
  309. menu_additem(gMainMenu, "Menu move", "2", 0, -1);
  310. menu_additem(gMainMenu, "Deletar", "3", accessDelete, -1);
  311. menu_additem(gMainMenu, "Noclip", "4", accessNoclip, -1);
  312. menu_additem(gMainMenu, "Carregar", "5", 0, -1);
  313. menu_additem(gMainMenu, "Salvar", "6", accessSave, -1);
  314.  
  315. gBuildMenu = menu_create("Build Menu", "mnuBuild", 0);
  316. menu_additem(gBuildMenu, "Bhop", "1", accessBuild, -1);
  317. menu_additem(gBuildMenu, "Block", "2", accessBuild, -1);
  318. menu_additem(gBuildMenu, "Boost Block", "3", accessBuild, -1);
  319. menu_additem(gBuildMenu, "Ice Bhop", "4", accessBuild, -1);
  320. menu_additem(gBuildMenu, "Delayed Bhop", "5", accessBuild, -1);
  321. menu_additem(gBuildMenu, "Fall Block", "6", accessBuild, -1);
  322. menu_additem(gBuildMenu, "Teleport", "7", accessBuild, -1);
  323. menu_additem(gBuildMenu, "Fatalis Block", "8", accessBuild, -1);
  324. menu_additem(gBuildMenu, "Tink Block", "9", accessBuild, -1);
  325. menu_additem(gBuildMenu, "Magic Carpet", "10", accessMagicCarpet, -1);
  326. menu_additem(gBuildMenu, "Duck Block", "11", accessBuild, -1);
  327. menu_additem(gBuildMenu, "Speed Block", "12", accessBuild, -1);
  328. menu_additem(gBuildMenu, "Slow Block", "13", accessBuild, -1);
  329.  
  330. menu_setprop(gBuildMenu, MPROP_EXITNAME, "Main Menu");
  331.  
  332. gMoveMenu = menu_create("Move Menu", "mnuMove", 0);
  333. menu_additem(gMoveMenu, "Z+ Green", "1", accessMove, -1);
  334. menu_additem(gMoveMenu, "Z-", "2", accessMove, -1);
  335. menu_additem(gMoveMenu, "X+ Red", "3", accessMove, -1);
  336. menu_additem(gMoveMenu, "X-", "4", accessMove, -1);
  337. menu_additem(gMoveMenu, "Y+ Blue", "5", accessMove, -1);
  338. menu_additem(gMoveMenu, "Y-", "6", accessMove, -1);
  339. menu_additem(gMoveMenu, "Z++", "7", accessMove, -1);
  340. menu_setprop(gMoveMenu, MPROP_EXITNAME, "Main Menu");
  341.  
  342. gModelMenu = menu_create("Model Menu", "mnuModel", 0);
  343. menu_additem(gModelMenu, "Normal", "1", 0, -1);
  344. menu_additem(gModelMenu, "Wall Z (Green)", "2", 0, -1);
  345. menu_additem(gModelMenu, "Wall X (Red)", "3", 0, -1);
  346. menu_additem(gModelMenu, "Wall Y (Blue)", "4", 0, -1);
  347. menu_additem(gModelMenu, "Tiny", "5", 0, -1);
  348. menu_setprop(gMoveMenu, MPROP_EXITNAME, "Main Menu");
  349.  
  350. register_clcmd("say /bhopmenu", "cmdBhopMenu", -1, "");
  351. register_clcmd("say /bcm", "cmdBhopMenu", -1, "");
  352. register_clcmd("amx_bcm", "cmdBhopMenu", -1, "");
  353. register_clcmd("bcm_newconfig", "cmdNewConfig", accessNewConfig, "");
  354.  
  355. register_clcmd("+bcmgrab", "cmdBCMGrabOn", accessMove, "");
  356. register_clcmd("-bcmgrab", "cmdBCMGrabOff", accessMove, "");
  357.  
  358. register_srvcmd("bcm_backwardscompat2", "fnConvertFrom2", -1, "");
  359.  
  360. if( !dir_exists(gDir) )
  361. {
  362. mkdir(gDir);
  363. }
  364.  
  365. add(gDir, 128, "/bcm", 0);
  366.  
  367. if( !dir_exists(gDir) )
  368. {
  369. mkdir(gDir);
  370. }
  371.  
  372. new szMap[33];
  373. get_mapname(szMap, 32);
  374.  
  375. format(gDir, 128, "%s/%s", gDir, szMap);
  376.  
  377. if( !dir_exists(gDir) )
  378. {
  379. mkdir(gDir);
  380. }
  381.  
  382. fnBackwardsCompat3();
  383.  
  384. fnLoad("default");
  385.  
  386. set_task(2.0, "tskShowObjectInfo", 0, "", 0, "b", 0);
  387.  
  388. return PLUGIN_CONTINUE;
  389. }
  390.  
  391. public cmdNewConfig(plr, level, cid)
  392. {
  393. if( !cmd_access(plr, level, cid, 2) )
  394. {
  395. return PLUGIN_HANDLED;
  396. }
  397.  
  398. new szArg[33];
  399. read_argv(1, szArg, 32);
  400.  
  401. if( !fnIsStringAlphaNumeric(szArg) )
  402. {
  403. fnGreenChat(plr, "[KzM] Config name must be alphanumeric.");
  404.  
  405. return PLUGIN_HANDLED;
  406. }
  407.  
  408. new szPath[129];
  409. format(szPath, 128, "%s/%s.txt", gDir, szArg);
  410.  
  411. if( !file_exists(szPath) )
  412. {
  413. new f = fopen(szPath, "wt");
  414. fputs(f, "");
  415. fclose(f);
  416.  
  417. new szName[32];
  418. get_user_name(plr, szName, 32);
  419.  
  420. fnGreenChat(0, "[KzM] %s created config ^"%s^".", szName, szArg);
  421. }
  422.  
  423. return PLUGIN_HANDLED;
  424. }
  425.  
  426. fnBackwardsCompat3()
  427. {
  428. new szPath[129];
  429. format(szPath, 128, "%s.txt", gDir);
  430.  
  431. if( file_exists(szPath) )
  432. {
  433. new szNewPath[129];
  434. format(szNewPath, 128, "%s/default.txt", gDir);
  435.  
  436. new szData[129], f = fopen(szPath, "rt"), newf = fopen(szNewPath, "at");
  437. while( !feof(f) )
  438. {
  439. fgets(f, szData, 128);
  440.  
  441. if( szData[0] == '^0' )
  442. {
  443. continue;
  444. }
  445.  
  446. fputs(newf, szData);
  447. }
  448. fclose(f);
  449. fclose(newf);
  450.  
  451. delete_file(szPath);
  452. }
  453. }
  454.  
  455. public cmdBCMGrabOn(plr, level, cid)
  456. {
  457. if( !cmd_access(plr, level, cid, 1) )
  458. {
  459. return PLUGIN_HANDLED;
  460. }
  461.  
  462. new ent = fnGetAimEnt(plr);
  463.  
  464. new type = fnGetObjectType(ent);
  465.  
  466. if( type )
  467. {
  468. new szEnt[5];
  469. num_to_str(ent, szEnt, 4);
  470.  
  471. new Float:vPlayerOrigin[3], Float:vEntOrigin[3];
  472. pev(plr, pev_origin, vPlayerOrigin);
  473. pev(ent, pev_origin, vEntOrigin);
  474.  
  475. gGrabLength[plr] = floatround(vector_distance(vPlayerOrigin, vEntOrigin));
  476.  
  477. set_task(0.1, "tskGrab", TASK_ID_GRAB + plr, szEnt, 4, "b", 0);
  478. }
  479.  
  480. return PLUGIN_HANDLED_MAIN;
  481. }
  482.  
  483. public cmdBCMGrabOff(plr, level, cid)
  484. {
  485. if( !cmd_access(plr, level, cid, 1) )
  486. {
  487. return PLUGIN_HANDLED;
  488. }
  489.  
  490. remove_task(TASK_ID_GRAB + plr, 0);
  491.  
  492. return PLUGIN_HANDLED;
  493. }
  494.  
  495. public tskGrab(const szEnt[], plr)
  496. {
  497. plr -= TASK_ID_GRAB;
  498.  
  499. static ent;
  500. ent = str_to_num(szEnt);
  501.  
  502. static Float:vAim[3];
  503. velocity_by_aim(plr, gGrabLength[plr], vAim);
  504.  
  505. static Float:vOrigin[3];
  506. pev(plr, pev_origin, vOrigin);
  507.  
  508. vOrigin[0] += vAim[0];
  509. vOrigin[1] += vAim[1];
  510. vOrigin[2] += vAim[2];
  511.  
  512. fnSetOriginSnap(ent, vOrigin);
  513.  
  514. return PLUGIN_CONTINUE;
  515. }
  516.  
  517. public cmdBhopMenu(plr, level, cid)
  518. {
  519. menu_display(plr, gMainMenu, 0);
  520.  
  521. return PLUGIN_CONTINUE;
  522. }
  523.  
  524. public mnuMain(plr, menu, item)
  525. {
  526. if( item == MENU_EXIT )
  527. {
  528. return PLUGIN_CONTINUE;
  529. }
  530.  
  531. new szCmd[3], _access, callback;
  532. menu_item_getinfo(menu, item, _access, szCmd, 2, "", 0, callback);
  533.  
  534. switch( str_to_num(szCmd) )
  535. {
  536. case 1: // Build
  537. {
  538. menu_display(plr, gModelMenu, 0);
  539. set_task(0.1, "tskShowXYZ", TASK_ID_SHOWXYZ + plr, "", 0, "b", 0);
  540. return PLUGIN_CONTINUE;
  541. }
  542. case 2: // Move
  543. {
  544. menu_display(plr, gMoveMenu, 0);
  545. set_task(0.1, "tskShowXYZ", TASK_ID_SHOWXYZ + plr, "", 0, "b", 0);
  546. return PLUGIN_CONTINUE;
  547. }
  548. case 3: // Delete
  549. {
  550. new ent = fnGetAimEnt(plr);
  551.  
  552. new type = fnGetObjectType(ent);
  553. if( type )
  554. {
  555. if( type != 99 )
  556. {
  557. engfunc(EngFunc_RemoveEntity, ent);
  558. }
  559. else
  560. {
  561. new szTarget[5];
  562. pev(ent, pev_target, szTarget, 4);
  563.  
  564. new dest = engfunc(EngFunc_FindEntityByString, -1,
  565. "targetname", szTarget);
  566.  
  567. engfunc(EngFunc_RemoveEntity, ent);
  568. if( dest )
  569. {
  570. engfunc(EngFunc_RemoveEntity, dest);
  571. }
  572. }
  573. }
  574. }
  575. case 4: // Noclip
  576. {
  577. if( get_user_flags(plr, 0)&ADMIN_KICK ) // quick fix for a bug that only happens on one person's server
  578. {
  579. set_pev(plr, pev_movetype, pev(plr, pev_movetype) == MOVETYPE_WALK ?
  580. MOVETYPE_NOCLIP : MOVETYPE_WALK);
  581. }
  582. }
  583. case 5: // Load
  584. {
  585. new szTitle[49];
  586. format(szTitle, 48, "Load Menu - Current: %s", gCurConfig);
  587.  
  588. new menu = menu_create(szTitle, "mnuLoad", 0);
  589.  
  590. new szAccessFlag[2];
  591. get_pcvar_string(gCvarAccessLoad, szAccessFlag, 1);
  592. new accessLoad = read_flags(szAccessFlag);
  593.  
  594. new dir = open_dir(gDir, "", 0);
  595.  
  596. new szFileName[65];
  597. while( next_file(dir, szFileName, 64) )
  598. {
  599. if( szFileName[0] == '.' )
  600. {
  601. continue;
  602. }
  603.  
  604. replace(szFileName, 64, ".txt", "");
  605. menu_additem(menu, szFileName, "", accessLoad, -1);
  606. }
  607. close_dir(dir);
  608.  
  609. menu_additem(menu, "\rNew Config", "1", 0, -1);
  610.  
  611. menu_setprop(menu, MPROP_EXITNAME, "Main Menu");
  612.  
  613. menu_display(plr, menu, 0);
  614.  
  615. return PLUGIN_CONTINUE;
  616.  
  617. /*new ent = fnGetAimEnt(plr);
  618.  
  619. new type = fnGetObjectType(ent);
  620. if( type && type != 99 )
  621. {
  622. new szName[32];
  623. pev(ent, pev_targetname, szName, 31);
  624.  
  625. if( szName[0] == '^0' )
  626. {
  627. copy(szName, 31, "Unknown");
  628. }
  629.  
  630. fnGreenChat(plr, "[KzM] Creator: %s", szName);
  631. }
  632. else
  633. {
  634. fnGreenChat(plr, "[KzM] Aim at an object first.");
  635. }*/
  636.  
  637. }
  638. case 6: // Save
  639. {
  640. new szName[32];
  641. get_user_name(plr, szName, 31);
  642.  
  643. fnGreenChat(0, "[KzM] %s saved config ^"%s^", %i objects.", szName,
  644. gCurConfig, fnSave());
  645. }
  646. }
  647.  
  648. menu_display(plr, gMainMenu, 0);
  649.  
  650. return PLUGIN_CONTINUE;
  651. }
  652.  
  653. public mnuLoad(plr, menu, item)
  654. {
  655. if( item == MENU_EXIT )
  656. {
  657. menu_destroy(menu);
  658. menu_display(plr, gMainMenu, 0);
  659. return PLUGIN_CONTINUE;
  660. }
  661.  
  662. new szCmd[2], szItem[33], _access, callback;
  663. menu_item_getinfo(menu, item, _access, szCmd, 1, szItem, 32, callback);
  664.  
  665. if( str_to_num(szCmd) )
  666. {
  667. fnGreenChat(plr, "[KzM] Type a name for the new config.");
  668.  
  669. client_cmd(plr, "messagemode bcm_newconfig");
  670.  
  671. menu_destroy(menu);
  672. menu_display(plr, gMainMenu, 0);
  673. return PLUGIN_CONTINUE;
  674. }
  675.  
  676. new szName[32];
  677. get_user_name(plr, szName, 32);
  678.  
  679. fnGreenChat(0, "[KzM] %s loaded config ^"%s^", %i objects.", szName, szItem, fnLoad(szItem));
  680.  
  681. menu_destroy(menu);
  682. menu_display(plr, gMainMenu, 0);
  683. return PLUGIN_CONTINUE;
  684. }
  685.  
  686. public mnuBuild(plr, menu, item)
  687. {
  688. if( item == MENU_EXIT )
  689. {
  690. menu_display(plr, gMainMenu, 0);
  691. return PLUGIN_CONTINUE;
  692. }
  693.  
  694. new szCmd[3], _access, callback;
  695. menu_item_getinfo(menu, item, _access, szCmd, 2, "", 0, callback);
  696.  
  697. new cmd = str_to_num(szCmd);
  698.  
  699. if( fnGetObjectCount() >= get_pcvar_num(gCvarLimit) )
  700. {
  701. fnGreenChat(plr, "[KzM] Object limit of %i reached.", get_pcvar_num(gCvarLimit));
  702. menu_display(plr, gBuildMenu, cmd > 7 ? 1 : 0);
  703. return PLUGIN_CONTINUE;
  704. }
  705.  
  706. switch( cmd )
  707. {
  708. case 1..6, 8..13:
  709. {
  710. new Float:vOrigin[3];
  711. fnGetAimOrigin(plr, vOrigin);
  712. vOrigin[2] += 4.0;
  713.  
  714. new szName[32];
  715. get_user_name(plr, szName, 31);
  716. replace_all(szName, 31, " ", "_");
  717.  
  718. fnMakeObject(cmd, gChoseModel[plr], vOrigin, szName);
  719. }
  720. case OBJECT_TELEPORTBLOCK:
  721. {
  722. new Float:vOrigin[3];
  723. fnGetAimOrigin(plr, vOrigin);
  724. vOrigin[2] += 4.0;
  725.  
  726. static bool:alt[33], szRand[33][5];
  727. if( !alt[plr] )
  728. {
  729. alt[plr] = true;
  730.  
  731. format(szRand[plr], 4, "%c%c%c%c",
  732. random_num('a', 'z'),
  733. random_num('a', 'z'),
  734. random_num('a', 'z'),
  735. random_num('a', 'z'));
  736.  
  737. fnMakeTeleport(vOrigin, szRand[plr], true);
  738. }
  739. else
  740. {
  741. alt[plr] = false;
  742.  
  743. fnMakeTeleport(vOrigin, szRand[plr], false);
  744. }
  745. }
  746. }
  747.  
  748. menu_display(plr, gBuildMenu, cmd > 7 ? 1 : 0);
  749.  
  750. return PLUGIN_CONTINUE;
  751. }
  752.  
  753. public mnuMove(plr, menu, item)
  754. {
  755. if( item == MENU_EXIT )
  756. {
  757. menu_display(plr, gMainMenu, 0);
  758. remove_task(TASK_ID_SHOWXYZ + plr, 0);
  759.  
  760. return PLUGIN_CONTINUE;
  761. }
  762.  
  763. new ent = fnGetAimEnt(plr);
  764.  
  765. if( !fnGetObjectType(ent) )
  766. {
  767. menu_display(plr, gMoveMenu, 0);
  768. return PLUGIN_CONTINUE;
  769. }
  770.  
  771. new Float:vOrigin[3];
  772. pev(ent, pev_origin, vOrigin);
  773.  
  774. new szCmd[3], _access, callback;
  775. menu_item_getinfo(menu, item, _access, szCmd, 2, "", 0, callback);
  776.  
  777. switch( str_to_num(szCmd) )
  778. {
  779. case 1:
  780. {
  781. vOrigin[2] += 2.0;
  782. }
  783. case 2:
  784. {
  785. vOrigin[2] -= 2.0;
  786. }
  787. case 3:
  788. {
  789. vOrigin[0] += 2.0;
  790. }
  791. case 4:
  792. {
  793. vOrigin[0] -= 2.0;
  794. }
  795. case 5:
  796. {
  797. vOrigin[1] += 2.0;
  798. }
  799. case 6:
  800. {
  801. vOrigin[1] -= 2.0;
  802. }
  803. case 7:
  804. {
  805. vOrigin[2] += 8.0;
  806. }
  807. }
  808.  
  809. fnSetOriginSnap(ent, vOrigin);
  810.  
  811. menu_display(plr, gMoveMenu, 0);
  812.  
  813. return PLUGIN_CONTINUE;
  814. }
  815.  
  816. public mnuModel(plr, menu, item)
  817. {
  818. new szCmd[3], _access, callback;
  819. menu_item_getinfo(menu, item, _access, szCmd, 2, "", 0, callback);
  820.  
  821. remove_task(TASK_ID_SHOWXYZ + plr, 0);
  822.  
  823. gChoseModel[plr] = str_to_num(szCmd);
  824.  
  825. menu_display(plr, gBuildMenu, 0);
  826.  
  827. return PLUGIN_CONTINUE;
  828. }
  829.  
  830. public fwdTouch(ent, plr)
  831. {
  832. if( !is_user_alive(plr) )
  833. {
  834. return FMRES_IGNORED;
  835. }
  836.  
  837. static szEntClass[6];
  838. pev(ent, pev_classname, szEntClass, 5);
  839.  
  840. if( equal(szEntClass, "bcm_3", 0) )
  841. {
  842. new type = fnGetObjectType(ent);
  843.  
  844. switch( type )
  845. {
  846. case OBJECT_BHOP:
  847. {
  848. if( !task_exists(TASK_ID_UNSOLID + ent, 0)
  849. && !task_exists(TASK_ID_SOLID + ent, 0) )
  850. {
  851. set_task(0.1, "tskUnsolid", TASK_ID_UNSOLID + ent, "", 0, "", 0);
  852. }
  853. }
  854. case OBJECT_BLOCK:
  855. {
  856.  
  857. }
  858. case OBJECT_BOOSTBLOCK:
  859. {
  860. pev(plr, pev_velocity, gSetVelocity[plr]);
  861.  
  862. gSetVelocity[plr][2] = 600.0;
  863. if( !task_exists(TASK_ID_FALLBLOCK + plr, 0) )
  864. {
  865. set_pev(plr, pev_takedamage, 0.0);
  866. set_task(0.0, "tskFallBlock", TASK_ID_FALLBLOCK + plr, "", 0, "", 0);
  867. }
  868. }
  869. case OBJECT_ICEBHOP:
  870. {
  871. set_pev(plr, pev_fuser2, 0.0);
  872.  
  873. if( !task_exists(TASK_ID_UNSOLID + ent, 0)
  874. && !task_exists(TASK_ID_SOLID + ent, 0) )
  875. {
  876. set_task(0.1, "tskUnsolid", TASK_ID_UNSOLID + ent, "", 0, "", 0);
  877. }
  878. }
  879. case OBJECT_DELAYEDBHOP:
  880. {
  881. if( !task_exists(TASK_ID_UNSOLID + ent, 0)
  882. && !task_exists(TASK_ID_SOLID + ent, 0) )
  883. {
  884. set_task(1.0, "tskUnsolid", TASK_ID_UNSOLID + ent, "", 0, "", 0);
  885. }
  886. }
  887. case OBJECT_FALLBLOCK:
  888. {
  889. static Float:lastTouch[33];
  890.  
  891. if( get_gametime() - lastTouch[plr] < 1.0 )
  892. {
  893. return FMRES_IGNORED;
  894. }
  895.  
  896. lastTouch[plr] = get_gametime();
  897.  
  898. if( !task_exists(TASK_ID_FALLBLOCK + plr, 0) )
  899. {
  900. set_pev(plr, pev_takedamage, 0.0);
  901. set_task(0.0, "tskFallBlock", TASK_ID_FALLBLOCK + plr, "", 0, "", 0);
  902. }
  903. }
  904. case OBJECT_TELEPORTBLOCK:
  905. {
  906.  
  907. }
  908. case OBJECT_FATALISBLOCK:
  909. {
  910. static Float:lastTouched[33];
  911.  
  912. if( get_gametime() - lastTouched[plr] > 1.0 )
  913. {
  914. new Float:health;
  915. pev(plr, pev_health, health);
  916.  
  917. if( health > 10.0 )
  918. {
  919. if( pev(plr, pev_takedamage) )
  920. {
  921. set_pev(plr, pev_health, health - 10.0);
  922. }
  923. }
  924. else
  925. {
  926. user_kill(plr, 0);
  927. }
  928.  
  929. lastTouched[plr] = get_gametime();
  930. }
  931. }
  932. case OBJECT_TINKBLOCK:
  933. {
  934. static Float:lastTouched[33];
  935.  
  936. if( get_gametime() - lastTouched[plr] > 1.0 )
  937. {
  938. new Float:health;
  939. pev(plr, pev_health, health);
  940. if( health <= 98.0 )
  941. {
  942. set_pev(plr, pev_health, health + 2.0);
  943. }
  944.  
  945. lastTouched[plr] = get_gametime();
  946. }
  947. }
  948. case OBJECT_MAGICCARPET:
  949. {
  950. if( get_user_team(plr, "", 0) == 2)
  951. {
  952. new Float:vVelocity[3];
  953. pev(plr, pev_velocity, vVelocity);
  954. vVelocity[2] = 0.0;
  955. set_pev(ent, pev_velocity, vVelocity);
  956. }
  957. }
  958. case OBJECT_DUCKBLOCK:
  959. {
  960. set_pev(plr, pev_bInDuck, 1);
  961. }
  962. case OBJECT_SPEEDBLOCK:
  963. {
  964. velocity_by_aim(plr, 1200, gSetVelocity[plr]);
  965. gSetVelocity[plr][2] = 0.0;
  966. }
  967. case OBJECT_SLOWBLOCK:
  968. {
  969. if( get_gametime() - gSlowedTime[plr] < 3.0
  970. && gEntSlowed[plr] == ent )
  971. {
  972. set_pev(plr, pev_maxspeed, 75.0);
  973. }
  974.  
  975. if( !task_exists(TASK_ID_MAXSPEED + plr, 0) )
  976. {
  977. new szEntId[5];
  978. num_to_str(ent, szEntId, 4);
  979.  
  980. set_task(3.0, "tskMaxSpeed", TASK_ID_MAXSPEED + plr, szEntId, 4, "", 0);
  981. }
  982. }
  983. }
  984. }
  985. else if( equal(szEntClass, "bcm_t", 0) )
  986. {
  987. new szTarget[5];
  988. pev(ent, pev_target, szTarget, 4);
  989.  
  990. new dest = engfunc(EngFunc_FindEntityByString, -1, "targetname", szTarget);
  991.  
  992. if( dest )
  993. {
  994. new Float:vOrigin[3];
  995. pev(dest, pev_origin, vOrigin);
  996. vOrigin[2] += 64.0;
  997.  
  998. if( !task_exists(TASK_ID_RESETVELOCITY + plr, 0) )
  999. {
  1000. set_task(0.0, "tskResetVelocity", TASK_ID_RESETVELOCITY + plr, "", 0, "", 0);
  1001. }
  1002.  
  1003. engfunc(EngFunc_SetOrigin, plr, vOrigin);
  1004. }
  1005. }
  1006.  
  1007. return FMRES_IGNORED;
  1008. }
  1009.  
  1010. public tskMaxSpeed(const szEntId[], plr)
  1011. {
  1012. plr -= TASK_ID_MAXSPEED;
  1013.  
  1014. if( is_user_alive(plr) )
  1015. {
  1016. gSlowedTime[plr] = get_gametime();
  1017.  
  1018. gEntSlowed[plr] = str_to_num(szEntId);
  1019.  
  1020. set_pev(plr, pev_maxspeed, 250.0);
  1021. }
  1022. }
  1023.  
  1024. public tskUnsolid(ent)
  1025. {
  1026. ent -= TASK_ID_UNSOLID;
  1027.  
  1028. set_pev(ent, pev_solid, SOLID_NOT);
  1029. set_pev(ent, pev_rendermode, kRenderTransAdd);
  1030. set_pev(ent, pev_renderamt, 100.0);
  1031.  
  1032. set_task(1.0, "tskSolid", TASK_ID_SOLID + ent, "", 0, "", 0);
  1033. }
  1034.  
  1035. public tskSolid(ent)
  1036. {
  1037. ent -= TASK_ID_SOLID;
  1038.  
  1039. set_pev(ent, pev_solid, SOLID_BBOX);
  1040. set_pev(ent, pev_rendermode, kRenderNormal);
  1041. }
  1042.  
  1043. public tskResetVelocity(plr)
  1044. {
  1045. plr -= TASK_ID_RESETVELOCITY;
  1046.  
  1047. set_pev(plr, pev_velocity, Float:{0.0, 0.0, 0.0});
  1048. }
  1049.  
  1050. public tskFallBlock(plr)
  1051. {
  1052. plr -= TASK_ID_FALLBLOCK;
  1053.  
  1054. set_pev(plr, pev_takedamage, 1.0);
  1055. }
  1056.  
  1057. public msgNewRound()
  1058. {
  1059. new ent, Float:vOrigin[3];
  1060. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_3")) )
  1061. {
  1062. if( fnGetObjectType(ent) == OBJECT_MAGICCARPET )
  1063. {
  1064. pev(ent, pev_v_angle, vOrigin);
  1065.  
  1066. set_pev(ent, pev_velocity, Float:{0.0, 0.0, 0.0});
  1067. engfunc(EngFunc_SetOrigin, ent, vOrigin);
  1068. }
  1069. }
  1070. }
  1071.  
  1072. fnMakeObject(object, model, Float:vOrigin[3], const szName[])
  1073. {
  1074. if( (vOrigin[0] == 0.0
  1075. && vOrigin[1] == 0.0
  1076. && vOrigin[2] == 0.0)
  1077. || !fnIsOriginVacant(model, vOrigin) )
  1078. {
  1079. return 0;
  1080. }
  1081.  
  1082. new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
  1083.  
  1084. if( !pev_valid(ent) )
  1085. {
  1086. return 0;
  1087. }
  1088.  
  1089. set_pev(ent, pev_classname, "bcm_3");
  1090. set_pev(ent, pev_solid, SOLID_BBOX);
  1091. set_pev(ent, pev_movetype, MOVETYPE_NONE);
  1092. set_pev(ent, pev_targetname, szName);
  1093.  
  1094. switch( model )
  1095. {
  1096. case MODEL_NORMAL:
  1097. {
  1098. engfunc(EngFunc_SetModel, ent, gNORMALMODELS[object]);
  1099. }
  1100. case MODEL_WALLZ..MODEL_WALLY:
  1101. {
  1102. engfunc(EngFunc_SetModel, ent, gWALLMODELS[object]);
  1103. }
  1104. case MODEL_TINY:
  1105. {
  1106. engfunc(EngFunc_SetModel, ent, gTINYMODELS[object]);
  1107. }
  1108. }
  1109.  
  1110. engfunc(EngFunc_SetSize, ent, gMINS[model], gMAXS[model]);
  1111.  
  1112. if( model == MODEL_WALLY )
  1113. {
  1114. set_pev(ent, pev_angles, Float:{0.0, 90.0, 0.0});
  1115. }
  1116. else if( model == MODEL_WALLZ )
  1117. {
  1118. set_pev(ent, pev_angles, Float:{0.0, 0.0, 90.0});
  1119. }
  1120.  
  1121. fnSetOriginSnap(ent, vOrigin);
  1122.  
  1123. if( object == OBJECT_MAGICCARPET )
  1124. {
  1125. set_pev(ent, pev_movetype, MOVETYPE_FLY);
  1126. set_pev(ent, pev_v_angle, vOrigin);
  1127. }
  1128.  
  1129. return 1;
  1130. }
  1131.  
  1132. fnMakeTeleport(Float:vOrigin[3], const szTarget[], bool:mode)
  1133. {
  1134. if( (vOrigin[0] == 0.0 && vOrigin[1] == 0.0 && vOrigin[2] == 0.0)
  1135. || !fnIsOriginVacant(MODEL_TELESTART, vOrigin)
  1136. || (!mode && !engfunc(EngFunc_FindEntityByString, -1, "target", szTarget)) )
  1137. {
  1138. return 0;
  1139. }
  1140.  
  1141. new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
  1142.  
  1143. if( !pev_valid(ent) )
  1144. {
  1145. return 0;
  1146. }
  1147.  
  1148. set_pev(ent, pev_classname, mode ? "bcm_t" : "bcm_d");
  1149. set_pev(ent, pev_solid, SOLID_BBOX);
  1150. set_pev(ent, pev_movetype, MOVETYPE_NONE);
  1151. set_pev(ent, mode ? pev_target : pev_targetname, szTarget);
  1152. set_pev(ent, pev_framerate, 5.0);
  1153. set_pev(ent, pev_rendermode, kRenderTransAdd);
  1154. set_pev(ent, pev_renderamt, 255.0);
  1155.  
  1156. if( !mode )
  1157. {
  1158. set_pev(ent, pev_angles, Float:{0.0, 0.0, 90.0});
  1159. }
  1160.  
  1161. engfunc(EngFunc_SetModel, ent, mode ? gTELEPORTMODELS[0] : gTELEPORTMODELS[1]);
  1162.  
  1163. engfunc(EngFunc_SetSize, ent, gMINS[MODEL_TELESTART], gMAXS[MODEL_TELESTART]);
  1164.  
  1165. fnSetOriginSnap(ent, vOrigin);
  1166.  
  1167. return 1;
  1168. }
  1169.  
  1170. fnGetAimOrigin(plr, Float:vOrigin[3])
  1171. {
  1172. new Float:vStart[3], Float:vViewOfs[3], Float:vDest[3];
  1173.  
  1174. pev(plr, pev_origin, vStart);
  1175. pev(plr, pev_view_ofs, vViewOfs);
  1176.  
  1177. vStart[0] += vViewOfs[0];
  1178. vStart[1] += vViewOfs[1];
  1179. vStart[2] += vViewOfs[2];
  1180.  
  1181. pev(plr, pev_v_angle, vDest);
  1182. engfunc(EngFunc_MakeVectors, vDest);
  1183. global_get(glb_v_forward, vDest);
  1184.  
  1185. vDest[0] *= 9999.0;
  1186. vDest[1] *= 9999.0;
  1187. vDest[2] *= 9999.0;
  1188.  
  1189. vDest[0] += vStart[0];
  1190. vDest[1] += vStart[1];
  1191. vDest[2] += vStart[2];
  1192.  
  1193. engfunc(EngFunc_TraceLine, vStart, vDest, 0, plr, 0);
  1194. get_tr2(0, TR_vecEndPos, vOrigin);
  1195.  
  1196. return 1;
  1197. }
  1198.  
  1199. fnGetAimEnt(plr)
  1200. {
  1201. new Float:vStart[3], Float:vViewOfs[3], Float:vDest[3];
  1202.  
  1203. pev(plr, pev_origin, vStart);
  1204. pev(plr, pev_view_ofs, vViewOfs);
  1205.  
  1206. vStart[0] += vViewOfs[0];
  1207. vStart[1] += vViewOfs[1];
  1208. vStart[2] += vViewOfs[2];
  1209.  
  1210. pev(plr, pev_v_angle, vDest);
  1211. engfunc(EngFunc_MakeVectors, vDest);
  1212. global_get(glb_v_forward, vDest);
  1213.  
  1214. vDest[0] *= 9999.0;
  1215. vDest[1] *= 9999.0;
  1216. vDest[2] *= 9999.0;
  1217.  
  1218. vDest[0] += vStart[0];
  1219. vDest[1] += vStart[1];
  1220. vDest[2] += vStart[2];
  1221.  
  1222. engfunc(EngFunc_TraceLine, vStart, vDest, 0, plr, 0);
  1223.  
  1224. new ent = get_tr2(0, TR_pHit);
  1225.  
  1226. if( !pev_valid(ent) )
  1227. {
  1228. new Float:vOrigin[3];
  1229. fnGetAimOrigin(plr, vOrigin);
  1230.  
  1231. new szClass[6];
  1232. while( (ent = engfunc(EngFunc_FindEntityInSphere, ent, vOrigin, 1.0)) )
  1233. {
  1234. pev(ent, pev_classname, szClass, 5);
  1235. if( equal(szClass, "bcm_3", 0) )
  1236. {
  1237. return ent;
  1238. }
  1239. }
  1240.  
  1241. return 0;
  1242. }
  1243.  
  1244. return ent;
  1245. }
  1246.  
  1247. fnSetOriginSnap(ent, Float:vOrigin[3])
  1248. {
  1249. vOrigin[0] = float(floatround(vOrigin[0] / 2.0)) * 2.0;
  1250. vOrigin[1] = float(floatround(vOrigin[1] / 2.0)) * 2.0;
  1251. vOrigin[2] = float(floatround(vOrigin[2] / 2.0)) * 2.0;
  1252.  
  1253. new model = fnGetObjectModelType(ent);
  1254. if( !model )
  1255. {
  1256. return 0;
  1257. }
  1258.  
  1259. if( !fnIsOriginNearSpawn(vOrigin)
  1260. && fnIsOriginVacant(model, vOrigin) )
  1261. {
  1262. engfunc(EngFunc_SetOrigin, ent, vOrigin);
  1263.  
  1264. if( model == MODEL_WALLX
  1265. || model == MODEL_WALLY )
  1266. {
  1267. vOrigin[2] += 15.0;////
  1268. }
  1269.  
  1270. if( engfunc(EngFunc_PointContents, vOrigin) == -2 )
  1271. {
  1272. new type = fnGetObjectType(ent);
  1273.  
  1274. if( type && type != 99 )
  1275. {
  1276. fnSetRendering(ent, kRenderFxGlowShell, gGLOWS[type][0],
  1277. gGLOWS[type][1], gGLOWS[type][2], kRenderNormal, 64);
  1278. }
  1279. }
  1280. else
  1281. {
  1282. set_pev(ent, pev_renderfx, kRenderFxNone);
  1283. }
  1284. }
  1285.  
  1286. return 1;
  1287. }
  1288.  
  1289. bool:fnIsOriginNearSpawn(Float:vOrigin[3])
  1290. {
  1291. new ent;
  1292. new szClass[23];
  1293.  
  1294. while( (ent = engfunc(EngFunc_FindEntityInSphere, ent, vOrigin, 128.0)) )
  1295. {
  1296. pev(ent, pev_classname, szClass, 22);
  1297.  
  1298. if( equal(szClass, "info_player_start", 0)
  1299. || equal(szClass,"info_player_deathmatch", 0) )
  1300. {
  1301. return true;
  1302. }
  1303. }
  1304.  
  1305. return false;
  1306. }
  1307.  
  1308. fnGetObjectType(ent)
  1309. {
  1310. new szClass[6];
  1311. pev(ent, pev_classname, szClass, 5);
  1312.  
  1313. if( equal(szClass, "bcm_t", 0)
  1314. || equal(szClass, "bcm_d", 0) )
  1315. {
  1316. return 99;
  1317. }
  1318. else if( !equal(szClass, "bcm_3", 0) )
  1319. {
  1320. return 0;
  1321. }
  1322.  
  1323. /*new Float:vColor[3];
  1324. pev(ent, pev_rendercolor, vColor);
  1325.  
  1326. for( new i = 0; i < sizeof(gGLOWS); i++ )
  1327. {
  1328. if( vColor[0] == gGLOWS[i][0]
  1329. && vColor[1] == gGLOWS[i][1]
  1330. && vColor[2] == gGLOWS[i][2] )
  1331. {
  1332. return i;
  1333. }
  1334. }*/
  1335.  
  1336. new szModel[65];
  1337. pev(ent, pev_model, szModel, 64);
  1338.  
  1339. for( new i = 1; i < sizeof(gTYPES); i++ )
  1340. {
  1341. if( contain(szModel, gTYPES[i]) > -1 )
  1342. {
  1343. return i;
  1344. }
  1345. }
  1346.  
  1347. return 0;
  1348. }
  1349.  
  1350. fnGetObjectModelType(ent)
  1351. {
  1352. new szModel[65];
  1353. pev(ent, pev_model, szModel, 64);
  1354.  
  1355. for( new i = 1; i < sizeof(gMODELTYPES); i++ )
  1356. {
  1357. if( contain(szModel, gMODELTYPES[i]) > -1 )
  1358. {
  1359. switch( i )
  1360. {
  1361. case MODEL_WALLZ .. MODEL_WALLY:
  1362. {
  1363. new Float:vAngles[3];
  1364. pev(ent, pev_angles, vAngles);
  1365.  
  1366. if( vAngles[1] == 90.0 )
  1367. {
  1368. return MODEL_WALLY;
  1369. }
  1370. else if( vAngles[2] == 90.0 )
  1371. {
  1372. return MODEL_WALLZ;
  1373. }
  1374. else
  1375. {
  1376. return MODEL_WALLX;
  1377. }
  1378. }
  1379. default:
  1380. {
  1381. return i;
  1382. }
  1383. }
  1384. }
  1385. }
  1386.  
  1387. return 0;
  1388. }
  1389.  
  1390. fnSave()
  1391. {
  1392. new szPath[129];
  1393. format(szPath, 128, "%s/%s.txt", gDir, gCurConfig);
  1394.  
  1395. delete_file(szPath);
  1396.  
  1397. new f = fopen(szPath, "at");
  1398.  
  1399. new ent, type, szData[129], Float:vOrigin[3], szName[32], count, modelType;
  1400. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_3")) )
  1401. {
  1402. count++;
  1403.  
  1404. type = fnGetObjectType(ent);
  1405. pev(ent, pev_origin, vOrigin);
  1406. pev(ent, pev_targetname, szName, 31);
  1407.  
  1408. modelType = fnGetObjectModelType(ent);
  1409.  
  1410. format(szData, 128, "%i %f %f %f %s %i^n", type, vOrigin[0], vOrigin[1], vOrigin[2],
  1411. szName, modelType);
  1412. fputs(f, szData);
  1413. }
  1414.  
  1415. new Float:vOrigin2[3], dest, szTarget[5];
  1416. ent = 0;
  1417. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_t")) )
  1418. {
  1419. count++;
  1420.  
  1421. pev(ent, pev_origin, vOrigin);
  1422. pev(ent, pev_target, szTarget, 4);
  1423.  
  1424. dest = engfunc(EngFunc_FindEntityByString, -1, "targetname", szTarget);
  1425. if( !dest )
  1426. {
  1427. continue;
  1428. }
  1429.  
  1430. pev(dest, pev_origin, vOrigin2);
  1431.  
  1432. format(szData, 128, "99 %f %f %f %f %f %f^n", vOrigin[0], vOrigin[1], vOrigin[2],
  1433. vOrigin2[0], vOrigin2[1], vOrigin2[2]);
  1434.  
  1435. fputs(f, szData);
  1436. }
  1437.  
  1438. fclose(f);
  1439.  
  1440. return count;
  1441. }
  1442.  
  1443. fnLoad(const szConfigName[])
  1444. {
  1445. new ent;
  1446. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_3")) )
  1447. {
  1448. engfunc(EngFunc_RemoveEntity, ent);
  1449. }
  1450. ent = 0;
  1451. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_t")) )
  1452. {
  1453. engfunc(EngFunc_RemoveEntity, ent);
  1454. }
  1455. ent = 0;
  1456. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_d")) )
  1457. {
  1458. engfunc(EngFunc_RemoveEntity, ent);
  1459. }
  1460.  
  1461. new szData[129], szType[3], szX[13], szY[13], szZ[13], szName[32], szModelType[3];
  1462. new szX2[13], szY2[13], szZ2[13], szTarget[5];
  1463. new Float:vOrigin[3], Float:vOrigin2[3];
  1464. new type, modelType, count;
  1465.  
  1466. new szPath[129];
  1467. format(szPath, 128, "%s/%s.txt", gDir, szConfigName);
  1468.  
  1469. if( !file_exists(szPath) )
  1470. {
  1471. return 0;
  1472. }
  1473.  
  1474. copy(gCurConfig, 32, szConfigName);
  1475.  
  1476. new f = fopen(szPath, "rt");
  1477. while( !feof(f) )
  1478. {
  1479. fgets(f, szData,128);
  1480.  
  1481. if( !strlen(szData) )
  1482. {
  1483. continue;
  1484. }
  1485.  
  1486. parse(szData, szType, 2);
  1487.  
  1488. type = str_to_num(szType);
  1489. if( type != 99 )
  1490. {
  1491. parse(szData, "", 0, szX, 12, szY, 12, szZ, 12, szName, 31, szModelType, 2);
  1492. vOrigin[0] = str_to_float(szX);
  1493. vOrigin[1] = str_to_float(szY);
  1494. vOrigin[2] = str_to_float(szZ);
  1495.  
  1496. modelType = str_to_num(szModelType);
  1497. count++;
  1498.  
  1499. fnMakeObject(type, !modelType ? MODEL_NORMAL : modelType, vOrigin, szName);////
  1500. }
  1501. else
  1502. {
  1503. parse(szData, "", 0, szX, 12, szY, 12, szZ, 12, szX2, 12, szY2, 12, szZ2, 12);
  1504.  
  1505. vOrigin[0] = str_to_float(szX);
  1506. vOrigin[1] = str_to_float(szY);
  1507. vOrigin[2] = str_to_float(szZ);
  1508.  
  1509. vOrigin2[0] = str_to_float(szX2);
  1510. vOrigin2[1] = str_to_float(szY2);
  1511. vOrigin2[2] = str_to_float(szZ2);
  1512.  
  1513. format(szTarget, 4, "%c%c%c%c",
  1514. random_num('a', 'z'),
  1515. random_num('a', 'z'),
  1516. random_num('a', 'z'),
  1517. random_num('a', 'z'));
  1518.  
  1519. count++;
  1520.  
  1521. fnMakeTeleport(vOrigin, szTarget, true);
  1522. fnMakeTeleport(vOrigin2, szTarget, false);
  1523. }
  1524.  
  1525. }
  1526.  
  1527. fclose(f);
  1528.  
  1529. return count;
  1530. }
  1531.  
  1532. fnGreenChat(plr, const message[], {Float,Sql,Result,_}:...)
  1533. {
  1534. static msg[192];
  1535. msg[0] = 0x04;
  1536.  
  1537. vformat(msg[1], 190, message, 3);
  1538.  
  1539. if( plr > 0 && plr <= 32 )
  1540. {
  1541. message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, plr);
  1542. write_byte(plr);
  1543. write_string(msg);
  1544. message_end();
  1545. }
  1546. else if( plr == 0 )
  1547. {
  1548. for( new i = 1; i <= gMaxPlayers; i++ )
  1549. {
  1550. if( !is_user_connected(i) )
  1551. {
  1552. continue;
  1553. }
  1554.  
  1555. message_begin(MSG_ONE, gMsgSayText, {0, 0, 0}, i);
  1556. write_byte(i);
  1557. write_string(msg);
  1558. message_end();
  1559. }
  1560. }
  1561.  
  1562. return 1;
  1563. }
  1564.  
  1565. public tskShowObjectInfo()
  1566. {
  1567. for( new i = 1; i <= gMaxPlayers; i++ )
  1568. {
  1569. if( !is_user_connected(i) )
  1570. {
  1571. continue;
  1572. }
  1573.  
  1574. new ent = fnGetAimEnt(i);
  1575.  
  1576. new type = fnGetObjectType(ent);
  1577. if( type && type != 99 )
  1578. {
  1579. new szName[32];
  1580. pev(ent, pev_targetname, szName, 31);
  1581.  
  1582. if( szName[0] == '^0' )
  1583. {
  1584. copy(szName, 31, "Unknown");
  1585. }
  1586.  
  1587. set_hudmessage(255, 255, 0, -1.0, 0.75, 0, 0.0, 2.0, 0.0, 0.0, 4);
  1588. show_hudmessage(i, "Object Type: %s^nCreator: %s", gOBJECTNAMES[type], szName);
  1589. }
  1590. }
  1591. }
  1592.  
  1593. fnGetObjectCount()
  1594. {
  1595. new ent, i;
  1596. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_3")) )
  1597. {
  1598. i++;
  1599. }
  1600.  
  1601. ent = 0;
  1602.  
  1603. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_t")) )
  1604. {
  1605. i++;
  1606. }
  1607.  
  1608. ent = 0;
  1609.  
  1610. while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", "bcm_t")) )
  1611. {
  1612. i++;
  1613. }
  1614.  
  1615. return i;
  1616. }
  1617.  
  1618. public fnConvertFrom2()
  1619. {
  1620. new szDir[] = "addons/amxmodx/configs/bcm";
  1621. new dir = open_dir(szDir, "", 0);
  1622.  
  1623. new szFile[65];
  1624. new szPath[129];
  1625. while( next_file(dir, szFile, 64) )
  1626. {
  1627. if( szFile[0] == '.' )
  1628. {
  1629. continue;
  1630. }
  1631.  
  1632. format(szPath, 128, "%s/%s", szDir, szFile);
  1633.  
  1634. new f = fopen(szPath, "rt");
  1635. new szData[129];
  1636. while( !feof(f) )
  1637. {
  1638. fgets(f, szData, 128);
  1639. replace(szData, 128, "S", "2");
  1640. replace(szData, 128, "B", "1");
  1641. replace(szData, 128, "E", "2");
  1642.  
  1643. replace(szFile, 64, ".cfg", "");
  1644. format(szPath, 128, "addons/amxmodx/data/kzm/bcm/%s.txt", szFile);
  1645.  
  1646. new f2 = fopen(szPath, "at");
  1647. fputs(f2, szData);
  1648. fclose(f2);
  1649. }
  1650. fclose(f);
  1651. }
  1652. close_dir(dir);
  1653. }
  1654.  
  1655. public fwdPlayerPreThink(plr)
  1656. {
  1657. // emp
  1658. if( (gSetVelocity[plr][0] != 0.0
  1659. || gSetVelocity[plr][1] != 0.0
  1660. || gSetVelocity[plr][2] != 0.0)
  1661. && is_user_alive(plr) )
  1662. {
  1663. set_pev(plr, pev_velocity, gSetVelocity[plr]);
  1664. gSetVelocity[plr][0] = 0.0;
  1665. gSetVelocity[plr][1] = 0.0;
  1666. gSetVelocity[plr][2] = 0.0;
  1667. }
  1668.  
  1669. return FMRES_IGNORED;
  1670. }
  1671.  
  1672. public tskShowXYZ(plr)
  1673. {
  1674. plr -= TASK_ID_SHOWXYZ;
  1675.  
  1676. if( !is_user_connected(plr) )
  1677. {
  1678. remove_task(TASK_ID_SHOWXYZ + plr, 0);
  1679.  
  1680. return PLUGIN_CONTINUE;
  1681. }
  1682.  
  1683. static Float:vAim[3];
  1684. velocity_by_aim(plr, 64, vAim);
  1685.  
  1686. static Float:vOrigin[3];
  1687. pev(plr, pev_origin, vOrigin);
  1688.  
  1689. vOrigin[0] += vAim[0];
  1690. vOrigin[1] += vAim[1];
  1691. vOrigin[2] += vAim[2];
  1692.  
  1693. vOrigin[2] += 16.0;
  1694.  
  1695. static origin[3], origin2[3];
  1696. FVecIVec(vOrigin, origin);
  1697.  
  1698. origin2 = origin;
  1699.  
  1700. origin[0] += 16;
  1701. fnMakeSprite(plr, origin, origin2, {255, 0, 0});
  1702.  
  1703. origin[0] -= 16;
  1704. origin[1] += 16;
  1705. fnMakeSprite(plr, origin, origin2, {0, 0, 255});
  1706.  
  1707. origin[1] -= 16;
  1708. origin[2] += 16;
  1709. fnMakeSprite(plr, origin, origin2, {0, 255, 0});
  1710.  
  1711. return PLUGIN_CONTINUE;
  1712. }
  1713.  
  1714. fnMakeSprite(plr, origin[], origin2[], color[], stay=1, all=0)////
  1715. {
  1716. message_begin(all ? MSG_BROADCAST : MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, {0, 0, 0}, all ? 0 : plr);
  1717. write_byte(0);
  1718. write_coord(origin[0]);
  1719. write_coord(origin[1]);
  1720. write_coord(origin[2]);
  1721. write_coord(origin2[0]);
  1722. write_coord(origin2[1]);
  1723. write_coord(origin2[2]);
  1724. write_short(gBeamSprite);
  1725. write_byte(1);
  1726. write_byte(1);
  1727. write_byte(stay);
  1728. write_byte(4);
  1729. write_byte(0);
  1730. write_byte(color[0]);
  1731. write_byte(color[1]);
  1732. write_byte(color[2]);
  1733. write_byte(190);
  1734. write_byte(0);
  1735. message_end();
  1736.  
  1737. return 1;
  1738. }
  1739.  
  1740. fnIsOriginVacant(model, Float:vOrigin[3])
  1741. {
  1742. // woot bad code
  1743. static Float:vMins[3], Float:vMaxs[3];
  1744. vMins[0] = gMINS[model][0];
  1745. vMins[1] = gMINS[model][1];
  1746. vMins[2] = gMINS[model][2];
  1747.  
  1748. vMaxs[0] = gMAXS[model][0];
  1749. vMaxs[1] = gMAXS[model][1];
  1750. vMaxs[2] = gMAXS[model][2];
  1751.  
  1752. vMins[0] += 1.0;
  1753. vMins[1] += 1.0;
  1754. vMins[2] += 1.0;
  1755.  
  1756. vMaxs[0] += -1.0;
  1757. vMaxs[1] += -1.0;
  1758. vMaxs[2] += -1.0;
  1759.  
  1760. static Float:vOrigins[8][3];
  1761. vOrigins[0] = vOrigin;
  1762. vOrigins[1] = vOrigin;
  1763. vOrigins[2] = vOrigin;
  1764. vOrigins[3] = vOrigin;
  1765. vOrigins[4] = vOrigin;
  1766. vOrigins[5] = vOrigin;
  1767. vOrigins[6] = vOrigin;
  1768. vOrigins[7] = vOrigin;
  1769.  
  1770. vOrigins[0][0] += vMaxs[0];
  1771. vOrigins[0][1] += vMins[1];
  1772. vOrigins[0][2] += vMaxs[2];
  1773.  
  1774. vOrigins[1][0] += vMaxs[0];
  1775. vOrigins[1][1] += vMins[1];
  1776. vOrigins[1][2] += vMins[2];
  1777.  
  1778. vOrigins[2][0] += vMins[0];
  1779. vOrigins[2][1] += vMaxs[1];
  1780. vOrigins[2][2] += vMaxs[2];
  1781.  
  1782. vOrigins[3][0] += vMins[0];
  1783. vOrigins[3][1] += vMaxs[1];
  1784. vOrigins[3][2] += vMins[2];
  1785.  
  1786. vOrigins[4][0] += vMins[0];
  1787. vOrigins[4][1] += vMins[1];
  1788. vOrigins[4][2] += vMins[2];
  1789.  
  1790. vOrigins[5][0] += vMins[0];
  1791. vOrigins[5][1] += vMins[1];
  1792. vOrigins[5][2] += vMaxs[2];
  1793.  
  1794. vOrigins[6][0] += vMaxs[0];
  1795. vOrigins[6][1] += vMaxs[1];
  1796. vOrigins[6][2] += vMaxs[2];
  1797.  
  1798. vOrigins[7][0] += vMaxs[0];
  1799. vOrigins[7][1] += vMaxs[1];
  1800. vOrigins[7][2] += vMins[2];
  1801.  
  1802. /*new origins[8][3];
  1803.  
  1804. for( new i = 0; i < 8; i++ )
  1805. {
  1806. FVecIVec(vOrigins[i], origins[i]);
  1807. }
  1808.  
  1809. fnMakeSprite(0, origins[0], origins[1], {255, 255, 255}, 50, 1);
  1810. fnMakeSprite(0, origins[2], origins[3], {255, 255, 255}, 50, 1);
  1811. fnMakeSprite(0, origins[4], origins[5], {255, 255, 255}, 50, 1);
  1812. fnMakeSprite(0, origins[6], origins[7], {255, 255, 255}, 50, 1);*/
  1813.  
  1814. new j;
  1815. for( new i = 0; i <= 7; i++ )
  1816. {
  1817. if( engfunc(EngFunc_PointContents, vOrigins[i]) != -2 )
  1818. {
  1819. j++;
  1820. }
  1821. }
  1822.  
  1823. return j ? true : false;
  1824. }
  1825.  
  1826. fnSetRendering(ent, fx, r, g, b, rend, amt)
  1827. {
  1828. new Float:vColor[3];
  1829. vColor[0] = float(r);
  1830. vColor[1] = float(g);
  1831. vColor[2] = float(b);
  1832.  
  1833. set_pev(ent, pev_renderfx, fx);
  1834. set_pev(ent, pev_rendercolor, vColor);
  1835. set_pev(ent, pev_rendermode, rend);
  1836. set_pev(ent, pev_renderamt, float(amt));
  1837.  
  1838. return 1;
  1839. }
  1840.  
  1841. bool:fnIsStringAlphaNumeric(const szString[])
  1842. {
  1843. for( new i = 0; i < strlen(szString); i++ )
  1844. {
  1845. if( (szString[i] >= 'a' && szString[i] <= 'z')
  1846. || (szString[i] >= 'A' && szString[i] <= 'Z')
  1847. || (szString[i] >= '0' && szString[i] <= '9') )
  1848. {
  1849. continue;
  1850. }
  1851. else
  1852. {
  1853. return false;
  1854. }
  1855. }
  1856.  
  1857. return true;
  1858. }
  1859. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  1860. *{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1046{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
  1861. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement