MasamuneDate

Ethereal Blade

Apr 22nd, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 23.00 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <engine>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <hamsandwich>
  6. #include <cstrike>
  7. #include <codmod>
  8. #include <xs>
  9. #include <fun>
  10.  
  11. #define PLUGIN "Dual Katana & Klasa Ninja"
  12. #define VERSION "1.0"
  13. #define AUTHOR "Dias"
  14.  
  15. #define V_MODEL "models/v_katanad.mdl"
  16. #define P_MODEL "models/p_katanad.mdl"
  17.  
  18. #define CSW_DUALKATANA CSW_KNIFE
  19. #define weapon_dualkatana "weapon_knife"
  20. #define WEAPON_ANIMEXT "dualpistols_1"
  21. #define WEAPON_ANIMEXT2 "knife"
  22.  
  23. #define OFFSET_PRIMARYWEAPON 116
  24.  
  25. #define DRAW_TIME 1.0
  26.  
  27. #define SLASH_DAMAGE (40+(cod_get_user_intelligence(id, 1, 1,1))*1)
  28. #define SLASH_RADIUS 100
  29. #define SLASH_RESET_TIME 1.0
  30. #define SLASH1_TIME 0.25
  31. #define SLASH2_TIME1 0.25
  32. #define SLASH2_TIME2 0.5
  33. #define SLASH_RESET_TIME 1.0
  34.  
  35. #define STAB_DAMAGE (80+(cod_get_user_intelligence(id, 1, 1,1))*1)
  36. #define STAB_RADIUS 120
  37. #define STAB_POINT_DIS 48
  38. #define STAB_TIME 0.5
  39. #define STAB_RESET_TIME 1.0
  40.  
  41. #define TASK_SET_DAMAGE 1955+10
  42. #define TASK_RESET_DAMAGE 1955+20
  43.  
  44. // OFFSET
  45. const PDATA_SAFE = 2
  46. const OFFSET_LINUX_WEAPONS = 4
  47. const OFFSET_WEAPONOWNER = 41
  48. const m_flNextAttack = 83
  49. const m_szAnimExtention = 492
  50.  
  51. new const DualKatana_Sound[9][] =
  52. {
  53.     "weapons/katanad_draw.wav",
  54.     "weapons/katanad_hit1.wav",
  55.     "weapons/katanad_hit2.wav",
  56.     "weapons/katanad_hitwall.wav",
  57.     "weapons/katanad_slash1.wav",
  58.     "weapons/katanad_slash2.wav",
  59.     "weapons/katanad_slash3.wav",
  60.     "weapons/katanad_stab.wav",
  61.     "weapons/katanad_stab_miss.wav"
  62. }
  63.  
  64. enum
  65. {
  66.     ATTACK_SLASH1 = 1,
  67.     ATTACK_SLASH2,
  68.     ATTACK_SLASH3,
  69.     ATTACK_STAB
  70. }
  71.  
  72. enum
  73. {
  74.     DK_ANIM_IDLE = 0,
  75.     DK_ANIM_FSLASH1,
  76.     DK_ANIM_FSLASH2,
  77.     DK_ANIM_DRAW,
  78.     DK_ANIM_STAB,
  79.     DK_ANIM_STAB_MISS,
  80.     DK_ANIM_SLASH1,
  81.     DK_ANIM_SLASH2,
  82.     DK_ANIM_SLASH3
  83. }
  84.  
  85. enum
  86. {
  87.     HIT_NOTHING = 0,
  88.     HIT_ENEMY,
  89.     HIT_WALL
  90. }
  91.  
  92. new g_Had_DualKatana[33], g_Slashing_Mode[33], g_Attack_Mode[33], g_Checking_Mode[33], g_Hit_Ing[33]
  93. new g_Old_Weapon[33], g_Ham_Bot, grawitacja, niewidzialnosc
  94.  
  95. new const nazwa[] = "Ethereal Blade";
  96. new const opis[] = "Gets the dual-katana LPM (40DMG + int) / PPM (80DMG + int). It is invisible and very fast.";
  97. new const bronie = 1<<CSW_KNIFE;
  98. new const zdrowie = 0;
  99. new const kondycja = 120;
  100. new const inteligencja = 50;
  101. new const wytrzymalosc = 0;
  102.  
  103. new bool:ma_klase[33];
  104.  
  105. public plugin_init()
  106. {
  107.     register_plugin(PLUGIN, VERSION, AUTHOR)
  108.    
  109.     cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
  110.    
  111.     register_event("DeathMsg", "Event_Death", "a")
  112.     register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  113.     register_event("ResetHUD", "ResetHUD", "abe");  
  114.    
  115.     register_forward(FM_EmitSound, "fw_EmitSound")
  116.     register_forward(FM_CmdStart, "fw_CmdStart")
  117.     register_forward(FM_TraceLine, "fw_TraceLine")
  118.     register_forward(FM_TraceHull, "fw_TraceHull")     
  119.    
  120.     RegisterHam(Ham_TraceAttack, "player", "fw_PlayerTraceAttack")
  121.     RegisterHam(Ham_Item_Deploy, weapon_dualkatana, "fw_Item_Deploy_Post", 1)
  122.     RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1)
  123.    
  124.     grawitacja = register_cvar("s_grawitacja", "300.0")
  125.     niewidzialnosc = register_cvar("s_niewidzialnosc", "88") // 0 - 255
  126. }
  127.  
  128. public plugin_precache()
  129. {
  130.     engfunc(EngFunc_PrecacheModel, V_MODEL)
  131.     engfunc(EngFunc_PrecacheModel, P_MODEL)
  132.    
  133.     for(new i = 0; i < sizeof(DualKatana_Sound); i++)
  134.         engfunc(EngFunc_PrecacheSound, DualKatana_Sound[i])
  135. }
  136.  
  137. public cod_class_enabled(id)
  138. {
  139.             g_Had_DualKatana[id] = 1
  140.             g_Slashing_Mode[id] = 0
  141.             g_Attack_Mode[id] = 0
  142.             g_Checking_Mode[id] = 0
  143.             g_Hit_Ing[id] = 0      
  144.                  
  145.             g_Had_DualKatana[id] = 1
  146.             ma_klase[id] = true
  147.             fm_give_item(id, weapon_dualkatana)
  148.            
  149.             set_user_gravity(id, get_pcvar_float(grawitacja) /800.0);
  150.             set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, get_pcvar_num(niewidzialnosc));
  151.            
  152.             if(get_user_weapon(id) == CSW_KNIFE)
  153.             {
  154.                   set_pev(id, pev_viewmodel2, V_MODEL)
  155.                   set_pev(id, pev_weaponmodel2, P_MODEL)   
  156.                  
  157.                   set_weapon_anim(id, DK_ANIM_DRAW)
  158.                   set_player_nextattack(id, DRAW_TIME)
  159.             } else {
  160.                   engclient_cmd(id, weapon_dualkatana)
  161.             }
  162.            
  163.             if(get_user_weapon(id) != CSW_KNIFE)
  164.             {
  165.                   strip_user_weapons(id)
  166.                   set_pdata_int(id, OFFSET_PRIMARYWEAPON, 0)
  167.                   fm_give_item(id, weapon_dualkatana)
  168.             }
  169. }
  170.  
  171. public cod_class_disabled(id)
  172. {
  173.     g_Had_DualKatana[id] = 0
  174.     g_Slashing_Mode[id] = 0
  175.     g_Attack_Mode[id] = 0
  176.     g_Checking_Mode[id] = 0
  177.     g_Hit_Ing[id] = 0
  178.     ma_klase[id] = false
  179.    
  180.     set_user_gravity(id, 1.0);
  181.     set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255);
  182. }  
  183.  
  184. public remove_dualkatana(id)
  185. {  
  186.     g_Had_DualKatana[id] = 0
  187.     g_Slashing_Mode[id] = 0
  188.     g_Attack_Mode[id] = 0
  189.     g_Checking_Mode[id] = 0
  190.     g_Hit_Ing[id] = 0  
  191. }
  192.  
  193. public Odrodzenie(id)
  194. {
  195.     if(ma_klase[id])
  196.     {  
  197.         set_user_gravity(id, 300.0/800.0);
  198.         set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 5);
  199.            
  200.         strip_user_weapons(id)
  201.         set_pdata_int(id, OFFSET_PRIMARYWEAPON, 0)
  202.         fm_give_item(id, weapon_dualkatana)
  203.     }
  204. }
  205.  
  206. public client_putinserver(id)
  207. {
  208.     if(!g_Ham_Bot && is_user_bot(id))
  209.     {
  210.         g_Ham_Bot = 1
  211.         set_task(0.1, "Do_RegisterHam_Bot", id)
  212.     }
  213. }
  214.  
  215. public Do_RegisterHam_Bot(id)
  216. {
  217.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_PlayerTraceAttack")
  218. }
  219.  
  220. public Event_Death()
  221. {
  222.     static Victim; Victim = read_data(2)
  223.     remove_dualkatana(Victim)
  224. }
  225.  
  226. public Event_CurWeapon(id)
  227. {
  228.     if(!is_user_alive(id))
  229.         return
  230.        
  231.     if(!g_Had_DualKatana[id])
  232.         return
  233.        
  234.     if(get_user_weapon(id) == CSW_DUALKATANA && g_Old_Weapon[id] != CSW_DUALKATANA)
  235.     {
  236.         set_weapon_anim(id, DK_ANIM_DRAW)
  237.         set_player_nextattack(id, DRAW_TIME)
  238.        
  239.         set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  240.     }
  241.        
  242.     g_Old_Weapon[id] = get_user_weapon(id)
  243. }
  244.  
  245.  
  246. public fw_CmdStart(id, uc_handle, seed)
  247. {
  248.     if (!is_user_alive(id))
  249.         return
  250.        
  251.     if(get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  252.         return
  253.    
  254.     static ent; ent = fm_get_user_weapon_entity(id, CSW_DUALKATANA)
  255.    
  256.     if(!pev_valid(ent))
  257.         return
  258.     if(get_pdata_float(ent, 46, OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0)
  259.         return
  260.    
  261.     static CurButton
  262.     CurButton = get_uc(uc_handle, UC_Buttons)
  263.    
  264.     if (CurButton & IN_ATTACK)
  265.     {
  266.         set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
  267.        
  268.         if(g_Slashing_Mode[id] == 0) g_Slashing_Mode[id] = 1
  269.        
  270.         g_Slashing_Mode[id]++
  271.         if(g_Slashing_Mode[id] > ATTACK_SLASH3) g_Slashing_Mode[id] = 1
  272.        
  273.         if(g_Slashing_Mode[id] == 1)
  274.         {
  275.             g_Attack_Mode[id] = ATTACK_SLASH1
  276.            
  277.             set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  278.            
  279.             g_Checking_Mode[id] = 1
  280.             ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  281.             g_Checking_Mode[id] = 0
  282.    
  283.             set_pev(id, pev_framerate, 0.75)
  284.             set_weapons_timeidle(id, CSW_DUALKATANA, SLASH_RESET_TIME)
  285.             set_player_nextattack(id, SLASH_RESET_TIME)
  286.            
  287.             set_weapon_anim(id, DK_ANIM_SLASH1)
  288.             set_task(SLASH1_TIME, "Do_Slashing", id+TASK_SET_DAMAGE)
  289.         } else if(g_Slashing_Mode[id] == 2) {
  290.             g_Attack_Mode[id] = ATTACK_SLASH2
  291.            
  292.             set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  293.            
  294.             g_Checking_Mode[id] = 1
  295.             ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  296.             g_Checking_Mode[id] = 0
  297.    
  298.             set_pev(id, pev_framerate, 1.0)
  299.             set_weapons_timeidle(id, CSW_DUALKATANA, SLASH_RESET_TIME)
  300.             set_player_nextattack(id, SLASH_RESET_TIME)
  301.            
  302.             set_weapon_anim(id, DK_ANIM_SLASH2)
  303.             set_task(SLASH2_TIME1, "Do_Slashing", id+TASK_SET_DAMAGE)
  304.             set_task(SLASH2_TIME2, "Do_Slashing", id+TASK_SET_DAMAGE)
  305.         } else if(g_Slashing_Mode[id] == 3) {
  306.             g_Attack_Mode[id] = ATTACK_SLASH3
  307.            
  308.             set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  309.            
  310.             g_Checking_Mode[id] = 1
  311.             ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
  312.             g_Checking_Mode[id] = 0
  313.    
  314.             set_pev(id, pev_framerate, 1.0)
  315.             set_weapons_timeidle(id, CSW_DUALKATANA, SLASH_RESET_TIME)
  316.             set_player_nextattack(id, SLASH_RESET_TIME)
  317.            
  318.             set_weapon_anim(id, DK_ANIM_SLASH3)
  319.             set_task(SLASH2_TIME1, "Do_Slashing", id+TASK_SET_DAMAGE)
  320.             set_task(SLASH2_TIME2, "Do_Slashing", id+TASK_SET_DAMAGE)
  321.         }
  322.     } else if (CurButton & IN_ATTACK2) {
  323.         set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
  324.    
  325.         set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT2, -1 , 20)
  326.    
  327.         g_Attack_Mode[id] = ATTACK_STAB
  328.         g_Checking_Mode[id] = 1
  329.         ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
  330.         g_Checking_Mode[id] = 0
  331.  
  332.         set_weapons_timeidle(id, CSW_DUALKATANA, STAB_TIME + 0.1)
  333.         set_player_nextattack(id, STAB_TIME + 0.1)
  334.        
  335.         set_weapon_anim(id, DK_ANIM_STAB)
  336.        
  337.         remove_task(id+TASK_SET_DAMAGE)
  338.         set_task(STAB_TIME, "Do_StabNow", id+TASK_SET_DAMAGE)
  339.     }
  340. }
  341.  
  342. public Do_Slashing(id)
  343. {
  344.     id -= TASK_SET_DAMAGE
  345.    
  346.     if (!is_user_alive(id))
  347.         return
  348.     if(get_user_weapon(id) != CSW_DUALKATANA)
  349.         return
  350.     if(!g_Had_DualKatana[id])
  351.         return 
  352.  
  353.     static Body, Target
  354.     get_user_aiming(id, Target, Body, SLASH_RADIUS)
  355.    
  356.     static Ent; Ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
  357.     if(!pev_valid(Ent)) Ent = 0
  358.    
  359.     if(is_user_alive(Target))
  360.     {
  361.         emit_sound(id, CHAN_WEAPON, DualKatana_Sound[random_num(1, 2)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  362.         do_attack(id, Target, Ent, float(SLASH_DAMAGE))
  363.     } else {
  364.         if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
  365.         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)   
  366.     }
  367.    
  368.     set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  369. }
  370.  
  371. public Do_StabNow(id)
  372. {
  373.     id -= TASK_SET_DAMAGE
  374.    
  375.     if (!is_user_alive(id))
  376.         return
  377.     if(get_user_weapon(id) != CSW_DUALKATANA)
  378.         return
  379.     if(!g_Had_DualKatana[id])
  380.         return     
  381.        
  382.     set_weapons_timeidle(id, CSW_DUALKATANA, STAB_RESET_TIME)
  383.     set_player_nextattack(id, STAB_RESET_TIME) 
  384.  
  385.     if(Check_StabAttack(id))
  386.     {
  387.         emit_sound(id, CHAN_WEAPON, DualKatana_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
  388.     } else {
  389.         if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
  390.         else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DualKatana_Sound[8], 1.0, ATTN_NORM, 0, PITCH_NORM)
  391.     }
  392.    
  393.     set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
  394.  
  395.     g_Attack_Mode[id] = 0
  396.     g_Hit_Ing[id] = 0
  397. }
  398.  
  399. public Check_StabAttack(id)
  400. {
  401.     static Float:Max_Distance, Float:Point[4][3], Float:TB_Distance, Float:Point_Dis
  402.    
  403.     Point_Dis = float(STAB_POINT_DIS)
  404.     Max_Distance = float(STAB_RADIUS)
  405.     TB_Distance = Max_Distance / 4.0
  406.    
  407.     static Float:VicOrigin[3], Float:MyOrigin[3]
  408.     pev(id, pev_origin, MyOrigin)
  409.    
  410.     for(new i = 0; i < 4; i++)
  411.         get_position(id, TB_Distance * (i + 1), 0.0, 0.0, Point[i])
  412.        
  413.     static Have_Victim; Have_Victim = 0
  414.     static ent
  415.     ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
  416.        
  417.     if(!pev_valid(ent))
  418.         return 0
  419.        
  420.     for(new i = 0; i < get_maxplayers(); i++)
  421.     {
  422.         if(!is_user_alive(i))
  423.             continue
  424.         if(id == i)
  425.             continue
  426.         if(entity_range(id, i) > Max_Distance)
  427.             continue
  428.    
  429.         pev(i, pev_origin, VicOrigin)
  430.         if(is_wall_between_points(MyOrigin, VicOrigin, id))
  431.             continue
  432.            
  433.         if(get_distance_f(VicOrigin, Point[0]) <= Point_Dis
  434.         || get_distance_f(VicOrigin, Point[1]) <= Point_Dis
  435.         || get_distance_f(VicOrigin, Point[2]) <= Point_Dis
  436.         || get_distance_f(VicOrigin, Point[3]) <= Point_Dis)
  437.         {
  438.             if(!Have_Victim) Have_Victim = 1
  439.             do_attack(id, i, ent, float(STAB_DAMAGE))
  440.         }
  441.     }  
  442.    
  443.     if(Have_Victim)
  444.         return 1
  445.     else
  446.         return 0
  447.    
  448.     return 0
  449. }  
  450.  
  451. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  452. {
  453.     if(!is_user_connected(id))
  454.         return FMRES_IGNORED
  455.     if(get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  456.         return FMRES_IGNORED
  457.        
  458.     if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  459.     {
  460.         if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  461.         {
  462.             g_Hit_Ing[id] = HIT_NOTHING
  463.             return FMRES_SUPERCEDE
  464.         }
  465.         if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
  466.         {
  467.             if (sample[17] == 'w') // wall
  468.             {
  469.                 g_Hit_Ing[id] = HIT_WALL
  470.                 return FMRES_SUPERCEDE
  471.             } else {
  472.                 g_Hit_Ing[id] = HIT_ENEMY
  473.                 return FMRES_SUPERCEDE
  474.             }
  475.         }
  476.         if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  477.             return FMRES_SUPERCEDE;
  478.     }
  479.    
  480.     return FMRES_IGNORED
  481. }
  482.  
  483. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  484. {
  485.     if (!is_user_alive(id))
  486.         return FMRES_IGNORED   
  487.     if (get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  488.         return FMRES_IGNORED
  489.    
  490.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  491.    
  492.     pev(id, pev_origin, fOrigin)
  493.     pev(id, pev_view_ofs, view_ofs)
  494.     xs_vec_add(fOrigin, view_ofs, vecStart)
  495.     pev(id, pev_v_angle, v_angle)
  496.    
  497.     engfunc(EngFunc_MakeVectors, v_angle)
  498.     get_global_vector(GL_v_forward, v_forward)
  499.  
  500.     if(g_Attack_Mode[id] == ATTACK_SLASH1 || g_Attack_Mode[id] == ATTACK_SLASH2 || g_Attack_Mode[id] == ATTACK_SLASH3)
  501.         xs_vec_mul_scalar(v_forward, float(SLASH_RADIUS), v_forward)
  502.     else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, float(STAB_RADIUS), v_forward)
  503.     else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  504.     xs_vec_add(vecStart, v_forward, vecEnd)
  505.    
  506.     engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  507.    
  508.     return FMRES_SUPERCEDE
  509. }
  510.  
  511. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  512. {
  513.     if (!is_user_alive(id))
  514.         return FMRES_IGNORED   
  515.     if (get_user_weapon(id) != CSW_DUALKATANA || !g_Had_DualKatana[id])
  516.         return FMRES_IGNORED
  517.    
  518.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  519.    
  520.     pev(id, pev_origin, fOrigin)
  521.     pev(id, pev_view_ofs, view_ofs)
  522.     xs_vec_add(fOrigin, view_ofs, vecStart)
  523.     pev(id, pev_v_angle, v_angle)
  524.    
  525.     engfunc(EngFunc_MakeVectors, v_angle)
  526.     get_global_vector(GL_v_forward, v_forward)
  527.    
  528.     if(g_Attack_Mode[id] == ATTACK_SLASH1 || g_Attack_Mode[id] == ATTACK_SLASH2 || g_Attack_Mode[id] == ATTACK_SLASH3)
  529.         xs_vec_mul_scalar(v_forward, float(SLASH_RADIUS), v_forward)
  530.     else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, float(STAB_RADIUS), v_forward)
  531.     else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
  532.     xs_vec_add(vecStart, v_forward, vecEnd)
  533.    
  534.     engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  535.    
  536.     return FMRES_SUPERCEDE
  537. }
  538.  
  539. public fw_PlayerTraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceResult, DamageBits)
  540. {
  541.     if(!is_user_alive(Attacker))   
  542.         return HAM_IGNORED
  543.     if(!g_Had_DualKatana[Attacker] || !g_Checking_Mode[Attacker])
  544.         return HAM_IGNORED
  545.        
  546.     return HAM_SUPERCEDE
  547. }
  548.  
  549. public fw_Item_Deploy_Post(ent)
  550. {
  551.     static id; id = fm_cs_get_weapon_ent_owner(ent)
  552.     if (!pev_valid(id))
  553.         return
  554.  
  555.     if(!g_Had_DualKatana[id])
  556.         return
  557.        
  558.     set_pev(id, pev_viewmodel2, V_MODEL)
  559.     set_pev(id, pev_weaponmodel2, P_MODEL)
  560. }
  561.  
  562.  
  563. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  564. {
  565.     fake_player_trace_attack(Attacker, Victim, fDamage)
  566.     fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  567. }
  568.  
  569. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  570. {
  571.     // get fDirection
  572.     new Float:fAngles[3], Float:fDirection[3]
  573.     pev(iAttacker, pev_angles, fAngles)
  574.     angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  575.    
  576.     // get fStart
  577.     new Float:fStart[3], Float:fViewOfs[3]
  578.     pev(iAttacker, pev_origin, fStart)
  579.     pev(iAttacker, pev_view_ofs, fViewOfs)
  580.     xs_vec_add(fViewOfs, fStart, fStart)
  581.    
  582.     // get aimOrigin
  583.     new iAimOrigin[3], Float:fAimOrigin[3]
  584.     get_user_origin(iAttacker, iAimOrigin, 3)
  585.     IVecFVec(iAimOrigin, fAimOrigin)
  586.    
  587.     // TraceLine from fStart to AimOrigin
  588.     new ptr = create_tr2()
  589.     engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  590.     new pHit = get_tr2(ptr, TR_pHit)
  591.     new iHitgroup = get_tr2(ptr, TR_iHitgroup)
  592.     new Float:fEndPos[3]
  593.     get_tr2(ptr, TR_vecEndPos, fEndPos)
  594.  
  595.     // get target & body at aiming
  596.     new iTarget, iBody
  597.     get_user_aiming(iAttacker, iTarget, iBody)
  598.    
  599.     // if aiming find target is iVictim then update iHitgroup
  600.     if (iTarget == iVictim)
  601.     {
  602.         iHitgroup = iBody
  603.     }
  604.    
  605.     // if ptr find target not is iVictim
  606.     else if (pHit != iVictim)
  607.     {
  608.         // get AimOrigin in iVictim
  609.         new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  610.         pev(iVictim, pev_origin, fVicOrigin)
  611.         pev(iVictim, pev_view_ofs, fVicViewOfs)
  612.         xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  613.         fAimInVictim[2] = fStart[2]
  614.         fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  615.        
  616.         // check aim in size of iVictim
  617.         new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  618.         iAngleToVictim = abs(iAngleToVictim)
  619.         new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  620.         new Float:fVicSize[3]
  621.         pev(iVictim, pev_size , fVicSize)
  622.         if ( fDis <= fVicSize[0] * 0.5 )
  623.         {
  624.             // TraceLine from fStart to aimOrigin in iVictim
  625.             new ptr2 = create_tr2()
  626.             engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  627.             new pHit2 = get_tr2(ptr2, TR_pHit)
  628.             new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  629.            
  630.             // if ptr2 find target is iVictim
  631.             if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  632.             {
  633.                 pHit = iVictim
  634.                 iHitgroup = iHitgroup2
  635.                 get_tr2(ptr2, TR_vecEndPos, fEndPos)
  636.             }
  637.            
  638.             free_tr2(ptr2)
  639.         }
  640.        
  641.         // if pHit still not is iVictim then set default HitGroup
  642.         if (pHit != iVictim)
  643.         {
  644.             // set default iHitgroup
  645.             iHitgroup = HIT_GENERIC
  646.            
  647.             new ptr3 = create_tr2()
  648.             engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  649.             get_tr2(ptr3, TR_vecEndPos, fEndPos)
  650.            
  651.             // free ptr3
  652.             free_tr2(ptr3)
  653.         }
  654.     }
  655.    
  656.     // set new Hit & Hitgroup & EndPos
  657.     set_tr2(ptr, TR_pHit, iVictim)
  658.     set_tr2(ptr, TR_iHitgroup, iHitgroup)
  659.     set_tr2(ptr, TR_vecEndPos, fEndPos)
  660.    
  661.     // hitgroup multi fDamage
  662.     new Float:fMultifDamage
  663.     switch(iHitgroup)
  664.     {
  665.         case HIT_HEAD: fMultifDamage  = 4.0
  666.         case HIT_STOMACH: fMultifDamage  = 1.25
  667.         case HIT_LEFTLEG: fMultifDamage  = 0.75
  668.         case HIT_RIGHTLEG: fMultifDamage  = 0.75
  669.         default: fMultifDamage  = 1.0
  670.     }
  671.    
  672.     fDamage *= fMultifDamage
  673.    
  674.     // ExecuteHam
  675.     fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  676.    
  677.     // free ptr
  678.     free_tr2(ptr)
  679. }
  680.  
  681. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  682. {
  683.     ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  684. }
  685.  
  686. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  687. {
  688.     iInflictor = (!iInflictor) ? iAttacker : iInflictor
  689.     ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  690. }
  691.  
  692. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  693. {
  694.     new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  695.     pev(id, pev_origin, fOrigin)
  696.     get_user_origin(id, iAimOrigin, 3) // end position from eyes
  697.     IVecFVec(iAimOrigin, fAimOrigin)
  698.     xs_vec_sub(fAimOrigin, fOrigin, fV1)
  699.    
  700.     new Float:fV2[3]
  701.     xs_vec_sub(fTarget, fOrigin, fV2)
  702.    
  703.     new iResult = get_angle_between_vectors(fV1, fV2)
  704.    
  705.     if (TargetSize > 0.0)
  706.     {
  707.         new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  708.         new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  709.         iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  710.     }
  711.    
  712.     return iResult
  713. }
  714.  
  715. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  716. {
  717.     new Float:fA1[3], Float:fA2[3]
  718.     engfunc(EngFunc_VecToAngles, fV1, fA1)
  719.     engfunc(EngFunc_VecToAngles, fV2, fA2)
  720.    
  721.     new iResult = floatround(fA1[1] - fA2[1])
  722.     iResult = iResult % 360
  723.     iResult = (iResult > 180) ? (iResult - 360) : iResult
  724.    
  725.     return iResult
  726. }
  727.  
  728. stock fm_cs_get_weapon_ent_owner(ent)
  729. {
  730.     if (pev_valid(ent) != PDATA_SAFE)
  731.         return -1
  732.    
  733.     return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  734. }
  735.  
  736. stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
  737. {
  738.     if(!is_user_alive(id))
  739.         return
  740.        
  741.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  742.     if(!pev_valid(entwpn))
  743.         return
  744.        
  745.     set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
  746.     set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
  747.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
  748. }
  749.  
  750. stock set_weapon_anim(id, anim)
  751. {
  752.     if(!is_user_alive(id))
  753.         return
  754.        
  755.     set_pev(id, pev_weaponanim, anim)
  756.    
  757.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  758.     write_byte(anim)
  759.     write_byte(0)
  760.     message_end()  
  761. }
  762.  
  763. stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
  764. {
  765.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  766.    
  767.     pev(ent, pev_origin, vOrigin)
  768.     pev(ent, pev_view_ofs,vUp) //for player
  769.     xs_vec_add(vOrigin,vUp,vOrigin)
  770.     pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  771.    
  772.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  773.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  774.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  775.    
  776.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  777.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  778.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  779. }
  780.  
  781. stock set_player_nextattack(id, Float:nexttime)
  782. {
  783.     if(!is_user_alive(id))
  784.         return
  785.        
  786.     set_pdata_float(id, m_flNextAttack, nexttime, 5)
  787. }
  788.  
  789. stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
  790. {
  791.     static ptr
  792.     ptr = create_tr2()
  793.  
  794.     engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
  795.    
  796.     static Float:EndPos[3]
  797.     get_tr2(ptr, TR_vecEndPos, EndPos)
  798.  
  799.     free_tr2(ptr)
  800.     return floatround(get_distance_f(end, EndPos))
  801. }
  802.  
  803. public ResetHUD(id)
  804. {
  805.     if(!ma_klase[id])
  806.         return;
  807.     g_Had_DualKatana[id] = 1
  808.     g_Slashing_Mode[id] = 0
  809.     g_Attack_Mode[id] = 0
  810.     g_Checking_Mode[id] = 0
  811.     g_Hit_Ing[id] = 0      
  812.  
  813.     g_Had_DualKatana[id] = 1
  814.     ma_klase[id] = true
  815.     fm_give_item(id, weapon_dualkatana)
  816.    
  817.     set_user_gravity(id, get_pcvar_float(grawitacja) /800.0);
  818.     set_rendering(id,kRenderFxNone, 0, 0, 0, kRenderTransAlpha, get_pcvar_num(niewidzialnosc));
  819.    
  820.     if(get_user_weapon(id) == CSW_KNIFE)
  821.     {
  822.         set_pev(id, pev_viewmodel2, V_MODEL)
  823.         set_pev(id, pev_weaponmodel2, P_MODEL) 
  824.                  
  825.         set_weapon_anim(id, DK_ANIM_DRAW)
  826.         set_player_nextattack(id, DRAW_TIME)
  827.     } else {
  828.         engclient_cmd(id, weapon_dualkatana)
  829.     }  
  830.     if(get_user_weapon(id) != CSW_KNIFE)
  831.     {
  832.         strip_user_weapons(id)
  833.         set_pdata_int(id, OFFSET_PRIMARYWEAPON, 0)
  834.         fm_give_item(id, weapon_dualkatana)
  835.     }
  836. }
Add Comment
Please, Sign In to add comment