View Single Post
Author Message
SaBBa
Member
Join Date: Dec 2012
Old 01-13-2019 , 05:47   Plugin crashes on server, but works on local
Reply With Quote #1

Hello, I have modified Zombie plugin [CSO] Dual Sword Phantom Slayer, for normal, but it only works on local enviroment (windows).

Code:
./hlds_run: line 255: 13827 Segmentation fault $HL_CMD
I am getting this on linux server.

Original plugin

Code:
/* Plugin generated by AMXX-Studio */
#pragma compress 1

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>
#include <zombieplague>

#define PLUGIN "CSO Dual Sword Phantom Slayer"
#define VERSION "1.0"
#define AUTHOR "Natasha aka Asdian"

#define CSW_DPS CSW_KNIFE
#define weapon_dps "weapon_knife"

#define v_model "models/v_dualsword.mdl"
#define p_model "models/p_dualsword_a.mdl"
#define p_model2 "models/p_dualsword_b.mdl"
#define spr_wpn	"knife_dualsword"

new const weapon_sound[][] =
{
	"weapons/dualsword_stab1.wav",				// 0
	"weapons/dualsword_stab2.wav",				// 1
	"weapons/dualsword_stab1_hit.wav",			// 2
	"weapons/dualsword_stab2_hit.wav",			// 3
	"weapons/katanad_hitwall.wav",				// 4
	
	"weapons/dualsword_slash_1.wav",			// 5
	"weapons/dualsword_slash_2.wav",			// 6
	"weapons/dualsword_slash_3.wav",			// 7
	"weapons/dualsword_slash_4.wav",			// 8
	"weapons/dualsword_hit1.wav",				// 9
	"weapons/dualsword_hit2.wav",				// 10
	"weapons/dualsword_hit3.wav",				// 11
	"weapons/dualsword_slash_4_1.wav",			// 12
	"weapons/dualsword_slash_4_2.wav",			// 13
	"weapons/dualsword_skill_end.wav",			// 14
	
	"weapons/dualsword_fly1.wav",				// 15
	"weapons/dualsword_fly2.wav",				// 16
	"weapons/dualsword_fly3.wav",				// 17
	"weapons/dualsword_fly4.wav",				// 18
	"weapons/dualsword_fly5.wav",				// 19
	"weapons/dualsword_skill_start.wav"
}

//Hit
#define	RESULT_HIT_NONE 			0
#define	RESULT_HIT_PLAYER			1
#define	RESULT_HIT_WORLD			2

enum _:WpnAnim
{
	ANIM_IDLEA = 0,
	ANIM_SLASH1,
	ANIM_SLASH2,
	ANIM_SLASH3,
	ANIM_SLASH4,
	ANIM_SLASHEND,
	ANIM_DRAWA,
	ANIM_IDLEB,
	ANIM_STAB1,
	ANIM_STAB2,
	ANIM_STABEND,
	ANIM_DRAWB
}

new g_had_dps[33], g_mode[33], g_slashend[33], g_check[33], g_dps, g_soundmode[33]
new ef_sakura[4]
new Float:g_Sound[33]

new cvar_damage_slash[4], cvar_slash_radius, cvar_slash_range
new cvar_damage_stab[2], cvar_stab_radius, cvar_stab_range
new cvar_damage_special, cvar_special_range
new cvar_knockback[3], cvar_fast_attack, cvar_remove, cvar_spr

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
	register_forward(FM_AddToFullPack, "Fw_AddToFullPack_Post", 1);

	register_think("dps_entytyd", "Fw_DPSEnt_Think")
	
	RegisterHam(Ham_Item_PostFrame, weapon_dps, "fw_Item_PostFrame")
	
	g_dps = zp_register_extra_item("Dual Sword Phantom Slayer", 0, ZP_TEAM_HUMAN)
	register_clcmd(spr_wpn, "hook_rb")
	
	cvar_damage_slash[0] = register_cvar("dps_slashdamage_4","486.0")
	cvar_damage_slash[1] = register_cvar("dps_slashdamage_1","120.0")
	cvar_damage_slash[2] = register_cvar("dps_slashdamage_2","140.0")
	cvar_damage_slash[3] = register_cvar("dps_slashdamage_3","360.0")
	cvar_slash_radius = register_cvar("dps_slashradius","120.0")
	cvar_slash_range = register_cvar("dps_slashrange","95.0")
	
	cvar_damage_stab[0] = register_cvar("dps_stabdamage_2","1200.0")
	cvar_damage_stab[1] = register_cvar("dps_stabdamage_1","350.0")
	cvar_stab_radius = register_cvar("dps_stabradius","90.0")
	cvar_stab_range = register_cvar("dps_stabrange","150.0")
	
	cvar_damage_special = register_cvar("dps_specialdamage","95.0")
	cvar_special_range = register_cvar("dps_specialrange","120.0")
	
	cvar_knockback[0] = register_cvar("dps_slashknockback","0.0")
	cvar_knockback[1] = register_cvar("dps_stabknockback","0.0")
	cvar_knockback[2] = register_cvar("dps_specialknockback","0.0")
	
	cvar_fast_attack = register_cvar("dps_fast_attack_enabled", "0")
	cvar_remove = register_cvar("dps_remove_onnewround", "0")
	cvar_spr = register_cvar("dps_enable_sprites", "1")
	
	g_dps = zp_register_extra_item("Dual Sword Phantom Slayer", 10, ZP_TEAM_HUMAN)
}

public plugin_precache()
{
	precache_model(v_model)
	precache_model(p_model)
	precache_model(p_model2)
	
	for(new i = 0; i < sizeof(weapon_sound); i++)
		precache_sound(weapon_sound[i])
	
	precache_model("models/dualswordfx.mdl")
	precache_model("models/dualsword_skill.mdl")
	precache_model("models/dualsword_skillfx1.mdl")
	precache_model("models/dualsword_skillfx2.mdl")
	
	ef_sakura[0] = precache_model("sprites/leaf01_dualsword.spr")
	ef_sakura[1] = precache_model("sprites/leaf02_dualsword.spr")
	ef_sakura[2] = precache_model("sprites/petal01_dualsword.spr")
	ef_sakura[3] = precache_model("sprites/petal02_dualsword.spr")
	
	new Txt[32]
	format(Txt, 31, "sprites/%s.txt", spr_wpn)
	engfunc(EngFunc_PrecacheGeneric, Txt)
}

public zp_extra_item_selected(i, d) if(d == g_dps) get_dps(i)
public zp_user_infected_post(i) remove_dps(i)
public zp_user_humanized_post(i) remove_dps(i)

public hook_rb(id)
{
	engclient_cmd(id, weapon_dps)
	return PLUGIN_HANDLED
}

public get_dps(id)
{
	if (!is_user_alive(id))
		return

	g_had_dps[id] = 1
	g_mode[id] = 0
	g_slashend[id] = 0
	g_check[id] = 0
	g_soundmode[id] = 0
	
	fm_give_item(id, weapon_dps)
	
	if (get_user_weapon(id) == CSW_DPS) Event_CurWeapon(id)
	else engclient_cmd(id,weapon_dps)
}

public client_connect(id) remove_dps(id)
public client_disconnect(id) remove_dps(id)

public Event_NewRound()
{
	if(!get_pcvar_num(cvar_remove))
		return
	
	for(new i = 0; i < get_maxplayers(); i++)
		remove_dps(i)
}

public remove_dps(id)
{
	g_had_dps[id] = 0
	g_slashend[id] = 0
	g_check[id] = 0
	
	static iEnt; iEnt = fm_get_user_weapon_entity(id, CSW_DPS)
	if(!pev_valid(iEnt)) return
	
	set_pev(iEnt, pev_iuser1, 0)
	set_pev(iEnt, pev_iuser2, 0)
	set_pev(iEnt, pev_iuser3, 0)
	set_pev(iEnt, pev_iuser4, 0)
	set_pev(iEnt, pev_fuser1, 0.0)
}

public Event_CurWeapon(id)
{
	if(!is_user_alive(id))
		return 1
	if(get_user_weapon(id) != CSW_DPS)
		return 1
	if(!g_had_dps[id])
		return 1
	if(zp_get_user_zombie(id))
		return 1
		
	set_pev(id, pev_viewmodel2, v_model)
	set_pev(id, pev_weaponmodel2, g_mode[id] ? p_model2:p_model)
	
	Set_WeaponAnim(id, g_mode[id]?ANIM_DRAWA:ANIM_DRAWB)
	
	static iEnt; iEnt = fm_get_user_weapon_entity(id, CSW_DPS)
	if(!pev_valid(iEnt)) return 1
	
	set_pev(iEnt, pev_iuser1, 0)
	set_pev(iEnt, pev_iuser2, 0)
	set_pev(iEnt, pev_iuser3, 0)
	set_pev(iEnt, pev_iuser4, 0)
	set_pev(iEnt, pev_fuser1, 0.0)
		
	g_slashend[id] = 0
	g_check[id] = 0
	
	set_pdata_float(id, 83, 0.23)
	set_pdata_float(iEnt, 46, 0.25);
	set_pdata_float(iEnt, 47, 0.25);
	set_pdata_float(iEnt, 48, 0.25);
	
	if(get_pcvar_num(cvar_spr))
	{
		message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
		write_string(g_had_dps[id] == 1 ? spr_wpn : weapon_dps)
		write_byte(-1)
		write_byte(-1)
		write_byte(-1)
		write_byte(-1)
		write_byte(2)
		write_byte(1)
		write_byte(CSW_DPS)
		write_byte(0)
		message_end()
	}
	return 0
}

public message_DeathMsg(msg_id, msg_dest, msg_ent)
{
	new szWeapon[64]
	get_msg_arg_string(4, szWeapon, charsmax(szWeapon))
	
	if (strcmp(szWeapon, "knife"))
		return PLUGIN_CONTINUE

	new iEntity = get_pdata_cbase(get_msg_arg_int(1), 373)
	if (!pev_valid(iEntity) || get_pdata_int(iEntity, 43, 4) != CSW_DPS || !g_had_dps[get_msg_arg_int(1)])
		return PLUGIN_CONTINUE

	set_msg_arg_string(4, "dualsword")
	return PLUGIN_CONTINUE
}

public Fw_AddToFullPack_Post(esState, iE, iEnt, iHost, iHostFlags, iPlayer, pSet)
{
	if (!pev_valid(iEnt))
		return;
	if (pev(iEnt, pev_flags) & FL_KILLME) 
		return;

	new classname[32];
	pev(iEnt, pev_classname, classname, 31);

	if (equal(classname,"dps_entytyd") && pev(iEnt, pev_iuser4))
	{
		if (iHost != pev(iEnt, pev_owner))
			set_es(esState, ES_Effects, (get_es(esState, ES_Effects) | EF_NODRAW));
	}
}

public Fw_DPSEnt_Think(iEnt)
{
	if(!pev_valid(iEnt)) 
		return
	
	new iOwner
	iOwner = pev(iEnt, pev_owner)
	
	if(!is_user_alive(iOwner) || !is_user_connected(iOwner) || zp_get_user_zombie(iOwner))
	{
		remove_entity(iEnt)
		g_soundmode[iOwner] = 0
		return
	}
	
	if(!Get_Entity_Mode(iEnt))
	{
		new iWpn,iState,Float:vecOrigin[3], Float:vecAngle[3];
		iWpn = pev(iEnt, pev_iuser1)
		iState = pev(iWpn, pev_iuser4)
		Stock_Get_Postion(iOwner, 0.0, 0.0, 0.0, vecOrigin);
		
		pev(iOwner, pev_v_angle, vecAngle);
		vecAngle[0] = -vecAngle[0];
		
		set_pev(iEnt, pev_origin, vecOrigin);
		set_pev(iEnt, pev_angles, vecAngle);
		
		if(!iState || get_user_weapon(iOwner) != CSW_DPS)
		{
			new Float:fRenderAmount;
			pev(iEnt, pev_renderamt, fRenderAmount);

			fRenderAmount -= 4.5;

			if (fRenderAmount <= 5.0)
			{
				remove_entity(iEnt);
				return;
			}
			set_pev(iEnt, pev_renderamt, fRenderAmount);
		}
	}
	
	if(Get_Entity_Mode(iEnt) == 1)
	{
		set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
	
		static Float:Origin[3]; pev(iOwner, pev_origin, Origin)
		Origin[2] -= 25.0
		
		Stock_Hook_Ent(iEnt, Origin, 0.01)
		
		if(pev(iEnt, pev_fuser1) < get_gametime() || !IsAlive(iOwner))
		{
			set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME)
			return
		}
			
		set_pev(iEnt, pev_velocity, Float:{1.0,1.0,1.0});
		set_pev(iEnt, pev_origin, Origin);
	}
	
	if(Get_Entity_Mode(iEnt) == 2)
	{
		new Float:vecOrigin[3]
		GetGunPosition(iOwner, vecOrigin);
		
		new Float:fOldOrigin[3];
		pev(iEnt, pev_oldorigin, fOldOrigin);
		
		new Float:vecNewOrigin[3];
		pev(iEnt, pev_origin, vecNewOrigin);
		
		new Float:vecfff[3];
		xs_vec_sub(vecOrigin, fOldOrigin, vecfff);
		xs_vec_add(vecNewOrigin, vecfff, vecNewOrigin);
		
		set_pev(iEnt, pev_origin, vecNewOrigin);
		set_pev(iEnt, pev_oldorigin, vecOrigin);
		
		if (pev(iEnt, pev_iuser1) == 2)
		{
			new Float:fDist = get_distance_f(vecOrigin, vecNewOrigin);
			if (fDist > 175.0 * 0.5)
			{
				remove_entity(iEnt);
				return;
			}
		}
		
		if(g_Sound[iOwner] < get_gametime())
		{
			if(!g_soundmode[iOwner]) emit_sound(iOwner, CHAN_ITEM, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			if(g_soundmode[iOwner] == 1) emit_sound(iOwner, CHAN_BODY, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			if(g_soundmode[iOwner] == 2) emit_sound(iOwner, CHAN_VOICE, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			if(g_soundmode[iOwner] == 3) emit_sound(iOwner, CHAN_WEAPON, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			
			g_soundmode[iOwner]++
			if(g_soundmode[iOwner] > 3) g_soundmode[iOwner] = 0
			
			g_Sound[iOwner] = get_gametime()+0.088;
		}
	}
	set_pev(iEnt, pev_nextthink, get_gametime() + 0.01)
	
	if(Get_Entity_Mode(iEnt) == 2)
	{
		new Float:fTimeLast;
		pev(iEnt, pev_fuser1, fTimeLast);
		
		if (fTimeLast < get_gametime() || pev(pev(iEnt, pev_iuser2), pev_fuser1) < get_gametime())
		{
			if (pev(iEnt, pev_iuser1) == 1)
			{
				new Float:fRenderAmount;
				pev(iEnt, pev_renderamt, fRenderAmount);
				fRenderAmount -= 7.5;
				
				if (fRenderAmount <= 5.0)
				{
					remove_entity(iEnt);
					return;
				}
				set_pev(iEnt, pev_renderamt, fRenderAmount);
			} else remove_entity(iEnt);
			
			g_soundmode[iOwner] = 0
		}
	}
}

public fw_Item_PostFrame(ent)
{
	new id = pev(ent, pev_owner)
	
	if(!is_user_connected(id))
		return HAM_IGNORED
	if(get_user_weapon(id) != CSW_DPS || !g_had_dps[id])
		return HAM_IGNORED

	if(get_pdata_float(ent, 48, 4) <= 0.01 && (!pev(ent, pev_iuser2) || !g_slashend[id]))
	{
		if(g_check[id] < 6) g_check[id] = 0
		set_pev(ent, pev_iuser3, 0)
		Set_WeaponAnim(id, g_mode[id]?ANIM_IDLEA:ANIM_IDLEB)
		set_pdata_float(ent, 48, 4.03, 4)
	}
	
	new iButton = pev(id,pev_button)
	return AurezBotac(id, ent, iButton)
}

public AurezBotac(id, iEnt, iButton)
{
	new iState = pev(iEnt, pev_iuser3)
	new iState2 = pev(iEnt, pev_iuser2)
	new iSlash = pev(iEnt, pev_iuser4)
	new Float:fSound; pev(iEnt, pev_fuser1, fSound)
	new Float:fRange = get_pcvar_float(g_mode[id] ? cvar_slash_range : cvar_stab_range)
	
	if(!(iButton & IN_ATTACK) && get_pdata_float(iEnt, 46,4) <= 0.0 && iState2)
	{
		if(!iState || iState == 1)
		{
			Set_WeaponAnim(id, ANIM_STABEND)
			set_pev(iEnt, pev_iuser2, 0)
			set_pdata_float(iEnt, 48, 1.45,4)
		}
	}
	
	if(!(iButton & IN_ATTACK2) && get_pdata_float(iEnt, 47,4) <= 0.0 && g_slashend[id])
	{
		Set_WeaponAnim(id, ANIM_SLASHEND)
		set_pdata_float(iEnt, 48, 2.03,4)
		g_slashend[id] = 0
	}
	
	if (get_pdata_float(id, 83) <= 0.0 && pev(iEnt, pev_iuser1))
	{
		new Float:fAngle = get_pcvar_float(g_mode[id] ? cvar_slash_radius : cvar_stab_radius)
		new Float:fDamage = get_pcvar_float(g_mode[id] ? cvar_damage_slash[iSlash] : cvar_damage_stab[iState])
		
		new iHitResult = KnifeAttack_Global(id, true, fRange, fAngle, fDamage, get_pcvar_float(cvar_knockback[1+g_mode[id]]))
		switch (iHitResult)
		{
			case RESULT_HIT_PLAYER : client_cmd(id, "spk %s", weapon_sound[g_mode[id]?random_num(9,11):iState+2]) 
			case RESULT_HIT_WORLD : client_cmd(id, "spk %s", weapon_sound[4])
		}
		set_pev(iEnt, pev_iuser1, 0);
	}
	
	if(get_pdata_float(iEnt, 47,4) <= 0.0 && iSlash && iSlash <= 4)
	{
		set_pev(iEnt, pev_iuser4, 1 + iSlash)
		Set_WeaponAnim(id, 1 + iSlash)
		
		set_pdata_float(id, 83, 0.06)
		
		if(!get_pcvar_num(cvar_fast_attack)) 
			set_pdata_float(iEnt, 46, iSlash == 3 ? (g_check[id] == 5 ? 0.43 : 0.7) : 0.13,4);
		
		set_pdata_float(iEnt, 47, iSlash == 3 ? (g_check[id] == 5 ? 0.43 : 0.7) : 0.13,4);
		set_pdata_float(iEnt, 48, iSlash == 3 ? 1.4 : 1.0,4);
		  
		set_pev(iEnt, pev_iuser1, 1)
		set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
		SendSound(id, CHAN_WEAPON, weapon_sound[5 + iSlash])
		Create_Slash(id,iEnt,iSlash)
		
		if(iSlash == 3) 
		{
			g_slashend[id] = 1
			
			set_pev(iEnt, pev_fuser1, get_gametime() + (g_check[id] == 5 ? 0.43 : 0.5))
			set_pev(iEnt, pev_iuser4, 0)
		}
	}
	
	if(fSound && fSound < get_gametime())
	{
		SendSound(id,CHAN_VOICE,weapon_sound[g_check[id] == 5 ? 13 : 12])
		set_pev(iEnt, pev_fuser1, 0.0)
		
		if(g_check[id] == 5) 
		{
			Set_WeaponAnim(id, 14)
			SendSound(id,CHAN_ITEM,weapon_sound[20])
			g_check[id] = 6
			
			set_pdata_float(iEnt, 46, 1.03,4)
			set_pdata_float(iEnt, 47, 1.03,4)
			set_pdata_float(iEnt, 48, 1.03,4)
			
			set_pev(iEnt, pev_fuser4, get_gametime()+1.7);
			DPS_Special(id, 0, 2.0)
		}
	}
	
	if(g_check[id] == 6 && get_pdata_float(iEnt, 46,4) <= 0.0)
	{
		set_pdata_float(iEnt, 46, 11.36,4)
		set_pdata_float(iEnt, 47, 11.36,4)
		set_pdata_float(iEnt, 48, 11.36,4)
		
		g_check[id] = 7
		set_pev(iEnt, pev_fuser1, get_gametime() + 10.6)
		Set_WeaponAnim(id, 15)
	}
	
	// NANI?!
	if(g_check[id] == 7 && fSound && fSound < get_gametime())
	{
		SendSound(id,CHAN_VOICE,weapon_sound[14])
		set_pev(iEnt, pev_fuser1, 0.0)
		g_check[id] = 0
		
		DPS_Special(id, 1, 1.46)
	}
	
	DPS_RealSpecial(id, iEnt, fRange)
	
	if(iButton & IN_ATTACK && get_pdata_float(iEnt, 46,4) <= 0.0)
	{
		g_mode[id] = 0
		g_slashend[id] = 0
		
		set_pev(iEnt, pev_iuser2, 1)
		set_pev(iEnt, pev_iuser4, 0)
		
		switch(iState)
		{
			case 0:
			{
				set_pdata_float(id, 83, 0.16)
				set_pdata_float(iEnt, 46, 0.4,4);
				
				if(!get_pcvar_num(cvar_fast_attack)) 
					set_pdata_float(iEnt, 47, 0.4,4);
					
				set_pdata_float(iEnt, 48, 1.0,4);
				
				set_pev(iEnt, pev_iuser1, 1)
				set_pev(iEnt, pev_iuser3, 1)
				set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
				
				Set_WeaponAnim(id, ANIM_STAB1)
				SendSound(id, CHAN_WEAPON, weapon_sound[0])
				
				if(!g_check[id]) g_check[id] = 1
				else if(g_check[id] == 2) g_check[id] = 3
				else g_check[id] = 0
			}
			case 1:
			{
				set_pdata_float(id, 83, 0.16)
				set_pdata_float(iEnt, 46, 0.83,4);
				
				if(!get_pcvar_num(cvar_fast_attack)) 
					set_pdata_float(iEnt, 47, 0.83,4);
				
				set_pdata_float(iEnt, 48, 1.5,4);
				
				set_pev(iEnt, pev_iuser1, 1)
				set_pev(iEnt, pev_iuser3, 0)
				set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
				
				Set_WeaponAnim(id, ANIM_STAB2)
				SendSound(id, CHAN_WEAPON, weapon_sound[1])
				
				if(g_check[id] == 3) g_check[id] = 4
				else g_check[id] = 0
			}
		}
	}
	
	if(iButton & IN_ATTACK2 && get_pdata_float(iEnt, 47) <= 0.0 && !iSlash)
	{
		g_mode[id] = 1
		
		set_pdata_float(id, 83, 0.04)
		
		if(!get_pcvar_num(cvar_fast_attack)) 
			set_pdata_float(iEnt, 46, 0.13,4);
		
		set_pdata_float(iEnt, 47, 0.13,4);
		set_pdata_float(iEnt, 48, 0.5,4);
		
		set_pev(iEnt, pev_iuser1, 1)
		set_pev(iEnt, pev_iuser2, 0)
		set_pev(iEnt, pev_iuser3, 0)
		set_pev(iEnt, pev_iuser4, 1)
		set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
		
		Set_WeaponAnim(id, ANIM_SLASH1)
		SendSound(id, CHAN_WEAPON, weapon_sound[5])
		
		Create_Slash(id,iEnt,0)
		
		if(g_check[id] == 1) g_check[id] = 2
		else if(g_check[id] == 4) g_check[id] = 5
		else g_check[id] = 0
	}
	
	iButton &= ~IN_ATTACK;
	iButton &= ~IN_ATTACK2;
	set_pev(id, pev_button, iButton);
	return HAM_IGNORED
}

stock Create_Slash(id,iEnt,seq)
{
	new Float:vecOrigin[3], Float:vecAngle[3];
	GetGunPosition(id, vecOrigin);
	pev(id, pev_v_angle, vecAngle);
	vecAngle[0] = -vecAngle[0];
	
	new pEntity = DPS_Entites(id,"models/dualswordfx.mdl",vecOrigin,vecOrigin,0.01,SOLID_NOT,seq)
		
	// Set info for ent	
	Set_Entity_Mode(pEntity, 0)
	set_pev(pEntity, pev_scale, 0.1);
	set_pev(pEntity, pev_iuser1, iEnt);
	set_pev(pEntity, pev_velocity, Float:{0.01,0.01,0.01});
	set_pev(pEntity, pev_angles, vecAngle);
	set_pev(pEntity, pev_nextthink, get_gametime()+0.01);
}

stock DPS_Special(id, seq, Float:fTime)
{
	new Float:VecOrig[3], Float:VecAng[3]
	pev(id, pev_origin, VecOrig)
	pev(id, pev_angles, VecAng)
	
	new iEfx = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
	set_pev(iEfx, pev_classname, "dps_entytyd");
	set_pev(iEfx, pev_origin, VecOrig)
	set_pev(iEfx, pev_frame, 0.0)
	set_pev(iEfx, pev_animtime, get_gametime())
	set_pev(iEfx, pev_framerate, 1.0)
	set_pev(iEfx, pev_sequence, seq)
	engfunc(EngFunc_SetModel, iEfx, "models/dualsword_skill.mdl")
	dllfunc(DLLFunc_Spawn, iEfx)
	Set_Entity_Mode(iEfx, 1)
	set_pev(iEfx, pev_angles, VecAng)
	set_pev(iEfx, pev_solid, SOLID_NOT)
	set_pev(iEfx, pev_owner, id)
	set_pev(iEfx, pev_velocity, Float:{0.01,0.01,0.01});
	set_pev(iEfx, pev_fuser1, get_gametime() + fTime)
	set_pev(iEfx, pev_nextthink, get_gametime() + 0.01)
}

stock DPS_RealSpecial(id, iEnt, Float:fRange)
{
	new Float:fTimeEffect;
	pev(iEnt, pev_fuser4, fTimeEffect);
	
	if (g_check[id] == 7 && fTimeEffect && fTimeEffect <= get_gametime())
	{
		KnifeAttack_Global(id, false, get_pcvar_float(cvar_special_range)*2.0, 180.0, get_pcvar_float(cvar_damage_special), get_pcvar_float(cvar_knockback[2]))
			
		new Float:vecOrigin3[2][3], Float:vecOrigin[3];
		pev(id, pev_origin, vecOrigin3[0]);
		pev(id, pev_origin, vecOrigin);
		xs_vec_copy(vecOrigin3[0], vecOrigin3[1]);
		
		new Float:fFloat = random_float(fRange * -0.85, fRange * 0.85);
		vecOrigin3[0][2] = vecOrigin3[1][2] = vecOrigin3[0][2] + random_float(-5.0, 65.0);
		
		switch (random(3))
		{
			case 0:
			{
				vecOrigin3[0][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] += fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] -= fFloat*random_float(-1.0, 1.0);
			}
			case 1:
			{
				vecOrigin3[0][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] -= fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] += fFloat*random_float(-1.0, 1.0);
			}
			case 2:
			{
				vecOrigin3[0][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] += fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] -= fFloat*random_float(-1.0, 1.0);
			}
			case 3:
			{
				vecOrigin3[0][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] -= fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] += fFloat*random_float(-1.0, 1.0);
			}
		}
		
		if (random_num(0,9) > 8)
		{
			new Float:vecAngle2[3];
			vecAngle2[0] = random_num(0,1) ? random_float(-30.0, -15.0) : random_float(15.0, 30.0);
			vecAngle2[1] = random_num(0,1) ? random_float(-180.0, 0.0) : random_float(0.0, 180.0);
			
			new pEntity = DPS_Entites(id,"models/dualsword_skillfx1.mdl",vecOrigin3[0],vecOrigin3[0],0.01,SOLID_NOT,0)	
			set_pev(pEntity, pev_angles, vecAngle2);
			set_pev(pEntity, pev_velocity, Float:{0.01,0.01,0.01});
			set_pev(pEntity, pev_iuser1, 1);
			set_pev(pEntity, pev_iuser2, iEnt);
			set_pev(pEntity, pev_frame, 0.0);
			Set_Entity_Mode(pEntity, 2)
			set_pev(pEntity, pev_fuser1, get_gametime()+0.53);
			set_pev(pEntity, pev_fuser2, get_gametime()+0.5);
			set_pev(pEntity, pev_fuser3, get_gametime()+0.31);
			set_pev(pEntity, pev_oldorigin, vecOrigin);
			set_pev(pEntity, pev_nextthink, get_gametime()+0.01);
		}
		
		new pEntity = DPS_Entites(id,"models/dualsword_skillfx2.mdl",vecOrigin3[0],vecOrigin3[1],500.0,SOLID_TRIGGER,0)	
		set_pev(pEntity, pev_iuser1, 2);
		set_pev(pEntity, pev_iuser2, iEnt);
		Set_Entity_Mode(pEntity, 2)
		set_pev(pEntity, pev_frame, 0.0);
		set_pev(pEntity, pev_oldorigin, vecOrigin);
		set_pev(pEntity, pev_fuser1, get_gametime()+0.2);
		set_pev(pEntity, pev_fuser2, get_gametime()+0.5);
		set_pev(pEntity, pev_fuser3, get_gametime()+0.3);
		set_pev(pEntity, pev_nextthink, get_gametime()+0.01);
		
		set_pev(iEnt, pev_fuser4, get_gametime()+0.05);
	}
}

stock DPS_Entites(id, models[], Float:Start[3], Float:End[3], Float:speed, solid, seq, move=MOVETYPE_FLY)
{
	new pEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
		
	// Set info for ent	
	set_pev(pEntity, pev_movetype, move);
	set_pev(pEntity, pev_owner, id);
	engfunc(EngFunc_SetModel, pEntity, models);
	set_pev(pEntity, pev_classname, "dps_entytyd");
	set_pev(pEntity, pev_mins, Float:{-1.0, -1.0, -1.0});
	set_pev(pEntity, pev_maxs, Float:{1.0, 1.0, 1.0});
	set_pev(pEntity, pev_origin, Start);
	set_pev(pEntity, pev_gravity, 0.01);
	set_pev(pEntity, pev_solid, solid);
	
	static Float:Velocity[3];
	Stock_Get_Speed_Vector(Start, End, speed, Velocity);
	set_pev(pEntity, pev_velocity, Velocity);

	new Float:vecVAngle[3]; pev(id, pev_v_angle, vecVAngle);
	vector_to_angle(Velocity, vecVAngle)
	
	if(vecVAngle[0] > 90.0) vecVAngle[0] = -(360.0 - vecVAngle[0]);
	set_pev(pEntity, pev_angles, vecVAngle);
	
	set_pev(pEntity, pev_rendermode, kRenderTransAdd);
	set_pev(pEntity, pev_renderamt, 255.0);
	set_pev(pEntity, pev_sequence, seq)
	set_pev(pEntity, pev_animtime, get_gametime());
	set_pev(pEntity, pev_framerate, 1.0)
	return pEntity;
}

stock Set_Entity_Mode(iEnt, mode) set_pev(iEnt, pev_iuser3, mode)
stock Get_Entity_Mode(iEnt) return pev(iEnt,pev_iuser3)

stock SendSound(id, chan, sample[]) emit_sound(id, chan, sample, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

stock Stock_Get_Speed_Vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
	xs_vec_sub(origin2, origin1, new_velocity)
	new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
	xs_vec_mul_scalar(new_velocity, num, new_velocity)
}
stock GetGunPosition(id, Float:vecSrc[3])
{
	new Float:vecViewOfs[3];
	pev(id, pev_origin, vecSrc);
	pev(id, pev_view_ofs, vecViewOfs);
	xs_vec_add(vecSrc, vecViewOfs, vecSrc);
}
stock KnifeAttack_Global(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack)
{
	new iHitResult
	if(fAngle > 0.0) iHitResult = KnifeAttack2(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack)
	else iHitResult = KnifeAttack(id, bStab, Float:flRange, Float:flDamage, Float:flKnockBack)

	return iHitResult
}

stock KnifeAttack(id, bStab, Float:flRange, Float:flDamage, Float:flKnockBack, iHitgroup = -1, bitsDamageType = DMG_NEVERGIB | DMG_CLUB)
{
	new Float:vecSrc[3], Float:vecEnd[3], Float:v_angle[3], Float:vecForward[3];
	GetGunPosition(id, vecSrc);

	pev(id, pev_v_angle, v_angle);
	engfunc(EngFunc_MakeVectors, v_angle);

	global_get(glb_v_forward, vecForward);
	xs_vec_mul_scalar(vecForward, flRange, vecForward);
	xs_vec_add(vecSrc, vecForward, vecEnd);

	new tr = create_tr2();
	engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);

	new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
	if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
	
	get_tr2(tr, TR_flFraction, flFraction);

	new iHitResult = RESULT_HIT_NONE;
	
	if (flFraction < 1.0)
	{
		new pEntity = get_tr2(tr, TR_pHit);
		iHitResult = RESULT_HIT_WORLD;
		
		if (pev_valid(pEntity) && (IsPlayer(pEntity) || IsHostage(pEntity)))
		{
			if (CheckBack(id, pEntity) && bStab && iHitgroup == -1)
				flDamage *= 1.0;

			iHitResult = RESULT_HIT_PLAYER;
		}

		if (pev_valid(pEntity))
		{
			engfunc(EngFunc_MakeVectors, v_angle);
			global_get(glb_v_forward, vecForward);

			if (iHitgroup != -1)
				set_tr2(tr, TR_iHitgroup, iHitgroup);

			ExecuteHamB(Ham_TraceAttack, pEntity, id, flDamage, vecForward, tr, bitsDamageType);
			ExecuteHamB(Ham_TakeDamage, pEntity, id, id, flDamage, bitsDamageType)
			Stock_Fake_KnockBack(id, pEntity, flKnockBack)
			
			if (IsAlive(pEntity))
			{
				free_tr2(tr);
				return iHitResult;
			}
		}
	}
	free_tr2(tr);
	return iHitResult;
}

stock KnifeAttack2(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack, iHitgroup = -1, bNoTraceCheck = 0)
{
	new Float:vecOrigin[3], Float:vecSrc[3], Float:vecEnd[3], Float:v_angle[3], Float:vecForward[3];
	pev(id, pev_origin, vecOrigin);

	new iHitResult = RESULT_HIT_NONE;
	GetGunPosition(id, vecSrc);

	pev(id, pev_v_angle, v_angle);
	engfunc(EngFunc_MakeVectors, v_angle);

	global_get(glb_v_forward, vecForward);
	xs_vec_mul_scalar(vecForward, flRange, vecForward);
	xs_vec_add(vecSrc, vecForward, vecEnd);

	new tr = create_tr2();
	engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
	
	new Float:EndPos2[3]
	get_tr2(tr, TR_vecEndPos, EndPos2)
	
	new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
	if (flFraction < 1.0) 
	{
		iHitResult = RESULT_HIT_WORLD;
		if(bStab) Stock_SakuraEffect(id, EndPos2)
	}
	
	new Float:vecEndZ = vecEnd[2];
	
	new pEntity = -1;
	while ((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, vecOrigin, flRange)) != 0)
	{
		if (!pev_valid(pEntity))
			continue;
		if (id == pEntity)
			continue;
		if (!IsAlive(pEntity))
			continue;
		if (!CheckAngle(id, pEntity, fAngle))
			continue;

		GetGunPosition(id, vecSrc);
		Stock_Get_Origin(pEntity, vecEnd);

		vecEnd[2] = vecSrc[2] + (vecEndZ - vecSrc[2]) * (get_distance_f(vecSrc, vecEnd) / flRange);

		xs_vec_sub(vecEnd, vecSrc, vecForward);
		xs_vec_normalize(vecForward, vecForward);
		xs_vec_mul_scalar(vecForward, flRange, vecForward);
		xs_vec_add(vecSrc, vecForward, vecEnd);

		engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
		get_tr2(tr, TR_flFraction, flFraction);

		if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
		get_tr2(tr, TR_flFraction, flFraction);

		if (flFraction < 1.0)
		{
			if (IsPlayer(pEntity) || IsHostage(pEntity))
			{
				iHitResult = RESULT_HIT_PLAYER;
				if(bStab) Stock_SakuraEffect(id, vecEnd)
				
				if (CheckBack(id, pEntity) && bStab && iHitgroup == -1)
					flDamage *= 1.0;
			}

			if (get_tr2(tr, TR_pHit) == pEntity || bNoTraceCheck)
			{
				engfunc(EngFunc_MakeVectors, v_angle);
				global_get(glb_v_forward, vecForward);

				if (iHitgroup != -1) set_tr2(tr, TR_iHitgroup, iHitgroup);

				ExecuteHamB(Ham_TraceAttack, pEntity, id, flDamage, vecForward, tr, DMG_NEVERGIB | DMG_CLUB);
				ExecuteHamB(Ham_TakeDamage, pEntity, id, id, flDamage, DMG_NEVERGIB | DMG_CLUB)
				
				Stock_Fake_KnockBack(id, pEntity, flKnockBack)
			}
		}
		free_tr2(tr);
	}
	return iHitResult;
}

stock Set_WeaponAnim(id, anim)
{
	set_pev(id, pev_weaponanim, anim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
	write_byte(anim)
	write_byte(pev(id, pev_body))
	message_end()
}

stock Stock_Set_Vis(iEnt, iVis = 1)
	set_pev(iEnt, pev_effects, iVis == 1 ? pev(iEnt, pev_effects) & ~EF_NODRAW : pev(iEnt, pev_effects) | EF_NODRAW)

stock Stock_Hook_Ent(ent, Float:TargetOrigin[3], Float:Speed, mode=0)
{
	static Float:fl_Velocity[3],Float:EntOrigin[3],Float:distance_f,Float:fl_Time
	pev(ent, pev_origin, EntOrigin)
	
	if(!mode)
	{
		distance_f = get_distance_f(EntOrigin, TargetOrigin)
		fl_Time = distance_f / Speed
			
		pev(ent, pev_velocity, fl_Velocity)
			
		fl_Velocity[0] = (TargetOrigin[0] - EntOrigin[0]) / fl_Time
		fl_Velocity[1] = (TargetOrigin[1] - EntOrigin[1]) / fl_Time
		fl_Velocity[2] = (TargetOrigin[2] - EntOrigin[2]) / fl_Time

		if(vector_length(fl_Velocity) > 1.0) set_pev(ent, pev_velocity, fl_Velocity)
		else set_pev(ent, pev_velocity, Float:{0.01, 0.01, 0.01})
	} else {
		static Float:fl_EntVelocity[3], Float:fl_Acc[3]
		Stock_Directed_Vector(TargetOrigin, EntOrigin, fl_Velocity)
		xs_vec_mul_scalar(fl_Velocity, Speed, fl_Velocity)
		
		for(new i =0; i<3; i++)
		{
			if(fl_Velocity[i] > fl_EntVelocity[i]) 
			{
				fl_Acc[i] = fl_Velocity[i]-fl_EntVelocity[i]
				fl_Acc[i] = floatmin(70.0, fl_Acc[i])
				fl_EntVelocity[i] += fl_Acc[i]
			}
			else if(fl_Velocity[i] < fl_EntVelocity[i])
			{
				fl_Acc[i] = fl_EntVelocity[i]-fl_Velocity[i]
				fl_Acc[i] = floatmin(70.0, fl_Acc[i])
				fl_EntVelocity[i] -= fl_Acc[i]
			}
		}
		set_pev(ent, pev_velocity, fl_EntVelocity)
	}
}

stock Stock_Directed_Vector(Float:start[3],Float:end[3],Float:reOri[3])
{	
	new Float:v3[3],i
	for(i=0;i<3;i++) v3[i]=start[i]-end[i]

	new Float:vl = vector_length(v3)
	for(i=0;i<3;i++) reOri[i] = v3[i] / vl
}

stock Stock_Get_Postion(id,Float:forw,Float:right,Float:up,Float:vStart[])
{
	static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
	pev(id, pev_origin, vOrigin)
	pev(id, pev_view_ofs,vUp)
	xs_vec_add(vOrigin,vUp,vOrigin)
	pev(id, pev_v_angle, vAngle)
	
	engfunc(EngFunc_AngleVectors, vAngle, vForward, vRight, 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 IsPlayer(pEntity) return is_user_connected(pEntity)

stock IsHostage(pEntity)
{
	new classname[32]; pev(pEntity, pev_classname, classname, charsmax(classname))
	return equal(classname, "hostage_entity")
}

stock IsAlive(pEntity)
{
	if (pEntity < 1) return 0
	return (pev(pEntity, pev_deadflag) == DEAD_NO && pev(pEntity, pev_health) > 0)
}

stock CheckBack(iEnemy,id)
{
	new Float:anglea[3], Float:anglev[3]
	pev(iEnemy, pev_v_angle, anglea)
	pev(id, pev_v_angle, anglev)
	new Float:angle = anglea[1] - anglev[1] 
	if (angle < -180.0) angle += 360.0
	if (angle <= 45.0 && angle >= -45.0) return 1
	return 0
}

stock CheckAngle(iAttacker, iVictim, Float:fAngle)  return(Stock_CheckAngle(iAttacker, iVictim) > floatcos(fAngle,degrees))

stock Float:Stock_CheckAngle(id,iTarget)
{
	new Float:vOricross[2],Float:fRad,Float:vId_ori[3],Float:vTar_ori[3],Float:vId_ang[3],Float:fLength,Float:vForward[3]
	Stock_Get_Origin(id, vId_ori)
	Stock_Get_Origin(iTarget, vTar_ori)
	
	pev(id,pev_angles,vId_ang)
	for(new i=0;i<2;i++) vOricross[i] = vTar_ori[i] - vId_ori[i]
	
	fLength = floatsqroot(vOricross[0]*vOricross[0] + vOricross[1]*vOricross[1])
	
	if (fLength<=0.0)
	{
		vOricross[0]=0.0
		vOricross[1]=0.0
	} else {
		vOricross[0]=vOricross[0]*(1.0/fLength)
		vOricross[1]=vOricross[1]*(1.0/fLength)
	}
	
	engfunc(EngFunc_MakeVectors,vId_ang)
	global_get(glb_v_forward,vForward)
	
	fRad = vOricross[0]*vForward[0]+vOricross[1]*vForward[1]
	return fRad   //->   RAD 90' = 0.5rad
}

stock Stock_Get_Origin(id, Float:origin[3])
{
	new Float:maxs[3],Float:mins[3]
	if (pev(id, pev_solid) == SOLID_BSP)
	{
		pev(id,pev_maxs,maxs)
		pev(id,pev_mins,mins)
		origin[0] = (maxs[0] - mins[0]) / 2 + mins[0]
		origin[1] = (maxs[1] - mins[1]) / 2 + mins[1]
		origin[2] = (maxs[2] - mins[2]) / 2 + mins[2]
	} else pev(id, pev_origin, origin)
}

public Stock_Fake_KnockBack(id, iVic, Float:iKb)
{
	if(iVic > 32) return
	
	new Float:vAttacker[3], Float:vVictim[3], Float:vVelocity[3], flags
	pev(id, pev_origin, vAttacker)
	pev(iVic, pev_origin, vVictim)
	vAttacker[2] = vVictim[2] = 0.0
	flags = pev(id, pev_flags)
	
	xs_vec_sub(vVictim, vAttacker, vVictim)
	new Float:fDistance
	fDistance = xs_vec_len(vVictim)
	xs_vec_mul_scalar(vVictim, 1 / fDistance, vVictim)
	
	pev(iVic, pev_velocity, vVelocity)
	xs_vec_mul_scalar(vVictim, iKb, vVictim)
	xs_vec_mul_scalar(vVictim, 50.0, vVictim)
	vVictim[2] = xs_vec_len(vVictim) * 0.15
	
	if(flags &~ FL_ONGROUND)
	{
		xs_vec_mul_scalar(vVictim, 1.2, vVictim)
		vVictim[2] *= 0.4
	}
	if(xs_vec_len(vVictim) > xs_vec_len(vVelocity)) set_pev(iVic, pev_velocity, vVictim)
}	

stock Float:Stock_Get_Body_Dmg(iBody)
{
	switch (iBody)
	{
		case HIT_GENERIC: return 0.75
		case 1: return 4.0
		case 2: return 1.0
		case 3: return 1.25
		case 4,5,6,7: return 0.75
		default: return 0.75
	}
	return 1.0
}

stock Stock_SakuraEffect(id, Float:vecOri[3])
{
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOri)
	write_byte(TE_BLOODSPRITE)
	engfunc(EngFunc_WriteCoord,vecOri[0])
	engfunc(EngFunc_WriteCoord,vecOri[1])
	engfunc(EngFunc_WriteCoord,vecOri[2])
	write_short(ef_sakura[g_mode[id]?2:0])
	write_short(ef_sakura[g_mode[id]?3:1])
	write_byte(g_mode[id]?178:128)
	write_byte(random_num(2,3))
	message_end()
}

stock can_damage(id1, id2)
{
	if(id1 <= 0 || id1 >= 33 || id2 <= 0 || id2 >= 33)
		return 1
		
	// Check team
	return(get_pdata_int(id1, 114) != get_pdata_int(id2, 114))
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/

My modified version
Code:
/* Plugin generated by AMXX-Studio */
#pragma compress 1

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>

#define PLUGIN "CSO Dual Sword Phantom Slayer"
#define VERSION "1.1"
#define AUTHOR "Natasha aka Asdian"

#define CSW_DPS CSW_KNIFE
#define weapon_dps "weapon_knife"

#define v_model "models/v_dualsword.mdl"
#define p_model "models/p_dualsword_a.mdl"
#define p_model2 "models/p_dualsword_b.mdl"
#define spr_wpn	"knife_dualsword"

new const weapon_sound[][] =
{
	"weapons/dualsword_stab1.wav",				// 0
	"weapons/dualsword_stab2.wav",				// 1
	"weapons/dualsword_stab1_hit.wav",			// 2
	"weapons/dualsword_stab2_hit.wav",			// 3
	"weapons/katanad_hitwall.wav",				// 4
	
	"weapons/dualsword_slash_1.wav",			// 5
	"weapons/dualsword_slash_2.wav",			// 6
	"weapons/dualsword_slash_3.wav",			// 7
	"weapons/dualsword_slash_4.wav",			// 8
	"weapons/dualsword_hit1.wav",				// 9
	"weapons/dualsword_hit2.wav",				// 10
	"weapons/dualsword_hit3.wav",				// 11
	"weapons/dualsword_slash_4_1.wav",			// 12
	"weapons/dualsword_slash_4_2.wav",			// 13
	"weapons/dualsword_skill_end.wav",			// 14
	
	"weapons/dualsword_fly1.wav",				// 15
	"weapons/dualsword_fly2.wav",				// 16
	"weapons/dualsword_fly3.wav",				// 17
	"weapons/dualsword_fly4.wav",				// 18
	"weapons/dualsword_fly5.wav",				// 19
	"weapons/dualsword_skill_start.wav"
}

//Hit
#define	RESULT_HIT_NONE 			0
#define	RESULT_HIT_PLAYER			1
#define	RESULT_HIT_WORLD			2

enum _:WpnAnim
{
	ANIM_IDLEA = 0,
	ANIM_SLASH1,
	ANIM_SLASH2,
	ANIM_SLASH3,
	ANIM_SLASH4,
	ANIM_SLASHEND,
	ANIM_DRAWA,
	ANIM_IDLEB,
	ANIM_STAB1,
	ANIM_STAB2,
	ANIM_STABEND,
	ANIM_DRAWB
}

new g_had_dps[33], g_mode[33], g_slashend[33], g_check[33], g_soundmode[33]
new ef_sakura[4]
new Float:g_Sound[33]

new cvar_damage_slash[4], cvar_slash_radius, cvar_slash_range
new cvar_damage_stab[2], cvar_stab_radius, cvar_stab_range
new cvar_damage_special, cvar_special_range
new cvar_knockback[3], cvar_fast_attack, cvar_remove, cvar_spr

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
	register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
	register_forward(FM_AddToFullPack, "Fw_AddToFullPack_Post", 1);

	register_think("dps_entytyd", "Fw_DPSEnt_Think")
	
	RegisterHam(Ham_Item_PostFrame, weapon_dps, "fw_Item_PostFrame")
	register_clcmd(spr_wpn, "hook_rb")
	register_clcmd("dualsword", "get_dps", ADMIN_RCON)
	register_clcmd("say", "buy_dps")
	
	cvar_damage_slash[0] = register_cvar("dps_slashdamage_4","486.0")
	cvar_damage_slash[1] = register_cvar("dps_slashdamage_1","120.0")
	cvar_damage_slash[2] = register_cvar("dps_slashdamage_2","140.0")
	cvar_damage_slash[3] = register_cvar("dps_slashdamage_3","360.0")
	cvar_slash_radius = register_cvar("dps_slashradius","150.0")
	cvar_slash_range = register_cvar("dps_slashrange","115.0")
	
	cvar_damage_stab[0] = register_cvar("dps_stabdamage_2","1200.0")
	cvar_damage_stab[1] = register_cvar("dps_stabdamage_1","350.0")
	cvar_stab_radius = register_cvar("dps_stabradius","100.0")
	cvar_stab_range = register_cvar("dps_stabrange","190.0")
	
	cvar_damage_special = register_cvar("dps_specialdamage","95.0")
	cvar_special_range = register_cvar("dps_specialrange","120.0")
	
	cvar_knockback[0] = register_cvar("dps_slashknockback","0.0")
	cvar_knockback[1] = register_cvar("dps_stabknockback","0.0")
	cvar_knockback[2] = register_cvar("dps_specialknockback","0.0")
	
	cvar_fast_attack = register_cvar("dps_fast_attack_enabled", "1")
	cvar_remove = register_cvar("dps_remove_onnewround", "1")
	cvar_spr = register_cvar("dps_enable_sprites", "0")
	
}

public plugin_precache()
{
	precache_model(v_model)
	precache_model(p_model)
	precache_model(p_model2)
	
	for(new i = 0; i < sizeof(weapon_sound); i++)
		precache_sound(weapon_sound[i])
	
	precache_model("models/dualswordfx.mdl")
	precache_model("models/dualsword_skill.mdl")
	precache_model("models/dualsword_skillfx1.mdl")
	precache_model("models/dualsword_skillfx2.mdl")
	
	ef_sakura[0] = precache_model("sprites/leaf01_dualsword.spr")
	ef_sakura[1] = precache_model("sprites/leaf02_dualsword.spr")
	ef_sakura[2] = precache_model("sprites/petal01_dualsword.spr")
	ef_sakura[3] = precache_model("sprites/petal02_dualsword.spr")
	
	new Txt[32]
	format(Txt, 31, "sprites/%s.txt", spr_wpn)
	engfunc(EngFunc_PrecacheGeneric, Txt)
}


public hook_rb(id)
{
	engclient_cmd(id, weapon_dps)
	return PLUGIN_HANDLED
}

public buy_dps(id)
{
	new said[32]
	read_argv(1,said,31);
	if(equali(said,"/sword"))
		get_dps(id)
}

public get_dps(id)
{
	if (!is_user_alive(id))
		return

	g_had_dps[id] = 1
	g_mode[id] = 0
	g_slashend[id] = 0
	g_check[id] = 0
	g_soundmode[id] = 0
	
	fm_give_item(id, weapon_dps)
	
	if (get_user_weapon(id) == CSW_DPS) Event_CurWeapon(id)
	else engclient_cmd(id,weapon_dps)
}

public client_connect(id) remove_dps(id)
public client_disconnect(id) remove_dps(id)

public Event_NewRound()
{
	if(!get_pcvar_num(cvar_remove))
		return
	
	for(new i = 0; i < get_maxplayers(); i++)
		remove_dps(i)
}

public remove_dps(id)
{
	g_had_dps[id] = 0
	g_slashend[id] = 0
	g_check[id] = 0
	
	static iEnt; iEnt = fm_get_user_weapon_entity(id, CSW_DPS)
	if(!pev_valid(iEnt)) return
	
	set_pev(iEnt, pev_iuser1, 0)
	set_pev(iEnt, pev_iuser2, 0)
	set_pev(iEnt, pev_iuser3, 0)
	set_pev(iEnt, pev_iuser4, 0)
	set_pev(iEnt, pev_fuser1, 0.0)
}

public Event_CurWeapon(id)
{
	if(!is_user_alive(id))
		return 1
	if(get_user_weapon(id) != CSW_DPS)
		return 1
	if(!g_had_dps[id])
		return 1
		
	set_pev(id, pev_viewmodel2, v_model)
	set_pev(id, pev_weaponmodel2, g_mode[id] ? p_model2:p_model)
	
	Set_WeaponAnim(id, g_mode[id]?ANIM_DRAWA:ANIM_DRAWB)
	
	static iEnt; iEnt = fm_get_user_weapon_entity(id, CSW_DPS)
	if(!pev_valid(iEnt)) return 1
	
	set_pev(iEnt, pev_iuser1, 0)
	set_pev(iEnt, pev_iuser2, 0)
	set_pev(iEnt, pev_iuser3, 0)
	set_pev(iEnt, pev_iuser4, 0)
	set_pev(iEnt, pev_fuser1, 0.0)
		
	g_slashend[id] = 0
	g_check[id] = 0
	
	set_pdata_float(id, 83, 0.23)
	set_pdata_float(iEnt, 46, 0.25);
	set_pdata_float(iEnt, 47, 0.25);
	set_pdata_float(iEnt, 48, 0.25);
	
	if(get_pcvar_num(cvar_spr))
	{
		message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
		write_string(g_had_dps[id] == 1 ? spr_wpn : weapon_dps)
		write_byte(-1)
		write_byte(-1)
		write_byte(-1)
		write_byte(-1)
		write_byte(2)
		write_byte(1)
		write_byte(CSW_DPS)
		write_byte(0)
		message_end()
	}
	return 0
}

public message_DeathMsg(msg_id, msg_dest, msg_ent)
{
	new szWeapon[64]
	get_msg_arg_string(4, szWeapon, charsmax(szWeapon))
	
	if (strcmp(szWeapon, "knife"))
		return PLUGIN_CONTINUE

	new iEntity = get_pdata_cbase(get_msg_arg_int(1), 373)
	if (!pev_valid(iEntity) || get_pdata_int(iEntity, 43, 4) != CSW_DPS || !g_had_dps[get_msg_arg_int(1)])
		return PLUGIN_CONTINUE

	set_msg_arg_string(4, "dualsword")
	return PLUGIN_CONTINUE
}

public Fw_AddToFullPack_Post(esState, iE, iEnt, iHost, iHostFlags, iPlayer, pSet)
{
	if (!pev_valid(iEnt))
		return;
	if (pev(iEnt, pev_flags) & FL_KILLME) 
		return;

	new classname[32];
	pev(iEnt, pev_classname, classname, 31);

	if (equal(classname,"dps_entytyd") && pev(iEnt, pev_iuser4))
	{
		if (iHost != pev(iEnt, pev_owner))
			set_es(esState, ES_Effects, (get_es(esState, ES_Effects) | EF_NODRAW));
	}
}

public Fw_DPSEnt_Think(iEnt)
{
	if(!pev_valid(iEnt)) 
		return
	
	new iOwner
	iOwner = pev(iEnt, pev_owner)
	
	if(!is_user_alive(iOwner) || !is_user_connected(iOwner))
	{
		remove_entity(iEnt)
		g_soundmode[iOwner] = 0
		return
	}
	
	if(!Get_Entity_Mode(iEnt))
	{
		new iWpn,iState,Float:vecOrigin[3], Float:vecAngle[3];
		iWpn = pev(iEnt, pev_iuser1)
		iState = pev(iWpn, pev_iuser4)
		Stock_Get_Postion(iOwner, 0.0, 0.0, 0.0, vecOrigin);
		
		pev(iOwner, pev_v_angle, vecAngle);
		vecAngle[0] = -vecAngle[0];
		
		set_pev(iEnt, pev_origin, vecOrigin);
		set_pev(iEnt, pev_angles, vecAngle);
		
		if(!iState || get_user_weapon(iOwner) != CSW_DPS)
		{
			new Float:fRenderAmount;
			pev(iEnt, pev_renderamt, fRenderAmount);

			fRenderAmount -= 4.5;

			if (fRenderAmount <= 5.0)
			{
				remove_entity(iEnt);
				return;
			}
			set_pev(iEnt, pev_renderamt, fRenderAmount);
		}
	}
	
	if(Get_Entity_Mode(iEnt) == 1)
	{
		set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
	
		static Float:Origin[3]; pev(iOwner, pev_origin, Origin)
		Origin[2] -= 25.0
		
		Stock_Hook_Ent(iEnt, Origin, 0.01)
		
		if(pev(iEnt, pev_fuser1) < get_gametime() || !IsAlive(iOwner))
		{
			set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME)
			return
		}
			
		set_pev(iEnt, pev_velocity, Float:{1.0,1.0,1.0});
		set_pev(iEnt, pev_origin, Origin);
	}
	
	if(Get_Entity_Mode(iEnt) == 2)
	{
		new Float:vecOrigin[3]
		GetGunPosition(iOwner, vecOrigin);
		
		new Float:fOldOrigin[3];
		pev(iEnt, pev_oldorigin, fOldOrigin);
		
		new Float:vecNewOrigin[3];
		pev(iEnt, pev_origin, vecNewOrigin);
		
		new Float:vecfff[3];
		xs_vec_sub(vecOrigin, fOldOrigin, vecfff);
		xs_vec_add(vecNewOrigin, vecfff, vecNewOrigin);
		
		set_pev(iEnt, pev_origin, vecNewOrigin);
		set_pev(iEnt, pev_oldorigin, vecOrigin);
		
		if (pev(iEnt, pev_iuser1) == 2)
		{
			new Float:fDist = get_distance_f(vecOrigin, vecNewOrigin);
			if (fDist > 175.0 * 0.5)
			{
				remove_entity(iEnt);
				return;
			}
		}
		
		if(g_Sound[iOwner] < get_gametime())
		{
			if(!g_soundmode[iOwner]) emit_sound(iOwner, CHAN_ITEM, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			if(g_soundmode[iOwner] == 1) emit_sound(iOwner, CHAN_BODY, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			if(g_soundmode[iOwner] == 2) emit_sound(iOwner, CHAN_VOICE, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			if(g_soundmode[iOwner] == 3) emit_sound(iOwner, CHAN_WEAPON, weapon_sound[random_num(15,19)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
			
			g_soundmode[iOwner]++
			if(g_soundmode[iOwner] > 3) g_soundmode[iOwner] = 0
			
			g_Sound[iOwner] = get_gametime()+0.088;
		}
	}
	set_pev(iEnt, pev_nextthink, get_gametime() + 0.01)
	
	if(Get_Entity_Mode(iEnt) == 2)
	{
		new Float:fTimeLast;
		pev(iEnt, pev_fuser1, fTimeLast);
		
		if (fTimeLast < get_gametime() || pev(pev(iEnt, pev_iuser2), pev_fuser1) < get_gametime())
		{
			if (pev(iEnt, pev_iuser1) == 1)
			{
				new Float:fRenderAmount;
				pev(iEnt, pev_renderamt, fRenderAmount);
				fRenderAmount -= 7.5;
				
				if (fRenderAmount <= 5.0)
				{
					remove_entity(iEnt);
					return;
				}
				set_pev(iEnt, pev_renderamt, fRenderAmount);
			} else remove_entity(iEnt);
			
			g_soundmode[iOwner] = 0
		}
	}
}

public fw_Item_PostFrame(ent)
{
	new id = pev(ent, pev_owner)
	
	if(!is_user_connected(id))
		return HAM_IGNORED
	if(get_user_weapon(id) != CSW_DPS || !g_had_dps[id])
		return HAM_IGNORED

	if(get_pdata_float(ent, 48, 4) <= 0.01 && (!pev(ent, pev_iuser2) || !g_slashend[id]))
	{
		if(g_check[id] < 6) g_check[id] = 0
		set_pev(ent, pev_iuser3, 0)
		Set_WeaponAnim(id, g_mode[id]?ANIM_IDLEA:ANIM_IDLEB)
		set_pdata_float(ent, 48, 4.03, 4)
	}
	
	new iButton = pev(id,pev_button)
	return AurezBotac(id, ent, iButton)
}

public AurezBotac(id, iEnt, iButton)
{
	new iState = pev(iEnt, pev_iuser3)
	new iState2 = pev(iEnt, pev_iuser2)
	new iSlash = pev(iEnt, pev_iuser4)
	new Float:fSound; pev(iEnt, pev_fuser1, fSound)
	new Float:fRange = get_pcvar_float(g_mode[id] ? cvar_slash_range : cvar_stab_range)
	
	if(!(iButton & IN_ATTACK) && get_pdata_float(iEnt, 46,4) <= 0.0 && iState2)
	{
		if(!iState || iState == 1)
		{
			Set_WeaponAnim(id, ANIM_STABEND)
			set_pev(iEnt, pev_iuser2, 0)
			set_pdata_float(iEnt, 48, 1.45,4)
		}
	}
	
	if(!(iButton & IN_ATTACK2) && get_pdata_float(iEnt, 47,4) <= 0.0 && g_slashend[id])
	{
		Set_WeaponAnim(id, ANIM_SLASHEND)
		set_pdata_float(iEnt, 48, 2.03,4)
		g_slashend[id] = 0
	}
	
	if (get_pdata_float(id, 83) <= 0.0 && pev(iEnt, pev_iuser1))
	{
		new Float:fAngle = get_pcvar_float(g_mode[id] ? cvar_slash_radius : cvar_stab_radius)
		new Float:fDamage = get_pcvar_float(g_mode[id] ? cvar_damage_slash[iSlash] : cvar_damage_stab[iState])
		
		new iHitResult = KnifeAttack_Global(id, true, fRange, fAngle, fDamage, get_pcvar_float(cvar_knockback[1+g_mode[id]]))
		switch (iHitResult)
		{
			case RESULT_HIT_PLAYER : client_cmd(id, "spk %s", weapon_sound[g_mode[id]?random_num(9,11):iState+2]) 
			case RESULT_HIT_WORLD : client_cmd(id, "spk %s", weapon_sound[4])
		}
		set_pev(iEnt, pev_iuser1, 0);
	}
	
	if(get_pdata_float(iEnt, 47,4) <= 0.0 && iSlash && iSlash <= 4)
	{
		set_pev(iEnt, pev_iuser4, 1 + iSlash)
		Set_WeaponAnim(id, 1 + iSlash)
		
		set_pdata_float(id, 83, 0.06)
		
		if(!get_pcvar_num(cvar_fast_attack)) 
			set_pdata_float(iEnt, 46, iSlash == 3 ? (g_check[id] == 5 ? 0.43 : 0.7) : 0.13,4);
		
		set_pdata_float(iEnt, 47, iSlash == 3 ? (g_check[id] == 5 ? 0.43 : 0.7) : 0.13,4);
		set_pdata_float(iEnt, 48, iSlash == 3 ? 1.4 : 1.0,4);
		  
		set_pev(iEnt, pev_iuser1, 1)
		set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
		SendSound(id, CHAN_WEAPON, weapon_sound[5 + iSlash])
		Create_Slash(id,iEnt,iSlash)
		
		if(iSlash == 3) 
		{
			g_slashend[id] = 1
			
			set_pev(iEnt, pev_fuser1, get_gametime() + (g_check[id] == 5 ? 0.43 : 0.5))
			set_pev(iEnt, pev_iuser4, 0)
		}
	}
	
	if(fSound && fSound < get_gametime())
	{
		SendSound(id,CHAN_VOICE,weapon_sound[g_check[id] == 5 ? 13 : 12])
		set_pev(iEnt, pev_fuser1, 0.0)
		
		if(g_check[id] == 5) 
		{
			Set_WeaponAnim(id, 14)
			SendSound(id,CHAN_ITEM,weapon_sound[20])
			g_check[id] = 6
			
			set_pdata_float(iEnt, 46, 1.03,4)
			set_pdata_float(iEnt, 47, 1.03,4)
			set_pdata_float(iEnt, 48, 1.03,4)
			
			set_pev(iEnt, pev_fuser4, get_gametime()+1.7);
			DPS_Special(id, 0, 2.0)
		}
	}
	
	if(g_check[id] == 6 && get_pdata_float(iEnt, 46,4) <= 0.0)
	{
		set_pdata_float(iEnt, 46, 11.36,4)
		set_pdata_float(iEnt, 47, 11.36,4)
		set_pdata_float(iEnt, 48, 11.36,4)
		
		g_check[id] = 7
		set_pev(iEnt, pev_fuser1, get_gametime() + 10.6)
		Set_WeaponAnim(id, 15)
	}
	
	// NANI?!
	if(g_check[id] == 7 && fSound && fSound < get_gametime())
	{
		SendSound(id,CHAN_VOICE,weapon_sound[14])
		set_pev(iEnt, pev_fuser1, 0.0)
		g_check[id] = 0
		
		DPS_Special(id, 1, 1.46)
	}
	
	DPS_RealSpecial(id, iEnt, fRange)
	
	if(iButton & IN_ATTACK && get_pdata_float(iEnt, 46,4) <= 0.0)
	{
		g_mode[id] = 0
		g_slashend[id] = 0
		
		set_pev(iEnt, pev_iuser2, 1)
		set_pev(iEnt, pev_iuser4, 0)
		
		switch(iState)
		{
			case 0:
			{
				set_pdata_float(id, 83, 0.16)
				set_pdata_float(iEnt, 46, 0.4,4);
				
				if(!get_pcvar_num(cvar_fast_attack)) 
					set_pdata_float(iEnt, 47, 0.4,4);
					
				set_pdata_float(iEnt, 48, 1.0,4);
				
				set_pev(iEnt, pev_iuser1, 1)
				set_pev(iEnt, pev_iuser3, 1)
				set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
				
				Set_WeaponAnim(id, ANIM_STAB1)
				SendSound(id, CHAN_WEAPON, weapon_sound[0])
				
				if(!g_check[id]) g_check[id] = 1
				else if(g_check[id] == 2) g_check[id] = 3
				else g_check[id] = 0
			}
			case 1:
			{
				set_pdata_float(id, 83, 0.16)
				set_pdata_float(iEnt, 46, 0.83,4);
				
				if(!get_pcvar_num(cvar_fast_attack)) 
					set_pdata_float(iEnt, 47, 0.83,4);
				
				set_pdata_float(iEnt, 48, 1.5,4);
				
				set_pev(iEnt, pev_iuser1, 1)
				set_pev(iEnt, pev_iuser3, 0)
				set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
				
				Set_WeaponAnim(id, ANIM_STAB2)
				SendSound(id, CHAN_WEAPON, weapon_sound[1])
				
				if(g_check[id] == 3) g_check[id] = 4
				else g_check[id] = 0
			}
		}
	}
	
	if(iButton & IN_ATTACK2 && get_pdata_float(iEnt, 47) <= 0.0 && !iSlash)
	{
		g_mode[id] = 1
		
		set_pdata_float(id, 83, 0.04)
		
		if(!get_pcvar_num(cvar_fast_attack)) 
			set_pdata_float(iEnt, 46, 0.13,4);
		
		set_pdata_float(iEnt, 47, 0.13,4);
		set_pdata_float(iEnt, 48, 0.5,4);
		
		set_pev(iEnt, pev_iuser1, 1)
		set_pev(iEnt, pev_iuser2, 0)
		set_pev(iEnt, pev_iuser3, 0)
		set_pev(iEnt, pev_iuser4, 1)
		set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
		
		Set_WeaponAnim(id, ANIM_SLASH1)
		SendSound(id, CHAN_WEAPON, weapon_sound[5])
		
		Create_Slash(id,iEnt,0)
		
		if(g_check[id] == 1) g_check[id] = 2
		else if(g_check[id] == 4) g_check[id] = 5
		else g_check[id] = 0
	}
	
	iButton &= ~IN_ATTACK;
	iButton &= ~IN_ATTACK2;
	set_pev(id, pev_button, iButton);
	return HAM_IGNORED
}

stock Create_Slash(id,iEnt,seq)
{
	new Float:vecOrigin[3], Float:vecAngle[3];
	GetGunPosition(id, vecOrigin);
	pev(id, pev_v_angle, vecAngle);
	vecAngle[0] = -vecAngle[0];
	
	new pEntity = DPS_Entites(id,"models/dualswordfx.mdl",vecOrigin,vecOrigin,0.01,SOLID_NOT,seq)
		
	// Set info for ent	
	Set_Entity_Mode(pEntity, 0)
	set_pev(pEntity, pev_scale, 0.1);
	set_pev(pEntity, pev_iuser1, iEnt);
	set_pev(pEntity, pev_velocity, Float:{0.01,0.01,0.01});
	set_pev(pEntity, pev_angles, vecAngle);
	set_pev(pEntity, pev_nextthink, get_gametime()+0.01);
}

stock DPS_Special(id, seq, Float:fTime)
{
	new Float:VecOrig[3], Float:VecAng[3]
	pev(id, pev_origin, VecOrig)
	pev(id, pev_angles, VecAng)
	
	new iEfx = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
	set_pev(iEfx, pev_classname, "dps_entytyd");
	set_pev(iEfx, pev_origin, VecOrig)
	set_pev(iEfx, pev_frame, 0.0)
	set_pev(iEfx, pev_animtime, get_gametime())
	set_pev(iEfx, pev_framerate, 1.0)
	set_pev(iEfx, pev_sequence, seq)
	engfunc(EngFunc_SetModel, iEfx, "models/dualsword_skill.mdl")
	dllfunc(DLLFunc_Spawn, iEfx)
	Set_Entity_Mode(iEfx, 1)
	set_pev(iEfx, pev_angles, VecAng)
	set_pev(iEfx, pev_solid, SOLID_NOT)
	set_pev(iEfx, pev_owner, id)
	set_pev(iEfx, pev_velocity, Float:{0.01,0.01,0.01});
	set_pev(iEfx, pev_fuser1, get_gametime() + fTime)
	set_pev(iEfx, pev_nextthink, get_gametime() + 0.01)
}

stock DPS_RealSpecial(id, iEnt, Float:fRange)
{
	new Float:fTimeEffect;
	pev(iEnt, pev_fuser4, fTimeEffect);
	
	if (g_check[id] == 7 && fTimeEffect && fTimeEffect <= get_gametime())
	{
		KnifeAttack_Global(id, false, get_pcvar_float(cvar_special_range)*2.0, 180.0, get_pcvar_float(cvar_damage_special), get_pcvar_float(cvar_knockback[2]))
			
		new Float:vecOrigin3[2][3], Float:vecOrigin[3];
		pev(id, pev_origin, vecOrigin3[0]);
		pev(id, pev_origin, vecOrigin);
		xs_vec_copy(vecOrigin3[0], vecOrigin3[1]);
		
		new Float:fFloat = random_float(fRange * -0.85, fRange * 0.85);
		vecOrigin3[0][2] = vecOrigin3[1][2] = vecOrigin3[0][2] + random_float(-5.0, 65.0);
		
		switch (random(3))
		{
			case 0:
			{
				vecOrigin3[0][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] += fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] -= fFloat*random_float(-1.0, 1.0);
			}
			case 1:
			{
				vecOrigin3[0][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] -= fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] += fFloat*random_float(-1.0, 1.0);
			}
			case 2:
			{
				vecOrigin3[0][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] += fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] -= fFloat*random_float(-1.0, 1.0);
			}
			case 3:
			{
				vecOrigin3[0][0] -= fFloat*random_float(-1.0, 1.0);
				vecOrigin3[0][1] -= fFloat*random_float(-1.0, 1.0);
				
				vecOrigin3[1][0] += fFloat*random_float(-1.0, 1.0);
				vecOrigin3[1][1] += fFloat*random_float(-1.0, 1.0);
			}
		}
		
		if (random_num(0,9) > 8)
		{
			new Float:vecAngle2[3];
			vecAngle2[0] = random_num(0,1) ? random_float(-30.0, -15.0) : random_float(15.0, 30.0);
			vecAngle2[1] = random_num(0,1) ? random_float(-180.0, 0.0) : random_float(0.0, 180.0);
			
			new pEntity = DPS_Entites(id,"models/dualsword_skillfx1.mdl",vecOrigin3[0],vecOrigin3[0],0.01,SOLID_NOT,0)	
			set_pev(pEntity, pev_angles, vecAngle2);
			set_pev(pEntity, pev_velocity, Float:{0.01,0.01,0.01});
			set_pev(pEntity, pev_iuser1, 1);
			set_pev(pEntity, pev_iuser2, iEnt);
			set_pev(pEntity, pev_frame, 0.0);
			Set_Entity_Mode(pEntity, 2)
			set_pev(pEntity, pev_fuser1, get_gametime()+0.53);
			set_pev(pEntity, pev_fuser2, get_gametime()+0.5);
			set_pev(pEntity, pev_fuser3, get_gametime()+0.31);
			set_pev(pEntity, pev_oldorigin, vecOrigin);
			set_pev(pEntity, pev_nextthink, get_gametime()+0.01);
		}
		
		new pEntity = DPS_Entites(id,"models/dualsword_skillfx2.mdl",vecOrigin3[0],vecOrigin3[1],500.0,SOLID_TRIGGER,0)	
		set_pev(pEntity, pev_iuser1, 2);
		set_pev(pEntity, pev_iuser2, iEnt);
		Set_Entity_Mode(pEntity, 2)
		set_pev(pEntity, pev_frame, 0.0);
		set_pev(pEntity, pev_oldorigin, vecOrigin);
		set_pev(pEntity, pev_fuser1, get_gametime()+0.2);
		set_pev(pEntity, pev_fuser2, get_gametime()+0.5);
		set_pev(pEntity, pev_fuser3, get_gametime()+0.3);
		set_pev(pEntity, pev_nextthink, get_gametime()+0.01);
		
		set_pev(iEnt, pev_fuser4, get_gametime()+0.05);
	}
}

stock DPS_Entites(id, models[], Float:Start[3], Float:End[3], Float:speed, solid, seq, move=MOVETYPE_FLY)
{
	new pEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
		
	// Set info for ent	
	set_pev(pEntity, pev_movetype, move);
	set_pev(pEntity, pev_owner, id);
	engfunc(EngFunc_SetModel, pEntity, models);
	set_pev(pEntity, pev_classname, "dps_entytyd");
	set_pev(pEntity, pev_mins, Float:{-1.0, -1.0, -1.0});
	set_pev(pEntity, pev_maxs, Float:{1.0, 1.0, 1.0});
	set_pev(pEntity, pev_origin, Start);
	set_pev(pEntity, pev_gravity, 0.01);
	set_pev(pEntity, pev_solid, solid);
	
	static Float:Velocity[3];
	Stock_Get_Speed_Vector(Start, End, speed, Velocity);
	set_pev(pEntity, pev_velocity, Velocity);

	new Float:vecVAngle[3]; pev(id, pev_v_angle, vecVAngle);
	vector_to_angle(Velocity, vecVAngle)
	
	if(vecVAngle[0] > 90.0) vecVAngle[0] = -(360.0 - vecVAngle[0]);
	set_pev(pEntity, pev_angles, vecVAngle);
	
	set_pev(pEntity, pev_rendermode, kRenderTransAdd);
	set_pev(pEntity, pev_renderamt, 255.0);
	set_pev(pEntity, pev_sequence, seq)
	set_pev(pEntity, pev_animtime, get_gametime());
	set_pev(pEntity, pev_framerate, 1.0)
	return pEntity;
}

stock Set_Entity_Mode(iEnt, mode) set_pev(iEnt, pev_iuser3, mode)
stock Get_Entity_Mode(iEnt) return pev(iEnt,pev_iuser3)

stock SendSound(id, chan, sample[]) emit_sound(id, chan, sample, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

stock Stock_Get_Speed_Vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
	xs_vec_sub(origin2, origin1, new_velocity)
	new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
	xs_vec_mul_scalar(new_velocity, num, new_velocity)
}
stock GetGunPosition(id, Float:vecSrc[3])
{
	new Float:vecViewOfs[3];
	pev(id, pev_origin, vecSrc);
	pev(id, pev_view_ofs, vecViewOfs);
	xs_vec_add(vecSrc, vecViewOfs, vecSrc);
}
stock KnifeAttack_Global(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack)
{
	new iHitResult
	if(fAngle > 0.0) iHitResult = KnifeAttack2(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack)
	else iHitResult = KnifeAttack(id, bStab, Float:flRange, Float:flDamage, Float:flKnockBack)

	return iHitResult
}

stock KnifeAttack(id, bStab, Float:flRange, Float:flDamage, Float:flKnockBack, iHitgroup = -1, bitsDamageType = DMG_NEVERGIB | DMG_CLUB)
{
	new Float:vecSrc[3], Float:vecEnd[3], Float:v_angle[3], Float:vecForward[3];
	GetGunPosition(id, vecSrc);

	pev(id, pev_v_angle, v_angle);
	engfunc(EngFunc_MakeVectors, v_angle);

	global_get(glb_v_forward, vecForward);
	xs_vec_mul_scalar(vecForward, flRange, vecForward);
	xs_vec_add(vecSrc, vecForward, vecEnd);

	new tr = create_tr2();
	engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);

	new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
	if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
	
	get_tr2(tr, TR_flFraction, flFraction);

	new iHitResult = RESULT_HIT_NONE;
	
	if (flFraction < 1.0)
	{
		new pEntity = get_tr2(tr, TR_pHit);
		iHitResult = RESULT_HIT_WORLD;
		
		if (pev_valid(pEntity) && (IsPlayer(pEntity) || IsHostage(pEntity)))
		{
			if (CheckBack(id, pEntity) && bStab && iHitgroup == -1)
				flDamage *= 1.0;

			iHitResult = RESULT_HIT_PLAYER;
		}

		if (pev_valid(pEntity))
		{
			engfunc(EngFunc_MakeVectors, v_angle);
			global_get(glb_v_forward, vecForward);

			if (iHitgroup != -1)
				set_tr2(tr, TR_iHitgroup, iHitgroup);

			ExecuteHamB(Ham_TraceAttack, pEntity, id, flDamage, vecForward, tr, bitsDamageType);
			ExecuteHamB(Ham_TakeDamage, pEntity, id, id, flDamage, bitsDamageType)
			Stock_Fake_KnockBack(id, pEntity, flKnockBack)
			
			if (IsAlive(pEntity))
			{
				free_tr2(tr);
				return iHitResult;
			}
		}
	}
	free_tr2(tr);
	return iHitResult;
}

stock KnifeAttack2(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack, iHitgroup = -1, bNoTraceCheck = 0)
{
	new Float:vecOrigin[3], Float:vecSrc[3], Float:vecEnd[3], Float:v_angle[3], Float:vecForward[3];
	pev(id, pev_origin, vecOrigin);

	new iHitResult = RESULT_HIT_NONE;
	GetGunPosition(id, vecSrc);

	pev(id, pev_v_angle, v_angle);
	engfunc(EngFunc_MakeVectors, v_angle);

	global_get(glb_v_forward, vecForward);
	xs_vec_mul_scalar(vecForward, flRange, vecForward);
	xs_vec_add(vecSrc, vecForward, vecEnd);

	new tr = create_tr2();
	engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
	
	new Float:EndPos2[3]
	get_tr2(tr, TR_vecEndPos, EndPos2)
	
	new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
	if (flFraction < 1.0) 
	{
		iHitResult = RESULT_HIT_WORLD;
		if(bStab) Stock_SakuraEffect(id, EndPos2)
	}
	
	new Float:vecEndZ = vecEnd[2];
	
	new pEntity = -1;
	while ((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, vecOrigin, flRange)) != 0)
	{
		if (!pev_valid(pEntity))
			continue;
		if (id == pEntity)
			continue;
		if (!IsAlive(pEntity))
			continue;
		if (!CheckAngle(id, pEntity, fAngle))
			continue;

		GetGunPosition(id, vecSrc);
		Stock_Get_Origin(pEntity, vecEnd);

		vecEnd[2] = vecSrc[2] + (vecEndZ - vecSrc[2]) * (get_distance_f(vecSrc, vecEnd) / flRange);

		xs_vec_sub(vecEnd, vecSrc, vecForward);
		xs_vec_normalize(vecForward, vecForward);
		xs_vec_mul_scalar(vecForward, flRange, vecForward);
		xs_vec_add(vecSrc, vecForward, vecEnd);

		engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
		get_tr2(tr, TR_flFraction, flFraction);

		if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
		get_tr2(tr, TR_flFraction, flFraction);

		if (flFraction < 1.0)
		{
			if (IsPlayer(pEntity) || IsHostage(pEntity))
			{
				iHitResult = RESULT_HIT_PLAYER;
				if(bStab) Stock_SakuraEffect(id, vecEnd)
				
				if (CheckBack(id, pEntity) && bStab && iHitgroup == -1)
					flDamage *= 1.0;
			}

			if (get_tr2(tr, TR_pHit) == pEntity || bNoTraceCheck)
			{
				engfunc(EngFunc_MakeVectors, v_angle);
				global_get(glb_v_forward, vecForward);

				if (iHitgroup != -1) set_tr2(tr, TR_iHitgroup, iHitgroup);

				ExecuteHamB(Ham_TraceAttack, pEntity, id, flDamage, vecForward, tr, DMG_NEVERGIB | DMG_CLUB);
				ExecuteHamB(Ham_TakeDamage, pEntity, id, id, flDamage, DMG_NEVERGIB | DMG_CLUB)
				
				Stock_Fake_KnockBack(id, pEntity, flKnockBack)
			}
		}
		free_tr2(tr);
	}
	return iHitResult;
}

stock Set_WeaponAnim(id, anim)
{
	set_pev(id, pev_weaponanim, anim)
	
	message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
	write_byte(anim)
	write_byte(pev(id, pev_body))
	message_end()
}

stock Stock_Set_Vis(iEnt, iVis = 1)
	set_pev(iEnt, pev_effects, iVis == 1 ? pev(iEnt, pev_effects) & ~EF_NODRAW : pev(iEnt, pev_effects) | EF_NODRAW)

stock Stock_Hook_Ent(ent, Float:TargetOrigin[3], Float:Speed, mode=0)
{
	static Float:fl_Velocity[3],Float:EntOrigin[3],Float:distance_f,Float:fl_Time
	pev(ent, pev_origin, EntOrigin)
	
	if(!mode)
	{
		distance_f = get_distance_f(EntOrigin, TargetOrigin)
		fl_Time = distance_f / Speed
			
		pev(ent, pev_velocity, fl_Velocity)
			
		fl_Velocity[0] = (TargetOrigin[0] - EntOrigin[0]) / fl_Time
		fl_Velocity[1] = (TargetOrigin[1] - EntOrigin[1]) / fl_Time
		fl_Velocity[2] = (TargetOrigin[2] - EntOrigin[2]) / fl_Time

		if(vector_length(fl_Velocity) > 1.0) set_pev(ent, pev_velocity, fl_Velocity)
		else set_pev(ent, pev_velocity, Float:{0.01, 0.01, 0.01})
	} else {
		static Float:fl_EntVelocity[3], Float:fl_Acc[3]
		Stock_Directed_Vector(TargetOrigin, EntOrigin, fl_Velocity)
		xs_vec_mul_scalar(fl_Velocity, Speed, fl_Velocity)
		
		for(new i =0; i<3; i++)
		{
			if(fl_Velocity[i] > fl_EntVelocity[i]) 
			{
				fl_Acc[i] = fl_Velocity[i]-fl_EntVelocity[i]
				fl_Acc[i] = floatmin(70.0, fl_Acc[i])
				fl_EntVelocity[i] += fl_Acc[i]
			}
			else if(fl_Velocity[i] < fl_EntVelocity[i])
			{
				fl_Acc[i] = fl_EntVelocity[i]-fl_Velocity[i]
				fl_Acc[i] = floatmin(70.0, fl_Acc[i])
				fl_EntVelocity[i] -= fl_Acc[i]
			}
		}
		set_pev(ent, pev_velocity, fl_EntVelocity)
	}
}

stock Stock_Directed_Vector(Float:start[3],Float:end[3],Float:reOri[3])
{	
	new Float:v3[3],i
	for(i=0;i<3;i++) v3[i]=start[i]-end[i]

	new Float:vl = vector_length(v3)
	for(i=0;i<3;i++) reOri[i] = v3[i] / vl
}

stock Stock_Get_Postion(id,Float:forw,Float:right,Float:up,Float:vStart[])
{
	static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
	pev(id, pev_origin, vOrigin)
	pev(id, pev_view_ofs,vUp)
	xs_vec_add(vOrigin,vUp,vOrigin)
	pev(id, pev_v_angle, vAngle)
	
	engfunc(EngFunc_AngleVectors, vAngle, vForward, vRight, 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 IsPlayer(pEntity) return is_user_connected(pEntity)

stock IsHostage(pEntity)
{
	new classname[32]; pev(pEntity, pev_classname, classname, charsmax(classname))
	return equal(classname, "hostage_entity")
}

stock IsAlive(pEntity)
{
	if (pEntity < 1) return 0
	return (pev(pEntity, pev_deadflag) == DEAD_NO && pev(pEntity, pev_health) > 0)
}

stock CheckBack(iEnemy,id)
{
	new Float:anglea[3], Float:anglev[3]
	pev(iEnemy, pev_v_angle, anglea)
	pev(id, pev_v_angle, anglev)
	new Float:angle = anglea[1] - anglev[1] 
	if (angle < -180.0) angle += 360.0
	if (angle <= 45.0 && angle >= -45.0) return 1
	return 0
}

stock CheckAngle(iAttacker, iVictim, Float:fAngle)  return(Stock_CheckAngle(iAttacker, iVictim) > floatcos(fAngle,degrees))

stock Float:Stock_CheckAngle(id,iTarget)
{
	new Float:vOricross[2],Float:fRad,Float:vId_ori[3],Float:vTar_ori[3],Float:vId_ang[3],Float:fLength,Float:vForward[3]
	Stock_Get_Origin(id, vId_ori)
	Stock_Get_Origin(iTarget, vTar_ori)
	
	pev(id,pev_angles,vId_ang)
	for(new i=0;i<2;i++) vOricross[i] = vTar_ori[i] - vId_ori[i]
	
	fLength = floatsqroot(vOricross[0]*vOricross[0] + vOricross[1]*vOricross[1])
	
	if (fLength<=0.0)
	{
		vOricross[0]=0.0
		vOricross[1]=0.0
	} else {
		vOricross[0]=vOricross[0]*(1.0/fLength)
		vOricross[1]=vOricross[1]*(1.0/fLength)
	}
	
	engfunc(EngFunc_MakeVectors,vId_ang)
	global_get(glb_v_forward,vForward)
	
	fRad = vOricross[0]*vForward[0]+vOricross[1]*vForward[1]
	return fRad   //->   RAD 90' = 0.5rad
}

stock Stock_Get_Origin(id, Float:origin[3])
{
	new Float:maxs[3],Float:mins[3]
	if (pev(id, pev_solid) == SOLID_BSP)
	{
		pev(id,pev_maxs,maxs)
		pev(id,pev_mins,mins)
		origin[0] = (maxs[0] - mins[0]) / 2 + mins[0]
		origin[1] = (maxs[1] - mins[1]) / 2 + mins[1]
		origin[2] = (maxs[2] - mins[2]) / 2 + mins[2]
	} else pev(id, pev_origin, origin)
}

public Stock_Fake_KnockBack(id, iVic, Float:iKb)
{
	if(iVic > 32) return
	
	new Float:vAttacker[3], Float:vVictim[3], Float:vVelocity[3], flags
	pev(id, pev_origin, vAttacker)
	pev(iVic, pev_origin, vVictim)
	vAttacker[2] = vVictim[2] = 0.0
	flags = pev(id, pev_flags)
	
	xs_vec_sub(vVictim, vAttacker, vVictim)
	new Float:fDistance
	fDistance = xs_vec_len(vVictim)
	xs_vec_mul_scalar(vVictim, 1 / fDistance, vVictim)
	
	pev(iVic, pev_velocity, vVelocity)
	xs_vec_mul_scalar(vVictim, iKb, vVictim)
	xs_vec_mul_scalar(vVictim, 50.0, vVictim)
	vVictim[2] = xs_vec_len(vVictim) * 0.15
	
	if(flags &~ FL_ONGROUND)
	{
		xs_vec_mul_scalar(vVictim, 1.2, vVictim)
		vVictim[2] *= 0.4
	}
	if(xs_vec_len(vVictim) > xs_vec_len(vVelocity)) set_pev(iVic, pev_velocity, vVictim)
}	

stock Float:Stock_Get_Body_Dmg(iBody)
{
	switch (iBody)
	{
		case HIT_GENERIC: return 0.75
		case 1: return 4.0
		case 2: return 1.0
		case 3: return 1.25
		case 4,5,6,7: return 0.75
		default: return 0.75
	}
	return 1.0
}

stock Stock_SakuraEffect(id, Float:vecOri[3])
{
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOri)
	write_byte(TE_BLOODSPRITE)
	engfunc(EngFunc_WriteCoord,vecOri[0])
	engfunc(EngFunc_WriteCoord,vecOri[1])
	engfunc(EngFunc_WriteCoord,vecOri[2])
	write_short(ef_sakura[g_mode[id]?2:0])
	write_short(ef_sakura[g_mode[id]?3:1])
	write_byte(g_mode[id]?178:128)
	write_byte(random_num(2,3))
	message_end()
}

stock can_damage(id1, id2)
{
	if(id1 <= 0 || id1 >= 33 || id2 <= 0 || id2 >= 33)
		return 1
		
	// Check team
	return(get_pdata_int(id1, 114) != get_pdata_int(id2, 114))
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/

Any ideas?
Attached Files
File Type: zip [CSO] Dualsword.zip (2.82 MB, 41 views)
File Type: sma Get Plugin or Get Source (zp_dps.sma - 320 views - 33.9 KB)
File Type: sma Get Plugin or Get Source (dps.sma - 340 views - 33.7 KB)
SaBBa is offline