HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <hamsandwich>
  6. #include <cstrike>
  7. #include <xs>
  8. #include <fun>
  9.  
  10. #define USE_FOR_ZOMBIE
  11. //Ha Zombie Plague módhoz szeretnéd használni akkor töröld a "//" jelet a "#define" elejéröl
  12.  
  13. #if defined USE_FOR_ZOMBIE
  14. #include <zp50_items>
  15. #include <zp50_class_survivor>
  16. #endif
  17.  
  18. #define PLUGIN "[CSO] Guillotine"
  19. #define VERSION "1.0"
  20. #define AUTHOR "Dias Pendragon"
  21. #define MODIFIED/FIXED "Dooz"
  22.  
  23. #define MODEL_V "models/v_guillotine.mdl"
  24. #define MODEL_P "models/p_guillotine.mdl"
  25. #define MODEL_W "models/w_guillotine.mdl"
  26.  
  27. #define MODEL_S "models/guillotine_projectile.mdl"
  28. #define MODEL_GIB "models/gibs_guilotine.mdl"
  29.  
  30. new const Weapon_Sounds[7][] =
  31. {
  32. "weapons/guillotine_catch2.wav",
  33. "weapons/guillotine_draw.wav",
  34. "weapons/guillotine_draw_empty.wav",
  35. "weapons/guillotine_explode.wav",
  36. "weapons/guillotine_red.wav",
  37. "weapons/guillotine-1.wav",
  38. "weapons/guillotine_wall.wav"
  39. }
  40.  
  41. new const Weapon_Resources[4][] =
  42. {
  43. "sprites/weapon_guillotine.txt",
  44. "sprites/640hud13_2.spr",
  45. "sprites/640hud120_2.spr",
  46. "sprites/guillotine_lost.spr"
  47. }
  48.  
  49. enum
  50. {
  51. ANIM_IDLE = 0, // 1.96
  52. ANIM_IDLE_EMPTY, // 1.96
  53. ANIM_SHOOT, // 0.67
  54. ANIM_DRAW, // 1.13
  55. ANIM_DRAW_EMPTY, // 1.13
  56. ANIM_EXPECT, // 1.96
  57. ANIM_EXPECT_FX, // 1.96
  58. ANIM_CATCH, // 0.967
  59. ANIM_LOST // 1.3
  60. }
  61.  
  62. #define TASK_RESET 14220151
  63.  
  64. const m_iLastHitGroup = 75
  65.  
  66. // MACROS
  67. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  68. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  69. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  70.  
  71. const pev_eteam = pev_iuser1
  72. const pev_return = pev_iuser2
  73. const pev_extra = pev_iuser3
  74.  
  75. new g_Cvars[8], g_Had_Guillotine, g_InTempingAttack, g_CanShoot, g_Hit, g_Ammo[33], g_MyGuillotine[33], Float:g_DamageTimeA[33], Float:g_DamageTimeB[33]
  76. new g_ExpSprID, g_GibModelID, g_MaxPlayers;
  77.  
  78. // Safety
  79. new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
  80.  
  81. #if defined USE_FOR_ZOMBIE
  82. new g_Item;
  83. #define Item_Price 20
  84. #endif
  85.  
  86. public plugin_init()
  87. {
  88. register_plugin(PLUGIN, VERSION, AUTHOR)
  89.  
  90. #if defined USE_FOR_ZOMBIE
  91. g_Item = zp_items_register("Flying Guillotine", Item_Price);
  92. #else
  93. register_clcmd("say /get_guillotine", "Get_Guillotine")
  94. #endif
  95.  
  96. register_clcmd("weapon_guillotine", "HookWeapon")
  97.  
  98. g_Cvars[0] = register_cvar("guillotine_damage", "35");
  99. g_Cvars[1] = register_cvar("guillotine_ammo", "10");
  100. g_Cvars[2] = register_cvar("guillotine_max_radius", "700.0");
  101. g_Cvars[3] = register_cvar("guillotine_fly_speed", "1000.0");
  102. g_Cvars[4] = register_cvar("guillotine_knockback", "300.0");
  103. g_Cvars[5] = register_cvar("guillotine_damage_delay", "0.2");
  104. g_Cvars[6] = register_cvar("guillotine_hittime", "5.0");
  105. g_Cvars[7] = register_cvar("guillotine_unlimited_ammo", "0");
  106.  
  107. register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  108. register_forward(FM_CmdStart, "fw_CmdStart")
  109. register_forward(FM_SetModel, "fw_SetModel")
  110. register_forward(FM_EmitSound, "fw_EmitSound")
  111. register_forward(FM_TraceLine, "fw_TraceLine")
  112. register_forward(FM_TraceHull, "fw_TraceHull")
  113.  
  114. register_touch("guillotine", "*", "fw_Guillotine_Touch")
  115. register_think("guillotine", "fw_Guillotine_Think")
  116.  
  117. register_logevent("Event_Round_Start", 2, "1=Round_Start")
  118. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  119.  
  120. RegisterHam(Ham_Item_Deploy, "weapon_m249", "fw_Item_Deploy_Post", 1)
  121. RegisterHam(Ham_Item_AddToPlayer, "weapon_m249", "fw_Item_AddToPlayer_Post", 1)
  122. RegisterHam(Ham_Weapon_WeaponIdle, "weapon_m249", "fw_Weapon_WeaponIdle_Post", 1)
  123.  
  124. register_message(get_user_msgid("DeathMsg"), "message_DeathMsg");
  125.  
  126. g_MaxPlayers = get_maxplayers();
  127. Register_SafetyFunc();
  128. }
  129.  
  130. public plugin_precache()
  131. {
  132. precache_model(MODEL_V)
  133. precache_model(MODEL_P)
  134. precache_model(MODEL_W)
  135.  
  136. precache_model(MODEL_S)
  137. g_GibModelID = precache_model(MODEL_GIB)
  138.  
  139. for(new i = 0; i < sizeof(Weapon_Sounds); i++)
  140. precache_sound(Weapon_Sounds[i])
  141. for(new i = 0; i < sizeof(Weapon_Resources); i++)
  142. {
  143. if(!i) precache_generic(Weapon_Resources[i])
  144. else if(i == 3) g_ExpSprID = precache_model(Weapon_Resources[i])
  145. else precache_model(Weapon_Resources[i])
  146. }
  147. }
  148.  
  149. public client_putinserver(id)
  150. Safety_Connected(id)
  151.  
  152. public client_disconnect(id)
  153. Safety_Disconnected(id)
  154.  
  155. public Event_Round_Start(){
  156. static Classname[64];
  157. for(new id = 1; id < g_MaxPlayers; ++id){
  158. if(!is_connected(id) || !pev_valid(g_MyGuillotine[id]))
  159. continue;
  160.  
  161. pev(g_MyGuillotine[id], pev_classname, Classname, 63)
  162.  
  163. if(equal(Classname, "guillotine"))
  164. remove_entity(g_MyGuillotine[id])
  165. }
  166. }
  167.  
  168. #if defined USE_FOR_ZOMBIE
  169. public zp_fw_items_select_pre(id, itemid, ignorecost){
  170.  
  171. if(itemid == g_Item){
  172. if(zp_core_is_zombie(id) || zp_class_survivor_get(id))
  173. return ZP_ITEM_DONT_SHOW;
  174. }
  175.  
  176. return ZP_ITEM_AVAILABLE;
  177. }
  178.  
  179. public zp_fw_items_select_post(id, itemid, ignorecost){
  180.  
  181. if (itemid == g_Item)
  182. Get_Guillotine(id)
  183.  
  184. return ZP_ITEM_AVAILABLE;
  185. }
  186. #endif
  187.  
  188. public Get_Guillotine(id)
  189. {
  190. Drop_Weapon(id, 1)
  191.  
  192. Set_BitVar(g_Had_Guillotine, id)
  193. Set_BitVar(g_CanShoot, id)
  194. UnSet_BitVar(g_InTempingAttack, id)
  195. UnSet_BitVar(g_Hit, id)
  196.  
  197. g_Ammo[id] = get_pcvar_num(g_Cvars[1])
  198. g_MyGuillotine[id] = 0
  199.  
  200. give_item(id, "weapon_m249")
  201. update_ammo(id, -1, g_Ammo[id])
  202. }
  203.  
  204. public Remove_Guillotine(id)
  205. {
  206. UnSet_BitVar(g_Had_Guillotine, id)
  207. UnSet_BitVar(g_CanShoot, id)
  208. UnSet_BitVar(g_InTempingAttack, id)
  209. UnSet_BitVar(g_Hit, id)
  210.  
  211. g_Ammo[id] = 0
  212. }
  213.  
  214. public message_DeathMsg(msg_id, msg_dest, id)
  215. {
  216. static szTruncatedWeapon[33], iAttacker, iVictim;
  217. get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
  218.  
  219. iAttacker = get_msg_arg_int(1);
  220. iVictim = get_msg_arg_int(2);
  221.  
  222. if(!is_user_connected(iAttacker) || iAttacker == iVictim)
  223. return PLUGIN_CONTINUE;
  224.  
  225. if(equal(szTruncatedWeapon, "knife") && get_user_weapon(iAttacker) == CSW_M249)
  226. if(Get_BitVar(g_Had_Guillotine, iAttacker))
  227. set_msg_arg_string(4, "Flying Guillotine");
  228.  
  229. return PLUGIN_CONTINUE;
  230. }
  231.  
  232. public HookWeapon(id)
  233. {
  234. engclient_cmd(id, "weapon_m249")
  235. return PLUGIN_HANDLED
  236. }
  237.  
  238. public Event_CurWeapon(id)
  239. {
  240. if(!is_alive(id))
  241. return
  242.  
  243. static CSWID; CSWID = read_data(2)
  244. if(CSWID == CSW_M249 && Get_BitVar(g_Had_Guillotine, id))
  245. update_ammo(id, -1, g_Ammo[id])
  246. }
  247.  
  248. public update_ammo(id, Ammo, BpAmmo)
  249. {
  250. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), _, id)
  251. write_byte(1)
  252. write_byte(CSW_M249)
  253. write_byte(Ammo)
  254. message_end()
  255.  
  256. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), _, id)
  257. write_byte(10)
  258. write_byte(BpAmmo)
  259. message_end()
  260.  
  261. cs_set_user_bpammo(id, CSW_M249, BpAmmo)
  262. }
  263.  
  264. public client_PostThink(id)
  265. {
  266. if(!is_alive(id))
  267. return
  268.  
  269. if(get_player_weapon(id) != CSW_M249 || !Get_BitVar(g_Had_Guillotine, id))
  270. return
  271.  
  272. if(!Get_BitVar(g_CanShoot, id) && !pev_valid(g_MyGuillotine[id]))
  273. {
  274. // Reset Player
  275. Set_PlayerNextAttack(id, 1.0)
  276. Set_WeaponIdleTime(id, CSW_M249, 1.0)
  277.  
  278. Set_WeaponAnim(id, ANIM_LOST)
  279. Set_BitVar(g_CanShoot, id)
  280. UnSet_BitVar(g_Hit, id)
  281.  
  282. set_task(0.95, "Reset_Guillotine", id+TASK_RESET)
  283. }
  284. }
  285.  
  286. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
  287. {
  288. if(!is_alive(id))
  289. return FMRES_IGNORED
  290. if(get_player_weapon(id) != CSW_M249 || !Get_BitVar(g_Had_Guillotine, id))
  291. return FMRES_IGNORED
  292.  
  293. set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
  294.  
  295. return FMRES_HANDLED
  296. }
  297.  
  298. public fw_CmdStart(id, uc_handle, seed)
  299. {
  300. if(!is_alive(id))
  301. return FMRES_IGNORED
  302. if(get_player_weapon(id) != CSW_M249 || !Get_BitVar(g_Had_Guillotine, id))
  303. return FMRES_IGNORED
  304.  
  305. static CurButton; CurButton = get_uc(uc_handle, UC_Buttons)
  306.  
  307. if(CurButton & IN_ATTACK)
  308. {
  309. CurButton &= ~IN_ATTACK
  310. set_uc(uc_handle, UC_Buttons, CurButton)
  311.  
  312. HandleShot_Guillotine(id)
  313. }
  314.  
  315. return FMRES_HANDLED
  316. }
  317.  
  318. public fw_SetModel(entity, model[])
  319. {
  320. if(!pev_valid(entity))
  321. return FMRES_IGNORED
  322.  
  323. static Classname[32]
  324. pev(entity, pev_classname, Classname, sizeof(Classname))
  325.  
  326. if(!equal(Classname, "weaponbox"))
  327. return FMRES_IGNORED
  328.  
  329. static iOwner
  330. iOwner = pev(entity, pev_owner)
  331.  
  332. if(equal(model, "models/w_m249.mdl"))
  333. {
  334. static weapon; weapon = find_ent_by_owner(-1, "weapon_m249", entity)
  335.  
  336. if(!pev_valid(weapon))
  337. return FMRES_IGNORED;
  338.  
  339. if(Get_BitVar(g_Had_Guillotine, iOwner))
  340. {
  341. set_pev(weapon, pev_impulse, 1422015)
  342. set_pev(weapon, pev_iuser4, g_Ammo[iOwner])
  343.  
  344. engfunc(EngFunc_SetModel, entity, MODEL_W)
  345.  
  346. Remove_Guillotine(iOwner)
  347.  
  348. return FMRES_SUPERCEDE
  349. }
  350. }
  351.  
  352. return FMRES_IGNORED;
  353. }
  354.  
  355. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  356. {
  357. if(!is_connected(id))
  358. return FMRES_IGNORED
  359. if(!Get_BitVar(g_InTempingAttack, id))
  360. return FMRES_IGNORED
  361.  
  362. if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  363. {
  364. if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  365. return FMRES_SUPERCEDE
  366. if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  367. {
  368. if (sample[17] == 'w') return FMRES_SUPERCEDE
  369. else return FMRES_SUPERCEDE
  370. }
  371. if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  372. return FMRES_SUPERCEDE;
  373. }
  374.  
  375. return FMRES_IGNORED
  376. }
  377.  
  378. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  379. {
  380. if(!is_alive(id))
  381. return FMRES_IGNORED
  382. if(!Get_BitVar(g_InTempingAttack, id))
  383. return FMRES_IGNORED
  384.  
  385. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  386.  
  387. pev(id, pev_origin, fOrigin)
  388. pev(id, pev_view_ofs, view_ofs)
  389. xs_vec_add(fOrigin, view_ofs, vecStart)
  390. pev(id, pev_v_angle, v_angle)
  391.  
  392. engfunc(EngFunc_MakeVectors, v_angle)
  393. get_global_vector(GL_v_forward, v_forward)
  394.  
  395. xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  396. xs_vec_add(vecStart, v_forward, vecEnd)
  397.  
  398. engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  399.  
  400. return FMRES_SUPERCEDE
  401. }
  402.  
  403. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  404. {
  405. if(!is_alive(id))
  406. return FMRES_IGNORED
  407. if(!Get_BitVar(g_InTempingAttack, id))
  408. return FMRES_IGNORED
  409.  
  410. static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  411.  
  412. pev(id, pev_origin, fOrigin)
  413. pev(id, pev_view_ofs, view_ofs)
  414. xs_vec_add(fOrigin, view_ofs, vecStart)
  415. pev(id, pev_v_angle, v_angle)
  416.  
  417. engfunc(EngFunc_MakeVectors, v_angle)
  418. get_global_vector(GL_v_forward, v_forward)
  419.  
  420. xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  421. xs_vec_add(vecStart, v_forward, vecEnd)
  422.  
  423. engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  424.  
  425. return FMRES_SUPERCEDE
  426. }
  427.  
  428. public fw_Guillotine_Touch(Ent, Touched)
  429. {
  430. if(!pev_valid(Ent))
  431. return
  432.  
  433. static id; id = pev(Ent, pev_owner)
  434. if(!is_alive(id))
  435. {
  436. Guillotine_Broken(Ent)
  437. return
  438. }
  439.  
  440. if(is_connected(Touched))
  441. { // Touch Human
  442. if(!is_alive(Touched))
  443. return
  444. if(Get_BitVar(g_Hit, id))
  445. return
  446. if(Touched == id)
  447. return
  448. if(!get_pcvar_num(get_cvar_pointer("mp_friendlyfire")))
  449. {
  450. if(cs_get_user_team(Touched) == cs_get_user_team(id))
  451. return
  452. }
  453.  
  454. static Float:HeadOrigin[3], Float:HeadAngles[3];
  455. engfunc(EngFunc_GetBonePosition, Touched, 8, HeadOrigin, HeadAngles);
  456.  
  457. static Float:EntOrigin[3]; pev(Ent, pev_origin, EntOrigin)
  458.  
  459. if(get_distance_f(EntOrigin, HeadOrigin) <= 16.0)
  460. {
  461. if(!pev(Ent, pev_return))
  462. {
  463. // Set
  464. Set_BitVar(g_Hit, id)
  465. Set_WeaponAnim(id, ANIM_EXPECT_FX)
  466.  
  467. set_pev(Ent, pev_enemy, Touched)
  468. set_pev(Ent, pev_return, 1)
  469. set_pev(Ent, pev_movetype, MOVETYPE_FOLLOW)
  470. set_pev(Ent, pev_velocity, {0.0, 0.0, 0.0})
  471. set_pev(Ent, pev_fuser1, get_gametime() + get_pcvar_float(g_Cvars[6]))
  472.  
  473. // Animation
  474. set_pev(Ent, pev_animtime, get_gametime())
  475. set_pev(Ent, pev_framerate, 5.0)
  476. set_pev(Ent, pev_sequence, 1)
  477. } else {
  478. if(get_gametime() - get_pcvar_float(g_Cvars[5]) > g_DamageTimeA[id])
  479. {
  480. ExecuteHamB(Ham_TakeDamage, Touched, fm_get_user_weapon_entity(id, CSW_KNIFE), id, get_pcvar_float(g_Cvars[0]), DMG_SLASH)
  481. g_DamageTimeA[id] = get_gametime()
  482. }
  483. }
  484. } else {
  485. if(get_gametime() - get_pcvar_float(g_Cvars[5]) > g_DamageTimeA[id])
  486. {
  487. ExecuteHamB(Ham_TakeDamage, Touched, fm_get_user_weapon_entity(id, CSW_KNIFE), id, get_pcvar_float(g_Cvars[0]), DMG_SLASH)
  488.  
  489. // Knockback
  490. static Float:OriginA[3]; pev(id, pev_origin, OriginA)
  491. static Float:Origin[3]; pev(Touched, pev_origin, Origin)
  492. static Float:Velocity[3]; Get_SpeedVector(OriginA, Origin, get_pcvar_float(g_Cvars[4]), Velocity)
  493.  
  494. set_pev(Touched, pev_velocity, Velocity)
  495.  
  496. g_DamageTimeA[id] = get_gametime()
  497. }
  498. }
  499. } else { // Touch Wall
  500. if(!pev(Ent, pev_return))
  501. {
  502. set_pev(Ent, pev_velocity, {0.0, 0.0, 0.0})
  503.  
  504. set_pev(Ent, pev_return, 1)
  505. emit_sound(Ent, CHAN_BODY, Weapon_Sounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  506.  
  507. // Reset Angles
  508. static Float:Angles[3]
  509. pev(id, pev_v_angle, Angles)
  510.  
  511. Angles[0] *= -1.0
  512. set_pev(Ent, pev_angles, Angles)
  513.  
  514. // Check Damage
  515. static Float:TakeDamage; pev(Touched, pev_takedamage, TakeDamage)
  516. if(TakeDamage == DAMAGE_YES) ExecuteHamB(Ham_TakeDamage, Touched, fm_get_user_weapon_entity(id, CSW_KNIFE), id, get_pcvar_float(g_Cvars[0]), DMG_SLASH)
  517. } else {
  518. static Classname[32];
  519. pev(Touched, pev_classname, Classname, 31)
  520.  
  521. if(!Get_BitVar(g_Hit, id) && !equal(Classname, "weaponbox")) Guillotine_Broken(Ent)
  522. return
  523. }
  524. }
  525. }
  526.  
  527. public fw_Guillotine_Think(Ent)
  528. {
  529. if(!pev_valid(Ent))
  530. return
  531.  
  532. static id; id = pev(Ent, pev_owner)
  533. if(!is_alive(id))
  534. {
  535. Guillotine_Broken(Ent)
  536. return
  537. }
  538. if(!Get_BitVar(g_Had_Guillotine, id))
  539. {
  540. Guillotine_Broken(Ent)
  541. return
  542. }
  543.  
  544. static Float:LiveTime
  545. pev(Ent, pev_fuser2, LiveTime)
  546.  
  547. if(get_gametime() >= LiveTime)
  548. {
  549. Guillotine_Broken(Ent)
  550. return
  551. }
  552.  
  553. if(pev(Ent, pev_return)) // Returning to the owner
  554. {
  555. static Target; Target = pev(Ent, pev_enemy)
  556. if(!is_alive(Target))
  557. {
  558. UnSet_BitVar(g_Hit, id)
  559.  
  560. if(pev(Ent, pev_sequence) != 0) set_pev(Ent, pev_sequence, 0)
  561. if(pev(Ent, pev_movetype) != MOVETYPE_FLY) set_pev(Ent, pev_movetype, MOVETYPE_FLY)
  562. set_pev(Ent, pev_aiment, 0)
  563.  
  564. if(entity_range(Ent, id) > 100.0)
  565. {
  566. static Float:Origin[3]; pev(id, pev_origin, Origin)
  567. Hook_The_Fucking_Ent(Ent, Origin, get_pcvar_float(g_Cvars[3]))
  568. } else {
  569. Guillotine_Catch(id, Ent)
  570. return
  571. }
  572. } else {
  573. static Float:fTimeRemove
  574. pev(Ent, pev_fuser1, fTimeRemove)
  575.  
  576. if(get_gametime() >= fTimeRemove)
  577. {
  578. set_pev(Ent, pev_enemy, 0)
  579. } else {
  580. static Float:HeadOrigin[3], Float:HeadAngles[3];
  581. engfunc(EngFunc_GetBonePosition, Target, 8, HeadOrigin, HeadAngles);
  582.  
  583. static Float:Velocity[3];
  584. pev(Ent, pev_velocity, Velocity)
  585.  
  586. set_pev(Ent, pev_velocity, {0.0, 0.0, 0.0})
  587. set_pev(Ent, pev_angles, HeadAngles)
  588.  
  589. static Float:EnemyOrigin[3]; pev(Target, pev_origin, EnemyOrigin)
  590. if(get_distance_f(EnemyOrigin, HeadOrigin) <= 24.0) engfunc(EngFunc_SetOrigin, Ent, HeadOrigin)
  591. else engfunc(EngFunc_SetOrigin, Ent, EnemyOrigin)
  592.  
  593. if(get_gametime() - get_pcvar_float(g_Cvars[5]) > g_DamageTimeB[id])
  594. {
  595. // Animation
  596. if(!pev(Ent, pev_sequence))
  597. {
  598. set_pev(Ent, pev_animtime, get_gametime())
  599. set_pev(Ent, pev_framerate, 5.0)
  600. set_pev(Ent, pev_sequence, 1)
  601. }
  602.  
  603. set_pdata_int(Target, m_iLastHitGroup, HIT_HEAD, 5)
  604. ExecuteHamB(Ham_TakeDamage, Target, fm_get_user_weapon_entity(id, CSW_KNIFE), id, get_pcvar_float(g_Cvars[0]), DMG_SLASH)
  605.  
  606. g_DamageTimeB[id] = get_gametime()
  607. }
  608.  
  609. // Knockback
  610. static Float:OriginA[3]; pev(id, pev_origin, OriginA)
  611. static Float:Origin[3]; pev(Target, pev_origin, Origin)
  612. static Float:VelocityA[3]; Get_SpeedVector(OriginA, Origin, get_pcvar_float(g_Cvars[4]) / 5.0, VelocityA)
  613.  
  614. set_pev(Target, pev_velocity, VelocityA)
  615. }
  616. }
  617. } else {
  618. if(entity_range(Ent, id) >= get_pcvar_float(g_Cvars[2]))
  619. {
  620. set_pev(Ent, pev_velocity, {0.0, 0.0, 0.0})
  621. set_pev(Ent, pev_return, 1)
  622. }
  623. }
  624.  
  625. set_pev(Ent, pev_nextthink, get_gametime() + 0.05)
  626. }
  627.  
  628. public Guillotine_Broken(Ent)
  629. {
  630. static Float:Origin[3];
  631.  
  632. emit_sound(Ent, CHAN_BODY, Weapon_Sounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  633. pev(Ent, pev_origin, Origin)
  634.  
  635. remove_entity(Ent)
  636.  
  637. // Effect
  638. message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
  639. write_byte(TE_EXPLOSION)
  640. engfunc(EngFunc_WriteCoord, Origin[0])
  641. engfunc(EngFunc_WriteCoord, Origin[1])
  642. engfunc(EngFunc_WriteCoord, Origin[2])
  643. write_short(g_ExpSprID) // sprite index
  644. write_byte(5) // scale in 0.1's
  645. write_byte(30) // framerate
  646. write_byte(TE_EXPLFLAG_NOSOUND) // flags
  647. message_end()
  648.  
  649. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  650. write_byte(TE_BREAKMODEL)
  651. engfunc(EngFunc_WriteCoord, Origin[0])
  652. engfunc(EngFunc_WriteCoord, Origin[1])
  653. engfunc(EngFunc_WriteCoord, Origin[2])
  654. write_coord(64); // size x
  655. write_coord(64); // size y
  656. write_coord(64); // size z
  657. write_coord(random_num(-64,64)); // velocity x
  658. write_coord(random_num(-64,64)); // velocity y
  659. write_coord(25); // velocity z
  660. write_byte(10); // random velocity
  661. write_short(g_GibModelID); // model index that you want to break
  662. write_byte(32); // count
  663. write_byte(25); // life
  664. write_byte(0x01); // flags: BREAK_GLASS
  665. message_end();
  666. }
  667.  
  668. public Reset_Guillotine(id)
  669. {
  670. id -= TASK_RESET
  671.  
  672. if(!is_alive(id))
  673. return
  674. if(!Get_BitVar(g_Had_Guillotine, id))
  675. return
  676. Set_BitVar(g_CanShoot, id)
  677. if(get_player_weapon(id) != CSW_M249)
  678. return
  679.  
  680. Set_PlayerNextAttack(id, 0.75)
  681. Set_WeaponIdleTime(id, CSW_M249, 0.75)
  682.  
  683. if(g_Ammo[id])
  684. {
  685. Set_WeaponAnim(id, ANIM_DRAW)
  686. PlaySound(id, Weapon_Sounds[0])
  687. }
  688. }
  689.  
  690. public Guillotine_Catch(id, Ent)
  691. {
  692. // Remove Entity
  693. remove_entity(Ent)
  694. g_MyGuillotine[id] = -1
  695.  
  696. // Reset Player
  697. if(get_player_weapon(id) == CSW_M249 && Get_BitVar(g_Had_Guillotine, id))
  698. {
  699. if(!get_pcvar_num(g_Cvars[7]))
  700. g_Ammo[id] = min(g_Ammo[id] + 1, get_pcvar_num(g_Cvars[0]))
  701.  
  702. update_ammo(id, -1, g_Ammo[id])
  703.  
  704. Create_FakeAttack(id)
  705.  
  706. Set_PlayerNextAttack(id, 1.0)
  707. Set_WeaponIdleTime(id, CSW_M249, 1.0)
  708.  
  709. Set_WeaponAnim(id, ANIM_CATCH)
  710. Set_BitVar(g_CanShoot, id)
  711. UnSet_BitVar(g_Hit, id)
  712.  
  713. emit_sound(id, CHAN_WEAPON, Weapon_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  714. } else {
  715. emit_sound(id, CHAN_WEAPON, Weapon_Sounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  716. Set_BitVar(g_CanShoot, id)
  717. UnSet_BitVar(g_Hit, id)
  718. }
  719. }
  720.  
  721. public fw_Item_Deploy_Post(Ent)
  722. {
  723. if(pev_valid(Ent) != 2)
  724. return
  725. static Id; Id = get_pdata_cbase(Ent, 41, 4)
  726. if(get_pdata_cbase(Id, 373) != Ent)
  727. return
  728. if(!Get_BitVar(g_Had_Guillotine, Id))
  729. return
  730.  
  731. set_pev(Id, pev_viewmodel2, MODEL_V)
  732. set_pev(Id, pev_weaponmodel2, MODEL_P)
  733.  
  734. static Valid; Valid = pev_valid(g_MyGuillotine[Id])
  735. if(g_Ammo[Id])
  736. {
  737. Set_WeaponAnim(Id, ANIM_DRAW)
  738. if(!Valid) PlaySound(Id, Weapon_Sounds[0])
  739. } else Set_WeaponAnim(Id, ANIM_DRAW_EMPTY)
  740.  
  741. if(!Valid) Set_BitVar(g_CanShoot, Id)
  742. else Set_WeaponAnim(Id, ANIM_DRAW_EMPTY)
  743.  
  744. set_pdata_string(Id, (492) * 4, "grenade", -1 , 20)
  745. }
  746.  
  747. public fw_Item_AddToPlayer_Post(Ent, id)
  748. {
  749. if(!pev_valid(Ent))
  750. return HAM_IGNORED
  751.  
  752. if(pev(Ent, pev_impulse) == 1422015)
  753. {
  754. Set_BitVar(g_Had_Guillotine, id)
  755. Set_BitVar(g_CanShoot, id)
  756.  
  757. set_pev(Ent, pev_impulse, 0)
  758. g_Ammo[id] = pev(Ent, pev_iuser4)
  759. }
  760.  
  761. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
  762. write_string(Get_BitVar(g_Had_Guillotine, id) ? "weapon_guillotine" : "weapon_m249")
  763. write_byte(3)
  764. write_byte(200)
  765. write_byte(-1)
  766. write_byte(-1)
  767. write_byte(0)
  768. write_byte(4)
  769. write_byte(CSW_M249)
  770. write_byte(0)
  771. message_end()
  772.  
  773. return HAM_HANDLED
  774. }
  775.  
  776. public fw_Weapon_WeaponIdle_Post(iEnt)
  777. {
  778. if(pev_valid(iEnt) != 2)
  779. return
  780. static Id; Id = get_pdata_cbase(iEnt, 41, 4)
  781.  
  782. if(!Get_BitVar(g_Had_Guillotine, Id))
  783. return
  784.  
  785. if(get_pdata_float(iEnt, 48, 4) <= 0.25)
  786. {
  787. if(g_Ammo[Id])
  788. {
  789. if(Get_BitVar(g_CanShoot, Id)) Set_WeaponAnim(Id, ANIM_IDLE)
  790. else {
  791. if(Get_BitVar(g_Hit, Id)) Set_WeaponAnim(Id, ANIM_EXPECT_FX)
  792. else Set_WeaponAnim(Id, ANIM_EXPECT)
  793. }
  794. } else Set_WeaponAnim(Id, ANIM_IDLE_EMPTY)
  795.  
  796. set_pdata_float(iEnt, 48, 20.0, 4)
  797. }
  798. }
  799.  
  800. public HandleShot_Guillotine(id)
  801. {
  802. if(get_pdata_float(id, 83, 5) > 0.0)
  803. return
  804. if(g_Ammo[id] <= 0)
  805. return
  806. if(!Get_BitVar(g_CanShoot, id))
  807. return
  808.  
  809. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_M249)
  810. if(!pev_valid(Ent)) return
  811.  
  812. UnSet_BitVar(g_CanShoot, id)
  813. Create_FakeAttack(id)
  814.  
  815. Set_WeaponAnim(id, ANIM_SHOOT)
  816. emit_sound(id, CHAN_WEAPON, Weapon_Sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  817.  
  818. Create_Guillotine(id)
  819.  
  820. Set_PlayerNextAttack(id, 0.5)
  821. Set_WeaponIdleTime(id, CSW_M249, 0.5)
  822.  
  823. if(!get_pcvar_num(g_Cvars[7]))
  824. g_Ammo[id]--
  825.  
  826. update_ammo(id, -1, g_Ammo[id])
  827. }
  828.  
  829. public Create_Guillotine(id)
  830. {
  831. new iEnt = create_entity("info_target")
  832.  
  833. static Float:Origin[3], Float:TargetOrigin[3], Float:Velocity[3], Float:Angles[3]
  834.  
  835. get_weapon_attachment(id, Origin, 0.0)
  836. Origin[2] -= 10.0
  837. get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
  838.  
  839. pev(id, pev_v_angle, Angles)
  840. Angles[0] *= -1.0
  841.  
  842. // set info for ent
  843. set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
  844. entity_set_string(iEnt, EV_SZ_classname, "guillotine")
  845. engfunc(EngFunc_SetModel, iEnt, MODEL_S)
  846.  
  847. set_pev(iEnt, pev_mins, Float:{-1.0, -1.0, -1.0})
  848. set_pev(iEnt, pev_maxs, Float:{1.0, 1.0, 1.0})
  849. set_pev(iEnt, pev_origin, Origin)
  850. set_pev(iEnt, pev_angles, Angles)
  851. set_pev(iEnt, pev_gravity, 0.01)
  852. set_pev(iEnt, pev_solid, SOLID_TRIGGER)
  853. set_pev(iEnt, pev_owner, id)
  854. set_pev(iEnt, pev_eteam, get_user_team(id))
  855. set_pev(iEnt, pev_return, 0)
  856. set_pev(iEnt, pev_extra, 0)
  857. set_pev(iEnt, pev_enemy, 0)
  858. set_pev(iEnt, pev_fuser2, get_gametime() + 8.0)
  859.  
  860. get_speed_vector(Origin, TargetOrigin, get_pcvar_float(g_Cvars[3]), Velocity)
  861. set_pev(iEnt, pev_velocity, Velocity)
  862.  
  863. set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
  864.  
  865. g_MyGuillotine[id] = iEnt
  866.  
  867. // Animation
  868. set_pev(iEnt, pev_animtime, get_gametime())
  869. set_pev(iEnt, pev_framerate, 2.0)
  870. set_pev(iEnt, pev_sequence, 0)
  871. }
  872.  
  873. public Create_FakeAttack(id)
  874. {
  875. static Ent; Ent = fm_get_user_weapon_entity(id, CSW_KNIFE)
  876. if(!pev_valid(Ent)) return
  877.  
  878. Set_BitVar(g_InTempingAttack, id)
  879. ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)
  880.  
  881. // Set Real Attack Anim
  882. static iAnimDesired, szAnimation[64]
  883.  
  884. formatex(szAnimation, charsmax(szAnimation), (pev(id, pev_flags) & FL_DUCKING) ? "crouch_shoot_%s" : "ref_shoot_%s", "knife")
  885. if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1)
  886. iAnimDesired = 0
  887.  
  888. set_pev(id, pev_sequence, iAnimDesired)
  889. UnSet_BitVar(g_InTempingAttack, id)
  890. }
  891.  
  892. stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
  893. {
  894. static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  895. if(!pev_valid(entwpn))
  896. return
  897.  
  898. set_pdata_float(entwpn, 46, TimeIdle, 4)
  899. set_pdata_float(entwpn, 47, TimeIdle, 4)
  900. set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
  901. }
  902.  
  903. stock Set_PlayerNextAttack(id, Float:nexttime)
  904. {
  905. set_pdata_float(id, 83, nexttime, 5)
  906. }
  907.  
  908. stock Set_WeaponAnim(id, anim)
  909. {
  910. set_pev(id, pev_weaponanim, anim)
  911.  
  912. message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
  913. write_byte(anim)
  914. write_byte(pev(id, pev_body))
  915. message_end()
  916. }
  917.  
  918. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
  919. {
  920. static Float:vfEnd[3], viEnd[3]
  921. get_user_origin(id, viEnd, 3)
  922. IVecFVec(viEnd, vfEnd)
  923.  
  924. static Float:fOrigin[3], Float:fAngle[3]
  925.  
  926. pev(id, pev_origin, fOrigin)
  927. pev(id, pev_view_ofs, fAngle)
  928.  
  929. xs_vec_add(fOrigin, fAngle, fOrigin)
  930.  
  931. static Float:fAttack[3]
  932.  
  933. xs_vec_sub(vfEnd, fOrigin, fAttack)
  934. xs_vec_sub(vfEnd, fOrigin, fAttack)
  935.  
  936. static Float:fRate
  937.  
  938. fRate = fDis / vector_length(fAttack)
  939. xs_vec_mul_scalar(fAttack, fRate, fAttack)
  940.  
  941. xs_vec_add(fOrigin, fAttack, output)
  942. }
  943.  
  944. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
  945. {
  946. new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  947.  
  948. pev(id, pev_origin, vOrigin)
  949. pev(id, pev_view_ofs,vUp) //for player
  950. xs_vec_add(vOrigin,vUp,vOrigin)
  951. pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  952.  
  953. angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  954. angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  955. angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  956.  
  957. vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  958. vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  959. vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  960. }
  961.  
  962. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  963. {
  964. new_velocity[0] = origin2[0] - origin1[0]
  965. new_velocity[1] = origin2[1] - origin1[1]
  966. new_velocity[2] = origin2[2] - origin1[2]
  967. new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  968. new_velocity[0] *= num
  969. new_velocity[1] *= num
  970. new_velocity[2] *= num
  971.  
  972. return 1;
  973. }
  974.  
  975. stock Hook_The_Fucking_Ent(ent, Float:TargetOrigin[3], Float:Speed)
  976. {
  977. static Float:fl_Velocity[3], Float:EntOrigin[3], Float:distance_f, Float:fl_Time
  978.  
  979. pev(ent, pev_origin, EntOrigin)
  980.  
  981. distance_f = get_distance_f(EntOrigin, TargetOrigin)
  982. fl_Time = distance_f / Speed
  983.  
  984. pev(ent, pev_velocity, fl_Velocity)
  985.  
  986. fl_Velocity[0] = (TargetOrigin[0] - EntOrigin[0]) / fl_Time
  987. fl_Velocity[1] = (TargetOrigin[1] - EntOrigin[1]) / fl_Time
  988. fl_Velocity[2] = (TargetOrigin[2] - EntOrigin[2]) / fl_Time
  989.  
  990. set_pev(ent, pev_velocity, fl_Velocity)
  991. }
  992.  
  993. stock PlaySound(id, const sound[])
  994. {
  995. if(equal(sound[strlen(sound)-4], ".mp3")) client_cmd(id, "mp3 play ^"sound/%s^"", sound)
  996. else client_cmd(id, "spk ^"%s^"", sound)
  997. }
  998.  
  999. stock Get_SpeedVector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
  1000. {
  1001. new_velocity[0] = origin2[0] - origin1[0]
  1002. new_velocity[1] = origin2[1] - origin1[1]
  1003. new_velocity[2] = origin2[2] - origin1[2]
  1004. new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  1005. new_velocity[0] *= num
  1006. new_velocity[1] *= num
  1007. new_velocity[2] *= num
  1008.  
  1009. return 1;
  1010. }
  1011.  
  1012. stock Drop_Weapon(id, slot)
  1013. {
  1014. if(!(1 <= slot <= 2))
  1015. return 0;
  1016.  
  1017. static iCount; iCount = 0;
  1018. static iEntity; iEntity = get_pdata_cbase(id, (367 + slot), 5);
  1019.  
  1020. if(iEntity > 0)
  1021. {
  1022. static iNext;
  1023. static szWeaponName[32];
  1024.  
  1025. do {
  1026. iNext = get_pdata_cbase(iEntity, 42, 4);
  1027.  
  1028. if(get_weaponname(cs_get_weapon_id(iEntity), szWeaponName, charsmax(szWeaponName)))
  1029. {
  1030. engclient_cmd(id, "drop", szWeaponName);
  1031. iCount++;
  1032. }
  1033. }
  1034.  
  1035. while(( iEntity = iNext) > 0);
  1036. }
  1037.  
  1038. return iCount;
  1039. }
  1040.  
  1041. /* ===============================
  1042. ------------- SAFETY -------------
  1043. =================================*/
  1044. public Register_SafetyFunc()
  1045. {
  1046. register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
  1047.  
  1048. RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
  1049. RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
  1050. }
  1051.  
  1052. public Safety_Connected(id)
  1053. {
  1054. Set_BitVar(g_IsConnected, id)
  1055. UnSet_BitVar(g_IsAlive, id)
  1056.  
  1057. g_PlayerWeapon[id] = 0
  1058. }
  1059.  
  1060. public Safety_Disconnected(id)
  1061. {
  1062. UnSet_BitVar(g_IsConnected, id)
  1063. UnSet_BitVar(g_IsAlive, id)
  1064.  
  1065. g_PlayerWeapon[id] = 0
  1066. }
  1067.  
  1068. public Safety_CurWeapon(id)
  1069. {
  1070. if(!is_alive(id))
  1071. return
  1072.  
  1073. static CSW; CSW = read_data(2)
  1074. if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
  1075. }
  1076.  
  1077. public fw_Safety_Spawn_Post(id)
  1078. {
  1079. if(!is_user_alive(id))
  1080. return
  1081.  
  1082. Set_BitVar(g_IsAlive, id)
  1083. }
  1084.  
  1085. public fw_Safety_Killed_Post(id)
  1086. {
  1087. UnSet_BitVar(g_IsAlive, id)
  1088. }
  1089.  
  1090. public is_alive(id)
  1091. {
  1092. if(!(1 <= id <= 32))
  1093. return 0
  1094. if(!Get_BitVar(g_IsConnected, id))
  1095. return 0
  1096. if(!Get_BitVar(g_IsAlive, id))
  1097. return 0
  1098.  
  1099. return 1
  1100. }
  1101.  
  1102. public is_connected(id)
  1103. {
  1104. if(!(1 <= id <= 32))
  1105. return 0
  1106. if(!Get_BitVar(g_IsConnected, id))
  1107. return 0
  1108.  
  1109. return 1
  1110. }
  1111.  
  1112. public get_player_weapon(id)
  1113. {
  1114. if(!is_alive(id))
  1115. return 0
  1116.  
  1117. return g_PlayerWeapon[id]
  1118. }
  1119.  
  1120. /* ===============================
  1121. --------- End of SAFETY ----------
  1122. =================================*/
  1123.