Raised This Month: $32 Target: $400
 8% 

Knife Models [XP System & Skills Support]


Post New Thread Reply   
 
Thread Tools Display Modes
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 12-02-2020 , 07:33   Re: Knife Models [XP System & Skills Support]
Reply With Quote #271

How is the plugin supposed to know what is VIP and what is admin? Edit it from the lang file.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
popilas
Senior Member
Join Date: Apr 2017
Location: lituanica
Old 12-02-2020 , 07:57   Re: Knife Models [XP System & Skills Support]
Reply With Quote #272

Quote:
Originally Posted by OciXCrom View Post
How is the plugin supposed to know what is VIP and what is admin? Edit it from the lang file.
but I can add Admin? its be vip and admin
popilas is offline
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 12-02-2020 , 08:59   Re: Knife Models [XP System & Skills Support]
Reply With Quote #273

There's only one text available at the moment. Either changed it to LOCKED or wait for the next update.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
Mmiicchhaaeell
Member
Join Date: Oct 2020
Old 12-02-2020 , 17:11   Re: Knife Models [XP System & Skills Support]
Reply With Quote #274

I know what he means... Which flag is for a VIP and which flag is for admin? For example if you decide that your server VIP person has "p" flag, just put flag = p and only people with p flag will have it. The plugin does not know who's VIP, but if you own a server and decide to make one flag for VIP only and you register all premium stuff plugins with that flag like vip gun menu, vip knife skin, auto bhop, etc...
Mmiicchhaaeell is offline
DruGzOG
Veteran Member
Join Date: Nov 2007
Location: Unknown
Old 12-03-2020 , 12:46   Re: Knife Models [XP System & Skills Support]
Reply With Quote #275

Quote:
Originally Posted by Mmiicchhaaeell View Post
I know what he means... Which flag is for a VIP and which flag is for admin? For example if you decide that your server VIP person has "p" flag, just put flag = p and only people with p flag will have it. The plugin does not know who's VIP, but if you own a server and decide to make one flag for VIP only and you register all premium stuff plugins with that flag like vip gun menu, vip knife skin, auto bhop, etc...
Each skin class has a specified flag that you can add... there's nothing hard about this. Edit your cmdaccess to work it in your favor.
__________________
DruGzOG is offline
Send a message via AIM to DruGzOG
iceeedr
Veteran Member
Join Date: Apr 2017
Location: Brazil
Old 12-28-2020 , 13:44   Re: Knife Models [XP System & Skills Support]
Reply With Quote #276

Ocix, as you would disable models for players who don't want to see them, it would basically be the function of cl_minmodels 1, but applied to knife skins.
__________________


Quote:
Originally Posted by fysiks View Post
Please stop trying to help. You appear to just be posting random stuff. Wait until you actually understand more about AMX Mod X and how the game works.
https://iceeedr.com.br/
iceeedr is offline
Send a message via Skype™ to iceeedr
nG_getwreck
Senior Member
Join Date: Oct 2020
Location: Philippines from South K
Old 01-03-2021 , 23:00   Re: Knife Models [XP System & Skills Support]
Reply With Quote #277

I want to add this knife in the menu.

But I don't know how.

Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <fun>
#include <amxmisc>

#define PLUGIN "GUILLOTINE"
#define VERSION "1.0"
#define AUTHOR "RAZER"

#define CSW_BDRIPPER CSW_MAC10
#define weapon_guillotine "weapon_mac10"
#define old_event "events/mac10.sc"
#define old_w_model "models/w_mac10.mdl"
#define WEAPON_SECRETCODE 1329419


#define DEFAULT_AMMO 10
#define DAMAGE 10
#define BDRIP_CLASSNAME "Blood Dripper"
#define WEAPON_ANIMEXT "knife"

#define Get_Ent_Data(%1,%2) get_pdata_int(%1,%2,4)
#define Set_Ent_Data(%1,%2,%3) set_pdata_int(%1,%2,%3,4)

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

new const v_model[] = "models/v_guillotine.mdl"
new const p_model[] = "models/p_guillotine.mdl"
new const w_model[] = "models/w_guillotine.mdl"
new const KNIFE_MODEL[] = "models/guillotine_projectile.mdl"
new const PECAH_MODEL[] = "models/gibs_guilotine.mdl"
new const hit_wall[] = "weapons/janus9_stone1.wav"
new const hit_wall2[] = "weapons/janus9_stone2.wav"
new const weapon_sound[6][] = 
{
	"weapons/guillotine_catch2.wav",
	"weapons/guillotine_draw.wav",
	"weapons/guillotine_draw_empty.wav",
	"weapons/guillotine_explode.wav",
	"weapons/guillotine_red.wav",
	"weapons/guillotine-1.wav"
}


new const WeaponResource[3][] = 
{
	"sprites/weapon_guillotine.txt",
	"sprites/640hud120.spr",
	"sprites/guillotine_lost.spr"
}

enum
{
	ANIM_IDLE = 0,
	ANIM_IDLE_EMPTY,
	ANIM_SHOOT,
	ANIM_DRAW,
	ANIM_DRAW_EMPTY,
	ANIM_IDLE_SHOOT,
	ANIM_IDLE_SHOOT2,
	ANIM_CATCH,
	ANIM_LOST
}

new g_MsgDeathMsg

new g_had_guillotine[33], g_guillotine_ammo[33], shoot_mode[33], shoot_ent_mode[33], g_pecah, headshot_mode[33], ent_sentuh[33], ent_sentuh_balik[33]
new g_old_weapon[33], g_smokepuff_id, m_iBlood[2], guillotine_korban[33], headshot_korban[33], gmsgScoreInfo

const PRIMARY_WEAPONS_BIT_SUM = 
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_cvar("guillotine_version", "m4m3ts", FCVAR_SERVER|FCVAR_SPONLY)
	register_forward(FM_CmdStart, "fw_CmdStart")
	register_forward(FM_SetModel, "fw_SetModel")
	register_think(BDRIP_CLASSNAME, "fw_Think")
	register_touch(BDRIP_CLASSNAME, "*", "fw_touch")
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_TraceLine, "fw_traceline", 1)
	register_forward(FM_AddToFullPack, "fm_addtofullpack_post", 1)
	RegisterHam(Ham_Weapon_WeaponIdle, weapon_guillotine, "fw_guillotineidleanim", 1)
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
	RegisterHam(Ham_Item_AddToPlayer, weapon_guillotine, "fw_AddToPlayer_Post", 1)
	register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
	register_clcmd("weapon_guillotine", "hook_weapon")
	register_clcmd("say /guillotine","get_guillotine",ADMIN_IMMUNITY)
         register_concmd("guillotine","admin_weapon",ADMIN_IMMUNITY,"<authid, nick, @team, @all or #userid> <weapon #>")
	g_MsgDeathMsg = get_user_msgid("DeathMsg")
	gmsgScoreInfo = get_user_msgid("ScoreInfo")
}

public admin_weapon(id,level,cid)
{
   if ( !cmd_access(id,level,cid,3) )
      return PLUGIN_HANDLED

   new arg1[32],arg2[8],weapon
   read_argv(1,arg1,31)
   read_argv(2,arg2,7)
   weapon = str_to_num(arg2)

   if ( equali(arg1,"@all") )
   {
      new plist[32],pnum
      get_players(plist,pnum,"a")
      if (pnum==0)
      {
         return PLUGIN_HANDLED
      }
      for (new i=0; i<pnum; i++)
            if ( !give_weapon(plist[i],weapon) )
            {

            }

      if (!get_cvar_num("amx_weaponmsg")) return PLUGIN_HANDLED
      set_hudmessage(10,200,10,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
      show_hudmessage(0,"All players have been given a weapon!")
   }
   else if ( arg1[0]=='@' )
   {
      new plist[32],pnum
      get_players(plist,pnum,"ae",arg1[1])
      if ( pnum==0 )
      {
         return PLUGIN_HANDLED
      }
      for (new i=0; i<pnum; i++)
            give_weapon(plist[i],weapon)
      if ( get_cvar_num("amx_weaponmsg") )
      {
         if (equali(arg1[1],"CT")) set_hudmessage(200,20,0,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
         else set_hudmessage(0,20,200,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
         show_hudmessage(0,"The %ss have been given a weapon!",arg1[1])
      }
   }
   else
   {
      new pName[32]
      new player = cmd_target(id,arg1,6)
      if (!player) return PLUGIN_HANDLED
      give_weapon(player,weapon)
      get_user_name(player,pName,31)
      if (get_cvar_num("amx_weaponmsg"))
      {
         set_hudmessage(10,200,10,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
         show_hudmessage(0,"%s has been given a weapon!",pName)
      }
   }
   return PLUGIN_HANDLED
}
give_weapon(id,weapon)
{
   switch (weapon)
   {
       case 1:{
      get_guillotine(id)
      }
      case 2:{
      remove_guillotine(id)
      }
      default: return false
   }
   return true
}
public plugin_precache()
{
	precache_model(v_model)
	precache_model(p_model)
	precache_model(w_model)
	precache_model(KNIFE_MODEL)
	g_pecah = precache_model(PECAH_MODEL)
	precache_sound(hit_wall)
	precache_sound(hit_wall2)
	
	for(new i = 0; i < sizeof(weapon_sound); i++) 
		precache_sound(weapon_sound[i])
	
	for(new i = 1; i < sizeof(WeaponResource); i++)
		precache_model(WeaponResource[i])
	
	g_smokepuff_id = engfunc(EngFunc_PrecacheModel, WeaponResource[2])
	m_iBlood[0] = precache_model("sprites/blood.spr")
	m_iBlood[1] = precache_model("sprites/bloodspray.spr")	
}

public fw_PlayerKilled(id)
{
	remove_guillotine(id)
}

public hook_weapon(id)
{
	engclient_cmd(id, weapon_guillotine)
	return
}

public get_guillotine(id)
{
	 if (get_user_flags(id) & ADMIN_RCON )
		
	drop_weapons(id, 1)
	g_had_guillotine[id] = 1
	g_guillotine_ammo[id] = DEFAULT_AMMO
	
	give_item(id, weapon_guillotine)
	update_ammo(id)
	
	static weapon_ent; weapon_ent = fm_find_ent_by_owner(-1, weapon_guillotine, id)
	if(pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent, 1)

}

public remove_guillotine(id)
{
	g_had_guillotine[id] = 0
}

public refill_guillotine(id)
{	
	if(g_had_guillotine[id]) g_guillotine_ammo[id] = 15
	
	if(get_user_weapon(id) == CSW_BDRIPPER && g_had_guillotine[id]) update_ammo(id)
}
	
public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
	if(!is_user_alive(id) || !is_user_connected(id))
		return FMRES_IGNORED	
	if(get_user_weapon(id) == CSW_BDRIPPER && g_had_guillotine[id])
		set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 
	
	return FMRES_HANDLED
}

public Event_CurWeapon(id)
{
	if(!is_user_alive(id))
		return
		
	if(get_user_weapon(id) == CSW_BDRIPPER && g_had_guillotine[id])
	{
		set_pev(id, pev_viewmodel2, v_model)
		set_pev(id, pev_weaponmodel2, p_model)
		set_pdata_string(id, m_szAnimExtention * 4, WEAPON_ANIMEXT, -1 , 20)
		if(g_old_weapon[id] != CSW_BDRIPPER && g_guillotine_ammo[id] >= 1) set_weapon_anim(id, ANIM_DRAW)
		if(g_old_weapon[id] != CSW_BDRIPPER && g_guillotine_ammo[id] == 0) set_weapon_anim(id, ANIM_DRAW_EMPTY)
		update_ammo(id)
	}
	
	g_old_weapon[id] = get_user_weapon(id)
}

public fw_guillotineidleanim(Weapon)
{
	new id = get_pdata_cbase(Weapon, 41, 4)

	if(!is_user_alive(id) || !g_had_guillotine[id] || get_user_weapon(id) != CSW_BDRIPPER)
		return HAM_IGNORED;
	
	if(shoot_mode[id] == 0 && g_guillotine_ammo[id] >= 1) 
		return HAM_SUPERCEDE;
	
	if(headshot_mode[id] == 0 && shoot_mode[id] == 1 && get_pdata_float(Weapon, 48, 4) <= 0.25) 
	{
		set_weapon_anim(id, ANIM_IDLE_SHOOT)
		set_pdata_float(Weapon, 48, 20.0, 4)
		return HAM_SUPERCEDE;
	}
	
	if(headshot_mode[id] == 1 && shoot_mode[id] == 1 && get_pdata_float(Weapon, 48, 4) <= 0.25) 
	{
		set_weapon_anim(id, ANIM_IDLE_SHOOT2)
		set_pdata_float(Weapon, 48, 20.0, 4)
		return HAM_SUPERCEDE;
	}
	
	if(g_guillotine_ammo[id] == 0 && get_pdata_float(Weapon, 48, 4) <= 0.25) 
	{
		set_weapon_anim(id, ANIM_IDLE_EMPTY)
		set_pdata_float(Weapon, 48, 20.0, 4)
		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_user_alive(id) || !is_user_connected(id))
		return
	if(get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id])
		return
	
	static ent; ent = fm_get_user_weapon_entity(id, CSW_BDRIPPER)
	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)
	{
		CurButton &= ~IN_ATTACK
		set_uc(uc_handle, UC_Buttons, CurButton)
		
		if(g_guillotine_ammo[id] == 0)
			return
		if(shoot_mode[id] == 0 && get_pdata_float(id, 83, 5) <= 0.0)
		{
			g_guillotine_ammo[id]--
			update_ammo(id)
			shoot_mode[id] = 1
			FireKnife(id)
			set_weapon_anim(id, ANIM_SHOOT)
			emit_sound(id, CHAN_WEAPON, weapon_sound[5], 1.0, ATTN_NORM, 0, PITCH_NORM)
			set_weapons_timeidle(id, CSW_BDRIPPER, 0.7)
			set_player_nextattackx(id, 0.7)
		}
	}
}

public FireKnife(id)
{
	static Float:StartOrigin[3], Float:velocity[3], Float:angles[3], Float:anglestrue[3], Float:jarak_max[3]
	get_position(id, 2.0, 0.0, 0.0, StartOrigin)
	get_position(id, 700.0, 0.0, 0.0, jarak_max)
	
	pev(id,pev_v_angle,angles)
	static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
	if(!pev_valid(Ent)) return
	anglestrue[0] = 360.0 - angles[0]
	anglestrue[1] = angles[1]
	anglestrue[2] = angles[2]
	
	// Set info for ent
	set_pev(Ent, pev_movetype, MOVETYPE_FLY)
	set_pev(Ent, pev_owner, id)
	set_pev(Ent, pev_iuser1, id)
	set_pev(Ent, pev_fuser1, get_gametime() + 4.0)
	set_pev(Ent, pev_nextthink, halflife_time() + 0.01)
	
	entity_set_string(Ent, EV_SZ_classname, BDRIP_CLASSNAME)
	engfunc(EngFunc_SetModel, Ent, KNIFE_MODEL)
	set_pev(Ent, pev_mins, Float:{-1.0, -1.0, -1.0})
	set_pev(Ent, pev_maxs, Float:{1.0, 1.0, 1.0})
	set_pev(Ent, pev_origin, StartOrigin)
	set_pev(Ent, pev_angles, anglestrue)
	set_pev(Ent, pev_gravity, 0.01)
	set_pev(Ent, pev_solid, SOLID_BBOX)
	set_pev(Ent, pev_frame, 1.0)
	set_pev(Ent, pev_framerate, 30.0)
	set_pev(Ent, pev_sequence, 0)
	
	velocity_by_aim( id, 1100, velocity )
	set_pev( Ent, pev_velocity, velocity )
	set_pev(Ent, pev_vuser1, velocity)
	set_pev(Ent, pev_vuser2, jarak_max)
	shoot_ent_mode[id] = 0
	ent_sentuh[id] = 1
	ent_sentuh_balik[id] = 0
}

public fm_addtofullpack_post(es, e, user, host, host_flags, player, p_set)
{
	if(!player)
		return FMRES_IGNORED
		
	if(!is_user_connected(host) || !is_user_alive(user))
		return FMRES_IGNORED
		
	if(headshot_korban[user] != 1)
		return FMRES_IGNORED
		
	if(host == user)
		return FMRES_IGNORED
	
	new Float:PlayerOrigin[3], Float:anglesss[3]
	pev(user, pev_origin, PlayerOrigin)
	
	engfunc(EngFunc_GetBonePosition, user, 8, PlayerOrigin, anglesss)
						
	engfunc(EngFunc_SetOrigin, guillotine_korban[user], PlayerOrigin)
	engfunc(EngFunc_SetOrigin, guillotine_korban[user], PlayerOrigin)

	return FMRES_HANDLED
}

public fw_Think(Ent)
{
	if(!pev_valid(Ent)) 
		return
	
	static Float:pulang[3], Float:StartOriginz[3], pemilix, Float:brangkat[3], Float:jarak_max[3], Float:origin_asli[3], korban
	pemilix = pev(Ent, pev_iuser1)
	pev(Ent, pev_origin, StartOriginz)
	korban = pev(Ent, pev_iuser2)
	
	if(headshot_korban[korban] == 1)
	{
		if(get_gametime() - 0.2 > pev(Ent, pev_fuser3))
		{
			Damage_guillotine(Ent, korban)
			set_pev(Ent, pev_fuser3, get_gametime())
		}
	}
	
	if(ent_sentuh_balik[pemilix] == 0 && shoot_ent_mode[pemilix] == 1)
	{
		ent_sentuh_balik[pemilix] = 1
		pev(pemilix, pev_origin, origin_asli)
		origin_asli[2] += 7.5
	}
	
	if(ent_sentuh[pemilix] == 1)
	{
		ent_sentuh[pemilix] = 0
		pev(Ent, pev_vuser2, jarak_max)
		pev(Ent, pev_vuser1, brangkat)
		get_speed_vector(StartOriginz, origin_asli, 1100.0, pulang)
					
		if(shoot_ent_mode[pemilix] == 1)
		{
			set_pev(Ent, pev_velocity, pulang)
		}
		else set_pev(Ent, pev_velocity, brangkat)
	}
	
	if(shoot_ent_mode[pemilix] == 0 && get_distance_f(StartOriginz, jarak_max) <= 10.0)
	{
		shoot_ent_mode[pemilix] = 1
		ent_sentuh[pemilix] = 1
		set_pev(Ent, pev_owner, 0)
	}
	
	if(shoot_ent_mode[pemilix] == 1 && get_distance_f(StartOriginz, origin_asli) <= 10.0)
	{
		if(is_user_alive(pemilix) && is_user_connected(pemilix) && get_user_weapon(pemilix) == CSW_BDRIPPER && g_had_guillotine[pemilix]) balik(Ent)
		else ancur(Ent)
	}
	else if(headshot_korban[korban] == 1) set_pev(Ent, pev_nextthink, get_gametime() + 0.2)
	else set_pev(Ent, pev_nextthink, halflife_time() + 0.01)
}

public fw_touch(Ent, Id)
{
	// If ent is valid
	if(!pev_valid(Ent))
		return
	if(pev(Ent, pev_movetype) == MOVETYPE_NONE)
		return
	static classnameptd[32]
	pev(Id, pev_classname, classnameptd, 31)
	if (equali(classnameptd, "func_breakable")) ExecuteHamB( Ham_TakeDamage, Id, 0, 0, 80.0, DMG_GENERIC )
	
	// Get it's origin
	new Float:originF[3], pemilix
	pemilix = pev(Ent, pev_iuser1)
	pev(Ent, pev_origin, originF)
	// Alive...
	
	if(is_user_alive(Id) && cs_get_user_team(pemilix) != cs_get_user_team(Id))
	{
		Damage_guillotine(Ent, Id)
		set_pev(Ent, pev_owner, Id)
		ent_sentuh[pemilix] = 1
		create_blood(originF)
		create_blood(originF)
	}
	
	else if(shoot_ent_mode[pemilix] == 1 && Id == pemilix)
	{
		if(is_user_alive(pemilix) && is_user_connected(pemilix) && get_user_weapon(pemilix) == CSW_BDRIPPER && g_had_guillotine[pemilix]) balik(Ent)
		else ancur(Ent)
	}
	
	else if(is_user_alive(Id) && cs_get_user_team(pemilix) == cs_get_user_team(Id))
	{
		set_pev(Ent, pev_owner, Id)
		ent_sentuh[pemilix] = 1
	}
	
	else
	{
		set_pev(Ent, pev_owner, 0)

		if(shoot_ent_mode[pemilix] == 0)
		{
			shoot_ent_mode[pemilix] = 1
			engfunc(EngFunc_EmitSound, Ent, CHAN_WEAPON, hit_wall, 1.0, ATTN_STATIC, 0, PITCH_NORM)
			ent_sentuh[pemilix] = 1
		}
		else ancur(Ent)
	}
}

public ancur(Ent)
{
	if(!pev_valid(Ent))
		return
	static Float:origin2[3], pemilix, Float:origin3[3]
	pemilix = pev(Ent, pev_iuser1)
	entity_get_vector(Ent, EV_VEC_origin, origin2)
	pev(Ent, pev_origin, origin3)
	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin2, 0)
	write_byte(TE_BREAKMODEL)
	engfunc(EngFunc_WriteCoord, origin2[0])
	engfunc(EngFunc_WriteCoord, origin2[1])
	engfunc(EngFunc_WriteCoord, origin2[2])
	engfunc(EngFunc_WriteCoord, 25)
	engfunc(EngFunc_WriteCoord, 25)
	engfunc(EngFunc_WriteCoord, 25)
	engfunc(EngFunc_WriteCoord, random_num(-25, 25))
	engfunc(EngFunc_WriteCoord, random_num(-25, 25))
	engfunc(EngFunc_WriteCoord, 5)
	write_byte(5)
	write_short(g_pecah)
	write_byte(10)
	write_byte(17)
	write_byte(0x00)
	message_end()
	
	fake_smokes(origin3)
	engfunc(EngFunc_EmitSound, Ent, CHAN_WEAPON, hit_wall2, 1.0, ATTN_STATIC, 0, PITCH_NORM)
	shoot_mode[pemilix] = 0
	remove_entity(Ent)
	
	if(!is_user_alive(pemilix) || !is_user_connected(pemilix) || get_user_weapon(pemilix) != CSW_BDRIPPER || !g_had_guillotine[pemilix])
		return
	
	set_weapon_anim(pemilix, ANIM_LOST)
	set_weapons_timeidle(pemilix, CSW_BDRIPPER, 2.5)
	set_player_nextattackx(pemilix, 2.5)
	set_task(1.3, "reload2", pemilix)
	set_task(1.4, "reload", pemilix)
}

public reload(id)
{
	if(!is_user_alive(id) || !is_user_connected(id) || get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id] || g_guillotine_ammo[id] == 0)
		return
	
	set_weapon_anim(id, ANIM_DRAW)
}

public reload2(id)
{
	if(!is_user_alive(id) || !is_user_connected(id) || get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id] || g_guillotine_ammo[id] == 0)
		return
	
	set_weapon_anim(id, ANIM_IDLE_SHOOT2)
}

public balik(Ent)
{
	if(!pev_valid(Ent))
		return
	static id
	id = pev(Ent, pev_iuser1)
	set_weapon_anim(id, ANIM_CATCH)
	emit_sound(id, CHAN_WEAPON, weapon_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
	set_weapons_timeidle(id, CSW_BDRIPPER, 1.0)
	set_player_nextattackx(id, 1.0)
	shoot_mode[id] = 0
	g_guillotine_ammo[id]++
	update_ammo(id)
	
	remove_entity(Ent)
}

public Damage_guillotine(Ent, Id)
{
	static Owner; Owner = pev(Ent, pev_iuser1)
	static Attacker; 
	if(!is_user_alive(Owner)) 
	{
		Attacker = 0
		return
	} else Attacker = Owner
	
	new bool:bIsHeadShot; // never make that one static
	new Float:flAdjustedDamage, bool:death
		
	switch( Get_MissileWeaponHitGroup(Ent) ) 
	{
		case HIT_GENERIC: flAdjustedDamage = DAMAGE * 1.0 
		case HIT_STOMACH: flAdjustedDamage = DAMAGE * 1.3 
		case HIT_LEFTLEG, HIT_RIGHTLEG: flAdjustedDamage = DAMAGE * 1.1
		case HIT_LEFTARM, HIT_RIGHTARM: flAdjustedDamage = DAMAGE * 1.2
		case HIT_HEAD, HIT_CHEST:
		{
			flAdjustedDamage = DAMAGE * 1.7
			bIsHeadShot = true
			if(headshot_mode[Owner] == 0) set_task(2.0, "balik_bro", Ent+1858941 )
			headshot_mode[Owner] = 1
			headshot_korban[Id] = 1
			guillotine_korban[Id] = Ent
			set_pev(Ent, pev_iuser2, Id)
			set_pev(Ent, pev_sequence, 1)
			set_pev(Ent, pev_solid, SOLID_NOT)
			set_pev(Ent, pev_fuser3, 0.0)
		}
	}
	if(pev(Id, pev_health) <= flAdjustedDamage) death = true 
	
	if(is_user_alive(Id))
	{
		if( bIsHeadShot && death)
		{
			if(task_exists( Ent+1858941 )) remove_task( Ent + 1858941 )
			set_pev(Ent, pev_sequence, 0)
			headshot_korban[pev(Ent, pev_iuser2)] = 0
			headshot_mode[Owner] = 0
			shoot_ent_mode[Owner] = 1
			ent_sentuh[Owner] = 1
			ent_sentuh_balik[Owner] = 0
			set_pev(Ent, pev_solid, SOLID_BBOX)
			set_pev(Ent, pev_nextthink, halflife_time() + 0.01)
	
			kill(Attacker, Id, 1)
			
			death = false			
		}
		if(death)
		{
			kill(Attacker, Id, 0)
			
			death = false			
		}
		else ExecuteHamB(Ham_TakeDamage, Id, Ent, Attacker, flAdjustedDamage, DMG_BULLET)
	}
}

public balik_bro(Ent)
{
	Ent -= 1858941
	
	if(!pev_valid(Ent))
		return
	
	static pemilix; pemilix = pev(Ent, pev_iuser1)
	set_pev(Ent, pev_sequence, 0)
	headshot_korban[pev(Ent, pev_iuser2)] = 0
	headshot_mode[pemilix] = 0
	shoot_ent_mode[pemilix] = 1
	ent_sentuh[pemilix] = 1
	ent_sentuh_balik[pemilix] = 0
	set_pev(Ent, pev_solid, SOLID_BBOX)
	set_pev(Ent, pev_nextthink, halflife_time() + 0.01)
}

public fw_SetModel(entity, model[])
{
	if(!pev_valid(entity))
		return FMRES_IGNORED
	
	static Classname[64]
	pev(entity, pev_classname, Classname, sizeof(Classname))
	
	if(!equal(Classname, "weaponbox"))
		return FMRES_IGNORED
	
	static id
	id = pev(entity, pev_owner)
	
	if(equal(model, old_w_model))
	{
		static weapon
		weapon = fm_get_user_weapon_entity(entity, CSW_BDRIPPER)
		
		if(!pev_valid(weapon))
			return FMRES_IGNORED
		
		if(g_had_guillotine[id])
		{
			set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
			set_pev(weapon, pev_iuser4, g_guillotine_ammo[id])
			engfunc(EngFunc_SetModel, entity, w_model)
			
			g_had_guillotine[id] = 0
			g_guillotine_ammo[id] = 0
			
			return FMRES_SUPERCEDE
		}
	}

	return FMRES_IGNORED;
}

public fw_AddToPlayer_Post(ent, id)
{
	if(pev(ent, pev_impulse) == WEAPON_SECRETCODE)
	{
		g_had_guillotine[id] = 1
		g_guillotine_ammo[id] = pev(ent, pev_iuser4)
		
		set_pev(ent, pev_impulse, 0)
	}			
	
	message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
	write_string((g_had_guillotine[id] == 1 ? "weapon_guillotine" : "weapon_mac10"))
	write_byte(6)
	write_byte(100)
	write_byte(-1)
	write_byte(-1)
	write_byte(0)
	write_byte(13)
	write_byte(CSW_BDRIPPER)
	write_byte(0)
	message_end()
}

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

	static weapon_ent; weapon_ent = fm_get_user_weapon_entity(id, CSW_BDRIPPER)
	if(!pev_valid(weapon_ent)) return
	
	cs_set_weapon_ammo(weapon_ent, g_guillotine_ammo[id])	
	cs_set_user_bpammo(id, CSW_BDRIPPER, g_guillotine_ammo[id])
	
	engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), {0, 0, 0}, id)
	write_byte(1)
	write_byte(CSW_BDRIPPER)
	write_byte(-1)
	message_end()
	
	message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("AmmoX"), _, id)
	write_byte(1)
	write_byte(g_guillotine_ammo[id])
	message_end()
}

public fw_traceline(Float:v1[3],Float:v2[3],noMonsters,id,ptr)
{
	if(!is_user_alive(id))
		return HAM_IGNORED	
	if(get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id])
		return HAM_IGNORED

	// get crosshair aim
	static Float:aim[3];
	get_aim(id,v1,aim);
	
	// do another trace to this spot
	new trace = create_tr2();
	engfunc(EngFunc_TraceLine,v1,aim,noMonsters,id,trace);
	
	// copy ints
	set_tr2(ptr,TR_AllSolid,get_tr2(trace,TR_AllSolid));
	set_tr2(ptr,TR_StartSolid,get_tr2(trace,TR_StartSolid));
	set_tr2(ptr,TR_InOpen,get_tr2(trace,TR_InOpen));
	set_tr2(ptr,TR_InWater,get_tr2(trace,TR_InWater));
	set_tr2(ptr,TR_pHit,get_tr2(trace,TR_pHit));
	set_tr2(ptr,TR_iHitgroup,get_tr2(trace,TR_iHitgroup));

	// copy floats
	get_tr2(trace,TR_flFraction,aim[0]);
	set_tr2(ptr,TR_flFraction,aim[0]);
	get_tr2(trace,TR_flPlaneDist,aim[0]);
	set_tr2(ptr,TR_flPlaneDist,aim[0]);
	
	// copy vecs
	get_tr2(trace,TR_vecEndPos,aim);
	set_tr2(ptr,TR_vecEndPos,aim);
	get_tr2(trace,TR_vecPlaneNormal,aim);
	set_tr2(ptr,TR_vecPlaneNormal,aim);

	// get rid of new trace
	free_tr2(trace);

	return FMRES_IGNORED;
}

get_aim(id,Float:source[3],Float:ret[3])
{
	static Float:vAngle[3], Float:pAngle[3], Float:dir[3], Float:temp[3];

	// get aiming direction from forward global based on view angle and punch angle
	pev(id,pev_v_angle,vAngle);
	pev(id,pev_punchangle,pAngle);
	xs_vec_add(vAngle,pAngle,temp);
	engfunc(EngFunc_MakeVectors,temp);
	global_get(glb_v_forward,dir);
	
	/* vecEnd = vecSrc + vecDir * flDistance; */
	xs_vec_mul_scalar(dir,8192.0,temp);
	xs_vec_add(source,temp,ret);
}

public fake_smokes(Float:Origin[3])
{
	static TE_FLAG
	
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, Origin, 0)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_smokepuff_id)
	write_byte(6)
	write_byte(25)
	write_byte(TE_FLAG)
	message_end()
}

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, {0, 0, 0}, id)
	write_byte(anim)
	write_byte(pev(id, pev_body))
	message_end()
}

stock kill(k, v, headshot)
{
	cs_set_user_money(k, cs_get_user_money(k) + 500)
	
	set_user_frags(k, get_user_frags(k) + 1)
	
	set_msg_block(g_MsgDeathMsg,BLOCK_ONCE)
	set_msg_block(gmsgScoreInfo,BLOCK_ONCE)
	user_kill(v,1)
	
	new kteam = get_user_team(k);
	new vteam = get_user_team(v);
	
	new kfrags = get_user_frags(k);
	new kdeaths = get_user_deaths(k);
	
	new vfrags = get_user_frags(v);
	new vdeaths = get_user_deaths(v);
	
	emessage_begin(MSG_ALL, gmsgScoreInfo);
	ewrite_byte(k);
	ewrite_short(kfrags);
	ewrite_short(kdeaths);
	ewrite_short(0);
	ewrite_short(kteam);
	emessage_end();
	
	emessage_begin(MSG_ALL, gmsgScoreInfo);
	ewrite_byte(v);
	ewrite_short(vfrags);
	ewrite_short(vdeaths);
	ewrite_short(0);
	ewrite_short(vteam);
	emessage_end();
	
	emessage_begin(MSG_BROADCAST, g_MsgDeathMsg)
	ewrite_byte(k)
	ewrite_byte(v)
	ewrite_byte(headshot)
	ewrite_string("Blood Dripper")
	emessage_end()
}


stock create_blood(const Float:origin[3])
{
	// Show some blood :)
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
	write_byte(TE_BLOODSPRITE)
	engfunc(EngFunc_WriteCoord, origin[0])
	engfunc(EngFunc_WriteCoord, origin[1])
	engfunc(EngFunc_WriteCoord, origin[2])
	write_short(m_iBlood[1])
	write_short(m_iBlood[0])
	write_byte(75)
	write_byte(8)
	message_end()
}

stock drop_weapons(id, dropwhat)
{
	static weapons[32], num, i, weaponid
	num = 0
	get_user_weapons(id, weapons, num)
	 
	for (i = 0; i < num; i++)
	{
		weaponid = weapons[i]
		  
		if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
		{
			static wname[32]
			get_weaponname(weaponid, wname, sizeof wname - 1)
			engclient_cmd(id, "drop", wname)
		}
	}
}

stock Get_MissileWeaponHitGroup( iEnt )
{
	new Float:flStart[ 3 ], Float:flEnd[ 3 ];
	
	pev( iEnt, pev_origin, flStart );
	pev( iEnt, pev_velocity, flEnd );
	xs_vec_add( flStart, flEnd, flEnd );
	
	new ptr = create_tr2();
	engfunc( EngFunc_TraceLine, flStart, flEnd, 0, iEnt, ptr );
	
	new iHitGroup, Owner, nOhead, head
	Owner = pev(iEnt, pev_iuser1)
	nOhead = get_tr2( ptr, TR_iHitgroup )
	head = set_tr2( ptr, TR_iHitgroup, HIT_HEAD )
	
	iHitGroup = headshot_mode[Owner] ? head : nOhead
	
	free_tr2( ptr );
	
	return iHitGroup;
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
	new_velocity[0] = origin2[0] - origin1[0]
	new_velocity[1] = origin2[1] - origin1[1]
	new_velocity[2] = origin2[2] - origin1[2]
	static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
	new_velocity[0] *= num
	new_velocity[1] *= num
	new_velocity[2] *= num
	
	return 1;
}

stock get_position(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) //for player
	xs_vec_add(vOrigin, vUp, vOrigin)
	pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
	
	angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
	angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight)
	angle_vector(vAngle, ANGLEVECTOR_UP, vUp)
	
	vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
	vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
	vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}

stock set_weapons_timeidle(id, 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, 48, TimeIdle + 0.2, OFFSET_LINUX_WEAPONS)
}

stock set_player_nextattackx(id, Float:nexttime)
{
	if(!is_user_alive(id))
		return
		
	set_pdata_float(id, m_flNextAttack, nexttime, 5)
}
Knife Menu:
Code:
#include <amxmodx>
#include <amxmisc>
#include <crxknives_const>
#include <cromchat>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>

native crxranks_get_max_levels()
native crxranks_get_rank_by_level(level, buffer[], len)
native crxranks_get_user_level(id)
native crxranks_get_user_xp(id)

new const g_szNatives[][] =
{
	"crxranks_get_max_levels",
	"crxranks_get_rank_by_level",
	"crxranks_get_user_level",
	"crxranks_get_user_xp"
}

#if !defined m_pPlayer
const m_pPlayer = 41
#endif

#if !defined client_disconnected
	#define client_disconnected client_disconnect
#endif

new const PLUGIN_VERSION[] = "3.1.1"
const Float:DELAY_ON_CONNECT = 3.0

#if !defined MAX_AUTHID_LENGTH
const MAX_AUTHID_LENGTH = 35
#endif

#if !defined MAX_NAME_LENGTH
const MAX_NAME_LENGTH = 32
#endif

#if !defined MAX_PLAYERS
const MAX_PLAYERS = 32
#endif

enum
{
	SOUND_NONE = 0,
	SOUND_DEPLOY,
	SOUND_HIT,
	SOUND_HITWALL,
	SOUND_SLASH,
	SOUND_STAB
}

enum _:Knives
{
	NAME[MAX_NAME_LENGTH],
	V_MODEL[CRXKNIVES_MAX_SOUND_LENGTH],
	P_MODEL[CRXKNIVES_MAX_SOUND_LENGTH],
	DEPLOY_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
	HIT_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
	HITWALL_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
	SLASH_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
	STAB_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
	SELECT_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
	FLAG,
	LEVEL,
	XP,
	SELECT_MESSAGES_NUM,
	bool:SHOW_RANK,
	bool:HAS_CUSTOM_SOUND,
	Array:SELECT_MESSAGES,
	Trie:ATTRIBUTES
}

enum _:CvarsReg
{
	cvar_km_open_at_spawn,
	cvar_km_save_choice,
	cvar_km_only_dead,
	cvar_km_select_message,
	cvar_km_knife_only_skills,
	cvar_km_admin_bypass
}

enum _:Cvars
{
	km_open_at_spawn,
	km_save_choice,
	km_only_dead,
	km_select_message,
	km_knife_only_skills,
	km_admin_bypass
}

new Array:g_aKnives,
	bool:g_bFirstTime[MAX_PLAYERS + 1],
	bool:g_bRankSystem,
	bool:g_bGetLevel,
	bool:g_bGetXP,
	g_eCvars[Cvars],
	g_eCvarsReg[CvarsReg],
	g_eKnife[MAX_PLAYERS + 1][Knives],
	g_szAuth[MAX_PLAYERS + 1][MAX_AUTHID_LENGTH],
	g_iKnife[MAX_PLAYERS + 1],
	g_fwdKnifeUpdated,
	g_fwdAttemptChange,
	g_iMenuFlags,
	g_iKnivesNum,
	g_iCallback,
	g_iVault

public plugin_init()
{
	register_plugin("Knife Models", PLUGIN_VERSION, "OciXCrom")
	register_cvar("CRXKnifeModels", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)

	if(!g_iKnivesNum)
	{
		set_fail_state("No knives found in the configuration file.")
	}

	register_dictionary("KnifeModels.txt")

	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
	register_forward(FM_EmitSound,	"OnEmitSound")
	RegisterHam(Ham_Item_Deploy, "weapon_knife", "OnSelectKnife", 1)

	register_clcmd("say /knife",       "Cmd_Knife")
	register_clcmd("say_team /knife",  "Cmd_Knife")
	register_clcmd("crxknives_select", "Cmd_Select", _, "<knife id>")

	g_fwdKnifeUpdated  = CreateMultiForward("crxknives_knife_updated",  ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
	g_fwdAttemptChange = CreateMultiForward("crxknives_attempt_change", ET_STOP,   FP_CELL, FP_CELL)

	g_iCallback = menu_makecallback("CheckKnifeAccess")

	g_eCvarsReg[cvar_km_open_at_spawn]     = register_cvar("km_open_at_spawn",     "0")
	g_eCvarsReg[cvar_km_save_choice]       = register_cvar("km_save_choice",       "1")
	g_eCvarsReg[cvar_km_only_dead]         = register_cvar("km_only_dead",         "0")
	g_eCvarsReg[cvar_km_select_message]    = register_cvar("km_select_message",    "1")
	g_eCvarsReg[cvar_km_knife_only_skills] = register_cvar("km_knife_only_skills", "1")
	g_eCvarsReg[cvar_km_admin_bypass]      = register_cvar("km_admin_bypass",      "0")
}

public plugin_precache()
{
	if(LibraryExists("crxranks", LibType_Library))
	{
		g_bRankSystem = true
	}

	g_aKnives = ArrayCreate(Knives)
	ReadFile()
}

public plugin_cfg()
{
	g_eCvars[km_save_choice]       = get_pcvar_num(g_eCvarsReg[cvar_km_save_choice])
	g_eCvars[km_open_at_spawn]     = get_pcvar_num(g_eCvarsReg[cvar_km_open_at_spawn])
	g_eCvars[km_only_dead]         = get_pcvar_num(g_eCvarsReg[cvar_km_only_dead])
	g_eCvars[km_select_message]    = get_pcvar_num(g_eCvarsReg[cvar_km_select_message])
	g_eCvars[km_knife_only_skills] = get_pcvar_num(g_eCvarsReg[cvar_km_knife_only_skills])
	g_eCvars[km_admin_bypass]      = get_pcvar_num(g_eCvarsReg[cvar_km_admin_bypass])

	if(g_eCvars[km_save_choice])
	{
		g_iVault = nvault_open("KnifeModels")
	}
}

public plugin_end()
{
	for(new eKnife[Knives], i; i < g_iKnivesNum; i++)
	{
		ArrayGetArray(g_aKnives, i, eKnife)
		ArrayDestroy(eKnife[SELECT_MESSAGES])
		TrieDestroy(eKnife[ATTRIBUTES])
	}

	ArrayDestroy(g_aKnives)

	if(g_eCvars[km_save_choice])
	{
		nvault_close(g_iVault)
	}
}

ReadFile()
{
	new szFilename[256]
	get_configsdir(szFilename, charsmax(szFilename))
	add(szFilename, charsmax(szFilename), "/KnifeModels.ini")
	new iFilePointer = fopen(szFilename, "rt")

	if(iFilePointer)
	{
		new szData[160], szKey[32], szValue[128], szSound[128], iMaxLevels
		new eKnife[Knives], bool:bCustom

		if(g_bRankSystem)
		{
			iMaxLevels = crxranks_get_max_levels()
		}

		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)

			switch(szData[0])
			{
				case EOS, '#', ';': continue
				case '[':
				{
					if(szData[strlen(szData) - 1] == ']')
					{
						if(g_iKnivesNum)
						{
							push_knife(eKnife)
						}

						g_iKnivesNum++
						replace(szData, charsmax(szData), "[", "")
						replace(szData, charsmax(szData), "]", "")
						copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)

						eKnife[V_MODEL][0] = EOS
						eKnife[P_MODEL][0] = EOS
						eKnife[DEPLOY_SOUND][0] = EOS
						eKnife[HIT_SOUND][0] = EOS
						eKnife[HITWALL_SOUND][0] = EOS
						eKnife[SLASH_SOUND][0] = EOS
						eKnife[STAB_SOUND][0] = EOS
						eKnife[SELECT_SOUND][0] = EOS
						eKnife[FLAG] = ADMIN_ALL
						eKnife[HAS_CUSTOM_SOUND] = false
						eKnife[SELECT_MESSAGES_NUM] = 0
						eKnife[SELECT_MESSAGES] = _:ArrayCreate(CRXKNIVES_MAX_MESSAGE_LENGTH)
						eKnife[ATTRIBUTES] = _:TrieCreate()

						if(g_bRankSystem)
						{
							eKnife[LEVEL] = 0
							eKnife[SHOW_RANK] = false
							eKnife[XP] = 0
						}

						static const ATTRIBUTE_NAME[] = "NAME"
						TrieSetString(eKnife[ATTRIBUTES], ATTRIBUTE_NAME, szData)
					}
					else continue
				}
				default:
				{
					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
					bCustom = true

					TrieSetString(eKnife[ATTRIBUTES], szKey, szValue)

					if(equal(szKey, "FLAG"))
					{
						eKnife[FLAG] = read_flags(szValue)
						g_iMenuFlags |= eKnife[FLAG]
					}
					else if(equal(szKey, "LEVEL") && g_bRankSystem)
					{
						eKnife[LEVEL] = clamp(str_to_num(szValue), 0, iMaxLevels)

						if(!g_bGetLevel)
						{
							g_bGetLevel = true
						}
					}
					else if(equal(szKey, "SHOW_RANK") && g_bRankSystem)
					{
						eKnife[SHOW_RANK] = _:clamp(str_to_num(szValue), false, true)
					}
					else if(equal(szKey, "XP") && g_bRankSystem)
					{
						eKnife[XP] = _:clamp(str_to_num(szValue), 0)

						if(!g_bGetXP)
						{
							g_bGetXP = true
						}
					}
					else if(equal(szKey, "V_MODEL"))
					{
						copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
					}
					else if(equal(szKey, "P_MODEL"))
					{
						copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
					}
					else if(equal(szKey, "DEPLOY_SOUND"))
					{
						copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
					}
					else if(equal(szKey, "HIT_SOUND"))
					{
						copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
					}
					else if(equal(szKey, "HITWALL_SOUND"))
					{
						copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
					}
					else if(equal(szKey, "SLASH_SOUND"))
					{
						copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
					}
					else if(equal(szKey, "STAB_SOUND"))
					{
						copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
					}
					else if(equal(szKey, "SELECT_SOUND"))
					{
						bCustom = false
						copy(eKnife[SELECT_SOUND], charsmax(eKnife[SELECT_SOUND]), szValue)
					}
					else if(equal(szKey, "SELECT_MESSAGE"))
					{
						ArrayPushString(eKnife[SELECT_MESSAGES], szValue)
						eKnife[SELECT_MESSAGES_NUM]++
					}
					else continue

					static const szModelArg[] = "_MODEL"
					static const szSoundArg[] = "_SOUND"

					if(contain(szKey, szModelArg) != -1)
					{
						if(!file_exists(szValue))
						{
							log_amx("ERROR: model ^"%s^" not found!", szValue)
						}
						else
						{
							precache_model(szValue)
						}
					}
					else if(contain(szKey, szSoundArg) != -1)
					{
						formatex(szSound, charsmax(szSound), "sound/%s", szValue)

						if(!file_exists(szSound))
						{
							log_amx("ERROR: sound ^"%s^" not found!", szSound)
						}
						else
						{
							precache_sound(szValue)
						}

						if(bCustom)
						{
							eKnife[HAS_CUSTOM_SOUND] = true
						}
					}
				}
			}
		}

		if(g_iKnivesNum)
		{
			push_knife(eKnife)
		}

		fclose(iFilePointer)
	}
}

public client_connect(id)
{
	g_bFirstTime[id] = true
	ArrayGetArray(g_aKnives, 0, g_eKnife[id])
	g_iKnife[id] = 0

	new iReturn
	ExecuteForward(g_fwdKnifeUpdated, iReturn, id, g_iKnife[id], true)

	if(g_eCvars[km_save_choice])
	{
		get_user_authid(id, g_szAuth[id], charsmax(g_szAuth[]))
		set_task(DELAY_ON_CONNECT, "load_data", id)
	}
}

public client_disconnected(id)
{
	if(g_eCvars[km_save_choice])
	{
		use_vault(id, true)
	}
}

public OnEmitSound(id, iChannel, const szSample[])
{
	if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
	{
		return FMRES_IGNORED
	}

	switch(detect_knife_sound(szSample))
	{
		case SOUND_DEPLOY: 		if(g_eKnife[id][DEPLOY_SOUND][0]) 		{ play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]);      return FMRES_SUPERCEDE; }
		case SOUND_HIT: 		if(g_eKnife[id][HIT_SOUND][0]) 			{ play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]);         return FMRES_SUPERCEDE; }
		case SOUND_HITWALL:		if(g_eKnife[id][HITWALL_SOUND][0]) 		{ play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]);     return FMRES_SUPERCEDE; }
		case SOUND_SLASH: 		if(g_eKnife[id][SLASH_SOUND][0]) 		{ play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]);       return FMRES_SUPERCEDE; }
		case SOUND_STAB: 		if(g_eKnife[id][STAB_SOUND][0]) 		{ play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]);        return FMRES_SUPERCEDE; }
	}

	return FMRES_IGNORED
}

public Cmd_Knife(id)
{
	if(g_eCvars[km_only_dead] && is_user_alive(id))
	{
		CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
		return PLUGIN_HANDLED
	}

	static eKnife[Knives]
	new szTitle[128], szItem[128], iLevel, iXP
	formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")

	if(g_bGetLevel)
	{
		iLevel = crxranks_get_user_level(id)
	}

	if(g_bGetXP)
	{
		iXP = crxranks_get_user_xp(id)
	}

	new iMenu = menu_create(szTitle, "MenuHandler")

	for(new iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
	{
		ArrayGetArray(g_aKnives, i, eKnife)
		copy(szItem, charsmax(szItem), eKnife[NAME])

		if(g_bRankSystem)
		{
			if(eKnife[LEVEL] && iLevel < eKnife[LEVEL])
			{
				if(eKnife[SHOW_RANK])
				{
					static szRank[32]
					crxranks_get_rank_by_level(eKnife[LEVEL], szRank, charsmax(szRank))
					format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_RANK", szRank)
				}
				else
				{
					format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_LEVEL", eKnife[LEVEL])
				}
			}

			if(eKnife[XP] && iXP < eKnife[XP])
			{
				format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_XP", eKnife[XP])
			}
		}

		if(eKnife[FLAG] != ADMIN_ALL && !(iFlags & eKnife[FLAG]))
		{
			format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_VIP_ONLY")
		}

		if(g_iKnife[id] == i)
		{
			format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_SELECTED")
		}

		menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG], g_iCallback)
	}

	if(menu_pages(iMenu) > 1)
	{
		formatex(szItem, charsmax(szItem), "%s%L", szTitle, id, "KM_MENU_TITLE_PAGE")
		menu_setprop(iMenu, MPROP_TITLE, szItem)
	}

	menu_display(id, iMenu)
	return PLUGIN_HANDLED
}

public Cmd_Select(id, iLevel, iCid)
{
	if(!cmd_access(id, iLevel, iCid, 2))
	{
		return PLUGIN_HANDLED
	}

	if(g_eCvars[km_only_dead] && is_user_alive(id))
	{
		CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
		return PLUGIN_HANDLED
	}

	new szKnife[4]
	read_argv(1, szKnife, charsmax(szKnife))

	new iKnife = str_to_num(szKnife)

	if(!is_knife_valid(iKnife))
	{
		console_print(id, "%l", "KM_INVALID_KNIFE", g_iKnivesNum - 1)
		return PLUGIN_HANDLED
	}

	if(!has_knife_access(id, iKnife))
	{
		console_print(id, "%l", "KM_NO_ACCESS")
		return PLUGIN_HANDLED
	}

	select_knife(id, iKnife)
	return PLUGIN_HANDLED
}

public MenuHandler(id, iMenu, iItem)
{
	if(g_eCvars[km_only_dead] && is_user_alive(id))
	{
		CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
		goto @MENU_DESTROY
	}

	if(!is_user_connected(id))
	{
		goto @MENU_DESTROY
	}

	if(iItem != MENU_EXIT)
	{
		select_knife(id, iItem)
	}

	@MENU_DESTROY:
	menu_destroy(iMenu)
	return PLUGIN_HANDLED
}

select_knife(id, iKnife)
{
	new iReturn
	ExecuteForward(g_fwdAttemptChange, iReturn, id, iKnife)

	if(iReturn == PLUGIN_HANDLED)
	{
		return
	}

	g_iKnife[id] = iKnife
	ArrayGetArray(g_aKnives, iKnife, g_eKnife[id])
	ExecuteForward(g_fwdKnifeUpdated, iReturn, id, iKnife, false)

	if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
	{
		refresh_knife_model(id)
	}

	if(g_eCvars[km_select_message])
	{
		CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_CHAT_SELECTED", g_eKnife[id][NAME])
	}

	if(g_eKnife[id][SELECT_MESSAGES_NUM])
	{
		for(new i; i < g_eKnife[id][SELECT_MESSAGES_NUM]; i++)
		{
			CC_SendMessage(id, "%a", ArrayGetStringHandle(g_eKnife[id][SELECT_MESSAGES], i))
		}
	}

	if(g_eKnife[id][SELECT_SOUND][0])
	{
		play_knife_sound(id, g_eKnife[id][SELECT_SOUND])
	}
}

public load_data(id)
{
	if(is_user_connected(id))
	{
		use_vault(id, false)
	}
}

public CheckKnifeAccess(id, iMenu, iItem)
{
	return ((g_iKnife[id] == iItem) || !has_knife_access(id, iItem)) ? ITEM_DISABLED : ITEM_ENABLED
}

public OnPlayerSpawn(id)
{
	if(is_user_alive(id) && g_eCvars[km_open_at_spawn] && !g_iKnife[id] && g_bFirstTime[id] && (g_iMenuFlags & ADMIN_USER || get_user_flags(id) & g_iMenuFlags))
	{
		g_bFirstTime[id] = false
		Cmd_Knife(id)
	}
}

public OnSelectKnife(iEnt)
{
	new id = get_pdata_cbase(iEnt, m_pPlayer, 4)

	if(is_user_connected(id))
	{
		refresh_knife_model(id)
	}
}

refresh_knife_model(const id)
{
	set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
	set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}

push_knife(eKnife[Knives])
{
	if(!eKnife[V_MODEL][0])
	{
		copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), CRXKNIVES_DEFAULT_V)
	}

	if(!eKnife[P_MODEL][0])
	{
		copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), CRXKNIVES_DEFAULT_P)
	}

	if(!eKnife[FLAG])
	{
		g_iMenuFlags |= ADMIN_USER
	}

	ArrayPushArray(g_aKnives, eKnife)
}

bool:has_knife_access(const id, const iKnife)
{
	static eKnife[Knives]
	ArrayGetArray(g_aKnives, iKnife, eKnife)

	if(eKnife[FLAG] != ADMIN_ALL)
	{
		if(get_user_flags(id) & eKnife[FLAG])
		{
			if(g_eCvars[km_admin_bypass])
			{
				return true
			}
		}
		else
		{
			return false
		}
	}

	if(g_bRankSystem)
	{
		if(eKnife[LEVEL] && crxranks_get_user_level(id) < eKnife[LEVEL])
		{
			return false
		}

		if(eKnife[XP] && crxranks_get_user_xp(id) < eKnife[XP])
		{
			return false
		}
	}

	return true
}

bool:is_knife_sound(const szSample[])
{
	return bool:equal(szSample[8], "kni", 3)
}

detect_knife_sound(const szSample[])
{
	static iSound
	iSound = SOUND_NONE

	if(equal(szSample, "weapons/knife_deploy1.wav"))
	{
		iSound = SOUND_DEPLOY
	}
	else if(equal(szSample[14], "hit", 3))
	{
		iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
	}
	else if(equal(szSample[14], "sla", 3))
	{
		iSound = SOUND_SLASH
	}
	else if(equal(szSample[14], "sta", 3))
	{
		iSound = SOUND_STAB
	}

	return iSound
}

use_vault(const id, const bool:bSave)
{
	if(bSave)
	{
		new szData[4]
		num_to_str(g_iKnife[id], szData, charsmax(szData))
		nvault_set(g_iVault, g_szAuth[id], szData)
	}
	else
	{
		new iKnife
		iKnife = nvault_get(g_iVault, g_szAuth[id])

		if(!is_knife_valid(iKnife))
		{
			iKnife = 0
		}
		else if(has_knife_access(id, iKnife))
		{
			g_iKnife[id] = iKnife

			new iReturn
			ArrayGetArray(g_aKnives, iKnife, g_eKnife[id])
			ExecuteForward(g_fwdKnifeUpdated, iReturn, id, iKnife, false)

			if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
			{
				refresh_knife_model(id)
			}
		}
	}
}

play_knife_sound(const id, const szSound[])
{
	engfunc(EngFunc_EmitSound, id, CHAN_AUTO, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
}

bool:is_knife_valid(const iKnife)
{
	return 0 <= iKnife < g_iKnivesNum
}

public plugin_natives()
{
	register_library("crxknives")
	register_native("crxknives_can_use_skill",       "_crxknives_can_use_skill")
	register_native("crxknives_get_attribute_int",   "_crxknives_get_attribute_int")
	register_native("crxknives_get_attribute_float", "_crxknives_get_attribute_float")
	register_native("crxknives_get_attribute_str",   "_crxknives_get_attribute_str")
	register_native("crxknives_get_knives_num",      "_crxknives_get_knives_num")
	register_native("crxknives_get_user_knife",      "_crxknives_get_user_knife")
	register_native("crxknives_has_knife_access",    "_crxknives_has_knife_access")
	register_native("crxknives_is_knife_valid",      "_crxknives_is_knife_valid")
	set_native_filter("native_filter")
}

public native_filter(const szNative[], id, iTrap)
{
	if(!iTrap)
	{
		static i

		for(i = 0; i < sizeof(g_szNatives); i++)
		{
			if(equal(szNative, g_szNatives[i]))
			{
				return PLUGIN_HANDLED
			}
		}
	}

	return PLUGIN_CONTINUE
}

public bool:_crxknives_can_use_skill(iPlugin, iParams)
{
	return !g_eCvars[km_knife_only_skills] || (get_user_weapon(get_param(1)) == CSW_KNIFE)
}

public bool:_crxknives_get_attribute_int(iPlugin, iParams)
{
	static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
	get_string(2, szAttribute, charsmax(szAttribute))
	id = get_param(1)

	if(!get_param(4))
	{
		if(!is_knife_valid(id))
		{
			return false
		}

		static eKnife[Knives]
		ArrayGetArray(g_aKnives, id, eKnife)

		if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
		{
			return false
		}

		TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
		goto @SET_ATTRIBUTE
	}

	if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
	{
		return false
	}

	TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))

	@SET_ATTRIBUTE:
	set_param_byref(3, str_to_num(szValue))
	return true
}

public bool:_crxknives_get_attribute_float(iPlugin, iParams)
{
	static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
	get_string(2, szAttribute, charsmax(szAttribute))
	id = get_param(1)

	if(!get_param(4))
	{
		if(!is_knife_valid(id))
		{
			return false
		}

		static eKnife[Knives]
		ArrayGetArray(g_aKnives, id, eKnife)

		if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
		{
			return false
		}

		TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
		goto @SET_ATTRIBUTE
	}

	if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
	{
		return false
	}

	TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))

	@SET_ATTRIBUTE:
	set_float_byref(3, str_to_float(szValue))
	return true
}

public bool:_crxknives_get_attribute_str(iPlugin, iParams)
{
	static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
	get_string(2, szAttribute, charsmax(szAttribute))
	id = get_param(1)

	if(!get_param(5))
	{
		if(!is_knife_valid(id))
		{
			return false
		}

		static eKnife[Knives]
		ArrayGetArray(g_aKnives, id, eKnife)

		if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
		{
			return false
		}

		TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
		goto @SET_ATTRIBUTE
	}

	if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
	{
		return false
	}

	TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))

	@SET_ATTRIBUTE:
	set_string(3, szValue, get_param(4))
	return true
}

public _crxknives_get_knives_num(iPlugin, iParams)
{
	return g_iKnivesNum
}

public _crxknives_get_user_knife(iPlugin, iParams)
{
	return g_iKnife[get_param(1)]
}

public bool:_crxknives_has_knife_access(iPlugin, iParams)
{
	return has_knife_access(get_param(1), get_param(2))
}

public bool:_crxknives_is_knife_valid(iPlugin, iParams)
{
	return is_knife_valid(get_param(1))
}
__________________

Last edited by nG_getwreck; 01-03-2021 at 23:00.
nG_getwreck is offline
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 01-04-2021 , 07:42   Re: Knife Models [XP System & Skills Support]
Reply With Quote #278

This is a simple Knife menu, you're trying to add a MAC-10 in it. I don't know how that would function, but try it:

PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <fun>
#include <amxmisc>
#include <crxknives>

#define PLUGIN "GUILLOTINE"
#define VERSION "1.0"
#define AUTHOR "RAZER" // OciXCrom: added Knife Models support

#define CSW_BDRIPPER CSW_MAC10
#define weapon_guillotine "weapon_mac10"
#define old_event "events/mac10.sc"
#define old_w_model "models/w_mac10.mdl"
#define WEAPON_SECRETCODE 1329419


#define DEFAULT_AMMO 10
#define DAMAGE 10
#define BDRIP_CLASSNAME "Blood Dripper"
#define WEAPON_ANIMEXT "knife"

#define Get_Ent_Data(%1,%2) get_pdata_int(%1,%2,4)
#define Set_Ent_Data(%1,%2,%3) set_pdata_int(%1,%2,%3,4)

new const ATTRIBUTE_BONUS_XP[] = "GUILLOTINE"

const PDATA_SAFE 2
const OFFSET_LINUX_WEAPONS 4
const OFFSET_WEAPONOWNER 41
const m_flNextAttack 83
const m_szAnimExtention 492

new const v_model[] = "models/v_guillotine.mdl"
new const p_model[] = "models/p_guillotine.mdl"
new const w_model[] = "models/w_guillotine.mdl"
new const KNIFE_MODEL[] = "models/guillotine_projectile.mdl"
new const PECAH_MODEL[] = "models/gibs_guilotine.mdl"
new const hit_wall[] = "weapons/janus9_stone1.wav"
new const hit_wall2[] = "weapons/janus9_stone2.wav"
new const weapon_sound[6][] = 
{
    
"weapons/guillotine_catch2.wav",
    
"weapons/guillotine_draw.wav",
    
"weapons/guillotine_draw_empty.wav",
    
"weapons/guillotine_explode.wav",
    
"weapons/guillotine_red.wav",
    
"weapons/guillotine-1.wav"
}


new const 
WeaponResource[3][] = 
{
    
"sprites/weapon_guillotine.txt",
    
"sprites/640hud120.spr",
    
"sprites/guillotine_lost.spr"
}

enum
{
    
ANIM_IDLE 0,
    
ANIM_IDLE_EMPTY,
    
ANIM_SHOOT,
    
ANIM_DRAW,
    
ANIM_DRAW_EMPTY,
    
ANIM_IDLE_SHOOT,
    
ANIM_IDLE_SHOOT2,
    
ANIM_CATCH,
    
ANIM_LOST
}

new 
g_MsgDeathMsg

new g_had_guillotine[33], g_guillotine_ammo[33], shoot_mode[33], shoot_ent_mode[33], g_pecahheadshot_mode[33], ent_sentuh[33], ent_sentuh_balik[33]
new 
g_old_weapon[33], g_smokepuff_idm_iBlood[2], guillotine_korban[33], headshot_korban[33], gmsgScoreInfo

const PRIMARY_WEAPONS_BIT_SUM 
(
1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_cvar("guillotine_version""m4m3ts"FCVAR_SERVER|FCVAR_SPONLY)
    
register_forward(FM_CmdStart"fw_CmdStart")
    
register_forward(FM_SetModel"fw_SetModel")
    
register_think(BDRIP_CLASSNAME"fw_Think")
    
register_touch(BDRIP_CLASSNAME"*""fw_touch")
    
register_forward(FM_UpdateClientData"fw_UpdateClientData_Post"1)
    
register_forward(FM_TraceLine"fw_traceline"1)
    
register_forward(FM_AddToFullPack"fm_addtofullpack_post"1)
    
RegisterHam(Ham_Weapon_WeaponIdleweapon_guillotine"fw_guillotineidleanim"1)
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHam(Ham_Item_AddToPlayerweapon_guillotine"fw_AddToPlayer_Post"1)
    
register_event("CurWeapon""Event_CurWeapon""be""1=1")
    
register_clcmd("weapon_guillotine""hook_weapon")
    
//register_clcmd("say /guillotine","get_guillotine",ADMIN_IMMUNITY)
    //register_concmd("guillotine","admin_weapon",ADMIN_IMMUNITY,"<authid, nick, @team, @all or #userid> <weapon #>")
    
g_MsgDeathMsg get_user_msgid("DeathMsg")
    
gmsgScoreInfo get_user_msgid("ScoreInfo")
}

public 
crxknives_knife_updated(idiKnifebool:bOnConnect)
{
    if(
bOnConnect)
    {
        
g_had_guillotine[id] = false
    
}

    
crxknives_get_attribute_int(idATTRIBUTE_BONUS_XPg_had_guillotine[id])
}

public 
admin_weapon(id,level,cid)
{
   if ( !
cmd_access(id,level,cid,3) )
      return 
PLUGIN_HANDLED

   
new arg1[32],arg2[8],weapon
   read_argv
(1,arg1,31)
   
read_argv(2,arg2,7)
   
weapon str_to_num(arg2)

   if ( 
equali(arg1,"@all") )
   {
      new 
plist[32],pnum
      get_players
(plist,pnum,"a")
      if (
pnum==0)
      {
         return 
PLUGIN_HANDLED
      
}
      for (new 
i=0i<pnumi++)
            if ( !
give_weapon(plist[i],weapon) )
            {

            }

      if (!
get_cvar_num("amx_weaponmsg")) return PLUGIN_HANDLED
      set_hudmessage
(10,200,10,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
      
show_hudmessage(0,"All players have been given a weapon!")
   }
   else if ( 
arg1[0]=='@' )
   {
      new 
plist[32],pnum
      get_players
(plist,pnum,"ae",arg1[1])
      if ( 
pnum==)
      {
         return 
PLUGIN_HANDLED
      
}
      for (new 
i=0i<pnumi++)
            
give_weapon(plist[i],weapon)
      if ( 
get_cvar_num("amx_weaponmsg") )
      {
         if (
equali(arg1[1],"CT")) set_hudmessage(200,20,0,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
         else 
set_hudmessage(0,20,200,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
         
show_hudmessage(0,"The %ss have been given a weapon!",arg1[1])
      }
   }
   else
   {
      new 
pName[32]
      new 
player cmd_target(id,arg1,6)
      if (!
player) return PLUGIN_HANDLED
      give_weapon
(player,weapon)
      
get_user_name(player,pName,31)
      if (
get_cvar_num("amx_weaponmsg"))
      {
         
set_hudmessage(10,200,10,-1.0,0.30,0,6.0,6.0,0.5,0.15,1)
         
show_hudmessage(0,"%s has been given a weapon!",pName)
      }
   }
   return 
PLUGIN_HANDLED
}
give_weapon(id,weapon)
{
   switch (
weapon)
   {
       case 
1:{
      
get_guillotine(id)
      }
      case 
2:{
      
remove_guillotine(id)
      }
      default: return 
false
   
}
   return 
true
}
public 
plugin_precache()
{
    
precache_model(v_model)
    
precache_model(p_model)
    
precache_model(w_model)
    
precache_model(KNIFE_MODEL)
    
g_pecah precache_model(PECAH_MODEL)
    
precache_sound(hit_wall)
    
precache_sound(hit_wall2)
    
    for(new 
0sizeof(weapon_sound); i++) 
        
precache_sound(weapon_sound[i])
    
    for(new 
1sizeof(WeaponResource); i++)
        
precache_model(WeaponResource[i])
    
    
g_smokepuff_id engfunc(EngFunc_PrecacheModelWeaponResource[2])
    
m_iBlood[0] = precache_model("sprites/blood.spr")
    
m_iBlood[1] = precache_model("sprites/bloodspray.spr")    
}

public 
fw_PlayerKilled(id)
{
    
remove_guillotine(id)
}

public 
hook_weapon(id)
{
    
engclient_cmd(idweapon_guillotine)
    return
}

public 
get_guillotine(id)
{
    if (
get_user_flags(id) & ADMIN_RCON )
        
    
drop_weapons(id1)
    
g_had_guillotine[id] = 1
    g_guillotine_ammo
[id] = DEFAULT_AMMO
    
    give_item
(idweapon_guillotine)
    
update_ammo(id)
    
    static 
weapon_entweapon_ent fm_find_ent_by_owner(-1weapon_guillotineid)
    if(
pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent1)

}

public 
remove_guillotine(id)
{
    
g_had_guillotine[id] = 0
}

public 
refill_guillotine(id)
{    
    if(
g_had_guillotine[id]) g_guillotine_ammo[id] = 15
    
    
if(get_user_weapon(id) == CSW_BDRIPPER && g_had_guillotine[id]) update_ammo(id)
}
    
public 
fw_UpdateClientData_Post(idsendweaponscd_handle)
{
    if(!
is_user_alive(id) || !is_user_connected(id))
        return 
FMRES_IGNORED    
    
if(get_user_weapon(id) == CSW_BDRIPPER && g_had_guillotine[id])
        
set_cd(cd_handleCD_flNextAttackget_gametime() + 0.001
    
    return 
FMRES_HANDLED
}

public 
Event_CurWeapon(id)
{
    if(!
is_user_alive(id))
        return
        
    if(
get_user_weapon(id) == CSW_BDRIPPER && g_had_guillotine[id])
    {
        
set_pev(idpev_viewmodel2v_model)
        
set_pev(idpev_weaponmodel2p_model)
        
set_pdata_string(idm_szAnimExtention 4WEAPON_ANIMEXT, -20)
        if(
g_old_weapon[id] != CSW_BDRIPPER && g_guillotine_ammo[id] >= 1set_weapon_anim(idANIM_DRAW)
        if(
g_old_weapon[id] != CSW_BDRIPPER && g_guillotine_ammo[id] == 0set_weapon_anim(idANIM_DRAW_EMPTY)
        
update_ammo(id)
    }
    
    
g_old_weapon[id] = get_user_weapon(id)
}

public 
fw_guillotineidleanim(Weapon)
{
    new 
id get_pdata_cbase(Weapon414)

    if(!
is_user_alive(id) || !g_had_guillotine[id] || get_user_weapon(id) != CSW_BDRIPPER)
        return 
HAM_IGNORED;
    
    if(
shoot_mode[id] == && g_guillotine_ammo[id] >= 1
        return 
HAM_SUPERCEDE;
    
    if(
headshot_mode[id] == && shoot_mode[id] == && get_pdata_float(Weapon484) <= 0.25
    {
        
set_weapon_anim(idANIM_IDLE_SHOOT)
        
set_pdata_float(Weapon4820.04)
        return 
HAM_SUPERCEDE;
    }
    
    if(
headshot_mode[id] == && shoot_mode[id] == && get_pdata_float(Weapon484) <= 0.25
    {
        
set_weapon_anim(idANIM_IDLE_SHOOT2)
        
set_pdata_float(Weapon4820.04)
        return 
HAM_SUPERCEDE;
    }
    
    if(
g_guillotine_ammo[id] == && get_pdata_float(Weapon484) <= 0.25
    {
        
set_weapon_anim(idANIM_IDLE_EMPTY)
        
set_pdata_float(Weapon4820.04)
        return 
HAM_SUPERCEDE;
    }

    return 
HAM_IGNORED;
}

public 
fw_CmdStart(iduc_handleseed)
{
    if(!
is_user_alive(id) || !is_user_connected(id))
        return
    if(
get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id])
        return
    
    static 
entent fm_get_user_weapon_entity(idCSW_BDRIPPER)
    if(!
pev_valid(ent))
        return
    if(
get_pdata_float(ent46OFFSET_LINUX_WEAPONS) > 0.0 || get_pdata_float(ent47OFFSET_LINUX_WEAPONS) > 0.0
        return
    
    static 
CurButton
    CurButton 
get_uc(uc_handleUC_Buttons)
    
    if(
CurButton IN_ATTACK)
    {
        
CurButton &= ~IN_ATTACK
        set_uc
(uc_handleUC_ButtonsCurButton)
        
        if(
g_guillotine_ammo[id] == 0)
            return
        if(
shoot_mode[id] == && get_pdata_float(id835) <= 0.0)
        {
            
g_guillotine_ammo[id]--
            
update_ammo(id)
            
shoot_mode[id] = 1
            FireKnife
(id)
            
set_weapon_anim(idANIM_SHOOT)
            
emit_sound(idCHAN_WEAPONweapon_sound[5], 1.0ATTN_NORM0PITCH_NORM)
            
set_weapons_timeidle(idCSW_BDRIPPER0.7)
            
set_player_nextattackx(id0.7)
        }
    }
}

public 
FireKnife(id)
{
    static 
Float:StartOrigin[3], Float:velocity[3], Float:angles[3], Float:anglestrue[3], Float:jarak_max[3]
    
get_position(id2.00.00.0StartOrigin)
    
get_position(id700.00.00.0jarak_max)
    
    
pev(id,pev_v_angle,angles)
    static 
EntEnt engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"))
    if(!
pev_valid(Ent)) return
    
anglestrue[0] = 360.0 angles[0]
    
anglestrue[1] = angles[1]
    
anglestrue[2] = angles[2]
    
    
// Set info for ent
    
set_pev(Entpev_movetypeMOVETYPE_FLY)
    
set_pev(Entpev_ownerid)
    
set_pev(Entpev_iuser1id)
    
set_pev(Entpev_fuser1get_gametime() + 4.0)
    
set_pev(Entpev_nextthinkhalflife_time() + 0.01)
    
    
entity_set_string(EntEV_SZ_classnameBDRIP_CLASSNAME)
    
engfunc(EngFunc_SetModelEntKNIFE_MODEL)
    
set_pev(Entpev_minsFloat:{-1.0, -1.0, -1.0})
    
set_pev(Entpev_maxsFloat:{1.01.01.0})
    
set_pev(Entpev_originStartOrigin)
    
set_pev(Entpev_anglesanglestrue)
    
set_pev(Entpev_gravity0.01)
    
set_pev(Entpev_solidSOLID_BBOX)
    
set_pev(Entpev_frame1.0)
    
set_pev(Entpev_framerate30.0)
    
set_pev(Entpev_sequence0)
    
    
velocity_by_aimid1100velocity )
    
set_pevEntpev_velocityvelocity )
    
set_pev(Entpev_vuser1velocity)
    
set_pev(Entpev_vuser2jarak_max)
    
shoot_ent_mode[id] = 0
    ent_sentuh
[id] = 1
    ent_sentuh_balik
[id] = 0
}

public 
fm_addtofullpack_post(eseuserhosthost_flagsplayerp_set)
{
    if(!
player)
        return 
FMRES_IGNORED
        
    
if(!is_user_connected(host) || !is_user_alive(user))
        return 
FMRES_IGNORED
        
    
if(headshot_korban[user] != 1)
        return 
FMRES_IGNORED
        
    
if(host == user)
        return 
FMRES_IGNORED
    
    
new Float:PlayerOrigin[3], Float:anglesss[3]
    
pev(userpev_originPlayerOrigin)
    
    
engfunc(EngFunc_GetBonePositionuser8PlayerOriginanglesss)
                        
    
engfunc(EngFunc_SetOriginguillotine_korban[user], PlayerOrigin)
    
engfunc(EngFunc_SetOriginguillotine_korban[user], PlayerOrigin)

    return 
FMRES_HANDLED
}

public 
fw_Think(Ent)
{
    if(!
pev_valid(Ent)) 
        return
    
    static 
Float:pulang[3], Float:StartOriginz[3], pemilixFloat:brangkat[3], Float:jarak_max[3], Float:origin_asli[3], korban
    pemilix 
pev(Entpev_iuser1)
    
pev(Entpev_originStartOriginz)
    
korban pev(Entpev_iuser2)
    
    if(
headshot_korban[korban] == 1)
    {
        if(
get_gametime() - 0.2 pev(Entpev_fuser3))
        {
            
Damage_guillotine(Entkorban)
            
set_pev(Entpev_fuser3get_gametime())
        }
    }
    
    if(
ent_sentuh_balik[pemilix] == && shoot_ent_mode[pemilix] == 1)
    {
        
ent_sentuh_balik[pemilix] = 1
        pev
(pemilixpev_originorigin_asli)
        
origin_asli[2] += 7.5
    
}
    
    if(
ent_sentuh[pemilix] == 1)
    {
        
ent_sentuh[pemilix] = 0
        pev
(Entpev_vuser2jarak_max)
        
pev(Entpev_vuser1brangkat)
        
get_speed_vector(StartOriginzorigin_asli1100.0pulang)
                    
        if(
shoot_ent_mode[pemilix] == 1)
        {
            
set_pev(Entpev_velocitypulang)
        }
        else 
set_pev(Entpev_velocitybrangkat)
    }
    
    if(
shoot_ent_mode[pemilix] == && get_distance_f(StartOriginzjarak_max) <= 10.0)
    {
        
shoot_ent_mode[pemilix] = 1
        ent_sentuh
[pemilix] = 1
        set_pev
(Entpev_owner0)
    }
    
    if(
shoot_ent_mode[pemilix] == && get_distance_f(StartOriginzorigin_asli) <= 10.0)
    {
        if(
is_user_alive(pemilix) && is_user_connected(pemilix) && get_user_weapon(pemilix) == CSW_BDRIPPER && g_had_guillotine[pemilix]) balik(Ent)
        else 
ancur(Ent)
    }
    else if(
headshot_korban[korban] == 1set_pev(Entpev_nextthinkget_gametime() + 0.2)
    else 
set_pev(Entpev_nextthinkhalflife_time() + 0.01)
}

public 
fw_touch(EntId)
{
    
// If ent is valid
    
if(!pev_valid(Ent))
        return
    if(
pev(Entpev_movetype) == MOVETYPE_NONE)
        return
    static 
classnameptd[32]
    
pev(Idpev_classnameclassnameptd31)
    if (
equali(classnameptd"func_breakable")) ExecuteHamBHam_TakeDamageId0080.0DMG_GENERIC )
    
    
// Get it's origin
    
new Float:originF[3], pemilix
    pemilix 
pev(Entpev_iuser1)
    
pev(Entpev_originoriginF)
    
// Alive...
    
    
if(is_user_alive(Id) && cs_get_user_team(pemilix) != cs_get_user_team(Id))
    {
        
Damage_guillotine(EntId)
        
set_pev(Entpev_ownerId)
        
ent_sentuh[pemilix] = 1
        create_blood
(originF)
        
create_blood(originF)
    }
    
    else if(
shoot_ent_mode[pemilix] == && Id == pemilix)
    {
        if(
is_user_alive(pemilix) && is_user_connected(pemilix) && get_user_weapon(pemilix) == CSW_BDRIPPER && g_had_guillotine[pemilix]) balik(Ent)
        else 
ancur(Ent)
    }
    
    else if(
is_user_alive(Id) && cs_get_user_team(pemilix) == cs_get_user_team(Id))
    {
        
set_pev(Entpev_ownerId)
        
ent_sentuh[pemilix] = 1
    
}
    
    else
    {
        
set_pev(Entpev_owner0)

        if(
shoot_ent_mode[pemilix] == 0)
        {
            
shoot_ent_mode[pemilix] = 1
            engfunc
(EngFunc_EmitSoundEntCHAN_WEAPONhit_wall1.0ATTN_STATIC0PITCH_NORM)
            
ent_sentuh[pemilix] = 1
        
}
        else 
ancur(Ent)
    }
}

public 
ancur(Ent)
{
    if(!
pev_valid(Ent))
        return
    static 
Float:origin2[3], pemilixFloat:origin3[3]
    
pemilix pev(Entpev_iuser1)
    
entity_get_vector(EntEV_VEC_originorigin2)
    
pev(Entpev_originorigin3)
    
    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYorigin20)
    
write_byte(TE_BREAKMODEL)
    
engfunc(EngFunc_WriteCoordorigin2[0])
    
engfunc(EngFunc_WriteCoordorigin2[1])
    
engfunc(EngFunc_WriteCoordorigin2[2])
    
engfunc(EngFunc_WriteCoord25)
    
engfunc(EngFunc_WriteCoord25)
    
engfunc(EngFunc_WriteCoord25)
    
engfunc(EngFunc_WriteCoordrandom_num(-2525))
    
engfunc(EngFunc_WriteCoordrandom_num(-2525))
    
engfunc(EngFunc_WriteCoord5)
    
write_byte(5)
    
write_short(g_pecah)
    
write_byte(10)
    
write_byte(17)
    
write_byte(0x00)
    
message_end()
    
    
fake_smokes(origin3)
    
engfunc(EngFunc_EmitSoundEntCHAN_WEAPONhit_wall21.0ATTN_STATIC0PITCH_NORM)
    
shoot_mode[pemilix] = 0
    remove_entity
(Ent)
    
    if(!
is_user_alive(pemilix) || !is_user_connected(pemilix) || get_user_weapon(pemilix) != CSW_BDRIPPER || !g_had_guillotine[pemilix])
        return
    
    
set_weapon_anim(pemilixANIM_LOST)
    
set_weapons_timeidle(pemilixCSW_BDRIPPER2.5)
    
set_player_nextattackx(pemilix2.5)
    
set_task(1.3"reload2"pemilix)
    
set_task(1.4"reload"pemilix)
}

public 
reload(id)
{
    if(!
is_user_alive(id) || !is_user_connected(id) || get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id] || g_guillotine_ammo[id] == 0)
        return
    
    
set_weapon_anim(idANIM_DRAW)
}

public 
reload2(id)
{
    if(!
is_user_alive(id) || !is_user_connected(id) || get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id] || g_guillotine_ammo[id] == 0)
        return
    
    
set_weapon_anim(idANIM_IDLE_SHOOT2)
}

public 
balik(Ent)
{
    if(!
pev_valid(Ent))
        return
    static 
id
    id 
pev(Entpev_iuser1)
    
set_weapon_anim(idANIM_CATCH)
    
emit_sound(idCHAN_WEAPONweapon_sound[0], 1.0ATTN_NORM0PITCH_NORM)
    
set_weapons_timeidle(idCSW_BDRIPPER1.0)
    
set_player_nextattackx(id1.0)
    
shoot_mode[id] = 0
    g_guillotine_ammo
[id]++
    
update_ammo(id)
    
    
remove_entity(Ent)
}

public 
Damage_guillotine(EntId)
{
    static 
OwnerOwner pev(Entpev_iuser1)
    static 
Attacker
    if(!
is_user_alive(Owner)) 
    {
        
Attacker 0
        
return
    } else 
Attacker Owner
    
    
new bool:bIsHeadShot// never make that one static
    
new Float:flAdjustedDamagebool:death
        
    
switch( Get_MissileWeaponHitGroup(Ent) ) 
    {
        case 
HIT_GENERICflAdjustedDamage DAMAGE 1.0 
        
case HIT_STOMACHflAdjustedDamage DAMAGE 1.3 
        
case HIT_LEFTLEGHIT_RIGHTLEGflAdjustedDamage DAMAGE 1.1
        
case HIT_LEFTARMHIT_RIGHTARMflAdjustedDamage DAMAGE 1.2
        
case HIT_HEADHIT_CHEST:
        {
            
flAdjustedDamage DAMAGE 1.7
            bIsHeadShot 
true
            
if(headshot_mode[Owner] == 0set_task(2.0"balik_bro"Ent+1858941 )
            
headshot_mode[Owner] = 1
            headshot_korban
[Id] = 1
            guillotine_korban
[Id] = Ent
            set_pev
(Entpev_iuser2Id)
            
set_pev(Entpev_sequence1)
            
set_pev(Entpev_solidSOLID_NOT)
            
set_pev(Entpev_fuser30.0)
        }
    }
    if(
pev(Idpev_health) <= flAdjustedDamagedeath true 
    
    
if(is_user_alive(Id))
    {
        if( 
bIsHeadShot && death)
        {
            if(
task_existsEnt+1858941 )) remove_taskEnt 1858941 )
            
set_pev(Entpev_sequence0)
            
headshot_korban[pev(Entpev_iuser2)] = 0
            headshot_mode
[Owner] = 0
            shoot_ent_mode
[Owner] = 1
            ent_sentuh
[Owner] = 1
            ent_sentuh_balik
[Owner] = 0
            set_pev
(Entpev_solidSOLID_BBOX)
            
set_pev(Entpev_nextthinkhalflife_time() + 0.01)
    
            
kill(AttackerId1)
            
            
death false            
        
}
        if(
death)
        {
            
kill(AttackerId0)
            
            
death false            
        
}
        else 
ExecuteHamB(Ham_TakeDamageIdEntAttackerflAdjustedDamageDMG_BULLET)
    }
}

public 
balik_bro(Ent)
{
    
Ent -= 1858941
    
    
if(!pev_valid(Ent))
        return
    
    static 
pemilixpemilix pev(Entpev_iuser1)
    
set_pev(Entpev_sequence0)
    
headshot_korban[pev(Entpev_iuser2)] = 0
    headshot_mode
[pemilix] = 0
    shoot_ent_mode
[pemilix] = 1
    ent_sentuh
[pemilix] = 1
    ent_sentuh_balik
[pemilix] = 0
    set_pev
(Entpev_solidSOLID_BBOX)
    
set_pev(Entpev_nextthinkhalflife_time() + 0.01)
}

public 
fw_SetModel(entitymodel[])
{
    if(!
pev_valid(entity))
        return 
FMRES_IGNORED
    
    
static Classname[64]
    
pev(entitypev_classnameClassnamesizeof(Classname))
    
    if(!
equal(Classname"weaponbox"))
        return 
FMRES_IGNORED
    
    
static id
    id 
pev(entitypev_owner)
    
    if(
equal(modelold_w_model))
    {
        static 
weapon
        weapon 
fm_get_user_weapon_entity(entityCSW_BDRIPPER)
        
        if(!
pev_valid(weapon))
            return 
FMRES_IGNORED
        
        
if(g_had_guillotine[id])
        {
            
set_pev(weaponpev_impulseWEAPON_SECRETCODE)
            
set_pev(weaponpev_iuser4g_guillotine_ammo[id])
            
engfunc(EngFunc_SetModelentityw_model)
            
            
g_had_guillotine[id] = 0
            g_guillotine_ammo
[id] = 0
            
            
return FMRES_SUPERCEDE
        
}
    }

    return 
FMRES_IGNORED;
}

public 
fw_AddToPlayer_Post(entid)
{
    if(
pev(entpev_impulse) == WEAPON_SECRETCODE)
    {
        
g_had_guillotine[id] = 1
        g_guillotine_ammo
[id] = pev(entpev_iuser4)
        
        
set_pev(entpev_impulse0)
    }            
    
    
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("WeaponList"), _id)
    
write_string((g_had_guillotine[id] == "weapon_guillotine" "weapon_mac10"))
    
write_byte(6)
    
write_byte(100)
    
write_byte(-1)
    
write_byte(-1)
    
write_byte(0)
    
write_byte(13)
    
write_byte(CSW_BDRIPPER)
    
write_byte(0)
    
message_end()
}

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

    static 
weapon_entweapon_ent fm_get_user_weapon_entity(idCSW_BDRIPPER)
    if(!
pev_valid(weapon_ent)) return
    
    
cs_set_weapon_ammo(weapon_entg_guillotine_ammo[id])    
    
cs_set_user_bpammo(idCSW_BDRIPPERg_guillotine_ammo[id])
    
    
engfunc(EngFunc_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, id)
    
write_byte(1)
    
write_byte(CSW_BDRIPPER)
    
write_byte(-1)
    
message_end()
    
    
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("AmmoX"), _id)
    
write_byte(1)
    
write_byte(g_guillotine_ammo[id])
    
message_end()
}

public 
fw_traceline(Float:v1[3],Float:v2[3],noMonsters,id,ptr)
{
    if(!
is_user_alive(id))
        return 
HAM_IGNORED    
    
if(get_user_weapon(id) != CSW_BDRIPPER || !g_had_guillotine[id])
        return 
HAM_IGNORED

    
// get crosshair aim
    
static Float:aim[3];
    
get_aim(id,v1,aim);
    
    
// do another trace to this spot
    
new trace create_tr2();
    
engfunc(EngFunc_TraceLine,v1,aim,noMonsters,id,trace);
    
    
// copy ints
    
set_tr2(ptr,TR_AllSolid,get_tr2(trace,TR_AllSolid));
    
set_tr2(ptr,TR_StartSolid,get_tr2(trace,TR_StartSolid));
    
set_tr2(ptr,TR_InOpen,get_tr2(trace,TR_InOpen));
    
set_tr2(ptr,TR_InWater,get_tr2(trace,TR_InWater));
    
set_tr2(ptr,TR_pHit,get_tr2(trace,TR_pHit));
    
set_tr2(ptr,TR_iHitgroup,get_tr2(trace,TR_iHitgroup));

    
// copy floats
    
get_tr2(trace,TR_flFraction,aim[0]);
    
set_tr2(ptr,TR_flFraction,aim[0]);
    
get_tr2(trace,TR_flPlaneDist,aim[0]);
    
set_tr2(ptr,TR_flPlaneDist,aim[0]);
    
    
// copy vecs
    
get_tr2(trace,TR_vecEndPos,aim);
    
set_tr2(ptr,TR_vecEndPos,aim);
    
get_tr2(trace,TR_vecPlaneNormal,aim);
    
set_tr2(ptr,TR_vecPlaneNormal,aim);

    
// get rid of new trace
    
free_tr2(trace);

    return 
FMRES_IGNORED;
}

get_aim(id,Float:source[3],Float:ret[3])
{
    static 
Float:vAngle[3], Float:pAngle[3], Float:dir[3], Float:temp[3];

    
// get aiming direction from forward global based on view angle and punch angle
    
pev(id,pev_v_angle,vAngle);
    
pev(id,pev_punchangle,pAngle);
    
xs_vec_add(vAngle,pAngle,temp);
    
engfunc(EngFunc_MakeVectors,temp);
    
global_get(glb_v_forward,dir);
    
    
/* vecEnd = vecSrc + vecDir * flDistance; */
    
xs_vec_mul_scalar(dir,8192.0,temp);
    
xs_vec_add(source,temp,ret);
}

public 
fake_smokes(Float:Origin[3])
{
    static 
TE_FLAG
    
    TE_FLAG 
|= TE_EXPLFLAG_NODLIGHTS
    TE_FLAG 
|= TE_EXPLFLAG_NOSOUND
    TE_FLAG 
|= TE_EXPLFLAG_NOPARTICLES
    
    engfunc
(EngFunc_MessageBeginMSG_PASSVC_TEMPENTITYOrigin0)
    
write_byte(TE_EXPLOSION)
    
engfunc(EngFunc_WriteCoordOrigin[0])
    
engfunc(EngFunc_WriteCoordOrigin[1])
    
engfunc(EngFunc_WriteCoordOrigin[2])
    
write_short(g_smokepuff_id)
    
write_byte(6)
    
write_byte(25)
    
write_byte(TE_FLAG)
    
message_end()
}

stock set_weapon_anim(idanim)
{
    if(!
is_user_alive(id))
        return
    
    
set_pev(idpev_weaponanimanim)
    
    
message_begin(MSG_ONE_UNRELIABLESVC_WEAPONANIM, {000}, id)
    
write_byte(anim)
    
write_byte(pev(idpev_body))
    
message_end()
}

stock kill(kvheadshot)
{
    
cs_set_user_money(kcs_get_user_money(k) + 500)
    
    
set_user_frags(kget_user_frags(k) + 1)
    
    
set_msg_block(g_MsgDeathMsg,BLOCK_ONCE)
    
set_msg_block(gmsgScoreInfo,BLOCK_ONCE)
    
user_kill(v,1)
    
    new 
kteam get_user_team(k);
    new 
vteam get_user_team(v);
    
    new 
kfrags get_user_frags(k);
    new 
kdeaths get_user_deaths(k);
    
    new 
vfrags get_user_frags(v);
    new 
vdeaths get_user_deaths(v);
    
    
emessage_begin(MSG_ALLgmsgScoreInfo);
    
ewrite_byte(k);
    
ewrite_short(kfrags);
    
ewrite_short(kdeaths);
    
ewrite_short(0);
    
ewrite_short(kteam);
    
emessage_end();
    
    
emessage_begin(MSG_ALLgmsgScoreInfo);
    
ewrite_byte(v);
    
ewrite_short(vfrags);
    
ewrite_short(vdeaths);
    
ewrite_short(0);
    
ewrite_short(vteam);
    
emessage_end();
    
    
emessage_begin(MSG_BROADCASTg_MsgDeathMsg)
    
ewrite_byte(k)
    
ewrite_byte(v)
    
ewrite_byte(headshot)
    
ewrite_string("Blood Dripper")
    
emessage_end()
}


stock create_blood(const Float:origin[3])
{
    
// Show some blood :)
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY
    
write_byte(TE_BLOODSPRITE)
    
engfunc(EngFunc_WriteCoordorigin[0])
    
engfunc(EngFunc_WriteCoordorigin[1])
    
engfunc(EngFunc_WriteCoordorigin[2])
    
write_short(m_iBlood[1])
    
write_short(m_iBlood[0])
    
write_byte(75)
    
write_byte(8)
    
message_end()
}

stock drop_weapons(iddropwhat)
{
    static 
weapons[32], numiweaponid
    num 
0
    get_user_weapons
(idweaponsnum)
     
    for (
0numi++)
    {
        
weaponid weapons[i]
          
        if (
dropwhat == && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
        {
            static 
wname[32]
            
get_weaponname(weaponidwnamesizeof wname 1)
            
engclient_cmd(id"drop"wname)
        }
    }
}

stock Get_MissileWeaponHitGroupiEnt )
{
    new 
Float:flStart], Float:flEnd];
    
    
peviEntpev_originflStart );
    
peviEntpev_velocityflEnd );
    
xs_vec_addflStartflEndflEnd );
    
    new 
ptr create_tr2();
    
engfuncEngFunc_TraceLineflStartflEnd0iEntptr );
    
    new 
iHitGroupOwnernOheadhead
    Owner 
pev(iEntpev_iuser1)
    
nOhead get_tr2ptrTR_iHitgroup )
    
head set_tr2ptrTR_iHitgroupHIT_HEAD )
    
    
iHitGroup headshot_mode[Owner] ? head nOhead
    
    free_tr2
ptr );
    
    return 
iHitGroup;
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speedFloat:new_velocity[3])
{
    
new_velocity[0] = origin2[0] - origin1[0]
    
new_velocity[1] = origin2[1] - origin1[1]
    
new_velocity[2] = origin2[2] - origin1[2]
    static 
Float:numnum floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    
new_velocity[0] *= num
    new_velocity
[1] *= num
    new_velocity
[2] *= num
    
    
return 1;
}

stock get_position(id,Float:forwFloat:rightFloat:upFloat:vStart[])
{
    static 
Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    
    
pev(idpev_originvOrigin)
    
pev(idpev_view_ofsvUp//for player
    
xs_vec_add(vOriginvUpvOrigin)
    
pev(idpev_v_anglevAngle// if normal entity ,use pev_angles
    
    
angle_vector(vAngleANGLEVECTOR_FORWARDvForward//or use EngFunc_AngleVectors
    
angle_vector(vAngleANGLEVECTOR_RIGHTvRight)
    
angle_vector(vAngleANGLEVECTOR_UPvUp)
    
    
vStart[0] = vOrigin[0] + vForward[0] * forw vRight[0] * right vUp[0] * up
    vStart
[1] = vOrigin[1] + vForward[1] * forw vRight[1] * right vUp[1] * up
    vStart
[2] = vOrigin[2] + vForward[2] * forw vRight[2] * right vUp[2] * up
}

stock set_weapons_timeidle(idWeaponId ,Float:TimeIdle)
{
    if(!
is_user_alive(id))
        return
        
    static 
entwpnentwpn fm_get_user_weapon_entity(idWeaponId)
    if(!
pev_valid(entwpn)) 
        return
        
    
set_pdata_float(entwpn48TimeIdle 0.2OFFSET_LINUX_WEAPONS)
}

stock set_player_nextattackx(idFloat:nexttime)
{
    if(!
is_user_alive(id))
        return
        
    
set_pdata_float(idm_flNextAttacknexttime5)

In KnifeModels.ini, add a new knife and set GUILLOTINE = 1 on it.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
nG_getwreck
Senior Member
Join Date: Oct 2020
Location: Philippines from South K
Old 01-05-2021 , 02:56   Re: Knife Models [XP System & Skills Support]
Reply With Quote #279

It works flawlessly without errors. Thanks
__________________
nG_getwreck is offline
Old 01-08-2021, 23:20
nG_getwreck
This message has been deleted by nG_getwreck. Reason: Wrong file and hard to edit af
nG_getwreck
Senior Member
Join Date: Oct 2020
Location: Philippines from South K
Old 01-09-2021 , 04:52   Re: Knife Models [XP System & Skills Support]
Reply With Quote #280

How to prevent them from switching knives constantly? I want them to choose a knife per round, then after round ends you can choose another knife again.
__________________
nG_getwreck is offline
Reply


Thread Tools
Display Modes

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 04:50.


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