Solved Rune Blade and Thanatos

Unpaid Requests, Public Plugins
Post Reply
czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

Rune Blade and Thanatos

#1

Post by czirimbolo » 5 years ago

Hello,
can someone covert those guns to our zombie mod?
Attachments
[CSO]RUNE BLADE.rar
(1.29 MiB) Downloaded 313 times
[CSO]RUNE BLADE.rar
(1.29 MiB) Downloaded 313 times
CSOTHANATOS-9V2.zip
(987.97 KiB) Downloaded 309 times
CSOTHANATOS-9V2.zip
(987.97 KiB) Downloaded 309 times
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#2

Post by Night Fury » 5 years ago

RuneBlade:
  1. #include <zombie_escape>
  2. #include <engine>
  3. #include <fakemeta_util>
  4. #include <cstrike>
  5. #include <xs>
  6.  
  7. #define PLUGIN "[CSO] RUNE BLADE"
  8. #define VERSION "1.0"
  9. #define AUTHOR "TK N CASH"
  10.  
  11. #define ADMIN_ACCESS        ADMIN_KICK
  12.  
  13. // Draw Time
  14. #define DRAW_TIME 1.5
  15.  
  16. // Next Attack Time
  17. #define NEXTATTACK_MISS 1.45
  18. #define NEXTATTACK_HIT 1.45
  19.  
  20. // Next Attack Time
  21. #define NEXTATTACK_MISS1 1.45
  22. #define NEXTATTACK_HIT1 1.45
  23.  
  24. // Attack Distance
  25. #define ATTACKDIS_SLASH 75.0
  26. #define ATTACKDIS_CHARGE 120.0
  27.  
  28. // Attack Damage
  29. #define DAMAGE_SLASH 500.0
  30. #define DAMAGE_UNCHARGED 1000.0
  31. #define DAMAGE_CHARGE 2500.0
  32.  
  33. // Charge Mode
  34. #define CHARGE_STARTTIME 0.75
  35. #define CHARGE_ATTACKTIME 0.75
  36. #define CHARGE_TIME 3.0
  37. #define CHARGE_NEXTATTACK 2.0
  38. #define CHARGE_EXPRADIUS 350
  39. #define CHARGE_ATTACK_KNOCKPOWER 100.0
  40.  
  41. // Task
  42. #define TASK_CHARGE_STARTING 75675
  43. #define TASK_CHARGING 464334
  44.  
  45. // Weapon info
  46. #define ITEM_NAME "RuneBlade"
  47. #define ITEM_COST 50
  48. #define ITEM_LIMIT 0
  49.  
  50. // Models
  51. new const v_model[] = "models/v_runeblade.mdl"
  52. new const p_model[] = "models/p_runeblade.mdl"
  53.  
  54. // Sprite
  55. new const exp_spr[] = "sprites/runeblade_ef.spr"
  56. new const exp_spr2[] = "sprites/runeblade_ef02.spr"
  57.  
  58. new const weapon_sound[9][] =
  59. {
  60.     "runeblade/draw.wav",
  61.     "runeblade/miss.wav",
  62.     "runeblade/miss.wav",
  63.     "runeblade/hitwall.wav",
  64.     "runeblade/hit.wav",
  65.     "runeblade/hit.wav",
  66.     "runeblade/charge_idle.wav",
  67.     "runeblade/charge_finish1.wav",
  68.     "runeblade/charge_hit.wav"
  69. }
  70.  
  71. enum
  72. {
  73.     B9_DRAW = 0,
  74.     B9_SLASH1,
  75.     B9_SLASH2,
  76.     B9_HITWALL,
  77.     B9_HIT1,
  78.     B9_HIT2,
  79.     B9_CHARGE_START,
  80.     B9_CHARGE_FINISH,
  81.     B9_CHARGE_ATTACK
  82. }
  83.  
  84. new g_bot, g_exp_sprid, g_exp_sprid2
  85. new g_had_balrog9[33], g_attack_mode[33], g_charging[33], g_charged[33], g_chargeattack[33]
  86. new g_iItemID
  87.  
  88. enum
  89. {
  90.     MODE_NORMAL = 1,
  91.     MODE_CHARGE
  92. }
  93.  
  94. enum
  95. {
  96.     KNIFE_ANIM_IDLE = 0,
  97.     KNIFE_ANIM_SLASH1,
  98.     KNIFE_ANIM_SLASH2,
  99.     KNIFE_ANIM_DRAW,
  100.     KNIFE_ANIM_STAB_HIT,
  101.     KNIFE_ANIM_STAB_MISS,
  102.     KNIFE_ANIM_MIDSLASH1,
  103.     KNIFE_ANIM_MIDSLASH2
  104. }
  105.  
  106. enum
  107. {
  108.     BALROG9_ANIM_IDLE = 0,
  109.     BALROG9_ANIM_SLASH1 = 1,
  110.     BALROG9_ANIM_SLASH2 = 1,
  111.     BALROG9_ANIM_SLASH3 = 1,
  112.     BALROG9_ANIM_SLASH4 = 1,
  113.     BALROG9_ANIM_SLASH5 = 1,
  114.     BALROG9_ANIM_DRAW = 2,
  115.     BALROG9_ANIM_CHARGE_START,
  116.     BALROG9_ANIM_CHARGE_FINISH,
  117.     BALROG9_ANIM_CHARGE_IDLE1,
  118.     BALROG9_ANIM_CHARGE_IDLE2,
  119.     BALROG9_ANIM_CHARGE_ATTACK1,
  120.     BALROG9_ANIM_CHARGE_ATTACK2
  121. }
  122.  
  123. public plugin_init()
  124. {
  125.     register_plugin(PLUGIN, VERSION, AUTHOR)
  126.  
  127.     g_iItemID = ze_register_item(ITEM_NAME, ITEM_COST, ITEM_LIMIT)
  128.    
  129.     register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  130.    
  131.     register_forward(FM_EmitSound, "fw_EmitSound")
  132.     register_forward(FM_CmdStart, "fw_CmdStart")
  133.     register_forward(FM_TraceLine, "fw_TraceLine")
  134.     register_forward(FM_TraceHull, "fw_TraceHull")     
  135.     RegisterHam(Ham_CS_Weapon_SendWeaponAnim, "weapon_knife", "fw_Knife_SendAnim", 1)
  136.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  137.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Post", 1)
  138.     RegisterHam(Ham_Spawn, "player", "remove_balrog9", 1);
  139.    
  140.     register_clcmd ( "admin_get_runeblade", "get_balrog9", ADMIN_ACCESS );
  141.    
  142.     register_clcmd( "weapon_runeblade" , "Hook_WeaponList" );
  143. }
  144.  
  145. public plugin_natives ( )
  146. {
  147.     register_native ( "get_rune", "get_balrog9", 1 );
  148.     register_native ( "remove_rune", "remove_balrog9", 1 );
  149. }
  150.  
  151. public plugin_precache()
  152. {
  153.     engfunc(EngFunc_PrecacheModel, v_model)
  154.     engfunc(EngFunc_PrecacheModel, p_model)
  155.    
  156.     for(new i = 0; i < sizeof(weapon_sound); i++)
  157.         engfunc(EngFunc_PrecacheSound, weapon_sound[i])
  158.        
  159.        
  160.     g_exp_sprid = engfunc(EngFunc_PrecacheModel, exp_spr)
  161.     g_exp_sprid2 = engfunc(EngFunc_PrecacheModel, exp_spr2)
  162.    
  163.     precache_generic("sprites/640hud81.spr")
  164.     precache_generic("sprites/weapon_runeblade.txt")
  165. }
  166.  
  167. public Hook_WeaponList( id )
  168. {
  169.     engclient_cmd( id, "weapon_knife" )
  170.     return PLUGIN_HANDLED;
  171. }
  172.  
  173. public ze_select_item_pre(id, iItemid, bIgnoreCost)
  174. {
  175.     if (iItemid != g_iItemID)
  176.         return ZE_ITEM_AVAILABLE
  177.  
  178.     if (ze_is_user_zombie(id))
  179.         return ZE_ITEM_DONT_SHOW
  180.  
  181.     return ZE_ITEM_AVAILABLE
  182. }
  183.  
  184. public ze_select_item_post(id, iItemid, bIgnoreCost)
  185. {
  186.     if (iItemid != g_iItemID)
  187.         return
  188.  
  189.     get_balrog9(id)
  190. }
  191.  
  192. public get_balrog9(id)
  193. {
  194.     g_had_balrog9[id] = 1
  195.     g_attack_mode[id] = 0
  196.     g_charged[id] = 0
  197.     g_charging[id] = 0
  198.     g_chargeattack[id] = 0
  199.    
  200.     Set_Sprite( id, "weapon_runeblade" )
  201.    
  202.     if(get_user_weapon(id) == CSW_KNIFE)
  203.     {
  204.         Event_CurWeapon(id)
  205.         set_weapon_anim(id, BALROG9_ANIM_DRAW)
  206.     }
  207. }
  208.  
  209.  
  210. public remove_balrog9(id)
  211. {
  212.     g_had_balrog9[id] = 0
  213.     g_attack_mode[id] = 0
  214.     g_charged[id] = 0
  215.     g_charging[id] = 0 
  216.     g_chargeattack[id] = 0
  217.    
  218.     Set_Sprite( id, "weapon_knife" )
  219.    
  220.     remove_task(id+TASK_CHARGE_STARTING)
  221.     remove_task(id+TASK_CHARGING)
  222. }
  223.  
  224. public client_putinserver(id)
  225. {
  226.     if(is_user_bot(id) && !g_bot)
  227.     {
  228.         g_bot = 1
  229.         set_task(0.1, "Do_RegisterHamBot", id)
  230.     }
  231. }
  232.  
  233. public Do_RegisterHamBot(id)
  234. {
  235.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
  236.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Post", 1)
  237. }
  238.  
  239. public Event_CurWeapon(id)
  240. {
  241.     if(!is_user_alive(id))
  242.         return 1
  243.     if(get_user_weapon(id) != CSW_KNIFE)
  244.         return 1
  245.     if(!g_had_balrog9[id])
  246.         return 1
  247.        
  248.     set_pev(id, pev_viewmodel2, v_model)
  249.     set_pev(id, pev_weaponmodel2, p_model)
  250.        
  251.     return 0
  252. }
  253.  
  254. public fw_Knife_SendAnim(ent, anim, skip_local)
  255. {
  256.     if(!pev_valid(ent))
  257.         return HAM_IGNORED
  258.    
  259.     new id
  260.     id = get_pdata_cbase(ent, 41 , 4)
  261.    
  262.     if(!g_had_balrog9[id])
  263.         return HAM_IGNORED
  264.    
  265.     static Float:PunchAngles[3]
  266.    
  267.     if(anim == KNIFE_ANIM_DRAW)
  268.     {
  269.         Set_Sprite( id, "weapon_runeblade" )
  270.         set_weapons_timeidle(id, DRAW_TIME)
  271.         set_player_nextattack(id, DRAW_TIME)   
  272.        
  273.         set_weapon_anim(id, BALROG9_ANIM_DRAW)
  274.         Remove_OldStuff(id)
  275.     } else if(anim == KNIFE_ANIM_MIDSLASH1) {
  276.        
  277.         set_pev(id, pev_punchangle, PunchAngles)
  278.         set_weapon_anim(id, BALROG9_ANIM_SLASH1)
  279.         Remove_OldStuff(id)
  280.     } else if(anim == KNIFE_ANIM_MIDSLASH2) {
  281.        
  282.         set_pev(id, pev_punchangle, PunchAngles)
  283.         set_weapon_anim(id, BALROG9_ANIM_SLASH2)
  284.         Remove_OldStuff(id)
  285.     } else if(anim == KNIFE_ANIM_STAB_HIT) {
  286.        
  287.         set_pev(id, pev_punchangle, PunchAngles)
  288.        
  289.         if(g_chargeattack[id] == 2)
  290.         {
  291.             set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK2)
  292.             set_task(0.18,"Effect_ChargedAttack",id)
  293.         } else
  294.         {
  295.             set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK1)
  296.             SetHamParamFloat(3, DAMAGE_UNCHARGED)
  297.         }
  298.     } else if(anim == KNIFE_ANIM_STAB_MISS) {
  299.        
  300.         if(g_chargeattack[id] == 2)
  301.         {
  302.             set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK2)
  303.             set_task(0.18,"Effect_ChargedAttack",id)
  304.         } else
  305.         {
  306.             set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK1)
  307.             SetHamParamFloat(3, DAMAGE_UNCHARGED)
  308.         }
  309.     }
  310.  
  311.     return HAM_IGNORED
  312. }
  313.  
  314. public Remove_OldStuff(id)
  315. {
  316.     g_charging[id] = 0
  317.     g_charged[id] = 0
  318.     g_chargeattack[id] = 0
  319.  
  320.     remove_task(id+TASK_CHARGE_STARTING)
  321.     remove_task(id+TASK_CHARGING)  
  322. }
  323.  
  324. public Effect_ChargedAttack(id)
  325. {
  326.     static Float:Origin[3]
  327.     get_position(id, 36.0, 0.0, 0.0, Origin)
  328.    
  329.     emit_sound(id, CHAN_WEAPON, weapon_sound[B9_CHARGE_ATTACK], 1.0, ATTN_NORM, 0, PITCH_NORM)
  330.    
  331.     // Exp
  332.     message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
  333.     write_byte(TE_EXPLOSION)
  334.     engfunc(EngFunc_WriteCoord, Origin[0])
  335.     engfunc(EngFunc_WriteCoord, Origin[1])
  336.     engfunc(EngFunc_WriteCoord, Origin[2])
  337.     write_short(g_exp_sprid)    // sprite index
  338.     write_byte(8)   // scale in 0.1's
  339.     write_byte(24)  // framerate
  340.     write_byte(4)   // flags
  341.     message_end()
  342.    
  343.     message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
  344.     write_byte(TE_EXPLOSION)
  345.     engfunc(EngFunc_WriteCoord, Origin[0])
  346.     engfunc(EngFunc_WriteCoord, Origin[1])
  347.     engfunc(EngFunc_WriteCoord, Origin[2])
  348.     write_short(g_exp_sprid2)   // sprite index
  349.     write_byte(7)   // scale in 0.1's
  350.     write_byte(30)  // framerate
  351.     write_byte(4)   // flags
  352.     message_end()
  353.    
  354.     // Check Attack Damage
  355.     //HamRadiusDamage(id, fm_get_user_weapon_entity(id, CSW_KNIFE), , , DMG_BURN)
  356.  
  357.     for(new i = 0; i < get_maxplayers(); i++)
  358.     {
  359.         if(!is_user_alive(i))
  360.             continue
  361.         if(id == i)
  362.             continue
  363.         if(cs_get_user_team(i) == cs_get_user_team(id))
  364.             continue
  365.         if(entity_range(i, id) > float(CHARGE_EXPRADIUS))
  366.             continue
  367.            
  368.         ExecuteHamB(Ham_TakeDamage, i, fm_get_user_weapon_entity(id, CSW_KNIFE), id, DAMAGE_CHARGE, DMG_BLAST) 
  369.     }
  370. }
  371.  
  372. stock HamRadiusDamage(id, ent, Float:radius, Float:damage, bits, iVictim)
  373. {
  374.     static target, Float:origin[3]
  375.    
  376.     target = -1
  377.     pev(ent, pev_origin, origin)
  378.      
  379.     while((target = find_ent_in_sphere(target, origin, radius) ))
  380.     {
  381.         static Float:o[3]
  382.         pev(target, pev_origin, o)
  383.          
  384.         xs_vec_sub(origin, o, o)
  385.          
  386.         // Recheck if the entity is in radius
  387.         if (xs_vec_len(o) > radius)
  388.             continue
  389.        
  390.         if(is_user_alive(target))
  391.         {
  392.             if(id == target)
  393.                 continue
  394.             if(cs_get_user_team(id) == cs_get_user_team(target))
  395.                 continue
  396.         }
  397.          
  398.         Ham_ExecDamageB(target, ent, id, damage * (xs_vec_len(o) / radius), HIT_GENERIC, bits)
  399.     }
  400. }  
  401.  
  402. stock Ham_ExecDamageB(victim, inflictor, attacker, Float:damage, hitgroup, bits)
  403. {
  404.     static const Float:hitgroup_multi[] =
  405.     {
  406.         1.0,  // HIT_GENERIC
  407.         4.0,  // HIT_HEAD
  408.         1.0,  // HIT_CHEST
  409.         1.25, // HIT_STOMACH
  410.         1.0,  // HIT_LEFTARM
  411.         1.0,  // HIT_RIGHTARM
  412.         0.75, // HIT_LEFTLEG
  413.         0.75,  // HIT_RIGHTLEG
  414.         0.0   // HIT_SHIELD
  415.     }
  416.    
  417.     set_pdata_int(victim, 75, hitgroup, 5)
  418.     ExecuteHamB(Ham_TakeDamage, victim, inflictor, attacker, damage * hitgroup_multi[hitgroup], bits)
  419. }
  420.  
  421. public fw_TraceAttack(ent, attacker, Float:Damage, Float:Dir[3], ptr, DamageType, iVictim)
  422. {
  423.     if(!is_user_alive(attacker))
  424.         return HAM_IGNORED
  425.     if(get_user_weapon(attacker) != CSW_KNIFE || !g_had_balrog9[attacker])
  426.         return HAM_IGNORED
  427.        
  428.     if(g_attack_mode[attacker] == MODE_NORMAL) SetHamParamFloat(3, DAMAGE_SLASH)
  429.     if(g_attack_mode[attacker] == MODE_CHARGE) SetHamParamFloat(3, DAMAGE_CHARGE)
  430.    
  431.     return HAM_HANDLED
  432. }
  433.  
  434. public fw_TraceAttack_Post(ent, attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
  435. {
  436.     if(!is_user_alive(attacker))
  437.         return HAM_IGNORED
  438.     if(get_user_weapon(attacker) != CSW_KNIFE || !g_had_balrog9[attacker])
  439.         return HAM_IGNORED
  440.     if(g_attack_mode[attacker] == MODE_CHARGE)
  441.     {
  442.         if(g_chargeattack[attacker] == 2) // Do KnockBack Here
  443.         {
  444.             static Float:Origin[3]
  445.             pev(attacker, pev_origin, Origin)
  446.            
  447.             hook_ent2(ent, Origin, CHARGE_ATTACK_KNOCKPOWER, 2)
  448.         }
  449.     }
  450.    
  451.     return HAM_HANDLED
  452. }
  453.  
  454. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  455. {
  456.     if(!is_user_connected(id))
  457.         return FMRES_IGNORED
  458.     if(get_user_weapon(id) != CSW_KNIFE || !g_had_balrog9[id])
  459.         return FMRES_IGNORED
  460.        
  461.     if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  462.     {
  463.         if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  464.         {
  465.             set_weapons_timeidle(id, NEXTATTACK_MISS)
  466.             set_player_nextattack(id, NEXTATTACK_MISS)
  467.            
  468.             if(g_attack_mode[id] == MODE_CHARGE)
  469.             {
  470.                 if(g_chargeattack[id] == 2)
  471.                     emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
  472.                 else
  473.                     emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
  474.             } else emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
  475.             return FMRES_SUPERCEDE
  476.         }
  477.         if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') // hit
  478.         {
  479.             if (sample[17] == 'w') // wall
  480.             {
  481.                 set_weapons_timeidle(id, NEXTATTACK_HIT)
  482.                 set_player_nextattack(id, NEXTATTACK_HIT)  
  483.                
  484.                 if(g_attack_mode[id] == MODE_CHARGE)
  485.                 {
  486.                     if(g_chargeattack[id] == 2)
  487.                         emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
  488.                     else
  489.                         emit_sound(id, channel, weapon_sound[B9_HITWALL], volume, attn, flags, pitch)
  490.                 } else emit_sound(id, channel, weapon_sound[B9_HITWALL], volume, attn, flags, pitch)
  491.                 return FMRES_SUPERCEDE
  492.             } else {
  493.                 set_weapons_timeidle(id, NEXTATTACK_HIT)
  494.                 set_player_nextattack(id, NEXTATTACK_HIT)
  495.                
  496.                 if(g_attack_mode[id] == MODE_CHARGE)
  497.                 {
  498.                     if(g_chargeattack[id] == 2)
  499.                         emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
  500.                     else
  501.                         emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
  502.                 } else emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
  503.                 return FMRES_SUPERCEDE
  504.             }
  505.         }
  506.         if(sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
  507.         {
  508.             if(g_chargeattack[id] == 2)
  509.                 emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
  510.             else
  511.                 emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
  512.                
  513.             return FMRES_SUPERCEDE
  514.         }
  515.     }
  516.    
  517.     return FMRES_IGNORED
  518. }
  519.  
  520. public sound1(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  521. {
  522.     emit_sound(id, channel, weapon_sound[B9_CHARGE_ATTACK], volume, attn, flags, pitch)
  523. }
  524.  
  525. public fw_CmdStart(id, uc_handle, seed)
  526. {
  527.     if (!is_user_alive(id))
  528.         return
  529.     if(get_user_weapon(id) != CSW_KNIFE)
  530.         return
  531.     if(!g_had_balrog9[id])
  532.         return
  533.    
  534.     static ent
  535.     ent = find_ent_by_owner(-1, "weapon_knife", id)
  536.    
  537.     if(!pev_valid(ent))
  538.         return
  539.    
  540.     static CurButton, OldButton
  541.    
  542.     CurButton = get_uc(uc_handle, UC_Buttons)
  543.     OldButton = (pev(id, pev_oldbuttons) & IN_ATTACK2)
  544.    
  545.     if(CurButton & IN_ATTACK)
  546.     {
  547.         if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
  548.             return
  549.        
  550.         g_attack_mode[id] = MODE_NORMAL
  551.         set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
  552.     } else {
  553.         if(CurButton & IN_ATTACK2)
  554.         {
  555.             set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
  556.             set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
  557.            
  558.             if(OldButton) // Holding This Button
  559.             {
  560.                 if(g_charging[id] == 2)
  561.                 {
  562.                     if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
  563.                         return
  564.                    
  565.                     if(g_charged[id])
  566.                     {
  567.                         set_weapons_timeidle(id, 99999.0)
  568.                         set_player_nextattack(id, 99999.0)
  569.                        
  570.                         if(pev(id, pev_weaponanim) != BALROG9_ANIM_CHARGE_IDLE2)
  571.                             set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE2)
  572.                     } else {
  573.                         set_weapons_timeidle(id, 99999.5)
  574.                         set_player_nextattack(id, 9999.5)
  575.                        
  576.                         if(pev(id, pev_weaponanim) != BALROG9_ANIM_CHARGE_IDLE1)
  577.                             set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE1)
  578.                     }
  579.                 }
  580.             }      
  581.            
  582.             if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
  583.                 return
  584.            
  585.             remove_task(id+TASK_CHARGE_STARTING)
  586.             remove_task(id+TASK_CHARGING)  
  587.            
  588.             g_attack_mode[id] = MODE_CHARGE
  589.             g_charging[id] = 1
  590.             g_charged[id] = 0
  591.             g_chargeattack[id] = 1
  592.            
  593.             set_weapons_timeidle(id, CHARGE_STARTTIME + 0.25)
  594.             set_player_nextattack(id, CHARGE_STARTTIME + 0.25)
  595.        
  596.             set_weapon_anim(id, BALROG9_ANIM_CHARGE_START)
  597.            
  598.             set_task(CHARGE_STARTTIME, "Do_HoldCharge", id+TASK_CHARGE_STARTING)
  599.             set_task(CHARGE_TIME, "Do_SetCharge", id+TASK_CHARGING)
  600.         } else {
  601.             if(OldButton) // After Press this Button (no Hold)
  602.             {
  603.                 if(g_charging[id] == 2)
  604.                 {
  605.                     if(g_chargeattack[id])
  606.                     {
  607.                         ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
  608.        
  609.                         set_weapons_timeidle(id, CHARGE_NEXTATTACK)
  610.                         set_player_nextattack(id, CHARGE_NEXTATTACK)
  611.                        
  612.                         g_charging[id] = 0
  613.                         g_charged[id] = 0
  614.                         g_chargeattack[id] = 0
  615.                        
  616.                         remove_task(id+TASK_CHARGE_STARTING)
  617.                         remove_task(id+TASK_CHARGING)
  618.                     }
  619.                 }
  620.             }
  621.         }
  622.     }
  623. }
  624.  
  625. public Do_SetCharge(id)
  626. {
  627.     id -= TASK_CHARGING
  628.    
  629.     if(!is_user_alive(id))
  630.         return
  631.     if(get_user_weapon(id) != CSW_KNIFE)
  632.         return
  633.     if(!g_had_balrog9[id])
  634.         return
  635.        
  636.     g_charging[id] = 2
  637.     g_charged[id] = 1
  638.     g_chargeattack[id] = 2
  639.    
  640.     set_weapons_timeidle(id, 0.25)
  641.     set_player_nextattack(id, 0.25)
  642.                        
  643.     set_weapon_anim(id, BALROG9_ANIM_CHARGE_FINISH)
  644. }
  645.  
  646. public Do_HoldCharge(id)
  647. {
  648.     id -= TASK_CHARGE_STARTING
  649.    
  650.     if(!is_user_alive(id))
  651.         return
  652.     if(get_user_weapon(id) != CSW_KNIFE)
  653.         return
  654.     if(!g_had_balrog9[id])
  655.         return
  656.        
  657.     if(!(pev(id, pev_button) & IN_ATTACK2) && !(pev(id, pev_oldbuttons) & IN_ATTACK2))
  658.     {
  659.         static ent
  660.         ent = find_ent_by_owner(-1, "weapon_knife", id)
  661.    
  662.         if(!pev_valid(ent))
  663.             return     
  664.            
  665.         ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
  666.        
  667.         set_weapons_timeidle(id, CHARGE_NEXTATTACK)
  668.         set_player_nextattack(id, CHARGE_NEXTATTACK)
  669.        
  670.         g_charging[id] = 0
  671.         g_charged[id] = 0
  672.         g_chargeattack[id] = 0
  673.        
  674.         remove_task(id+TASK_CHARGE_STARTING)
  675.         remove_task(id+TASK_CHARGING)
  676.                        
  677.         return
  678.     }
  679.    
  680.     g_charging[id] = 2
  681.     g_chargeattack[id] = 1
  682.     g_charged[id] = 0
  683.        
  684.     set_weapons_timeidle(id, CHARGE_TIME + 0.25)
  685.     set_player_nextattack(id, CHARGE_TIME + 0.25)
  686.        
  687.     set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE1) 
  688. }
  689.  
  690. public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
  691. {
  692.     if (!is_user_alive(id))
  693.         return FMRES_IGNORED   
  694.     if (get_user_weapon(id) != CSW_KNIFE)
  695.         return FMRES_IGNORED
  696.     if(!g_had_balrog9[id])
  697.         return FMRES_IGNORED
  698.    
  699.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  700.    
  701.     pev(id, pev_origin, fOrigin)
  702.     pev(id, pev_view_ofs, view_ofs)
  703.     xs_vec_add(fOrigin, view_ofs, vecStart)
  704.     pev(id, pev_v_angle, v_angle)
  705.    
  706.     engfunc(EngFunc_MakeVectors, v_angle)
  707.     get_global_vector(GL_v_forward, v_forward)
  708.  
  709.     if(g_attack_mode[id] == MODE_NORMAL)
  710.         xs_vec_mul_scalar(v_forward, ATTACKDIS_SLASH, v_forward)
  711.     else if(g_attack_mode[id] == MODE_CHARGE)
  712.         xs_vec_mul_scalar(v_forward, ATTACKDIS_CHARGE, v_forward)
  713.    
  714.     xs_vec_add(vecStart, v_forward, vecEnd)
  715.     engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
  716.    
  717.     return FMRES_SUPERCEDE
  718. }
  719.  
  720. public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
  721. {
  722.     if (!is_user_alive(id))
  723.         return FMRES_IGNORED
  724.     if (get_user_weapon(id) != CSW_KNIFE)
  725.         return FMRES_IGNORED
  726.     if(!g_had_balrog9[id])
  727.         return FMRES_IGNORED
  728.    
  729.     static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
  730.    
  731.     pev(id, pev_origin, fOrigin)
  732.     pev(id, pev_view_ofs, view_ofs)
  733.     xs_vec_add(fOrigin, view_ofs, vecStart)
  734.     pev(id, pev_v_angle, v_angle)
  735.    
  736.     engfunc(EngFunc_MakeVectors, v_angle)
  737.     get_global_vector(GL_v_forward, v_forward)
  738.  
  739.     if(g_attack_mode[id] == MODE_NORMAL)
  740.         xs_vec_mul_scalar(v_forward, ATTACKDIS_SLASH, v_forward)
  741.     else if(g_attack_mode[id] == MODE_CHARGE)
  742.         xs_vec_mul_scalar(v_forward, ATTACKDIS_CHARGE, v_forward)
  743.        
  744.     xs_vec_add(vecStart, v_forward, vecEnd)
  745.     engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
  746.    
  747.     return FMRES_SUPERCEDE
  748. }
  749.  
  750. stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
  751. {
  752.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  753.    
  754.     pev(ent, pev_origin, vOrigin)
  755.     pev(ent, pev_view_ofs,vUp) //for player
  756.     xs_vec_add(vOrigin,vUp,vOrigin)
  757.     pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
  758.    
  759.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
  760.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
  761.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
  762.    
  763.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  764.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  765.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  766. }
  767.    
  768. stock set_weapons_timeidle(id, Float:TimeIdle)
  769. {
  770.     if(!is_user_alive(id))
  771.         return
  772.        
  773.     new entwpn = fm_get_user_weapon_entity(id, CSW_KNIFE)
  774.     if (pev_valid(entwpn))
  775.     {
  776.         set_pdata_float(entwpn, 46, TimeIdle, 4)
  777.         set_pdata_float(entwpn, 47, TimeIdle, 4)
  778.         set_pdata_float(entwpn, 48, TimeIdle + 1.0, 4)
  779.     }
  780. }
  781.  
  782. stock set_player_nextattack(id, Float:nexttime)
  783. {
  784.     if(!is_user_alive(id))
  785.         return
  786.        
  787.     const m_flNextAttack = 83
  788.     set_pdata_float(id, m_flNextAttack, nexttime, 5)
  789. }
  790.  
  791. stock set_weapon_anim(id, anim)
  792. {
  793.     if(!is_user_alive(id))
  794.         return
  795.        
  796.     set_pev(id, pev_weaponanim, anim)
  797.    
  798.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  799.     write_byte(anim)
  800.     write_byte(0)
  801.     message_end()  
  802. }
  803.  
  804. stock hook_ent2(ent, Float:VicOrigin[3], Float:speed, type)
  805. {
  806.     static Float:fl_Velocity[3]
  807.     static Float:EntOrigin[3]
  808.    
  809.     pev(ent, pev_origin, EntOrigin)
  810.     static Float:distance_f
  811.     distance_f = get_distance_f(EntOrigin, VicOrigin)
  812.    
  813.     new Float:fl_Time = distance_f / speed
  814.    
  815.     VicOrigin[2] -= 36.0
  816.    
  817.     if(type == 1)
  818.     {
  819.         fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time) * 1.5
  820.         fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time) * 1.5
  821.         fl_Velocity[2] = ((VicOrigin[2] - EntOrigin[2]) / fl_Time) * 1.5
  822.     } else if(type == 2) {
  823.         fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time) * 1.5
  824.         fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time) * 1.5
  825.         fl_Velocity[2] = ((EntOrigin[2] - VicOrigin[2]) / fl_Time) * 1.5
  826.     }
  827.  
  828.     entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
  829. }
  830.  
  831. Set_Sprite( iPlayer, const Weapon[ ] )
  832. {
  833.     if( ! pev_valid( iPlayer ) )
  834.                 return;
  835.  
  836.     message_begin( MSG_ONE , get_user_msgid( "WeaponList" ) , _, iPlayer )
  837.     write_string( Weapon )
  838.     write_byte( -1 )
  839.     write_byte( -1)
  840.     write_byte( -1 )
  841.     write_byte( -1 )
  842.     write_byte( 2 )
  843.     write_byte( 1 )
  844.     write_byte( 29 )
  845.     write_byte( 0 )
  846.     message_end( )
  847. }
Thanatos:
  1. #include <zombie_escape>
  2. #include <engine>
  3. #include <fakemeta_util>
  4. #include <cstrike>
  5.  
  6. #define PLUGIN "[CSO] Melee Item: Thanatos-9"
  7. #define VERSION "2.0.beta" // Not Code Skull-Axe!
  8. #define AUTHOR "Dev!l" //Original Author Code
  9.  
  10. #define THANATOS9_RANGE_SLASH 110.0
  11. #define THANATOS9_RANGE_STAB 80.0
  12. #define THANATOS9_NEXTATTACK_SLASH 2.0
  13. #define THANATOS9_NEXTATTACK_STAB 1.0
  14.  
  15. #define THANATOS9_DAMAGE_SLASH 500.0
  16. #define THANATOS9_DAMAGE_STAB 100.0
  17.  
  18. #define THANATOS9_CHANGEA 5.0
  19. #define THANATOS9_CHANGEB 3.5
  20.  
  21. #define THANATOS9_SHOOT_START 1.0
  22. #define THANATOS9_SHOOT_END 1.0
  23.  
  24. #define DRAW_TIMEA 1.0
  25. #define DRAW_TIMEB 1.0
  26.  
  27. const OFFSET_WEAPONOWNER = 41
  28. const OFFSET_LINUX_WEAPONS = 4
  29. const m_flNextAttack = 83
  30.  
  31. #define CSW_THANATOS9 CSW_KNIFE
  32. #define weapon_thanatos9 "weapon_knife"
  33.  
  34. new v_model[] = "models/cso/v_thanatos9.mdl"
  35. new p_modela[] = "models/cso/p_thanatos9a.mdl"
  36. new p_modelb[] = "models/cso/p_thanatos9b.mdl"
  37.  
  38. new const hit_wall[] = "weapons/balrog9_wall.wav"
  39. new const hit_sound[] = "weapons/skullaxe_hit.wav"
  40.  
  41. new const thanatos9_sound[][] =
  42. {
  43.     "weapons/thanatos9_drawa.wav",
  44.     "weapons/thanatos9_shoota1.wav",
  45.     "weapons/thanatos9_shoota2.wav",
  46.     "weapons/thanatos9_shootb_end.wav",
  47.     "weapons/thanatos9_shootb_loop.wav",
  48.     "weapons/thanatos9_changea_1.wav",
  49.     "weapons/thanatos9_changea_2.wav",
  50.     "weapons/thanatos9_changea_3.wav",
  51.     "weapons/thanatos9_changea_4.wav",
  52.     "weapons/thanatos9_changeb_1.wav",
  53.     "weapons/thanatos9_changeb_2.wav"
  54. }
  55.  
  56. enum
  57. {
  58.     THANATOS9_ANIM_DRAWA = 0,
  59.     THANATOS9_ANIM_SHOOTB_LOOP,
  60.     THANATOS9_ANIM_SHOOTB_START,
  61.     THANATOS9_ANIM_SHOOTB_END,
  62.     THANATOS9_ANIM_IDLEB,
  63.     THANATOS9_ANIM_IDLEA,
  64.     THANATOS9_ANIM_DRAWB,
  65.     THANATOS9_ANIM_SHOOTA1,
  66.     THANATOS9_ANIM_SHOOTA2,
  67.     THANATOS9_ANIM_CHANGEA,
  68.     THANATOS9_ANIM_CHANGEB
  69. }
  70.  
  71. enum
  72. {
  73.     MODE_SLASH = 1,
  74.     MODE_CHANGEA,
  75.     MODE_CHANGEB,
  76.     MODE_STAB,
  77.     MODE_STAB_ACTION
  78. }
  79.  
  80. enum
  81. {
  82.     HIT_NOTHING = 0,
  83.     HIT_ENEMY,
  84.     HIT_WALL
  85. }
  86.  
  87. #define TASK_SLASHING 215842
  88.  
  89. new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10", "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550", "weapon_p228", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
  90. "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
  91. "weapon_ak47", "weapon_knife", "weapon_p90" }
  92.  
  93. new m_iBlood[2]
  94. new g_has_thanatos9[33], g_item
  95. new g_MaxPlayers, g_mode[33]
  96.  
  97. new Float:g_thanatos_swing_range = 1.8,Float:g_thanatos_stab_range = 0.8
  98.  
  99. public plugin_init()
  100. {
  101.     register_plugin(PLUGIN, VERSION, AUTHOR)
  102.    
  103.     register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
  104.     register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
  105.    
  106.     RegisterHam(Ham_Spawn, "player", "Player_Spawn", 1)
  107.     RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  108.     RegisterHam(Ham_Weapon_WeaponIdle, "weapon_knife", "fw_thanatosidleanim", 1)
  109.    
  110.     register_forward(FM_EmitSound, "fw_EmitSound")
  111.     register_forward(FM_CmdStart, "fw_CmdStart")
  112.     register_forward(FM_TraceLine, "fw_TraceLine")
  113.     register_forward(FM_TraceHull, "fw_TraceHull")
  114.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  115.    
  116.     for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
  117.     if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
  118.    
  119.     g_MaxPlayers = get_maxplayers()
  120.    
  121.     g_item = ze_register_item("Thanatos-9", 40, 0)
  122. }
  123.  
  124. public plugin_precache()
  125. {
  126.     precache_model(v_model)
  127.     precache_model(p_modela)
  128.     precache_model(p_modelb)
  129.    
  130.     precache_sound(hit_wall)
  131.     precache_sound(hit_sound)
  132.        
  133.     for(new i = 0; i < sizeof thanatos9_sound; i++)
  134.         precache_sound(thanatos9_sound[i])
  135.        
  136.     m_iBlood[0] = precache_model("sprites/blood.spr")
  137.     m_iBlood[1] = precache_model("sprites/bloodspray.spr")
  138. }
  139.  
  140. public ze_select_item_pre(id, iItemid, bIgnoreCost)
  141. {
  142.     if (iItemid != g_item)
  143.         return ZE_ITEM_AVAILABLE
  144.  
  145.     if (ze_is_user_zombie(id))
  146.         return  ZE_ITEM_DONT_SHOW
  147.  
  148.     return ZE_ITEM_AVAILABLE
  149. }
  150.  
  151. public ze_select_item_post(id, iItemid, bIgnoreCost)
  152. {
  153.     if (iItemid != g_item)
  154.         return
  155.  
  156.     get_thanatos9(id)
  157. }
  158.  
  159.  
  160. public client_connect(id) remove_thanatos9(id)
  161. public client_disconnected(id) remove_thanatos9(id)
  162. public Player_Spawn(id) remove_thanatos9(id)
  163. public fw_PlayerKilled(id) remove_thanatos9(id)
  164. public ze_user_infected(id) remove_thanatos9(id)
  165. public ze_user_humanized(id) remove_thanatos9(id)
  166.  
  167. public get_thanatos9(id)
  168. {
  169.     g_has_thanatos9[id] = 1
  170.     g_mode[id] = MODE_SLASH
  171.  
  172.     if(get_user_weapon(id) == CSW_KNIFE)
  173.     {
  174.         set_pev(id, pev_viewmodel2, v_model)
  175.        
  176.         set_weapon_anim(id, THANATOS9_ANIM_DRAWA)
  177.         set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEA)
  178.         set_player_nextattack(id, DRAW_TIMEA)
  179.        
  180.         static ent; ent = fm_get_user_weapon_entity(id, CSW_THANATOS9)
  181.         set_pdata_float(ent, 47, 9999.0, OFFSET_LINUX_WEAPONS)
  182.     } else {
  183.         engclient_cmd(id, weapon_thanatos9)
  184.     }
  185. }
  186.  
  187. public remove_thanatos9(id)
  188. {
  189.     g_has_thanatos9[id] = 0
  190.     g_mode[id] = 0
  191.     if(g_mode[id] == MODE_STAB_ACTION)
  192.     {
  193.         g_mode[id] = MODE_STAB
  194.         shoot_b_end(id)
  195.     }
  196. }
  197.  
  198. public fw_Item_Deploy_Post(weapon_ent)
  199. {
  200.     static owner
  201.     owner = fm_cs_get_weapon_ent_owner(weapon_ent)
  202.  
  203.     if(g_has_thanatos9[owner])
  204.     {
  205.     set_weapons_timeidle(owner, CSW_THANATOS9, 1.7)
  206.     // set_player_nextattack(owner, 1.7)
  207.     }
  208. }
  209.  
  210. public Event_CurWeapon(id)
  211. {
  212.     if(!is_user_alive(id))
  213.         return 1
  214.     if(get_user_weapon(id) != CSW_THANATOS9)
  215.         return 1
  216.     if(!g_has_thanatos9[id])
  217.         return 1
  218.        
  219.     set_pev(id, pev_viewmodel2, v_model)
  220.    
  221.     if(g_has_thanatos9[id])
  222.     {
  223.         if(g_mode[id] == MODE_SLASH)
  224.         {
  225.             set_pev(id, pev_weaponmodel2, p_modela)
  226.             set_weapon_anim(id, THANATOS9_ANIM_DRAWA)
  227.             set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEA)
  228.             set_player_nextattack(id, DRAW_TIMEA)
  229.         } else if(g_mode[id] == MODE_STAB)
  230.         {
  231.             set_pev(id, pev_weaponmodel2, p_modelb)
  232.             set_weapon_anim(id, THANATOS9_ANIM_DRAWB)
  233.             set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEB)
  234.             set_player_nextattack(id, DRAW_TIMEB)
  235.         } else if(g_mode[id] == MODE_STAB_ACTION)
  236.         {
  237.             set_pev(id, pev_weaponmodel2, p_modela)
  238.             set_weapon_anim(id, THANATOS9_ANIM_DRAWA)
  239.             set_weapons_timeidle(id, CSW_THANATOS9, DRAW_TIMEA)
  240.             set_player_nextattack(id, DRAW_TIMEA)
  241.             g_mode[id] = MODE_STAB
  242.             shoot_b_end(id)
  243.         }
  244.     }
  245.        
  246.     return 0
  247. }          
  248.  
  249. public Event_NewRound()
  250. {
  251.     for(new i = 0; i < g_MaxPlayers; i++)
  252.         remove_thanatos9(i)
  253. }
  254.  
  255. stock fm_cs_get_weapon_ent_owner(ent)
  256. {
  257.     return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
  258. }
  259.  
  260. public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
  261. {
  262.     if(!is_user_connected(id))
  263.         return FMRES_IGNORED
  264.     if(get_user_weapon(id) != CSW_THANATOS9 || !g_has_thanatos9[id])
  265.         return FMRES_IGNORED
  266.        
  267.     if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  268.     {
  269.         if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  270.         {
  271.             if(g_mode[id] == MODE_SLASH)
  272.             {
  273.                 set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  274.                 set_player_nextattack(id, 1.2)
  275.            
  276.                 emit_sound(id, CHAN_WEAPON, thanatos9_sound[random_num(2,3)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  277.             }
  278.             return FMRES_SUPERCEDE
  279.         }
  280.         if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') // hit
  281.         {
  282.             if (sample[17] == 'w') // wall
  283.             {
  284.                 if(g_mode[id] == MODE_SLASH)
  285.                 {
  286.                     set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  287.                     set_player_nextattack(id, 1.2)
  288.                
  289.                     emit_sound(id, CHAN_WEAPON, hit_wall, 1.0, ATTN_NORM, 0, PITCH_NORM)
  290.                 }
  291.                 return FMRES_SUPERCEDE
  292.             }
  293.             else
  294.             {
  295.                 if(g_mode[id] == MODE_SLASH)
  296.                 {
  297.                     set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  298.                     set_player_nextattack(id, 1.2)
  299.                
  300.                     emit_sound(id, CHAN_WEAPON, hit_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  301.                 }
  302.                 return FMRES_SUPERCEDE
  303.             }
  304.         }
  305.         if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
  306.         {
  307.             if(g_mode[id] == MODE_SLASH)
  308.             {
  309.                 set_weapons_timeidle(id, CSW_THANATOS9, 1.2)
  310.                 set_player_nextattack(id, 1.2)
  311.            
  312.                 emit_sound(id, CHAN_WEAPON, hit_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  313.             }
  314.             return FMRES_SUPERCEDE;
  315.         }
  316.     }
  317.    
  318.     return FMRES_IGNORED
  319. }
  320.  
  321. public fw_thanatosidleanim(Weapon)
  322. {
  323.     new id = get_pdata_cbase(Weapon, 41, 4)
  324.  
  325.     if(!is_user_alive(id) || ze_is_user_zombie(id) || !g_has_thanatos9[id] || get_user_weapon(id) != CSW_THANATOS9)
  326.         return HAM_IGNORED;
  327.        
  328.     if(g_mode[id] == MODE_SLASH && get_pdata_float(Weapon, 48, 4) <= 0.25)
  329.     {
  330.         set_weapon_anim(id, THANATOS9_ANIM_IDLEA)
  331.         set_pdata_float(Weapon, 48, 20.0, 4)
  332.         return HAM_SUPERCEDE;
  333.     }
  334.    
  335.     if(g_mode[id] == MODE_STAB && get_pdata_float(Weapon, 48, 4) <= 0.25)
  336.     {
  337.         set_weapon_anim(id, THANATOS9_ANIM_IDLEB)
  338.         set_pdata_float(Weapon, 48, 20.0, 4)
  339.         return HAM_SUPERCEDE;
  340.     }
  341.  
  342.     return HAM_IGNORED;
  343. }
  344.  
  345. public fw_CmdStart(id, uc_handle, seed)
  346. {
  347.     if (!is_user_alive(id))
  348.         return
  349.     if(get_user_weapon(id) != CSW_THANATOS9)
  350.         return
  351.     if(!g_has_thanatos9[id])
  352.         return
  353.    
  354.     static ent
  355.     ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  356.    
  357.     if(!pev_valid(ent))
  358.         return
  359.     if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
  360.         return
  361.    
  362.     static CurButton
  363.     CurButton = get_uc(uc_handle, UC_Buttons)
  364.    
  365.     if(CurButton & IN_ATTACK)
  366.     {
  367.         if(get_pdata_float(id, 83, 5) > 0.0)
  368.             return
  369.            
  370.         set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
  371.        
  372.         if(g_mode[id] == MODE_SLASH)
  373.         {
  374.             g_mode[id] = MODE_SLASH
  375.             set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_NEXTATTACK_SLASH)
  376.             set_player_nextattack(id, THANATOS9_NEXTATTACK_SLASH)
  377.             set_weapon_anim(id, random_num(THANATOS9_ANIM_SHOOTA1, THANATOS9_ANIM_SHOOTA2))
  378.            
  379.             set_task(1.2, "Do_Slashing", id+TASK_SLASHING)
  380.         }
  381.         else if(g_mode[id] == MODE_STAB)
  382.         {
  383.             g_mode[id] = MODE_STAB
  384.             shoot_b_start(id)
  385.             set_weapons_timeidle(id, CSW_THANATOS9, 0.1)
  386.             set_player_nextattack(id, THANATOS9_NEXTATTACK_STAB)
  387.         }
  388.     } else if (CurButton & IN_ATTACK2) {
  389.         if(get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0)
  390.             return
  391.            
  392.         if(g_mode[id] == MODE_SLASH)
  393.         {
  394.             set_weapons_timeidle(id, CSW_THANATOS9, 0.1)
  395.             set_player_nextattack(id, 0.1)
  396.             g_mode[id] = MODE_CHANGEA
  397.             set_task(0.1, "change_modea", id)
  398.         }
  399.         else if(g_mode[id] == MODE_STAB)
  400.         {
  401.             set_weapons_timeidle(id, CSW_THANATOS9, 0.1)
  402.             set_player_nextattack(id, 0.1)
  403.             g_mode[id] = MODE_CHANGEB
  404.             set_task(0.1, "change_modeb", id)
  405.         }
  406.     }
  407. }
  408.  
  409. public Do_Slashing(id)
  410. {
  411.     id -= TASK_SLASHING
  412.    
  413.     if(!is_user_alive(id))
  414.         return
  415.     if(get_user_weapon(id) != CSW_THANATOS9 || !g_has_thanatos9[id])
  416.         return
  417.        
  418.     static Ent
  419.     Ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  420.     new Float:origin[3]
  421.     pev(Ent, pev_origin, origin)
  422.    
  423.     new a = FM_NULLENT
  424.    
  425.     while((a = find_ent_in_sphere(a, origin, 80.0)) != 0)
  426.     {
  427.         if (id == a)
  428.             continue
  429.            
  430.         if (ze_is_user_zombie(id))
  431.             return
  432.    
  433.         if(pev(a, pev_takedamage) != DAMAGE_NO)
  434.         {
  435.             ExecuteHamB(Ham_TakeDamage, a, id, id, 400.0, DMG_BULLET)
  436.         }
  437.     }
  438.        
  439.     if(!Check_Attack(id, 1))
  440.     {
  441.         emit_sound(id, CHAN_WEAPON, thanatos9_sound[random_num(2,3)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  442.     } else {
  443.         emit_sound(id, CHAN_WEAPON, hit_sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  444.     }
  445. }
  446.  
  447. public change_modea(id)
  448. {
  449.     if(g_mode[id] == MODE_CHANGEA)
  450.     {
  451.         set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_CHANGEA)
  452.         set_player_nextattack(id, THANATOS9_CHANGEA)
  453.         set_weapon_anim(id, THANATOS9_ANIM_CHANGEA)
  454.         set_pev(id, pev_weaponmodel2, p_modelb)
  455.    
  456.         g_mode[id] = MODE_SLASH
  457.         set_task(THANATOS9_CHANGEA, "mode_b", id)
  458.     }
  459. }
  460.  
  461. public mode_b(id)
  462. {
  463.     g_mode[id] = MODE_STAB
  464. }
  465.  
  466. public change_modeb(id)
  467. {
  468.     if(g_mode[id] == MODE_CHANGEB)
  469.     {
  470.         set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_CHANGEB)
  471.         set_player_nextattack(id, THANATOS9_CHANGEB)
  472.         set_weapon_anim(id, THANATOS9_ANIM_CHANGEB)
  473.         set_pev(id, pev_weaponmodel2, p_modela)
  474.                
  475.         g_mode[id] = MODE_SLASH
  476.     }
  477. }
  478.  
  479. public shoot_b_start(id)
  480. {
  481.     if(g_mode[id] == MODE_STAB)
  482.     {
  483.         set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_SHOOT_START)
  484.         set_player_nextattack(id, THANATOS9_SHOOT_START)
  485.         set_weapon_anim(id, THANATOS9_ANIM_SHOOTB_START)
  486.                
  487.         g_mode[id] = MODE_STAB_ACTION
  488.         set_task(THANATOS9_SHOOT_START, "shoot_b_loop", id)
  489.     }
  490. }
  491.  
  492. public shoot_b_loop(id)
  493. {
  494.     if(g_mode[id] == MODE_STAB_ACTION)
  495.     {
  496.         set_weapons_timeidle(id, CSW_THANATOS9, 6.0)
  497.         set_player_nextattack(id, 0.0)
  498.         set_weapon_anim(id, THANATOS9_ANIM_SHOOTB_LOOP)
  499.         action_thanatos(id)
  500.         emit_sound(id, CHAN_WEAPON, thanatos9_sound[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
  501.                
  502.         g_mode[id] = MODE_STAB_ACTION
  503.     }
  504. }
  505.  
  506. public shoot_b_end(id)
  507. {
  508.     if(g_mode[id] == MODE_STAB)
  509.     {
  510.         remove_task(id)
  511.         emit_sound(id, CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  512.                
  513.         g_mode[id] = MODE_STAB
  514.         set_task(0.1, "shoot_b_end_finish", id)
  515.     }
  516. }
  517.  
  518. public shoot_b_end_finish(id)
  519. {
  520.     if(g_mode[id] == MODE_STAB)
  521.     {
  522.         set_weapons_timeidle(id, CSW_THANATOS9, THANATOS9_SHOOT_END)
  523.         set_player_nextattack(id, THANATOS9_SHOOT_END)
  524.         set_weapon_anim(id, THANATOS9_ANIM_SHOOTB_END)
  525.                
  526.         g_mode[id] = MODE_CHANGEB
  527.         set_task(THANATOS9_SHOOT_END, "change_modeb", id)
  528.     }
  529. }
  530.  
  531. public action_thanatos(id)
  532. {
  533.     static Ent
  534.     Ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  535.        
  536.     Damage_thanatos(Ent)
  537.     set_task(0.1, "action_thanatos", id)
  538. }
  539.  
  540. public Damage_thanatos(Ent)
  541. {
  542.     static id; id = pev(Ent, pev_owner)
  543.     new Float:origin[3]
  544.     pev(Ent, pev_origin, origin)
  545.    
  546.     new a = FM_NULLENT
  547.    
  548.     while((a = find_ent_in_sphere(a, origin, 80.0)) != 0)
  549.     {
  550.         if (id == a)
  551.             continue
  552.            
  553.         if (ze_is_user_zombie(id))
  554.             return
  555.    
  556.         if(pev(a, pev_takedamage) != DAMAGE_NO)
  557.         {
  558.             ExecuteHamB(Ham_TakeDamage, a, id, id, 400.0, DMG_BULLET)
  559.         }
  560.     }
  561.     set_task(0.1, "damage_thanatos9", id)
  562. }
  563.  
  564.  
  565. public damage_thanatos9(id)
  566. {
  567.     static Float:Max_Distance
  568.    
  569.     if(g_mode[id] == MODE_STAB_ACTION)
  570.     {
  571.         Max_Distance = THANATOS9_RANGE_STAB
  572.     }
  573.    
  574.     static Float:VicOrigin[3], Float:MyOrigin[3]
  575.     pev(id, pev_origin, MyOrigin)
  576.            
  577.     static Have_Victim; Have_Victim = 0
  578.     static ent
  579.     ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  580.        
  581.     if(!pev_valid(ent))
  582.         return 0
  583.        
  584.     for(new i = 0; i < get_maxplayers(); i++)
  585.     {
  586.         if(!is_user_alive(i))
  587.             continue
  588.         if(id == i)
  589.             continue
  590.         if(entity_range(id, i) > Max_Distance)
  591.             continue
  592.         pev(i, pev_origin, VicOrigin)
  593.         if(!is_in_viewcone(id, VicOrigin, 1))
  594.             continue
  595.         if(is_wall_between_points(MyOrigin, VicOrigin, id))
  596.             continue
  597.        
  598.         if(!Have_Victim) Have_Victim = 1
  599.         if(g_mode[id] == MODE_STAB_ACTION)
  600.         {
  601.             do_attack(id, i, ent, THANATOS9_DAMAGE_STAB)
  602.         }
  603.     }  
  604.    
  605.     stop_damage(id)
  606.    
  607.     if(Have_Victim)
  608.     {
  609.         return 1
  610.     }
  611.     else
  612.     {
  613.         return 0
  614.     }
  615.    
  616.     return 0
  617. }
  618.  
  619. public stop_damage(id)
  620. {
  621.     set_task(6.0, "shoot_b_end", id)
  622.     g_mode[id] = MODE_STAB
  623. }
  624.  
  625. public Check_Attack(id, First_Check)
  626. {
  627.     static Float:Max_Distance
  628.    
  629.     if(g_mode[id] == MODE_SLASH)
  630.     {
  631.         Max_Distance = THANATOS9_RANGE_SLASH
  632.     }
  633.    
  634.     static Float:VicOrigin[3], Float:MyOrigin[3]
  635.     pev(id, pev_origin, MyOrigin)
  636.        
  637.     static Have_Victim; Have_Victim = 0
  638.     static ent
  639.     ent = find_ent_by_owner(-1, weapon_thanatos9, id)
  640.        
  641.     if(!pev_valid(ent))
  642.         return 0
  643.        
  644.     for(new i = 0; i < get_maxplayers(); i++)
  645.     {
  646.         if(!is_user_alive(i))
  647.             continue
  648.         if(id == i)
  649.             continue
  650.         if(entity_range(id, i) > Max_Distance)
  651.             continue
  652.         pev(i, pev_origin, VicOrigin)
  653.         if(!is_in_viewcone(id, VicOrigin, 1))
  654.             continue
  655.         if(is_wall_between_points(MyOrigin, VicOrigin, id))
  656.             continue
  657.        
  658.         if(!Have_Victim) Have_Victim = 1
  659.         if(g_mode[id] == MODE_SLASH)
  660.         {
  661.             do_attack(id, i, ent, THANATOS9_DAMAGE_SLASH)
  662.             if(!First_Check && cs_get_user_team(id) != cs_get_user_team(i))
  663.             {
  664.                 // do_attack(id, i, ent, THANATOS9_DAMAGE_SLASH)
  665.             }
  666.         }
  667.     }  
  668.    
  669.     if(Have_Victim)
  670.     {
  671.         return 1
  672.     }
  673.     else
  674.     {
  675.         return 0
  676.     }
  677.    
  678.     return 0
  679. }  
  680.  
  681. public fw_TraceLine(Float:fStart[3], Float:fEnd[3], conditions, id, ptr){
  682.     return vTrace(id, ptr,fStart,fEnd,conditions)
  683. }
  684.  
  685. public fw_Tracehull(Float:fStart[3], Float:fEnd[3], conditions, hull, id, ptr){
  686.     return vTrace(id, ptr,fStart,fEnd,conditions,true,hull)
  687. }
  688.  
  689. vTrace(id, ptr,Float:fStart[3],Float:fEnd[3],iNoMonsters,bool:hull = false,iHull = 0)
  690. {  
  691.     if(is_user_alive(id) && get_user_weapon(id) == CSW_THANATOS9 && g_has_thanatos9[id]){      
  692.         new Float:scalar
  693.        
  694.         if(g_mode[id] == MODE_SLASH) scalar = g_thanatos_swing_range
  695.         else if(g_mode[id] == MODE_STAB_ACTION) scalar = g_thanatos_stab_range
  696.         else scalar = 0.0
  697.  
  698.         xs_vec_sub(fEnd,fStart,fEnd)
  699.         xs_vec_mul_scalar(fEnd,scalar,fEnd);
  700.         xs_vec_add(fEnd,fStart,fEnd);
  701.        
  702.         hull ? engfunc(EngFunc_TraceHull,fStart,fEnd,iNoMonsters,iHull,id,ptr) : engfunc(EngFunc_TraceLine,fStart,fEnd,iNoMonsters, id,ptr)
  703.     }
  704.    
  705.     return FMRES_IGNORED;
  706. }
  707.  
  708. public fw_TraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceHandle, DamageBit, ptr)
  709. {
  710.     if(!is_user_alive(Attacker))
  711.         return HAM_IGNORED
  712.     if(get_user_weapon(Attacker) != CSW_THANATOS9)
  713.         return HAM_IGNORED
  714.     if(!g_has_thanatos9[Attacker])
  715.         return HAM_IGNORED
  716.        
  717.    
  718.        
  719.     return HAM_IGNORED
  720. }
  721.  
  722. do_attack(Attacker, Victim, Inflictor, Float:fDamage)
  723. {
  724.     fake_player_trace_attack(Attacker, Victim, fDamage)
  725.     fake_take_damage(Attacker, Victim, fDamage, Inflictor)
  726. }
  727.  
  728. fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
  729. {
  730.     // get fDirection
  731.     new Float:fAngles[3], Float:fDirection[3]
  732.     pev(iAttacker, pev_angles, fAngles)
  733.     angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
  734.    
  735.     // get fStart
  736.     new Float:fStart[3], Float:fViewOfs[3]
  737.     pev(iAttacker, pev_origin, fStart)
  738.     pev(iAttacker, pev_view_ofs, fViewOfs)
  739.     xs_vec_add(fViewOfs, fStart, fStart)
  740.    
  741.     // get aimOrigin
  742.     new iAimOrigin[3], Float:fAimOrigin[3]
  743.     get_user_origin(iAttacker, iAimOrigin, 3)
  744.     IVecFVec(iAimOrigin, fAimOrigin)
  745.    
  746.     // TraceLine from fStart to AimOrigin
  747.     new ptr = create_tr2()
  748.     engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
  749.     new pHit = get_tr2(ptr, TR_pHit)
  750.     new iHitgroup = get_tr2(ptr, TR_iHitgroup)
  751.     new Float:fEndPos[3]
  752.     get_tr2(ptr, TR_vecEndPos, fEndPos)
  753.  
  754.     // get target & body at aiming
  755.     new iTarget, iBody
  756.     get_user_aiming(iAttacker, iTarget, iBody)
  757.    
  758.     // if aiming find target is iVictim then update iHitgroup
  759.     if (iTarget == iVictim)
  760.     {
  761.         iHitgroup = iBody
  762.     }
  763.    
  764.     // if ptr find target not is iVictim
  765.     else if (pHit != iVictim)
  766.     {
  767.         // get AimOrigin in iVictim
  768.         new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
  769.         pev(iVictim, pev_origin, fVicOrigin)
  770.         pev(iVictim, pev_view_ofs, fVicViewOfs)
  771.         xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
  772.         fAimInVictim[2] = fStart[2]
  773.         fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
  774.        
  775.         // check aim in size of iVictim
  776.         new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
  777.         iAngleToVictim = abs(iAngleToVictim)
  778.         new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
  779.         new Float:fVicSize[3]
  780.         pev(iVictim, pev_size , fVicSize)
  781.         if ( fDis <= fVicSize[0] * 0.5 )
  782.         {
  783.             // TraceLine from fStart to aimOrigin in iVictim
  784.             new ptr2 = create_tr2()
  785.             engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
  786.             new pHit2 = get_tr2(ptr2, TR_pHit)
  787.             new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
  788.            
  789.             // if ptr2 find target is iVictim
  790.             if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
  791.             {
  792.                 pHit = iVictim
  793.                 iHitgroup = iHitgroup2
  794.                 get_tr2(ptr2, TR_vecEndPos, fEndPos)
  795.             }
  796.            
  797.             free_tr2(ptr2)
  798.         }
  799.        
  800.         // if pHit still not is iVictim then set default HitGroup
  801.         if (pHit != iVictim)
  802.         {
  803.             // set default iHitgroup
  804.             iHitgroup = HIT_GENERIC
  805.            
  806.             new ptr3 = create_tr2()
  807.             engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
  808.             get_tr2(ptr3, TR_vecEndPos, fEndPos)
  809.            
  810.             // free ptr3
  811.             free_tr2(ptr3)
  812.         }
  813.     }
  814.    
  815.     // set new Hit & Hitgroup & EndPos
  816.     set_tr2(ptr, TR_pHit, iVictim)
  817.     set_tr2(ptr, TR_iHitgroup, iHitgroup)
  818.     set_tr2(ptr, TR_vecEndPos, fEndPos)
  819.    
  820.     // hitgroup multi fDamage
  821.     new Float:fMultifDamage
  822.     switch(iHitgroup)
  823.     {
  824.         case HIT_HEAD: fMultifDamage  = 2.5
  825.         case HIT_STOMACH: fMultifDamage  = 1.25
  826.         case HIT_LEFTLEG: fMultifDamage  = 0.75
  827.         case HIT_RIGHTLEG: fMultifDamage  = 0.75
  828.         default: fMultifDamage  = 1.0
  829.     }
  830.    
  831.     fDamage *= fMultifDamage
  832.    
  833.     // ExecuteHam
  834.     fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
  835.    
  836.     // free ptr
  837.     free_tr2(ptr)
  838. }
  839.  
  840. stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  841. {
  842.     ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
  843. }
  844.  
  845. stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
  846. {
  847.     iInflictor = (!iInflictor) ? iAttacker : iInflictor
  848.     ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
  849. }
  850.  
  851. stock set_weapon_anim(id, anim)
  852. {
  853.     if(!is_user_alive(id))
  854.         return
  855.        
  856.     set_pev(id, pev_weaponanim, anim)
  857.    
  858.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
  859.     write_byte(anim)
  860.     write_byte(0)
  861.     message_end()  
  862. }
  863.  
  864. stock set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
  865. {
  866.     if(!is_user_alive(id))
  867.         return
  868.        
  869.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
  870.     if(!pev_valid(entwpn))
  871.         return
  872.        
  873.     set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
  874.     set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
  875.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
  876. }
  877.  
  878. stock set_player_nextattack(id, Float:nexttime)
  879. {
  880.     if(!is_user_alive(id))
  881.         return
  882.        
  883.     set_pdata_float(id, m_flNextAttack, nexttime, 5)
  884. }
  885.  
  886. stock Get_MissileWeaponHitGroup( iEnt )
  887. {
  888.     new Float:flStart[ 3 ], Float:flEnd[ 3 ];
  889.    
  890.     pev( iEnt, pev_origin, flStart );
  891.     pev( iEnt, pev_velocity, flEnd );
  892.     xs_vec_add( flStart, flEnd, flEnd );
  893.    
  894.     new ptr = create_tr2();
  895.     engfunc( EngFunc_TraceLine, flStart, flEnd, 0, iEnt, ptr );
  896.    
  897.     new iHitGroup, Owner, nOhead, head
  898.     Owner = pev(iEnt, pev_owner)
  899.     nOhead = get_tr2( ptr, TR_iHitgroup )
  900.     head = set_tr2( ptr, TR_iHitgroup, HIT_HEAD )
  901.    
  902.     iHitGroup = is_user_alive(Owner) ? head : nOhead
  903.     free_tr2( ptr );
  904.    
  905.     return iHitGroup;
  906. }
  907.  
  908. stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
  909. {
  910.     new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
  911.     pev(id, pev_origin, fOrigin)
  912.     get_user_origin(id, iAimOrigin, 3) // end position from eyes
  913.     IVecFVec(iAimOrigin, fAimOrigin)
  914.     xs_vec_sub(fAimOrigin, fOrigin, fV1)
  915.    
  916.     new Float:fV2[3]
  917.     xs_vec_sub(fTarget, fOrigin, fV2)
  918.    
  919.     new iResult = get_angle_between_vectors(fV1, fV2)
  920.    
  921.     if (TargetSize > 0.0)
  922.     {
  923.         new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
  924.         new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
  925.         iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
  926.     }
  927.    
  928.     return iResult
  929. }
  930.  
  931. stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
  932. {
  933.     new Float:fA1[3], Float:fA2[3]
  934.     engfunc(EngFunc_VecToAngles, fV1, fA1)
  935.     engfunc(EngFunc_VecToAngles, fV2, fA2)
  936.    
  937.     new iResult = floatround(fA1[1] - fA2[1])
  938.     iResult = iResult % 360
  939.     iResult = (iResult > 180) ? (iResult - 360) : iResult
  940.    
  941.     return iResult
  942. }
  943.  
  944. stock is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
  945. {
  946.     static ptr
  947.     ptr = create_tr2()
  948.  
  949.     engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
  950.    
  951.     static Float:EndPos[3]
  952.     get_tr2(ptr, TR_vecEndPos, EndPos)
  953.  
  954.     free_tr2(ptr)
  955.     return floatround(get_distance_f(end, EndPos))
  956. }
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#3

Post by czirimbolo » 5 years ago

Thanks jack, its working, but when I have Rune Blade and zombie kills me, I am a zombie with a Rune Blade. Can you fix this and make this Rune Blade only for vips?
Image

User avatar
Raheem
Mod Developer
Mod Developer
Posts: 2214
Joined: 7 years ago
Contact:

#4

Post by Raheem » 5 years ago

Here fixed infected humans have rune blade. Also made it for VIPs only.
Make sure to enable ze_items_vip.amxx in plugins-zombie_escape.ini and VIP plugin must be installed.

You can change the flag from ze_extraitems.ini or change from here: ze_set_item_vip(g_iItemID, "VIP_A")

Version 1.3 of zombie escape required so this works, compile with latest compiler posted in releases:
  • Code: Select all

    #include <zombie_escape>
    #include <engine>
    #include <fakemeta_util>
    #include <cstrike>
    #include <xs>
     
    #define PLUGIN "[CSO] RUNE BLADE"
    #define VERSION "1.0"
    #define AUTHOR "TK N CASH"
     
    #define ADMIN_ACCESS        ADMIN_KICK
     
    // Draw Time
    #define DRAW_TIME 1.5
     
    // Next Attack Time
    #define NEXTATTACK_MISS 1.45
    #define NEXTATTACK_HIT 1.45
     
    // Next Attack Time
    #define NEXTATTACK_MISS1 1.45
    #define NEXTATTACK_HIT1 1.45
     
    // Attack Distance
    #define ATTACKDIS_SLASH 75.0
    #define ATTACKDIS_CHARGE 120.0
     
    // Attack Damage
    #define DAMAGE_SLASH 500.0
    #define DAMAGE_UNCHARGED 1000.0
    #define DAMAGE_CHARGE 2500.0
     
    // Charge Mode
    #define CHARGE_STARTTIME 0.75
    #define CHARGE_ATTACKTIME 0.75
    #define CHARGE_TIME 3.0
    #define CHARGE_NEXTATTACK 2.0
    #define CHARGE_EXPRADIUS 350
    #define CHARGE_ATTACK_KNOCKPOWER 100.0
     
    // Task
    #define TASK_CHARGE_STARTING 75675
    #define TASK_CHARGING 464334
     
    // Weapon info
    #define ITEM_NAME "RuneBlade"
    #define ITEM_COST 50
    #define ITEM_LIMIT 0
     
    // Models
    new const v_model[] = "models/v_runeblade.mdl"
    new const p_model[] = "models/p_runeblade.mdl"
     
    // Sprite
    new const exp_spr[] = "sprites/runeblade_ef.spr"
    new const exp_spr2[] = "sprites/runeblade_ef02.spr"
     
    new const weapon_sound[9][] =
    {
        "runeblade/draw.wav",
        "runeblade/miss.wav",
        "runeblade/miss.wav",
        "runeblade/hitwall.wav",
        "runeblade/hit.wav",
        "runeblade/hit.wav",
        "runeblade/charge_idle.wav",
        "runeblade/charge_finish1.wav",
        "runeblade/charge_hit.wav"
    }
     
    enum
    {
        B9_DRAW = 0,
        B9_SLASH1,
        B9_SLASH2,
        B9_HITWALL,
        B9_HIT1,
        B9_HIT2,
        B9_CHARGE_START,
        B9_CHARGE_FINISH,
        B9_CHARGE_ATTACK
    }
     
    new g_bot, g_exp_sprid, g_exp_sprid2
    new g_had_balrog9[33], g_attack_mode[33], g_charging[33], g_charged[33], g_chargeattack[33]
    new g_iItemID
     
    enum
    {
        MODE_NORMAL = 1,
        MODE_CHARGE
    }
     
    enum
    {
        KNIFE_ANIM_IDLE = 0,
        KNIFE_ANIM_SLASH1,
        KNIFE_ANIM_SLASH2,
        KNIFE_ANIM_DRAW,
        KNIFE_ANIM_STAB_HIT,
        KNIFE_ANIM_STAB_MISS,
        KNIFE_ANIM_MIDSLASH1,
        KNIFE_ANIM_MIDSLASH2
    }
     
    enum
    {
        BALROG9_ANIM_IDLE = 0,
        BALROG9_ANIM_SLASH1 = 1,
        BALROG9_ANIM_SLASH2 = 1,
        BALROG9_ANIM_SLASH3 = 1,
        BALROG9_ANIM_SLASH4 = 1,
        BALROG9_ANIM_SLASH5 = 1,
        BALROG9_ANIM_DRAW = 2,
        BALROG9_ANIM_CHARGE_START,
        BALROG9_ANIM_CHARGE_FINISH,
        BALROG9_ANIM_CHARGE_IDLE1,
        BALROG9_ANIM_CHARGE_IDLE2,
        BALROG9_ANIM_CHARGE_ATTACK1,
        BALROG9_ANIM_CHARGE_ATTACK2
    }
     
    public plugin_init()
    {
        register_plugin(PLUGIN, VERSION, AUTHOR)
     
        g_iItemID = ze_register_item(ITEM_NAME, ITEM_COST, ITEM_LIMIT)
    	ze_set_item_vip(g_iItemID, "VIP_A") // Powers of ZE v1.3 (Jacks idea) 
       
        register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
       
        register_forward(FM_EmitSound, "fw_EmitSound")
        register_forward(FM_CmdStart, "fw_CmdStart")
        register_forward(FM_TraceLine, "fw_TraceLine")
        register_forward(FM_TraceHull, "fw_TraceHull")     
        RegisterHam(Ham_CS_Weapon_SendWeaponAnim, "weapon_knife", "fw_Knife_SendAnim", 1)
        RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
        RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Post", 1)
        RegisterHam(Ham_Spawn, "player", "remove_balrog9", 1);
       
        register_clcmd ( "admin_get_runeblade", "get_balrog9", ADMIN_ACCESS );
       
        register_clcmd( "weapon_runeblade" , "Hook_WeaponList" );
    }
     
    public plugin_natives ( )
    {
        register_native ( "get_rune", "get_balrog9", 1 );
        register_native ( "remove_rune", "remove_balrog9", 1 );
    }
     
    public plugin_precache()
    {
        engfunc(EngFunc_PrecacheModel, v_model)
        engfunc(EngFunc_PrecacheModel, p_model)
       
        for(new i = 0; i < sizeof(weapon_sound); i++)
            engfunc(EngFunc_PrecacheSound, weapon_sound[i])
           
           
        g_exp_sprid = engfunc(EngFunc_PrecacheModel, exp_spr)
        g_exp_sprid2 = engfunc(EngFunc_PrecacheModel, exp_spr2)
       
        precache_generic("sprites/640hud81.spr")
        precache_generic("sprites/weapon_runeblade.txt")
    }
     
    public Hook_WeaponList( id )
    {
        engclient_cmd( id, "weapon_knife" )
        return PLUGIN_HANDLED;
    }
     
    public ze_select_item_pre(id, iItemid, bIgnoreCost)
    {
        if (iItemid != g_iItemID)
            return ZE_ITEM_AVAILABLE
     
        if (ze_is_user_zombie(id))
            return ZE_ITEM_DONT_SHOW
     
        return ZE_ITEM_AVAILABLE
    }
     
    public ze_select_item_post(id, iItemid, bIgnoreCost)
    {
        if (iItemid != g_iItemID)
            return
     
        get_balrog9(id)
    }
    
    public ze_user_infected(iVictim, iInfector)
    {
    	remove_balrog9(iVictim)
    }
     
    public get_balrog9(id)
    {
        g_had_balrog9[id] = 1
        g_attack_mode[id] = 0
        g_charged[id] = 0
        g_charging[id] = 0
        g_chargeattack[id] = 0
       
        Set_Sprite( id, "weapon_runeblade" )
       
        if(get_user_weapon(id) == CSW_KNIFE)
        {
            Event_CurWeapon(id)
            set_weapon_anim(id, BALROG9_ANIM_DRAW)
        }
    }
     
     
    public remove_balrog9(id)
    {
        g_had_balrog9[id] = 0
        g_attack_mode[id] = 0
        g_charged[id] = 0
        g_charging[id] = 0 
        g_chargeattack[id] = 0
       
        Set_Sprite( id, "weapon_knife" )
       
        remove_task(id+TASK_CHARGE_STARTING)
        remove_task(id+TASK_CHARGING)
    }
     
    public client_putinserver(id)
    {
        if(is_user_bot(id) && !g_bot)
        {
            g_bot = 1
            set_task(0.1, "Do_RegisterHamBot", id)
        }
    }
     
    public Do_RegisterHamBot(id)
    {
        RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
        RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Post", 1)
    }
     
    public Event_CurWeapon(id)
    {
        if(!is_user_alive(id))
            return 1
        if(get_user_weapon(id) != CSW_KNIFE)
            return 1
        if(!g_had_balrog9[id])
            return 1
           
        set_pev(id, pev_viewmodel2, v_model)
        set_pev(id, pev_weaponmodel2, p_model)
           
        return 0
    }
     
    public fw_Knife_SendAnim(ent, anim, skip_local)
    {
        if(!pev_valid(ent))
            return HAM_IGNORED
       
        new id
        id = get_pdata_cbase(ent, 41 , 4)
       
        if(!g_had_balrog9[id])
            return HAM_IGNORED
       
        static Float:PunchAngles[3]
       
        if(anim == KNIFE_ANIM_DRAW)
        {
            Set_Sprite( id, "weapon_runeblade" )
            set_weapons_timeidle(id, DRAW_TIME)
            set_player_nextattack(id, DRAW_TIME)   
           
            set_weapon_anim(id, BALROG9_ANIM_DRAW)
            Remove_OldStuff(id)
        } else if(anim == KNIFE_ANIM_MIDSLASH1) {
           
            set_pev(id, pev_punchangle, PunchAngles)
            set_weapon_anim(id, BALROG9_ANIM_SLASH1)
            Remove_OldStuff(id)
        } else if(anim == KNIFE_ANIM_MIDSLASH2) {
           
            set_pev(id, pev_punchangle, PunchAngles)
            set_weapon_anim(id, BALROG9_ANIM_SLASH2)
            Remove_OldStuff(id)
        } else if(anim == KNIFE_ANIM_STAB_HIT) {
           
            set_pev(id, pev_punchangle, PunchAngles)
           
            if(g_chargeattack[id] == 2)
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK2)
                set_task(0.18,"Effect_ChargedAttack",id)
            } else
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK1)
                SetHamParamFloat(3, DAMAGE_UNCHARGED)
            }
        } else if(anim == KNIFE_ANIM_STAB_MISS) {
           
            if(g_chargeattack[id] == 2)
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK2)
                set_task(0.18,"Effect_ChargedAttack",id)
            } else
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK1)
                SetHamParamFloat(3, DAMAGE_UNCHARGED)
            }
        }
     
        return HAM_IGNORED
    }
     
    public Remove_OldStuff(id)
    {
        g_charging[id] = 0
        g_charged[id] = 0
        g_chargeattack[id] = 0
     
        remove_task(id+TASK_CHARGE_STARTING)
        remove_task(id+TASK_CHARGING)  
    }
     
    public Effect_ChargedAttack(id)
    {
        static Float:Origin[3]
        get_position(id, 36.0, 0.0, 0.0, Origin)
       
        emit_sound(id, CHAN_WEAPON, weapon_sound[B9_CHARGE_ATTACK], 1.0, ATTN_NORM, 0, PITCH_NORM)
       
        // Exp
        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, Origin[0])
        engfunc(EngFunc_WriteCoord, Origin[1])
        engfunc(EngFunc_WriteCoord, Origin[2])
        write_short(g_exp_sprid)    // sprite index
        write_byte(8)   // scale in 0.1's
        write_byte(24)  // framerate
        write_byte(4)   // flags
        message_end()
       
        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, Origin[0])
        engfunc(EngFunc_WriteCoord, Origin[1])
        engfunc(EngFunc_WriteCoord, Origin[2])
        write_short(g_exp_sprid2)   // sprite index
        write_byte(7)   // scale in 0.1's
        write_byte(30)  // framerate
        write_byte(4)   // flags
        message_end()
       
        // Check Attack Damage
        //HamRadiusDamage(id, fm_get_user_weapon_entity(id, CSW_KNIFE), , , DMG_BURN)
     
        for(new i = 0; i < get_maxplayers(); i++)
        {
            if(!is_user_alive(i))
                continue
            if(id == i)
                continue
            if(cs_get_user_team(i) == cs_get_user_team(id))
                continue
            if(entity_range(i, id) > float(CHARGE_EXPRADIUS))
                continue
               
            ExecuteHamB(Ham_TakeDamage, i, fm_get_user_weapon_entity(id, CSW_KNIFE), id, DAMAGE_CHARGE, DMG_BLAST) 
        }
    }
     
    stock HamRadiusDamage(id, ent, Float:radius, Float:damage, bits, iVictim)
    {
        static target, Float:origin[3]
       
        target = -1
        pev(ent, pev_origin, origin)
         
        while((target = find_ent_in_sphere(target, origin, radius) ))
        {
            static Float:o[3]
            pev(target, pev_origin, o)
             
            xs_vec_sub(origin, o, o)
             
            // Recheck if the entity is in radius
            if (xs_vec_len(o) > radius)
                continue
           
            if(is_user_alive(target))
            {
                if(id == target)
                    continue
                if(cs_get_user_team(id) == cs_get_user_team(target))
                    continue
            }
             
            Ham_ExecDamageB(target, ent, id, damage * (xs_vec_len(o) / radius), HIT_GENERIC, bits)
        }
    }  
     
    stock Ham_ExecDamageB(victim, inflictor, attacker, Float:damage, hitgroup, bits)
    {
        static const Float:hitgroup_multi[] =
        {
            1.0,  // HIT_GENERIC
            4.0,  // HIT_HEAD
            1.0,  // HIT_CHEST
            1.25, // HIT_STOMACH
            1.0,  // HIT_LEFTARM
            1.0,  // HIT_RIGHTARM
            0.75, // HIT_LEFTLEG
            0.75,  // HIT_RIGHTLEG
            0.0   // HIT_SHIELD
        }
       
        set_pdata_int(victim, 75, hitgroup, 5)
        ExecuteHamB(Ham_TakeDamage, victim, inflictor, attacker, damage * hitgroup_multi[hitgroup], bits)
    }
     
    public fw_TraceAttack(ent, attacker, Float:Damage, Float:Dir[3], ptr, DamageType, iVictim)
    {
        if(!is_user_alive(attacker))
            return HAM_IGNORED
        if(get_user_weapon(attacker) != CSW_KNIFE || !g_had_balrog9[attacker])
            return HAM_IGNORED
           
        if(g_attack_mode[attacker] == MODE_NORMAL) SetHamParamFloat(3, DAMAGE_SLASH)
        if(g_attack_mode[attacker] == MODE_CHARGE) SetHamParamFloat(3, DAMAGE_CHARGE)
       
        return HAM_HANDLED
    }
     
    public fw_TraceAttack_Post(ent, attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
    {
        if(!is_user_alive(attacker))
            return HAM_IGNORED
        if(get_user_weapon(attacker) != CSW_KNIFE || !g_had_balrog9[attacker])
            return HAM_IGNORED
        if(g_attack_mode[attacker] == MODE_CHARGE)
        {
            if(g_chargeattack[attacker] == 2) // Do KnockBack Here
            {
                static Float:Origin[3]
                pev(attacker, pev_origin, Origin)
               
                hook_ent2(ent, Origin, CHARGE_ATTACK_KNOCKPOWER, 2)
            }
        }
       
        return HAM_HANDLED
    }
     
    public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
    {
        if(!is_user_connected(id))
            return FMRES_IGNORED
        if(get_user_weapon(id) != CSW_KNIFE || !g_had_balrog9[id])
            return FMRES_IGNORED
           
        if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
        {
            if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
            {
                set_weapons_timeidle(id, NEXTATTACK_MISS)
                set_player_nextattack(id, NEXTATTACK_MISS)
               
                if(g_attack_mode[id] == MODE_CHARGE)
                {
                    if(g_chargeattack[id] == 2)
                        emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                    else
                        emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                } else emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                return FMRES_SUPERCEDE
            }
            if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') // hit
            {
                if (sample[17] == 'w') // wall
                {
                    set_weapons_timeidle(id, NEXTATTACK_HIT)
                    set_player_nextattack(id, NEXTATTACK_HIT)  
                   
                    if(g_attack_mode[id] == MODE_CHARGE)
                    {
                        if(g_chargeattack[id] == 2)
                            emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                        else
                            emit_sound(id, channel, weapon_sound[B9_HITWALL], volume, attn, flags, pitch)
                    } else emit_sound(id, channel, weapon_sound[B9_HITWALL], volume, attn, flags, pitch)
                    return FMRES_SUPERCEDE
                } else {
                    set_weapons_timeidle(id, NEXTATTACK_HIT)
                    set_player_nextattack(id, NEXTATTACK_HIT)
                   
                    if(g_attack_mode[id] == MODE_CHARGE)
                    {
                        if(g_chargeattack[id] == 2)
                            emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                        else
                            emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                    } else emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                    return FMRES_SUPERCEDE
                }
            }
            if(sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
            {
                if(g_chargeattack[id] == 2)
                    emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                else
                    emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                   
                return FMRES_SUPERCEDE
            }
        }
       
        return FMRES_IGNORED
    }
     
    public sound1(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
    {
        emit_sound(id, channel, weapon_sound[B9_CHARGE_ATTACK], volume, attn, flags, pitch)
    }
     
    public fw_CmdStart(id, uc_handle, seed)
    {
        if (!is_user_alive(id))
            return
        if(get_user_weapon(id) != CSW_KNIFE)
            return
        if(!g_had_balrog9[id])
            return
       
        static ent
        ent = find_ent_by_owner(-1, "weapon_knife", id)
       
        if(!pev_valid(ent))
            return
       
        static CurButton, OldButton
       
        CurButton = get_uc(uc_handle, UC_Buttons)
        OldButton = (pev(id, pev_oldbuttons) & IN_ATTACK2)
       
        if(CurButton & IN_ATTACK)
        {
            if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
                return
           
            g_attack_mode[id] = MODE_NORMAL
            set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
        } else {
            if(CurButton & IN_ATTACK2)
            {
                set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
                set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
               
                if(OldButton) // Holding This Button
                {
                    if(g_charging[id] == 2)
                    {
                        if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
                            return
                       
                        if(g_charged[id])
                        {
                            set_weapons_timeidle(id, 99999.0)
                            set_player_nextattack(id, 99999.0)
                           
                            if(pev(id, pev_weaponanim) != BALROG9_ANIM_CHARGE_IDLE2)
                                set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE2)
                        } else {
                            set_weapons_timeidle(id, 99999.5)
                            set_player_nextattack(id, 9999.5)
                           
                            if(pev(id, pev_weaponanim) != BALROG9_ANIM_CHARGE_IDLE1)
                                set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE1)
                        }
                    }
                }      
               
                if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
                    return
               
                remove_task(id+TASK_CHARGE_STARTING)
                remove_task(id+TASK_CHARGING)  
               
                g_attack_mode[id] = MODE_CHARGE
                g_charging[id] = 1
                g_charged[id] = 0
                g_chargeattack[id] = 1
               
                set_weapons_timeidle(id, CHARGE_STARTTIME + 0.25)
                set_player_nextattack(id, CHARGE_STARTTIME + 0.25)
           
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_START)
               
                set_task(CHARGE_STARTTIME, "Do_HoldCharge", id+TASK_CHARGE_STARTING)
                set_task(CHARGE_TIME, "Do_SetCharge", id+TASK_CHARGING)
            } else {
                if(OldButton) // After Press this Button (no Hold)
                {
                    if(g_charging[id] == 2)
                    {
                        if(g_chargeattack[id])
                        {
                            ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
           
                            set_weapons_timeidle(id, CHARGE_NEXTATTACK)
                            set_player_nextattack(id, CHARGE_NEXTATTACK)
                           
                            g_charging[id] = 0
                            g_charged[id] = 0
                            g_chargeattack[id] = 0
                           
                            remove_task(id+TASK_CHARGE_STARTING)
                            remove_task(id+TASK_CHARGING)
                        }
                    }
                }
            }
        }
    }
     
    public Do_SetCharge(id)
    {
        id -= TASK_CHARGING
       
        if(!is_user_alive(id))
            return
        if(get_user_weapon(id) != CSW_KNIFE)
            return
        if(!g_had_balrog9[id])
            return
           
        g_charging[id] = 2
        g_charged[id] = 1
        g_chargeattack[id] = 2
       
        set_weapons_timeidle(id, 0.25)
        set_player_nextattack(id, 0.25)
                           
        set_weapon_anim(id, BALROG9_ANIM_CHARGE_FINISH)
    }
     
    public Do_HoldCharge(id)
    {
        id -= TASK_CHARGE_STARTING
       
        if(!is_user_alive(id))
            return
        if(get_user_weapon(id) != CSW_KNIFE)
            return
        if(!g_had_balrog9[id])
            return
           
        if(!(pev(id, pev_button) & IN_ATTACK2) && !(pev(id, pev_oldbuttons) & IN_ATTACK2))
        {
            static ent
            ent = find_ent_by_owner(-1, "weapon_knife", id)
       
            if(!pev_valid(ent))
                return     
               
            ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
           
            set_weapons_timeidle(id, CHARGE_NEXTATTACK)
            set_player_nextattack(id, CHARGE_NEXTATTACK)
           
            g_charging[id] = 0
            g_charged[id] = 0
            g_chargeattack[id] = 0
           
            remove_task(id+TASK_CHARGE_STARTING)
            remove_task(id+TASK_CHARGING)
                           
            return
        }
       
        g_charging[id] = 2
        g_chargeattack[id] = 1
        g_charged[id] = 0
           
        set_weapons_timeidle(id, CHARGE_TIME + 0.25)
        set_player_nextattack(id, CHARGE_TIME + 0.25)
           
        set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE1) 
    }
     
    public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
    {
        if (!is_user_alive(id))
            return FMRES_IGNORED   
        if (get_user_weapon(id) != CSW_KNIFE)
            return FMRES_IGNORED
        if(!g_had_balrog9[id])
            return FMRES_IGNORED
       
        static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
       
        pev(id, pev_origin, fOrigin)
        pev(id, pev_view_ofs, view_ofs)
        xs_vec_add(fOrigin, view_ofs, vecStart)
        pev(id, pev_v_angle, v_angle)
       
        engfunc(EngFunc_MakeVectors, v_angle)
        get_global_vector(GL_v_forward, v_forward)
     
        if(g_attack_mode[id] == MODE_NORMAL)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_SLASH, v_forward)
        else if(g_attack_mode[id] == MODE_CHARGE)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_CHARGE, v_forward)
       
        xs_vec_add(vecStart, v_forward, vecEnd)
        engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
       
        return FMRES_SUPERCEDE
    }
     
    public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
    {
        if (!is_user_alive(id))
            return FMRES_IGNORED
        if (get_user_weapon(id) != CSW_KNIFE)
            return FMRES_IGNORED
        if(!g_had_balrog9[id])
            return FMRES_IGNORED
       
        static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
       
        pev(id, pev_origin, fOrigin)
        pev(id, pev_view_ofs, view_ofs)
        xs_vec_add(fOrigin, view_ofs, vecStart)
        pev(id, pev_v_angle, v_angle)
       
        engfunc(EngFunc_MakeVectors, v_angle)
        get_global_vector(GL_v_forward, v_forward)
     
        if(g_attack_mode[id] == MODE_NORMAL)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_SLASH, v_forward)
        else if(g_attack_mode[id] == MODE_CHARGE)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_CHARGE, v_forward)
           
        xs_vec_add(vecStart, v_forward, vecEnd)
        engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
       
        return FMRES_SUPERCEDE
    }
     
    stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
    {
        new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
       
        pev(ent, pev_origin, vOrigin)
        pev(ent, pev_view_ofs,vUp) //for player
        xs_vec_add(vOrigin,vUp,vOrigin)
        pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
       
        angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
        angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
        angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
       
        vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
        vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
        vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    }
       
    stock set_weapons_timeidle(id, Float:TimeIdle)
    {
        if(!is_user_alive(id))
            return
           
        new entwpn = fm_get_user_weapon_entity(id, CSW_KNIFE)
        if (pev_valid(entwpn))
        {
            set_pdata_float(entwpn, 46, TimeIdle, 4)
            set_pdata_float(entwpn, 47, TimeIdle, 4)
            set_pdata_float(entwpn, 48, TimeIdle + 1.0, 4)
        }
    }
     
    stock set_player_nextattack(id, Float:nexttime)
    {
        if(!is_user_alive(id))
            return
           
        const m_flNextAttack = 83
        set_pdata_float(id, m_flNextAttack, nexttime, 5)
    }
     
    stock set_weapon_anim(id, anim)
    {
        if(!is_user_alive(id))
            return
           
        set_pev(id, pev_weaponanim, anim)
       
        message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
        write_byte(anim)
        write_byte(0)
        message_end()  
    }
     
    stock hook_ent2(ent, Float:VicOrigin[3], Float:speed, type)
    {
        static Float:fl_Velocity[3]
        static Float:EntOrigin[3]
       
        pev(ent, pev_origin, EntOrigin)
        static Float:distance_f
        distance_f = get_distance_f(EntOrigin, VicOrigin)
       
        new Float:fl_Time = distance_f / speed
       
        VicOrigin[2] -= 36.0
       
        if(type == 1)
        {
            fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time) * 1.5
            fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time) * 1.5
            fl_Velocity[2] = ((VicOrigin[2] - EntOrigin[2]) / fl_Time) * 1.5
        } else if(type == 2) {
            fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time) * 1.5
            fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time) * 1.5
            fl_Velocity[2] = ((EntOrigin[2] - VicOrigin[2]) / fl_Time) * 1.5
        }
     
        entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
    }
     
    Set_Sprite( iPlayer, const Weapon[ ] )
    {
        if( ! pev_valid( iPlayer ) )
                    return;
     
        message_begin( MSG_ONE , get_user_msgid( "WeaponList" ) , _, iPlayer )
        write_string( Weapon )
        write_byte( -1 )
        write_byte( -1)
        write_byte( -1 )
        write_byte( -1 )
        write_byte( 2 )
        write_byte( 1 )
        write_byte( 29 )
        write_byte( 0 )
        message_end( )
    }
He who fails to plan is planning to fail

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#5

Post by czirimbolo » 5 years ago

After one minute, server crashes:

07/25/2018 - 21:35:14: [HAMSANDWICH] Wrong data type (data is of type float)
L 07/25/2018 - 21:35:14: [AMXX] Displaying debug trace (plugin "weapon_runeblade.amxx", version "1.0")
L 07/25/2018 - 21:35:14: [AMXX] Run time error 10: native error (native "SetHamParamFloat")
L 07/25/2018 - 21:35:14: [AMXX] [0] weapon_runeblade.sma::fw_Knife_SendAnim (line 302)
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#6

Post by czirimbolo » 5 years ago

L 07/25/2018 - 21:57:32: [HAMSANDWICH] Wrong data type (data is of type float)
L 07/25/2018 - 21:57:32: [AMXX] Displaying debug trace (plugin "weapon_runeblade.amxx", version "1.0")
L 07/25/2018 - 21:57:32: [AMXX] Run time error 10: native error (native "SetHamParamFloat")
L 07/25/2018 - 21:57:32: [AMXX] [0] weapon_runeblade.sma::fw_Knife_SendAnim (line 313)
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#7

Post by Night Fury » 5 years ago

As i told you, the weapon itself is bugged.
You asked for conversion & we did it.
You faced few problems aren't related to our mod so we don't care about it.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
konno
Member
Member
Brazil
Posts: 44
Joined: 6 years ago
Location: Brazil
Contact:

#8

Post by konno » 5 years ago

Raheem wrote: 5 years ago Here fixed infected humans have rune blade. Also made it for VIPs only.
Make sure to enable ze_items_vip.amxx in plugins-zombie_escape.ini and VIP plugin must be installed.

You can change the flag from ze_extraitems.ini or change from here: ze_set_item_vip(g_iItemID, "VIP_A")

Version 1.3 of zombie escape required so this works, compile with latest compiler posted in releases:
  • Code: Select all

    #include <zombie_escape>
    #include <engine>
    #include <fakemeta_util>
    #include <cstrike>
    #include <xs>
     
    #define PLUGIN "[CSO] RUNE BLADE"
    #define VERSION "1.0"
    #define AUTHOR "TK N CASH"
     
    #define ADMIN_ACCESS        ADMIN_KICK
     
    // Draw Time
    #define DRAW_TIME 1.5
     
    // Next Attack Time
    #define NEXTATTACK_MISS 1.45
    #define NEXTATTACK_HIT 1.45
     
    // Next Attack Time
    #define NEXTATTACK_MISS1 1.45
    #define NEXTATTACK_HIT1 1.45
     
    // Attack Distance
    #define ATTACKDIS_SLASH 75.0
    #define ATTACKDIS_CHARGE 120.0
     
    // Attack Damage
    #define DAMAGE_SLASH 500.0
    #define DAMAGE_UNCHARGED 1000.0
    #define DAMAGE_CHARGE 2500.0
     
    // Charge Mode
    #define CHARGE_STARTTIME 0.75
    #define CHARGE_ATTACKTIME 0.75
    #define CHARGE_TIME 3.0
    #define CHARGE_NEXTATTACK 2.0
    #define CHARGE_EXPRADIUS 350
    #define CHARGE_ATTACK_KNOCKPOWER 100.0
     
    // Task
    #define TASK_CHARGE_STARTING 75675
    #define TASK_CHARGING 464334
     
    // Weapon info
    #define ITEM_NAME "RuneBlade"
    #define ITEM_COST 50
    #define ITEM_LIMIT 0
     
    // Models
    new const v_model[] = "models/v_runeblade.mdl"
    new const p_model[] = "models/p_runeblade.mdl"
     
    // Sprite
    new const exp_spr[] = "sprites/runeblade_ef.spr"
    new const exp_spr2[] = "sprites/runeblade_ef02.spr"
     
    new const weapon_sound[9][] =
    {
        "runeblade/draw.wav",
        "runeblade/miss.wav",
        "runeblade/miss.wav",
        "runeblade/hitwall.wav",
        "runeblade/hit.wav",
        "runeblade/hit.wav",
        "runeblade/charge_idle.wav",
        "runeblade/charge_finish1.wav",
        "runeblade/charge_hit.wav"
    }
     
    enum
    {
        B9_DRAW = 0,
        B9_SLASH1,
        B9_SLASH2,
        B9_HITWALL,
        B9_HIT1,
        B9_HIT2,
        B9_CHARGE_START,
        B9_CHARGE_FINISH,
        B9_CHARGE_ATTACK
    }
     
    new g_bot, g_exp_sprid, g_exp_sprid2
    new g_had_balrog9[33], g_attack_mode[33], g_charging[33], g_charged[33], g_chargeattack[33]
    new g_iItemID
     
    enum
    {
        MODE_NORMAL = 1,
        MODE_CHARGE
    }
     
    enum
    {
        KNIFE_ANIM_IDLE = 0,
        KNIFE_ANIM_SLASH1,
        KNIFE_ANIM_SLASH2,
        KNIFE_ANIM_DRAW,
        KNIFE_ANIM_STAB_HIT,
        KNIFE_ANIM_STAB_MISS,
        KNIFE_ANIM_MIDSLASH1,
        KNIFE_ANIM_MIDSLASH2
    }
     
    enum
    {
        BALROG9_ANIM_IDLE = 0,
        BALROG9_ANIM_SLASH1 = 1,
        BALROG9_ANIM_SLASH2 = 1,
        BALROG9_ANIM_SLASH3 = 1,
        BALROG9_ANIM_SLASH4 = 1,
        BALROG9_ANIM_SLASH5 = 1,
        BALROG9_ANIM_DRAW = 2,
        BALROG9_ANIM_CHARGE_START,
        BALROG9_ANIM_CHARGE_FINISH,
        BALROG9_ANIM_CHARGE_IDLE1,
        BALROG9_ANIM_CHARGE_IDLE2,
        BALROG9_ANIM_CHARGE_ATTACK1,
        BALROG9_ANIM_CHARGE_ATTACK2
    }
     
    public plugin_init()
    {
        register_plugin(PLUGIN, VERSION, AUTHOR)
     
        g_iItemID = ze_register_item(ITEM_NAME, ITEM_COST, ITEM_LIMIT)
    	ze_set_item_vip(g_iItemID, "VIP_A") // Powers of ZE v1.3 (Jacks idea) 
       
        register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
       
        register_forward(FM_EmitSound, "fw_EmitSound")
        register_forward(FM_CmdStart, "fw_CmdStart")
        register_forward(FM_TraceLine, "fw_TraceLine")
        register_forward(FM_TraceHull, "fw_TraceHull")     
        RegisterHam(Ham_CS_Weapon_SendWeaponAnim, "weapon_knife", "fw_Knife_SendAnim", 1)
        RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
        RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Post", 1)
        RegisterHam(Ham_Spawn, "player", "remove_balrog9", 1);
       
        register_clcmd ( "admin_get_runeblade", "get_balrog9", ADMIN_ACCESS );
       
        register_clcmd( "weapon_runeblade" , "Hook_WeaponList" );
    }
     
    public plugin_natives ( )
    {
        register_native ( "get_rune", "get_balrog9", 1 );
        register_native ( "remove_rune", "remove_balrog9", 1 );
    }
     
    public plugin_precache()
    {
        engfunc(EngFunc_PrecacheModel, v_model)
        engfunc(EngFunc_PrecacheModel, p_model)
       
        for(new i = 0; i < sizeof(weapon_sound); i++)
            engfunc(EngFunc_PrecacheSound, weapon_sound[i])
           
           
        g_exp_sprid = engfunc(EngFunc_PrecacheModel, exp_spr)
        g_exp_sprid2 = engfunc(EngFunc_PrecacheModel, exp_spr2)
       
        precache_generic("sprites/640hud81.spr")
        precache_generic("sprites/weapon_runeblade.txt")
    }
     
    public Hook_WeaponList( id )
    {
        engclient_cmd( id, "weapon_knife" )
        return PLUGIN_HANDLED;
    }
     
    public ze_select_item_pre(id, iItemid, bIgnoreCost)
    {
        if (iItemid != g_iItemID)
            return ZE_ITEM_AVAILABLE
     
        if (ze_is_user_zombie(id))
            return ZE_ITEM_DONT_SHOW
     
        return ZE_ITEM_AVAILABLE
    }
     
    public ze_select_item_post(id, iItemid, bIgnoreCost)
    {
        if (iItemid != g_iItemID)
            return
     
        get_balrog9(id)
    }
    
    public ze_user_infected(iVictim, iInfector)
    {
    	remove_balrog9(iVictim)
    }
     
    public get_balrog9(id)
    {
        g_had_balrog9[id] = 1
        g_attack_mode[id] = 0
        g_charged[id] = 0
        g_charging[id] = 0
        g_chargeattack[id] = 0
       
        Set_Sprite( id, "weapon_runeblade" )
       
        if(get_user_weapon(id) == CSW_KNIFE)
        {
            Event_CurWeapon(id)
            set_weapon_anim(id, BALROG9_ANIM_DRAW)
        }
    }
     
     
    public remove_balrog9(id)
    {
        g_had_balrog9[id] = 0
        g_attack_mode[id] = 0
        g_charged[id] = 0
        g_charging[id] = 0 
        g_chargeattack[id] = 0
       
        Set_Sprite( id, "weapon_knife" )
       
        remove_task(id+TASK_CHARGE_STARTING)
        remove_task(id+TASK_CHARGING)
    }
     
    public client_putinserver(id)
    {
        if(is_user_bot(id) && !g_bot)
        {
            g_bot = 1
            set_task(0.1, "Do_RegisterHamBot", id)
        }
    }
     
    public Do_RegisterHamBot(id)
    {
        RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
        RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack_Post", 1)
    }
     
    public Event_CurWeapon(id)
    {
        if(!is_user_alive(id))
            return 1
        if(get_user_weapon(id) != CSW_KNIFE)
            return 1
        if(!g_had_balrog9[id])
            return 1
           
        set_pev(id, pev_viewmodel2, v_model)
        set_pev(id, pev_weaponmodel2, p_model)
           
        return 0
    }
     
    public fw_Knife_SendAnim(ent, anim, skip_local)
    {
        if(!pev_valid(ent))
            return HAM_IGNORED
       
        new id
        id = get_pdata_cbase(ent, 41 , 4)
       
        if(!g_had_balrog9[id])
            return HAM_IGNORED
       
        static Float:PunchAngles[3]
       
        if(anim == KNIFE_ANIM_DRAW)
        {
            Set_Sprite( id, "weapon_runeblade" )
            set_weapons_timeidle(id, DRAW_TIME)
            set_player_nextattack(id, DRAW_TIME)   
           
            set_weapon_anim(id, BALROG9_ANIM_DRAW)
            Remove_OldStuff(id)
        } else if(anim == KNIFE_ANIM_MIDSLASH1) {
           
            set_pev(id, pev_punchangle, PunchAngles)
            set_weapon_anim(id, BALROG9_ANIM_SLASH1)
            Remove_OldStuff(id)
        } else if(anim == KNIFE_ANIM_MIDSLASH2) {
           
            set_pev(id, pev_punchangle, PunchAngles)
            set_weapon_anim(id, BALROG9_ANIM_SLASH2)
            Remove_OldStuff(id)
        } else if(anim == KNIFE_ANIM_STAB_HIT) {
           
            set_pev(id, pev_punchangle, PunchAngles)
           
            if(g_chargeattack[id] == 2)
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK2)
                set_task(0.18,"Effect_ChargedAttack",id)
            } else
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK1)
                SetHamParamFloat(3, DAMAGE_UNCHARGED)
            }
        } else if(anim == KNIFE_ANIM_STAB_MISS) {
           
            if(g_chargeattack[id] == 2)
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK2)
                set_task(0.18,"Effect_ChargedAttack",id)
            } else
            {
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_ATTACK1)
                SetHamParamFloat(3, DAMAGE_UNCHARGED)
            }
        }
     
        return HAM_IGNORED
    }
     
    public Remove_OldStuff(id)
    {
        g_charging[id] = 0
        g_charged[id] = 0
        g_chargeattack[id] = 0
     
        remove_task(id+TASK_CHARGE_STARTING)
        remove_task(id+TASK_CHARGING)  
    }
     
    public Effect_ChargedAttack(id)
    {
        static Float:Origin[3]
        get_position(id, 36.0, 0.0, 0.0, Origin)
       
        emit_sound(id, CHAN_WEAPON, weapon_sound[B9_CHARGE_ATTACK], 1.0, ATTN_NORM, 0, PITCH_NORM)
       
        // Exp
        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, Origin[0])
        engfunc(EngFunc_WriteCoord, Origin[1])
        engfunc(EngFunc_WriteCoord, Origin[2])
        write_short(g_exp_sprid)    // sprite index
        write_byte(8)   // scale in 0.1's
        write_byte(24)  // framerate
        write_byte(4)   // flags
        message_end()
       
        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, Origin[0])
        engfunc(EngFunc_WriteCoord, Origin[1])
        engfunc(EngFunc_WriteCoord, Origin[2])
        write_short(g_exp_sprid2)   // sprite index
        write_byte(7)   // scale in 0.1's
        write_byte(30)  // framerate
        write_byte(4)   // flags
        message_end()
       
        // Check Attack Damage
        //HamRadiusDamage(id, fm_get_user_weapon_entity(id, CSW_KNIFE), , , DMG_BURN)
     
        for(new i = 0; i < get_maxplayers(); i++)
        {
            if(!is_user_alive(i))
                continue
            if(id == i)
                continue
            if(cs_get_user_team(i) == cs_get_user_team(id))
                continue
            if(entity_range(i, id) > float(CHARGE_EXPRADIUS))
                continue
               
            ExecuteHamB(Ham_TakeDamage, i, fm_get_user_weapon_entity(id, CSW_KNIFE), id, DAMAGE_CHARGE, DMG_BLAST) 
        }
    }
     
    stock HamRadiusDamage(id, ent, Float:radius, Float:damage, bits, iVictim)
    {
        static target, Float:origin[3]
       
        target = -1
        pev(ent, pev_origin, origin)
         
        while((target = find_ent_in_sphere(target, origin, radius) ))
        {
            static Float:o[3]
            pev(target, pev_origin, o)
             
            xs_vec_sub(origin, o, o)
             
            // Recheck if the entity is in radius
            if (xs_vec_len(o) > radius)
                continue
           
            if(is_user_alive(target))
            {
                if(id == target)
                    continue
                if(cs_get_user_team(id) == cs_get_user_team(target))
                    continue
            }
             
            Ham_ExecDamageB(target, ent, id, damage * (xs_vec_len(o) / radius), HIT_GENERIC, bits)
        }
    }  
     
    stock Ham_ExecDamageB(victim, inflictor, attacker, Float:damage, hitgroup, bits)
    {
        static const Float:hitgroup_multi[] =
        {
            1.0,  // HIT_GENERIC
            4.0,  // HIT_HEAD
            1.0,  // HIT_CHEST
            1.25, // HIT_STOMACH
            1.0,  // HIT_LEFTARM
            1.0,  // HIT_RIGHTARM
            0.75, // HIT_LEFTLEG
            0.75,  // HIT_RIGHTLEG
            0.0   // HIT_SHIELD
        }
       
        set_pdata_int(victim, 75, hitgroup, 5)
        ExecuteHamB(Ham_TakeDamage, victim, inflictor, attacker, damage * hitgroup_multi[hitgroup], bits)
    }
     
    public fw_TraceAttack(ent, attacker, Float:Damage, Float:Dir[3], ptr, DamageType, iVictim)
    {
        if(!is_user_alive(attacker))
            return HAM_IGNORED
        if(get_user_weapon(attacker) != CSW_KNIFE || !g_had_balrog9[attacker])
            return HAM_IGNORED
           
        if(g_attack_mode[attacker] == MODE_NORMAL) SetHamParamFloat(3, DAMAGE_SLASH)
        if(g_attack_mode[attacker] == MODE_CHARGE) SetHamParamFloat(3, DAMAGE_CHARGE)
       
        return HAM_HANDLED
    }
     
    public fw_TraceAttack_Post(ent, attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
    {
        if(!is_user_alive(attacker))
            return HAM_IGNORED
        if(get_user_weapon(attacker) != CSW_KNIFE || !g_had_balrog9[attacker])
            return HAM_IGNORED
        if(g_attack_mode[attacker] == MODE_CHARGE)
        {
            if(g_chargeattack[attacker] == 2) // Do KnockBack Here
            {
                static Float:Origin[3]
                pev(attacker, pev_origin, Origin)
               
                hook_ent2(ent, Origin, CHARGE_ATTACK_KNOCKPOWER, 2)
            }
        }
       
        return HAM_HANDLED
    }
     
    public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
    {
        if(!is_user_connected(id))
            return FMRES_IGNORED
        if(get_user_weapon(id) != CSW_KNIFE || !g_had_balrog9[id])
            return FMRES_IGNORED
           
        if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
        {
            if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
            {
                set_weapons_timeidle(id, NEXTATTACK_MISS)
                set_player_nextattack(id, NEXTATTACK_MISS)
               
                if(g_attack_mode[id] == MODE_CHARGE)
                {
                    if(g_chargeattack[id] == 2)
                        emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                    else
                        emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                } else emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                return FMRES_SUPERCEDE
            }
            if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') // hit
            {
                if (sample[17] == 'w') // wall
                {
                    set_weapons_timeidle(id, NEXTATTACK_HIT)
                    set_player_nextattack(id, NEXTATTACK_HIT)  
                   
                    if(g_attack_mode[id] == MODE_CHARGE)
                    {
                        if(g_chargeattack[id] == 2)
                            emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                        else
                            emit_sound(id, channel, weapon_sound[B9_HITWALL], volume, attn, flags, pitch)
                    } else emit_sound(id, channel, weapon_sound[B9_HITWALL], volume, attn, flags, pitch)
                    return FMRES_SUPERCEDE
                } else {
                    set_weapons_timeidle(id, NEXTATTACK_HIT)
                    set_player_nextattack(id, NEXTATTACK_HIT)
                   
                    if(g_attack_mode[id] == MODE_CHARGE)
                    {
                        if(g_chargeattack[id] == 2)
                            emit_sound(id, channel, weapon_sound[random_num(B9_SLASH1, B9_SLASH2)], volume, attn, flags, pitch)
                        else
                            emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                    } else emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                    return FMRES_SUPERCEDE
                }
            }
            if(sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
            {
                if(g_chargeattack[id] == 2)
                    emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                else
                    emit_sound(id, channel, weapon_sound[random_num(B9_HIT1, B9_HIT2)], volume, attn, flags, pitch)
                   
                return FMRES_SUPERCEDE
            }
        }
       
        return FMRES_IGNORED
    }
     
    public sound1(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
    {
        emit_sound(id, channel, weapon_sound[B9_CHARGE_ATTACK], volume, attn, flags, pitch)
    }
     
    public fw_CmdStart(id, uc_handle, seed)
    {
        if (!is_user_alive(id))
            return
        if(get_user_weapon(id) != CSW_KNIFE)
            return
        if(!g_had_balrog9[id])
            return
       
        static ent
        ent = find_ent_by_owner(-1, "weapon_knife", id)
       
        if(!pev_valid(ent))
            return
       
        static CurButton, OldButton
       
        CurButton = get_uc(uc_handle, UC_Buttons)
        OldButton = (pev(id, pev_oldbuttons) & IN_ATTACK2)
       
        if(CurButton & IN_ATTACK)
        {
            if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
                return
           
            g_attack_mode[id] = MODE_NORMAL
            set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
        } else {
            if(CurButton & IN_ATTACK2)
            {
                set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
                set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
               
                if(OldButton) // Holding This Button
                {
                    if(g_charging[id] == 2)
                    {
                        if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
                            return
                       
                        if(g_charged[id])
                        {
                            set_weapons_timeidle(id, 99999.0)
                            set_player_nextattack(id, 99999.0)
                           
                            if(pev(id, pev_weaponanim) != BALROG9_ANIM_CHARGE_IDLE2)
                                set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE2)
                        } else {
                            set_weapons_timeidle(id, 99999.5)
                            set_player_nextattack(id, 9999.5)
                           
                            if(pev(id, pev_weaponanim) != BALROG9_ANIM_CHARGE_IDLE1)
                                set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE1)
                        }
                    }
                }      
               
                if(get_pdata_float(ent, 46, 4) > 0.0 || get_pdata_float(ent, 47, 4) > 0.0)
                    return
               
                remove_task(id+TASK_CHARGE_STARTING)
                remove_task(id+TASK_CHARGING)  
               
                g_attack_mode[id] = MODE_CHARGE
                g_charging[id] = 1
                g_charged[id] = 0
                g_chargeattack[id] = 1
               
                set_weapons_timeidle(id, CHARGE_STARTTIME + 0.25)
                set_player_nextattack(id, CHARGE_STARTTIME + 0.25)
           
                set_weapon_anim(id, BALROG9_ANIM_CHARGE_START)
               
                set_task(CHARGE_STARTTIME, "Do_HoldCharge", id+TASK_CHARGE_STARTING)
                set_task(CHARGE_TIME, "Do_SetCharge", id+TASK_CHARGING)
            } else {
                if(OldButton) // After Press this Button (no Hold)
                {
                    if(g_charging[id] == 2)
                    {
                        if(g_chargeattack[id])
                        {
                            ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
           
                            set_weapons_timeidle(id, CHARGE_NEXTATTACK)
                            set_player_nextattack(id, CHARGE_NEXTATTACK)
                           
                            g_charging[id] = 0
                            g_charged[id] = 0
                            g_chargeattack[id] = 0
                           
                            remove_task(id+TASK_CHARGE_STARTING)
                            remove_task(id+TASK_CHARGING)
                        }
                    }
                }
            }
        }
    }
     
    public Do_SetCharge(id)
    {
        id -= TASK_CHARGING
       
        if(!is_user_alive(id))
            return
        if(get_user_weapon(id) != CSW_KNIFE)
            return
        if(!g_had_balrog9[id])
            return
           
        g_charging[id] = 2
        g_charged[id] = 1
        g_chargeattack[id] = 2
       
        set_weapons_timeidle(id, 0.25)
        set_player_nextattack(id, 0.25)
                           
        set_weapon_anim(id, BALROG9_ANIM_CHARGE_FINISH)
    }
     
    public Do_HoldCharge(id)
    {
        id -= TASK_CHARGE_STARTING
       
        if(!is_user_alive(id))
            return
        if(get_user_weapon(id) != CSW_KNIFE)
            return
        if(!g_had_balrog9[id])
            return
           
        if(!(pev(id, pev_button) & IN_ATTACK2) && !(pev(id, pev_oldbuttons) & IN_ATTACK2))
        {
            static ent
            ent = find_ent_by_owner(-1, "weapon_knife", id)
       
            if(!pev_valid(ent))
                return     
               
            ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
           
            set_weapons_timeidle(id, CHARGE_NEXTATTACK)
            set_player_nextattack(id, CHARGE_NEXTATTACK)
           
            g_charging[id] = 0
            g_charged[id] = 0
            g_chargeattack[id] = 0
           
            remove_task(id+TASK_CHARGE_STARTING)
            remove_task(id+TASK_CHARGING)
                           
            return
        }
       
        g_charging[id] = 2
        g_chargeattack[id] = 1
        g_charged[id] = 0
           
        set_weapons_timeidle(id, CHARGE_TIME + 0.25)
        set_player_nextattack(id, CHARGE_TIME + 0.25)
           
        set_weapon_anim(id, BALROG9_ANIM_CHARGE_IDLE1) 
    }
     
    public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
    {
        if (!is_user_alive(id))
            return FMRES_IGNORED   
        if (get_user_weapon(id) != CSW_KNIFE)
            return FMRES_IGNORED
        if(!g_had_balrog9[id])
            return FMRES_IGNORED
       
        static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
       
        pev(id, pev_origin, fOrigin)
        pev(id, pev_view_ofs, view_ofs)
        xs_vec_add(fOrigin, view_ofs, vecStart)
        pev(id, pev_v_angle, v_angle)
       
        engfunc(EngFunc_MakeVectors, v_angle)
        get_global_vector(GL_v_forward, v_forward)
     
        if(g_attack_mode[id] == MODE_NORMAL)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_SLASH, v_forward)
        else if(g_attack_mode[id] == MODE_CHARGE)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_CHARGE, v_forward)
       
        xs_vec_add(vecStart, v_forward, vecEnd)
        engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
       
        return FMRES_SUPERCEDE
    }
     
    public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
    {
        if (!is_user_alive(id))
            return FMRES_IGNORED
        if (get_user_weapon(id) != CSW_KNIFE)
            return FMRES_IGNORED
        if(!g_had_balrog9[id])
            return FMRES_IGNORED
       
        static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
       
        pev(id, pev_origin, fOrigin)
        pev(id, pev_view_ofs, view_ofs)
        xs_vec_add(fOrigin, view_ofs, vecStart)
        pev(id, pev_v_angle, v_angle)
       
        engfunc(EngFunc_MakeVectors, v_angle)
        get_global_vector(GL_v_forward, v_forward)
     
        if(g_attack_mode[id] == MODE_NORMAL)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_SLASH, v_forward)
        else if(g_attack_mode[id] == MODE_CHARGE)
            xs_vec_mul_scalar(v_forward, ATTACKDIS_CHARGE, v_forward)
           
        xs_vec_add(vecStart, v_forward, vecEnd)
        engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
       
        return FMRES_SUPERCEDE
    }
     
    stock get_position(ent, Float:forw, Float:right, Float:up, Float:vStart[])
    {
        new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
       
        pev(ent, pev_origin, vOrigin)
        pev(ent, pev_view_ofs,vUp) //for player
        xs_vec_add(vOrigin,vUp,vOrigin)
        pev(ent, pev_v_angle, vAngle) // if normal entity ,use pev_angles
       
        angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
        angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
        angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
       
        vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
        vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
        vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    }
       
    stock set_weapons_timeidle(id, Float:TimeIdle)
    {
        if(!is_user_alive(id))
            return
           
        new entwpn = fm_get_user_weapon_entity(id, CSW_KNIFE)
        if (pev_valid(entwpn))
        {
            set_pdata_float(entwpn, 46, TimeIdle, 4)
            set_pdata_float(entwpn, 47, TimeIdle, 4)
            set_pdata_float(entwpn, 48, TimeIdle + 1.0, 4)
        }
    }
     
    stock set_player_nextattack(id, Float:nexttime)
    {
        if(!is_user_alive(id))
            return
           
        const m_flNextAttack = 83
        set_pdata_float(id, m_flNextAttack, nexttime, 5)
    }
     
    stock set_weapon_anim(id, anim)
    {
        if(!is_user_alive(id))
            return
           
        set_pev(id, pev_weaponanim, anim)
       
        message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, id)
        write_byte(anim)
        write_byte(0)
        message_end()  
    }
     
    stock hook_ent2(ent, Float:VicOrigin[3], Float:speed, type)
    {
        static Float:fl_Velocity[3]
        static Float:EntOrigin[3]
       
        pev(ent, pev_origin, EntOrigin)
        static Float:distance_f
        distance_f = get_distance_f(EntOrigin, VicOrigin)
       
        new Float:fl_Time = distance_f / speed
       
        VicOrigin[2] -= 36.0
       
        if(type == 1)
        {
            fl_Velocity[0] = ((VicOrigin[0] - EntOrigin[0]) / fl_Time) * 1.5
            fl_Velocity[1] = ((VicOrigin[1] - EntOrigin[1]) / fl_Time) * 1.5
            fl_Velocity[2] = ((VicOrigin[2] - EntOrigin[2]) / fl_Time) * 1.5
        } else if(type == 2) {
            fl_Velocity[0] = ((EntOrigin[0] - VicOrigin[0]) / fl_Time) * 1.5
            fl_Velocity[1] = ((EntOrigin[1] - VicOrigin[1]) / fl_Time) * 1.5
            fl_Velocity[2] = ((EntOrigin[2] - VicOrigin[2]) / fl_Time) * 1.5
        }
     
        entity_set_vector(ent, EV_VEC_velocity, fl_Velocity)
    }
     
    Set_Sprite( iPlayer, const Weapon[ ] )
    {
        if( ! pev_valid( iPlayer ) )
                    return;
     
        message_begin( MSG_ONE , get_user_msgid( "WeaponList" ) , _, iPlayer )
        write_string( Weapon )
        write_byte( -1 )
        write_byte( -1)
        write_byte( -1 )
        write_byte( -1 )
        write_byte( 2 )
        write_byte( 1 )
        write_byte( 29 )
        write_byte( 0 )
        message_end( )
    }
how change the flag from ze_extraitems.ini?

User avatar
Raheem
Mod Developer
Mod Developer
Posts: 2214
Joined: 7 years ago
Contact:

#9

Post by Raheem » 5 years ago

konno wrote: 5 years ago how change the flag from ze_extraitems.ini?
Sorry for late, you can change it like: Just to change the VIP_C to any flag you need.
He who fails to plan is planning to fail

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 4 guests