Raised This Month: $ Target: $400
 0% 

Request modify .sma to inl.


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
luciansobo2
Junior Member
Join Date: May 2024
Old 05-03-2024 , 20:09   Request modify .sma to inl.
Reply With Quote #1

Hello this is the .sma
Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <xs>

#define PLUGIN "Dragon Sword"
#define VERSION "2.0"
#define AUTHOR "Dias Leon"

#define V_MODEL "models/v_dragonsword2.mdl"
#define P_MODEL "models/p_dragonsword.mdl"

#define CSW_DRAGONSWORD CSW_KNIFE
#define weapon_dragonsword "weapon_knife"
#define WEAPON_ANIMEXT "knife" //"skullaxe"

#define DRAW_TIME 1.0

#define SLASH_ROTATE_DAMAGE 75.0
#define SLASH_ROTATE_RADIUS 110.0
#define SLASH_ROTATE_POINT_DIS 60.0
#define SLASH_ROTATE_DELAY_TIME 0.7
#define SLASH_ROTATE_RESET_TIME 1.0

#define SLASH_AHEAD_DAMAGE 90.0
#define SLASH_AHEAD_RADIUS 90.0
#define SLASH_AHEAD_POINT_DIS 30.0
#define SLASH_AHEAD_DELAY_TIME 0.3
#define SLASH_AHEAD_RESET_TIME 0.9

#define STAB_DAMAGE 110.0
#define STAB_RADIUS 100.0
#define STAB_POINT_DIS 80.0
#define STAB_TIME 0.657
#define STAB_RESET_TIME 0.75

#define TASK_SLASHING 2033+20
#define TASK_STABING 2033+10

// OFFSET
const PDATA_SAFE = 2
const OFFSET_LINUX_WEAPONS = 4
const OFFSET_WEAPONOWNER = 41
const m_flNextAttack = 83
const m_szAnimExtention = 492

new const DragonSword_Sound[8][] = 
{
	"weapons/dragonsword_draw.wav",
	"weapons/dragonsword_hit1.wav",
	"weapons/dragonsword_hit2.wav",
	"weapons/dragonsword_idle.wav",
	"weapons/dragonsword_slash1.wav",
	"weapons/dragonsword_slash2.wav",
	"weapons/dragonsword_stab_hit.wav",
	"weapons/dragonsword_wall.wav"
}

enum
{
	ATTACK_SLASH_ROTATE = 1,
	ATTACK_SLASH_AHEAD,
	ATTACK_STAB
}

enum
{
	DS_ANIM_IDLE = 0,
	DS_ANIM_SLASH_ROTATE,
	DS_ANIM_SLASH_AHEAD,
	DS_ANIM_DRAW,
	DS_ANIM_STAB_BEGIN,
	DS_ANIM_STAB_END
}

enum
{
	HIT_NOTHING = 0,
	HIT_ENEMY,
	HIT_WALL
}

new g_Had_DragonSword[33], g_Slashing_Mode[33], g_Attack_Mode[33], g_Checking_Mode[33], g_Hit_Ing[33]
new g_Old_Weapon[33], g_Ham_Bot, g_MaxPlayers

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
	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_TraceAttack, "player", "fw_PlayerTraceAttack")
	
	g_MaxPlayers = get_maxplayers()
	register_clcmd("admin_get_dragonsword", "get_dragonsword", ADMIN_KICK)
}

public plugin_precache()
{
	engfunc(EngFunc_PrecacheModel, V_MODEL)
	engfunc(EngFunc_PrecacheModel, P_MODEL)
	
	for(new i = 0; i < sizeof(DragonSword_Sound); i++)
		engfunc(EngFunc_PrecacheSound, DragonSword_Sound[i])
}

public get_dragonsword(id)
{
	if(!is_user_alive(id))
		return
		
	remove_task(id+TASK_SLASHING)
	remove_task(id+TASK_STABING)
		
	g_Had_DragonSword[id] = 1
	g_Slashing_Mode[id] = 0
	g_Attack_Mode[id] = 0
	g_Checking_Mode[id] = 0
	g_Hit_Ing[id] = 0
	
	if(get_user_weapon(id) == CSW_KNIFE)
	{
		set_pev(id, pev_viewmodel2, V_MODEL)
		set_pev(id, pev_weaponmodel2, P_MODEL)	
		
		set_weapon_anim(id, DS_ANIM_DRAW)
		set_player_nextattack(id, DRAW_TIME)
	} else {
		engclient_cmd(id, weapon_dragonsword)
	}
}

public remove_dragonsword(id)
{
	remove_task(id+TASK_SLASHING)
	remove_task(id+TASK_STABING)
		
	g_Had_DragonSword[id] = 0
	g_Slashing_Mode[id] = 0
	g_Attack_Mode[id] = 0
	g_Checking_Mode[id] = 0
	g_Hit_Ing[id] = 0
}

public client_putinserver(id)
{
	if(!g_Ham_Bot && is_user_bot(id))
	{
		g_Ham_Bot = 1
		set_task(0.1, "Do_RegisterHam_Bot", id)
	}
}

public Do_RegisterHam_Bot(id)
{
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_PlayerTraceAttack")
}

public Event_NewRound()
{
	for(new i = 0; i < g_MaxPlayers; i++)
		remove_dragonsword(i)
}

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

	// Problem Here ?. SHUT THE FUCK UP
	if((read_data(2) == CSW_DRAGONSWORD && g_Old_Weapon[id] != CSW_DRAGONSWORD) && g_Had_DragonSword[id])
	{
		set_pev(id, pev_viewmodel2, V_MODEL)
		set_pev(id, pev_weaponmodel2, P_MODEL)
	
		set_weapon_anim(id, DS_ANIM_DRAW)
		set_player_nextattack(id, DRAW_TIME)
		
		set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
	}
		
	g_Old_Weapon[id] = read_data(2)
}

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_DRAGONSWORD || */!g_Had_DragonSword[id])
		return FMRES_IGNORED
		
	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
			return FMRES_SUPERCEDE
		if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
		{
			if (sample[17] == 'w') // wall
			{
				g_Hit_Ing[id] = HIT_WALL
				return FMRES_SUPERCEDE
			} else {
				g_Hit_Ing[id] = HIT_ENEMY
				return FMRES_SUPERCEDE
			}
		}
		if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
			return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED
}

public fw_CmdStart(id, uc_handle, seed)
{
	if (!is_user_alive(id)) 
		return
	if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
		return
	
	static ent; ent = fm_get_user_weapon_entity(id, CSW_DRAGONSWORD)
	
	if(!pev_valid(ent))
		return
	if(get_pdata_float(ent, 46, OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0) 
		return
	
	static CurButton
	CurButton = get_uc(uc_handle, UC_Buttons)
	
	if (CurButton & IN_ATTACK)
	{
		set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
		
		if(!g_Slashing_Mode[id])
		{
			g_Attack_Mode[id] = ATTACK_SLASH_ROTATE
			g_Checking_Mode[id] = 1
			ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
			g_Checking_Mode[id] = 0
	
			set_pev(id, pev_framerate, 1.5)
			set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_ROTATE_RESET_TIME)
			set_player_nextattack(id, SLASH_ROTATE_RESET_TIME)
			
			set_weapon_anim(id, DS_ANIM_SLASH_ROTATE)
			set_task(SLASH_ROTATE_DELAY_TIME, "Do_Slashing_Rotate", id+TASK_SLASHING)
		} else {
			g_Attack_Mode[id] = ATTACK_SLASH_AHEAD
			g_Checking_Mode[id] = 1
			ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
			g_Checking_Mode[id] = 0
			
			set_pev(id, pev_framerate, 2.0)
			set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_AHEAD_RESET_TIME)
			set_player_nextattack(id, SLASH_AHEAD_RESET_TIME)
			
			set_weapon_anim(id, DS_ANIM_SLASH_AHEAD)
			set_task(SLASH_AHEAD_DELAY_TIME, "Do_Slashing_Ahead", id+TASK_SLASHING)
		}
		
		g_Slashing_Mode[id] = !g_Slashing_Mode[id]
	} else if (CurButton & IN_ATTACK2) {
		set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
		
		g_Attack_Mode[id] = ATTACK_STAB
		g_Checking_Mode[id] = 1
		ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
		g_Checking_Mode[id] = 0
		
		set_pev(id, pev_framerate, 1.5)
		set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_TIME + 0.1)
		set_player_nextattack(id, STAB_TIME + 0.1)
		
		set_weapon_anim(id, DS_ANIM_STAB_BEGIN)
		
		remove_task(id+TASK_STABING)
		set_task(STAB_TIME, "Do_StabNow", id+TASK_STABING)
	}
}

public Do_Slashing_Rotate(id)
{
	id -= TASK_SLASHING
	
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
		return
		
	if(Check_Attack(id, ATTACK_SLASH_ROTATE))
	{
		emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else {
		if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
		else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	
	g_Attack_Mode[id] = 0
	g_Hit_Ing[id] = 0
}

public Do_Slashing_Ahead(id)
{
	id -= TASK_SLASHING
	
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
		return
		
	if(Check_Attack(id, ATTACK_SLASH_AHEAD))
	{
		emit_sound(id, CHAN_WEAPON, DragonSword_Sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else {
		if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
		else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[5], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	
	g_Attack_Mode[id] = 0
	g_Hit_Ing[id] = 0
}

public Do_StabNow(id)
{
	id -= TASK_STABING
	
	if (!is_user_alive(id)) 
		return
	if(!g_Had_DragonSword[id])
		return		
		
	set_weapon_anim(id, DS_ANIM_STAB_END)
	
	if(get_user_weapon(id) != CSW_DRAGONSWORD)
	{
		set_weapons_timeidle(id, CSW_DRAGONSWORD, 0.0)
		set_player_nextattack(id, 0.0)
	} else {
		set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_RESET_TIME)
		set_player_nextattack(id, STAB_RESET_TIME)
	}		

	if(Check_Attack(id, ATTACK_STAB))
	{
		emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else {
		if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
		else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[6], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}

	g_Attack_Mode[id] = 0
	g_Hit_Ing[id] = 0
}


public Check_Attack(id, Mode)
{
	static Float:Max_Distance, Float:Point[4][3], Float:TB_Distance, Float:Point_Dis
	
	if(Mode == ATTACK_SLASH_ROTATE)
	{
		Point_Dis = SLASH_ROTATE_POINT_DIS
		Max_Distance = SLASH_ROTATE_RADIUS
		TB_Distance = Max_Distance / 4.0
	} else if(Mode == ATTACK_SLASH_AHEAD) {
		Point_Dis = SLASH_AHEAD_POINT_DIS
		Max_Distance = SLASH_AHEAD_RADIUS
		TB_Distance = Max_Distance / 4.0
	} else if(Mode == ATTACK_STAB) {
		Point_Dis = STAB_POINT_DIS
		Max_Distance = STAB_RADIUS
		TB_Distance = Max_Distance / 4.0
	}
	
	static Float:VicOrigin[3], Float:MyOrigin[3]
	pev(id, pev_origin, MyOrigin)
	
	for(new i = 0; i < 4; i++)
		get_position(id, TB_Distance * (i + 1), 0.0, 0.0, Point[i])
		
	static Have_Victim; Have_Victim = 0
	static ent
	ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
		
	if(!pev_valid(ent))
		return 0
		
	for(new i = 0; i < get_maxplayers(); i++)
	{
		if(!is_user_alive(i))
			continue
		if(id == i)
			continue
		if(entity_range(id, i) > Max_Distance)
			continue
	
		pev(i, pev_origin, VicOrigin)
		if(is_wall_between_points(MyOrigin, VicOrigin, id))
			continue
			
		if(get_distance_f(VicOrigin, Point[0]) <= Point_Dis
		|| get_distance_f(VicOrigin, Point[1]) <= Point_Dis
		|| get_distance_f(VicOrigin, Point[2]) <= Point_Dis
		|| get_distance_f(VicOrigin, Point[3]) <= Point_Dis)
		{
			if(!Have_Victim) Have_Victim = 1
			if(Mode == ATTACK_SLASH_ROTATE)
				do_attack(id, i, ent, SLASH_ROTATE_DAMAGE)
			else if(Mode == ATTACK_SLASH_AHEAD)
				do_attack(id, i, ent, SLASH_AHEAD_DAMAGE)
			else if(Mode == ATTACK_STAB)
				do_attack(id, i, ent, STAB_DAMAGE)
		}
	}	
	
	if(Have_Victim)
		return 1
	else
		return 0
	
	return 0
}	

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_DRAGONSWORD || !g_Had_DragonSword[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] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward)
	else xs_vec_mul_scalar(v_forward, 0.0, 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_DRAGONSWORD || !g_Had_DragonSword[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] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward)
	else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
	xs_vec_add(vecStart, v_forward, vecEnd)
	
	engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
	
	return FMRES_SUPERCEDE
}

public fw_PlayerTraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceResult, DamageBits) 
{
	if(!is_user_alive(Attacker))	
		return HAM_IGNORED
	if(!g_Had_DragonSword[Attacker] || !g_Checking_Mode[Attacker])
		return HAM_IGNORED
		
	return HAM_SUPERCEDE
}

do_attack(Attacker, Victim, Inflictor, Float:fDamage)
{
	fake_player_trace_attack(Attacker, Victim, fDamage)
	fake_take_damage(Attacker, Victim, fDamage, Inflictor)
}

fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
{
	// get fDirection
	new Float:fAngles[3], Float:fDirection[3]
	pev(iAttacker, pev_angles, fAngles)
	angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
	
	// get fStart
	new Float:fStart[3], Float:fViewOfs[3]
	pev(iAttacker, pev_origin, fStart)
	pev(iAttacker, pev_view_ofs, fViewOfs)
	xs_vec_add(fViewOfs, fStart, fStart)
	
	// get aimOrigin
	new iAimOrigin[3], Float:fAimOrigin[3]
	get_user_origin(iAttacker, iAimOrigin, 3)
	IVecFVec(iAimOrigin, fAimOrigin)
	
	// TraceLine from fStart to AimOrigin
	new ptr = create_tr2() 
	engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
	new pHit = get_tr2(ptr, TR_pHit)
	new iHitgroup = get_tr2(ptr, TR_iHitgroup)
	new Float:fEndPos[3]
	get_tr2(ptr, TR_vecEndPos, fEndPos)

	// get target & body at aiming
	new iTarget, iBody
	get_user_aiming(iAttacker, iTarget, iBody)
	
	// if aiming find target is iVictim then update iHitgroup
	if (iTarget == iVictim)
	{
		iHitgroup = iBody
	}
	
	// if ptr find target not is iVictim
	else if (pHit != iVictim)
	{
		// get AimOrigin in iVictim
		new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
		pev(iVictim, pev_origin, fVicOrigin)
		pev(iVictim, pev_view_ofs, fVicViewOfs) 
		xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
		fAimInVictim[2] = fStart[2]
		fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
		
		// check aim in size of iVictim
		new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
		iAngleToVictim = abs(iAngleToVictim)
		new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
		new Float:fVicSize[3]
		pev(iVictim, pev_size , fVicSize)
		if ( fDis <= fVicSize[0] * 0.5 )
		{
			// TraceLine from fStart to aimOrigin in iVictim
			new ptr2 = create_tr2() 
			engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
			new pHit2 = get_tr2(ptr2, TR_pHit)
			new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
			
			// if ptr2 find target is iVictim
			if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
			{
				pHit = iVictim
				iHitgroup = iHitgroup2
				get_tr2(ptr2, TR_vecEndPos, fEndPos)
			}
			
			free_tr2(ptr2)
		}
		
		// if pHit still not is iVictim then set default HitGroup
		if (pHit != iVictim)
		{
			// set default iHitgroup
			iHitgroup = HIT_GENERIC
			
			new ptr3 = create_tr2() 
			engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
			get_tr2(ptr3, TR_vecEndPos, fEndPos)
			
			// free ptr3
			free_tr2(ptr3)
		}
	}
	
	// set new Hit & Hitgroup & EndPos
	set_tr2(ptr, TR_pHit, iVictim)
	set_tr2(ptr, TR_iHitgroup, iHitgroup)
	set_tr2(ptr, TR_vecEndPos, fEndPos)
	
	// hitgroup multi fDamage
	new Float:fMultifDamage 
	switch(iHitgroup)
	{
		case HIT_HEAD: fMultifDamage  = 4.0
		case HIT_STOMACH: fMultifDamage  = 1.25
		case HIT_LEFTLEG: fMultifDamage  = 0.75
		case HIT_RIGHTLEG: fMultifDamage  = 0.75
		default: fMultifDamage  = 1.0
	}
	
	fDamage *= fMultifDamage
	
	// ExecuteHam
	fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
	
	// free ptr
	free_tr2(ptr)
}

stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
	ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
}

stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
	iInflictor = (!iInflictor) ? iAttacker : iInflictor
	ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
}

stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
{
	new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
	pev(id, pev_origin, fOrigin)
	get_user_origin(id, iAimOrigin, 3) // end position from eyes
	IVecFVec(iAimOrigin, fAimOrigin)
	xs_vec_sub(fAimOrigin, fOrigin, fV1)
	
	new Float:fV2[3]
	xs_vec_sub(fTarget, fOrigin, fV2)
	
	new iResult = get_angle_between_vectors(fV1, fV2)
	
	if (TargetSize > 0.0)
	{
		new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
		new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
		iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
	}
	
	return iResult
}

stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
	new Float:fA1[3], Float:fA2[3]
	engfunc(EngFunc_VecToAngles, fV1, fA1)
	engfunc(EngFunc_VecToAngles, fV2, fA2)
	
	new iResult = floatround(fA1[1] - fA2[1])
	iResult = iResult % 360
	iResult = (iResult > 180) ? (iResult - 360) : iResult
	
	return iResult
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	if (pev_valid(ent) != PDATA_SAFE)
		return -1
	
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

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 set_weapons_timeidle(id, WeaponId ,Float:TimeIdle)
{
	if(!is_user_alive(id))
		return
		
	static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
	if(!pev_valid(entwpn)) 
		return
		
	set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
	set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
	set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
}

stock set_player_nextattack(id, Float:nexttime)
{
	if(!is_user_alive(id))
		return
		
	set_pdata_float(id, m_flNextAttack, nexttime, 5)
}

stock is_valid_entity(ent)
{
	if(pev_valid(ent) != PDATA_SAFE)
		return 0
		
	return 1
}

stock get_position(ent, 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(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 is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
{
	static ptr
	ptr = create_tr2()

	engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, ptr)
	
	static Float:EndPos[3]
	get_tr2(ptr, TR_vecEndPos, EndPos)

	free_tr2(ptr)
	return floatround(get_distance_f(end, EndPos))
}
The .inl model example
Code:
///////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| DualKatana |------------------------------------------
//========================================== sDs|Aragon* ==========================================

/////////////
// Settings |
//==========/

#define DUALKATANA_OLD_NAME		"knife"
#define DUALKATANA_NEW_NAME		"dualkatana"
#define DUALKATANA_OLD_EVENT		"events/knife.sc"

#define weapon_dualkatana		"weapon_knife"
#define CSW_DUALKATANA			CSW_KNIFE

#define DUALKATANA_NAME			"Dual Katana"
#define DUALKATANA_TEAM			WPN_TEAM_T
#define DUALKATANA_ACCES		WPN_ACCES_ALL
#define DUALKATANA_LEVEL		0
#define DUALKATANA_DAMAGE		3.0
#define DUALKATANA_SLASH_DELAY		0.5
#define DUALKATANA_STAB_DELAY		1.0

new DualKatanaModel_V[] = "models/Furien40+/v_dualkatana.mdl",
DualKatanaModel_P[] = "models/Furien40/p_dualkatana.mdl",

DualKatana_WeaponList[] = "furien40_dualkatana",
DualKatana_Sprites[] = "sprites/Furien40/dualkatana.spr",

DualKatana_Sound[][][] = {
	{ "weapons/dualkatana_draw.wav",		"weapons/knife_deploy1.wav" },
	{ "weapons/dualkatana_hit1.wav",		"weapons/knife_hit1.wav" },
	{ "weapons/dualkatana_hit2.wav",		"weapons/knife_hit2.wav" },
	{ "weapons/dualkatana_hit1.wav",		"weapons/knife_hit3.wav" },
	{ "weapons/dualkatana_hit2.wav",		"weapons/knife_hit4.wav" },
	{ "weapons/dualkatana_hitwall.wav",		"weapons/knife_hitwall1.wav" },
	{ "weapons/dualkatana_slash1.wav",		"weapons/knife_slash1.wav" },
	{ "weapons/dualkatana_slash2.wav",		"weapons/knife_slash2.wav" },
	{ "weapons/dualkatana_stab.wav",		"weapons/knife_stab.wav" }
};


///////////////
// Model Info |
//============/

enum {
	DUALKATANA_ANIM_IDLE = 0,
	DUALKATANA_ANIM_SLASH1,
	DUALKATANA_ANIM_SLASH2,
	DUALKATANA_ANIM_DRAW,
	DUALKATANA_ANIM_STAB,
	DUALKATANA_ANIM_STAB_MISS
};
new Float:DualKatana_AnimationTime[] = {
	7.0,
	1.0,
	1.0,
	1.0,
	1.0,
	1.0
};


////////////
// Globals |
//=========/

#define dualkatana_get_anim(%1)			entity_get_int(%1, EV_INT_iuser1)
#define dualkatana_set_anim(%1,%2)		entity_set_int(%1, EV_INT_iuser1, %2)

new DualKatanaID, dualkatana_event;

///////////////////////////////////////////////////////////////////////////////////////////////////
// Plugin |
//=================================================================================================
DualKatana_Init() {
	if (!DualKatanaID)
		return;

	register_clcmd(DualKatana_WeaponList, "CMD_DualKatana");
	register_message(MSGID_DeathMsg, "DualKatana_DeathMsg");
	register_event("CurWeapon", "DualKatana_ViewModel", "be", "1=1", "2=29");
	register_forward(FM_PlaybackEvent, "DualKatana_PlaybackEvent");
	register_forward(FM_EmitSound, "DualKatana_EmitSound");
	register_forward(FM_CmdStart, "DualKatana_CmdStart");
	RegisterHam(Ham_Item_Deploy, weapon_dualkatana, "DualKatana_Deploy_Post", 1);
	RegisterHam(Ham_Weapon_WeaponIdle, weapon_dualkatana, "DualKatana_WeaponIdle");

	RegisterHookChain(RG_CBasePlayer_TakeDamage, "DualKatana_TakeDamage");
}

DualKatana_Precache() {
	DualKatanaID = RegisterWeapon(CSW_DUALKATANA, DUALKATANA_NAME, DUALKATANA_TEAM, DUALKATANA_ACCES, DUALKATANA_LEVEL);

	if (!DualKatanaID)
		return;

	register_forward(FM_PrecacheEvent, "DualKatana_PrecacheEvent_Post", 1);

	precache_model(DualKatanaModel_V);
	precache_model(DualKatanaModel_P);

	new WPNList[128];
	formatex(WPNList, charsmax(WPNList), "sprites/%s.txt", DualKatana_WeaponList);
	precache_generic(WPNList);
	precache_generic(DualKatana_Sprites);

	for (new i = 0; i < sizeof(DualKatana_Sound); i++)
		precache_sound(DualKatana_Sound[i][0]);
}

DualKatana_Natives() {
	register_native("get_user_dualkatana", "native_get_user_dualkatana");
	register_native("set_user_dualkatana", "native_set_user_dualkatana");
	register_native("dualkatana_id", "native_dualkatana_id");
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Funcitons |
//=================================================================================================
public DualKatana_DeathMsg(msg_id, msg_dest, id) {
	new Attacker = get_msg_arg_int(1);

	if (is_user_connected(Attacker)) {
		new TruncatedWeapon[33];
		get_msg_arg_string(4, TruncatedWeapon, charsmax(TruncatedWeapon));

		if (equal(TruncatedWeapon, DUALKATANA_OLD_NAME)) {
			if (get_user_dualkatana(Attacker))
				set_msg_arg_string(4, DUALKATANA_NEW_NAME);
		}
	}
}

public DualKatana_ViewModel(id) {
	if (is_user_alive(id) && get_user_dualkatana(id, true))
		set_weapon_model(id, DualKatanaModel_V, DualKatanaModel_P);
}

public DualKatana_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2) {
	if (is_user_connected(invoker) && eventid == dualkatana_event) {
		playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);
		return FMRES_HANDLED;
	}
	return FMRES_IGNORED;
}

public DualKatana_PrecacheEvent_Post(type, const name[]) {
	if (equal(DUALKATANA_OLD_EVENT, name)) {
		dualkatana_event = get_orig_retval();
		return FMRES_HANDLED;
	}
	return FMRES_IGNORED;
}

public DualKatana_EmitSound(id, channel, const sound[]) {
	if (is_user_alive(id) && get_user_dualkatana(id, true)) {
		for (new i = 0; i < sizeof DualKatana_Sound; i++) {
			if (equal(sound, DualKatana_Sound[i][1])) {
				emit_sound(id, channel, DualKatana_Sound[i][0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				return FMRES_SUPERCEDE;
			}
		}
	}
	return FMRES_IGNORED;
}

public DualKatana_CmdStart(id, uc_handle, seed) {
	if (!is_user_alive(id) || get_user_weapon(id) != CSW_DUALKATANA)
		return FMRES_IGNORED;


	new CurButton = get_uc(uc_handle, UC_Buttons);

	if (CurButton & IN_ATTACK) {
		new ENT_Weapon = cs_get_user_weapon_entity(id);

		if (is_valid_ent(ENT_Weapon) && get_weapon_key(ENT_Weapon) == DualKatanaID) {
			if (get_user_NextAttack(id) <= 0.1) {
				ExecuteHamB(Ham_Weapon_PrimaryAttack, ENT_Weapon);

				if (dualkatana_get_anim(ENT_Weapon) >= 2)
					dualkatana_set_anim(ENT_Weapon, 1);
				else
					dualkatana_set_anim(ENT_Weapon, dualkatana_get_anim(ENT_Weapon) + 1);

				new Anim = dualkatana_get_anim(ENT_Weapon);

				set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]);
				set_user_NextAttack(id, DUALKATANA_SLASH_DELAY);
				SendWeaponAnim(id, Anim, ENT_Weapon);
			}

			CurButton &= ~IN_ATTACK;
			set_uc(uc_handle, UC_Buttons, CurButton);
			return FMRES_HANDLED;
		}
	}
	else if (CurButton & IN_ATTACK2) {
		new ENT_Weapon = cs_get_user_weapon_entity(id);

		if (is_valid_ent(ENT_Weapon) && get_weapon_key(ENT_Weapon) == DualKatanaID) {
			if (get_user_NextAttack(id) <= 0.1) {
				ExecuteHamB(Ham_Weapon_SecondaryAttack, ENT_Weapon);

				new Anim = DUALKATANA_ANIM_STAB;

				set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]);
				set_user_NextAttack(id, DUALKATANA_STAB_DELAY);
				SendWeaponAnim(id, Anim, ENT_Weapon);
			}

			CurButton &= ~IN_ATTACK2;
			set_uc(uc_handle, UC_Buttons, CurButton);
			return FMRES_HANDLED;
		}
	}
	return FMRES_IGNORED;
}

public DualKatana_TakeDamage(const victim, pevInflictor, attacker, Float:flDamage, bitsDamageType) {
	if (is_user_alive(attacker) && get_user_dualkatana(attacker, true) && (bitsDamageType & DMG_BULLET))
		SetHookChainArg(4, ATYPE_FLOAT, flDamage * DUALKATANA_DAMAGE);

	return HC_CONTINUE;
}

public DualKatana_Deploy_Post(ENT_Weapon) {
	if (is_valid_ent(ENT_Weapon)) {
		new id = pev(ENT_Weapon, pev_owner);

		if (is_user_alive(id) && get_weapon_key(ENT_Weapon) == DualKatanaID) {
			new Anim = DUALKATANA_ANIM_DRAW;

			set_weapon_model(id, DualKatanaModel_V, DualKatanaModel_P);
			set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]);
			set_user_NextAttack(id, DualKatana_AnimationTime[Anim]);
			SendWeaponAnim(id, Anim, ENT_Weapon);
			return HAM_HANDLED;
		}
	}
	return HAM_IGNORED;
}

public DualKatana_WeaponIdle(ENT_Weapon) {
	if (is_valid_ent(ENT_Weapon)) {
		new id = pev(ENT_Weapon, pev_owner);

		if (is_user_alive(id) && get_weapon_key(ENT_Weapon) == DualKatanaID && get_weapon_TimeWeaponIdle(ENT_Weapon) <= 0.1) {
			new Anim = DUALKATANA_ANIM_IDLE;

			set_weapon_TimeWeaponIdle(ENT_Weapon, DualKatana_AnimationTime[Anim]);
			set_weapon_model(id, DualKatanaModel_V, DualKatanaModel_P);
			SendWeaponAnim(id, Anim, ENT_Weapon);

			return HAM_HANDLED;
		}
	}
	return HAM_IGNORED;
}

public CMD_DualKatana(id) {
	engclient_cmd(id, weapon_dualkatana);

	return PLUGIN_HANDLED;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// Natives |
//=================================================================================================
public native_get_user_dualkatana(plugin_id, argc)
return get_user_dualkatana(get_param(1), bool:get_param(2));

public native_set_user_dualkatana(plugin_id, argc)
return set_weapon(get_param(1), CSW_DUALKATANA, DualKatanaID);

public native_dualkatana_id()
return DualKatanaID;

///////////////////////////////////////////////////////////////////////////////////////////////////
// Stock |
//=================================================================================================
stock get_user_dualkatana(id, bool:CurrWeapon = false)
return get_weapon(id, CSW_DUALKATANA, DualKatanaID, CurrWeapon);

///////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------| DualKatana |------------------------------------------
//========================================== sDs|Aragon* ==========================================
Please i want someone if can help to modify the .sma similar to the .inl example but the same settings because i need to add new weapons to the shop. Like to convert similar like .inl
luciansobo2 is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 05-04-2024 , 21:54   Re: Request modify .sma to inl.
Reply With Quote #2

What does that even mean?
__________________
fysiks is offline
luciansobo2
Junior Member
Join Date: May 2024
Old 05-05-2024 , 12:27   Re: Request modify .sma to inl.
Reply With Quote #3

Quote:
Originally Posted by fysiks View Post
What does that even mean?
Like convert the .sma file similar to .inl but with all things precahce spr sounds from .sma to similar inl.
luciansobo2 is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 05-05-2024 , 15:47   Re: Request modify .sma to inl.
Reply With Quote #4

Yeah, you already said that in your original post and it still doesn't make sense. You need to say exactly what you want. I assume you want a plugin. What do you want that plugin to do? The .inl file is not a plugin.
__________________
fysiks is offline
luciansobo2
Junior Member
Join Date: May 2024
Old 05-05-2024 , 19:37   Re: Request modify .sma to inl.
Reply With Quote #5

Quote:
Originally Posted by fysiks View Post
Yeah, you already said that in your original post and it still doesn't make sense. You need to say exactly what you want. I assume you want a plugin. What do you want that plugin to do? The .inl file is not a plugin.
please look at that .inl
i want the .sma make similar to that .inl
like all the settings but change the precache and all stuff from .sma to new inl because with that inl i can add to shop the new weapon (sma)
luciansobo2 is offline
bigdaddy424
Senior Member
Join Date: Oct 2021
Location: Jupiter
Old 05-05-2024 , 19:39   Re: Request modify .sma to inl.
Reply With Quote #6

this is a lot of work i doubt anyone will do it
__________________
bigdaddy424 is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 05-05-2024 , 23:26   Re: Request modify .sma to inl.
Reply With Quote #7

You need to explain your request better. "Make this more like that" is not helpful in most cases. You mention some sort of "shop" (whatever that is) but you don't say what it actually is. What shop?
__________________
fysiks is offline
luciansobo2
Junior Member
Join Date: May 2024
Old 05-06-2024 , 11:13   Re: Request modify .sma to inl.
Reply With Quote #8

Quote:
Originally Posted by fysiks View Post
You need to explain your request better. "Make this more like that" is not helpful in most cases. You mention some sort of "shop" (whatever that is) but you don't say what it actually is. What shop?
im not good at english.. if you can help me i can explain better on discord i can show you what i exactly mean
luciansobo2 is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 05-06-2024 , 23:40   Re: Request modify .sma to inl.
Reply With Quote #9

Just provide a link to the plugin that you're using for your shop (or if it's not on this forum, attach the .sma file).
__________________
fysiks is offline
luciansobo2
Junior Member
Join Date: May 2024
Old 05-07-2024 , 06:17   Re: Request modify .sma to inl.
Reply With Quote #10

Quote:
Originally Posted by fysiks View Post
Just provide a link to the plugin that you're using for your shop (or if it's not on this forum, attach the .sma file).
Code:
#define V_MODEL "models/v_dragonsword2.mdl"
#define P_MODEL "models/p_dragonsword.mdl"

#define CSW_DRAGONSWORD CSW_KNIFE
#define weapon_dragonsword "weapon_knife"
#define WEAPON_ANIMEXT "knife" //"skullaxe"

#define DRAW_TIME 1.0

#define SLASH_ROTATE_DAMAGE 75.0
#define SLASH_ROTATE_RADIUS 110.0
#define SLASH_ROTATE_POINT_DIS 60.0
#define SLASH_ROTATE_DELAY_TIME 0.7
#define SLASH_ROTATE_RESET_TIME 1.0

#define SLASH_AHEAD_DAMAGE 90.0
#define SLASH_AHEAD_RADIUS 90.0
#define SLASH_AHEAD_POINT_DIS 30.0
#define SLASH_AHEAD_DELAY_TIME 0.3
#define SLASH_AHEAD_RESET_TIME 0.9

#define STAB_DAMAGE 110.0
#define STAB_RADIUS 100.0
#define STAB_POINT_DIS 80.0
#define STAB_TIME 0.657
#define STAB_RESET_TIME 0.75

#define TASK_SLASHING 2033+20
#define TASK_STABING 2033+10

// OFFSET
const PDATA_SAFE = 2
const OFFSET_LINUX_WEAPONS = 4
const OFFSET_WEAPONOWNER = 41
const m_flNextAttack = 83
const m_szAnimExtention = 492

new const DragonSword_Sound[8][] = 
{
	"weapons/dragonsword_draw.wav",
	"weapons/dragonsword_hit1.wav",
	"weapons/dragonsword_hit2.wav",
	"weapons/dragonsword_idle.wav",
	"weapons/dragonsword_slash1.wav",
	"weapons/dragonsword_slash2.wav",
	"weapons/dragonsword_stab_hit.wav",
	"weapons/dragonsword_wall.wav"
}

enum
{
	ATTACK_SLASH_ROTATE = 1,
	ATTACK_SLASH_AHEAD,
	ATTACK_STAB
}

enum
{
	DS_ANIM_IDLE = 0,
	DS_ANIM_SLASH_ROTATE,
	DS_ANIM_SLASH_AHEAD,
	DS_ANIM_DRAW,
	DS_ANIM_STAB_BEGIN,
	DS_ANIM_STAB_END
}

enum
{
	HIT_NOTHING = 0,
	HIT_ENEMY,
	HIT_WALL
}

new g_Had_DragonSword[33], g_Slashing_Mode[33], g_Attack_Mode[33], g_Checking_Mode[33], g_Hit_Ing[33]
new g_Old_Weapon[33], g_Ham_Bot, g_MaxPlayers

DragonSword_Init()
{
	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
	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_TraceAttack, "player", "fw_PlayerTraceAttack")
	
	g_MaxPlayers = get_maxplayers()
	register_clcmd("admin_get_dragonsword", "get_dragonsword", ADMIN_KICK)
}

DragonSword_Precache()
{
	engfunc(EngFunc_PrecacheModel, V_MODEL)
	engfunc(EngFunc_PrecacheModel, P_MODEL)
	
	for(new i = 0; i < sizeof(DragonSword_Sound); i++)
		engfunc(EngFunc_PrecacheSound, DragonSword_Sound[i])
}

public get_dragonsword(id)
{
	if(!is_user_alive(id))
		return
		
	remove_task(id+TASK_SLASHING)
	remove_task(id+TASK_STABING)
		
	g_Had_DragonSword[id] = 1
	g_Slashing_Mode[id] = 0
	g_Attack_Mode[id] = 0
	g_Checking_Mode[id] = 0
	g_Hit_Ing[id] = 0
	
	if(get_user_weapon(id) == CSW_KNIFE)
	{
		set_pev(id, pev_viewmodel2, V_MODEL)
		set_pev(id, pev_weaponmodel2, P_MODEL)	
		
		set_weapon_anim(id, DS_ANIM_DRAW)
		set_player_nextattack(id, DRAW_TIME)
	} else {
		engclient_cmd(id, weapon_dragonsword)
	}
}

public remove_dragonsword(id)
{
	remove_task(id+TASK_SLASHING)
	remove_task(id+TASK_STABING)
		
	g_Had_DragonSword[id] = 0
	g_Slashing_Mode[id] = 0
	g_Attack_Mode[id] = 0
	g_Checking_Mode[id] = 0
	g_Hit_Ing[id] = 0
}

DragonSword_PutInServer(id)
{
	if(!g_Ham_Bot && is_user_bot(id))
	{
		g_Ham_Bot = 1
		set_task(0.1, "Do_RegisterHam_Bot", id)
	}
}

public Do_RegisterHam_Bot(id)
{
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_PlayerTraceAttack")
}

public Event_NewRound()
{
	for(new i = 0; i < g_MaxPlayers; i++)
		remove_dragonsword(i)
}

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

	// Problem Here ?. SHUT THE FUCK UP
	if((read_data(2) == CSW_DRAGONSWORD && g_Old_Weapon[id] != CSW_DRAGONSWORD) && g_Had_DragonSword[id])
	{
		set_pev(id, pev_viewmodel2, V_MODEL)
		set_pev(id, pev_weaponmodel2, P_MODEL)
	
		set_weapon_anim(id, DS_ANIM_DRAW)
		set_player_nextattack(id, DRAW_TIME)
		
		set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
	}
		
	g_Old_Weapon[id] = read_data(2)
}

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_DRAGONSWORD || */!g_Had_DragonSword[id])
		return FMRES_IGNORED
		
	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
			return FMRES_SUPERCEDE
		if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
		{
			if (sample[17] == 'w') // wall
			{
				g_Hit_Ing[id] = HIT_WALL
				return FMRES_SUPERCEDE
			} else {
				g_Hit_Ing[id] = HIT_ENEMY
				return FMRES_SUPERCEDE
			}
		}
		if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
			return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED
}

public fw_CmdStart(id, uc_handle, seed)
{
	if (!is_user_alive(id)) 
		return
	if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
		return
	
	static ent; ent = fm_get_user_weapon_entity(id, CSW_DRAGONSWORD)
	
	if(!pev_valid(ent))
		return
	if(get_pdata_float(ent, 46, OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent, 47, OFFSET_LINUX_WEAPONS) > 0.0) 
		return
	
	static CurButton
	CurButton = get_uc(uc_handle, UC_Buttons)
	
	if (CurButton & IN_ATTACK)
	{
		set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK)
		
		if(!g_Slashing_Mode[id])
		{
			g_Attack_Mode[id] = ATTACK_SLASH_ROTATE
			g_Checking_Mode[id] = 1
			ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
			g_Checking_Mode[id] = 0
	
			set_pev(id, pev_framerate, 1.5)
			set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_ROTATE_RESET_TIME)
			set_player_nextattack(id, SLASH_ROTATE_RESET_TIME)
			
			set_weapon_anim(id, DS_ANIM_SLASH_ROTATE)
			set_task(SLASH_ROTATE_DELAY_TIME, "Do_Slashing_Rotate", id+TASK_SLASHING)
		} else {
			g_Attack_Mode[id] = ATTACK_SLASH_AHEAD
			g_Checking_Mode[id] = 1
			ExecuteHamB(Ham_Weapon_PrimaryAttack, ent)
			g_Checking_Mode[id] = 0
			
			set_pev(id, pev_framerate, 2.0)
			set_weapons_timeidle(id, CSW_DRAGONSWORD, SLASH_AHEAD_RESET_TIME)
			set_player_nextattack(id, SLASH_AHEAD_RESET_TIME)
			
			set_weapon_anim(id, DS_ANIM_SLASH_AHEAD)
			set_task(SLASH_AHEAD_DELAY_TIME, "Do_Slashing_Ahead", id+TASK_SLASHING)
		}
		
		g_Slashing_Mode[id] = !g_Slashing_Mode[id]
	} else if (CurButton & IN_ATTACK2) {
		set_uc(uc_handle, UC_Buttons, CurButton & ~IN_ATTACK2)
		
		g_Attack_Mode[id] = ATTACK_STAB
		g_Checking_Mode[id] = 1
		ExecuteHamB(Ham_Weapon_SecondaryAttack, ent)
		g_Checking_Mode[id] = 0
		
		set_pev(id, pev_framerate, 1.5)
		set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_TIME + 0.1)
		set_player_nextattack(id, STAB_TIME + 0.1)
		
		set_weapon_anim(id, DS_ANIM_STAB_BEGIN)
		
		remove_task(id+TASK_STABING)
		set_task(STAB_TIME, "Do_StabNow", id+TASK_STABING)
	}
}

public Do_Slashing_Rotate(id)
{
	id -= TASK_SLASHING
	
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
		return
		
	if(Check_Attack(id, ATTACK_SLASH_ROTATE))
	{
		emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else {
		if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
		else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	
	g_Attack_Mode[id] = 0
	g_Hit_Ing[id] = 0
}

public Do_Slashing_Ahead(id)
{
	id -= TASK_SLASHING
	
	if(!is_user_alive(id))
		return
	if(get_user_weapon(id) != CSW_DRAGONSWORD || !g_Had_DragonSword[id])
		return
		
	if(Check_Attack(id, ATTACK_SLASH_AHEAD))
	{
		emit_sound(id, CHAN_WEAPON, DragonSword_Sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else {
		if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
		else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[5], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	
	g_Attack_Mode[id] = 0
	g_Hit_Ing[id] = 0
}

public Do_StabNow(id)
{
	id -= TASK_STABING
	
	if (!is_user_alive(id)) 
		return
	if(!g_Had_DragonSword[id])
		return		
		
	set_weapon_anim(id, DS_ANIM_STAB_END)
	
	if(get_user_weapon(id) != CSW_DRAGONSWORD)
	{
		set_weapons_timeidle(id, CSW_DRAGONSWORD, 0.0)
		set_player_nextattack(id, 0.0)
	} else {
		set_weapons_timeidle(id, CSW_DRAGONSWORD, STAB_RESET_TIME)
		set_player_nextattack(id, STAB_RESET_TIME)
	}		

	if(Check_Attack(id, ATTACK_STAB))
	{
		emit_sound(id, CHAN_WEAPON, DragonSword_Sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
	} else {
		if(g_Hit_Ing[id] == HIT_WALL) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[7], 1.0, ATTN_NORM, 0, PITCH_NORM)
		else if(g_Hit_Ing[id] == HIT_NOTHING) emit_sound(id, CHAN_WEAPON, DragonSword_Sound[6], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}

	g_Attack_Mode[id] = 0
	g_Hit_Ing[id] = 0
}


public Check_Attack(id, Mode)
{
	static Float:Max_Distance, Float:Point[4][3], Float:TB_Distance, Float:Point_Dis
	
	if(Mode == ATTACK_SLASH_ROTATE)
	{
		Point_Dis = SLASH_ROTATE_POINT_DIS
		Max_Distance = SLASH_ROTATE_RADIUS
		TB_Distance = Max_Distance / 4.0
	} else if(Mode == ATTACK_SLASH_AHEAD) {
		Point_Dis = SLASH_AHEAD_POINT_DIS
		Max_Distance = SLASH_AHEAD_RADIUS
		TB_Distance = Max_Distance / 4.0
	} else if(Mode == ATTACK_STAB) {
		Point_Dis = STAB_POINT_DIS
		Max_Distance = STAB_RADIUS
		TB_Distance = Max_Distance / 4.0
	}
	
	static Float:VicOrigin[3], Float:MyOrigin[3]
	pev(id, pev_origin, MyOrigin)
	
	for(new i = 0; i < 4; i++)
		get_position(id, TB_Distance * (i + 1), 0.0, 0.0, Point[i])
		
	static Have_Victim; Have_Victim = 0
	static ent
	ent = fm_get_user_weapon_entity(id, get_user_weapon(id))
		
	if(!pev_valid(ent))
		return 0
		
	for(new i = 0; i < get_maxplayers(); i++)
	{
		if(!is_user_alive(i))
			continue
		if(id == i)
			continue
		if(entity_range(id, i) > Max_Distance)
			continue
	
		pev(i, pev_origin, VicOrigin)
		if(is_wall_between_points(MyOrigin, VicOrigin, id))
			continue
			
		if(get_distance_f(VicOrigin, Point[0]) <= Point_Dis
		|| get_distance_f(VicOrigin, Point[1]) <= Point_Dis
		|| get_distance_f(VicOrigin, Point[2]) <= Point_Dis
		|| get_distance_f(VicOrigin, Point[3]) <= Point_Dis)
		{
			if(!Have_Victim) Have_Victim = 1
			if(Mode == ATTACK_SLASH_ROTATE)
				do_attack(id, i, ent, SLASH_ROTATE_DAMAGE)
			else if(Mode == ATTACK_SLASH_AHEAD)
				do_attack(id, i, ent, SLASH_AHEAD_DAMAGE)
			else if(Mode == ATTACK_STAB)
				do_attack(id, i, ent, STAB_DAMAGE)
		}
	}	
	
	if(Have_Victim)
		return 1
	else
		return 0
	
	return 0
}	

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_DRAGONSWORD || !g_Had_DragonSword[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] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward)
	else xs_vec_mul_scalar(v_forward, 0.0, 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_DRAGONSWORD || !g_Had_DragonSword[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] == ATTACK_SLASH_ROTATE) xs_vec_mul_scalar(v_forward, SLASH_ROTATE_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_SLASH_AHEAD) xs_vec_mul_scalar(v_forward, SLASH_AHEAD_RADIUS, v_forward)
	else if(g_Attack_Mode[id] == ATTACK_STAB) xs_vec_mul_scalar(v_forward, STAB_RADIUS, v_forward)
	else xs_vec_mul_scalar(v_forward, 0.0, v_forward)
	xs_vec_add(vecStart, v_forward, vecEnd)
	
	engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
	
	return FMRES_SUPERCEDE
}

public fw_PlayerTraceAttack(Victim, Attacker, Float:Damage, Float:Direction[3], TraceResult, DamageBits) 
{
	if(!is_user_alive(Attacker))	
		return HAM_IGNORED
	if(!g_Had_DragonSword[Attacker] || !g_Checking_Mode[Attacker])
		return HAM_IGNORED
		
	return HAM_SUPERCEDE
}

do_attack(Attacker, Victim, Inflictor, Float:fDamage)
{
	fake_player_trace_attack(Attacker, Victim, fDamage)
	fake_take_damage(Attacker, Victim, fDamage, Inflictor)
}

fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
{
	// get fDirection
	new Float:fAngles[3], Float:fDirection[3]
	pev(iAttacker, pev_angles, fAngles)
	angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
	
	// get fStart
	new Float:fStart[3], Float:fViewOfs[3]
	pev(iAttacker, pev_origin, fStart)
	pev(iAttacker, pev_view_ofs, fViewOfs)
	xs_vec_add(fViewOfs, fStart, fStart)
	
	// get aimOrigin
	new iAimOrigin[3], Float:fAimOrigin[3]
	get_user_origin(iAttacker, iAimOrigin, 3)
	IVecFVec(iAimOrigin, fAimOrigin)
	
	// TraceLine from fStart to AimOrigin
	new pentru = create_tr2() 
	engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, pentru)
	new pHit = get_tr2(pentru, TR_pHit)
	new iHitgroup = get_tr2(pentru, TR_iHitgroup)
	new Float:fEndPos[3]
	get_tr2(pentru, TR_vecEndPos, fEndPos)

	// get target & body at aiming
	new iTarget, iBody
	get_user_aiming(iAttacker, iTarget, iBody)
	
	// if aiming find target is iVictim then update iHitgroup
	if (iTarget == iVictim)
	{
		iHitgroup = iBody
	}
	
	// if pentru find target not is iVictim
	else if (pHit != iVictim)
	{
		// get AimOrigin in iVictim
		new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
		pev(iVictim, pev_origin, fVicOrigin)
		pev(iVictim, pev_view_ofs, fVicViewOfs) 
		xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
		fAimInVictim[2] = fStart[2]
		fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
		
		// check aim in size of iVictim
		new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
		iAngleToVictim = abs(iAngleToVictim)
		new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
		new Float:fVicSize[3]
		pev(iVictim, pev_size , fVicSize)
		if ( fDis <= fVicSize[0] * 0.5 )
		{
			// TraceLine from fStart to aimOrigin in iVictim
			new ptr2 = create_tr2() 
			engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
			new pHit2 = get_tr2(ptr2, TR_pHit)
			new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
			
			// if ptr2 find target is iVictim
			if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
			{
				pHit = iVictim
				iHitgroup = iHitgroup2
				get_tr2(ptr2, TR_vecEndPos, fEndPos)
			}
			
			free_tr2(ptr2)
		}
		
		// if pHit still not is iVictim then set default HitGroup
		if (pHit != iVictim)
		{
			// set default iHitgroup
			iHitgroup = HIT_GENERIC
			
			new ptr3 = create_tr2() 
			engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
			get_tr2(ptr3, TR_vecEndPos, fEndPos)
			
			// free ptr3
			free_tr2(ptr3)
		}
	}
	
	// set new Hit & Hitgroup & EndPos
	set_tr2(pentru, TR_pHit, iVictim)
	set_tr2(pentru, TR_iHitgroup, iHitgroup)
	set_tr2(pentru, TR_vecEndPos, fEndPos)
	
	// hitgroup multi fDamage
	new Float:fMultifDamage 
	switch(iHitgroup)
	{
		case HIT_HEAD: fMultifDamage  = 4.0
		case HIT_STOMACH: fMultifDamage  = 1.25
		case HIT_LEFTLEG: fMultifDamage  = 0.75
		case HIT_RIGHTLEG: fMultifDamage  = 0.75
		default: fMultifDamage  = 1.0
	}
	
	fDamage *= fMultifDamage
	
	// ExecuteHam
	fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, pentru)
	
	// free pentru
	free_tr2(pentru)
}

stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
	ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
}

stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor = 0, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
	iInflictor = (!iInflictor) ? iAttacker : iInflictor
	ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
}

stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
{
	new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
	pev(id, pev_origin, fOrigin)
	get_user_origin(id, iAimOrigin, 3) // end position from eyes
	IVecFVec(iAimOrigin, fAimOrigin)
	xs_vec_sub(fAimOrigin, fOrigin, fV1)
	
	new Float:fV2[3]
	xs_vec_sub(fTarget, fOrigin, fV2)
	
	new iResult = get_angle_between_vectors(fV1, fV2)
	
	if (TargetSize > 0.0)
	{
		new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
		new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
		iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
	}
	
	return iResult
}

stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
	new Float:fA1[3], Float:fA2[3]
	engfunc(EngFunc_VecToAngles, fV1, fA1)
	engfunc(EngFunc_VecToAngles, fV2, fA2)
	
	new iResult = floatround(fA1[1] - fA2[1])
	iResult = iResult % 360
	iResult = (iResult > 180) ? (iResult - 360) : iResult
	
	return iResult
}

stock fm_cs_get_weapon_ent_owner(ent)
{
	if (pev_valid(ent) != PDATA_SAFE)
		return -1
	
	return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS)
}

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 set_weapons_timeidle(id, WeaponId, Float:TimeIdle)
{
	if(!is_user_alive(id))
		return
		
	static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
	if(!pev_valid(entwpn)) 
		return
		
	set_pdata_float(entwpn, 46, TimeIdle, OFFSET_LINUX_WEAPONS)
	set_pdata_float(entwpn, 47, TimeIdle, OFFSET_LINUX_WEAPONS)
	set_pdata_float(entwpn, 48, TimeIdle + 0.5, OFFSET_LINUX_WEAPONS)
}

stock set_player_nextattack(id, Float:nexttime)
{
	if(!is_user_alive(id))
		return
		
	set_pdata_float(id, m_flNextAttack, nexttime, 5)
}

stock is_valid_entity(ent)
{
	if(pev_valid(ent) != PDATA_SAFE)
		return 0
		
	return 1
}

stock get_position(ent, 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(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 is_wall_between_points(Float:start[3], Float:end[3], ignore_ent)
{
	static pentru
	pentru = create_tr2()

	engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, ignore_ent, pentru)
	
	static Float:EndPos[3]
	get_tr2(pentru, TR_vecEndPos, EndPos)

	free_tr2(pentru)
	return floatround(get_distance_f(end, EndPos))
Someone helped me now you see what I mean but I have still a problem please look at .inl file I need the natives added similar and first define new name and old name please I cannot add without that . And add ; after } cause it's pragma error .please I think now u understand . You don't need the shop sma

Last edited by luciansobo2; 05-07-2024 at 06:20.
luciansobo2 is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 17:29.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode