MasamuneDate

Scout Legion

Apr 12th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 36.65 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <engine>
  4. #include <fun>
  5. #include <fakemeta>
  6. #include <fakemeta_util>
  7. #include <hamsandwich>
  8. #include <cstrike>
  9. #include <xs>
  10. #include <codmod>
  11.  
  12. #define message_begin_f(%1,%2,%3,%4) engfunc(EngFunc_MessageBegin, %1, %2, %3, %4)
  13. #define write_coord_f(%1) engfunc(EngFunc_WriteCoord, %1)
  14.  
  15. #define PLUGIN "[CSO] Dual Katana"
  16. #define VERSION "1.0"
  17. #define AUTHOR "Dias"
  18.  
  19. new const nazwa[]   = "Scout Legion";
  20. new const opis[]    = "Instant Kill with knife, you got 3D Manuver Gear ( E )";
  21. new const bronie    = (1<<CSW_M4A1) | 1<<CSW_DEAGLE | 1<<CSW_FLASHBANG;
  22. new const zdrowie   = 30;
  23. new const kondycja  = 110;
  24. new const inteligencja = 0;
  25. new const wytrzymalosc = 10;
  26.  
  27. new identyfikator[33];
  28. new ma_klase[33];
  29.  
  30. // Players admin level
  31. #define ADMINLEVEL ADMIN_SLAY
  32.  
  33. #define V_MODEL "models/v_snap_blade.mdl"
  34. #define P_MODEL "models/p_snap_blade.mdl"
  35.  
  36. #define CSW_DUALKATANA CSW_KNIFE
  37. #define weapon_dualkatana "weapon_knife"
  38. #define WEAPON_ANIMEXT "dualpistols_1"
  39. #define WEAPON_ANIMEXT2 "knife"
  40.  
  41. #define DRAW_TIME 1.0
  42.  
  43. #define SLASH_DAMAGE 30
  44. #define SLASH_RADIUS 100
  45. #define SLASH_RESET_TIME 1.0
  46. #define SLASH1_TIME 0.25
  47. #define SLASH2_TIME1 0.25
  48. #define SLASH2_TIME2 0.5
  49. #define SLASH_RESET_TIME 1.0
  50. #define TASK_SOUND_GAS 2293+30
  51.  
  52. #define STAB_DAMAGE 3500
  53. #define STAB_RADIUS 150
  54. #define STAB_POINT_DIS 48
  55. #define STAB_TIME 0.5
  56. #define STAB_RESET_TIME 1.0
  57.  
  58. #define TASK_SET_DAMAGE 1955+10
  59. #define TASK_RESET_DAMAGE 1955+20
  60.  
  61. // OFFSET
  62. const PDATA_SAFE = 2
  63. const OFFSET_LINUX_WEAPONS = 4
  64. const OFFSET_WEAPONOWNER = 41
  65. const m_flNextAttack = 83
  66. const m_szAnimExtention = 492
  67.  
  68. #define MAX_MODELS 1
  69.  
  70. new const DualKatana_Sound[9][] =
  71. {
  72.     "weapons/katanad_draw.wav",
  73.     "weapons/katanad_hit1.wav",
  74.     "weapons/katanad_hit2.wav",
  75.     "weapons/katanad_hitwall.wav",
  76.     "weapons/katanad_slash1.wav",
  77.     "weapons/katanad_slash2.wav",
  78.     "weapons/katanad_slash3.wav",
  79.     "weapons/katanad_stab.wav",
  80.     "weapons/katanad_stab_miss.wav"
  81. }
  82.  
  83. enum
  84. {
  85.     ATTACK_SLASH1 = 1,
  86.     ATTACK_SLASH2,
  87.     ATTACK_SLASH3,
  88.     ATTACK_STAB
  89. }
  90.  
  91. enum
  92. {
  93.     DK_ANIM_IDLE = 0,
  94.     DK_ANIM_FSLASH1,
  95.     DK_ANIM_FSLASH2,
  96.     DK_ANIM_DRAW,
  97.     DK_ANIM_STAB,
  98.     DK_ANIM_STAB_MISS,
  99.     DK_ANIM_SLASH1,
  100.     DK_ANIM_SLASH2,
  101.     DK_ANIM_SLASH3
  102. }
  103.  
  104. enum
  105. {
  106.     HIT_NOTHING = 0,
  107.     HIT_ENEMY,
  108.     HIT_WALL
  109. }
  110. new const CostumeModels[MAX_MODELS][] =
  111. {
  112.     "models/cosmaneuvers_pelvis.mdl"
  113. }
  114.  
  115. new g_Had_DualKatana[33], g_Slashing_Mode[33], g_Attack_Mode[33], g_Checking_Mode[33], g_Hit_Ing[33]
  116. new g_Old_Weapon[33], g_Ham_Bot
  117. new g_Costume_Satu[33]
  118.  
  119. //Cvars
  120. new pThrowSpeed, pSpeed, pWidth, pSound, pColor
  121. new pInterrupt, pHookSky, pOpenDoors, pPlayers
  122. new pUseButtons, pHostage, pWeapons, pInstant, pHookNoise
  123.  
  124. // Sprite
  125. new sprBeam
  126.  
  127. // Players hook entity
  128. new Hook[33]
  129.  
  130. // MaxPlayers
  131. new gMaxPlayers
  132.  
  133. // some booleans
  134. new bool:gHooked[33]
  135. new bool:canThrowHook[33]
  136.  
  137. // Player Spawn
  138. new bool:gRestart[33] = {false, ...}
  139. new bool:gUpdate[33] = {false, ...}
  140.  
  141. public plugin_init()
  142. {
  143.     register_plugin(PLUGIN, VERSION, AUTHOR)
  144.    
  145.     cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
  146.    
  147.     register_event("DeathMsg", "Event_Death", "a")
  148.     register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  149.    
  150.     register_forward(FM_EmitSound, "fw_EmitSound")
  151.     register_forward(FM_CmdStart, "fw_CmdStart")
  152.     register_forward(FM_TraceLine, "fw_TraceLine")
  153.     register_forward(FM_TraceHull, "fw_TraceHull")     
  154.    
  155.     RegisterHam(Ham_TraceAttack, "player", "fw_PlayerTraceAttack")
  156.     RegisterHam(Ham_Item_Deploy, weapon_dualkatana, "fw_Item_Deploy_Post", 1)
  157.    
  158.     register_clcmd("admin_get_dualkatana", "get_dualkatana")
  159.    
  160.     // Player spawn stuff
  161.     register_event("TextMsg", "Restart", "a", "2=#Game_will_restart_in")
  162.     register_clcmd("fullupdate", "Update")
  163.     register_event("ResetHUD", "ResetHUD", "b")
  164.    
  165.     register_event("HLTV", "round_bstart", "a", "1=0", "2=0")
  166.     register_event("TextMsg", "Restart", "a", "2=#Game_will_restart_in")
  167.     register_clcmd("fullupdate", "Update")
  168.     register_event("ResetHUD", "ResetHUD", "b")
  169.     register_forward(FM_Touch, "fwTouch")
  170.     register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
  171.    
  172.     pThrowSpeed =   register_cvar("sv_hookthrowspeed", "3000")
  173.     pSpeed =    register_cvar("sv_hookspeed", "1000")
  174.     pWidth =    register_cvar("sv_hookwidth", "32")
  175.     pSound =    register_cvar("sv_hooksound", "0")
  176.     pColor =    register_cvar("sv_hookcolor", "1")
  177.     pPlayers =  register_cvar("sv_hookplayers", "1")
  178.     pInterrupt =    register_cvar("sv_hookinterrupt", "0")
  179.     pHookSky =  register_cvar("sv_hooksky", "1")
  180.     pOpenDoors =    register_cvar("sv_hookopendoors", "1")
  181.     pUseButtons =   register_cvar("sv_hookusebuttons", "1")
  182.     pHostage =  register_cvar("sv_hookhostflollow", "1")
  183.     pWeapons =  register_cvar("sv_hookpickweapons", "1")
  184.     pInstant =  register_cvar("sv_hookinstant", "0")
  185.     pHookNoise =    register_cvar("sv_hooknoise", "1")
  186.     RegisterHam(Ham_Spawn, "player", "fwHamPlayerSpawnPost", 1)  
  187.     gMaxPlayers = get_maxplayers()
  188.    
  189.  
  190. }
  191.  
  192. public plugin_precache()
  193. {
  194.     engfunc(EngFunc_PrecacheModel, V_MODEL)
  195.     engfunc(EngFunc_PrecacheModel, P_MODEL)
  196.    
  197.     for(new i = 0; i < sizeof(DualKatana_Sound); i++)
  198.         engfunc(EngFunc_PrecacheSound, DualKatana_Sound[i])
  199.        
  200.     for(new i = 0; i < MAX_MODELS; i++)
  201.     {
  202.         precache_model(CostumeModels[i])
  203.     }
  204.     engfunc(EngFunc_PrecacheModel, "models/rpgrocket.mdl")
  205.  
  206.     sprBeam = engfunc(EngFunc_PrecacheModel, "sprites/zbeam4.spr")
  207.     engfunc(EngFunc_PrecacheSound, "weapons/gas.wav")
  208. }
  209.  
  210. public client_PreThink(id)
  211. {
  212.     if(is_user_alive(id))
  213.     {  
  214.         if(ma_klase[id])
  215.         {
  216.             if(pev(id, pev_button) & IN_USE)
  217.             {
  218.                 if(canThrowHook[id] && !gHooked[id])
  219.                 {
  220.                     throw_hook(id)
  221.                    
  222.                 }
  223.                 return PLUGIN_HANDLED
  224.             }
  225.             else
  226.                 del_hook(id)
  227.         }
  228.     }
  229.     return PLUGIN_HANDLED
  230. }
  231.  
  232.  
  233.  
  234. public cod_class_enabled(id)
  235. {
  236.     if(!is_user_alive(id))
  237.         return
  238.        
  239.     g_Had_DualKatana[id] = 1
  240.     g_Slashing_Mode[id] = 0
  241.     g_Attack_Mode[id] = 0
  242.     g_Checking_Mode[id] = 0
  243.     g_Hit_Ing[id] = 0  
  244.     ma_klase[id] = true;
  245.        
  246.     g_Had_DualKatana[id] = 1
  247.     fm_give_item(id, weapon_dualkatana)
  248.     create_costume(id, CostumeModels[0], 0)
  249.  
  250.    
  251.     if(get_user_weapon(id) == CSW_KNIFE)
  252.     {
  253.         set_pev(id, pev_viewmodel2, V_MODEL)
  254.         set_pev(id, pev_weaponmodel2, P_MODEL) 
  255.        
  256.         set_weapon_anim(id, DK_ANIM_DRAW)
  257.         set_player_nextattack(id, DRAW_TIME)
  258.     } else {
  259.         engclient_cmd(id, weapon_dualkatana)
  260.     }
  261.    
  262.     ma_klase[id] = true;
  263. }
  264.  
  265. public cod_class_disabled(id)
  266. {
  267.     ma_klase[id] = false;
  268.     remove_costume(id)
  269.     remove_dualkatana(id)
  270. }
  271. /*
  272. public get_dualkatana(id)
  273. {
  274.     if(!is_user_alive(id))
  275.         return
  276.        
  277.     g_Had_DualKatana[id] = 1
  278.     g_Slashing_Mode[id] = 0
  279.     g_Attack_Mode[id] = 0
  280.     g_Checking_Mode[id] = 0
  281.     g_Hit_Ing[id] = 0      
  282.        
  283.     g_Had_DualKatana[id] = 1
  284.     fm_give_item(id, weapon_dualkatana)
  285.     create_costume(id, CostumeModels[0], 0)
  286.  
  287.    
  288.     if(get_user_weapon(id) == CSW_KNIFE)
  289.     {
  290.         set_pev(id, pev_viewmodel2, V_MODEL)
  291.         set_pev(id, pev_weaponmodel2, P_MODEL) 
  292.        
  293.         set_weapon_anim(id, DK_ANIM_DRAW)
  294.         set_player_nextattack(id, DRAW_TIME)
  295.     } else {
  296.         engclient_cmd(id, weapon_dualkatana)
  297.     }
  298. }*/
  299.  
  300. public create_costume(id, model[], anim)
  301. {
  302.     g_Costume_Satu[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))   
  303.      set_pev(g_Costume_Satu[id], pev_movetype, MOVETYPE_FOLLOW)
  304.        set_pev(g_Costume_Satu[id], pev_aiment, id)
  305.        set_pev(g_Costume_Satu[id], pev_rendermode,  kRenderNormal)
  306.        engfunc(EngFunc_SetModel, g_Costume_Satu[id], model)
  307.            set_pev(g_Costume_Satu[id], pev_body, anim)
  308.            set_pev(g_Costume_Satu[id], pev_sequence, anim)
  309.            set_pev(g_Costume_Satu[id], pev_animtime, get_gametime())
  310.            set_pev(g_Costume_Satu[id], pev_framerate, 1.0)
  311. }
  312.  
  313. public remove_costume(id)
  314. {
  315.     fm_set_entity_visibility(g_Costume_Satu[id], 0)
  316.     g_Costume_Satu[id] = 0
  317. }
  318.  
  319. public remove_dualkatana(id)
  320. {  
  321.     g_Had_DualKatana[id] = 0
  322.     g_Slashing_Mode[id] = 0
  323.     g_Attack_Mode[id] = 0
  324.     g_Checking_Mode[id] = 0
  325.     g_Hit_Ing[id] = 0  
  326. }
  327.  
  328. public client_putinserver(id)
  329. {
  330.     if(!g_Ham_Bot && is_user_bot(id))
  331.     {
  332.         g_Ham_Bot = 1
  333.         set_task(0.1, "Do_RegisterHam_Bot", id)
  334.     }
  335.  
  336. }
  337.  
  338. public Do_RegisterHam_Bot(id)
  339. {
  340.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_PlayerTraceAttack")
  341. }
  342.  
  343. public Event_Death()
  344. {
  345.     static Victim; Victim = read_data(2)
  346.     remove_dualkatana(Victim)
  347.    
  348. }
  349.  
  350. public Event_CurWeapon(id)
  351. {
  352.     if(!is_user_alive(id))
  353.         return
  354.     if(!g_Had_DualKatana[id])
  355.         return
  356.        
  357.     if(get_user_weapon(id) == CSW_DUALKATANA && g_Old_Weapon[id] != CSW_DUALKATANA)
  358.     {
  359.         set_weapon_anim(id, DK_ANIM_DRAW)
  360.         set_player_nextattack(id, DRAW_TIME)
  361.        
  362.         set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  363.         emit_sound(id, CHAN_WEAPON, DualKatana_Sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
  364.  
  365.     }
  366.        
  367.     g_Old_Weapon[id] = get_user_weapon(id)
  368. }
  369.  
  370.  
  371. public fw_CmdStart(id, uc_handle, seed)
  372. {
  373.     if (!is_user_alive(id))
  374.         return
  375.     if(get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  376.         return
  377.    
  378.     static ent; ent = fm_get_user_weapon_entity(id, CSW_DUALKATANA)
  379.    
  380.     if(!pev_valid(ent))
  381.         return
  382.     if(get_pdata_float(ent, 46, OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0)
  383.         return
  384.    
  385.     static CurButton
  386.     CurButton = get_uc(uc_handle, UC_Buttons)
  387.    
  388.     if (CurButton & IN_ATTACK)
  389.     {
  390.         set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
  391.        
  392.         if(g_Slashing_Mode[id] == 0) g_Slashing_Mode[id] = 1
  393.        
  394.         g_Slashing_Mode[id]++
  395.         if(g_Slashing_Mode[id] > ATTACK_SLASH3) g_Slashing_Mode[id] = 1
  396.        
  397.         if(g_Slashing_Mode[id] == 1)
  398.         {
  399.             g_Attack_Mode[id] = ATTACK_SLASH1
  400.            
  401.             set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  402.            
  403.             g_Checking_Mode[id] = 1
  404.             ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  405.             g_Checking_Mode[id] = 0
  406.    
  407.             set_pev(id, pev_framerate, 0.75)
  408.             set_weapons_timeidle(id, CSW_DUALKATANA, SLASH_RESET_TIME)
  409.             set_player_nextattack(id, SLASH_RESET_TIME)
  410.            
  411.             set_weapon_anim(id, DK_ANIM_SLASH1)
  412.             set_task(SLASH1_TIME, "Do_Slashing", id+TASK_SET_DAMAGE)
  413.         } else if(g_Slashing_Mode[id] == 2) {
  414.             g_Attack_Mode[id] = ATTACK_SLASH2
  415.            
  416.             set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  417.            
  418.             g_Checking_Mode[id] = 1
  419.             ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  420.             g_Checking_Mode[id] = 0
  421.    
  422.             set_pev(id, pev_framerate, 1.0)
  423.             set_weapons_timeidle(id, CSW_DUALKATANA, SLASH_RESET_TIME)
  424.             set_player_nextattack(id, SLASH_RESET_TIME)
  425.            
  426.             set_weapon_anim(id, DK_ANIM_SLASH2)
  427.             set_task(SLASH2_TIME1, "Do_Slashing", id+TASK_SET_DAMAGE)
  428.             set_task(SLASH2_TIME2, "Do_Slashing", id+TASK_SET_DAMAGE)
  429.         } else if(g_Slashing_Mode[id] == 3) {
  430.             g_Attack_Mode[id] = ATTACK_SLASH3
  431.            
  432.             set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  433.            
  434.             g_Checking_Mode[id] = 1
  435.             ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  436.             g_Checking_Mode[id] = 0
  437.    
  438.             set_pev(id, pev_framerate, 1.0)
  439.             set_weapons_timeidle(id, CSW_DUALKATANA, SLASH_RESET_TIME)
  440.             set_player_nextattack(id, SLASH_RESET_TIME)
  441.            
  442.             set_weapon_anim(id, DK_ANIM_SLASH3)
  443.             set_task(SLASH2_TIME1, "Do_Slashing", id+TASK_SET_DAMAGE)
  444.             set_task(SLASH2_TIME2, "Do_Slashing", id+TASK_SET_DAMAGE)
  445.         }
  446.     } else if (CurButton & IN_ATTACK2) {
  447.         set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
  448.    
  449.         set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  450.    
  451.         g_Attack_Mode[id] = ATTACK_STAB
  452.         g_Checking_Mode[id] = 1
  453.         ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
  454.         g_Checking_Mode[id] = 0
  455.  
  456.         set_weapons_timeidle(id, CSW_DUALKATANA, STAB_TIME + 0.1)
  457.         set_player_nextattack(id, STAB_TIME + 0.1)
  458.        
  459.         set_weapon_anim(id, DK_ANIM_STAB)
  460.        
  461.         remove_task(id+TASK_SET_DAMAGE)
  462.         set_task(STAB_TIME, "Do_StabNow", id+TASK_SET_DAMAGE)
  463.     }
  464. }
  465.  
  466. public Do_Slashing(id)
  467. {
  468.     id -= TASK_SET_DAMAGE
  469.    
  470.     if (!is_user_alive(id))
  471.         return
  472.     if(get_user_weapon(id) != CSW_DUALKATANA)
  473.         return
  474.     if(!g_Had_DualKatana[id])
  475.         return 
  476.  
  477.     static Body, Target
  478.     get_user_aiming(id, Target, Body, SLASH_RADIUS)
  479.    
  480.     static Ent; Ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
  481.     if(!pev_valid(Ent)) Ent = 0
  482.    
  483.     if(is_user_alive(Target))
  484.     {
  485.         emit_sound(id, CHAN_WEAPON, DualKatana_Sound[random_num(1, 2)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  486.         do_attack(id, Target, Ent, float(SLASH_DAMAGE))
  487.     } else {
  488.         if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
  489.         else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[random_num(4, 6)], 1.0, ATTN_NORM, 0, PITCH_NORM)   
  490.     }
  491.    
  492.     set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  493. }
  494.  
  495. public Do_StabNow(id)
  496. {
  497.     id -= TASK_SET_DAMAGE
  498.    
  499.     if (!is_user_alive(id))
  500.         return
  501.     if(get_user_weapon(id) != CSW_DUALKATANA)
  502.         return
  503.     if(!g_Had_DualKatana[id])
  504.         return     
  505.        
  506.     set_weapons_timeidle(id, CSW_DUALKATANA, STAB_RESET_TIME)
  507.     set_player_nextattack(id, STAB_RESET_TIME) 
  508.  
  509.     if(Check_StabAttack(id))
  510.     {
  511.         emit_sound(id, CHAN_WEAPON, DualKatana_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
  512.     } else {
  513.         if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
  514.         else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[8], 1.0, ATTN_NORM, 0, PITCH_NORM)
  515.     }
  516.    
  517.     set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  518.  
  519.     g_Attack_Mode[id] = 0
  520.     g_Hit_Ing[id] = 0
  521. }
  522.  
  523. public Check_StabAttack(id)
  524. {
  525.     static Float:Max_Distance, Float:Point[4][3], Float:TB_Distance, Float:Point_Dis
  526.    
  527.     Point_Dis = float(STAB_POINT_DIS)
  528.     Max_Distance = float(STAB_RADIUS)
  529.     TB_Distance = Max_Distance / 4.0
  530.    
  531.     static Float:VicOrigin[3], Float:MyOrigin[3]
  532.     pev(id, pev_origin, MyOrigin)
  533.    
  534.     for(new i = 0; i < 4; i++)
  535.         get_position(id, TB_Distance * (i + 1), 0.0, 0.0, Point[i])
  536.        
  537.     static Have_Victim; Have_Victim = 0
  538.     static ent
  539.     ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
  540.        
  541.     if(!pev_valid(ent))
  542.         return 0
  543.        
  544.     for(new i = 0; i < get_maxplayers(); i++)
  545.     {
  546.         if(!is_user_alive(i))
  547.             continue
  548.         if(id == i)
  549.             continue
  550.         if(entity_range(id, i) > Max_Distance)
  551.             continue
  552.    
  553.         pev(i, pev_origin, VicOrigin)
  554.         if(is_wall_between_points(MyOrigin, VicOrigin, id))
  555.             continue
  556.            
  557.         if(get_distance_f(VicOrigin, Point[0]) <= Point_Dis
  558.         || get_distance_f(VicOrigin, Point[1]) <= Point_Dis
  559.         || get_distance_f(VicOrigin, Point[2]) <= Point_Dis
  560.         || get_distance_f(VicOrigin, Point[3]) <= Point_Dis)
  561.         {
  562.             if(!Have_Victim) Have_Victim = 1
  563.             do_attack(id, i, ent, float(STAB_DAMAGE))
  564.         }
  565.     }  
  566.    
  567.     if(Have_Victim)
  568.         return 1
  569.     else
  570.         return 0
  571.    
  572.     return 0
  573. }  
  574.  
  575. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  576. {
  577.     if(!is_user_connected(id))
  578.         return FMRES_IGNORED
  579.     if(get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  580.         return FMRES_IGNORED
  581.        
  582.     if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  583.     {
  584.         if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  585.         {
  586.             g_Hit_Ing[id] = HIT_NOTHING
  587.             return FMRES_SUPERCEDE
  588.         }
  589.         if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  590.         {
  591.             if (sample[17] == 'w') // wall
  592.             {
  593.                 g_Hit_Ing[id] = HIT_WALL
  594.                 return FMRES_SUPERCEDE
  595.             } else {
  596.                 g_Hit_Ing[id] = HIT_ENEMY
  597.                 return FMRES_SUPERCEDE
  598.             }
  599.         }
  600.         if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  601.             return FMRES_SUPERCEDE;
  602.     }
  603.    
  604.     return FMRES_IGNORED
  605. }
  606.  
  607. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  608. {
  609.     if (!is_user_alive(id))
  610.         return FMRES_IGNORED   
  611.     if (get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  612.         return FMRES_IGNORED
  613.    
  614.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  615.    
  616.     pev(id, pev_origin, fOrigin)
  617.     pev(id, pev_view_ofs, view_ofs)
  618.     xs_vec_add(fOrigin, view_ofs, vecStart)
  619.     pev(id, pev_v_angle, v_angle)
  620.    
  621.     engfunc(EngFunc_MakeVectors, v_angle)
  622.     get_global_vector(GL_v_forward, v_forward)
  623.  
  624.     if(g_Attack_Mode[id] == ATTACK_SLASH1 || g_Attack_Mode[id] == ATTACK_SLASH2 || g_Attack_Mode[id] == ATTACK_SLASH3)
  625.         xs_vec_mul_scalar(v_forward, float(SLASH_RADIUS), v_forward)
  626.     else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, float(STAB_RADIUS), v_forward)
  627.     else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  628.     xs_vec_add(vecStart, v_forward, vecEnd)
  629.    
  630.     engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  631.    
  632.     return FMRES_SUPERCEDE
  633. }
  634.  
  635. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  636. {
  637.     if (!is_user_alive(id))
  638.         return FMRES_IGNORED   
  639.     if (get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  640.         return FMRES_IGNORED
  641.    
  642.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  643.    
  644.     pev(id, pev_origin, fOrigin)
  645.     pev(id, pev_view_ofs, view_ofs)
  646.     xs_vec_add(fOrigin, view_ofs, vecStart)
  647.     pev(id, pev_v_angle, v_angle)
  648.    
  649.     engfunc(EngFunc_MakeVectors, v_angle)
  650.     get_global_vector(GL_v_forward, v_forward)
  651.    
  652.     if(g_Attack_Mode[id] == ATTACK_SLASH1 || g_Attack_Mode[id] == ATTACK_SLASH2 || g_Attack_Mode[id] == ATTACK_SLASH3)
  653.         xs_vec_mul_scalar(v_forward, float(SLASH_RADIUS), v_forward)
  654.     else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, float(STAB_RADIUS), v_forward)
  655.     else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  656.     xs_vec_add(vecStart, v_forward, vecEnd)
  657.    
  658.     engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  659.    
  660.     return FMRES_SUPERCEDE
  661. }
  662.  
  663. public fw_PlayerTraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceResult, DamageBits)
  664. {
  665.     if(!is_user_alive(Attacker))   
  666.         return HAM_IGNORED
  667.     if(!g_Had_DualKatana[Attacker] || !g_Checking_Mode[Attacker])
  668.         return HAM_IGNORED
  669.        
  670.     return HAM_SUPERCEDE
  671. }
  672.  
  673. public fw_Item_Deploy_Post(ent)
  674. {
  675.     static id; id = fm_cs_get_weapon_ent_owner(ent)
  676.     if (!pev_valid(id))
  677.         return
  678.  
  679.     if(!g_Had_DualKatana[id])
  680.         return
  681.        
  682.     set_pev(id, pev_viewmodel2, V_MODEL)
  683.     set_pev(id, pev_weaponmodel2, P_MODEL)
  684. }
  685.  
  686.  
  687. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  688. {
  689.     fake_player_trace_attack(Attacker, Victim, fDamage)
  690.     fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  691. }
  692.  
  693. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  694. {
  695.     // get fDirection
  696.     new Float:fAngles[3], Float:fDirection[3]
  697.     pev(iAttacker, pev_angles, fAngles)
  698.     angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  699.    
  700.     // get fStart
  701.     new Float:fStart[3], Float:fViewOfs[3]
  702.     pev(iAttacker, pev_origin, fStart)
  703.     pev(iAttacker, pev_view_ofs, fViewOfs)
  704.     xs_vec_add(fViewOfs, fStart, fStart)
  705.    
  706.     // get aimOrigin
  707.     new iAimOrigin[3], Float:fAimOrigin[3]
  708.     get_user_origin(iAttacker, iAimOrigin, 3)
  709.     IVecFVec(iAimOrigin, fAimOrigin)
  710.    
  711.     // TraceLine from fStart to AimOrigin
  712.     new ptr = create_tr2()
  713.     engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  714.     new pHit = get_tr2(ptr, TR_pHit)
  715.     new iHitgroup = get_tr2(ptr, TR_iHitgroup)
  716.     new Float:fEndPos[3]
  717.     get_tr2(ptr, TR_vecEndPos, fEndPos)
  718.  
  719.     // get target & body at aiming
  720.     new iTarget, iBody
  721.     get_user_aiming(iAttacker, iTarget, iBody)
  722.    
  723.     // if aiming find target is iVictim then update iHitgroup
  724.     if (iTarget == iVictim)
  725.     {
  726.         iHitgroup = iBody
  727.     }
  728.    
  729.     // if ptr find target not is iVictim
  730.     else if (pHit != iVictim)
  731.     {
  732.         // get AimOrigin in iVictim
  733.         new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  734.         pev(iVictim, pev_origin, fVicOrigin)
  735.         pev(iVictim, pev_view_ofs, fVicViewOfs)
  736.         xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  737.         fAimInVictim[2] = fStart[2]
  738.         fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  739.        
  740.         // check aim in size of iVictim
  741.         new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  742.         iAngleToVictim = abs(iAngleToVictim)
  743.         new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  744.         new Float:fVicSize[3]
  745.         pev(iVictim, pev_size , fVicSize)
  746.         if ( fDis <= fVicSize[0] * 0.5 )
  747.         {
  748.             // TraceLine from fStart to aimOrigin in iVictim
  749.             new ptr2 = create_tr2()
  750.             engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  751.             new pHit2 = get_tr2(ptr2, TR_pHit)
  752.             new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  753.            
  754.             // if ptr2 find target is iVictim
  755.             if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  756.             {
  757.                 pHit = iVictim
  758.                 iHitgroup = iHitgroup2
  759.                 get_tr2(ptr2, TR_vecEndPos, fEndPos)
  760.             }
  761.            
  762.             free_tr2(ptr2)
  763.         }
  764.        
  765.         // if pHit still not is iVictim then set default HitGroup
  766.         if (pHit != iVictim)
  767.         {
  768.             // set default iHitgroup
  769.             iHitgroup = HIT_GENERIC
  770.            
  771.             new ptr3 = create_tr2()
  772.             engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  773.             get_tr2(ptr3, TR_vecEndPos, fEndPos)
  774.            
  775.             // free ptr3
  776.             free_tr2(ptr3)
  777.         }
  778.     }
  779.    
  780.     // set new Hit & Hitgroup & EndPos
  781.     set_tr2(ptr, TR_pHit, iVictim)
  782.     set_tr2(ptr, TR_iHitgroup, iHitgroup)
  783.     set_tr2(ptr, TR_vecEndPos, fEndPos)
  784.    
  785.     // hitgroup multi fDamage
  786.     new Float:fMultifDamage
  787.     switch(iHitgroup)
  788.     {
  789.         case HIT_HEAD: fMultifDamage  = 4.0
  790.         case HIT_STOMACH: fMultifDamage  = 1.25
  791.         case HIT_LEFTLEG: fMultifDamage  = 0.75
  792.         case HIT_RIGHTLEG: fMultifDamage  = 0.75
  793.         default: fMultifDamage  = 1.0
  794.     }
  795.    
  796.     fDamage *= fMultifDamage
  797.    
  798.     // ExecuteHam
  799.     fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  800.    
  801.     // free ptr
  802.     free_tr2(ptr)
  803. }
  804.  
  805. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  806. {
  807.     ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  808. }
  809.  
  810. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  811. {
  812.     iInflictor = (!iInflictor) ? iAttacker : iInflictor
  813.     ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  814. }
  815.  
  816. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  817. {
  818.     new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  819.     pev(id, pev_origin, fOrigin)
  820.     get_user_origin(id, iAimOrigin, 3) // end position from eyes
  821.     IVecFVec(iAimOrigin, fAimOrigin)
  822.     xs_vec_sub(fAimOrigin, fOrigin, fV1)
  823.    
  824.     new Float:fV2[3]
  825.     xs_vec_sub(fTarget, fOrigin, fV2)
  826.    
  827.     new iResult = get_angle_between_vectors(fV1, fV2)
  828.    
  829.     if (TargetSize > 0.0)
  830.     {
  831.         new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  832.         new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  833.         iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  834.     }
  835.    
  836.     return iResult
  837. }
  838.  
  839. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  840. {
  841.     new Float:fA1[3], Float:fA2[3]
  842.     engfunc(EngFunc_VecToAngles, fV1, fA1)
  843.     engfunc(EngFunc_VecToAngles, fV2, fA2)
  844.    
  845.     new iResult = floatround(fA1[1] - fA2[1])
  846.     iResult = iResult % 360
  847.     iResult = (iResult > 180) ? (iResult - 360) : iResult
  848.    
  849.     return iResult
  850. }
  851.  
  852. stock fm_cs_get_weapon_ent_owner(ent)
  853. {
  854.     if (pev_valid(ent) != PDATA_SAFE)
  855.         return -1
  856.    
  857.     return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  858. }
  859.  
  860. stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
  861. {
  862.     if(!is_user_alive(id))
  863.         return
  864.        
  865.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  866.     if(!pev_valid(entwpn))
  867.         return
  868.        
  869.     set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
  870.     set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
  871.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
  872. }
  873.  
  874. stock set_weapon_anim(id, anim)
  875. {
  876.     if(!is_user_alive(id))
  877.         return
  878.        
  879.     set_pev(id, pev_weaponanim, anim)
  880.    
  881.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  882.     write_byte(anim)
  883.     write_byte(0)
  884.     message_end()  
  885. }
  886.  
  887. stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
  888. {
  889.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  890.    
  891.     pev(ent, pev_origin, vOrigin)
  892.     pev(ent, pev_view_ofs,vUp) //for player
  893.     xs_vec_add(vOrigin,vUp,vOrigin)
  894.     pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  895.    
  896.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  897.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  898.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  899.    
  900.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  901.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  902.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  903. }
  904.  
  905. stock set_player_nextattack(id, Float:nexttime)
  906. {
  907.     if(!is_user_alive(id))
  908.         return
  909.        
  910.     set_pdata_float(id, m_flNextAttack, nexttime, 5)
  911. }
  912.  
  913. stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
  914. {
  915.     static ptr
  916.     ptr = create_tr2()
  917.  
  918.     engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
  919.    
  920.     static Float:EndPos[3]
  921.     get_tr2(ptr, TR_vecEndPos, EndPos)
  922.  
  923.     free_tr2(ptr)
  924.     return floatround(get_distance_f(end, EndPos))
  925. }
  926.  
  927.  
  928. public del_hook(id)
  929. {
  930.     if (!canThrowHook[id])
  931.         remove_hook(id)
  932.    
  933.     return PLUGIN_HANDLED
  934. }
  935.  
  936. public round_bstart()
  937. {
  938.     for (new i = 1; i <= gMaxPlayers; i++)
  939.     {
  940.         if (is_user_connected(i))
  941.         {
  942.             if(!canThrowHook[i])
  943.                 remove_hook(i)
  944.         }
  945.     }
  946. }
  947.  
  948. public Restart()
  949. {
  950.     for (new id = 0; id < gMaxPlayers; id++)
  951.     {
  952.         if (is_user_connected(id))
  953.             gRestart[id] = true
  954.     }
  955. }
  956.  
  957. public Update(id)
  958. {
  959.     if (!gUpdate[id])
  960.         gUpdate[id] = true
  961.    
  962.     return PLUGIN_CONTINUE
  963. }
  964.  
  965. public ResetHUD(id)
  966. {
  967.     if (gRestart[id])
  968.     {
  969.         gRestart[id] = false
  970.         return
  971.     }
  972.     if (gUpdate[id])
  973.     {
  974.         gUpdate[id] = false
  975.         return
  976.     }
  977.     if (gHooked[id])
  978.     {
  979.         remove_hook(id)
  980.     }
  981. }
  982.  
  983. public fwTouch(ptr, ptd)
  984. {
  985.     if (!pev_valid(ptr))
  986.         return FMRES_IGNORED
  987.    
  988.     new id = pev(ptr, pev_owner)
  989.    
  990.     // Get classname
  991.     static szPtrClass[32]  
  992.     pev(ptr, pev_classname, szPtrClass, charsmax(szPtrClass))
  993.    
  994.     if (equali(szPtrClass, "Hook"))
  995.     {      
  996.         static Float:fOrigin[3]
  997.         pev(ptr, pev_origin, fOrigin)
  998.        
  999.         if (pev_valid(ptd))
  1000.         {
  1001.             static szPtdClass[32]
  1002.             pev(ptd, pev_classname, szPtdClass, charsmax(szPtdClass))
  1003.                        
  1004.             if (!get_pcvar_num(pPlayers) && /*equali(szPtdClass, "player")*/ is_user_alive(ptd))
  1005.             {
  1006.                 // Hit a player
  1007.                 if (get_pcvar_num(pSound))
  1008.                     emit_sound(ptr, CHAN_STATIC, "weapons/gas.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  1009.                 remove_hook(id)
  1010.                
  1011.                 return FMRES_HANDLED
  1012.             }
  1013.             else if (equali(szPtdClass, "hostage_entity"))
  1014.             {
  1015.                 // Makes an hostage follow
  1016.                 if (get_pcvar_num(pHostage) && get_user_team(id) == 2)
  1017.                 {                  
  1018.                     //cs_set_hostage_foll(ptd, (cs_get_hostage_foll(ptd) == id) ? 0 : id)
  1019.                     // With the use function we have the sounds!
  1020.                     dllfunc(DLLFunc_Use, ptd, id)
  1021.                 }
  1022.                 if (!get_pcvar_num(pPlayers))
  1023.                 {
  1024.                     if(get_pcvar_num(pSound))
  1025.                         emit_sound(ptr, CHAN_STATIC, "weapons/gas.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  1026.                     remove_hook(id)
  1027.                 }
  1028.                 return FMRES_HANDLED
  1029.             }
  1030.             else if (get_pcvar_num(pOpenDoors) && equali(szPtdClass, "func_door") || equali(szPtdClass, "func_door_rotating"))
  1031.             {
  1032.                 // Open doors
  1033.                 // Double doors tested in de_nuke and de_wallmart
  1034.                 static szTargetName[32]
  1035.                 pev(ptd, pev_targetname, szTargetName, charsmax(szTargetName))
  1036.                 if (strlen(szTargetName) > 0)
  1037.                 {  
  1038.                     static ent
  1039.                     while ((ent = engfunc(EngFunc_FindEntityByString, ent, "target", szTargetName)) > 0)
  1040.                     {
  1041.                         static szEntClass[32]
  1042.                         pev(ent, pev_classname, szEntClass, charsmax(szEntClass))
  1043.                        
  1044.                         if (equali(szEntClass, "trigger_multiple"))
  1045.                         {
  1046.                             dllfunc(DLLFunc_Touch, ent, id)
  1047.                             goto stopdoors // No need to touch anymore
  1048.                         }
  1049.                     }
  1050.                 }
  1051.                
  1052.                 // No double doors.. just touch it
  1053.                 dllfunc(DLLFunc_Touch, ptd, id)
  1054. stopdoors:             
  1055.             }
  1056.             else if (get_pcvar_num(pUseButtons) && equali(szPtdClass, "func_button"))
  1057.             {
  1058.                 if (pev(ptd, pev_spawnflags) & SF_BUTTON_TOUCH_ONLY)
  1059.                     dllfunc(DLLFunc_Touch, ptd, id) // Touch only
  1060.                 else           
  1061.                     dllfunc(DLLFunc_Use, ptd, id) // Use Buttons           
  1062.             }
  1063.         }
  1064.        
  1065.         // If cvar sv_hooksky is 0 and hook is in the sky remove it!
  1066.         new iContents = engfunc(EngFunc_PointContents, fOrigin)
  1067.         if (!get_pcvar_num(pHookSky) && iContents == CONTENTS_SKY)
  1068.         {
  1069.             if(get_pcvar_num(pSound))
  1070.                 emit_sound(ptr, CHAN_STATIC, "weapons/gas.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  1071.             remove_hook(id)
  1072.             return FMRES_HANDLED
  1073.         }
  1074.        
  1075.         // Pick up weapons..
  1076.         if (get_pcvar_num(pWeapons))
  1077.         {
  1078.             static ent
  1079.             while ((ent = engfunc(EngFunc_FindEntityInSphere, ent, fOrigin, 15.0)) > 0)
  1080.             {
  1081.                 static szentClass[32]
  1082.                 pev(ent, pev_classname, szentClass, charsmax(szentClass))
  1083.                
  1084.                 if (equali(szentClass, "weaponbox") || equali(szentClass, "armoury_entity"))
  1085.                     dllfunc(DLLFunc_Touch, ent, id)
  1086.             }
  1087.         }
  1088.        
  1089.         // Player is now hooked
  1090.         gHooked[id] = true
  1091.         // Play sound
  1092.         if (get_pcvar_num(pSound))
  1093.             emit_sound(ptr, CHAN_STATIC, "weapons/gas.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  1094.        
  1095.         // Make some sparks :D
  1096.         message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY, fOrigin, 0)
  1097.         write_byte(9) // TE_SPARKS
  1098.         write_coord_f(fOrigin[0]) // Origin
  1099.         write_coord_f(fOrigin[1])
  1100.         write_coord_f(fOrigin[2])
  1101.         message_end()      
  1102.        
  1103.         // Stop the hook from moving
  1104.         set_pev(ptr, pev_velocity, Float:{0.0, 0.0, 0.0})
  1105.         set_pev(ptr, pev_movetype, MOVETYPE_NONE)
  1106.        
  1107.         //Task
  1108.         if (!task_exists(id + 856))
  1109.         {
  1110.             static TaskData[2]
  1111.             TaskData[0] = id
  1112.             TaskData[1] = ptr
  1113.             gotohook(TaskData)
  1114.            
  1115.             set_task(0.1, "gotohook", id + 856, TaskData, 2, "b")
  1116.         }
  1117.     }
  1118.     return FMRES_HANDLED
  1119. }
  1120.  
  1121. public hookthink(param[])
  1122. {
  1123.     new id = param[0]
  1124.     new HookEnt = param[1]
  1125.    
  1126.     if (!is_user_alive(id) || !pev_valid(HookEnt) || !pev_valid(id))
  1127.     {
  1128.         remove_task(id + 890)
  1129.         return PLUGIN_HANDLED
  1130.     }
  1131.    
  1132.    
  1133.     static Float:entOrigin[3]
  1134.     pev(HookEnt, pev_origin, entOrigin)
  1135.    
  1136.     // If user is behind a box or something.. remove it
  1137.     // only works if sv_interrupt 1 or higher is
  1138.     if (get_pcvar_num(pInterrupt))
  1139.     {
  1140.         static Float:usrOrigin[3]
  1141.         pev(id, pev_origin, usrOrigin)
  1142.        
  1143.         static tr
  1144.         engfunc(EngFunc_TraceLine, usrOrigin, entOrigin, 1, -1, tr)
  1145.        
  1146.         static Float:fFraction
  1147.         get_tr2(tr, TR_flFraction, fFraction)
  1148.        
  1149.         if (fFraction != 1.0)
  1150.             remove_hook(id)
  1151.     }
  1152.    
  1153.     // If cvar sv_hooksky is 0 and hook is in the sky remove it!
  1154.     new iContents = engfunc(EngFunc_PointContents, entOrigin)
  1155.     if (!get_pcvar_num(pHookSky) && iContents == CONTENTS_SKY)
  1156.     {
  1157.         if(get_pcvar_num(pSound))
  1158.             emit_sound(HookEnt, CHAN_STATIC, "weapons/gas.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  1159.         remove_hook(id)
  1160.     }
  1161.    
  1162.     return PLUGIN_HANDLED
  1163. }
  1164.  
  1165. public gotohook(param[])
  1166. {
  1167.     new id = param[0]
  1168.     new HookEnt = param[1]
  1169.  
  1170.     if (!is_user_alive(id) || !pev_valid(HookEnt) || !pev_valid(id))
  1171.     {
  1172.         remove_task(id + 856)
  1173.         return PLUGIN_HANDLED
  1174.     }
  1175.     // If the round isnt started velocity is just 0
  1176.     static Float:fVelocity[3]
  1177.     fVelocity = Float:{0.0, 0.0, 1.0}
  1178.    
  1179.     // If the round is started and player is hooked we can set the user velocity!
  1180.     if (gHooked[id])
  1181.     {
  1182.         static Float:fHookOrigin[3], Float:fUsrOrigin[3], Float:fDist
  1183.         pev(HookEnt, pev_origin, fHookOrigin)
  1184.         pev(id, pev_origin, fUsrOrigin)
  1185.        
  1186.         fDist = vector_distance(fHookOrigin, fUsrOrigin)
  1187.        
  1188.         if (fDist >= 30.0)
  1189.         {
  1190.             new Float:fSpeed = get_pcvar_float(pSpeed)
  1191.            
  1192.             fSpeed *= 0.52
  1193.            
  1194.             fVelocity[0] = (fHookOrigin[0] - fUsrOrigin[0]) * (2.0 * fSpeed) / fDist
  1195.             fVelocity[1] = (fHookOrigin[1] - fUsrOrigin[1]) * (2.0 * fSpeed) / fDist
  1196.             fVelocity[2] = (fHookOrigin[2] - fUsrOrigin[2]) * (2.0 * fSpeed) / fDist
  1197.         }
  1198.     }
  1199.     // Set the velocity
  1200.     set_pev(id, pev_velocity, fVelocity)
  1201.    
  1202.     return PLUGIN_HANDLED
  1203. }
  1204.        
  1205. public throw_hook(id)
  1206. {
  1207.     // Get origin and angle for the hook
  1208.     static Float:fOrigin[3], Float:fAngle[3],Float:fvAngle[3]
  1209.     static Float:fStart[3]
  1210.     pev(id, pev_origin, fOrigin)
  1211.    
  1212.     pev(id, pev_angles, fAngle)
  1213.     pev(id, pev_v_angle, fvAngle)
  1214.    
  1215.     if (get_pcvar_num(pInstant))
  1216.     {
  1217.         get_user_hitpoint(id, fStart)
  1218.        
  1219.         if (engfunc(EngFunc_PointContents, fStart) != CONTENTS_SKY)
  1220.         {
  1221.             static Float:fSize[3]
  1222.             pev(id, pev_size, fSize)
  1223.            
  1224.             fOrigin[0] = fStart[0] + floatcos(fvAngle[1], degrees) * (-10.0 + fSize[0])
  1225.             fOrigin[1] = fStart[1] + floatsin(fvAngle[1], degrees) * (-10.0 + fSize[1])
  1226.             fOrigin[2] = fStart[2]
  1227.         }
  1228.         else
  1229.             xs_vec_copy(fStart, fOrigin)
  1230.     }
  1231.  
  1232.    
  1233.     // Make the hook!
  1234.     Hook[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  1235.        
  1236.     if (Hook[id])
  1237.     {
  1238.         // Player cant throw hook now
  1239.         canThrowHook[id] = false
  1240.        
  1241.         static const Float:fMins[3] = {-2.840000, -14.180000, -2.840000}
  1242.         static const Float:fMaxs[3] = {2.840000, 0.020000, 2.840000}
  1243.        
  1244.         //Set some Data
  1245.         set_pev(Hook[id], pev_classname, "Hook")
  1246.        
  1247.         engfunc(EngFunc_SetModel, Hook[id], "models/rpgrocket.mdl")
  1248.         engfunc(EngFunc_SetOrigin, Hook[id], fOrigin)
  1249.         engfunc(EngFunc_SetSize, Hook[id], fMins, fMaxs)       
  1250.        
  1251.         //set_pev(Hook[id], pev_mins, fMins)
  1252.         //set_pev(Hook[id], pev_maxs, fMaxs)
  1253.        
  1254.         set_pev(Hook[id], pev_angles, fAngle)
  1255.        
  1256.         set_pev(Hook[id], pev_solid, 2)
  1257.         set_pev(Hook[id], pev_movetype, 5)
  1258.         set_pev(Hook[id], pev_owner, id)
  1259.        
  1260.         //Set hook velocity
  1261.         static Float:fForward[3], Float:Velocity[3]
  1262.         new Float:fSpeed = get_pcvar_float(pThrowSpeed)
  1263.        
  1264.         engfunc(EngFunc_MakeVectors, fvAngle)
  1265.         global_get(glb_v_forward, fForward)
  1266.        
  1267.         Velocity[0] = fForward[0] * fSpeed
  1268.         Velocity[1] = fForward[1] * fSpeed
  1269.         Velocity[2] = fForward[2] * fSpeed
  1270.        
  1271.         set_pev(Hook[id], pev_velocity, Velocity)
  1272.  
  1273.         // Make the line between Hook and Player
  1274.         message_begin_f(MSG_BROADCAST, SVC_TEMPENTITY, Float:{0.0, 0.0, 0.0}, 0)
  1275.         if (get_pcvar_num(pInstant))
  1276.         {
  1277.             write_byte(1) // TE_BEAMPOINT
  1278.             write_short(id) // Startent
  1279.             write_coord_f(fStart[0]) // End pos
  1280.             write_coord_f(fStart[1])
  1281.             write_coord_f(fStart[2])
  1282.         }
  1283.         else
  1284.         {
  1285.             write_byte(8) // TE_BEAMENTS
  1286.             write_short(id) // Start Ent
  1287.             write_short(Hook[id]) // End Ent
  1288.         }
  1289.         write_short(sprBeam) // Sprite
  1290.         write_byte(1) // StartFrame
  1291.         write_byte(1) // FrameRate
  1292.         write_byte(600) // Life
  1293.         write_byte(get_pcvar_num(pWidth)) // Width
  1294.         write_byte(get_pcvar_num(pHookNoise)) // Noise
  1295.         // Colors now
  1296.         if (get_pcvar_num(pColor))
  1297.         {
  1298.             if (get_user_team(id) == 1) // Terrorist
  1299.             {
  1300.                 write_byte(255) // R
  1301.                 write_byte(255) // G
  1302.                 write_byte(255) // B
  1303.             }
  1304.             #if defined _cstrike_included
  1305.             else if(cs_get_user_vip(id)) // vip for cstrike
  1306.             {
  1307.                 write_byte(255) // R
  1308.                 write_byte(255) // G
  1309.                 write_byte(255) // B
  1310.             }
  1311.             #endif // _cstrike_included
  1312.             else if(get_user_team(id) == 2) // CT
  1313.             {
  1314.                 write_byte(255) // R
  1315.                 write_byte(255) // G
  1316.                 write_byte(255) // B
  1317.             }
  1318.             else
  1319.             {
  1320.                 write_byte(255) // R
  1321.                 write_byte(255) // G
  1322.                 write_byte(255) // B
  1323.             }
  1324.         }
  1325.         else
  1326.         {
  1327.             write_byte(255) // R
  1328.             write_byte(255) // G
  1329.             write_byte(255) // B
  1330.         }
  1331.         write_byte(192) // Brightness
  1332.         write_byte(0) // Scroll speed
  1333.         message_end()
  1334.        
  1335.         if (get_pcvar_num(pSound) && !get_pcvar_num(pInstant))
  1336.             emit_sound(id, CHAN_BODY, "weapons/gas.wav", VOL_NORM, ATTN_NORM, 0, PITCH_HIGH)
  1337.        
  1338.         static TaskData[2]
  1339.         TaskData[0] = id
  1340.         TaskData[1] = Hook[id]
  1341.        
  1342.         set_task(0.1, "hookthink", id + 890, TaskData, 2, "b")
  1343.     }
  1344.     else
  1345.         client_print(id, print_chat, "Can't create hook")
  1346. }
  1347.  
  1348. public remove_hook(id)
  1349. {
  1350.     //Player can now throw hooks
  1351.     canThrowHook[id] = true
  1352.    
  1353.     // Remove the hook if it is valid
  1354.     if (pev_valid(Hook[id]))
  1355.         engfunc(EngFunc_RemoveEntity, Hook[id])
  1356.     Hook[id] = 0
  1357.    
  1358.     // Remove the line between user and hook
  1359.     if (is_user_connected(id))
  1360.     {
  1361.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY, {0,0,0}, id)
  1362.         write_byte(99) // TE_KILLBEAM
  1363.         write_short(id) // entity
  1364.         message_end()
  1365.     }
  1366.    
  1367.     // Player is not hooked anymore
  1368.     gHooked[id] = false
  1369.     return 1
  1370. }
  1371.  
  1372. // Stock by Chaosphere
  1373. stock get_user_hitpoint(id, Float:hOrigin[3])
  1374. {
  1375.     if (!is_user_alive(id))
  1376.         return 0
  1377.    
  1378.     static Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3]
  1379.     static Float:fTemp[3]
  1380.    
  1381.     pev(id, pev_origin, fOrigin)
  1382.     pev(id, pev_v_angle, fvAngle)
  1383.     pev(id, pev_view_ofs, fvOffset)
  1384.    
  1385.     xs_vec_add(fOrigin, fvOffset, fvOrigin)
  1386.    
  1387.     engfunc(EngFunc_AngleVectors, fvAngle, feOrigin, fTemp, fTemp)
  1388.    
  1389.     xs_vec_mul_scalar(feOrigin, 8192.0, feOrigin)
  1390.     xs_vec_add(fvOrigin, feOrigin, feOrigin)
  1391.    
  1392.     static tr
  1393.     engfunc(EngFunc_TraceLine, fvOrigin, feOrigin, 0, id, tr)
  1394.     get_tr2(tr, TR_vecEndPos, hOrigin)
  1395.     //global_get(glb_trace_endpos, hOrigin)
  1396.    
  1397.     return 1
  1398. }
  1399.  
  1400. stock statusMsg(id, szMsg[], {Float,_}:...)
  1401. {
  1402.     static iStatusText
  1403.     if (!iStatusText)
  1404.         iStatusText = get_user_msgid("StatusText")
  1405.    
  1406.     static szBuffer[512]
  1407.     vformat(szBuffer, charsmax(szBuffer), szMsg, 3)
  1408.    
  1409.     message_begin((id == 0) ? MSG_ALL : MSG_ONE, iStatusText, _, id)
  1410.     write_byte(0) // Unknown
  1411.     write_string(szBuffer) // Message
  1412.     message_end()
  1413.    
  1414.     return 1
  1415. }
Add Comment
Please, Sign In to add comment