HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2. AMXX Banhammer by Mati (initial release).
  3.  
  4. Usage: amx_banhammer
  5.  
  6. Available options (CVARS):
  7. hammer_bantime <minutes> (Default: 15) - Duration of the victims ban in minutes
  8. hammer_check <0/1> Default: 0 - Displays a verification menu after someone gets hit with the banhammer. The victim is freezed during that time.
  9. hammer_noclip <0/1> Default: 0 - Activates noclip when beeing equipped with the banhammer
  10. hammer_godmode <0/1> Default: 1 - Activates godmode when beeing equipped with the banhammer
  11. hammer_speed <number> Default: Value of sv_maxspeed - Defines the players speed when beeing equipped with the banhammer
  12. hammer_delay <number> Default: 0.0 - Adds a delay in between the hammer attacks. Will have no effect if <0.4. Might cause faulty animations.
  13. hammer_explosiondelay <number> Default: 0.15 - Delay between the hammerhit and the explosion/ban
  14. */
  15.  
  16. #include <amxmodx>
  17. #include <amxmisc>
  18. #include <engine>
  19. #include <fun>
  20. #include <hamsandwich>
  21. #include <fakemeta>
  22.  
  23. new h_noclip, h_speed, h_godmode, h_check, h_delay, h_bantime, h_edelay;
  24. new explosion, smoke, mdl_gib_flesh, mdl_gib_meat, mdl_gib_head, mdl_gib_legbone, mdl_gib_spine, mdl_gib_lung;
  25. new bool:g_hasHammer[33];
  26. new bool:g_blocked[33];
  27. new g_pid;
  28.  
  29. public plugin_init() {
  30. register_plugin("AMXX Banhammer", "1.0", "Mati");
  31. register_clcmd("amx_banhammer", "HandleBanhammer", ADMIN_BAN);
  32.  
  33. // CVARS
  34. new maxspeed[5];
  35. get_cvar_string("sv_maxspeed", maxspeed, 4);
  36. h_speed = register_cvar("hammer_speed", maxspeed);
  37. h_noclip = register_cvar("hammer_noclip", "0");
  38. h_godmode = register_cvar("hammer_godmode", "1");
  39. h_check = register_cvar("hammer_check", "0");
  40. h_delay = register_cvar("hammer_delay", "0.0");
  41. h_bantime = register_cvar("hammer_bantime", "15");
  42. h_edelay = register_cvar("hammer_explosiondelay", "0.1");
  43.  
  44. register_event("CurWeapon","CurWeapon","be","1=1");
  45.  
  46. register_forward(FM_EmitSound, "HandleSound");
  47. RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "KnifeAttack");
  48. RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "KnifeAttack");
  49. RegisterHam(Ham_Touch,"weaponbox","touch_weapon");
  50. RegisterHam(Ham_TraceAttack, "player", "TraceAttack");
  51. RegisterHam(Ham_Spawn, "player", "PlayerSpawnPost", 1);
  52. }
  53.  
  54. public plugin_precache() {
  55. precache_model("models/v_knife.mdl");
  56. precache_model("models/p_knife.mdl");
  57. precache_model("models/banhammer/p_hammer.mdl");
  58. precache_model("models/banhammer/v_hammer.mdl");
  59. precache_sound("banhammer/hitwall.wav");
  60. precache_sound("banhammer/banhammer.wav");
  61. precache_sound("banhammer/hitplayer.wav");
  62.  
  63. explosion = precache_model("sprites/bexplo.spr");
  64. smoke = precache_model("sprites/steam1.spr");
  65.  
  66. mdl_gib_flesh = precache_model("models/Fleshgibs.mdl");
  67. mdl_gib_meat = precache_model("models/GIB_B_Gib.mdl");
  68. mdl_gib_head = precache_model("models/GIB_Skull.mdl");
  69. mdl_gib_legbone = precache_model("models/GIB_Legbone.mdl");
  70. mdl_gib_spine = precache_model("models/GIB_B_Bone.mdl");
  71. mdl_gib_lung = precache_model("models/GIB_Lung.mdl");
  72. }
  73.  
  74. public HandleSound(entity, channel, const sound[]) {
  75. if (entity > 0 && entity < 33 && g_hasHammer[entity]) {
  76. if (equal(sound, "weapons/knife_hitwall1.wav")) {
  77. emit_sound(entity, CHAN_WEAPON, "banhammer/hitwall.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
  78. return FMRES_SUPERCEDE;
  79. } else if (equal(sound, "weapons/knife_hit", 17) || equal(sound, "weapons/knife_stab.wav")) {
  80. emit_sound(entity, CHAN_WEAPON, "banhammer/hitplayer.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
  81. return FMRES_SUPERCEDE;
  82. } else if (equal(sound, "weapons/knife_deploy1.wav")) {
  83. return FMRES_SUPERCEDE;
  84. }
  85. }
  86. return FMRES_IGNORED;
  87. }
  88.  
  89. public HandleBanhammer(id, level, cid) {
  90. if (!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED;
  91.  
  92. if (is_user_alive(id) && !g_hasHammer[id]) {
  93. g_hasHammer[id] = true;
  94. if (get_user_weapon(id) != CSW_KNIFE) {
  95. engclient_cmd(id, "weapon_knife");
  96. set_task(0.1, "ActionBanhammer", id);
  97. return PLUGIN_HANDLED;
  98. } else {
  99. ActionBanhammer(id);
  100. }
  101. } else {
  102. entity_set_string(id, EV_SZ_viewmodel, "models/v_knife.mdl");
  103. entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl");
  104. RemoveAbilities(id);
  105. }
  106. return PLUGIN_HANDLED;
  107. }
  108.  
  109. public ActionBanhammer(id) {
  110. entity_set_string(id, EV_SZ_viewmodel, "models/banhammer/v_hammer.mdl");
  111. entity_set_string(id, EV_SZ_weaponmodel, "models/banhammer/p_hammer.mdl");
  112. client_cmd(0, "spk ^"banhammer/banhammer^"");
  113.  
  114. if (get_pcvar_num(h_noclip)) set_user_noclip(id, 1);
  115. if (get_pcvar_num(h_godmode)) set_user_godmode(id, 1);
  116. set_user_maxspeed(id, get_pcvar_float(h_speed));
  117. g_hasHammer[id] = true;
  118. }
  119.  
  120. public touch_weapon(ent, id) {
  121. if (id > 0 && id < 33 && g_hasHammer[id]) return HAM_SUPERCEDE;
  122. return HAM_IGNORED;
  123. }
  124.  
  125. public CurWeapon(id) {
  126. if (g_hasHammer[id]) RemoveAbilities(id);
  127. }
  128.  
  129. public RemoveAbilities(id) {
  130. if (get_pcvar_num(h_noclip)) {
  131. set_user_noclip(id);
  132. set_user_gravity(id, 0.25);
  133. set_task(3.0, "RemoveGrav", id);
  134. }
  135. if (get_pcvar_num(h_godmode)) set_user_godmode(id);
  136. set_user_maxspeed(id, 230.0);
  137. g_hasHammer[id] = false;
  138. }
  139.  
  140. public RemoveGrav(id) {
  141. set_user_gravity(id);
  142. }
  143.  
  144. public KnifeAttack(id) {
  145. new pid = entity_get_edict(id, EV_ENT_owner);
  146. if (g_hasHammer[pid] && get_pcvar_float(h_delay) > 0.39) {
  147. if (!g_blocked[pid]) {
  148. g_blocked[pid] = true;
  149. set_task(get_pcvar_float(h_delay), "RemoveBlock", pid);
  150. return PLUGIN_CONTINUE;
  151. }
  152. return HAM_SUPERCEDE;
  153. }
  154. return HAM_IGNORED;
  155. }
  156.  
  157. public RemoveBlock(id) {
  158. g_blocked[id] = false;
  159. }
  160.  
  161. public PlayerSpawnPost(id) {
  162. if (g_hasHammer[id] && is_user_alive(id)) {
  163. entity_set_string(id, EV_SZ_viewmodel, "models/v_knife.mdl");
  164. entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl");
  165. RemoveAbilities(id);
  166. }
  167. }
  168.  
  169. public TraceAttack(id, attacker) {
  170. if (g_hasHammer[attacker]) {
  171. g_pid=id;
  172. entity_set_int(id, EV_INT_flags, entity_get_int(id, EV_INT_flags) | FL_FROZEN);
  173.  
  174. if (get_pcvar_num(h_check)) {
  175. new title[48], name[32];
  176. get_user_name(id, name, 31);
  177. formatex(title, 47, "Ban %s?", name);
  178. new menu = menu_create(title, "CheckBan");
  179. menu_additem(menu, "Igen", "1");
  180. menu_additem(menu, "Nem", "2");
  181. menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
  182. menu_display(attacker, menu, 0);
  183. }
  184. else {
  185. hammer_hit(id);
  186. }
  187. return HAM_SUPERCEDE;
  188. }
  189. return HAM_IGNORED;
  190. }
  191.  
  192. public CheckBan(id, menu, item) {
  193. if(item == MENU_EXIT || item == MENU_KEY_1) {
  194. menu_destroy(menu);
  195. entity_set_int(g_pid, EV_INT_flags, entity_get_int(id, EV_INT_flags) & ~FL_FROZEN);
  196. } else {
  197. hammer_hit(g_pid);
  198. }
  199. }
  200.  
  201. public hammer_hit(id) {
  202. new origin[3];
  203. get_user_origin(id, origin);
  204.  
  205. new Float:delaytime = get_pcvar_float(h_edelay);
  206. if (delaytime < 0.1) {
  207. set_task(0.1, "fx_explode", _, origin, 3);
  208. } else {
  209. set_task(delaytime, "fx_explode", _, origin, 3);
  210. }
  211. }
  212.  
  213. public fx_explode(origin[3]) {
  214. new flesh[3];
  215. flesh[0] = mdl_gib_flesh;
  216. flesh[1] = mdl_gib_meat;
  217. flesh[2] = mdl_gib_legbone;
  218.  
  219. // Explosion FX
  220. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  221. write_byte(TE_EXPLOSION)
  222. write_coord(origin[0])
  223. write_coord(origin[1])
  224. write_coord(origin[2])
  225. write_short(explosion) // sprite index
  226. write_byte(50) // scale in 0.1's
  227. write_byte(10) // framerate
  228. write_byte(0) // flags
  229. message_end()
  230.  
  231. // Smoke
  232. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  233. write_byte(5)
  234. write_coord(origin[0])
  235. write_coord(origin[1])
  236. write_coord(origin[2])
  237. write_short(smoke)
  238. write_byte(20)
  239. write_byte(10)
  240. message_end()
  241.  
  242. // Gib explosion
  243. // Head
  244. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  245. write_byte(TE_MODEL)
  246. write_coord(origin[0])
  247. write_coord(origin[1])
  248. write_coord(origin[2])
  249. write_coord(random_num(-50,50))
  250. write_coord(random_num(-50,50))
  251. write_coord(random_num(100,200))
  252. write_angle(random_num(0,360))
  253. write_short(mdl_gib_head)
  254. write_byte(0) // bounce
  255. write_byte(500) // life
  256. message_end()
  257.  
  258. // Spine
  259. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  260. write_byte(TE_MODEL)
  261. write_coord(origin[0])
  262. write_coord(origin[1])
  263. write_coord(origin[2])
  264. write_coord(random_num(-50,50))
  265. write_coord(random_num(-50,50))
  266. write_coord(random_num(100,200))
  267. write_angle(random_num(0,360))
  268. write_short(mdl_gib_spine)
  269. write_byte(0) // bounce
  270. write_byte(500) // life
  271. message_end()
  272.  
  273. // Lung
  274. for(new i = 0; i < random_num(1,2); i++) {
  275. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  276. write_byte(TE_MODEL)
  277. write_coord(origin[0])
  278. write_coord(origin[1])
  279. write_coord(origin[2])
  280. write_coord(random_num(-50,50))
  281. write_coord(random_num(-50,50))
  282. write_coord(random_num(100,200))
  283. write_angle(random_num(0,360))
  284. write_short(mdl_gib_lung)
  285. write_byte(0) // bounce
  286. write_byte(500) // life
  287. message_end()
  288. }
  289.  
  290. // Parts, 5 times
  291. for(new i = 0; i < 5; i++) {
  292. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  293. write_byte(TE_MODEL)
  294. write_coord(origin[0])
  295. write_coord(origin[1])
  296. write_coord(origin[2])
  297. write_coord(random_num(-50,50))
  298. write_coord(random_num(-50,50))
  299. write_coord(random_num(100,200))
  300. write_angle(random_num(0,360))
  301. write_short(flesh[random_num(0,2)])
  302. write_byte(0) // bounce
  303. write_byte(500) // life
  304. message_end()
  305. }
  306.  
  307. // Blood on world decal
  308. for (new i=0; i < 10; i++) {
  309. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  310. write_byte(TE_WORLDDECAL)
  311. write_coord(origin[0]+random_num(-40,40))
  312. write_coord(origin[1]+random_num(-40,40))
  313. write_coord(origin[2]-36)
  314. write_byte(random_num(190, 197)) // index
  315. message_end();
  316. }
  317. new name[32], bantime = get_pcvar_num(h_bantime);
  318. server_cmd("banid %d #%d kick;wait;writeid", bantime, get_user_userid(g_pid));
  319. get_user_name(g_pid, name, 31);
  320. client_print(0, print_chat, "%s %d perces ban-t kapott a BANKALAPÁCSS-al.", name, bantime);
  321.  
  322. /* Alternative methods are available.
  323. new authid[32];
  324. get_user_authid(id, authid, 31);
  325. get_user_name(id, name, 31);
  326. client_cmd(g_aid, "amx_addban ^"%s^" ^"%s^" %d ^"Eltalált a BANKALAPÁCS!^"", name, authid, get_pcvar_num(h_bantime));
  327. server_cmd("kick #%d", get_user_userid(id));*/
  328. }
  329.  
  330. /*
  331. This function was originally supposed as an additional method to switch back to knife when slot3 or similar was getting pressed.
  332. I removed that again because that is getting called when amx_banhammer is executed as well.
  333. There's still the possible to switch back to knife by pressing other slots/lastinv/amx_banhammer etc.
  334. public client_command(id) {
  335. new args[4];
  336. read_args(args, 3);
  337. if (strlen(args) < 1) {
  338. entity_set_string(id, EV_SZ_viewmodel, "models/v_knife.mdl");
  339. entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl");
  340. RemoveAbilities(id);
  341. }
  342. }*/
  343.