Available Ultimate VIP Features

Unpaid Requests, Public Plugins
User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#21

Post by Spir0x » 4 years ago

Thanks

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#22

Post by Spir0x » 4 years ago

guys help me there, the plugin seems like not working. when i press 1. knife menu or 2. Guns menu nothing happen like i didn't press it. can anyone know what's the problem ?

Image

User avatar
sPe3doN
Senior Member
Senior Member
Algeria
Posts: 258
Joined: 7 years ago
Contact:

#23

Post by sPe3doN » 4 years ago

Spir0x wrote: 4 years ago guys help me there, the plugin seems like not working. when i press 1. knife menu or 2. Guns menu nothing happen like i didn't press it. can anyone know what's the problem ?

Image
Can you post you'r code's ?
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#24

Post by Spir0x » 4 years ago

Man all my codes are already posted on this topic go check previous pages. what you want exactly ?

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

#25

Post by Night Fury » 4 years ago

There must be an errors.
Give all errors.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#26

Post by Spir0x » 4 years ago

no errors is appearing bro. just the plugin is not working correctly i think something from the code of vip menu

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#27

Post by Spir0x » 4 years ago

Mark it as plugin available and anyone can edit it as he want.

ngamerz
Member
Member
Philippines
Posts: 37
Joined: 3 years ago
Location: Philippines From South Korea

#28

Post by ngamerz » 3 years ago

Is this thread still active?

Please help me! I want to make the menu like this.

VIP Menu
1. Guns
2. Knife Menu

> Guns
1. Salamander
2. Laser Minigun
3. Auto Minigun
4. Stun Rifle
5. Bazooka
6. [ Just give a blank code, i'll edit it ]

> Codes
Salamander:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
#include <amxconst>
#include <fakemeta>
#include <fakemeta_util>
#include <cstrike>
#include <xs>
#include <engine>
#include <fun>

#define PLUGIN "[CSO] Salamander"
#define VERSION "2015"
#define AUTHOR "Dias Pendragon Leon"

#define CSW_SAL CSW_M249
#define weapon_sal "weapon_m249"

#define DAMAGE 38
#define FIRE_SPEED 640.0
#define RECOIL 0.0

#define MODEL_V "models/v_salamander.mdl"
#define MODEL_P "models/p_salamander.mdl"
#define MODEL_W "models/w_salamander.mdl"
#define DEFAULT_W_MODEL "models/w_m249.mdl"

new const WeaponSounds[6][] =
{
	"weapons/flamegun-1.wav",
	"weapons/flamegun_draw.wav",
	"weapons/flamegun_clipin1.wav",
	"weapons/flamegun_clipin2.wav",
	"weapons/flamegun_clipout1.wav",
	"weapons/flamegun_clipout2.wav"
}

new const WeaponResources[7][] = 
{
	"sprites/flame_puff01.spr",
	"sprites/flame_burn01.spr",
	"sprites/weapon_flamethrower.txt",
	"sprites/640hud7_2.spr",
	"sprites/640hud59_2.spr",
	"sprites/640hud60_2.spr",
	"sprites/smokepuff.spr"
}

enum
{
	ANIM_IDLE = 0,
	ANIM_SHOOT,
	ANIM_SHOOT_END,
	ANIM_RELOAD,
	ANIM_DRAW
}

// Marcros
#define Get_BitVar(%1,%2)		(%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2)		(%1 |= (1 << (%2 & 31)));
#define UnSet_BitVar(%1,%2)		(%1 &= ~(1 << (%2 & 31)));

// Vars
new g_Had_Salamander, g_WeaponEnt, g_SmokePuff_SprID, Float:g_PunchAngles[33]
new g_MsgCurWeapon, g_MsgWeaponList

// Safety
new g_HamBot
new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
new g_iItemId

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	// Your highness!
	Register_SafetyFunc()
	
	// Forward
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
	register_forward(FM_CmdStart, "fw_CmdStart")
	register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
	
	// Engine
	register_think("fireinsaigon", "fw_Fire_Think")
	register_touch("fireinsaigon", "*", "fw_Fire_Touch")
	
	// Hams
	RegisterHam(Ham_Item_Deploy, weapon_sal, "fw_Item_Deploy_Post", 1)	
	RegisterHam(Ham_Item_AddToPlayer, weapon_sal, "fw_Item_AddToPlayer_Post", 1)
	
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack_Post", 1)
	
	g_MsgCurWeapon = get_user_msgid("CurWeapon")
	g_MsgWeaponList = get_user_msgid("WeaponList")
	
//	register_clcmd("say /get", "Get_Salamander")
	register_clcmd("weapon_flamethrower", "Hook_Weapon")
	
	g_iItemId = ze_register_item("CSO Salamander", 100, 0)
	ze_set_item_vip(g_iItemId, "VIP_A")
}

public plugin_precache()
{
	precache_model(MODEL_V)
	precache_model(MODEL_P)
	precache_model(MODEL_W)
	
	for(new i = 0; i < sizeof(WeaponSounds); i++)
		precache_sound(WeaponSounds[i])
	for(new i = 0; i < sizeof(WeaponResources); i++)
	{
		if(i == 2) precache_generic(WeaponResources[i])
		else if(i == 6) g_SmokePuff_SprID = precache_model(WeaponResources[i])
		else precache_model(WeaponResources[i])
	}
}

public fw_PrecacheEvent_Post(type, const name[])
{
	if(equal("events/m249.sc", name))
		g_WeaponEnt = get_orig_retval()
}

public client_putinserver(id)
{
	Safety_Connected(id)
	if(!g_HamBot && is_user_bot(id))
	{
		g_HamBot = 1
		set_task(0.1, "Register_HamBot", id)
	}
}

public Register_HamBot(id) 
{
	Register_SafetyFuncBot(id)
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
}

public client_disconnected(id)
{
	Safety_Disconnected(id)
}

public Hook_Weapon(id)
{
	engclient_cmd(id, weapon_sal)
	return PLUGIN_HANDLED
}

public Get_Salamander(id)
{
	Set_BitVar(g_Had_Salamander, id)
	give_item(id, weapon_sal)
	
	message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
	write_byte(1)
	write_byte(CSW_SAL)
	write_byte(100)
	message_end()
	
	cs_set_user_bpammo(id, CSW_SAL, 200)
}

public Remove_Salamander(id)
{
	UnSet_BitVar(g_Had_Salamander, id)
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
	if(!is_alive(id))
		return FMRES_IGNORED
	if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
		return FMRES_IGNORED
	
	set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 
	
	return FMRES_HANDLED
}

public fw_SetModel(entity, model[])
{
	if(!pev_valid(entity))
		return FMRES_IGNORED
	
	static szClassName[33]
	pev(entity, pev_classname, szClassName, charsmax(szClassName))
	
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED
	
	static id
	id = pev(entity, pev_owner)
	
	if(equal(model, DEFAULT_W_MODEL))
	{
		static weapon; weapon = fm_find_ent_by_owner(-1, weapon_sal, entity)
		
		if(!pev_valid(weapon))
			return FMRES_IGNORED
		
		if(Get_BitVar(g_Had_Salamander, id))
		{
			set_pev(weapon, pev_impulse, 442015)
			engfunc(EngFunc_SetModel, entity, MODEL_W)
			
			UnSet_BitVar(g_Had_Salamander, id)
			
			return FMRES_SUPERCEDE
		}
	}

	return FMRES_IGNORED
}

public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if(!is_alive(invoker))
		return FMRES_IGNORED
	if(get_player_weapon(invoker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, invoker))
		return FMRES_IGNORED	
	if(eventid == g_WeaponEnt)
	{
		playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)	
		if(pev(invoker, pev_weaponanim) != ANIM_SHOOT) Set_WeaponAnim(invoker, ANIM_SHOOT)
		
		return FMRES_SUPERCEDE
	}
	
	return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_alive(id))
		return FMRES_IGNORED
	if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
		return FMRES_IGNORED
		
	static PressedButton
	PressedButton = get_uc(uc_handle, UC_Buttons)
	
	if(!(PressedButton & IN_ATTACK))
	{
		if((pev(id, pev_oldbuttons) & IN_ATTACK) && pev(id, pev_weaponanim) == ANIM_SHOOT)
		{
			static weapon; weapon = fm_get_user_weapon_entity(id, CSW_SAL)
			if(pev_valid(weapon)) set_pdata_float(weapon, 48, 2.0, 4)
			
			Set_WeaponAnim(id, ANIM_SHOOT_END)
			Make_FireSmoke(id)
		}
	}
		
	return FMRES_HANDLED
}

public Make_FireSmoke(id)
{
	static Float:Origin[3]
	get_position(id, 40.0, 5.0, -15.0, Origin)
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
	write_byte(TE_EXPLOSION) 
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_SmokePuff_SprID) 
	write_byte(5)
	write_byte(30)
	write_byte(14)
	message_end()
}

public fw_Item_Deploy_Post(Ent)
{
	if(pev_valid(Ent) != 2)
		return
	static Id; Id = get_pdata_cbase(Ent, 41, 4)
	if(get_pdata_cbase(Id, 373) != Ent)
		return
	if(!Get_BitVar(g_Had_Salamander, Id))
		return
	
	set_pev(Id, pev_viewmodel2, MODEL_V)
	set_pev(Id, pev_weaponmodel2, MODEL_P)
}

public fw_Item_AddToPlayer_Post(Ent, id)
{
	if(!pev_valid(Ent))
		return HAM_IGNORED
		
	if(pev(Ent, pev_impulse) == 442015)
	{
		Set_BitVar(g_Had_Salamander, id)
		set_pev(Ent, pev_impulse, 0)
	}
	
	if(Get_BitVar(g_Had_Salamander, id))
	{
		message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, id)
		write_string("weapon_flamethrower")
		write_byte(3)
		write_byte(200)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(4)
		write_byte(CSW_SAL)
		write_byte(0)
		message_end()	
	}
	
	return HAM_HANDLED	
}

public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
{
	if(!is_alive(Attacker))
		return HAM_IGNORED
	if(get_player_weapon(Attacker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, Attacker))
		return HAM_IGNORED
	
	return HAM_SUPERCEDE
}

public CreateFire(id, Float:Speed)
{
	new iEnt = create_entity("env_sprite")
	if(!pev_valid(iEnt)) return
	
	static Float:vfAngle[3], Float:MyOrigin[3]
	static Float:Origin[3], Float:TargetOrigin[3], Float:Velocity[3]

	get_position(id, 40.0, 5.0, -5.0, Origin)
	get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
	
	pev(id, pev_angles, vfAngle)
	pev(id, pev_origin, MyOrigin)
	
	vfAngle[2] = float(random(18) * 20)

	// set info for ent
	set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
	set_pev(iEnt, pev_rendermode, kRenderTransAdd)
	set_pev(iEnt, pev_renderamt, 160.0)
	set_pev(iEnt, pev_fuser1, get_gametime() + 1.0)	// time remove
	set_pev(iEnt, pev_scale, 0.25)
	set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
	
	entity_set_string(iEnt, EV_SZ_classname, "fireinsaigon")
	engfunc(EngFunc_SetModel, iEnt, WeaponResources[0])
	set_pev(iEnt, pev_mins, Float:{-1.0, -1.0, -1.0})
	set_pev(iEnt, pev_maxs, Float:{1.0, 1.0, 1.0})
	set_pev(iEnt, pev_origin, Origin)
	set_pev(iEnt, pev_gravity, 0.01)
	set_pev(iEnt, pev_angles, vfAngle)
	set_pev(iEnt, pev_solid, SOLID_TRIGGER)
	set_pev(iEnt, pev_owner, id)	
	set_pev(iEnt, pev_frame, 0.0)
	set_pev(iEnt, pev_iuser2, get_user_team(id))

	get_speed_vector(Origin, TargetOrigin, Speed, Velocity)
	set_pev(iEnt, pev_velocity, Velocity)
	
	emit_sound(iEnt, CHAN_BODY, WeaponSounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)	
}

public fw_Fire_Think(iEnt)
{
	if(!pev_valid(iEnt)) 
		return
	
	static Float:fFrame, Float:fScale
	pev(iEnt, pev_frame, fFrame)
	pev(iEnt, pev_scale, fScale)

	// effect exp
	if(pev(iEnt, pev_movetype) == MOVETYPE_NONE)
	{
		fFrame += 1.0
		fScale += 0.1
		fScale = floatmin(fScale, 1.75)

		if(fFrame > 21.0)
		{
			engfunc(EngFunc_RemoveEntity, iEnt)
			return
		}
		
		set_pev(iEnt, pev_nextthink, get_gametime() + 0.025)
	} else {
		fFrame += 1.25
		fFrame = floatmin(21.0, fFrame)
		fScale += 0.15
		fScale = floatmin(fScale, 1.75)
		
		set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
	}

	set_pev(iEnt, pev_frame, fFrame)
	set_pev(iEnt, pev_scale, fScale)
	
	// time remove
	static Float:fTimeRemove
	pev(iEnt, pev_fuser1, fTimeRemove)
	if (get_gametime() >= fTimeRemove)
	{
		engfunc(EngFunc_RemoveEntity, iEnt)
		return;
	}
}

public fw_Fire_Touch(ent, id)
{
	if(!pev_valid(ent))
		return
		
	if(pev_valid(id))
	{
		static Classname[32]
		pev(id, pev_classname, Classname, sizeof(Classname))
		
		if(equal(Classname, "fireinsaigon")) return
		else if(is_alive(id)) 
		{
			static EntTeam; EntTeam = pev(ent, pev_iuser2)
			if(get_user_team(id) != EntTeam)
			{
				static Attacker; Attacker = pev(ent, pev_owner)
				if(is_connected(Attacker))
				{
					ExecuteHamB(Ham_TakeDamage, id, 0, Attacker, float(DAMAGE), DMG_BULLET)
				}
			}
		}
	}
		
	set_pev(ent, pev_movetype, MOVETYPE_NONE)
	set_pev(ent, pev_solid, SOLID_NOT)
}

public ze_select_item_pre(id, itemid)
{
	// If it is not the gun the player is willing to buy then just make it available.
	// g_iItemId is the handler you made it before.
	// You can name itemid whatever you like but just not the same handler name.
	
	if (itemid != g_iItemId)
		return ZE_ITEM_AVAILABLE
		
	// In this item we are working on, it will be for humans only so we need to hide it for zombies so they do not get it.
	//If you want it to be for zombies, you need to add the not operator "!" before the native so it's gonna be like this:
	// if (!ze_is_user_zombie(id))
	// If you want an item to be for zombies & humans then just don't add the next code.
	
	if (ze_is_user_zombie(id))
		return ZE_ITEM_DONT_SHOW
		
	// Here we need to return a value so you don't get a warning on compiling.
	return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(id, itemid)
{
	// Here we just block buying the gun if it is not the gun the player is willing to buy so we just add return without values.
	if (itemid != g_iItemId)
		return
		
	// Here you can give the item & you can even add a message to notice the player what he bought for example like this:
	ze_colored_print(id, "You have successfully bought the item.")
	
	// Do you remember in public plugin_init(), we found something like this in it:
	// register_clcmd("say /get", "Get_MyWeapon")
	// That line is to allow you to get the gun for free when you type that command.
	// Well, we don't care about it, we care about:
	// Get_MyWeapon
	// This is the function we will use to give the weapon to the player
	// It's like this:
	Get_Salamander(id)
}

public fw_Weapon_PrimaryAttack(ent)
{
	static id; id = pev(ent, pev_owner)
	pev(id, pev_punchangle, g_PunchAngles[id])
	
	return HAM_IGNORED	
}

public fw_Weapon_PrimaryAttack_Post(ent)
{
	static id; id = pev(ent, pev_owner)

	if(get_player_weapon(id) == CSW_SAL && Get_BitVar(g_Had_Salamander, id) && cs_get_weapon_ammo(ent) > 0)
	{
		static Float:push[3]
		pev(id, pev_punchangle, push)
		xs_vec_sub(push, g_PunchAngles[id], push)
		
		xs_vec_mul_scalar(push, RECOIL, push)
		xs_vec_add(push, g_PunchAngles[id], push)
		set_pev(id, pev_punchangle, push)
		
		CreateFire(id, FIRE_SPEED)
	} else {
		static Float:push[3]
		pev(id, pev_punchangle, push)
		xs_vec_sub(push, g_PunchAngles[id], push)
		
		xs_vec_mul_scalar(push, 0.0, push)
		xs_vec_add(push, g_PunchAngles[id], push)
		set_pev(id, pev_punchangle, push)
	}
	
	return HAM_IGNORED	
}

stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
{
	static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
	if(!pev_valid(entwpn)) 
		return
		
	set_pdata_float(entwpn, 46, TimeIdle, 4)
	set_pdata_float(entwpn, 47, TimeIdle, 4)
	set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
}

stock Set_PlayerNextAttack(id, Float:nexttime)
{
	set_pdata_float(id, 83, nexttime, 5)
}

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

stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
	new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
	
	pev(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 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]
	new Float: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_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
{ 
	static Float:vfEnd[3], viEnd[3] 
	get_user_origin(id, viEnd, 3)  
	IVecFVec(viEnd, vfEnd) 
	
	static Float:fOrigin[3], Float:fAngle[3]
	
	pev(id, pev_origin, fOrigin) 
	pev(id, pev_view_ofs, fAngle)
	
	xs_vec_add(fOrigin, fAngle, fOrigin) 
	
	static Float:fAttack[3]
	
	xs_vec_sub(vfEnd, fOrigin, fAttack)
	xs_vec_sub(vfEnd, fOrigin, fAttack) 
	
	static Float:fRate
	
	fRate = fDis / vector_length(fAttack)
	xs_vec_mul_scalar(fAttack, fRate, fAttack)
	
	xs_vec_add(fOrigin, fAttack, output)
}

/* ===============================
------------- SAFETY -------------
=================================*/
public Register_SafetyFunc()
{
	register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
	
	RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
	RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
}

public Register_SafetyFuncBot(id)
{
	RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
	RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
}

public Safety_Connected(id)
{
	Set_BitVar(g_IsConnected, id)
	UnSet_BitVar(g_IsAlive, id)
	
	g_PlayerWeapon[id] = 0
}

public Safety_Disconnected(id)
{
	UnSet_BitVar(g_IsConnected, id)
	UnSet_BitVar(g_IsAlive, id)
	
	g_PlayerWeapon[id] = 0
}

public Safety_CurWeapon(id)
{
	if(!is_alive(id))
		return
		
	static CSW; CSW = read_data(2)
	if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
}

public fw_Safety_Spawn_Post(id)
{
	if(!is_user_alive(id))
		return
		
	Set_BitVar(g_IsAlive, id)
}

public fw_Safety_Killed_Post(id)
{
	UnSet_BitVar(g_IsAlive, id)
}

public is_connected(id)
{
	if(!(1 <= id <= 32))
		return 0
	if(!Get_BitVar(g_IsConnected, id))
		return 0

	return 1
}

public is_alive(id)
{
	if(!is_connected(id))
		return 0
	if(!Get_BitVar(g_IsAlive, id))
		return 0
		
	return 1
}

public get_player_weapon(id)
{
	if(!is_alive(id))
		return 0
	
	return g_PlayerWeapon[id]
}


// ===================== STOCK... =======================
// ======================================================
Stun Rifle:

Code: Select all

/*
*	Stun Rifle is a CSO weapon, More information about it: http://cso.wikia.com/wiki/Stun_Rifle
*	
*	This plugin written by me: Raheem (The basic things for any weapon not written by me)
*
*	I tried to simulate it same as in CSO, I think it's nearly same else simple things
*	That will be done in next versions.
*
*	Version 1.0 creation date: 16-6-2018
*	Version 1.0 publication date: 20-6-2018
*
*	Last update: 4-8-2018
*
*	TODO List: Fix any problem, include good ideas
*/

#include <zombie_escape>
#include <fakemeta_util>

#define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)

// CWeaponBox
#define m_rgpPlayerItems_CWeaponBox 34

// CBasePlayerItem
#define m_pPlayer 41
#define m_pNext 42
#define m_iId 43

// CBasePlayerWeapon
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_flTimeWeaponIdle 48
#define m_iPrimaryAmmoType 49
#define m_iClip 51
#define m_fInReload 54
#define m_iWeaponState 74

// CBaseMonster
#define m_flNextAttack 83

// CBasePlayer
#define m_iFOV 363
#define m_rpgPlayerItems 367
#define m_pActiveItem 373
#define m_rgAmmo 376

/*-----------------------------------------------------*/

#define WEAPON_KEY 776544229
#define WEAPON_OLD "weapon_ak47"
#define WEAPON_NEW "weapon_stunrifle"

/*-----------------------------------------------------*/

new const WPN_SPRITES[][] =
{
	"sprites/weapon_stunrifle.txt",
	"sprites/640hud169.spr",
	"sprites/640hud7.spr"
}

new const g_szSounds[][] =
{
	"weapons/stunrifle-1.wav",
	"weapons/stunrifle_drawa.wav",
	"weapons/stunrifle_drawb.wav",
	"weapons/stunrifle_drawc.wav",
	"weapons/stunrifle_reloada.wav",
	"weapons/stunrifle_reloadb.wav",
	"weapons/stunrifle_reloadc.wav",
	"weapons/stunrifle_idlea.wav",
	"weapons/stunrifle_idleb.wav",
	"weapons/stunrifle_idlec.wav",
	"weapons/stunrifle_lowbattery.wav",
	"weapons/stunrifle-2.wav"
}

new const iWeaponList[] =
{  
	2, 30, -1, -1, 0, 1, CSW_AK47, 0
}

#define WEAPON_MODEL_V "models/stunrifle/v_stunrifle.mdl"
#define WEAPON_MODEL_P "models/stunrifle/p_stunrifle.mdl"
#define WEAPON_MODEL_W "models/stunrifle/w_stunrifle.mdl"
#define WEAPON_BODY 0

/*-----------------------------------------------------*/

#define WEAPON_COST 0

#define WEAPON_CLIP 30
#define WEAPON_AMMO 90
#define WEAPON_RATE 0.098
#define WEAPON_RECOIL 0.96
#define WEAPON_DAMAGE 1.0 // AK47 damage multiplied by this factor

#define WEAPON_RATE_EX 0.169
#define WEAPON_RECOIL_EX 0.79
#define WEAPON_DAMAGE_EX 1.3
#define WEAPON_NATIVE "native_give_weapon_stunrifle"

/*-----------------------------------------------------*/

// Animations
#define ANIM_IDLE_A 0
#define ANIM_IDLE_B 1
#define ANIM_IDLE_C 2
#define ANIM_ATTACK_A 3
#define ANIM_ATTACK_B 4
#define ANIM_ATTACK_C 5
#define ANIM_RELOAD_A 6
#define ANIM_RELOAD_B 7
#define ANIM_RELOAD_C 8
#define ANIM_DRAW_A 9
#define ANIM_DRAW_B 10
#define ANIM_DRAW_C 11

// from model: Frames / FPS
#define ANIM_IDLE_TIME_A 90/30.0
#define ANIM_SHOOT_TIME_A 31/30.0
#define ANIM_RELOAD_TIME_A 101/30.0
#define ANIM_DRAW_TIME_A 46/30.0
#define ANIM_IDLE_TIME_B 90/30.0
#define ANIM_SHOOT_TIME_B 31/30.0
#define ANIM_RELOAD_TIME_B 101/30.0
#define ANIM_DRAW_TIME_B 46/30.0
#define ANIM_IDLE_TIME_C 90/30.0
#define ANIM_SHOOT_TIME_C 31/30.0
#define ANIM_RELOAD_TIME_C 101/30.0
#define ANIM_DRAW_TIME_C 46/30.0

new g_AllocString_V, 
	g_AllocString_P, 
	g_AllocString_E,

	HamHook: g_fw_TraceAttack[4],
	
	g_iMsgID_Weaponlist,
	g_iStoredEnergy[33],
	bool:g_bHasStunRifle[33],
	g_pCvarBarFillTime,
	g_pCvarRadius,
	g_pCvarElecDmg,
	g_iLigSpr,
	g_iEffSpr,
	g_iEff2Spr,
	bool:g_bReloading[33],
	g_iAppearTimes[33],
	g_iItemID

public plugin_init()
{
	register_plugin("[ZE] Stun Rifle", "1.1", "Raheem");

	// Register our item
	g_iItemID = ze_register_item("Stun Rifle", 300, 0) // It's cost 300 Coins
	
	RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "fw_Item_Deploy_Post", 1);
	RegisterHam(Ham_Item_PostFrame, WEAPON_OLD, "fw_Item_PostFrame");
	RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "fw_Item_AddToPlayer_Post", 1);
	RegisterHam(Ham_Weapon_Reload, WEAPON_OLD, "fw_Weapon_Reload");
	RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_OLD, "fw_Weapon_WeaponIdle");
	RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_OLD, "fw_Weapon_PrimaryAttack");
	
	g_fw_TraceAttack[0] = RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
	g_fw_TraceAttack[1] = RegisterHam(Ham_TraceAttack, "info_target",    "fw_TraceAttack");
	g_fw_TraceAttack[2] = RegisterHam(Ham_TraceAttack, "player",         "fw_TraceAttack");
	g_fw_TraceAttack[3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
	fm_ham_hook(false);
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
	register_forward(FM_SetModel, "fw_SetModel");
	
	g_pCvarBarFillTime = register_cvar("stunrifle_barfill_time", "5") // Bar fill time in seconds
	g_pCvarRadius = register_cvar("stunrifle_radius", "500") // elec radius
	g_pCvarElecDmg = register_cvar("stunrifle_electricity_dmg", "10") // electricity damage - lowest damage for 1 bar only
	
	register_clcmd(WEAPON_NEW, "HookSelect");
	g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
}

public plugin_precache()
{
	g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_V);
	g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_P);
	g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD);
	engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_V);
	engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_P);
	engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_W);
	
	for (new i = 0; i < sizeof g_szSounds; i++) engfunc(EngFunc_PrecacheSound, g_szSounds[i]);
	
	for(new i = 0; i < sizeof WPN_SPRITES;i++) precache_generic(WPN_SPRITES[i]);
	
	g_iLigSpr = precache_model("sprites/lightning.spr");
	g_iEffSpr = precache_model("sprites/ef_buffak_hit.spr");
	g_iEff2Spr = precache_model("sprites/muzzleflash67.spr");
}

public HookSelect(iPlayer)
{
	engclient_cmd(iPlayer, WEAPON_OLD);
}

public give(id)
{
	give_weapon_stunrifle(id)
}

public give_weapon_stunrifle(iPlayer)
{
	static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
	if(iEnt <= 0) return 0;
	set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
	set_pev(iEnt, pev_impulse, WEAPON_KEY);
	ExecuteHam(Ham_Spawn, iEnt);
	UTIL_DropWeapon(iPlayer, 1);
	if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEnt)) {
		engfunc(EngFunc_RemoveEntity, iEnt);
		return 0;
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlayer);
	set_pdata_int(iEnt, m_iClip, WEAPON_CLIP, 4);
	new iAmmoType = m_rgAmmo +get_pdata_int(iEnt, m_iPrimaryAmmoType, 4);
	if(get_pdata_int(iPlayer, m_rgAmmo, 5) < WEAPON_AMMO)
	set_pdata_int(iPlayer, iAmmoType, WEAPON_AMMO, 5);
	emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	g_iStoredEnergy[iPlayer] = 0;
	g_bHasStunRifle[iPlayer] = true;
	set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", iPlayer, _, _, "a", 6)
	return 1;
}

public plugin_natives()
{
	register_native(WEAPON_NATIVE, "give_weapon_stunrifle", 1);
}

public ze_select_item_pre(id, itemid)
{
	// Return Available and we will block it in Post, So it dosen't affect other plugins
	if (itemid != g_iItemID)
		return ZE_ITEM_AVAILABLE
	
	// Available for Humans only, So don't show it for zombies
	if (ze_is_user_zombie(id))
		return ZE_ITEM_DONT_SHOW
   
	return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(player, itemid)
{
	if (itemid != g_iItemID)
		return
	
	give_weapon_stunrifle(player)
}

public fw_Item_Deploy_Post(iItem)
{
	if(!CustomItem(iItem)) return;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);

	set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
	set_pev_string(iPlayer, pev_weaponmodel2, g_AllocString_P);
	
	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Draw A
		UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_A);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_A, 5);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_A, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Draw B
		UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_B);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_B, 5);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_B, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Draw C
		UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_C);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_C, 5);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_C, 4);
	}
}

public fw_Item_PostFrame(iItem)
{
	if(!CustomItem(iItem)) return HAM_IGNORED;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
	if(get_pdata_int(iItem, m_fInReload, 4) == 1) {
		static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
		static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
		static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, 5);
		static j; j = min(WEAPON_CLIP - iClip, iAmmo);
		set_pdata_int(iItem, m_iClip, iClip+j, 4);
		set_pdata_int(iPlayer, iAmmoType, iAmmo-j, 5);
		set_pdata_int(iItem, m_fInReload, 0, 4);
	}
	else switch(get_pdata_int(iItem, m_iWeaponState, 4) ) {
		case 0: {
			if(get_pdata_float(iItem, m_flNextSecondaryAttack, 4) <= 0.0)
			if(pev(iPlayer, pev_button) & IN_ATTACK2) {
				set_pdata_int(iPlayer, m_iFOV, get_pdata_int(iPlayer, m_iFOV, 5) == 90 ? 60 : 90);
				set_pdata_float(iItem, m_flNextSecondaryAttack, 0.3, 4);
			}
		}
	}
	
	return HAM_IGNORED;
}

public fw_Item_AddToPlayer_Post(iItem, iPlayer)
{
	switch(pev(iItem, pev_impulse)) {
		case WEAPON_KEY: { 
		s_weaponlist(iPlayer, true); 
		g_bHasStunRifle[iPlayer] = true;
		
		if (g_iStoredEnergy[iPlayer] < 6)
		{
			set_task(101/30.0, "OnReloadFinished", iPlayer);
		}
		else if (g_iStoredEnergy[iPlayer] == 6)
		{
			client_print(iPlayer, print_center, "Your Stun Rifle is fully charged!")
		}
		}
		case 0: s_weaponlist(iPlayer, false);
	}
}

public ze_user_infected(infected)
{
	if (g_bHasStunRifle[infected])
	{
		g_bHasStunRifle[infected] = false
		g_iStoredEnergy[infected] = 0;
	}
}

public ze_user_humanized(id)
{
	g_bHasStunRifle[id] = false
	g_iStoredEnergy[id] = 0;
}

public fw_Weapon_Reload(iItem)
{
	if(!CustomItem(iItem)) return HAM_IGNORED;
	static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
	if(iClip >= WEAPON_CLIP) return HAM_SUPERCEDE;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
	static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
	if(get_pdata_int(iPlayer, iAmmoType, 5) <= 0) return HAM_SUPERCEDE
	if(get_pdata_int(iPlayer, m_iFOV, 5) != 90) set_pdata_int(iPlayer, m_iFOV, 90, 5);

	set_pdata_int(iItem, m_iClip, 0, 4);
	ExecuteHam(Ham_Weapon_Reload, iItem);
	set_pdata_int(iItem, m_iClip, iClip, 4);

	set_pdata_int(iItem, m_fInReload, 1, 4);
	
	g_bReloading[iPlayer] = true;
	set_task(3.0, "AttackTask", iPlayer+444)

	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Reload A
		set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_A, 4);
		set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_A, 4);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_A, 4);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_A, 5);
		
		UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_A);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[10], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Reload B
		set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_B, 4);
		set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_B, 4);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_B, 4);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_B, 5);
		
		UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_B);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		
		if (notEmpty(iPlayer))
		{
			emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		}
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Reload C
		set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_C, 4);
		set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_C, 4);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_C, 4);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_C, 5);
		
		UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_C);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		
		if (notEmpty(iPlayer))
		{
			emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		}
	}
	
	// Set task to recharge the battary
	remove_task(iPlayer)
	set_task(101/30.0, "OnReloadFinished", iPlayer)

	return HAM_SUPERCEDE;
}

public AttackTask(taskid)
{
	g_bReloading[taskid - 444] = false;
		
	// After reload reset the stored energy
	g_iStoredEnergy[taskid - 444] = 0;
	
	g_iAppearTimes[taskid - 444] = 0;
}

public client_PreThink(id)
{
	if (g_bReloading[id] && g_bHasStunRifle[id] && (get_user_weapon(id) == CSW_AK47))
	{
		if (g_iStoredEnergy[id] == 0)
		{
			// Reload A
			
		}
		else if (g_iStoredEnergy[id] > 0 && g_iStoredEnergy[id] <= 3)
		{
			// Reload B
			static Float:flOrigin[3]
			pev(id, pev_origin, flOrigin)
			new iVictim = -1;
			
			while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
			{
				if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
					continue
				
				static Float:flVecOrigin[3];
				pev(iVictim, pev_origin, flVecOrigin);
					
				ElectricBeam(id, flVecOrigin);
					
				ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
			
				fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
				set_task(101/30.0, "Delete_Glow", iVictim+4444);
			}
		}
		else if (g_iStoredEnergy[id] > 3 && g_iStoredEnergy[id] <= 6)
		{
			// Reload C
			static Float:flOrigin[3]
			pev(id, pev_origin, flOrigin)
			new iVictim = -1;
			
			while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
			{
				if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
					continue
				
				static Float:flVecOrigin[3]
				pev(iVictim, pev_origin, flVecOrigin)
				
				ElectricBeam(id, flVecOrigin)
				
				ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
				
				fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
				set_task(101/30.0, "Delete_Glow", iVictim+4444);
			}
		}
	}
}

public Delete_Glow(taskid)
{
	new id = taskid - 4444;
	fm_set_user_rendering(id);
}

public OnReloadFinished(id)
{
	remove_task(id)
	set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", id, _, _, "a", 6)
}

public RechargeTask(id)
{
	if (!g_bHasStunRifle[id])
		return
	
	// Increase one bar every x time
	g_iStoredEnergy[id]++
	
	new szBars[100];
	
	switch(g_iStoredEnergy[id])
	{
		case 1:
		{
			szBars = "[ |           ]";
		}
		case 2:
		{
			szBars = "[ | |         ]";
		}
		case 3:
		{
			szBars = "[ | | |       ]";
		}
		case 4:
		{
			szBars = "[ | | | |     ]";
		}
		case 5:
		{
			szBars = "[ | | | | |   ]";
		}
		case 6:
		{
			szBars = "[ | | | | | | ]";
		}
	}
	
	set_dhudmessage(51, 153, 255, -1.0, -0.16, 0, 0.0, get_pcvar_float(g_pCvarBarFillTime) - 0.2)
	show_dhudmessage(id, "Stun Rifle Battary: %s", szBars)
	
	if (g_iStoredEnergy[id] == 6)
	{
		client_print(id, print_center, "Your Stun Rifle is fully charged!")
		remove_task(id)
	}
}

public fw_Weapon_WeaponIdle(iItem)
{
	if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);

	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Idle A
		UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_A);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_A, 4);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[7], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Idle B
		UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_B);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_B, 4);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[8], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Idle C
		UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_C);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_C, 4);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[9], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	
	return HAM_SUPERCEDE;
}

public fw_Weapon_PrimaryAttack(iItem)
{
	if(!CustomItem(iItem)) return HAM_IGNORED;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
	static iFOV; iFOV = (get_pdata_int(iPlayer, m_iFOV, 5) != 90);
	if(get_pdata_int(iItem, m_iClip, 4) == 0) {
		ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
		set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, 4);
		return HAM_SUPERCEDE;
	}
	static fw_TraceLine; fw_TraceLine = register_forward(FM_TraceLine, "fw_TraceLine_Post", 1);
	fm_ham_hook(true);
	state FireBullets: Enabled;
	ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
	state FireBullets: Disabled;
	unregister_forward(FM_TraceLine, fw_TraceLine, 1);
	fm_ham_hook(false);
	static Float:vecPunchangle[3];

	pev(iPlayer, pev_punchangle, vecPunchangle);
	vecPunchangle[0] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
	vecPunchangle[1] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
	vecPunchangle[2] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
	set_pev(iPlayer, pev_punchangle, vecPunchangle);

	emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	
	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Idle A
		UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_A);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_A, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Idle B
		UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_B);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_B, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Idle C
		UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_C);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_C, 4);
	}
	
	Make_Muzzleflash(iPlayer)

	set_pdata_float(iItem, m_flNextPrimaryAttack, iFOV ? WEAPON_RATE_EX : WEAPON_RATE, 4);

	return HAM_SUPERCEDE;
}

public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
public fw_TraceAttack(iVictim, iAttacker, Float:flDamage) {
	if(!is_user_connected(iAttacker)) return;
	static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
	static iFOV; iFOV = (get_pdata_int(iAttacker, m_iFOV, 5) != 90);
	static Float: flWeaponDamage; flWeaponDamage = (iFOV ? WEAPON_DAMAGE_EX : WEAPON_DAMAGE);
	if(iItem <= 0 || !CustomItem(iItem)) return;
        SetHamParamFloat(3, flDamage * flWeaponDamage);
}

public fw_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle)
{
	if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
	static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
	if(iItem <= 0 || !CustomItem(iItem)) return;
	set_cd(CD_Handle, CD_flNextAttack, 999999.0);
}

public fw_SetModel(iEnt)
{
	static i, szClassname[32], iItem; 
	pev(iEnt, pev_classname, szClassname, 31);
	if(!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
	for(i = 0; i < 6; i++) {
		iItem = get_pdata_cbase(iEnt, m_rgpPlayerItems_CWeaponBox + i, 4);
		if(iItem > 0 && CustomItem(iItem)) {
			engfunc(EngFunc_SetModel, iEnt, WEAPON_MODEL_W);
			set_pev(iEnt, pev_body, WEAPON_BODY);
			new iPlayer = pev(iEnt, pev_owner);
			g_bHasStunRifle[iPlayer] = false;
			remove_task(iPlayer)
			return FMRES_SUPERCEDE;
		}
	}
	return FMRES_IGNORED;
}

public fw_TraceLine_Post(const Float:flOrigin1[3], const Float:flOrigin2[3], iFrag, iIgnore, tr)
{
	if(iFrag & IGNORE_MONSTERS) return FMRES_IGNORED;
	static pHit; pHit = get_tr2(tr, TR_pHit);
	static Float:flvecEndPos[3]; get_tr2(tr, TR_vecEndPos, flvecEndPos);
	if(pHit > 0) {
		if(pev(pHit, pev_solid) != SOLID_BSP) return FMRES_IGNORED;
	}
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, flvecEndPos, 0);
	write_byte(TE_GUNSHOTDECAL);
	engfunc(EngFunc_WriteCoord, flvecEndPos[0]);
	engfunc(EngFunc_WriteCoord, flvecEndPos[1]);
	engfunc(EngFunc_WriteCoord, flvecEndPos[2]);
	write_short(pHit > 0 ? pHit : 0);
	write_byte(random_num(41, 45));
	message_end();

	return FMRES_IGNORED;
}

public fm_ham_hook(bool:on) {
	if(on) {
		EnableHamForward(g_fw_TraceAttack[0]);
		EnableHamForward(g_fw_TraceAttack[1]);
		EnableHamForward(g_fw_TraceAttack[2]);
		EnableHamForward(g_fw_TraceAttack[3]);
	}
	else {
		DisableHamForward(g_fw_TraceAttack[0]);
		DisableHamForward(g_fw_TraceAttack[1]);
		DisableHamForward(g_fw_TraceAttack[2]);
		DisableHamForward(g_fw_TraceAttack[3]);
	}
}

stock UTIL_SendWeaponAnim(iPlayer, iAnim)
{
	set_pev(iPlayer, pev_weaponanim, iAnim);

	message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
	write_byte(iAnim);
	write_byte(0);
	message_end();
}

stock UTIL_DropWeapon(iPlayer, iSlot) {
	static iEntity, iNext, szWeaponName[32]; 
	iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, 5);
	if(iEntity > 0) {       
		do {
			iNext = get_pdata_cbase(iEntity, m_pNext, 4)
			if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {  
				engclient_cmd(iPlayer, "drop", szWeaponName);
			}
		} while(( iEntity = iNext) > 0);
	}
}

stock s_weaponlist(iPlayer, bool:on)
{
	message_begin(MSG_ONE, g_iMsgID_Weaponlist, {0,0,0}, iPlayer);
	write_string(on ? WEAPON_NEW : WEAPON_OLD);
	write_byte(iWeaponList[0]);
	write_byte(on ? WEAPON_AMMO : iWeaponList[1]);
	write_byte(iWeaponList[2]);
	write_byte(iWeaponList[3]);
	write_byte(iWeaponList[4]);
	write_byte(iWeaponList[5]);
	write_byte(iWeaponList[6]);
	write_byte(iWeaponList[7]);
	message_end();
}

stock ElectricBeam(id, Float:flOrigin[3])
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMENTPOINT)
	write_short(id | 0x1000)
	engfunc(EngFunc_WriteCoord, flOrigin[0])
	engfunc(EngFunc_WriteCoord, flOrigin[1])
	engfunc(EngFunc_WriteCoord, flOrigin[2])
	write_short(g_iLigSpr)
	write_byte(1); // framestart
	write_byte(100); // framerate - 5
	write_byte(1) // life - 30
	write_byte(30); // width
	write_byte(random_num(0, 10)); // noise
	write_byte(51); // r, g, b
	write_byte(51); // r, g, b
	write_byte(255); // r, g, b
	write_byte(200); // brightness
	write_byte(200); // speed
	message_end()
	
	if (g_iAppearTimes[id] >= 2)
		return
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
	write_byte(TE_EXPLOSION);
	engfunc(EngFunc_WriteCoord, flOrigin[0]);
	engfunc(EngFunc_WriteCoord, flOrigin[1]);
	engfunc(EngFunc_WriteCoord, flOrigin[2]);
	write_short(g_iEffSpr);
	write_byte(10);
	write_byte(10);
	write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES|TE_EXPLFLAG_NODLIGHTS);
	message_end();
	
	g_iAppearTimes[id]++
}

stock notEmpty(id)
{
	static Float:flOrigin[3]
	pev(id, pev_origin, flOrigin)
	new iVictim = -1;
			
	while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
	{
		if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
			continue
		
		return true;
	}
	
	return false;
}

public Make_Muzzleflash(id)
{
	static Float:Origin[3], TE_FLAG
	get_position(id, 32.0, 6.0, -15.0, Origin)
	
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, Origin, id)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_iEff2Spr)
	write_byte(2)
	write_byte(30)
	write_byte(TE_FLAG)
	message_end()
}

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
}
Bazooka:

Code: Select all

#include <zombie_escape> 
 
static const plugin[] = "[ZE] Extra Item: Bazooka"; 
 
static const mrocket[] = "models/zombie_escape/zm_bazooka_missile.mdl";
static const mrpg_w[] = "models/zombie_escape/w_zm_bazooka.mdl";
static const mrpg_v[] = "models/zombie_escape/v_zm_bazooka.mdl";
static const mrpg_p[] = "models/zombie_escape/p_zm_bazooka.mdl";
static const sfire[] = "weapons/rocketfire1.wav";
static const sfly[] = "weapons/nuke_fly.wav"; 
static const shit[] = "weapons/mortarhit.wav";
static const spickup[] = "items/gunpickup2.wav";
 
new g_itemid;
 
new gmsg_screenshake, gmsg_death, gmsg_damage, pcvar_delay, pcvar_maxdmg, pcvar_radius, pcvar_map;
new rocketsmoke, explosion, bazsmoke, white;
new bool:has_baz[33], bool:CanShoot[33];
new dmgcount[33], pcvar_dmgforpacks, pcvar_award;
 
public plugin_init()
{
    register_plugin(plugin, "0.6", "Random1");
   
    pcvar_delay = register_cvar("zp_baz_delay", "10.0");
    pcvar_maxdmg = register_cvar("zp_baz_dmg", "720"); 
    pcvar_radius = register_cvar("zp_baz_radius", "750");
    pcvar_map = register_cvar("zp_baz_map", "0");
    pcvar_dmgforpacks = get_cvar_pointer("zp_human_damage_reward");
    pcvar_award = register_cvar("zp_baz_awardpacks", "1");
   
    if ( pcvar_dmgforpacks == 0 ) {
        set_pcvar_num(pcvar_award, 0);  //if we couldn't read the dmg cvar from zp then set a stop state on dmg reward
        log_amx("[%s] error reading zp_human_damage_reward cvar from zombie plague, turning award for damage off", plugin);
    }
   
    g_itemid = ze_register_item("Bazooka", 65, 0);
   
    register_concmd("zp_bazooka", "give_bazooka", ADMIN_KICK, "<name/@all> gives a bazooka to the spcified target");
    register_event("CurWeapon","switch_to_knife","be","1=1","2=29");
    register_event("HLTV", "event_HLTV", "a", "1=0", "2=0") // New Round
    register_clcmd("drop", "drop_call");
   
    //supports 2 methods of firing, attacking while holding knife and a bind
    register_clcmd("baz_fire", "fire_call");
    register_forward(FM_PlayerPreThink, "fw_prethink");
   
    register_forward(FM_Touch, "fw_touch");
       
    gmsg_screenshake = get_user_msgid("ScreenShake");
    gmsg_death = get_user_msgid("DeathMsg");
    gmsg_damage = get_user_msgid("Damage");
}
public event_HLTV()
{
    //remove entities regardless of cvar
    new rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    while( rpg_temp > 0) {
        engfunc(EngFunc_RemoveEntity, rpg_temp);
        rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    }
   
    if ( get_pcvar_num(pcvar_map) ) return;
   
    for( new id = 1; id <= 32; id++ )
        has_baz[id] = false;
}
 
public ze_select_item_pre(id, itemid)
{
    // This not our item?
    if (itemid != g_itemid)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    // Finally return that it's available
    return ZE_ITEM_AVAILABLE
}  
 
public ze_select_item_post(id, itemid)
{
    // This is not our item, Block it here and don't execute the blew code
    if (itemid != g_itemid)
        return
 
    has_baz[id] = true;
    CanShoot[id] = true;
}
 
public give_bazooka(id,level,cid)
{
    if (!cmd_access(id,level,cid,1)) {
        console_print(id,"You have no access to that command");
        return;
    }
    if (read_argc() > 2) {
        console_print(id,"Too many arguments supplied.");
        return;
    }
    new arg1[32];
    read_argv(1, arg1, sizeof(arg1) - 1);
    new player = cmd_target(id, arg1, 10);
    if ( !player ) {
        if ( arg1[0] == '@' ) {
            for ( new i = 1; i <= 32; i++ ) {
                if ( is_user_connected(i) && !has_baz[i] && !ze_is_user_zombie(i) ) {
                    has_baz[i] = true;
                    CanShoot[i] = true;
                    client_print(i, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
                }
            }
        } else {
            client_print(id, print_chat, "No Such Player/Team");
            return;
        }
    } else if ( !has_baz[player] && !ze_is_user_zombie(player) ) {
        has_baz[player] = true;
        CanShoot[player] = true;
        client_print(player, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
    }
}
 
public ze_user_infected(id, infector)
    if ( has_baz[id] )
        drop_rpg_temp(id);
 
public plugin_precache()
{
    precache_model(mrocket);   
 
    precache_model(mrpg_w);
    precache_model(mrpg_v);
    precache_model(mrpg_p);
 
    precache_sound(sfire);
    precache_sound(sfly);
    precache_sound(shit);
    precache_sound(spickup);
   
    rocketsmoke = precache_model("sprites/smoke.spr");
    explosion = precache_model("sprites/fexplo.spr");
    bazsmoke  = precache_model("sprites/steam1.spr");
    white = precache_model("sprites/white.spr");
}
 
public switch_to_knife(id)
{
    if ( !is_user_alive(id) ) return;
   
    if ( has_baz[id] && CanShoot[id] )
    {
        set_pev(id, pev_viewmodel2, mrpg_v);
        set_pev(id, pev_weaponmodel2, mrpg_p);
    }
}
 
public fw_prethink(id)
{
    static button;
    button = pev(id, pev_button);
    if ( button & IN_ATTACK )
        fire_call(id);
}
public fire_call(id)
{
    if ( !is_user_alive(id) || !has_baz[id] || !CanShoot[id] ) return;
   
    new weapon = get_user_weapon(id);
    if ( weapon == CSW_KNIFE ) fire_rocket(id);
}
 
fire_rocket(id) {
    if ( !CanShoot[id] ) return;
   
    CanShoot[id] = false;
    set_task(get_pcvar_float(pcvar_delay), "rpg_reload", id);
    engclient_cmd(id, "weapon_knife");  //attempt to force model to reset
 
    new Float:StartOrigin[3], Float:Angle[3];
    pev(id, pev_origin, StartOrigin);
    pev(id, pev_angles, Angle);
 
    new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    set_pev(ent, pev_classname, "rpgrocket");
    engfunc(EngFunc_SetModel, ent, mrocket);
    set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});
    engfunc(EngFunc_SetOrigin, ent, StartOrigin);
    set_pev(ent, pev_angles, Angle);
 
 
    set_pev(ent, pev_solid, 2);
    set_pev(ent, pev_movetype, 5);
    set_pev(ent, pev_owner, id);
 
    new Float:nVelocity[3];
    velocity_by_aim(id, 1500, nVelocity);
    set_pev(ent, pev_velocity, nVelocity);
 
    emit_sound(ent, CHAN_WEAPON, sfire, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    emit_sound(ent, CHAN_VOICE, sfly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
 
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(22);
    write_short(ent);
    write_short(rocketsmoke);
    write_byte(30);
    write_byte(3);
    write_byte(255);
    write_byte(255);
    write_byte(255);
    write_byte(255);
    message_end();
}
//---------------------------------------------------------------------------------------
public rpg_reload(id)
{
    CanShoot[id] = true;
    if ( get_user_weapon(id) == CSW_KNIFE ) switch_to_knife(id);    //sets our model
}
 
//---------------------------------------------------------------------------------------
public fw_touch(ent, touched)
{
    if ( !pev_valid(ent) ) return FMRES_IGNORED;
    static entclass[32];
    pev(ent, pev_classname, entclass, 31);
    if ( equali(entclass, "rpg_temp") )
    {
        static touchclass[32];
        pev(touched, pev_classname, touchclass, 31);
        if ( !equali(touchclass, "player") ) return FMRES_IGNORED;
       
        if( !is_user_alive(touched) || ze_is_user_zombie(touched) ) return FMRES_IGNORED;
           
        emit_sound(touched, CHAN_VOICE, spickup, 1.0, ATTN_NORM, 0, PITCH_NORM);
        has_baz[touched] = true;
       
        engfunc(EngFunc_RemoveEntity, ent);
   
        return FMRES_HANDLED;
    }
    else if ( equali(entclass, "rpgrocket") )
    {
        new Float:EndOrigin[3];
        pev(ent, pev_origin, EndOrigin);
        new NonFloatEndOrigin[3];
        NonFloatEndOrigin[0] = floatround(EndOrigin[0]);
        NonFloatEndOrigin[1] = floatround(EndOrigin[1]);
        NonFloatEndOrigin[2] = floatround(EndOrigin[2]);
   
        emit_sound(ent, CHAN_WEAPON, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
        emit_sound(ent, CHAN_VOICE, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
   
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(17);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2] + 128);
        write_short(explosion);
        write_byte(60);
        write_byte(255);
        message_end();
   
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(5);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2] + 256);
        write_short(bazsmoke);
        write_byte(125);
        write_byte(5);
        message_end();
   
        new maxdamage = get_pcvar_num(pcvar_maxdmg);
        new damageradius = get_pcvar_num(pcvar_radius);
   
        new PlayerPos[3], distance, damage;
        for (new i = 1; i <= 32; i++) {
            if ( is_user_alive(i))
                {  
                    new id = pev(ent, pev_owner)
                    if ((ze_is_user_zombie(id)))
                        continue;
                       
                    get_user_origin(i, PlayerPos);
       
                    distance = get_distance(PlayerPos, NonFloatEndOrigin);
                    if (distance <= damageradius) {
                    message_begin(MSG_ONE, gmsg_screenshake, {0,0,0}, i);
                    write_short(1<<14);
                    write_short(1<<14);
                    write_short(1<<14);
                    message_end();
       
                    damage = maxdamage - floatround(floatmul(float(maxdamage), floatdiv(float(distance), float(damageradius))));
                    new attacker = pev(ent, pev_owner);
       
                    baz_damage(i, attacker, damage, "bazooka");
                }
            }
        }
   
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(21);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2]);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2] + 320);
        write_short(white);
        write_byte(0);
        write_byte(0);
        write_byte(16);
        write_byte(128);
        write_byte(0);
        write_byte(255);
        write_byte(255);
        write_byte(192);
        write_byte(128);
        write_byte(0);
        message_end();
   
        engfunc(EngFunc_RemoveEntity, ent);
       
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}
//---------------------------------------------------------------------------------------
public drop_call(id)
{
    if ( has_baz[id] && get_user_weapon(id) == CSW_KNIFE )
    {
        drop_rpg_temp(id);
        return PLUGIN_HANDLED;  //attempt to block can't drop knife message
    }
    return PLUGIN_CONTINUE;
}
 
drop_rpg_temp(id) {
    new Float:fAim[3] , Float:fOrigin[3];
    velocity_by_aim(id , 64 , fAim);
    pev(id , pev_origin , fOrigin);
 
    fOrigin[0] += fAim[0];
    fOrigin[1] += fAim[1];
 
    new rpg = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
 
    set_pev(rpg, pev_classname, "rpg_temp");
    engfunc(EngFunc_SetModel, rpg, mrpg_w);
 
    set_pev(rpg, pev_mins, { -16.0, -16.0, -16.0 } );
    set_pev(rpg, pev_maxs, { 16.0, 16.0, 16.0 } );
 
    set_pev(rpg , pev_solid , 1);
    set_pev(rpg , pev_movetype , 6);
 
    engfunc(EngFunc_SetOrigin, rpg, fOrigin);
 
    has_baz[id] = false;
}
//---------------------------------------------------------------------------------------
baz_damage(id, attacker, damage, weaponDescription[])
{
    if ( pev(id, pev_takedamage) == DAMAGE_NO ) return;
    if ( damage <= 0 ) return;
 
    new userHealth = get_user_health(id);
    if (userHealth - damage <= 0 ) {
        dmgcount[attacker] += userHealth - damage;
        set_msg_block(gmsg_death, BLOCK_SET);
        ExecuteHamB(Ham_Killed, id, attacker, 2);
        set_msg_block(gmsg_death, BLOCK_NOT);
   
       
        message_begin(MSG_BROADCAST, gmsg_death);
        write_byte(attacker);
        write_byte(id);
        write_byte(0);
        write_string(weaponDescription);
        message_end();
       
        set_pev(attacker, pev_frags, float(get_user_frags(attacker) + 1));
           
        new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10];
   
        get_user_name(attacker, kname, 31);
        get_user_team(attacker, kteam, 9);
        get_user_authid(attacker, kauthid, 31);
     
        get_user_name(id, vname, 31);
        get_user_team(id, vteam, 9);
        get_user_authid(id, vauthid, 31);
           
        log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
        kname, get_user_userid(attacker), kauthid, kteam,
        vname, get_user_userid(id), vauthid, vteam, weaponDescription);
    }
    else {
        dmgcount[attacker] += damage;
        new origin[3];
        get_user_origin(id, origin);
       
        message_begin(MSG_ONE,gmsg_damage,{0,0,0},id);
        write_byte(21);
        write_byte(20);
        write_long(DMG_BLAST);
        write_coord(origin[0]);
        write_coord(origin[1]);
        write_coord(origin[2]);
        message_end();
       
        set_pev(id, pev_health, pev(id, pev_health) - float(damage));
    }
    if ( !get_pcvar_num(pcvar_award) ) return;
   
    new breaker = get_pcvar_num(pcvar_dmgforpacks);
    if ( dmgcount[attacker] > breaker )
    {
        new temp = dmgcount[attacker] / breaker
        if ( temp * breaker > dmgcount[attacker] ) return; //should never be possible
        dmgcount[attacker] -= temp * breaker;
        ze_set_escape_coins( attacker, ze_get_escape_coins(attacker) + temp );
    }
} 
Laser Minigun:

Code: Select all

include <ze_vip> 
#include <fakemeta_util> 

#define PLUGIN	"[ZE] CSO Laser Minigun" 
#define VERSION	"1.1"
#define AUTHOR	"Asep Khairul Anam" 

/**** Changelog 1.1 ****
-> Fixed Bug Laserminigun Charge Mode
-> Fixed Some Crash And Bug
-> Rewrite Code
-> Add To Mode Zombie Escape (Add Extra Items) 
*************************/


#define weapon_name		"weapon_m249"
#define weapon_new		"weapon_laserminigun"
#define VIP_ACCESS ADMIN_LEVEL_H

#define ANIM_IDLE		0
#define ANIM_SHOOT_1		7
#define ANIM_SHOOT_2		8
#define ANIM_RELOAD		5
#define ANIM_DRAW		6

#define IDLE_TIME		1.7
#define DRAW_TIME		2.53
#define RELOAD_TIME		5.23

#define WEAPON_KEY		38591238491
#define Is_CustomItem(%0)	(pev(%0,pev_impulse) == WEAPON_KEY)

#define MODEL_V			"models/zombie_escape/v_laserminigun.mdl"
#define MODEL_W			"models/zombie_escape/w_laserminigun.mdl"
#define MODEL_P			"models/zombie_escape/p_laserminiguna.mdl"
#define MODEL_P_CHARGE		"models/zombie_escape/p_laserminigunb.mdl"

/******* CONFIGURATION LASERMINIGUN ********/
#define RECOIL			0.4	
#define DAMAGE_LOW		0.8		
#define DAMAGE_HIGH		1.5	
#define DAMAGE_EXTREME		2.0				
#define WEAPON_SPEED		0.07
#define DAMAGE_BALL_1		330.0
#define DAMAGE_BALL_2		550.0
#define DAMAGE_BALL_3		770.0
#define EXPLODE_RADIUS		250.0
#define WEAPON_CLIP		125
#define WEAPON_BPAMMO		250
#define SHOOTS_FOR_HIGH		20
#define SHOOTS_FOR_EXTRREME	SHOOTS_FOR_HIGH + 20
/**** END OF CONFIGURATION LASERMINIGUN ****/

#define classname_ball	"laserminigun_ball"

#define Get_BitVar(%1,%2) (%1&(1<<(%2&31)))
#define Set_BitVar(%1,%2) %1|=(1<<(%2&31))
#define UnSet_BitVar(%1,%2) %1&=~(1<<(%2&31))

#define MUZZLEFLASH_1	"sprites/muzzleflash37.spr"
#define MUZZLEFLASH_2	"sprites/muzzleflash38.spr"
#define MUZZLEFLASH_3	"sprites/muzzleflash39.spr"

#define SPRITE_BALL_1	"sprites/laserminigun_charge_1.spr"
#define SPRITE_BALL_2	"sprites/laserminigun_charge_2.spr"
#define SPRITE_BALL_3	"sprites/laserminigun_charge_3.spr"

new gMaxPlayers, Msg_WeaponList, g_AllocString_V, g_iItemID 
new g_ChargeState[512],g_ChargeShots[512], g_AllocString_P, g_AllocString_P_charge
new Float:g_VecEndTrace[3], g_ChargeBall[33], g_ChargeForEntity[33]
new g_ChargeBall1_Explosion, g_ChargeBall2_Explosion, g_ChargeBall3_Explosion

new g_Muzzleflash_Ent1,g_Muzzleflash1
new g_Muzzleflash_Ent2,g_Muzzleflash2
new g_Muzzleflash_Ent3,g_Muzzleflash3

new g_MuzzleflashBall_Ent1,g_MuzzleflashBall1
new g_MuzzleflashBall_Ent2,g_MuzzleflashBall2
new g_MuzzleflashBall_Ent3,g_MuzzleflashBall3

new const Weapon_Sounds[15][] = 
{
	"weapons/laserminigun-1.wav",			// 0
	"weapons/laserminigun-charge_start.wav",	// 1
	"weapons/laserminigun-charge_loop.wav",		// 2
	"weapons/laserminigun-charge_origin.wav",	// 3
	"weapons/laserminigun-charge_shoot.wav",	// 4
	"weapons/laserminigun_idle.wav",		// 5
	"weapons/laserminigun_draw.wav",		// 6
	"weapons/laserminigun_clipout2.wav",		// 7
	"weapons/laserminigun_clipout1.wav",		// 8
	"weapons/laserminigun_clipin2.wav",		// 9
	"weapons/laserminigun_clipin1.wav",		// 10
	"weapons/laserminigun_charge_end.wav",		// 11
	"weapons/laserminigun_exp1.wav",		// 12
	"weapons/laserminigun_exp2.wav",		// 13
	"weapons/laserminigun_exp3.wav"			// 14
}

enum
{
	STATE_LOW = 0,
	STATE_HIGH,
	STATE_EXTREME,
	STATE_CHARGE
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_Item_Deploy,weapon_name,"HookHam_Weapon_Deploy",1)
	RegisterHam(Ham_Item_AddToPlayer,weapon_name,"HookHam_Weapon_Add",1)
	RegisterHam(Ham_Item_PostFrame,weapon_name,"HookHam_Weapon_Frame",0)
	g_iItemID = ze_register_item("Laser MiniGun \r(V.I.P)", 70, 0)  
	
	RegisterHam(Ham_Weapon_Reload,weapon_name,"HookHam_Weapon_Reload",0)
	RegisterHam(Ham_Weapon_WeaponIdle,weapon_name,"HookHam_Weapon_Idle",0)
	RegisterHam(Ham_Weapon_PrimaryAttack,weapon_name,"HookHam_Weapon_PrimaryAttack",0)
	RegisterHam(Ham_TakeDamage,"player","HookHam_TakeDamage")
	
	register_forward(FM_SetModel,"HookFm_SetModel")
	register_forward(FM_AddToFullPack,"fw_AddToFullPack_post",1)
	register_forward(FM_CheckVisibility,"fw_CheckVisibility")
	register_forward(FM_UpdateClientData,"HookFm_UpdateClientData",1)
	
	register_touch("*", classname_ball, "BallTouch")
	
	gMaxPlayers = get_maxplayers()
	Msg_WeaponList = get_user_msgid("WeaponList");
	
	register_clcmd(weapon_new,"hook_item")
}

public plugin_precache()
{
	engfunc(EngFunc_PrecacheModel, MODEL_W)
	engfunc(EngFunc_PrecacheModel, MODEL_V)
	engfunc(EngFunc_PrecacheModel, MODEL_P)
	engfunc(EngFunc_PrecacheModel, MODEL_P_CHARGE)
	
	engfunc(EngFunc_PrecacheModel, SPRITE_BALL_1)
	engfunc(EngFunc_PrecacheModel, SPRITE_BALL_2)
	engfunc(EngFunc_PrecacheModel, SPRITE_BALL_3)
	
	g_AllocString_V = engfunc(EngFunc_AllocString, MODEL_V)
	g_AllocString_P = engfunc(EngFunc_AllocString, MODEL_P)
	g_AllocString_P_charge = engfunc(EngFunc_AllocString, MODEL_P_CHARGE)
	
	for(new i = 0; i < sizeof(Weapon_Sounds); i++)
		engfunc(EngFunc_PrecacheSound,Weapon_Sounds[i])
	
	g_ChargeBall1_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_1.spr")
	g_ChargeBall2_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_2.spr")
	g_ChargeBall3_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_3.spr")
	
	
	g_Muzzleflash_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	precache_model(MUZZLEFLASH_1)
	engfunc(EngFunc_SetModel,g_Muzzleflash_Ent1,MUZZLEFLASH_1)
	set_pev(g_Muzzleflash_Ent1,pev_scale,0.1)
	set_pev(g_Muzzleflash_Ent1,pev_rendermode,kRenderTransTexture)
	set_pev(g_Muzzleflash_Ent1,pev_renderamt,0.0)
	
	g_Muzzleflash_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	precache_model(MUZZLEFLASH_2)
	engfunc(EngFunc_SetModel,g_Muzzleflash_Ent2,MUZZLEFLASH_2)
	set_pev(g_Muzzleflash_Ent2,pev_scale,0.1)
	set_pev(g_Muzzleflash_Ent2,pev_rendermode,kRenderTransTexture)
	set_pev(g_Muzzleflash_Ent2,pev_renderamt,0.0)
	
	g_Muzzleflash_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	precache_model(MUZZLEFLASH_3)
	engfunc(EngFunc_SetModel,g_Muzzleflash_Ent3,MUZZLEFLASH_3)
	set_pev(g_Muzzleflash_Ent3,pev_scale,0.1)
	set_pev(g_Muzzleflash_Ent3,pev_rendermode,kRenderTransTexture)
	set_pev(g_Muzzleflash_Ent3,pev_renderamt,0.0)
	
	g_MuzzleflashBall_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent1,SPRITE_BALL_1)
	set_pev(g_MuzzleflashBall_Ent1,pev_scale,0.1)
	set_pev(g_MuzzleflashBall_Ent1,pev_rendermode,kRenderTransTexture)
	set_pev(g_MuzzleflashBall_Ent1,pev_renderamt,0.0)
	set_pev(g_MuzzleflashBall_Ent1,pev_fuser1, 0.1)
	
	g_MuzzleflashBall_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent2,SPRITE_BALL_2)
	set_pev(g_MuzzleflashBall_Ent2,pev_scale,0.2)
	set_pev(g_MuzzleflashBall_Ent2,pev_rendermode,kRenderTransTexture)
	set_pev(g_MuzzleflashBall_Ent2,pev_renderamt,0.0)
	set_pev(g_MuzzleflashBall_Ent2,pev_fuser1, 0.2)
	
	g_MuzzleflashBall_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent3,SPRITE_BALL_3)
	set_pev(g_MuzzleflashBall_Ent3,pev_scale,0.25)
	set_pev(g_MuzzleflashBall_Ent3,pev_rendermode,kRenderTransTexture)
	set_pev(g_MuzzleflashBall_Ent3,pev_renderamt,0.0)
	set_pev(g_MuzzleflashBall_Ent3,pev_fuser1, 0.25)
	
	engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_1)
	engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_2)
	engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_3)
	
	engfunc(EngFunc_PrecacheGeneric,"sprites/640hud133.spr")
	engfunc(EngFunc_PrecacheGeneric,"sprites/640hud14.spr")
	engfunc(EngFunc_PrecacheGeneric,"sprites/weapon_laserminigun.txt")
	
	register_forward(FM_Spawn,"HookFm_Spawn",0)
}

public plugin_natives()
{
	register_native("give_laserminigun","get_item", 1)
}

public ze_user_infected(id) 
{
	remove_laserminigun(id)
}

public ze_user_humanized(id)
{ 
	remove_laserminigun(id)
}

public remove_laserminigun(id)
{
	g_ChargeBall[id] = 0
	g_ChargeForEntity[id] = 0
	
	UnSet_BitVar(g_MuzzleflashBall1,id)
	UnSet_BitVar(g_MuzzleflashBall2,id)
	UnSet_BitVar(g_MuzzleflashBall3,id)
}

public ze_select_item_pre(id, itemid)
{
    // This not our item?
    if (itemid != g_iItemID)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    // Player Not VIP?
    if (!(ze_get_vip_flags(id) & VIP_A))
        return ZE_ITEM_DONT_SHOW
   
    // Finally return that it's available
    return ZE_ITEM_AVAILABLE
} 
 
public ze_select_item_post(id, itemid)
{
    // This is not our item, Block it here and don't execute the blew code
    if (itemid != g_iItemID)
        return
   
    get_item(id) 
}


public client_command(id)
{
	new Command[32];read_argv(0,Command,charsmax(Command));  
	new ent = fm_find_ent_by_owner(-1,weapon_name,id)
	if(equali(Command,"weapon_",7) && g_ChargeBall[id] && Is_CustomItem(ent) || equali(Command,"lastinv") && g_ChargeBall[id] && Is_CustomItem(ent))
	{  
		client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Ganti")
		return PLUGIN_HANDLED;
	}
	else if(equali(Command,"drop") && g_ChargeBall[id] && Is_CustomItem(ent))
	{
		client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Drop")
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

public get_item(id)
{	
	UTIL_DropWeapon(id,1)
	new weapon = make_weapon()
	
	if(weapon <= 0)
		return
	
	if(!ExecuteHamB(Ham_AddPlayerItem,id,weapon))
	{
		engfunc(EngFunc_RemoveEntity,weapon)
		return
	}
	
	ExecuteHam(Ham_Item_AttachToPlayer,weapon,id)
	
	new ammotype = 376 + get_pdata_int(weapon,49,4)
	new ammo = get_pdata_int(id,ammotype,5)
	
	if(ammo < WEAPON_BPAMMO)
		set_pdata_int(id, ammotype, WEAPON_BPAMMO, 5)
		
	set_pdata_int(weapon, 51, WEAPON_CLIP, 4)
	emit_sound(id,CHAN_ITEM,"items/gunpickup2.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM)
	
	g_ChargeState[weapon] = STATE_LOW
	g_ChargeShots[weapon] = 0
	g_ChargeBall[id] = 0
	g_ChargeForEntity[id] = 0
	
	UnSet_BitVar(g_MuzzleflashBall1,id)
	UnSet_BitVar(g_MuzzleflashBall2,id)
	UnSet_BitVar(g_MuzzleflashBall3,id)
}

public hook_item(id)
{
	engclient_cmd(id,weapon_name)
	return PLUGIN_HANDLED
}

public fw_AddToFullPack_post(esState,iE,ent,iHost,iHostFlags,iPlayer,pSet)
{
	if(ent == g_Muzzleflash_Ent1)
	{
		if(Get_BitVar(g_Muzzleflash1,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,2)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,255.0)
			UnSet_BitVar(g_Muzzleflash1,iHost)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	} 
	if(ent == g_Muzzleflash_Ent2)
	{
		if(Get_BitVar(g_Muzzleflash2,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,2)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,255.0)
			UnSet_BitVar(g_Muzzleflash2,iHost)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_Muzzleflash_Ent3)
	{
		if(Get_BitVar(g_Muzzleflash3,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,2)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,255.0)
			UnSet_BitVar(g_Muzzleflash3,iHost)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_MuzzleflashBall_Ent1)
	{
		if(Get_BitVar(g_MuzzleflashBall1,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,8)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,240.0)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_MuzzleflashBall_Ent2)
	{
		if(Get_BitVar(g_MuzzleflashBall2,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,8)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,240.0)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_MuzzleflashBall_Ent3)
	{
		if(Get_BitVar(g_MuzzleflashBall3,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,8)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,240.0)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
}

public fw_CheckVisibility(entity,pSet)
{
	if(entity == g_Muzzleflash_Ent1 || entity == g_Muzzleflash_Ent2 || entity == g_Muzzleflash_Ent3)
	{
		forward_return(FMV_CELL,1)
		return FMRES_SUPERCEDE
	} 
	else if(entity == g_MuzzleflashBall_Ent1 || entity == g_MuzzleflashBall_Ent2 || entity == g_MuzzleflashBall_Ent3)
	{
		forward_return(FMV_CELL,1)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public HookHam_Weapon_Deploy(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
		
	static id
	id = get_pdata_cbase(ent,41,4)

	set_pev_string(id,pev_viewmodel2, g_AllocString_V)
	set_pev_string(id,pev_weaponmodel2, g_AllocString_P)
	
	set_pdata_float(ent,46,DRAW_TIME,4)
	set_pdata_float(ent,47,DRAW_TIME,4)
	set_pdata_float(ent,48,DRAW_TIME,4)
	Play_WeaponAnim(id,ANIM_DRAW)
	set_pdata_string(id,1968,"m249",-1,20)
	Weaponlist(id, true)
	
	return HAM_IGNORED
}

public HookHam_Weapon_Add(ent,id)
{
	switch(pev(ent,pev_impulse))
	{
		case WEAPON_KEY: Weaponlist(id,true)
		case 0: Weaponlist(id,false)
	}
	return HAM_IGNORED
}

public MakeBall(id)
{
	new ent = create_entity("env_sprite"),Float:f_origin[3],Float:f_vec[3]
	set_pev(ent,pev_classname,classname_ball)
	pev(id,pev_origin,f_origin)
	velocity_by_aim(id,35,f_vec)
	
	for(new i=0;i<3;i++){ f_origin[i]+=f_vec[i];f_vec[i]*=40.0;}
	f_origin[2] += (pev(id,pev_flags)&FL_DUCKING)?2.0:10.0;
	
	set_pev(ent,pev_origin,f_origin)
	set_pev(ent,pev_velocity,f_vec)
	set_pev(ent,pev_solid,SOLID_BBOX)
	set_pev(ent,pev_movetype,MOVETYPE_FLY)
	
	if(g_ChargeForEntity[id] == 1)
	{
		set_pev(ent, pev_scale, 0.2)
		entity_set_model(ent,SPRITE_BALL_1)
	}
	else if(g_ChargeForEntity[id] == 2)
	{
		set_pev(ent, pev_scale, 0.25)
		entity_set_model(ent,SPRITE_BALL_1)
	}
	else if(g_ChargeForEntity[id] == 3)
	{
		set_pev(ent, pev_scale, 0.27)
		entity_set_model(ent,SPRITE_BALL_2)
	}
	else if(g_ChargeForEntity[id] == 4)
	{
		set_pev(ent, pev_scale, 0.32)
		entity_set_model(ent,SPRITE_BALL_3)
	}
	
	set_pev(ent,pev_mins,Float:{-4.0,-4.0,-4.0})
	set_pev(ent,pev_maxs,Float:{4.0,4.0,4.0})
	set_pev(ent,pev_owner,id)
	
	set_pev(ent,pev_rendermode,kRenderTransAdd)
	set_pev(ent,pev_renderamt,255.0)
	
	pev(id,pev_v_angle,f_vec)
	set_pev(ent,pev_v_angle,f_vec)
}

public BallTouch(id, ent)
{
	new Float:origin[3],Float:f_vec[3]
	pev(ent, pev_origin, origin)
	velocity_by_aim(ent,-15,f_vec)
	
	for(new i = 0; i < 3; i++)
		origin[i] += f_vec[i] 
	
	static classnameptd[32]
	pev(id, pev_classname, classnameptd, 31)
	if(equali(classnameptd, "func_breakable"))
		ExecuteHamB(Ham_TakeDamage, id, 0, 0, 100.0, DMG_GENERIC)
	
	BallSprites(ent, origin)
	BallDamage(ent)
}

public BallSprites(ent, Float:origin[3])
{
	static owner
	owner = pev(ent, pev_owner)
	
	if(g_ChargeForEntity[owner] == 1)
	{ 
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_SPRITE);
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall1_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else if(g_ChargeForEntity[owner] == 2)
	{ 
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
		write_byte(TE_SPRITE);
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall1_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[12], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else if(g_ChargeForEntity[owner] == 3)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
		write_byte(TE_SPRITE);
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall2_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else if(g_ChargeForEntity[owner] == 4)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_SPRITE)
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall3_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[14], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
}

public BallDamage(ent)
{
	static owner, attacker
	owner = pev(ent, pev_owner)
	
	if(!is_user_alive(owner) || ze_is_user_zombie(owner))
	{
		attacker = 0;
		return
	} 
	else attacker = owner
	
	for(new i = 0; i < gMaxPlayers; i++)
	{
		if(i == attacker)
			continue
		if(!is_user_alive(i))
			continue
		if(!ze_is_user_zombie(i))
			continue
		if(entity_range(i, ent) > EXPLODE_RADIUS)
			continue
		
		if(g_ChargeForEntity[attacker] == 1) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
		else if(g_ChargeForEntity[attacker] == 2) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
		else if(g_ChargeForEntity[attacker] == 3) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_2,DMG_BULLET)
		else if(g_ChargeForEntity[attacker] == 4) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_3,DMG_BULLET)
	}
	
	remove_entity(ent)
}

public HookHam_Weapon_Frame(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
	
	static id
	id = get_pdata_cbase(ent,41,4)
	
	if(get_pdata_int(ent,54,4))
	{
		if(get_pdata_float(ent,46,4) >= 0.0)
			return HAM_IGNORED
		
		static clip,ammotype,ammo,j
		clip = get_pdata_int(ent,51,4)
		ammotype = 376 + get_pdata_int(ent,49,4)
		ammo = get_pdata_int(id,ammotype,5)
		j = min(WEAPON_CLIP-clip,ammo)
		set_pdata_int(ent, 51, clip+j, 4)
		set_pdata_int(id, ammotype, ammo-j, 5)
		set_pdata_int(ent, 54, 0, 4)
	}
	
	if(g_ChargeShots[ent] < SHOOTS_FOR_HIGH) g_ChargeState[ent] = STATE_LOW
	else if(g_ChargeShots[ent] >= SHOOTS_FOR_HIGH && g_ChargeShots[ent] < SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_HIGH
	else if(g_ChargeShots[ent] >= SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_EXTREME
	if(g_ChargeBall[id]) g_ChargeState[ent] = STATE_CHARGE
	if(g_ChargeShots[ent] > 0 && !(pev(id,pev_button) & IN_ATTACK) &&!g_ChargeBall[id])
		g_ChargeShots[ent]--
	
	static iButton;iButton = pev(id,pev_button)
	g_ChargeBall[id] = pev(ent, pev_iuser1)
	
	new Float:fFinshTime, Float:ScaleNew, Float:ScaleDelay[33]
	pev(ent,pev_fuser1,fFinshTime)
	
	static ammo
	ammo = get_pdata_int(ent,51,4)
	
	if(iButton & IN_ATTACK2)
	{
		if(get_pdata_float(ent, 46, 4) >= 0.0)
			return HAM_IGNORED
		if(ammo == 0)
			return HAM_IGNORED
			
		g_ChargeState[ent] = STATE_CHARGE
		set_pev_string(id,pev_weaponmodel2,g_AllocString_P_charge)
		
		if(!g_ChargeBall[id])
		{
			g_ChargeBall[id] = 1
			fFinshTime = get_gametime()+1.0
			
			Play_WeaponAnim(id, 1)
			emit_sound(ent, CHAN_ITEM, Weapon_Sounds[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			set_pdata_float(ent, 48, 1.0, 4)
			set_pdata_float(ent, 46, 1.0, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.01
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			set_pev(ent, pev_fuser1, fFinshTime)
			
			Set_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)
		}
		else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 1)
		{
			g_ChargeBall[id] = 2;
			fFinshTime = get_gametime()+3.0
			
			Play_WeaponAnim(id,2)
			emit_sound(ent, CHAN_ITEM, Weapon_Sounds[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			set_pdata_float(ent, 48, 1.25, 4)
			set_pdata_float(ent, 46, 1.25, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.02
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			Set_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)
		}
		else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 2)
		{
			g_ChargeBall[id] = 3
			fFinshTime = get_gametime()+3.0
			
			set_pdata_float(ent, 48, 1.5, 4)
			set_pdata_float(ent, 46, 1.5, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.05
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			UnSet_BitVar(g_MuzzleflashBall1,id)
			Set_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)

		}
		else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 3)
		{
			g_ChargeBall[id] = 4
			fFinshTime = get_gametime() + 200.0
			
			Play_WeaponAnim(id, 3)
			emit_sound(ent, CHAN_ITEM, Weapon_Sounds[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			set_pdata_float(ent, 48, 250.0, 4)
			set_pdata_float(ent, 46, 250.0, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.08
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			set_pev(ent, pev_fuser1, fFinshTime)
			UnSet_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			Set_BitVar(g_MuzzleflashBall3,id)
		}
		
		iButton &= ~IN_ATTACK2;
		set_pev(id,pev_button,iButton)
	}
	else
	{
		switch(g_ChargeBall[id])
		{	
			case 1:
			{
				Play_WeaponAnim(id,4)
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
				
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
			case 2:
			{
				Play_WeaponAnim(id,4);
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
				
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
			case 3:
			{
				Play_WeaponAnim(id,4)
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
				
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
			case 4:
			{
				Play_WeaponAnim(id,4)
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
					
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
		}
		
		g_ChargeBall[id] = 0
		
		new Float:ResetScale[3]
		pev(g_MuzzleflashBall_Ent1, pev_fuser1, ResetScale[0])
		set_pev(g_MuzzleflashBall_Ent1, pev_scale, ResetScale[0])
		pev(g_MuzzleflashBall_Ent2, pev_fuser1, ResetScale[1])
		set_pev(g_MuzzleflashBall_Ent2, pev_scale, ResetScale[1])
		pev(g_MuzzleflashBall_Ent3, pev_fuser1, ResetScale[2])
		set_pev(g_MuzzleflashBall_Ent3, pev_scale, ResetScale[2])
		
		set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
		set_pev(ent,pev_iuser1,g_ChargeBall[id])
	}
	
	return HAM_IGNORED
}

public HookHam_Weapon_Reload(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
	
	static clip
	clip = get_pdata_int(ent,51,4)
	
	if(clip >= WEAPON_CLIP)
		return HAM_SUPERCEDE
	
	static id
	id = get_pdata_cbase(ent,41,4)
	
	if(get_pdata_int(id, 376 + get_pdata_int(ent,49,4), 5) <= 0)
		return HAM_SUPERCEDE
	
	set_pdata_int(ent, 51, 0,4)
	ExecuteHam(Ham_Weapon_Reload, ent)
	set_pdata_int(ent,51, clip, 4)
	set_pdata_int(ent,54, 1,4)
	set_pdata_float(ent, 46,RELOAD_TIME,4)
	set_pdata_float(ent, 47,RELOAD_TIME,4)
	set_pdata_float(ent, 48,RELOAD_TIME,4)
	set_pdata_float(id, 83, RELOAD_TIME,5)
	Play_WeaponAnim(id, ANIM_RELOAD)
	return HAM_SUPERCEDE;
}

public HookHam_Weapon_Idle(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
		
	if(get_pdata_float(ent, 48, 4) > 0.0)
		return HAM_IGNORED
		
	set_pdata_float(ent,48,IDLE_TIME,4)
	Play_WeaponAnim(get_pdata_cbase(ent, 41, 4), ANIM_IDLE)
	
	return HAM_SUPERCEDE
}

public HookHam_Weapon_PrimaryAttack(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
		
	static ammo
	ammo = get_pdata_int(ent,51,4)
	
	if(ammo <= 0)
	{
		ExecuteHam(Ham_Weapon_PlayEmptySound,ent);
		set_pdata_float(ent,46,WEAPON_SPEED,4)
		return HAM_SUPERCEDE
	}
		
	static id; id = get_pdata_cbase(ent,41,4)
	static Float:user_punchangle[3];pev(id,pev_punchangle,user_punchangle)
	static fm_hooktrace;fm_hooktrace=register_forward(FM_TraceLine,"HookFm_TraceLine",true)
	static fm_playbackevent;fm_playbackevent=register_forward(FM_PlaybackEvent,"HookFm_PlayBackEvent",false)
	
	state FireBullets: Enabled;
	ExecuteHam(Ham_Weapon_PrimaryAttack,ent)
	state FireBullets: Disabled;
	
	unregister_forward(FM_TraceLine,fm_hooktrace,true)
	unregister_forward(FM_PlaybackEvent,fm_playbackevent,false)
	
	Play_WeaponAnim(id,random_num(ANIM_SHOOT_1,ANIM_SHOOT_2))
	set_pdata_int(ent,51,ammo-1,4)
	set_pdata_float(ent,48,2.0,4)
	static Float:user_newpunch[3];pev(id,pev_punchangle,user_newpunch)
	
	user_newpunch[0]=user_punchangle[0]+(user_newpunch[0]-user_punchangle[0])*RECOIL
	user_newpunch[1]=user_punchangle[1]+(user_newpunch[1]-user_punchangle[1])*RECOIL
	user_newpunch[2]=user_punchangle[2]+(user_newpunch[2]-user_punchangle[2])*RECOIL
	set_pev(id,pev_punchangle,user_newpunch)

	emit_sound(ent, CHAN_ITEM, Weapon_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
	set_pdata_float(ent,46,WEAPON_SPEED,4)
	
	new Float:Origin[3]
	get_weapon_position(id,Origin,.add_forward=10.0,.add_right=7.0,.add_up=-10.5)
		
	new Float:Velo[3]
	Velo[0]=g_VecEndTrace[0]-Origin[0]
	Velo[1]=g_VecEndTrace[1]-Origin[1]
	Velo[2]=g_VecEndTrace[2]-Origin[2]
		
	vec_normalize(Velo,Velo)
	vec_mul_scalar(Velo,4096.0,Velo)
	
	if(g_ChargeState[ent] == STATE_LOW)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_USERTRACER)
		engfunc(EngFunc_WriteCoord,Origin[0])
		engfunc(EngFunc_WriteCoord,Origin[1])
		engfunc(EngFunc_WriteCoord,Origin[2])
		engfunc(EngFunc_WriteCoord,Velo[0])
		engfunc(EngFunc_WriteCoord,Velo[1])
		engfunc(EngFunc_WriteCoord,Velo[2])
		write_byte(20)
		write_byte(4)
		write_byte(5)
		message_end()
		
		Set_BitVar(g_Muzzleflash1,id)
	}
	else if(g_ChargeState[ent] == STATE_HIGH)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_USERTRACER)
		engfunc(EngFunc_WriteCoord,Origin[0])
		engfunc(EngFunc_WriteCoord,Origin[1])
		engfunc(EngFunc_WriteCoord,Origin[2])
		engfunc(EngFunc_WriteCoord,Velo[0])
		engfunc(EngFunc_WriteCoord,Velo[1])
		engfunc(EngFunc_WriteCoord,Velo[2])
		write_byte(20)
		write_byte(5)
		write_byte(5)
		message_end()
		
		Set_BitVar(g_Muzzleflash2,id)
	}
	else if(g_ChargeState[ent] == STATE_EXTREME)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_USERTRACER)
		engfunc(EngFunc_WriteCoord,Origin[0])
		engfunc(EngFunc_WriteCoord,Origin[1])
		engfunc(EngFunc_WriteCoord,Origin[2])
		engfunc(EngFunc_WriteCoord,Velo[0])
		engfunc(EngFunc_WriteCoord,Velo[1])
		engfunc(EngFunc_WriteCoord,Velo[2])
		write_byte(20)
		write_byte(1)
		write_byte(5)
		message_end()
		
		Set_BitVar(g_Muzzleflash3,id)
	}
	g_ChargeShots[ent]++
	
	return HAM_SUPERCEDE
}

public HookHam_TakeDamage(victim,inflictor,attacker,Float:damage)<FireBullets: Enabled>
{ 
	new ent = fm_find_ent_by_owner(-1,weapon_name,attacker)
	
	if(g_ChargeState[ent] == STATE_LOW)
		SetHamParamFloat(4,damage*DAMAGE_LOW)
	else if(g_ChargeState[ent] == STATE_HIGH)
		SetHamParamFloat(4,damage*DAMAGE_HIGH)
	else if(g_ChargeState[ent] == STATE_EXTREME)
		SetHamParamFloat(4,damage*DAMAGE_EXTREME)
		
	return HAM_OVERRIDE;
}

public HookHam_TakeDamage()<FireBullets: Disabled>
{ 
	return HAM_IGNORED;
}

public HookHam_TakeDamage()<>
{
	return HAM_IGNORED;
}

public HookFm_SetModel(ent)
{ 
	static i,classname[32],item;pev(ent,pev_classname,classname,31);
	if(!equal(classname,"weaponbox"))
		return FMRES_IGNORED
		
	for(i=0; i < 6; i++)
	{
		item = get_pdata_cbase(ent,34+i,4)
		
		static id
		id = pev(ent,pev_owner)
		
		if(item > 0 && Is_CustomItem(item))
		{
			engfunc(EngFunc_SetModel,ent,MODEL_W)
			g_ChargeState[ent] = STATE_LOW
			g_ChargeShots[ent] = 0
			UnSet_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)
			g_ChargeBall[id] = 0
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED;
}

public HookFm_PlayBackEvent()
{ 
	return FMRES_SUPERCEDE
}

public HookFm_TraceLine(Float:tr_start[3],Float:tr_end[3],tr_flag,tr_ignore,tr)
{
	if(tr_flag&IGNORE_MONSTERS)
		return FMRES_IGNORED
		
	static hit
	hit=get_tr2(tr,TR_pHit)
	
	static Decal, glassdecal
	
	if(!glassdecal)
		glassdecal = engfunc(EngFunc_DecalIndex,"{bproof1")
	
	hit = get_tr2(tr,TR_pHit)
	if(hit > 0 && pev_valid(hit))
	{
		if(pev(hit,pev_solid) != SOLID_BSP)
			return FMRES_IGNORED
			
		else if(pev(hit,pev_rendermode) != 0) Decal=glassdecal
		else Decal = random_num(41,45)
	}
	else Decal = random_num(41,45)

	static Float:vecEnd[3]
	get_tr2(tr,TR_vecEndPos,vecEnd)
	g_VecEndTrace = vecEnd
	
	engfunc(EngFunc_MessageBegin,MSG_PAS,SVC_TEMPENTITY,vecEnd,0)
	write_byte(TE_GUNSHOTDECAL)
	engfunc(EngFunc_WriteCoord,vecEnd[0])
	engfunc(EngFunc_WriteCoord,vecEnd[1])
	engfunc(EngFunc_WriteCoord,vecEnd[2])
	write_short(hit>0?hit:0)
	write_byte(Decal)
	message_end()
	
	static Float:WallVector[3];get_tr2(tr,TR_vecPlaneNormal,WallVector)
	engfunc(EngFunc_MessageBegin,MSG_PVS,SVC_TEMPENTITY,vecEnd,0);
	write_byte(TE_STREAK_SPLASH)
	engfunc(EngFunc_WriteCoord,vecEnd[0]);
	engfunc(EngFunc_WriteCoord,vecEnd[1]);
	engfunc(EngFunc_WriteCoord,vecEnd[2]);
	engfunc(EngFunc_WriteCoord,WallVector[0]*random_float(25.0,30.0));
	engfunc(EngFunc_WriteCoord,WallVector[1]*random_float(25.0,30.0));
	engfunc(EngFunc_WriteCoord,WallVector[2]*random_float(25.0,30.0));
	write_byte(111)
	write_short(12)
	write_short(3)
	write_short(75)	
	message_end()
	
	return FMRES_IGNORED
}

public HookFm_UpdateClientData(id,SendWeapons,CD_Handle)
{
	static item
	item = get_pdata_cbase(id,373,5)
	if(item <= 0 || !Is_CustomItem(item))
		return FMRES_IGNORED
		
	set_cd(CD_Handle,CD_flNextAttack,99999.0)
	return FMRES_HANDLED
}

public HookFm_Spawn(id)
{
	if(pev_valid(id) != 2)
		return FMRES_IGNORED
		
	static ClName[32]
	pev(id,pev_classname,ClName,31)
	
	if(strlen(ClName) < 5)
		return FMRES_IGNORED
		
	static Trie:ClBuffer
	if(!ClBuffer) ClBuffer = TrieCreate()
	if(!TrieKeyExists(ClBuffer,ClName))
	{
		TrieSetCell(ClBuffer, ClName, 1)
		RegisterHamFromEntity(Ham_TakeDamage, id, "HookHam_TakeDamage", 0)
	}
	return FMRES_IGNORED
}

stock make_weapon()
{
	static ent, g_AllocString_E
	if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString,weapon_name)))
		ent = engfunc(EngFunc_CreateNamedEntity,g_AllocString_E)
	else
		return 0
	if(ent <= 0)
		return 0
		
	set_pev(ent,pev_spawnflags,SF_NORESPAWN)
	set_pev(ent,pev_impulse,WEAPON_KEY)
	ExecuteHam(Ham_Spawn,ent)
	
	return ent
}

stock UTIL_DropWeapon(id,slot)
{
	static iEntity
	iEntity = get_pdata_cbase(id,(367 + slot),5)
	
	if(iEntity > 0)
	{
		static iNext,szWeaponName[32]
		
		do
		{
			iNext = get_pdata_cbase(iEntity,42,4);
			if(get_weaponname(get_pdata_int(iEntity, 43, 4), szWeaponName, 31))
				engclient_cmd(id,"drop",szWeaponName)
		} 
		while((iEntity=iNext)>0)
	}
}

stock Play_WeaponAnim(id,anim)
{
	set_pev(id,pev_weaponanim,anim)
	message_begin(MSG_ONE_UNRELIABLE,SVC_WEAPONANIM,_,id)
	write_byte(anim)
	write_byte(0)
	message_end()
}

stock Weaponlist(id,bool:set)
{
	if(!is_user_connected(id))
		return
		
	message_begin(MSG_ONE,Msg_WeaponList,_,id);
	write_string(set == false ? weapon_name:weapon_new);
	write_byte(3);
	write_byte(WEAPON_BPAMMO);
	write_byte(-1);
	write_byte(-1);
	write_byte(0);
	write_byte(4);
	write_byte(20);
	write_byte(0);
	message_end();
}

stock get_weapon_position(id,Float:fOrigin[3],Float:add_forward=0.0,Float:add_right=0.0,Float:add_up=0.0)
{
	static Float:Angles[3],Float:ViewOfs[3],Float:vAngles[3]
	static Float:Forward[3],Float:Right[3],Float:Up[3]
	pev(id,pev_v_angle,vAngles)
	pev(id,pev_origin,fOrigin)
	pev(id,pev_view_ofs,ViewOfs)
	vec_add(fOrigin,ViewOfs,fOrigin)
	pev(id,pev_v_angle,Angles)
	engfunc(EngFunc_MakeVectors,Angles)
	global_get(glb_v_forward,Forward)
	global_get(glb_v_right,Right)
	global_get(glb_v_up,Up)
	vec_mul_scalar(Forward,add_forward,Forward)
	vec_mul_scalar(Right,add_right,Right)
	vec_mul_scalar(Up,add_up,Up)
	fOrigin[0]=fOrigin[0]+Forward[0]+Right[0]+Up[0]
	fOrigin[1]=fOrigin[1]+Forward[1]+Right[1]+Up[1]
	fOrigin[2]=fOrigin[2]+Forward[2]+Right[2]+Up[2]
}

vec_add(const Float:in1[],const Float:in2[],Float:out[])
{
	out[0]=in1[0]+in2[0];
	out[1]=in1[1]+in2[1];
	out[2]=in1[2]+in2[2];
}

vec_mul_scalar(const Float:vec[],Float:scalar,Float:out[])
{
	out[0]=vec[0]*scalar;
	out[1]=vec[1]*scalar;
	out[2]=vec[2]*scalar;
}

vec_normalize(const Float:vec[],Float:out[])
{
	new Float:invlen=rsqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
	out[0]=vec[0]*invlen;
	out[1]=vec[1]*invlen;
	out[2]=vec[2]*invlen;
}

Float:rsqrt(Float:x)
{
	new Float:xhalf=x*0.5;
	
	new i=_:x;
	i=0x5f375a84 - (i>>1);
	x=Float:i;
			
	x=x*(1.5-xhalf*x*x);
	x=x*(1.5-xhalf*x*x);
	x=x*(1.5-xhalf*x*x);
		
	return x;
}
Auto Minigun:

Code: Select all

#include <zombie_escape>
#include <fakemeta_util>
#include <xs>

#define PLUGIN "[MW2] Auto Minigun"
#define VERSION "1.0"
#define AUTHOR "Dias"

new g_player_main[33], g_remoting[33], g_player_main2[33], g_firing[33], 
g_preparing[33], g_ending[33], g_reloading[500]
new Float:g_last_firesound[33]
new const base_model[] = "models/mw2_auto/base.mdl"
new const main_model[] = "models/mw2_auto/main.mdl"
new const muzzleflash_spr[] = "sprites/muzzleflash3_auto.spr"
new muzzleflash_spr_id, Float:g_last_shoot[33]
new g_blood, g_bloodspray, g_dead[500], g_exp_id, g_owner[500], Float:g_check_heat[33]

new const minigun_sound[3][] = {
	"mw2_auto/minigun-starting.wav",
	"mw2_auto/minigun-shooting.wav",
	"mw2_auto/minigun-stoping.wav"
}

new g_minigun, g_had_minigun[33], g_reg, g_heat[500], g_sync_hud1
new cvar_minigun_health, cvar_minigun_dmgrand_start, cvar_minigun_dmgrand_end,
cvar_delay_attack, cvar_reload_time


// Weapon entity names
new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
			"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
			"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
			"weapon_ak47", "weapon_knife", "weapon_p90" }

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("HLTV", "event_newround", "a", "1=0", "2=0")
	register_event("DeathMsg", "event_death", "a")
	
	register_think("mw2_mingun_main", "fw_main_think")
	register_forward(FM_CmdStart, "fw_CmdStart")
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
		if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)	
	
	g_minigun = ze_register_item("[MW2] Auto-Minigun (Remote)", 35, 0)
	g_sync_hud1 = CreateHudSyncObj(645)
	
	// Cvars
	cvar_minigun_health = register_cvar("zp_minigun_health", "500")
	cvar_minigun_dmgrand_start = register_cvar("zp_minigun_dmgrand_start", "10")
	cvar_minigun_dmgrand_end = register_cvar("zp_minigun_dmgrand_end", "30")
	cvar_delay_attack = register_cvar("zp_minigun_delay_attack", "0.1")
	cvar_reload_time = register_cvar("zp_minigun_reload_time", "30.0")
	
	//register_clcmd("say /make", "create_minigun")
	//register_clcmd("say /remote", "remote_minigun")
}

public plugin_precache()
{
	precache_model(base_model)
	precache_model(main_model)
	
	for(new i = 0; i < sizeof(minigun_sound); i++)
		engfunc(EngFunc_PrecacheSound, minigun_sound[i])
	
	muzzleflash_spr_id = precache_model(muzzleflash_spr)
	g_blood = precache_model("sprites/blood.spr")
	g_bloodspray = precache_model("sprites/bloodspray.spr")		
	g_exp_id = precache_model("sprites/zerogxplode.spr")
}

public event_newround()
{
	remove_entity_name("mw2_mingun_base")
	remove_entity_name("mw2_mingun_main")
	remove_entity_name("mw2_mingun_view")
	
	for(new i = 0; i < get_maxplayers(); i++)
	{
		if(is_user_alive(i) && is_user_connected(i))
		{
			reset_minigun(i)
		}
	}
}

public event_death()
{
	static victim
	victim = read_data(2)
	
	reset_minigun(victim)
}

public reset_minigun(id)
{
	attach_view(id, id)
	
	g_had_minigun[id] = 0
	g_player_main[id] = 0
	g_player_main2[id] = 0
	g_remoting[id] = 0
	g_preparing[id] = 0
	g_firing[id] = 0
	g_ending[id] = 0
	
	remove_task(id+2479)

	message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
	write_short(0)
	message_end()	
}

public ze_select_item_pre(id, itemid)
{
    // Return Available and we will block it in Post, So it dosen't affect other plugins
    if (itemid != g_minigun)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(id, itemid)
{
    if (itemid != g_minigun)
        return
   
    g_had_minigun[id] = 1
    create_minigun(id)
    client_printcolor(id, "!g[ZE]!y Hold !t(E)!y for 3 seconds to put MW2 Auto-Minigun !!!")
}

public create_minigun(id)
{
	if(!g_had_minigun[id])
		return
	
	g_had_minigun[id] = 0
	
	new Float:Origin[3], Float:Angles[3]
	
	get_position(id, 40.0, 0.0, 0.0, Origin)
	pev(id, pev_angles, Angles)
	
	// Make the Base
	new ent = create_entity("info_target")
	entity_set_origin(ent, Origin);
	
	Angles[0] = 0.0
	entity_set_vector(ent, EV_VEC_angles, Angles)

	entity_set_string(ent,EV_SZ_classname, "mw2_mingun_base")
	entity_set_model(ent, base_model);
	entity_set_int(ent,EV_INT_solid, SOLID_NOT)
	
	entity_set_float(ent,EV_FL_takedamage,1.0)
	entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)

	new Float:maxs[3] = {10.0,10.0,1.0}
	new Float:mins[3] = {-10.0,-10.0,-1.0}
	entity_set_size(ent,mins,maxs)
	
	set_entity_anim(ent, 0)
	g_dead[ent] = 0
	g_owner[ent] = id
	
	entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
	
	drop_to_floor(ent)
	
	// Create Main
	ent = create_entity("info_target")
	
	Origin[2] -= 35.0
	entity_set_origin(ent, Origin);
	entity_set_vector(ent, EV_VEC_angles, Angles)
	
	entity_set_string(ent,EV_SZ_classname, "mw2_mingun_main")
	entity_set_model(ent, main_model);
	entity_set_int(ent,EV_INT_solid, SOLID_BBOX)
	
	entity_set_float(ent,EV_FL_takedamage,1.0)
	entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)	

	new Float:maxs2[3] = {10.0,10.0,20.0}
	new Float:mins2[3] = {-10.0,-10.0,-20.0}
	entity_set_size(ent,mins2,maxs2)	
	
	set_entity_anim(ent, 0)
	g_heat[ent] = 0
	
	entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)	
	g_player_main[id] = ent
	g_dead[ent] = 0
	g_owner[ent] = id
	g_reloading[ent] = 0
	
	drop_to_floor(ent)
	if(!g_reg)
	{
		g_reg = 1
		RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_main_takedamage")
	}
	
	// Create View Ent
	ent = create_entity("info_target")
	
	get_position(id, 40.0, 0.0, 10.0, Origin)
	
	entity_set_origin(ent, Origin);
	entity_set_vector(ent, EV_VEC_angles, Angles)
	
	entity_set_string(ent,EV_SZ_classname, "mw2_mingun_view")
	entity_set_model(ent, main_model);
	
	fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
	
	g_player_main2[id] = ent
}

public ze_user_infected(id)
{
	reset_minigun(id)
}

public do_remote(id)
{
	id -= 2479
	
	remote_minigun(id)
}

public remote_minigun(id)
{
	if(!g_player_main[id])
		return
		
	attach_view(id, g_player_main2[id])
	engclient_cmd(id, "weapon_knife")
	
	set_task(1.0, "task_delay", id)
	
	client_printcolor(id, "!g[ZE]!y Press !t(E)!y to turn of the MW2-Auto Minigun !!!")
}

public task_delay(id)
{
	g_remoting[id] = 1
}

public client_PostThink(id)
{
	if(!g_remoting[id])
		return
	if(!g_player_main[id])
		return	
	if(!pev_valid(g_player_main[id]))
	{
		reset_minigun(id)
		return
	}
	
	if(!g_firing[id] && !g_reloading[g_player_main[id]])
	{
		if(g_heat[g_player_main[id]] > 0)
		{
			static Float:CurTime
			CurTime = get_gametime()
			
			if(CurTime - get_pcvar_float(cvar_delay_attack) * 2 > g_check_heat[id])
			{
				g_heat[g_player_main[id]]--
				g_check_heat[id] = CurTime
			}
		}
	}
	
	static Message[64]
	
	if(g_heat[g_player_main[id]] <= 0)
	{
		set_hudmessage(0, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
		formatex(Message, sizeof(Message), "Status: Good")
	} else if(g_heat[g_player_main[id]] > 0 && g_heat[g_player_main[id]] < 100) {
		set_hudmessage(255, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
		formatex(Message, sizeof(Message), "Status: Heat %i%%", g_heat[g_player_main[id]])
	} else if(g_heat[g_player_main[id]] >= 100) {
		set_hudmessage(255, 0, 0, -1.0, 0.90, 0, 1.0, 1.0)
		formatex(Message, sizeof(Message), "Status: OverHeat")
	}
	
	ShowSyncHudMsg(id, g_sync_hud1, Message)
	
	static Float:NewAngles[3], Float:OldAngles[3], Float:Origin[3]
	pev(id, pev_angles, NewAngles)
	pev(g_player_main[id], pev_angles, OldAngles)
	
	NewAngles[2] = OldAngles[2]
	
	pev(g_player_main2[id], pev_origin, Origin)
	//get_position(g_player_main2[id], -10.0, 0.0, 0.0, Origin)
	
	set_pev(g_player_main[id], pev_v_angle, NewAngles)
	set_pev(g_player_main2[id], pev_angles, NewAngles)
	
	NewAngles[0] -= NewAngles[0] * 2
	set_pev(g_player_main[id], pev_angles, NewAngles)
	
	if(get_user_weapon(id) != CSW_KNIFE)
		engclient_cmd(id, "weapon_knife")
}

public fw_main_think(ent)
{
	if(!pev_valid(ent))
		return
	if(pev(ent, pev_health) - 1000.0 < 0)
	{
		if(!g_dead[ent])
			minigun_dead(ent)
			
		return
	}
	
	if(!g_dead[ent])
		entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)	
}

public fw_main_takedamage(victim, inflictor, attacker, Float:Damage, damagebits)
{
	if(!is_user_alive(attacker) || !is_user_connected(attacker))
		return HAM_IGNORED
	
	static Health
	Health = pev(victim, pev_health) - 1000
	
	client_print(attacker, print_center, "MW2 Auto-Minigun Health: %i", Health)
	
	return HAM_HANDLED
}

public minigun_dead(ent)
{
	g_dead[ent] = 1
	
	static Float:Origin[3]
	pev(ent, pev_origin, Origin)
	
	message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_exp_id)	// sprite index
	write_byte(30)	// scale in 0.1's
	write_byte(30)	// framerate
	write_byte(0)	// flags
	message_end()
	
	static id
	id = g_owner[ent]
	
	if(is_user_connected(id))
	{
		reset_minigun(id)
		client_printcolor(id, "!g[ZE]!y Your MW2 Auto-Minigun has been !tDestroyed!y !!!")
	}
	
	Origin[0] = 9999.0
	Origin[1] = 9999.0
	Origin[2] = 9999.0
	
	set_pev(ent, pev_origin, Origin)
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_user_alive(id) || !is_user_connected(id))
		return FMRES_IGNORED
	if(!g_player_main[id])
		return FMRES_IGNORED
		
	static PressButton
	PressButton = get_uc(uc_handle, UC_Buttons)
	
	if(g_remoting[id])
	{
		if(PressButton & IN_ATTACK)
		{
			static Float:CurTime
			CurTime = get_gametime()
			
			if(CurTime - get_pcvar_float(cvar_delay_attack) > g_last_shoot[id])
			{
				if(!g_preparing[id] && !g_firing[id] && !g_ending[id])
				{
					g_preparing[id] = 1
					g_firing[id] = 0
					
					set_entity_anim(g_player_main[id], 1)
					set_task(1.5, "start_attack", id)
					
					emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
				}
				
				if(!g_preparing[id] && g_firing[id] && !g_ending[id] && g_heat[g_player_main[id]] < 100)
				{
					minigun_shoot(id)
					
					if(CurTime - get_pcvar_float(cvar_delay_attack) > g_check_heat[id])
					{
						if(g_heat[g_player_main[id]] < 100)
						{
							g_heat[g_player_main[id]]++
						}
						
						g_check_heat[id] = CurTime
					}
				} else if(g_heat[g_player_main[id]] >= 100) {
					if(!g_preparing[id] && g_firing[id] && !g_ending[id] && !g_reloading[g_player_main[id]])
					{
						g_firing[id] = 0
						g_preparing[id] = 0
						g_ending[id] = 1
						
						set_entity_anim(g_player_main[id], 3)
					
						emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
						set_task(2.0, "stop_attack", id)
						
						static Message[128]
						formatex(Message, sizeof(Message), "!g[ZE]!y System is overheat. Please wait !t%i!y seconds !!!", get_pcvar_float(cvar_reload_time))
						
						client_printcolor(id, Message)
						
						g_reloading[g_player_main[id]] = 1
						set_task(get_pcvar_float(cvar_reload_time), "reload_heat", id)
					}
				}
				
				g_last_shoot[id] = CurTime
			}
			
			PressButton &= ~IN_ATTACK
			set_uc(uc_handle, UC_Buttons, PressButton)
		} else {
			if(pev(id, pev_oldbuttons) & IN_ATTACK)
			{
				if(g_preparing[id] || g_firing[id])
				{
					g_firing[id] = 0
					g_preparing[id] = 0
					g_ending[id] = 1
					
					set_entity_anim(g_player_main[id], 3)
					
					emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
					set_task(2.0, "stop_attack", id)
				}
			}
		}
	}
	
	if(PressButton & IN_USE)
	{
		if(g_remoting[id])
		{
			set_task(1.0, "task_delay2", id)
			attach_view(id, id)
			g_preparing[id] = 0
			g_firing[id] = 0
			
			PressButton &= ~IN_USE
			set_uc(uc_handle, UC_Buttons, PressButton)
		} else {
			if(!task_exists(id+2479))
			{
				set_task(3.0, "do_remote", id+2479)
				
				message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
				write_short(3)
				message_end()
			}
		}
	} else {
		if(pev(id, pev_oldbuttons) & IN_USE)
		{
			remove_task(id+2479)

			message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("BarTime"), {0,0,0}, id)
			write_short(0)
			message_end()
		}
	}
	
	return FMRES_HANDLED
}

public reload_heat(id)
{
	if(!pev_valid(g_player_main[id]))
		return
	
	g_heat[g_player_main[id]] = 0
	g_reloading[g_player_main[id]] = 0
}

public task_delay2(id)
{
	g_remoting[id] = 0
}

public start_attack(id)
{
	g_preparing[id] = 0
	g_firing[id] = 1
}

public stop_attack(id)
{
	g_preparing[id] = 0
	g_firing[id] = 0
	g_ending[id] = 0
}

public minigun_shoot(id)
{
	if(!g_remoting[id])
	{
		return PLUGIN_HANDLED
	}
	
	static Float:CurTime
	CurTime = get_gametime()
	
	if(CurTime - 0.1 > g_last_firesound[id])
	{
		PlaySound(id, minigun_sound[1])
		emit_sound(g_player_main[id], CHAN_BODY, minigun_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
		g_last_firesound[id] = CurTime
	}
	
	set_entity_anim(g_player_main[id], 2)
	
	static Float:Origin[3], Float:AimOrigin[3]
	get_position(g_player_main[id], 50.0, 0.0, 0.0, Origin)
	
	Origin[2] += 20.0
	
	message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(muzzleflash_spr_id)    // sprite index
	write_byte(5)    // scale in 0.1's
	write_byte(10)    // framerate
	write_byte(4)    // flags
	message_end()	
	
	static Float:Punch[3]
	Punch[0] = random_float(1.0, 5.0)
	Punch[1] = random_float(1.0, 5.0)
	Punch[2] = random_float(1.0, 10.0)
	
	set_pev(id, pev_punchangle, Punch)
				
	get_position(g_player_main[id], 70.0, 0.0, 30.0, Origin)
	get_position(g_player_main[id], 4000.0, 0.0, 30.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, -30.0, 50.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, 30.0, -50.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, -60.0, -70.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, 60.0, 70.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)	
	
	return PLUGIN_HANDLED
}

// Ham Weapon Deploy Forward
public fw_Item_Deploy_Post(weapon_ent)
{
	if(pev_valid(weapon_ent))
		return HAM_IGNORED
		
	static id
	id = pev(weapon_ent, pev_owner)
	
	if(g_remoting[id])
		engclient_cmd(id, "weapon_knife")
		
	return HAM_HANDLED
}

stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
	new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
	
	pev(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
	
	vAngle[0] = 0.0
	
	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 create_tracer(id, Float:start[3], Float:end[3]) 
{
	new start_[3], end_[3]
	FVecIVec(start, start_)
	FVecIVec(end, end_)
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_TRACER)
	write_coord(start_[0])
	write_coord(start_[1])
	write_coord(start_[2])
	write_coord(end_[0])
	write_coord(end_[1])
	write_coord(end_[2])
	message_end()
	
	static tr, Float:End_Origin[3], Target
	engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr)	
	
	get_tr2(tr, TR_vecEndPos, End_Origin)
	Target = get_tr2(tr, TR_pHit)
	
	if(is_user_alive(Target) && ze_is_user_zombie(Target))
	{
		static Float:Origin[3]
		pev(Target, pev_origin, Origin)
		
		// Show some blood :)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
		write_byte(TE_BLOODSPRITE)
		write_coord(floatround(Origin[0])) 
		write_coord(floatround(Origin[1])) 
		write_coord(floatround(Origin[2])) 
		write_short(g_bloodspray)
		write_short(g_blood)
		write_byte(70)
		write_byte(random_num(1,2))
		message_end()
		
		
		ExecuteHamB(Ham_TakeDamage, Target, 0, id, random_float(get_pcvar_float(cvar_minigun_dmgrand_start), get_pcvar_float(cvar_minigun_dmgrand_end)), DMG_BULLET)
	}
	
	make_bullet(id, End_Origin)
}

stock make_bullet(id, Float:Origin[3])
{
	// Find target
	new target, body
	get_user_aiming(id, target, body, 999999)
	
	if(target > 0 && target <= get_maxplayers())
	{
		new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3]
		pev(id, pev_origin, fStart)
		
		// Get ids view direction
		velocity_by_aim(id, 64, fVel)
		
		// Calculate position where blood should be displayed
		fStart[0] = Origin[0]
		fStart[1] = Origin[1]
		fStart[2] = Origin[2]
		fEnd[0] = fStart[0]+fVel[0]
		fEnd[1] = fStart[1]+fVel[1]
		fEnd[2] = fStart[2]+fVel[2]
		
		// Draw traceline from victims origin into ids view direction to find
		// the location on the wall to put some blood on there
		new res
		engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res)
		get_tr2(res, TR_vecEndPos, fRes)
		
		// Show some blood :)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
		write_byte(TE_BLOODSPRITE)
		write_coord(floatround(fStart[0])) 
		write_coord(floatround(fStart[1])) 
		write_coord(floatround(fStart[2])) 
		write_short(g_bloodspray)
		write_short(g_blood)
		write_byte(70)
		write_byte(random_num(1,2))
		message_end()
		
		
		} else {
		new decal = 41
		
		// Check if the wall hit is an entity
		if(target)
		{
			// Put decal on an entity
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_DECAL)
			write_coord(floatround(Origin[0]))
			write_coord(floatround(Origin[1]))
			write_coord(floatround(Origin[2]))
			write_byte(decal)
			write_short(target)
			message_end()
			} else {
			// Put decal on "world" (a wall)
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_WORLDDECAL)
			write_coord(floatround(Origin[0]))
			write_coord(floatround(Origin[1]))
			write_coord(floatround(Origin[2]))
			write_byte(decal)
			message_end()
		}
		
		// Show sparcles
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		write_coord(floatround(Origin[0]))
		write_coord(floatround(Origin[1]))
		write_coord(floatround(Origin[2]))
		write_short(id)
		write_byte(decal)
		message_end()
	}
}

stock set_entity_anim(ent, anim)
{
	entity_set_float(ent, EV_FL_animtime, get_gametime())
	entity_set_float(ent, EV_FL_framerate, 1.0)
	entity_set_int(ent, EV_INT_sequence, anim)
}

stock client_printcolor(const id, const input[], any:...)
{
	new iCount = 1, iPlayers[32]
	static szMsg[191]
	
	vformat(szMsg, charsmax(szMsg), input, 3)
	replace_all(szMsg, 190, "!g", "^4")
	replace_all(szMsg, 190, "!y", "^1")
	replace_all(szMsg, 190, "!t", "^3")
	
	if(id) iPlayers[0] = id
	else get_players(iPlayers, iCount, "ch")
	
	for (new i = 0; i < iCount; i++)
	{
		if(is_user_connected(iPlayers[i]))
		{
			message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
			write_byte(iPlayers[i])
			write_string(szMsg)
			message_end()
		}
	}
}

ngamerz
Member
Member
Philippines
Posts: 37
Joined: 3 years ago
Location: Philippines From South Korea

#29

Post by ngamerz » 3 years ago

If you guys, can't do it. Please just post a tutorial for me, so I can do it by myself.

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

#30

Post by Raheem » 3 years ago

ngamerz wrote: 3 years ago If you guys, can't do it. Please just post a tutorial for me, so I can do it by myself.
Menu:
    1. #include <zombie_escape>
    2. #include <ze_vip>
    3.  
    4. native ze_give_salamander(id)
    5. native ze_give_stunrifle(id)
    6. native ze_give_bazzoka(id)
    7. native give_laserminigun(id)
    8. native give_minigun(id)
    9.  
    10. const OFFSET_CSMENUCODE = 205
    11. const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
    12.  
    13. public plugin_natives()
    14. {
    15.     register_native("ze_open_vip_menu", "native_ze_open_vip_menu", 1)
    16. }
    17.  
    18. public native_ze_open_vip_menu(id)
    19. {
    20.     if (!is_user_connected(id))
    21.         return -1
    22.  
    23.     if (!(get_user_flags(id) & ADMIN_LEVEL_H))
    24.         return false
    25.  
    26.     Show_Menu(id)
    27.     return true
    28. }
    29.  
    30. public plugin_init()
    31. {
    32.     register_plugin("[ZE] VIP Menu", "1.0", "Spi")
    33.     register_menu("VIP Menu", KEYSMENU, "Main_Menu")
    34. }
    35.  
    36. public Show_Menu(id)
    37. {
    38.     static szMenu[250]
    39.     new iLen
    40.    
    41.     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\rVIP Menu^n")
    42.    
    43.     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y1\d. \wKnife Menu")
    44.    
    45.     if (is_user_alive(id))
    46.     {
    47.         iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y2\d. \wGuns Menu")
    48.     }
    49.     else
    50.     {
    51.         iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d2. Guns Menu")
    52.     }
    53.  
    54.     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y0\d. \r%L", id, "EXIT")
    55.    
    56.     set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    57.     show_menu(id, KEYSMENU, szMenu, -1, "Main Menu")
    58. }
    59.  
    60. public Main_Menu(id, key)
    61. {
    62.     if (!is_user_connected(id))
    63.         return PLUGIN_HANDLED
    64.    
    65.     switch (key)
    66.     {
    67.         case 0: ze_open_knife_menu(id)
    68.         case 1:
    69.         {
    70.             if (is_user_alive(id))
    71.             {
    72.                     Open_HGunMenu(id)
    73.             }
    74.             else
    75.             {
    76.                 ze_colored_print(id, "%L", id, "DEAD_CANT_BUY_WEAPON")
    77.             }
    78.         }
    79.     }
    80.     return PLUGIN_HANDLED
    81. }
    82.  
    83. public Open_HGunMenu(id)
    84. {
    85.     new iMenu = menu_create("\rGuns Menu:^n^n", "HVIPMenu_Handler")
    86.    
    87.     menu_additem(iMenu, "Salamander")
    88.     menu_additem(iMenu, "Stun Rifle")
    89.     menu_additem(iMenu, "Bazzoka")
    90.     menu_additem(iMenu, "Laser Minigun")
    91.     menu_additem(iMenu, "Minigun")
    92.  
    93.     menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
    94.     menu_display(id, iMenu, 0)
    95. }
    96.  
    97. public HVIPMenu_Handler(id, iMenu, iItem)
    98. {
    99.     if (!is_user_connected(id))
    100.         return PLUGIN_CONTINUE
    101.  
    102.     switch (iItem)
    103.     {
    104.         case 0: ze_give_salamander(id)
    105.         case 1: ze_give_stunrifle(id)
    106.         case 2: ze_give_bazzoka(id)
    107.         case 3: give_laserminigun(id)
    108.         case 4: give_minigun(id)
    109.     }
    110.    
    111.     menu_destroy(iMenu)
    112.     return PLUGIN_HANDLED
    113. }
Salamander:
    1. #include <zombie_escape>
    2. #include <ze_vip>
    3. #include <amxconst>
    4. #include <fakemeta>
    5. #include <fakemeta_util>
    6. #include <cstrike>
    7. #include <xs>
    8. #include <engine>
    9. #include <fun>
    10.  
    11. #define PLUGIN "[CSO] Salamander"
    12. #define VERSION "2015"
    13. #define AUTHOR "Dias Pendragon Leon"
    14.  
    15. #define CSW_SAL CSW_M249
    16. #define weapon_sal "weapon_m249"
    17.  
    18. #define DAMAGE 38
    19. #define FIRE_SPEED 640.0
    20. #define RECOIL 0.0
    21.  
    22. #define MODEL_V "models/v_salamander.mdl"
    23. #define MODEL_P "models/p_salamander.mdl"
    24. #define MODEL_W "models/w_salamander.mdl"
    25. #define DEFAULT_W_MODEL "models/w_m249.mdl"
    26.  
    27. new const WeaponSounds[6][] =
    28. {
    29.     "weapons/flamegun-1.wav",
    30.     "weapons/flamegun_draw.wav",
    31.     "weapons/flamegun_clipin1.wav",
    32.     "weapons/flamegun_clipin2.wav",
    33.     "weapons/flamegun_clipout1.wav",
    34.     "weapons/flamegun_clipout2.wav"
    35. }
    36.  
    37. new const WeaponResources[7][] =
    38. {
    39.     "sprites/flame_puff01.spr",
    40.     "sprites/flame_burn01.spr",
    41.     "sprites/weapon_flamethrower.txt",
    42.     "sprites/640hud7_2.spr",
    43.     "sprites/640hud59_2.spr",
    44.     "sprites/640hud60_2.spr",
    45.     "sprites/smokepuff.spr"
    46. }
    47.  
    48. enum
    49. {
    50.     ANIM_IDLE = 0,
    51.     ANIM_SHOOT,
    52.     ANIM_SHOOT_END,
    53.     ANIM_RELOAD,
    54.     ANIM_DRAW
    55. }
    56.  
    57. // Marcros
    58. #define Get_BitVar(%1,%2)       (%1 & (1 << (%2 & 31)))
    59. #define Set_BitVar(%1,%2)       (%1 |= (1 << (%2 & 31)));
    60. #define UnSet_BitVar(%1,%2)     (%1 &= ~(1 << (%2 & 31)));
    61.  
    62. // Vars
    63. new g_Had_Salamander, g_WeaponEnt, g_SmokePuff_SprID, Float:g_PunchAngles[33]
    64. new g_MsgCurWeapon, g_MsgWeaponList
    65.  
    66. // Safety
    67. new g_HamBot
    68. new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
    69.  
    70. public plugin_init()
    71. {
    72.     register_plugin(PLUGIN, VERSION, AUTHOR)
    73.    
    74.     // Your highness!
    75.     Register_SafetyFunc()
    76.    
    77.     // Forward
    78.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
    79.     register_forward(FM_SetModel, "fw_SetModel")
    80.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
    81.     register_forward(FM_CmdStart, "fw_CmdStart")
    82.     register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
    83.    
    84.     // Engine
    85.     register_think("fireinsaigon", "fw_Fire_Think")
    86.     register_touch("fireinsaigon", "*", "fw_Fire_Touch")
    87.    
    88.     // Hams
    89.     RegisterHam(Ham_Item_Deploy, weapon_sal, "fw_Item_Deploy_Post", 1) 
    90.     RegisterHam(Ham_Item_AddToPlayer, weapon_sal, "fw_Item_AddToPlayer_Post", 1)
    91.    
    92.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
    93.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")
    94.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack")
    95.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack_Post", 1)
    96.    
    97.     g_MsgCurWeapon = get_user_msgid("CurWeapon")
    98.     g_MsgWeaponList = get_user_msgid("WeaponList")
    99.    
    100.     register_clcmd("weapon_flamethrower", "Hook_Weapon")
    101. }
    102.  
    103. public plugin_precache()
    104. {
    105.     precache_model(MODEL_V)
    106.     precache_model(MODEL_P)
    107.     precache_model(MODEL_W)
    108.    
    109.     for(new i = 0; i < sizeof(WeaponSounds); i++)
    110.         precache_sound(WeaponSounds[i])
    111.     for(new i = 0; i < sizeof(WeaponResources); i++)
    112.     {
    113.         if(i == 2) precache_generic(WeaponResources[i])
    114.         else if(i == 6) g_SmokePuff_SprID = precache_model(WeaponResources[i])
    115.         else precache_model(WeaponResources[i])
    116.     }
    117. }
    118.  
    119. public plugin_natives()
    120. {
    121.     register_native("ze_give_salamander", "native_ze_give_salamander", 1)
    122. }
    123.  
    124. public native_ze_give_salamander(id)
    125. {
    126.     Get_Salamander(id)
    127. }
    128.  
    129. public fw_PrecacheEvent_Post(type, const name[])
    130. {
    131.     if(equal("events/m249.sc", name))
    132.         g_WeaponEnt = get_orig_retval()
    133. }
    134.  
    135. public client_putinserver(id)
    136. {
    137.     Safety_Connected(id)
    138.     if(!g_HamBot && is_user_bot(id))
    139.     {
    140.         g_HamBot = 1
    141.         set_task(0.1, "Register_HamBot", id)
    142.     }
    143. }
    144.  
    145. public Register_HamBot(id)
    146. {
    147.     Register_SafetyFuncBot(id)
    148.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
    149. }
    150.  
    151. public client_disconnected(id)
    152. {
    153.     Safety_Disconnected(id)
    154. }
    155.  
    156. public Hook_Weapon(id)
    157. {
    158.     engclient_cmd(id, weapon_sal)
    159.     return PLUGIN_HANDLED
    160. }
    161.  
    162. public Get_Salamander(id)
    163. {
    164.     Set_BitVar(g_Had_Salamander, id)
    165.     give_item(id, weapon_sal)
    166.    
    167.     message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
    168.     write_byte(1)
    169.     write_byte(CSW_SAL)
    170.     write_byte(100)
    171.     message_end()
    172.    
    173.     cs_set_user_bpammo(id, CSW_SAL, 200)
    174. }
    175.  
    176. public Remove_Salamander(id)
    177. {
    178.     UnSet_BitVar(g_Had_Salamander, id)
    179. }
    180.  
    181. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
    182. {
    183.     if(!is_alive(id))
    184.         return FMRES_IGNORED
    185.     if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
    186.         return FMRES_IGNORED
    187.    
    188.     set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
    189.    
    190.     return FMRES_HANDLED
    191. }
    192.  
    193. public fw_SetModel(entity, model[])
    194. {
    195.     if(!pev_valid(entity))
    196.         return FMRES_IGNORED
    197.    
    198.     static szClassName[33]
    199.     pev(entity, pev_classname, szClassName, charsmax(szClassName))
    200.    
    201.     if(!equal(szClassName, "weaponbox"))
    202.         return FMRES_IGNORED
    203.    
    204.     static id
    205.     id = pev(entity, pev_owner)
    206.    
    207.     if(equal(model, DEFAULT_W_MODEL))
    208.     {
    209.         static weapon; weapon = fm_find_ent_by_owner(-1, weapon_sal, entity)
    210.        
    211.         if(!pev_valid(weapon))
    212.             return FMRES_IGNORED
    213.        
    214.         if(Get_BitVar(g_Had_Salamander, id))
    215.         {
    216.             set_pev(weapon, pev_impulse, 442015)
    217.             engfunc(EngFunc_SetModel, entity, MODEL_W)
    218.            
    219.             UnSet_BitVar(g_Had_Salamander, id)
    220.            
    221.             return FMRES_SUPERCEDE
    222.         }
    223.     }
    224.  
    225.     return FMRES_IGNORED
    226. }
    227.  
    228. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
    229. {
    230.     if(!is_alive(invoker))
    231.         return FMRES_IGNORED
    232.     if(get_player_weapon(invoker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, invoker))
    233.         return FMRES_IGNORED   
    234.     if(eventid == g_WeaponEnt)
    235.     {
    236.         playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
    237.         if(pev(invoker, pev_weaponanim) != ANIM_SHOOT) Set_WeaponAnim(invoker, ANIM_SHOOT)
    238.        
    239.         return FMRES_SUPERCEDE
    240.     }
    241.    
    242.     return FMRES_HANDLED
    243. }
    244.  
    245. public fw_CmdStart(id, uc_handle, seed)
    246. {
    247.     if(!is_alive(id))
    248.         return FMRES_IGNORED
    249.     if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
    250.         return FMRES_IGNORED
    251.        
    252.     static PressedButton
    253.     PressedButton = get_uc(uc_handle, UC_Buttons)
    254.    
    255.     if(!(PressedButton & IN_ATTACK))
    256.     {
    257.         if((pev(id, pev_oldbuttons) & IN_ATTACK) && pev(id, pev_weaponanim) == ANIM_SHOOT)
    258.         {
    259.             static weapon; weapon = fm_get_user_weapon_entity(id, CSW_SAL)
    260.             if(pev_valid(weapon)) set_pdata_float(weapon, 48, 2.0, 4)
    261.            
    262.             Set_WeaponAnim(id, ANIM_SHOOT_END)
    263.             Make_FireSmoke(id)
    264.         }
    265.     }
    266.        
    267.     return FMRES_HANDLED
    268. }
    269.  
    270. public Make_FireSmoke(id)
    271. {
    272.     static Float:Origin[3]
    273.     get_position(id, 40.0, 5.0, -15.0, Origin)
    274.    
    275.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    276.     write_byte(TE_EXPLOSION)
    277.     engfunc(EngFunc_WriteCoord, Origin[0])
    278.     engfunc(EngFunc_WriteCoord, Origin[1])
    279.     engfunc(EngFunc_WriteCoord, Origin[2])
    280.     write_short(g_SmokePuff_SprID)
    281.     write_byte(5)
    282.     write_byte(30)
    283.     write_byte(14)
    284.     message_end()
    285. }
    286.  
    287. public fw_Item_Deploy_Post(Ent)
    288. {
    289.     if(pev_valid(Ent) != 2)
    290.         return
    291.     static Id; Id = get_pdata_cbase(Ent, 41, 4)
    292.     if(get_pdata_cbase(Id, 373) != Ent)
    293.         return
    294.     if(!Get_BitVar(g_Had_Salamander, Id))
    295.         return
    296.    
    297.     set_pev(Id, pev_viewmodel2, MODEL_V)
    298.     set_pev(Id, pev_weaponmodel2, MODEL_P)
    299. }
    300.  
    301. public fw_Item_AddToPlayer_Post(Ent, id)
    302. {
    303.     if(!pev_valid(Ent))
    304.         return HAM_IGNORED
    305.        
    306.     if(pev(Ent, pev_impulse) == 442015)
    307.     {
    308.         Set_BitVar(g_Had_Salamander, id)
    309.         set_pev(Ent, pev_impulse, 0)
    310.     }
    311.    
    312.     if(Get_BitVar(g_Had_Salamander, id))
    313.     {
    314.         message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, id)
    315.         write_string("weapon_flamethrower")
    316.         write_byte(3)
    317.         write_byte(200)
    318.         write_byte(-1)
    319.         write_byte(-1)
    320.         write_byte(0)
    321.         write_byte(4)
    322.         write_byte(CSW_SAL)
    323.         write_byte(0)
    324.         message_end()  
    325.     }
    326.    
    327.     return HAM_HANDLED 
    328. }
    329.  
    330. public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
    331. {
    332.     if(!is_alive(Attacker))
    333.         return HAM_IGNORED
    334.     if(get_player_weapon(Attacker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, Attacker))
    335.         return HAM_IGNORED
    336.    
    337.     return HAM_SUPERCEDE
    338. }
    339.  
    340. public CreateFire(id, Float:Speed)
    341. {
    342.     new iEnt = create_entity("env_sprite")
    343.     if(!pev_valid(iEnt)) return
    344.    
    345.     static Float:vfAngle[3], Float:MyOrigin[3]
    346.     static Float:Origin[3], Float:TargetOrigin[3], Float:Velocity[3]
    347.  
    348.     get_position(id, 40.0, 5.0, -5.0, Origin)
    349.     get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
    350.    
    351.     pev(id, pev_angles, vfAngle)
    352.     pev(id, pev_origin, MyOrigin)
    353.    
    354.     vfAngle[2] = float(random(18) * 20)
    355.  
    356.     // set info for ent
    357.     set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
    358.     set_pev(iEnt, pev_rendermode, kRenderTransAdd)
    359.     set_pev(iEnt, pev_renderamt, 160.0)
    360.     set_pev(iEnt, pev_fuser1, get_gametime() + 1.0) // time remove
    361.     set_pev(iEnt, pev_scale, 0.25)
    362.     set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
    363.    
    364.     entity_set_string(iEnt, EV_SZ_classname, "fireinsaigon")
    365.     engfunc(EngFunc_SetModel, iEnt, WeaponResources[0])
    366.     set_pev(iEnt, pev_mins, Float:{-1.0, -1.0, -1.0})
    367.     set_pev(iEnt, pev_maxs, Float:{1.0, 1.0, 1.0})
    368.     set_pev(iEnt, pev_origin, Origin)
    369.     set_pev(iEnt, pev_gravity, 0.01)
    370.     set_pev(iEnt, pev_angles, vfAngle)
    371.     set_pev(iEnt, pev_solid, SOLID_TRIGGER)
    372.     set_pev(iEnt, pev_owner, id)   
    373.     set_pev(iEnt, pev_frame, 0.0)
    374.     set_pev(iEnt, pev_iuser2, get_user_team(id))
    375.  
    376.     get_speed_vector(Origin, TargetOrigin, Speed, Velocity)
    377.     set_pev(iEnt, pev_velocity, Velocity)
    378.    
    379.     emit_sound(iEnt, CHAN_BODY, WeaponSounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
    380. }
    381.  
    382. public fw_Fire_Think(iEnt)
    383. {
    384.     if(!pev_valid(iEnt))
    385.         return
    386.    
    387.     static Float:fFrame, Float:fScale
    388.     pev(iEnt, pev_frame, fFrame)
    389.     pev(iEnt, pev_scale, fScale)
    390.  
    391.     // effect exp
    392.     if(pev(iEnt, pev_movetype) == MOVETYPE_NONE)
    393.     {
    394.         fFrame += 1.0
    395.         fScale += 0.1
    396.         fScale = floatmin(fScale, 1.75)
    397.  
    398.         if(fFrame > 21.0)
    399.         {
    400.             engfunc(EngFunc_RemoveEntity, iEnt)
    401.             return
    402.         }
    403.        
    404.         set_pev(iEnt, pev_nextthink, get_gametime() + 0.025)
    405.     } else {
    406.         fFrame += 1.25
    407.         fFrame = floatmin(21.0, fFrame)
    408.         fScale += 0.15
    409.         fScale = floatmin(fScale, 1.75)
    410.        
    411.         set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
    412.     }
    413.  
    414.     set_pev(iEnt, pev_frame, fFrame)
    415.     set_pev(iEnt, pev_scale, fScale)
    416.    
    417.     // time remove
    418.     static Float:fTimeRemove
    419.     pev(iEnt, pev_fuser1, fTimeRemove)
    420.     if (get_gametime() >= fTimeRemove)
    421.     {
    422.         engfunc(EngFunc_RemoveEntity, iEnt)
    423.         return;
    424.     }
    425. }
    426.  
    427. public fw_Fire_Touch(ent, id)
    428. {
    429.     if(!pev_valid(ent))
    430.         return
    431.        
    432.     if(pev_valid(id))
    433.     {
    434.         static Classname[32]
    435.         pev(id, pev_classname, Classname, sizeof(Classname))
    436.        
    437.         if(equal(Classname, "fireinsaigon")) return
    438.         else if(is_alive(id))
    439.         {
    440.             static EntTeam; EntTeam = pev(ent, pev_iuser2)
    441.             if(get_user_team(id) != EntTeam)
    442.             {
    443.                 static Attacker; Attacker = pev(ent, pev_owner)
    444.                 if(is_connected(Attacker))
    445.                 {
    446.                     ExecuteHamB(Ham_TakeDamage, id, 0, Attacker, float(DAMAGE), DMG_BULLET)
    447.                 }
    448.             }
    449.         }
    450.     }
    451.        
    452.     set_pev(ent, pev_movetype, MOVETYPE_NONE)
    453.     set_pev(ent, pev_solid, SOLID_NOT)
    454. }
    455.  
    456. public fw_Weapon_PrimaryAttack(ent)
    457. {
    458.     static id; id = pev(ent, pev_owner)
    459.     pev(id, pev_punchangle, g_PunchAngles[id])
    460.    
    461.     return HAM_IGNORED 
    462. }
    463.  
    464. public fw_Weapon_PrimaryAttack_Post(ent)
    465. {
    466.     static id; id = pev(ent, pev_owner)
    467.  
    468.     if(get_player_weapon(id) == CSW_SAL && Get_BitVar(g_Had_Salamander, id) && cs_get_weapon_ammo(ent) > 0)
    469.     {
    470.         static Float:push[3]
    471.         pev(id, pev_punchangle, push)
    472.         xs_vec_sub(push, g_PunchAngles[id], push)
    473.        
    474.         xs_vec_mul_scalar(push, RECOIL, push)
    475.         xs_vec_add(push, g_PunchAngles[id], push)
    476.         set_pev(id, pev_punchangle, push)
    477.        
    478.         CreateFire(id, FIRE_SPEED)
    479.     } else {
    480.         static Float:push[3]
    481.         pev(id, pev_punchangle, push)
    482.         xs_vec_sub(push, g_PunchAngles[id], push)
    483.        
    484.         xs_vec_mul_scalar(push, 0.0, push)
    485.         xs_vec_add(push, g_PunchAngles[id], push)
    486.         set_pev(id, pev_punchangle, push)
    487.     }
    488.    
    489.     return HAM_IGNORED 
    490. }
    491.  
    492. stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
    493. {
    494.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
    495.     if(!pev_valid(entwpn))
    496.         return
    497.        
    498.     set_pdata_float(entwpn, 46, TimeIdle, 4)
    499.     set_pdata_float(entwpn, 47, TimeIdle, 4)
    500.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
    501. }
    502.  
    503. stock Set_PlayerNextAttack(id, Float:nexttime)
    504. {
    505.     set_pdata_float(id, 83, nexttime, 5)
    506. }
    507.  
    508. stock Set_WeaponAnim(id, anim)
    509. {
    510.     set_pev(id, pev_weaponanim, anim)
    511.    
    512.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
    513.     write_byte(anim)
    514.     write_byte(pev(id, pev_body))
    515.     message_end()
    516. }
    517.  
    518. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
    519. {
    520.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    521.    
    522.     pev(id, pev_origin, vOrigin)
    523.     pev(id, pev_view_ofs,vUp) //for player
    524.     xs_vec_add(vOrigin,vUp,vOrigin)
    525.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    526.    
    527.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
    528.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
    529.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
    530.    
    531.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    532.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    533.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    534. }
    535.  
    536. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
    537. {
    538.     new_velocity[0] = origin2[0] - origin1[0]
    539.     new_velocity[1] = origin2[1] - origin1[1]
    540.     new_velocity[2] = origin2[2] - origin1[2]
    541.     new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    542.     new_velocity[0] *= num
    543.     new_velocity[1] *= num
    544.     new_velocity[2] *= num
    545.    
    546.     return 1;
    547. }
    548.  
    549. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
    550. {
    551.     static Float:vfEnd[3], viEnd[3]
    552.     get_user_origin(id, viEnd, 3)  
    553.     IVecFVec(viEnd, vfEnd)
    554.    
    555.     static Float:fOrigin[3], Float:fAngle[3]
    556.    
    557.     pev(id, pev_origin, fOrigin)
    558.     pev(id, pev_view_ofs, fAngle)
    559.    
    560.     xs_vec_add(fOrigin, fAngle, fOrigin)
    561.    
    562.     static Float:fAttack[3]
    563.    
    564.     xs_vec_sub(vfEnd, fOrigin, fAttack)
    565.     xs_vec_sub(vfEnd, fOrigin, fAttack)
    566.    
    567.     static Float:fRate
    568.    
    569.     fRate = fDis / vector_length(fAttack)
    570.     xs_vec_mul_scalar(fAttack, fRate, fAttack)
    571.    
    572.     xs_vec_add(fOrigin, fAttack, output)
    573. }
    574.  
    575. /* ===============================
    576. ------------- SAFETY -------------
    577. =================================*/
    578. public Register_SafetyFunc()
    579. {
    580.     register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
    581.    
    582.     RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
    583.     RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
    584. }
    585.  
    586. public Register_SafetyFuncBot(id)
    587. {
    588.     RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
    589.     RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
    590. }
    591.  
    592. public Safety_Connected(id)
    593. {
    594.     Set_BitVar(g_IsConnected, id)
    595.     UnSet_BitVar(g_IsAlive, id)
    596.    
    597.     g_PlayerWeapon[id] = 0
    598. }
    599.  
    600. public Safety_Disconnected(id)
    601. {
    602.     UnSet_BitVar(g_IsConnected, id)
    603.     UnSet_BitVar(g_IsAlive, id)
    604.    
    605.     g_PlayerWeapon[id] = 0
    606. }
    607.  
    608. public Safety_CurWeapon(id)
    609. {
    610.     if(!is_alive(id))
    611.         return
    612.        
    613.     static CSW; CSW = read_data(2)
    614.     if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
    615. }
    616.  
    617. public fw_Safety_Spawn_Post(id)
    618. {
    619.     if(!is_user_alive(id))
    620.         return
    621.        
    622.     Set_BitVar(g_IsAlive, id)
    623. }
    624.  
    625. public fw_Safety_Killed_Post(id)
    626. {
    627.     UnSet_BitVar(g_IsAlive, id)
    628. }
    629.  
    630. public is_connected(id)
    631. {
    632.     if(!(1 <= id <= 32))
    633.         return 0
    634.     if(!Get_BitVar(g_IsConnected, id))
    635.         return 0
    636.  
    637.     return 1
    638. }
    639.  
    640. public is_alive(id)
    641. {
    642.     if(!is_connected(id))
    643.         return 0
    644.     if(!Get_BitVar(g_IsAlive, id))
    645.         return 0
    646.        
    647.     return 1
    648. }
    649.  
    650. public get_player_weapon(id)
    651. {
    652.     if(!is_alive(id))
    653.         return 0
    654.    
    655.     return g_PlayerWeapon[id]
    656. }
    657.  
    658.  
    659. // ===================== STOCK... =======================
    660. // ======================================================
StunRifle:
    1. /*
    2. *   Stun Rifle is a CSO weapon, More information about it: http://cso.wikia.com/wiki/Stun_Rifle
    3. *  
    4. *   This plugin written by me: Raheem (The basic things for any weapon not written by me)
    5. *
    6. *   I tried to simulate it same as in CSO, I think it's nearly same else simple things
    7. *   That will be done in next versions.
    8. *
    9. *   Version 1.0 creation date: 16-6-2018
    10. *   Version 1.0 publication date: 20-6-2018
    11. *
    12. *   Last update: 4-8-2018
    13. *
    14. *   TODO List: Fix any problem, include good ideas
    15. */
    16.  
    17. #include <zombie_escape>
    18. #include <fakemeta_util>
    19.  
    20. #define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
    21.  
    22. // CWeaponBox
    23. #define m_rgpPlayerItems_CWeaponBox 34
    24.  
    25. // CBasePlayerItem
    26. #define m_pPlayer 41
    27. #define m_pNext 42
    28. #define m_iId 43
    29.  
    30. // CBasePlayerWeapon
    31. #define m_flNextPrimaryAttack 46
    32. #define m_flNextSecondaryAttack 47
    33. #define m_flTimeWeaponIdle 48
    34. #define m_iPrimaryAmmoType 49
    35. #define m_iClip 51
    36. #define m_fInReload 54
    37. #define m_iWeaponState 74
    38.  
    39. // CBaseMonster
    40. #define m_flNextAttack 83
    41.  
    42. // CBasePlayer
    43. #define m_iFOV 363
    44. #define m_rpgPlayerItems 367
    45. #define m_pActiveItem 373
    46. #define m_rgAmmo 376
    47.  
    48. /*-----------------------------------------------------*/
    49.  
    50. #define WEAPON_KEY 776544229
    51. #define WEAPON_OLD "weapon_ak47"
    52. #define WEAPON_NEW "weapon_stunrifle"
    53.  
    54. /*-----------------------------------------------------*/
    55.  
    56. new const WPN_SPRITES[][] =
    57. {
    58.     "sprites/weapon_stunrifle.txt",
    59.     "sprites/640hud169.spr",
    60.     "sprites/640hud7.spr"
    61. }
    62.  
    63. new const g_szSounds[][] =
    64. {
    65.     "weapons/stunrifle-1.wav",
    66.     "weapons/stunrifle_drawa.wav",
    67.     "weapons/stunrifle_drawb.wav",
    68.     "weapons/stunrifle_drawc.wav",
    69.     "weapons/stunrifle_reloada.wav",
    70.     "weapons/stunrifle_reloadb.wav",
    71.     "weapons/stunrifle_reloadc.wav",
    72.     "weapons/stunrifle_idlea.wav",
    73.     "weapons/stunrifle_idleb.wav",
    74.     "weapons/stunrifle_idlec.wav",
    75.     "weapons/stunrifle_lowbattery.wav",
    76.     "weapons/stunrifle-2.wav"
    77. }
    78.  
    79. new const iWeaponList[] =
    80. {  
    81.     2, 30, -1, -1, 0, 1, CSW_AK47, 0
    82. }
    83.  
    84. #define WEAPON_MODEL_V "models/stunrifle/v_stunrifle.mdl"
    85. #define WEAPON_MODEL_P "models/stunrifle/p_stunrifle.mdl"
    86. #define WEAPON_MODEL_W "models/stunrifle/w_stunrifle.mdl"
    87. #define WEAPON_BODY 0
    88.  
    89. /*-----------------------------------------------------*/
    90.  
    91. #define WEAPON_COST 0
    92.  
    93. #define WEAPON_CLIP 30
    94. #define WEAPON_AMMO 90
    95. #define WEAPON_RATE 0.098
    96. #define WEAPON_RECOIL 0.96
    97. #define WEAPON_DAMAGE 1.0 // AK47 damage multiplied by this factor
    98.  
    99. #define WEAPON_RATE_EX 0.169
    100. #define WEAPON_RECOIL_EX 0.79
    101. #define WEAPON_DAMAGE_EX 1.3
    102. #define WEAPON_NATIVE "native_give_weapon_stunrifle"
    103.  
    104. /*-----------------------------------------------------*/
    105.  
    106. // Animations
    107. #define ANIM_IDLE_A 0
    108. #define ANIM_IDLE_B 1
    109. #define ANIM_IDLE_C 2
    110. #define ANIM_ATTACK_A 3
    111. #define ANIM_ATTACK_B 4
    112. #define ANIM_ATTACK_C 5
    113. #define ANIM_RELOAD_A 6
    114. #define ANIM_RELOAD_B 7
    115. #define ANIM_RELOAD_C 8
    116. #define ANIM_DRAW_A 9
    117. #define ANIM_DRAW_B 10
    118. #define ANIM_DRAW_C 11
    119.  
    120. // from model: Frames / FPS
    121. #define ANIM_IDLE_TIME_A 90/30.0
    122. #define ANIM_SHOOT_TIME_A 31/30.0
    123. #define ANIM_RELOAD_TIME_A 101/30.0
    124. #define ANIM_DRAW_TIME_A 46/30.0
    125. #define ANIM_IDLE_TIME_B 90/30.0
    126. #define ANIM_SHOOT_TIME_B 31/30.0
    127. #define ANIM_RELOAD_TIME_B 101/30.0
    128. #define ANIM_DRAW_TIME_B 46/30.0
    129. #define ANIM_IDLE_TIME_C 90/30.0
    130. #define ANIM_SHOOT_TIME_C 31/30.0
    131. #define ANIM_RELOAD_TIME_C 101/30.0
    132. #define ANIM_DRAW_TIME_C 46/30.0
    133.  
    134. new g_AllocString_V,
    135.     g_AllocString_P,
    136.     g_AllocString_E,
    137.  
    138.     HamHook: g_fw_TraceAttack[4],
    139.    
    140.     g_iMsgID_Weaponlist,
    141.     g_iStoredEnergy[33],
    142.     bool:g_bHasStunRifle[33],
    143.     g_pCvarBarFillTime,
    144.     g_pCvarRadius,
    145.     g_pCvarElecDmg,
    146.     g_iLigSpr,
    147.     g_iEffSpr,
    148.     g_iEff2Spr,
    149.     bool:g_bReloading[33],
    150.     g_iAppearTimes[33]
    151.  
    152. public plugin_init()
    153. {
    154.     register_plugin("[ZE] Stun Rifle", "1.1", "Raheem");
    155.    
    156.     RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "fw_Item_Deploy_Post", 1);
    157.     RegisterHam(Ham_Item_PostFrame, WEAPON_OLD, "fw_Item_PostFrame");
    158.     RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "fw_Item_AddToPlayer_Post", 1);
    159.     RegisterHam(Ham_Weapon_Reload, WEAPON_OLD, "fw_Weapon_Reload");
    160.     RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_OLD, "fw_Weapon_WeaponIdle");
    161.     RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_OLD, "fw_Weapon_PrimaryAttack");
    162.    
    163.     g_fw_TraceAttack[0] = RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
    164.     g_fw_TraceAttack[1] = RegisterHam(Ham_TraceAttack, "info_target",    "fw_TraceAttack");
    165.     g_fw_TraceAttack[2] = RegisterHam(Ham_TraceAttack, "player",         "fw_TraceAttack");
    166.     g_fw_TraceAttack[3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
    167.     fm_ham_hook(false);
    168.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
    169.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
    170.     register_forward(FM_SetModel, "fw_SetModel");
    171.    
    172.     g_pCvarBarFillTime = register_cvar("stunrifle_barfill_time", "5") // Bar fill time in seconds
    173.     g_pCvarRadius = register_cvar("stunrifle_radius", "500") // elec radius
    174.     g_pCvarElecDmg = register_cvar("stunrifle_electricity_dmg", "10") // electricity damage - lowest damage for 1 bar only
    175.    
    176.     register_clcmd(WEAPON_NEW, "HookSelect");
    177.     g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
    178. }
    179.  
    180. public plugin_precache()
    181. {
    182.     g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_V);
    183.     g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_P);
    184.     g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD);
    185.     engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_V);
    186.     engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_P);
    187.     engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_W);
    188.    
    189.     for (new i = 0; i < sizeof g_szSounds; i++) engfunc(EngFunc_PrecacheSound, g_szSounds[i]);
    190.    
    191.     for(new i = 0; i < sizeof WPN_SPRITES;i++) precache_generic(WPN_SPRITES[i]);
    192.    
    193.     g_iLigSpr = precache_model("sprites/lightning.spr");
    194.     g_iEffSpr = precache_model("sprites/ef_buffak_hit.spr");
    195.     g_iEff2Spr = precache_model("sprites/muzzleflash67.spr");
    196. }
    197.  
    198. public plugin_natives()
    199. {
    200.     register_native("ze_give_stunrifle", "native_ze_give_stunrifle", 1)
    201. }
    202.  
    203. public native_ze_give_stunrifle(id)
    204. {
    205.     give(id)
    206. }
    207.  
    208. public HookSelect(iPlayer)
    209. {
    210.     engclient_cmd(iPlayer, WEAPON_OLD);
    211. }
    212.  
    213. public give(id)
    214. {
    215.     give_weapon_stunrifle(id)
    216. }
    217.  
    218. public give_weapon_stunrifle(iPlayer)
    219. {
    220.     static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
    221.     if(iEnt <= 0) return 0;
    222.     set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
    223.     set_pev(iEnt, pev_impulse, WEAPON_KEY);
    224.     ExecuteHam(Ham_Spawn, iEnt);
    225.     UTIL_DropWeapon(iPlayer, 1);
    226.     if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEnt)) {
    227.         engfunc(EngFunc_RemoveEntity, iEnt);
    228.         return 0;
    229.     }
    230.     ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlayer);
    231.     set_pdata_int(iEnt, m_iClip, WEAPON_CLIP, 4);
    232.     new iAmmoType = m_rgAmmo +get_pdata_int(iEnt, m_iPrimaryAmmoType, 4);
    233.     if(get_pdata_int(iPlayer, m_rgAmmo, 5) < WEAPON_AMMO)
    234.     set_pdata_int(iPlayer, iAmmoType, WEAPON_AMMO, 5);
    235.     emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    236.     g_iStoredEnergy[iPlayer] = 0;
    237.     g_bHasStunRifle[iPlayer] = true;
    238.     set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", iPlayer, _, _, "a", 6)
    239.     return 1;
    240. }
    241.  
    242. public plugin_natives()
    243. {
    244.     register_native(WEAPON_NATIVE, "give_weapon_stunrifle", 1);
    245. }
    246.  
    247. public fw_Item_Deploy_Post(iItem)
    248. {
    249.     if(!CustomItem(iItem)) return;
    250.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    251.  
    252.     set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
    253.     set_pev_string(iPlayer, pev_weaponmodel2, g_AllocString_P);
    254.    
    255.     if (g_iStoredEnergy[iPlayer] == 0)
    256.     {
    257.         // Draw A
    258.         UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_A);
    259.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    260.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_A, 5);
    261.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_A, 4);
    262.     }
    263.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    264.     {
    265.         // Draw B
    266.         UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_B);
    267.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    268.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_B, 5);
    269.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_B, 4);
    270.     }
    271.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    272.     {
    273.         // Draw C
    274.         UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_C);
    275.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    276.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_C, 5);
    277.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_C, 4);
    278.     }
    279. }
    280.  
    281. public fw_Item_PostFrame(iItem)
    282. {
    283.     if(!CustomItem(iItem)) return HAM_IGNORED;
    284.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    285.     if(get_pdata_int(iItem, m_fInReload, 4) == 1) {
    286.         static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
    287.         static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
    288.         static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, 5);
    289.         static j; j = min(WEAPON_CLIP - iClip, iAmmo);
    290.         set_pdata_int(iItem, m_iClip, iClip+j, 4);
    291.         set_pdata_int(iPlayer, iAmmoType, iAmmo-j, 5);
    292.         set_pdata_int(iItem, m_fInReload, 0, 4);
    293.     }
    294.     else switch(get_pdata_int(iItem, m_iWeaponState, 4) ) {
    295.         case 0: {
    296.             if(get_pdata_float(iItem, m_flNextSecondaryAttack, 4) <= 0.0)
    297.             if(pev(iPlayer, pev_button) & IN_ATTACK2) {
    298.                 set_pdata_int(iPlayer, m_iFOV, get_pdata_int(iPlayer, m_iFOV, 5) == 90 ? 60 : 90);
    299.                 set_pdata_float(iItem, m_flNextSecondaryAttack, 0.3, 4);
    300.             }
    301.         }
    302.     }
    303.    
    304.     return HAM_IGNORED;
    305. }
    306.  
    307. public fw_Item_AddToPlayer_Post(iItem, iPlayer)
    308. {
    309.     switch(pev(iItem, pev_impulse)) {
    310.         case WEAPON_KEY: {
    311.         s_weaponlist(iPlayer, true);
    312.         g_bHasStunRifle[iPlayer] = true;
    313.        
    314.         if (g_iStoredEnergy[iPlayer] < 6)
    315.         {
    316.             set_task(101/30.0, "OnReloadFinished", iPlayer);
    317.         }
    318.         else if (g_iStoredEnergy[iPlayer] == 6)
    319.         {
    320.             client_print(iPlayer, print_center, "Your Stun Rifle is fully charged!")
    321.         }
    322.         }
    323.         case 0: s_weaponlist(iPlayer, false);
    324.     }
    325. }
    326.  
    327. public ze_user_infected(infected)
    328. {
    329.     if (g_bHasStunRifle[infected])
    330.     {
    331.         g_bHasStunRifle[infected] = false
    332.         g_iStoredEnergy[infected] = 0;
    333.     }
    334. }
    335.  
    336. public ze_user_humanized(id)
    337. {
    338.     g_bHasStunRifle[id] = false
    339.     g_iStoredEnergy[id] = 0;
    340. }
    341.  
    342. public fw_Weapon_Reload(iItem)
    343. {
    344.     if(!CustomItem(iItem)) return HAM_IGNORED;
    345.     static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
    346.     if(iClip >= WEAPON_CLIP) return HAM_SUPERCEDE;
    347.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    348.     static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
    349.     if(get_pdata_int(iPlayer, iAmmoType, 5) <= 0) return HAM_SUPERCEDE
    350.     if(get_pdata_int(iPlayer, m_iFOV, 5) != 90) set_pdata_int(iPlayer, m_iFOV, 90, 5);
    351.  
    352.     set_pdata_int(iItem, m_iClip, 0, 4);
    353.     ExecuteHam(Ham_Weapon_Reload, iItem);
    354.     set_pdata_int(iItem, m_iClip, iClip, 4);
    355.  
    356.     set_pdata_int(iItem, m_fInReload, 1, 4);
    357.    
    358.     g_bReloading[iPlayer] = true;
    359.     set_task(3.0, "AttackTask", iPlayer+444)
    360.  
    361.     if (g_iStoredEnergy[iPlayer] == 0)
    362.     {
    363.         // Reload A
    364.         set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_A, 4);
    365.         set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_A, 4);
    366.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_A, 4);
    367.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_A, 5);
    368.        
    369.         UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_A);
    370.        
    371.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    372.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[10], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    373.     }
    374.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    375.     {
    376.         // Reload B
    377.         set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_B, 4);
    378.         set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_B, 4);
    379.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_B, 4);
    380.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_B, 5);
    381.        
    382.         UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_B);
    383.        
    384.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    385.        
    386.         if (notEmpty(iPlayer))
    387.         {
    388.             emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    389.         }
    390.     }
    391.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    392.     {
    393.         // Reload C
    394.         set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_C, 4);
    395.         set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_C, 4);
    396.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_C, 4);
    397.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_C, 5);
    398.        
    399.         UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_C);
    400.        
    401.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    402.        
    403.         if (notEmpty(iPlayer))
    404.         {
    405.             emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    406.         }
    407.     }
    408.    
    409.     // Set task to recharge the battary
    410.     remove_task(iPlayer)
    411.     set_task(101/30.0, "OnReloadFinished", iPlayer)
    412.  
    413.     return HAM_SUPERCEDE;
    414. }
    415.  
    416. public AttackTask(taskid)
    417. {
    418.     g_bReloading[taskid - 444] = false;
    419.        
    420.     // After reload reset the stored energy
    421.     g_iStoredEnergy[taskid - 444] = 0;
    422.    
    423.     g_iAppearTimes[taskid - 444] = 0;
    424. }
    425.  
    426. public client_PreThink(id)
    427. {
    428.     if (g_bReloading[id] && g_bHasStunRifle[id] && (get_user_weapon(id) == CSW_AK47))
    429.     {
    430.         if (g_iStoredEnergy[id] == 0)
    431.         {
    432.             // Reload A
    433.            
    434.         }
    435.         else if (g_iStoredEnergy[id] > 0 && g_iStoredEnergy[id] <= 3)
    436.         {
    437.             // Reload B
    438.             static Float:flOrigin[3]
    439.             pev(id, pev_origin, flOrigin)
    440.             new iVictim = -1;
    441.            
    442.             while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
    443.             {
    444.                 if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
    445.                     continue
    446.                
    447.                 static Float:flVecOrigin[3];
    448.                 pev(iVictim, pev_origin, flVecOrigin);
    449.                    
    450.                 ElectricBeam(id, flVecOrigin);
    451.                    
    452.                 ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
    453.            
    454.                 fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
    455.                 set_task(101/30.0, "Delete_Glow", iVictim+4444);
    456.             }
    457.         }
    458.         else if (g_iStoredEnergy[id] > 3 && g_iStoredEnergy[id] <= 6)
    459.         {
    460.             // Reload C
    461.             static Float:flOrigin[3]
    462.             pev(id, pev_origin, flOrigin)
    463.             new iVictim = -1;
    464.            
    465.             while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
    466.             {
    467.                 if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
    468.                     continue
    469.                
    470.                 static Float:flVecOrigin[3]
    471.                 pev(iVictim, pev_origin, flVecOrigin)
    472.                
    473.                 ElectricBeam(id, flVecOrigin)
    474.                
    475.                 ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
    476.                
    477.                 fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
    478.                 set_task(101/30.0, "Delete_Glow", iVictim+4444);
    479.             }
    480.         }
    481.     }
    482. }
    483.  
    484. public Delete_Glow(taskid)
    485. {
    486.     new id = taskid - 4444;
    487.     fm_set_user_rendering(id);
    488. }
    489.  
    490. public OnReloadFinished(id)
    491. {
    492.     remove_task(id)
    493.     set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", id, _, _, "a", 6)
    494. }
    495.  
    496. public RechargeTask(id)
    497. {
    498.     if (!g_bHasStunRifle[id])
    499.         return
    500.    
    501.     // Increase one bar every x time
    502.     g_iStoredEnergy[id]++
    503.    
    504.     new szBars[100];
    505.    
    506.     switch(g_iStoredEnergy[id])
    507.     {
    508.         case 1:
    509.         {
    510.             szBars = "[ |           ]";
    511.         }
    512.         case 2:
    513.         {
    514.             szBars = "[ | |         ]";
    515.         }
    516.         case 3:
    517.         {
    518.             szBars = "[ | | |       ]";
    519.         }
    520.         case 4:
    521.         {
    522.             szBars = "[ | | | |     ]";
    523.         }
    524.         case 5:
    525.         {
    526.             szBars = "[ | | | | |   ]";
    527.         }
    528.         case 6:
    529.         {
    530.             szBars = "[ | | | | | | ]";
    531.         }
    532.     }
    533.    
    534.     set_dhudmessage(51, 153, 255, -1.0, -0.16, 0, 0.0, get_pcvar_float(g_pCvarBarFillTime) - 0.2)
    535.     show_dhudmessage(id, "Stun Rifle Battary: %s", szBars)
    536.    
    537.     if (g_iStoredEnergy[id] == 6)
    538.     {
    539.         client_print(id, print_center, "Your Stun Rifle is fully charged!")
    540.         remove_task(id)
    541.     }
    542. }
    543.  
    544. public fw_Weapon_WeaponIdle(iItem)
    545. {
    546.     if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
    547.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    548.  
    549.     if (g_iStoredEnergy[iPlayer] == 0)
    550.     {
    551.         // Idle A
    552.         UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_A);
    553.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_A, 4);
    554.        
    555.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[7], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    556.     }
    557.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    558.     {
    559.         // Idle B
    560.         UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_B);
    561.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_B, 4);
    562.        
    563.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[8], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    564.     }
    565.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    566.     {
    567.         // Idle C
    568.         UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_C);
    569.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_C, 4);
    570.        
    571.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[9], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    572.     }
    573.    
    574.     return HAM_SUPERCEDE;
    575. }
    576.  
    577. public fw_Weapon_PrimaryAttack(iItem)
    578. {
    579.     if(!CustomItem(iItem)) return HAM_IGNORED;
    580.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    581.     static iFOV; iFOV = (get_pdata_int(iPlayer, m_iFOV, 5) != 90);
    582.     if(get_pdata_int(iItem, m_iClip, 4) == 0) {
    583.         ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
    584.         set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, 4);
    585.         return HAM_SUPERCEDE;
    586.     }
    587.     static fw_TraceLine; fw_TraceLine = register_forward(FM_TraceLine, "fw_TraceLine_Post", 1);
    588.     fm_ham_hook(true);
    589.     state FireBullets: Enabled;
    590.     ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
    591.     state FireBullets: Disabled;
    592.     unregister_forward(FM_TraceLine, fw_TraceLine, 1);
    593.     fm_ham_hook(false);
    594.     static Float:vecPunchangle[3];
    595.  
    596.     pev(iPlayer, pev_punchangle, vecPunchangle);
    597.     vecPunchangle[0] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
    598.     vecPunchangle[1] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
    599.     vecPunchangle[2] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
    600.     set_pev(iPlayer, pev_punchangle, vecPunchangle);
    601.  
    602.     emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    603.    
    604.     if (g_iStoredEnergy[iPlayer] == 0)
    605.     {
    606.         // Idle A
    607.         UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_A);
    608.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_A, 4);
    609.     }
    610.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    611.     {
    612.         // Idle B
    613.         UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_B);
    614.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_B, 4);
    615.     }
    616.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    617.     {
    618.         // Idle C
    619.         UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_C);
    620.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_C, 4);
    621.     }
    622.    
    623.     Make_Muzzleflash(iPlayer)
    624.  
    625.     set_pdata_float(iItem, m_flNextPrimaryAttack, iFOV ? WEAPON_RATE_EX : WEAPON_RATE, 4);
    626.  
    627.     return HAM_SUPERCEDE;
    628. }
    629.  
    630. public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
    631. public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
    632. public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
    633. public fw_TraceAttack(iVictim, iAttacker, Float:flDamage) {
    634.     if(!is_user_connected(iAttacker)) return;
    635.     static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
    636.     static iFOV; iFOV = (get_pdata_int(iAttacker, m_iFOV, 5) != 90);
    637.     static Float: flWeaponDamage; flWeaponDamage = (iFOV ? WEAPON_DAMAGE_EX : WEAPON_DAMAGE);
    638.     if(iItem <= 0 || !CustomItem(iItem)) return;
    639.         SetHamParamFloat(3, flDamage * flWeaponDamage);
    640. }
    641.  
    642. public fw_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle)
    643. {
    644.     if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
    645.     static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
    646.     if(iItem <= 0 || !CustomItem(iItem)) return;
    647.     set_cd(CD_Handle, CD_flNextAttack, 999999.0);
    648. }
    649.  
    650. public fw_SetModel(iEnt)
    651. {
    652.     static i, szClassname[32], iItem;
    653.     pev(iEnt, pev_classname, szClassname, 31);
    654.     if(!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
    655.     for(i = 0; i < 6; i++) {
    656.         iItem = get_pdata_cbase(iEnt, m_rgpPlayerItems_CWeaponBox + i, 4);
    657.         if(iItem > 0 && CustomItem(iItem)) {
    658.             engfunc(EngFunc_SetModel, iEnt, WEAPON_MODEL_W);
    659.             set_pev(iEnt, pev_body, WEAPON_BODY);
    660.             new iPlayer = pev(iEnt, pev_owner);
    661.             g_bHasStunRifle[iPlayer] = false;
    662.             remove_task(iPlayer)
    663.             return FMRES_SUPERCEDE;
    664.         }
    665.     }
    666.     return FMRES_IGNORED;
    667. }
    668.  
    669. public fw_TraceLine_Post(const Float:flOrigin1[3], const Float:flOrigin2[3], iFrag, iIgnore, tr)
    670. {
    671.     if(iFrag & IGNORE_MONSTERS) return FMRES_IGNORED;
    672.     static pHit; pHit = get_tr2(tr, TR_pHit);
    673.     static Float:flvecEndPos[3]; get_tr2(tr, TR_vecEndPos, flvecEndPos);
    674.     if(pHit > 0) {
    675.         if(pev(pHit, pev_solid) != SOLID_BSP) return FMRES_IGNORED;
    676.     }
    677.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, flvecEndPos, 0);
    678.     write_byte(TE_GUNSHOTDECAL);
    679.     engfunc(EngFunc_WriteCoord, flvecEndPos[0]);
    680.     engfunc(EngFunc_WriteCoord, flvecEndPos[1]);
    681.     engfunc(EngFunc_WriteCoord, flvecEndPos[2]);
    682.     write_short(pHit > 0 ? pHit : 0);
    683.     write_byte(random_num(41, 45));
    684.     message_end();
    685.  
    686.     return FMRES_IGNORED;
    687. }
    688.  
    689. public fm_ham_hook(bool:on) {
    690.     if(on) {
    691.         EnableHamForward(g_fw_TraceAttack[0]);
    692.         EnableHamForward(g_fw_TraceAttack[1]);
    693.         EnableHamForward(g_fw_TraceAttack[2]);
    694.         EnableHamForward(g_fw_TraceAttack[3]);
    695.     }
    696.     else {
    697.         DisableHamForward(g_fw_TraceAttack[0]);
    698.         DisableHamForward(g_fw_TraceAttack[1]);
    699.         DisableHamForward(g_fw_TraceAttack[2]);
    700.         DisableHamForward(g_fw_TraceAttack[3]);
    701.     }
    702. }
    703.  
    704. stock UTIL_SendWeaponAnim(iPlayer, iAnim)
    705. {
    706.     set_pev(iPlayer, pev_weaponanim, iAnim);
    707.  
    708.     message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
    709.     write_byte(iAnim);
    710.     write_byte(0);
    711.     message_end();
    712. }
    713.  
    714. stock UTIL_DropWeapon(iPlayer, iSlot) {
    715.     static iEntity, iNext, szWeaponName[32];
    716.     iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, 5);
    717.     if(iEntity > 0) {      
    718.         do {
    719.             iNext = get_pdata_cbase(iEntity, m_pNext, 4)
    720.             if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {  
    721.                 engclient_cmd(iPlayer, "drop", szWeaponName);
    722.             }
    723.         } while(( iEntity = iNext) > 0);
    724.     }
    725. }
    726.  
    727. stock s_weaponlist(iPlayer, bool:on)
    728. {
    729.     message_begin(MSG_ONE, g_iMsgID_Weaponlist, {0,0,0}, iPlayer);
    730.     write_string(on ? WEAPON_NEW : WEAPON_OLD);
    731.     write_byte(iWeaponList[0]);
    732.     write_byte(on ? WEAPON_AMMO : iWeaponList[1]);
    733.     write_byte(iWeaponList[2]);
    734.     write_byte(iWeaponList[3]);
    735.     write_byte(iWeaponList[4]);
    736.     write_byte(iWeaponList[5]);
    737.     write_byte(iWeaponList[6]);
    738.     write_byte(iWeaponList[7]);
    739.     message_end();
    740. }
    741.  
    742. stock ElectricBeam(id, Float:flOrigin[3])
    743. {
    744.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    745.     write_byte(TE_BEAMENTPOINT)
    746.     write_short(id | 0x1000)
    747.     engfunc(EngFunc_WriteCoord, flOrigin[0])
    748.     engfunc(EngFunc_WriteCoord, flOrigin[1])
    749.     engfunc(EngFunc_WriteCoord, flOrigin[2])
    750.     write_short(g_iLigSpr)
    751.     write_byte(1); // framestart
    752.     write_byte(100); // framerate - 5
    753.     write_byte(1) // life - 30
    754.     write_byte(30); // width
    755.     write_byte(random_num(0, 10)); // noise
    756.     write_byte(51); // r, g, b
    757.     write_byte(51); // r, g, b
    758.     write_byte(255); // r, g, b
    759.     write_byte(200); // brightness
    760.     write_byte(200); // speed
    761.     message_end()
    762.    
    763.     if (g_iAppearTimes[id] >= 2)
    764.         return
    765.    
    766.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    767.     write_byte(TE_EXPLOSION);
    768.     engfunc(EngFunc_WriteCoord, flOrigin[0]);
    769.     engfunc(EngFunc_WriteCoord, flOrigin[1]);
    770.     engfunc(EngFunc_WriteCoord, flOrigin[2]);
    771.     write_short(g_iEffSpr);
    772.     write_byte(10);
    773.     write_byte(10);
    774.     write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES|TE_EXPLFLAG_NODLIGHTS);
    775.     message_end();
    776.    
    777.     g_iAppearTimes[id]++
    778. }
    779.  
    780. stock notEmpty(id)
    781. {
    782.     static Float:flOrigin[3]
    783.     pev(id, pev_origin, flOrigin)
    784.     new iVictim = -1;
    785.            
    786.     while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
    787.     {
    788.         if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
    789.             continue
    790.        
    791.         return true;
    792.     }
    793.    
    794.     return false;
    795. }
    796.  
    797. public Make_Muzzleflash(id)
    798. {
    799.     static Float:Origin[3], TE_FLAG
    800.     get_position(id, 32.0, 6.0, -15.0, Origin)
    801.    
    802.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
    803.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
    804.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
    805.    
    806.     engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, Origin, id)
    807.     write_byte(TE_EXPLOSION)
    808.     engfunc(EngFunc_WriteCoord, Origin[0])
    809.     engfunc(EngFunc_WriteCoord, Origin[1])
    810.     engfunc(EngFunc_WriteCoord, Origin[2])
    811.     write_short(g_iEff2Spr)
    812.     write_byte(2)
    813.     write_byte(30)
    814.     write_byte(TE_FLAG)
    815.     message_end()
    816. }
    817.  
    818. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
    819. {
    820.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    821.    
    822.     pev(id, pev_origin, vOrigin)
    823.     pev(id, pev_view_ofs, vUp) //for player
    824.     xs_vec_add(vOrigin, vUp, vOrigin)
    825.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    826.    
    827.     angle_vector(vAngle,ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
    828.     angle_vector(vAngle,ANGLEVECTOR_RIGHT, vRight)
    829.     angle_vector(vAngle,ANGLEVECTOR_UP, vUp)
    830.    
    831.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    832.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    833.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    834. }
Bazzoka:
    1. #include <zombie_escape>
    2.  
    3. static const plugin[] = "[ZE] Extra Item: Bazooka";
    4.  
    5. static const mrocket[] = "models/zombie_escape/zm_bazooka_missile.mdl";
    6. static const mrpg_w[] = "models/zombie_escape/w_zm_bazooka.mdl";
    7. static const mrpg_v[] = "models/zombie_escape/v_zm_bazooka.mdl";
    8. static const mrpg_p[] = "models/zombie_escape/p_zm_bazooka.mdl";
    9. static const sfire[] = "weapons/rocketfire1.wav";
    10. static const sfly[] = "weapons/nuke_fly.wav";
    11. static const shit[] = "weapons/mortarhit.wav";
    12. static const spickup[] = "items/gunpickup2.wav";
    13.  
    14. new gmsg_screenshake, gmsg_death, gmsg_damage, pcvar_delay, pcvar_maxdmg, pcvar_radius, pcvar_map;
    15. new rocketsmoke, explosion, bazsmoke, white;
    16. new bool:has_baz[33], bool:CanShoot[33];
    17. new dmgcount[33], pcvar_dmgforpacks, pcvar_award;
    18.  
    19. public plugin_init()
    20. {
    21.     register_plugin(plugin, "0.6", "Random1");
    22.    
    23.     pcvar_delay = register_cvar("zp_baz_delay", "10.0");
    24.     pcvar_maxdmg = register_cvar("zp_baz_dmg", "720");
    25.     pcvar_radius = register_cvar("zp_baz_radius", "750");
    26.     pcvar_map = register_cvar("zp_baz_map", "0");
    27.     pcvar_dmgforpacks = get_cvar_pointer("zp_human_damage_reward");
    28.     pcvar_award = register_cvar("zp_baz_awardpacks", "1");
    29.    
    30.     if ( pcvar_dmgforpacks == 0 ) {
    31.         set_pcvar_num(pcvar_award, 0);  //if we couldn't read the dmg cvar from zp then set a stop state on dmg reward
    32.         log_amx("[%s] error reading zp_human_damage_reward cvar from zombie plague, turning award for damage off", plugin);
    33.     }
    34.    
    35.     register_concmd("zp_bazooka", "give_bazooka", ADMIN_KICK, "<name/@all> gives a bazooka to the spcified target");
    36.     register_event("CurWeapon","switch_to_knife","be","1=1","2=29");
    37.     register_event("HLTV", "event_HLTV", "a", "1=0", "2=0") // New Round
    38.     register_clcmd("drop", "drop_call");
    39.    
    40.     //supports 2 methods of firing, attacking while holding knife and a bind
    41.     register_clcmd("baz_fire", "fire_call");
    42.     register_forward(FM_PlayerPreThink, "fw_prethink");
    43.    
    44.     register_forward(FM_Touch, "fw_touch");
    45.        
    46.     gmsg_screenshake = get_user_msgid("ScreenShake");
    47.     gmsg_death = get_user_msgid("DeathMsg");
    48.     gmsg_damage = get_user_msgid("Damage");
    49. }
    50.  
    51. public plugin_natives()
    52. {
    53.     register_native("ze_give_bazzoka", "native_ze_give_bazzoka", 1)
    54. }
    55.  
    56. public native_ze_give_bazzoka(id)
    57. {
    58.     has_baz[id] = true;
    59.     CanShoot[id] = true;
    60. }
    61.  
    62. public event_HLTV()
    63. {
    64.     //remove entities regardless of cvar
    65.     new rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    66.     while( rpg_temp > 0) {
    67.         engfunc(EngFunc_RemoveEntity, rpg_temp);
    68.         rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    69.     }
    70.    
    71.     if ( get_pcvar_num(pcvar_map) ) return;
    72.    
    73.     for( new id = 1; id <= 32; id++ )
    74.         has_baz[id] = false;
    75. }
    76.  
    77. public give_bazooka(id,level,cid)
    78. {
    79.     if (!cmd_access(id,level,cid,1)) {
    80.         console_print(id,"You have no access to that command");
    81.         return;
    82.     }
    83.     if (read_argc() > 2) {
    84.         console_print(id,"Too many arguments supplied.");
    85.         return;
    86.     }
    87.     new arg1[32];
    88.     read_argv(1, arg1, sizeof(arg1) - 1);
    89.     new player = cmd_target(id, arg1, 10);
    90.     if ( !player ) {
    91.         if ( arg1[0] == '@' ) {
    92.             for ( new i = 1; i <= 32; i++ ) {
    93.                 if ( is_user_connected(i) && !has_baz[i] && !ze_is_user_zombie(i) ) {
    94.                     has_baz[i] = true;
    95.                     CanShoot[i] = true;
    96.                     client_print(i, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
    97.                 }
    98.             }
    99.         } else {
    100.             client_print(id, print_chat, "No Such Player/Team");
    101.             return;
    102.         }
    103.     } else if ( !has_baz[player] && !ze_is_user_zombie(player) ) {
    104.         has_baz[player] = true;
    105.         CanShoot[player] = true;
    106.         client_print(player, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
    107.     }
    108. }
    109.  
    110. public ze_user_infected(id, infector)
    111.     if ( has_baz[id] )
    112.         drop_rpg_temp(id);
    113.  
    114. public plugin_precache()
    115. {
    116.     precache_model(mrocket);  
    117.  
    118.     precache_model(mrpg_w);
    119.     precache_model(mrpg_v);
    120.     precache_model(mrpg_p);
    121.  
    122.     precache_sound(sfire);
    123.     precache_sound(sfly);
    124.     precache_sound(shit);
    125.     precache_sound(spickup);
    126.    
    127.     rocketsmoke = precache_model("sprites/smoke.spr");
    128.     explosion = precache_model("sprites/fexplo.spr");
    129.     bazsmoke  = precache_model("sprites/steam1.spr");
    130.     white = precache_model("sprites/white.spr");
    131. }
    132.  
    133. public switch_to_knife(id)
    134. {
    135.     if ( !is_user_alive(id) ) return;
    136.    
    137.     if ( has_baz[id] && CanShoot[id] )
    138.     {
    139.         set_pev(id, pev_viewmodel2, mrpg_v);
    140.         set_pev(id, pev_weaponmodel2, mrpg_p);
    141.     }
    142. }
    143.  
    144. public fw_prethink(id)
    145. {
    146.     static button;
    147.     button = pev(id, pev_button);
    148.     if ( button & IN_ATTACK )
    149.         fire_call(id);
    150. }
    151. public fire_call(id)
    152. {
    153.     if ( !is_user_alive(id) || !has_baz[id] || !CanShoot[id] ) return;
    154.    
    155.     new weapon = get_user_weapon(id);
    156.     if ( weapon == CSW_KNIFE ) fire_rocket(id);
    157. }
    158.  
    159. fire_rocket(id) {
    160.     if ( !CanShoot[id] ) return;
    161.    
    162.     CanShoot[id] = false;
    163.     set_task(get_pcvar_float(pcvar_delay), "rpg_reload", id);
    164.     engclient_cmd(id, "weapon_knife");  //attempt to force model to reset
    165.  
    166.     new Float:StartOrigin[3], Float:Angle[3];
    167.     pev(id, pev_origin, StartOrigin);
    168.     pev(id, pev_angles, Angle);
    169.  
    170.     new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    171.     set_pev(ent, pev_classname, "rpgrocket");
    172.     engfunc(EngFunc_SetModel, ent, mrocket);
    173.     set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    174.     set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});
    175.     engfunc(EngFunc_SetOrigin, ent, StartOrigin);
    176.     set_pev(ent, pev_angles, Angle);
    177.  
    178.  
    179.     set_pev(ent, pev_solid, 2);
    180.     set_pev(ent, pev_movetype, 5);
    181.     set_pev(ent, pev_owner, id);
    182.  
    183.     new Float:nVelocity[3];
    184.     velocity_by_aim(id, 1500, nVelocity);
    185.     set_pev(ent, pev_velocity, nVelocity);
    186.  
    187.     emit_sound(ent, CHAN_WEAPON, sfire, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    188.     emit_sound(ent, CHAN_VOICE, sfly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    189.  
    190.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    191.     write_byte(22);
    192.     write_short(ent);
    193.     write_short(rocketsmoke);
    194.     write_byte(30);
    195.     write_byte(3);
    196.     write_byte(255);
    197.     write_byte(255);
    198.     write_byte(255);
    199.     write_byte(255);
    200.     message_end();
    201. }
    202. //---------------------------------------------------------------------------------------
    203. public rpg_reload(id)
    204. {
    205.     CanShoot[id] = true;
    206.     if ( get_user_weapon(id) == CSW_KNIFE ) switch_to_knife(id);    //sets our model
    207. }
    208.  
    209. //---------------------------------------------------------------------------------------
    210. public fw_touch(ent, touched)
    211. {
    212.     if ( !pev_valid(ent) ) return FMRES_IGNORED;
    213.     static entclass[32];
    214.     pev(ent, pev_classname, entclass, 31);
    215.     if ( equali(entclass, "rpg_temp") )
    216.     {
    217.         static touchclass[32];
    218.         pev(touched, pev_classname, touchclass, 31);
    219.         if ( !equali(touchclass, "player") ) return FMRES_IGNORED;
    220.        
    221.         if( !is_user_alive(touched) || ze_is_user_zombie(touched) ) return FMRES_IGNORED;
    222.            
    223.         emit_sound(touched, CHAN_VOICE, spickup, 1.0, ATTN_NORM, 0, PITCH_NORM);
    224.         has_baz[touched] = true;
    225.        
    226.         engfunc(EngFunc_RemoveEntity, ent);
    227.    
    228.         return FMRES_HANDLED;
    229.     }
    230.     else if ( equali(entclass, "rpgrocket") )
    231.     {
    232.         new Float:EndOrigin[3];
    233.         pev(ent, pev_origin, EndOrigin);
    234.         new NonFloatEndOrigin[3];
    235.         NonFloatEndOrigin[0] = floatround(EndOrigin[0]);
    236.         NonFloatEndOrigin[1] = floatround(EndOrigin[1]);
    237.         NonFloatEndOrigin[2] = floatround(EndOrigin[2]);
    238.    
    239.         emit_sound(ent, CHAN_WEAPON, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    240.         emit_sound(ent, CHAN_VOICE, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    241.    
    242.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    243.         write_byte(17);
    244.         write_coord(NonFloatEndOrigin[0]);
    245.         write_coord(NonFloatEndOrigin[1]);
    246.         write_coord(NonFloatEndOrigin[2] + 128);
    247.         write_short(explosion);
    248.         write_byte(60);
    249.         write_byte(255);
    250.         message_end();
    251.    
    252.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    253.         write_byte(5);
    254.         write_coord(NonFloatEndOrigin[0]);
    255.         write_coord(NonFloatEndOrigin[1]);
    256.         write_coord(NonFloatEndOrigin[2] + 256);
    257.         write_short(bazsmoke);
    258.         write_byte(125);
    259.         write_byte(5);
    260.         message_end();
    261.    
    262.         new maxdamage = get_pcvar_num(pcvar_maxdmg);
    263.         new damageradius = get_pcvar_num(pcvar_radius);
    264.    
    265.         new PlayerPos[3], distance, damage;
    266.         for (new i = 1; i <= 32; i++) {
    267.             if ( is_user_alive(i))
    268.                 {  
    269.                     new id = pev(ent, pev_owner)
    270.                     if ((ze_is_user_zombie(id)))
    271.                         continue;
    272.                        
    273.                     get_user_origin(i, PlayerPos);
    274.        
    275.                     distance = get_distance(PlayerPos, NonFloatEndOrigin);
    276.                     if (distance <= damageradius) {
    277.                     message_begin(MSG_ONE, gmsg_screenshake, {0,0,0}, i);
    278.                     write_short(1<<14);
    279.                     write_short(1<<14);
    280.                     write_short(1<<14);
    281.                     message_end();
    282.        
    283.                     damage = maxdamage - floatround(floatmul(float(maxdamage), floatdiv(float(distance), float(damageradius))));
    284.                     new attacker = pev(ent, pev_owner);
    285.        
    286.                     baz_damage(i, attacker, damage, "bazooka");
    287.                 }
    288.             }
    289.         }
    290.    
    291.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    292.         write_byte(21);
    293.         write_coord(NonFloatEndOrigin[0]);
    294.         write_coord(NonFloatEndOrigin[1]);
    295.         write_coord(NonFloatEndOrigin[2]);
    296.         write_coord(NonFloatEndOrigin[0]);
    297.         write_coord(NonFloatEndOrigin[1]);
    298.         write_coord(NonFloatEndOrigin[2] + 320);
    299.         write_short(white);
    300.         write_byte(0);
    301.         write_byte(0);
    302.         write_byte(16);
    303.         write_byte(128);
    304.         write_byte(0);
    305.         write_byte(255);
    306.         write_byte(255);
    307.         write_byte(192);
    308.         write_byte(128);
    309.         write_byte(0);
    310.         message_end();
    311.    
    312.         engfunc(EngFunc_RemoveEntity, ent);
    313.        
    314.         return FMRES_HANDLED;
    315.     }
    316.     return FMRES_IGNORED;
    317. }
    318. //---------------------------------------------------------------------------------------
    319. public drop_call(id)
    320. {
    321.     if ( has_baz[id] && get_user_weapon(id) == CSW_KNIFE )
    322.     {
    323.         drop_rpg_temp(id);
    324.         return PLUGIN_HANDLED;  //attempt to block can't drop knife message
    325.     }
    326.     return PLUGIN_CONTINUE;
    327. }
    328.  
    329. drop_rpg_temp(id) {
    330.     new Float:fAim[3] , Float:fOrigin[3];
    331.     velocity_by_aim(id , 64 , fAim);
    332.     pev(id , pev_origin , fOrigin);
    333.  
    334.     fOrigin[0] += fAim[0];
    335.     fOrigin[1] += fAim[1];
    336.  
    337.     new rpg = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    338.  
    339.     set_pev(rpg, pev_classname, "rpg_temp");
    340.     engfunc(EngFunc_SetModel, rpg, mrpg_w);
    341.  
    342.     set_pev(rpg, pev_mins, { -16.0, -16.0, -16.0 } );
    343.     set_pev(rpg, pev_maxs, { 16.0, 16.0, 16.0 } );
    344.  
    345.     set_pev(rpg , pev_solid , 1);
    346.     set_pev(rpg , pev_movetype , 6);
    347.  
    348.     engfunc(EngFunc_SetOrigin, rpg, fOrigin);
    349.  
    350.     has_baz[id] = false;
    351. }
    352. //---------------------------------------------------------------------------------------
    353. baz_damage(id, attacker, damage, weaponDescription[])
    354. {
    355.     if ( pev(id, pev_takedamage) == DAMAGE_NO ) return;
    356.     if ( damage <= 0 ) return;
    357.  
    358.     new userHealth = get_user_health(id);
    359.     if (userHealth - damage <= 0 ) {
    360.         dmgcount[attacker] += userHealth - damage;
    361.         set_msg_block(gmsg_death, BLOCK_SET);
    362.         ExecuteHamB(Ham_Killed, id, attacker, 2);
    363.         set_msg_block(gmsg_death, BLOCK_NOT);
    364.    
    365.        
    366.         message_begin(MSG_BROADCAST, gmsg_death);
    367.         write_byte(attacker);
    368.         write_byte(id);
    369.         write_byte(0);
    370.         write_string(weaponDescription);
    371.         message_end();
    372.        
    373.         set_pev(attacker, pev_frags, float(get_user_frags(attacker) + 1));
    374.            
    375.         new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10];
    376.    
    377.         get_user_name(attacker, kname, 31);
    378.         get_user_team(attacker, kteam, 9);
    379.         get_user_authid(attacker, kauthid, 31);
    380.      
    381.         get_user_name(id, vname, 31);
    382.         get_user_team(id, vteam, 9);
    383.         get_user_authid(id, vauthid, 31);
    384.            
    385.         log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
    386.         kname, get_user_userid(attacker), kauthid, kteam,
    387.         vname, get_user_userid(id), vauthid, vteam, weaponDescription);
    388.     }
    389.     else {
    390.         dmgcount[attacker] += damage;
    391.         new origin[3];
    392.         get_user_origin(id, origin);
    393.        
    394.         message_begin(MSG_ONE,gmsg_damage,{0,0,0},id);
    395.         write_byte(21);
    396.         write_byte(20);
    397.         write_long(DMG_BLAST);
    398.         write_coord(origin[0]);
    399.         write_coord(origin[1]);
    400.         write_coord(origin[2]);
    401.         message_end();
    402.        
    403.         set_pev(id, pev_health, pev(id, pev_health) - float(damage));
    404.     }
    405.     if ( !get_pcvar_num(pcvar_award) ) return;
    406.    
    407.     new breaker = get_pcvar_num(pcvar_dmgforpacks);
    408.     if ( dmgcount[attacker] > breaker )
    409.     {
    410.         new temp = dmgcount[attacker] / breaker
    411.         if ( temp * breaker > dmgcount[attacker] ) return; //should never be possible
    412.         dmgcount[attacker] -= temp * breaker;
    413.         ze_set_escape_coins( attacker, ze_get_escape_coins(attacker) + temp );
    414.     }
    415. }
Laser Minigun:
    1. #include <zombie_escape>
    2. #include <fakemeta_util>
    3.  
    4. #define PLUGIN  "[ZE] CSO Laser Minigun"
    5. #define VERSION "1.1"
    6. #define AUTHOR  "Asep Khairul Anam"
    7.  
    8. /**** Changelog 1.1 ****
    9. -> Fixed Bug Laserminigun Charge Mode
    10. -> Fixed Some Crash And Bug
    11. -> Rewrite Code
    12. -> Add To Mode Zombie Escape (Add Extra Items)
    13. *************************/
    14.  
    15.  
    16. #define weapon_name     "weapon_m249"
    17. #define weapon_new      "weapon_laserminigun"
    18. #define VIP_ACCESS ADMIN_LEVEL_H
    19.  
    20. #define ANIM_IDLE       0
    21. #define ANIM_SHOOT_1        7
    22. #define ANIM_SHOOT_2        8
    23. #define ANIM_RELOAD     5
    24. #define ANIM_DRAW       6
    25.  
    26. #define IDLE_TIME       1.7
    27. #define DRAW_TIME       2.53
    28. #define RELOAD_TIME     5.23
    29.  
    30. #define WEAPON_KEY      38591238491
    31. #define Is_CustomItem(%0)   (pev(%0,pev_impulse) == WEAPON_KEY)
    32.  
    33. #define MODEL_V         "models/zombie_escape/v_laserminigun.mdl"
    34. #define MODEL_W         "models/zombie_escape/w_laserminigun.mdl"
    35. #define MODEL_P         "models/zombie_escape/p_laserminiguna.mdl"
    36. #define MODEL_P_CHARGE      "models/zombie_escape/p_laserminigunb.mdl"
    37.  
    38. /******* CONFIGURATION LASERMINIGUN ********/
    39. #define RECOIL          0.4
    40. #define DAMAGE_LOW      0.8    
    41. #define DAMAGE_HIGH     1.5
    42. #define DAMAGE_EXTREME      2.0            
    43. #define WEAPON_SPEED        0.07
    44. #define DAMAGE_BALL_1       330.0
    45. #define DAMAGE_BALL_2       550.0
    46. #define DAMAGE_BALL_3       770.0
    47. #define EXPLODE_RADIUS      250.0
    48. #define WEAPON_CLIP     125
    49. #define WEAPON_BPAMMO       250
    50. #define SHOOTS_FOR_HIGH     20
    51. #define SHOOTS_FOR_EXTRREME SHOOTS_FOR_HIGH + 20
    52. /**** END OF CONFIGURATION LASERMINIGUN ****/
    53.  
    54. #define classname_ball  "laserminigun_ball"
    55.  
    56. #define Get_BitVar(%1,%2) (%1&(1<<(%2&31)))
    57. #define Set_BitVar(%1,%2) %1|=(1<<(%2&31))
    58. #define UnSet_BitVar(%1,%2) %1&=~(1<<(%2&31))
    59.  
    60. #define MUZZLEFLASH_1   "sprites/muzzleflash37.spr"
    61. #define MUZZLEFLASH_2   "sprites/muzzleflash38.spr"
    62. #define MUZZLEFLASH_3   "sprites/muzzleflash39.spr"
    63.  
    64. #define SPRITE_BALL_1   "sprites/laserminigun_charge_1.spr"
    65. #define SPRITE_BALL_2   "sprites/laserminigun_charge_2.spr"
    66. #define SPRITE_BALL_3   "sprites/laserminigun_charge_3.spr"
    67.  
    68. new gMaxPlayers, Msg_WeaponList, g_AllocString_V
    69. new g_ChargeState[512],g_ChargeShots[512], g_AllocString_P, g_AllocString_P_charge
    70. new Float:g_VecEndTrace[3], g_ChargeBall[33], g_ChargeForEntity[33]
    71. new g_ChargeBall1_Explosion, g_ChargeBall2_Explosion, g_ChargeBall3_Explosion
    72.  
    73. new g_Muzzleflash_Ent1,g_Muzzleflash1
    74. new g_Muzzleflash_Ent2,g_Muzzleflash2
    75. new g_Muzzleflash_Ent3,g_Muzzleflash3
    76.  
    77. new g_MuzzleflashBall_Ent1,g_MuzzleflashBall1
    78. new g_MuzzleflashBall_Ent2,g_MuzzleflashBall2
    79. new g_MuzzleflashBall_Ent3,g_MuzzleflashBall3
    80.  
    81. new const Weapon_Sounds[15][] =
    82. {
    83.     "weapons/laserminigun-1.wav",           // 0
    84.     "weapons/laserminigun-charge_start.wav",    // 1
    85.     "weapons/laserminigun-charge_loop.wav",     // 2
    86.     "weapons/laserminigun-charge_origin.wav",   // 3
    87.     "weapons/laserminigun-charge_shoot.wav",    // 4
    88.     "weapons/laserminigun_idle.wav",        // 5
    89.     "weapons/laserminigun_draw.wav",        // 6
    90.     "weapons/laserminigun_clipout2.wav",        // 7
    91.     "weapons/laserminigun_clipout1.wav",        // 8
    92.     "weapons/laserminigun_clipin2.wav",     // 9
    93.     "weapons/laserminigun_clipin1.wav",     // 10
    94.     "weapons/laserminigun_charge_end.wav",      // 11
    95.     "weapons/laserminigun_exp1.wav",        // 12
    96.     "weapons/laserminigun_exp2.wav",        // 13
    97.     "weapons/laserminigun_exp3.wav"         // 14
    98. }
    99.  
    100. enum
    101. {
    102.     STATE_LOW = 0,
    103.     STATE_HIGH,
    104.     STATE_EXTREME,
    105.     STATE_CHARGE
    106. }
    107.  
    108. public plugin_init()
    109. {
    110.     register_plugin(PLUGIN, VERSION, AUTHOR)
    111.    
    112.     RegisterHam(Ham_Item_Deploy,weapon_name,"HookHam_Weapon_Deploy",1)
    113.     RegisterHam(Ham_Item_AddToPlayer,weapon_name,"HookHam_Weapon_Add",1)
    114.     RegisterHam(Ham_Item_PostFrame,weapon_name,"HookHam_Weapon_Frame",0)
    115.    
    116.     RegisterHam(Ham_Weapon_Reload,weapon_name,"HookHam_Weapon_Reload",0)
    117.     RegisterHam(Ham_Weapon_WeaponIdle,weapon_name,"HookHam_Weapon_Idle",0)
    118.     RegisterHam(Ham_Weapon_PrimaryAttack,weapon_name,"HookHam_Weapon_PrimaryAttack",0)
    119.     RegisterHam(Ham_TakeDamage,"player","HookHam_TakeDamage")
    120.    
    121.     register_forward(FM_SetModel,"HookFm_SetModel")
    122.     register_forward(FM_AddToFullPack,"fw_AddToFullPack_post",1)
    123.     register_forward(FM_CheckVisibility,"fw_CheckVisibility")
    124.     register_forward(FM_UpdateClientData,"HookFm_UpdateClientData",1)
    125.    
    126.     register_touch("*", classname_ball, "BallTouch")
    127.    
    128.     gMaxPlayers = get_maxplayers()
    129.     Msg_WeaponList = get_user_msgid("WeaponList");
    130.    
    131.     register_clcmd(weapon_new,"hook_item")
    132. }
    133.  
    134. public plugin_precache()
    135. {
    136.     engfunc(EngFunc_PrecacheModel, MODEL_W)
    137.     engfunc(EngFunc_PrecacheModel, MODEL_V)
    138.     engfunc(EngFunc_PrecacheModel, MODEL_P)
    139.     engfunc(EngFunc_PrecacheModel, MODEL_P_CHARGE)
    140.    
    141.     engfunc(EngFunc_PrecacheModel, SPRITE_BALL_1)
    142.     engfunc(EngFunc_PrecacheModel, SPRITE_BALL_2)
    143.     engfunc(EngFunc_PrecacheModel, SPRITE_BALL_3)
    144.    
    145.     g_AllocString_V = engfunc(EngFunc_AllocString, MODEL_V)
    146.     g_AllocString_P = engfunc(EngFunc_AllocString, MODEL_P)
    147.     g_AllocString_P_charge = engfunc(EngFunc_AllocString, MODEL_P_CHARGE)
    148.    
    149.     for(new i = 0; i < sizeof(Weapon_Sounds); i++)
    150.         engfunc(EngFunc_PrecacheSound,Weapon_Sounds[i])
    151.    
    152.     g_ChargeBall1_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_1.spr")
    153.     g_ChargeBall2_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_2.spr")
    154.     g_ChargeBall3_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_3.spr")
    155.    
    156.    
    157.     g_Muzzleflash_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    158.     precache_model(MUZZLEFLASH_1)
    159.     engfunc(EngFunc_SetModel,g_Muzzleflash_Ent1,MUZZLEFLASH_1)
    160.     set_pev(g_Muzzleflash_Ent1,pev_scale,0.1)
    161.     set_pev(g_Muzzleflash_Ent1,pev_rendermode,kRenderTransTexture)
    162.     set_pev(g_Muzzleflash_Ent1,pev_renderamt,0.0)
    163.    
    164.     g_Muzzleflash_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    165.     precache_model(MUZZLEFLASH_2)
    166.     engfunc(EngFunc_SetModel,g_Muzzleflash_Ent2,MUZZLEFLASH_2)
    167.     set_pev(g_Muzzleflash_Ent2,pev_scale,0.1)
    168.     set_pev(g_Muzzleflash_Ent2,pev_rendermode,kRenderTransTexture)
    169.     set_pev(g_Muzzleflash_Ent2,pev_renderamt,0.0)
    170.    
    171.     g_Muzzleflash_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    172.     precache_model(MUZZLEFLASH_3)
    173.     engfunc(EngFunc_SetModel,g_Muzzleflash_Ent3,MUZZLEFLASH_3)
    174.     set_pev(g_Muzzleflash_Ent3,pev_scale,0.1)
    175.     set_pev(g_Muzzleflash_Ent3,pev_rendermode,kRenderTransTexture)
    176.     set_pev(g_Muzzleflash_Ent3,pev_renderamt,0.0)
    177.    
    178.     g_MuzzleflashBall_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    179.     engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent1,SPRITE_BALL_1)
    180.     set_pev(g_MuzzleflashBall_Ent1,pev_scale,0.1)
    181.     set_pev(g_MuzzleflashBall_Ent1,pev_rendermode,kRenderTransTexture)
    182.     set_pev(g_MuzzleflashBall_Ent1,pev_renderamt,0.0)
    183.     set_pev(g_MuzzleflashBall_Ent1,pev_fuser1, 0.1)
    184.    
    185.     g_MuzzleflashBall_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    186.     engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent2,SPRITE_BALL_2)
    187.     set_pev(g_MuzzleflashBall_Ent2,pev_scale,0.2)
    188.     set_pev(g_MuzzleflashBall_Ent2,pev_rendermode,kRenderTransTexture)
    189.     set_pev(g_MuzzleflashBall_Ent2,pev_renderamt,0.0)
    190.     set_pev(g_MuzzleflashBall_Ent2,pev_fuser1, 0.2)
    191.    
    192.     g_MuzzleflashBall_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    193.     engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent3,SPRITE_BALL_3)
    194.     set_pev(g_MuzzleflashBall_Ent3,pev_scale,0.25)
    195.     set_pev(g_MuzzleflashBall_Ent3,pev_rendermode,kRenderTransTexture)
    196.     set_pev(g_MuzzleflashBall_Ent3,pev_renderamt,0.0)
    197.     set_pev(g_MuzzleflashBall_Ent3,pev_fuser1, 0.25)
    198.    
    199.     engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_1)
    200.     engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_2)
    201.     engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_3)
    202.    
    203.     engfunc(EngFunc_PrecacheGeneric,"sprites/640hud133.spr")
    204.     engfunc(EngFunc_PrecacheGeneric,"sprites/640hud14.spr")
    205.     engfunc(EngFunc_PrecacheGeneric,"sprites/weapon_laserminigun.txt")
    206.    
    207.     register_forward(FM_Spawn,"HookFm_Spawn",0)
    208. }
    209.  
    210. public plugin_natives()
    211. {
    212.     register_native("give_laserminigun","get_item", 1)
    213. }
    214.  
    215. public ze_user_infected(id)
    216. {
    217.     remove_laserminigun(id)
    218. }
    219.  
    220. public ze_user_humanized(id)
    221. {
    222.     remove_laserminigun(id)
    223. }
    224.  
    225. public remove_laserminigun(id)
    226. {
    227.     g_ChargeBall[id] = 0
    228.     g_ChargeForEntity[id] = 0
    229.    
    230.     UnSet_BitVar(g_MuzzleflashBall1,id)
    231.     UnSet_BitVar(g_MuzzleflashBall2,id)
    232.     UnSet_BitVar(g_MuzzleflashBall3,id)
    233. }
    234.  
    235. public client_command(id)
    236. {
    237.     new Command[32];read_argv(0,Command,charsmax(Command));  
    238.     new ent = fm_find_ent_by_owner(-1,weapon_name,id)
    239.     if(equali(Command,"weapon_",7) && g_ChargeBall[id] && Is_CustomItem(ent) || equali(Command,"lastinv") && g_ChargeBall[id] && Is_CustomItem(ent))
    240.     {  
    241.         client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Ganti")
    242.         return PLUGIN_HANDLED;
    243.     }
    244.     else if(equali(Command,"drop") && g_ChargeBall[id] && Is_CustomItem(ent))
    245.     {
    246.         client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Drop")
    247.         return PLUGIN_HANDLED;
    248.     }
    249.     return PLUGIN_CONTINUE;
    250. }
    251.  
    252. public get_item(id)
    253. {  
    254.     UTIL_DropWeapon(id,1)
    255.     new weapon = make_weapon()
    256.    
    257.     if(weapon <= 0)
    258.         return
    259.    
    260.     if(!ExecuteHamB(Ham_AddPlayerItem,id,weapon))
    261.     {
    262.         engfunc(EngFunc_RemoveEntity,weapon)
    263.         return
    264.     }
    265.    
    266.     ExecuteHam(Ham_Item_AttachToPlayer,weapon,id)
    267.    
    268.     new ammotype = 376 + get_pdata_int(weapon,49,4)
    269.     new ammo = get_pdata_int(id,ammotype,5)
    270.    
    271.     if(ammo < WEAPON_BPAMMO)
    272.         set_pdata_int(id, ammotype, WEAPON_BPAMMO, 5)
    273.        
    274.     set_pdata_int(weapon, 51, WEAPON_CLIP, 4)
    275.     emit_sound(id,CHAN_ITEM,"items/gunpickup2.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM)
    276.    
    277.     g_ChargeState[weapon] = STATE_LOW
    278.     g_ChargeShots[weapon] = 0
    279.     g_ChargeBall[id] = 0
    280.     g_ChargeForEntity[id] = 0
    281.    
    282.     UnSet_BitVar(g_MuzzleflashBall1,id)
    283.     UnSet_BitVar(g_MuzzleflashBall2,id)
    284.     UnSet_BitVar(g_MuzzleflashBall3,id)
    285. }
    286.  
    287. public hook_item(id)
    288. {
    289.     engclient_cmd(id,weapon_name)
    290.     return PLUGIN_HANDLED
    291. }
    292.  
    293. public fw_AddToFullPack_post(esState,iE,ent,iHost,iHostFlags,iPlayer,pSet)
    294. {
    295.     if(ent == g_Muzzleflash_Ent1)
    296.     {
    297.         if(Get_BitVar(g_Muzzleflash1,iHost))
    298.         {
    299.             set_es(esState,ES_Frame,float(random_num(0,2)))
    300.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    301.             set_es(esState,ES_RenderAmt,255.0)
    302.             UnSet_BitVar(g_Muzzleflash1,iHost)
    303.         }  
    304.         set_es(esState,ES_Skin,iHost)
    305.         set_es(esState,ES_Body,1)
    306.         set_es(esState,ES_AimEnt,iHost)
    307.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    308.     }
    309.     if(ent == g_Muzzleflash_Ent2)
    310.     {
    311.         if(Get_BitVar(g_Muzzleflash2,iHost))
    312.         {
    313.             set_es(esState,ES_Frame,float(random_num(0,2)))
    314.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    315.             set_es(esState,ES_RenderAmt,255.0)
    316.             UnSet_BitVar(g_Muzzleflash2,iHost)
    317.         }  
    318.         set_es(esState,ES_Skin,iHost)
    319.         set_es(esState,ES_Body,1)
    320.         set_es(esState,ES_AimEnt,iHost)
    321.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    322.     }
    323.     if(ent == g_Muzzleflash_Ent3)
    324.     {
    325.         if(Get_BitVar(g_Muzzleflash3,iHost))
    326.         {
    327.             set_es(esState,ES_Frame,float(random_num(0,2)))
    328.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    329.             set_es(esState,ES_RenderAmt,255.0)
    330.             UnSet_BitVar(g_Muzzleflash3,iHost)
    331.         }  
    332.         set_es(esState,ES_Skin,iHost)
    333.         set_es(esState,ES_Body,1)
    334.         set_es(esState,ES_AimEnt,iHost)
    335.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    336.     }
    337.     if(ent == g_MuzzleflashBall_Ent1)
    338.     {
    339.         if(Get_BitVar(g_MuzzleflashBall1,iHost))
    340.         {
    341.             set_es(esState,ES_Frame,float(random_num(0,8)))
    342.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    343.             set_es(esState,ES_RenderAmt,240.0)
    344.         }  
    345.         set_es(esState,ES_Skin,iHost)
    346.         set_es(esState,ES_Body,1)
    347.         set_es(esState,ES_AimEnt,iHost)
    348.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    349.     }
    350.     if(ent == g_MuzzleflashBall_Ent2)
    351.     {
    352.         if(Get_BitVar(g_MuzzleflashBall2,iHost))
    353.         {
    354.             set_es(esState,ES_Frame,float(random_num(0,8)))
    355.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    356.             set_es(esState,ES_RenderAmt,240.0)
    357.         }  
    358.         set_es(esState,ES_Skin,iHost)
    359.         set_es(esState,ES_Body,1)
    360.         set_es(esState,ES_AimEnt,iHost)
    361.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    362.     }
    363.     if(ent == g_MuzzleflashBall_Ent3)
    364.     {
    365.         if(Get_BitVar(g_MuzzleflashBall3,iHost))
    366.         {
    367.             set_es(esState,ES_Frame,float(random_num(0,8)))
    368.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    369.             set_es(esState,ES_RenderAmt,240.0)
    370.         }  
    371.         set_es(esState,ES_Skin,iHost)
    372.         set_es(esState,ES_Body,1)
    373.         set_es(esState,ES_AimEnt,iHost)
    374.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    375.     }
    376. }
    377.  
    378. public fw_CheckVisibility(entity,pSet)
    379. {
    380.     if(entity == g_Muzzleflash_Ent1 || entity == g_Muzzleflash_Ent2 || entity == g_Muzzleflash_Ent3)
    381.     {
    382.         forward_return(FMV_CELL,1)
    383.         return FMRES_SUPERCEDE
    384.     }
    385.     else if(entity == g_MuzzleflashBall_Ent1 || entity == g_MuzzleflashBall_Ent2 || entity == g_MuzzleflashBall_Ent3)
    386.     {
    387.         forward_return(FMV_CELL,1)
    388.         return FMRES_SUPERCEDE
    389.     }
    390.     return FMRES_IGNORED
    391. }
    392.  
    393. public HookHam_Weapon_Deploy(ent)
    394. {
    395.     if(!Is_CustomItem(ent))
    396.         return HAM_IGNORED
    397.        
    398.     static id
    399.     id = get_pdata_cbase(ent,41,4)
    400.  
    401.     set_pev_string(id,pev_viewmodel2, g_AllocString_V)
    402.     set_pev_string(id,pev_weaponmodel2, g_AllocString_P)
    403.    
    404.     set_pdata_float(ent,46,DRAW_TIME,4)
    405.     set_pdata_float(ent,47,DRAW_TIME,4)
    406.     set_pdata_float(ent,48,DRAW_TIME,4)
    407.     Play_WeaponAnim(id,ANIM_DRAW)
    408.     set_pdata_string(id,1968,"m249",-1,20)
    409.     Weaponlist(id, true)
    410.    
    411.     return HAM_IGNORED
    412. }
    413.  
    414. public HookHam_Weapon_Add(ent,id)
    415. {
    416.     switch(pev(ent,pev_impulse))
    417.     {
    418.         case WEAPON_KEY: Weaponlist(id,true)
    419.         case 0: Weaponlist(id,false)
    420.     }
    421.     return HAM_IGNORED
    422. }
    423.  
    424. public MakeBall(id)
    425. {
    426.     new ent = create_entity("env_sprite"),Float:f_origin[3],Float:f_vec[3]
    427.     set_pev(ent,pev_classname,classname_ball)
    428.     pev(id,pev_origin,f_origin)
    429.     velocity_by_aim(id,35,f_vec)
    430.    
    431.     for(new i=0;i<3;i++){ f_origin[i]+=f_vec[i];f_vec[i]*=40.0;}
    432.     f_origin[2] += (pev(id,pev_flags)&FL_DUCKING)?2.0:10.0;
    433.    
    434.     set_pev(ent,pev_origin,f_origin)
    435.     set_pev(ent,pev_velocity,f_vec)
    436.     set_pev(ent,pev_solid,SOLID_BBOX)
    437.     set_pev(ent,pev_movetype,MOVETYPE_FLY)
    438.    
    439.     if(g_ChargeForEntity[id] == 1)
    440.     {
    441.         set_pev(ent, pev_scale, 0.2)
    442.         entity_set_model(ent,SPRITE_BALL_1)
    443.     }
    444.     else if(g_ChargeForEntity[id] == 2)
    445.     {
    446.         set_pev(ent, pev_scale, 0.25)
    447.         entity_set_model(ent,SPRITE_BALL_1)
    448.     }
    449.     else if(g_ChargeForEntity[id] == 3)
    450.     {
    451.         set_pev(ent, pev_scale, 0.27)
    452.         entity_set_model(ent,SPRITE_BALL_2)
    453.     }
    454.     else if(g_ChargeForEntity[id] == 4)
    455.     {
    456.         set_pev(ent, pev_scale, 0.32)
    457.         entity_set_model(ent,SPRITE_BALL_3)
    458.     }
    459.    
    460.     set_pev(ent,pev_mins,Float:{-4.0,-4.0,-4.0})
    461.     set_pev(ent,pev_maxs,Float:{4.0,4.0,4.0})
    462.     set_pev(ent,pev_owner,id)
    463.    
    464.     set_pev(ent,pev_rendermode,kRenderTransAdd)
    465.     set_pev(ent,pev_renderamt,255.0)
    466.    
    467.     pev(id,pev_v_angle,f_vec)
    468.     set_pev(ent,pev_v_angle,f_vec)
    469. }
    470.  
    471. public BallTouch(id, ent)
    472. {
    473.     new Float:origin[3],Float:f_vec[3]
    474.     pev(ent, pev_origin, origin)
    475.     velocity_by_aim(ent,-15,f_vec)
    476.    
    477.     for(new i = 0; i < 3; i++)
    478.         origin[i] += f_vec[i]
    479.    
    480.     static classnameptd[32]
    481.     pev(id, pev_classname, classnameptd, 31)
    482.     if(equali(classnameptd, "func_breakable"))
    483.         ExecuteHamB(Ham_TakeDamage, id, 0, 0, 100.0, DMG_GENERIC)
    484.    
    485.     BallSprites(ent, origin)
    486.     BallDamage(ent)
    487. }
    488.  
    489. public BallSprites(ent, Float:origin[3])
    490. {
    491.     static owner
    492.     owner = pev(ent, pev_owner)
    493.    
    494.     if(g_ChargeForEntity[owner] == 1)
    495.     {
    496.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    497.         write_byte(TE_SPRITE);
    498.         write_coord(floatround(origin[0]))
    499.         write_coord(floatround(origin[1]))
    500.         write_coord(floatround(origin[2] + 40.0))
    501.         write_short(g_ChargeBall1_Explosion)
    502.         write_byte(30)
    503.         write_byte(225)
    504.         message_end()
    505.        
    506.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
    507.     }
    508.     else if(g_ChargeForEntity[owner] == 2)
    509.     {
    510.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
    511.         write_byte(TE_SPRITE);
    512.         write_coord(floatround(origin[0]))
    513.         write_coord(floatround(origin[1]))
    514.         write_coord(floatround(origin[2] + 40.0))
    515.         write_short(g_ChargeBall1_Explosion)
    516.         write_byte(30)
    517.         write_byte(225)
    518.         message_end()
    519.        
    520.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[12], 1.0, ATTN_NORM, 0, PITCH_NORM)
    521.     }
    522.     else if(g_ChargeForEntity[owner] == 3)
    523.     {
    524.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
    525.         write_byte(TE_SPRITE);
    526.         write_coord(floatround(origin[0]))
    527.         write_coord(floatround(origin[1]))
    528.         write_coord(floatround(origin[2] + 40.0))
    529.         write_short(g_ChargeBall2_Explosion)
    530.         write_byte(30)
    531.         write_byte(225)
    532.         message_end()
    533.        
    534.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
    535.     }
    536.     else if(g_ChargeForEntity[owner] == 4)
    537.     {
    538.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    539.         write_byte(TE_SPRITE)
    540.         write_coord(floatround(origin[0]))
    541.         write_coord(floatround(origin[1]))
    542.         write_coord(floatround(origin[2] + 40.0))
    543.         write_short(g_ChargeBall3_Explosion)
    544.         write_byte(30)
    545.         write_byte(225)
    546.         message_end()
    547.        
    548.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[14], 1.0, ATTN_NORM, 0, PITCH_NORM)
    549.     }
    550. }
    551.  
    552. public BallDamage(ent)
    553. {
    554.     static owner, attacker
    555.     owner = pev(ent, pev_owner)
    556.    
    557.     if(!is_user_alive(owner) || ze_is_user_zombie(owner))
    558.     {
    559.         attacker = 0;
    560.         return
    561.     }
    562.     else attacker = owner
    563.    
    564.     for(new i = 0; i < gMaxPlayers; i++)
    565.     {
    566.         if(i == attacker)
    567.             continue
    568.         if(!is_user_alive(i))
    569.             continue
    570.         if(!ze_is_user_zombie(i))
    571.             continue
    572.         if(entity_range(i, ent) > EXPLODE_RADIUS)
    573.             continue
    574.        
    575.         if(g_ChargeForEntity[attacker] == 1) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
    576.         else if(g_ChargeForEntity[attacker] == 2) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
    577.         else if(g_ChargeForEntity[attacker] == 3) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_2,DMG_BULLET)
    578.         else if(g_ChargeForEntity[attacker] == 4) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_3,DMG_BULLET)
    579.     }
    580.    
    581.     remove_entity(ent)
    582. }
    583.  
    584. public HookHam_Weapon_Frame(ent)
    585. {
    586.     if(!Is_CustomItem(ent))
    587.         return HAM_IGNORED
    588.    
    589.     static id
    590.     id = get_pdata_cbase(ent,41,4)
    591.    
    592.     if(get_pdata_int(ent,54,4))
    593.     {
    594.         if(get_pdata_float(ent,46,4) >= 0.0)
    595.             return HAM_IGNORED
    596.        
    597.         static clip,ammotype,ammo,j
    598.         clip = get_pdata_int(ent,51,4)
    599.         ammotype = 376 + get_pdata_int(ent,49,4)
    600.         ammo = get_pdata_int(id,ammotype,5)
    601.         j = min(WEAPON_CLIP-clip,ammo)
    602.         set_pdata_int(ent, 51, clip+j, 4)
    603.         set_pdata_int(id, ammotype, ammo-j, 5)
    604.         set_pdata_int(ent, 54, 0, 4)
    605.     }
    606.    
    607.     if(g_ChargeShots[ent] < SHOOTS_FOR_HIGH) g_ChargeState[ent] = STATE_LOW
    608.     else if(g_ChargeShots[ent] >= SHOOTS_FOR_HIGH && g_ChargeShots[ent] < SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_HIGH
    609.     else if(g_ChargeShots[ent] >= SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_EXTREME
    610.     if(g_ChargeBall[id]) g_ChargeState[ent] = STATE_CHARGE
    611.     if(g_ChargeShots[ent] > 0 && !(pev(id,pev_button) & IN_ATTACK) &&!g_ChargeBall[id])
    612.         g_ChargeShots[ent]--
    613.    
    614.     static iButton;iButton = pev(id,pev_button)
    615.     g_ChargeBall[id] = pev(ent, pev_iuser1)
    616.    
    617.     new Float:fFinshTime, Float:ScaleNew, Float:ScaleDelay[33]
    618.     pev(ent,pev_fuser1,fFinshTime)
    619.    
    620.     static ammo
    621.     ammo = get_pdata_int(ent,51,4)
    622.    
    623.     if(iButton & IN_ATTACK2)
    624.     {
    625.         if(get_pdata_float(ent, 46, 4) >= 0.0)
    626.             return HAM_IGNORED
    627.         if(ammo == 0)
    628.             return HAM_IGNORED
    629.            
    630.         g_ChargeState[ent] = STATE_CHARGE
    631.         set_pev_string(id,pev_weaponmodel2,g_AllocString_P_charge)
    632.        
    633.         if(!g_ChargeBall[id])
    634.         {
    635.             g_ChargeBall[id] = 1
    636.             fFinshTime = get_gametime()+1.0
    637.            
    638.             Play_WeaponAnim(id, 1)
    639.             emit_sound(ent, CHAN_ITEM, Weapon_Sounds[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
    640.            
    641.             set_pdata_float(ent, 48, 1.0, 4)
    642.             set_pdata_float(ent, 46, 1.0, 4)
    643.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    644.            
    645.             if(get_gametime() - 0.01 > ScaleDelay[id])
    646.             {
    647.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    648.                 ScaleNew += 0.01
    649.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    650.                 ScaleDelay[id] = get_gametime()
    651.             }
    652.            
    653.             set_pev(ent, pev_fuser1, fFinshTime)
    654.            
    655.             Set_BitVar(g_MuzzleflashBall1,id)
    656.             UnSet_BitVar(g_MuzzleflashBall2,id)
    657.             UnSet_BitVar(g_MuzzleflashBall3,id)
    658.         }
    659.         else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 1)
    660.         {
    661.             g_ChargeBall[id] = 2;
    662.             fFinshTime = get_gametime()+3.0
    663.            
    664.             Play_WeaponAnim(id,2)
    665.             emit_sound(ent, CHAN_ITEM, Weapon_Sounds[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
    666.            
    667.             set_pdata_float(ent, 48, 1.25, 4)
    668.             set_pdata_float(ent, 46, 1.25, 4)
    669.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    670.            
    671.             if(get_gametime() - 0.01 > ScaleDelay[id])
    672.             {
    673.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    674.                 ScaleNew += 0.02
    675.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    676.                 ScaleDelay[id] = get_gametime()
    677.             }
    678.            
    679.             Set_BitVar(g_MuzzleflashBall1,id)
    680.             UnSet_BitVar(g_MuzzleflashBall2,id)
    681.             UnSet_BitVar(g_MuzzleflashBall3,id)
    682.         }
    683.         else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 2)
    684.         {
    685.             g_ChargeBall[id] = 3
    686.             fFinshTime = get_gametime()+3.0
    687.            
    688.             set_pdata_float(ent, 48, 1.5, 4)
    689.             set_pdata_float(ent, 46, 1.5, 4)
    690.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    691.            
    692.             if(get_gametime() - 0.01 > ScaleDelay[id])
    693.             {
    694.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    695.                 ScaleNew += 0.05
    696.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    697.                 ScaleDelay[id] = get_gametime()
    698.             }
    699.            
    700.             UnSet_BitVar(g_MuzzleflashBall1,id)
    701.             Set_BitVar(g_MuzzleflashBall2,id)
    702.             UnSet_BitVar(g_MuzzleflashBall3,id)
    703.  
    704.         }
    705.         else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 3)
    706.         {
    707.             g_ChargeBall[id] = 4
    708.             fFinshTime = get_gametime() + 200.0
    709.            
    710.             Play_WeaponAnim(id, 3)
    711.             emit_sound(ent, CHAN_ITEM, Weapon_Sounds[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
    712.            
    713.             set_pdata_float(ent, 48, 250.0, 4)
    714.             set_pdata_float(ent, 46, 250.0, 4)
    715.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    716.            
    717.             if(get_gametime() - 0.01 > ScaleDelay[id])
    718.             {
    719.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    720.                 ScaleNew += 0.08
    721.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    722.                 ScaleDelay[id] = get_gametime()
    723.             }
    724.            
    725.             set_pev(ent, pev_fuser1, fFinshTime)
    726.             UnSet_BitVar(g_MuzzleflashBall1,id)
    727.             UnSet_BitVar(g_MuzzleflashBall2,id)
    728.             Set_BitVar(g_MuzzleflashBall3,id)
    729.         }
    730.        
    731.         iButton &= ~IN_ATTACK2;
    732.         set_pev(id,pev_button,iButton)
    733.     }
    734.     else
    735.     {
    736.         switch(g_ChargeBall[id])
    737.         {  
    738.             case 1:
    739.             {
    740.                 Play_WeaponAnim(id,4)
    741.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    742.                
    743.                 set_pdata_float(ent,48,1.63,4)
    744.                 set_pdata_float(ent,46,1.0,4)
    745.                
    746.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    747.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    748.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    749.                
    750.                 g_ChargeState[ent] = STATE_LOW
    751.                 g_ChargeShots[ent] = 0
    752.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    753.                
    754.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    755.                 MakeBall(id)
    756.                
    757.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    758.                 else set_pdata_int(ent,51, 0, 4)
    759.             }
    760.             case 2:
    761.             {
    762.                 Play_WeaponAnim(id,4);
    763.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    764.                
    765.                 set_pdata_float(ent,48,1.63,4)
    766.                 set_pdata_float(ent,46,1.0,4)
    767.                
    768.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    769.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    770.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    771.                
    772.                 g_ChargeState[ent] = STATE_LOW
    773.                 g_ChargeShots[ent] = 0
    774.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    775.                
    776.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    777.                 MakeBall(id)
    778.                
    779.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    780.                 else set_pdata_int(ent,51, 0, 4)
    781.             }
    782.             case 3:
    783.             {
    784.                 Play_WeaponAnim(id,4)
    785.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    786.                
    787.                 set_pdata_float(ent,48,1.63,4)
    788.                 set_pdata_float(ent,46,1.0,4)
    789.                
    790.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    791.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    792.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    793.                
    794.                 g_ChargeState[ent] = STATE_LOW
    795.                 g_ChargeShots[ent] = 0
    796.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    797.                
    798.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    799.                 MakeBall(id)
    800.                
    801.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    802.                 else set_pdata_int(ent,51, 0, 4)
    803.             }
    804.             case 4:
    805.             {
    806.                 Play_WeaponAnim(id,4)
    807.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    808.                
    809.                 set_pdata_float(ent,48,1.63,4)
    810.                 set_pdata_float(ent,46,1.0,4)
    811.                
    812.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    813.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    814.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    815.                
    816.                 g_ChargeState[ent] = STATE_LOW
    817.                 g_ChargeShots[ent] = 0
    818.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    819.                
    820.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    821.                 MakeBall(id)
    822.                    
    823.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    824.                 else set_pdata_int(ent,51, 0, 4)
    825.             }
    826.         }
    827.        
    828.         g_ChargeBall[id] = 0
    829.        
    830.         new Float:ResetScale[3]
    831.         pev(g_MuzzleflashBall_Ent1, pev_fuser1, ResetScale[0])
    832.         set_pev(g_MuzzleflashBall_Ent1, pev_scale, ResetScale[0])
    833.         pev(g_MuzzleflashBall_Ent2, pev_fuser1, ResetScale[1])
    834.         set_pev(g_MuzzleflashBall_Ent2, pev_scale, ResetScale[1])
    835.         pev(g_MuzzleflashBall_Ent3, pev_fuser1, ResetScale[2])
    836.         set_pev(g_MuzzleflashBall_Ent3, pev_scale, ResetScale[2])
    837.        
    838.         set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    839.         set_pev(ent,pev_iuser1,g_ChargeBall[id])
    840.     }
    841.    
    842.     return HAM_IGNORED
    843. }
    844.  
    845. public HookHam_Weapon_Reload(ent)
    846. {
    847.     if(!Is_CustomItem(ent))
    848.         return HAM_IGNORED
    849.    
    850.     static clip
    851.     clip = get_pdata_int(ent,51,4)
    852.    
    853.     if(clip >= WEAPON_CLIP)
    854.         return HAM_SUPERCEDE
    855.    
    856.     static id
    857.     id = get_pdata_cbase(ent,41,4)
    858.    
    859.     if(get_pdata_int(id, 376 + get_pdata_int(ent,49,4), 5) <= 0)
    860.         return HAM_SUPERCEDE
    861.    
    862.     set_pdata_int(ent, 51, 0,4)
    863.     ExecuteHam(Ham_Weapon_Reload, ent)
    864.     set_pdata_int(ent,51, clip, 4)
    865.     set_pdata_int(ent,54, 1,4)
    866.     set_pdata_float(ent, 46,RELOAD_TIME,4)
    867.     set_pdata_float(ent, 47,RELOAD_TIME,4)
    868.     set_pdata_float(ent, 48,RELOAD_TIME,4)
    869.     set_pdata_float(id, 83, RELOAD_TIME,5)
    870.     Play_WeaponAnim(id, ANIM_RELOAD)
    871.     return HAM_SUPERCEDE;
    872. }
    873.  
    874. public HookHam_Weapon_Idle(ent)
    875. {
    876.     if(!Is_CustomItem(ent))
    877.         return HAM_IGNORED
    878.        
    879.     if(get_pdata_float(ent, 48, 4) > 0.0)
    880.         return HAM_IGNORED
    881.        
    882.     set_pdata_float(ent,48,IDLE_TIME,4)
    883.     Play_WeaponAnim(get_pdata_cbase(ent, 41, 4), ANIM_IDLE)
    884.    
    885.     return HAM_SUPERCEDE
    886. }
    887.  
    888. public HookHam_Weapon_PrimaryAttack(ent)
    889. {
    890.     if(!Is_CustomItem(ent))
    891.         return HAM_IGNORED
    892.        
    893.     static ammo
    894.     ammo = get_pdata_int(ent,51,4)
    895.    
    896.     if(ammo <= 0)
    897.     {
    898.         ExecuteHam(Ham_Weapon_PlayEmptySound,ent);
    899.         set_pdata_float(ent,46,WEAPON_SPEED,4)
    900.         return HAM_SUPERCEDE
    901.     }
    902.        
    903.     static id; id = get_pdata_cbase(ent,41,4)
    904.     static Float:user_punchangle[3];pev(id,pev_punchangle,user_punchangle)
    905.     static fm_hooktrace;fm_hooktrace=register_forward(FM_TraceLine,"HookFm_TraceLine",true)
    906.     static fm_playbackevent;fm_playbackevent=register_forward(FM_PlaybackEvent,"HookFm_PlayBackEvent",false)
    907.    
    908.     state FireBullets: Enabled;
    909.     ExecuteHam(Ham_Weapon_PrimaryAttack,ent)
    910.     state FireBullets: Disabled;
    911.    
    912.     unregister_forward(FM_TraceLine,fm_hooktrace,true)
    913.     unregister_forward(FM_PlaybackEvent,fm_playbackevent,false)
    914.    
    915.     Play_WeaponAnim(id,random_num(ANIM_SHOOT_1,ANIM_SHOOT_2))
    916.     set_pdata_int(ent,51,ammo-1,4)
    917.     set_pdata_float(ent,48,2.0,4)
    918.     static Float:user_newpunch[3];pev(id,pev_punchangle,user_newpunch)
    919.    
    920.     user_newpunch[0]=user_punchangle[0]+(user_newpunch[0]-user_punchangle[0])*RECOIL
    921.     user_newpunch[1]=user_punchangle[1]+(user_newpunch[1]-user_punchangle[1])*RECOIL
    922.     user_newpunch[2]=user_punchangle[2]+(user_newpunch[2]-user_punchangle[2])*RECOIL
    923.     set_pev(id,pev_punchangle,user_newpunch)
    924.  
    925.     emit_sound(ent, CHAN_ITEM, Weapon_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
    926.     set_pdata_float(ent,46,WEAPON_SPEED,4)
    927.    
    928.     new Float:Origin[3]
    929.     get_weapon_position(id,Origin,.add_forward=10.0,.add_right=7.0,.add_up=-10.5)
    930.        
    931.     new Float:Velo[3]
    932.     Velo[0]=g_VecEndTrace[0]-Origin[0]
    933.     Velo[1]=g_VecEndTrace[1]-Origin[1]
    934.     Velo[2]=g_VecEndTrace[2]-Origin[2]
    935.        
    936.     vec_normalize(Velo,Velo)
    937.     vec_mul_scalar(Velo,4096.0,Velo)
    938.    
    939.     if(g_ChargeState[ent] == STATE_LOW)
    940.     {
    941.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    942.         write_byte(TE_USERTRACER)
    943.         engfunc(EngFunc_WriteCoord,Origin[0])
    944.         engfunc(EngFunc_WriteCoord,Origin[1])
    945.         engfunc(EngFunc_WriteCoord,Origin[2])
    946.         engfunc(EngFunc_WriteCoord,Velo[0])
    947.         engfunc(EngFunc_WriteCoord,Velo[1])
    948.         engfunc(EngFunc_WriteCoord,Velo[2])
    949.         write_byte(20)
    950.         write_byte(4)
    951.         write_byte(5)
    952.         message_end()
    953.        
    954.         Set_BitVar(g_Muzzleflash1,id)
    955.     }
    956.     else if(g_ChargeState[ent] == STATE_HIGH)
    957.     {
    958.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    959.         write_byte(TE_USERTRACER)
    960.         engfunc(EngFunc_WriteCoord,Origin[0])
    961.         engfunc(EngFunc_WriteCoord,Origin[1])
    962.         engfunc(EngFunc_WriteCoord,Origin[2])
    963.         engfunc(EngFunc_WriteCoord,Velo[0])
    964.         engfunc(EngFunc_WriteCoord,Velo[1])
    965.         engfunc(EngFunc_WriteCoord,Velo[2])
    966.         write_byte(20)
    967.         write_byte(5)
    968.         write_byte(5)
    969.         message_end()
    970.        
    971.         Set_BitVar(g_Muzzleflash2,id)
    972.     }
    973.     else if(g_ChargeState[ent] == STATE_EXTREME)
    974.     {
    975.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    976.         write_byte(TE_USERTRACER)
    977.         engfunc(EngFunc_WriteCoord,Origin[0])
    978.         engfunc(EngFunc_WriteCoord,Origin[1])
    979.         engfunc(EngFunc_WriteCoord,Origin[2])
    980.         engfunc(EngFunc_WriteCoord,Velo[0])
    981.         engfunc(EngFunc_WriteCoord,Velo[1])
    982.         engfunc(EngFunc_WriteCoord,Velo[2])
    983.         write_byte(20)
    984.         write_byte(1)
    985.         write_byte(5)
    986.         message_end()
    987.        
    988.         Set_BitVar(g_Muzzleflash3,id)
    989.     }
    990.     g_ChargeShots[ent]++
    991.    
    992.     return HAM_SUPERCEDE
    993. }
    994.  
    995. public HookHam_TakeDamage(victim,inflictor,attacker,Float:damage)<FireBullets: Enabled>
    996. {
    997.     new ent = fm_find_ent_by_owner(-1,weapon_name,attacker)
    998.    
    999.     if(g_ChargeState[ent] == STATE_LOW)
    1000.         SetHamParamFloat(4,damage*DAMAGE_LOW)
    1001.     else if(g_ChargeState[ent] == STATE_HIGH)
    1002.         SetHamParamFloat(4,damage*DAMAGE_HIGH)
    1003.     else if(g_ChargeState[ent] == STATE_EXTREME)
    1004.         SetHamParamFloat(4,damage*DAMAGE_EXTREME)
    1005.        
    1006.     return HAM_OVERRIDE;
    1007. }
    1008.  
    1009. public HookHam_TakeDamage()<FireBullets: Disabled>
    1010. {
    1011.     return HAM_IGNORED;
    1012. }
    1013.  
    1014. public HookHam_TakeDamage()<>
    1015. {
    1016.     return HAM_IGNORED;
    1017. }
    1018.  
    1019. public HookFm_SetModel(ent)
    1020. {
    1021.     static i,classname[32],item;pev(ent,pev_classname,classname,31);
    1022.     if(!equal(classname,"weaponbox"))
    1023.         return FMRES_IGNORED
    1024.        
    1025.     for(i=0; i < 6; i++)
    1026.     {
    1027.         item = get_pdata_cbase(ent,34+i,4)
    1028.        
    1029.         static id
    1030.         id = pev(ent,pev_owner)
    1031.        
    1032.         if(item > 0 && Is_CustomItem(item))
    1033.         {
    1034.             engfunc(EngFunc_SetModel,ent,MODEL_W)
    1035.             g_ChargeState[ent] = STATE_LOW
    1036.             g_ChargeShots[ent] = 0
    1037.             UnSet_BitVar(g_MuzzleflashBall1,id)
    1038.             UnSet_BitVar(g_MuzzleflashBall2,id)
    1039.             UnSet_BitVar(g_MuzzleflashBall3,id)
    1040.             g_ChargeBall[id] = 0
    1041.            
    1042.             return FMRES_SUPERCEDE
    1043.         }
    1044.     }
    1045.     return FMRES_IGNORED;
    1046. }
    1047.  
    1048. public HookFm_PlayBackEvent()
    1049. {
    1050.     return FMRES_SUPERCEDE
    1051. }
    1052.  
    1053. public HookFm_TraceLine(Float:tr_start[3],Float:tr_end[3],tr_flag,tr_ignore,tr)
    1054. {
    1055.     if(tr_flag&IGNORE_MONSTERS)
    1056.         return FMRES_IGNORED
    1057.        
    1058.     static hit
    1059.     hit=get_tr2(tr,TR_pHit)
    1060.    
    1061.     static Decal, glassdecal
    1062.    
    1063.     if(!glassdecal)
    1064.         glassdecal = engfunc(EngFunc_DecalIndex,"{bproof1")
    1065.    
    1066.     hit = get_tr2(tr,TR_pHit)
    1067.     if(hit > 0 && pev_valid(hit))
    1068.     {
    1069.         if(pev(hit,pev_solid) != SOLID_BSP)
    1070.             return FMRES_IGNORED
    1071.            
    1072.         else if(pev(hit,pev_rendermode) != 0) Decal=glassdecal
    1073.         else Decal = random_num(41,45)
    1074.     }
    1075.     else Decal = random_num(41,45)
    1076.  
    1077.     static Float:vecEnd[3]
    1078.     get_tr2(tr,TR_vecEndPos,vecEnd)
    1079.     g_VecEndTrace = vecEnd
    1080.    
    1081.     engfunc(EngFunc_MessageBegin,MSG_PAS,SVC_TEMPENTITY,vecEnd,0)
    1082.     write_byte(TE_GUNSHOTDECAL)
    1083.     engfunc(EngFunc_WriteCoord,vecEnd[0])
    1084.     engfunc(EngFunc_WriteCoord,vecEnd[1])
    1085.     engfunc(EngFunc_WriteCoord,vecEnd[2])
    1086.     write_short(hit>0?hit:0)
    1087.     write_byte(Decal)
    1088.     message_end()
    1089.    
    1090.     static Float:WallVector[3];get_tr2(tr,TR_vecPlaneNormal,WallVector)
    1091.     engfunc(EngFunc_MessageBegin,MSG_PVS,SVC_TEMPENTITY,vecEnd,0);
    1092.     write_byte(TE_STREAK_SPLASH)
    1093.     engfunc(EngFunc_WriteCoord,vecEnd[0]);
    1094.     engfunc(EngFunc_WriteCoord,vecEnd[1]);
    1095.     engfunc(EngFunc_WriteCoord,vecEnd[2]);
    1096.     engfunc(EngFunc_WriteCoord,WallVector[0]*random_float(25.0,30.0));
    1097.     engfunc(EngFunc_WriteCoord,WallVector[1]*random_float(25.0,30.0));
    1098.     engfunc(EngFunc_WriteCoord,WallVector[2]*random_float(25.0,30.0));
    1099.     write_byte(111)
    1100.     write_short(12)
    1101.     write_short(3)
    1102.     write_short(75)
    1103.     message_end()
    1104.    
    1105.     return FMRES_IGNORED
    1106. }
    1107.  
    1108. public HookFm_UpdateClientData(id,SendWeapons,CD_Handle)
    1109. {
    1110.     static item
    1111.     item = get_pdata_cbase(id,373,5)
    1112.     if(item <= 0 || !Is_CustomItem(item))
    1113.         return FMRES_IGNORED
    1114.        
    1115.     set_cd(CD_Handle,CD_flNextAttack,99999.0)
    1116.     return FMRES_HANDLED
    1117. }
    1118.  
    1119. public HookFm_Spawn(id)
    1120. {
    1121.     if(pev_valid(id) != 2)
    1122.         return FMRES_IGNORED
    1123.        
    1124.     static ClName[32]
    1125.     pev(id,pev_classname,ClName,31)
    1126.    
    1127.     if(strlen(ClName) < 5)
    1128.         return FMRES_IGNORED
    1129.        
    1130.     static Trie:ClBuffer
    1131.     if(!ClBuffer) ClBuffer = TrieCreate()
    1132.     if(!TrieKeyExists(ClBuffer,ClName))
    1133.     {
    1134.         TrieSetCell(ClBuffer, ClName, 1)
    1135.         RegisterHamFromEntity(Ham_TakeDamage, id, "HookHam_TakeDamage", 0)
    1136.     }
    1137.     return FMRES_IGNORED
    1138. }
    1139.  
    1140. stock make_weapon()
    1141. {
    1142.     static ent, g_AllocString_E
    1143.     if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString,weapon_name)))
    1144.         ent = engfunc(EngFunc_CreateNamedEntity,g_AllocString_E)
    1145.     else
    1146.         return 0
    1147.     if(ent <= 0)
    1148.         return 0
    1149.        
    1150.     set_pev(ent,pev_spawnflags,SF_NORESPAWN)
    1151.     set_pev(ent,pev_impulse,WEAPON_KEY)
    1152.     ExecuteHam(Ham_Spawn,ent)
    1153.    
    1154.     return ent
    1155. }
    1156.  
    1157. stock UTIL_DropWeapon(id,slot)
    1158. {
    1159.     static iEntity
    1160.     iEntity = get_pdata_cbase(id,(367 + slot),5)
    1161.    
    1162.     if(iEntity > 0)
    1163.     {
    1164.         static iNext,szWeaponName[32]
    1165.        
    1166.         do
    1167.         {
    1168.             iNext = get_pdata_cbase(iEntity,42,4);
    1169.             if(get_weaponname(get_pdata_int(iEntity, 43, 4), szWeaponName, 31))
    1170.                 engclient_cmd(id,"drop",szWeaponName)
    1171.         }
    1172.         while((iEntity=iNext)>0)
    1173.     }
    1174. }
    1175.  
    1176. stock Play_WeaponAnim(id,anim)
    1177. {
    1178.     set_pev(id,pev_weaponanim,anim)
    1179.     message_begin(MSG_ONE_UNRELIABLE,SVC_WEAPONANIM,_,id)
    1180.     write_byte(anim)
    1181.     write_byte(0)
    1182.     message_end()
    1183. }
    1184.  
    1185. stock Weaponlist(id,bool:set)
    1186. {
    1187.     if(!is_user_connected(id))
    1188.         return
    1189.        
    1190.     message_begin(MSG_ONE,Msg_WeaponList,_,id);
    1191.     write_string(set == false ? weapon_name:weapon_new);
    1192.     write_byte(3);
    1193.     write_byte(WEAPON_BPAMMO);
    1194.     write_byte(-1);
    1195.     write_byte(-1);
    1196.     write_byte(0);
    1197.     write_byte(4);
    1198.     write_byte(20);
    1199.     write_byte(0);
    1200.     message_end();
    1201. }
    1202.  
    1203. stock get_weapon_position(id,Float:fOrigin[3],Float:add_forward=0.0,Float:add_right=0.0,Float:add_up=0.0)
    1204. {
    1205.     static Float:Angles[3],Float:ViewOfs[3],Float:vAngles[3]
    1206.     static Float:Forward[3],Float:Right[3],Float:Up[3]
    1207.     pev(id,pev_v_angle,vAngles)
    1208.     pev(id,pev_origin,fOrigin)
    1209.     pev(id,pev_view_ofs,ViewOfs)
    1210.     vec_add(fOrigin,ViewOfs,fOrigin)
    1211.     pev(id,pev_v_angle,Angles)
    1212.     engfunc(EngFunc_MakeVectors,Angles)
    1213.     global_get(glb_v_forward,Forward)
    1214.     global_get(glb_v_right,Right)
    1215.     global_get(glb_v_up,Up)
    1216.     vec_mul_scalar(Forward,add_forward,Forward)
    1217.     vec_mul_scalar(Right,add_right,Right)
    1218.     vec_mul_scalar(Up,add_up,Up)
    1219.     fOrigin[0]=fOrigin[0]+Forward[0]+Right[0]+Up[0]
    1220.     fOrigin[1]=fOrigin[1]+Forward[1]+Right[1]+Up[1]
    1221.     fOrigin[2]=fOrigin[2]+Forward[2]+Right[2]+Up[2]
    1222. }
    1223.  
    1224. vec_add(const Float:in1[],const Float:in2[],Float:out[])
    1225. {
    1226.     out[0]=in1[0]+in2[0];
    1227.     out[1]=in1[1]+in2[1];
    1228.     out[2]=in1[2]+in2[2];
    1229. }
    1230.  
    1231. vec_mul_scalar(const Float:vec[],Float:scalar,Float:out[])
    1232. {
    1233.     out[0]=vec[0]*scalar;
    1234.     out[1]=vec[1]*scalar;
    1235.     out[2]=vec[2]*scalar;
    1236. }
    1237.  
    1238. vec_normalize(const Float:vec[],Float:out[])
    1239. {
    1240.     new Float:invlen=rsqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
    1241.     out[0]=vec[0]*invlen;
    1242.     out[1]=vec[1]*invlen;
    1243.     out[2]=vec[2]*invlen;
    1244. }
    1245.  
    1246. Float:rsqrt(Float:x)
    1247. {
    1248.     new Float:xhalf=x*0.5;
    1249.    
    1250.     new i=_:x;
    1251.     i=0x5f375a84 - (i>>1);
    1252.     x=Float:i;
    1253.            
    1254.     x=x*(1.5-xhalf*x*x);
    1255.     x=x*(1.5-xhalf*x*x);
    1256.     x=x*(1.5-xhalf*x*x);
    1257.        
    1258.     return x;
    1259. }
Minigun:
    1. #include <zombie_escape>
    2. #include <fakemeta_util>
    3. #include <xs>
    4.  
    5. #define PLUGIN "[MW2] Auto Minigun"
    6. #define VERSION "1.0"
    7. #define AUTHOR "Dias"
    8.  
    9. new g_player_main[33], g_remoting[33], g_player_main2[33], g_firing[33],
    10. g_preparing[33], g_ending[33], g_reloading[500]
    11. new Float:g_last_firesound[33]
    12. new const base_model[] = "models/mw2_auto/base.mdl"
    13. new const main_model[] = "models/mw2_auto/main.mdl"
    14. new const muzzleflash_spr[] = "sprites/muzzleflash3_auto.spr"
    15. new muzzleflash_spr_id, Float:g_last_shoot[33]
    16. new g_blood, g_bloodspray, g_dead[500], g_exp_id, g_owner[500], Float:g_check_heat[33]
    17.  
    18. new const minigun_sound[3][] = {
    19.     "mw2_auto/minigun-starting.wav",
    20.     "mw2_auto/minigun-shooting.wav",
    21.     "mw2_auto/minigun-stoping.wav"
    22. }
    23.  
    24. new g_had_minigun[33], g_reg, g_heat[500], g_sync_hud1
    25. new cvar_minigun_health, cvar_minigun_dmgrand_start, cvar_minigun_dmgrand_end,
    26. cvar_delay_attack, cvar_reload_time
    27.  
    28.  
    29. // Weapon entity names
    30. new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
    31.             "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
    32.             "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
    33.             "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
    34.             "weapon_ak47", "weapon_knife", "weapon_p90" }
    35.  
    36. public plugin_init()
    37. {
    38.     register_plugin(PLUGIN, VERSION, AUTHOR)
    39.    
    40.     register_event("HLTV", "event_newround", "a", "1=0", "2=0")
    41.     register_event("DeathMsg", "event_death", "a")
    42.    
    43.     register_think("mw2_mingun_main", "fw_main_think")
    44.     register_forward(FM_CmdStart, "fw_CmdStart")
    45.     for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
    46.         if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
    47.    
    48.     g_sync_hud1 = CreateHudSyncObj(645)
    49.    
    50.     // Cvars
    51.     cvar_minigun_health = register_cvar("zp_minigun_health", "500")
    52.     cvar_minigun_dmgrand_start = register_cvar("zp_minigun_dmgrand_start", "10")
    53.     cvar_minigun_dmgrand_end = register_cvar("zp_minigun_dmgrand_end", "30")
    54.     cvar_delay_attack = register_cvar("zp_minigun_delay_attack", "0.1")
    55.     cvar_reload_time = register_cvar("zp_minigun_reload_time", "30.0")
    56.    
    57.     //register_clcmd("say /make", "create_minigun")
    58.     //register_clcmd("say /remote", "remote_minigun")
    59. }
    60.  
    61. public plugin_precache()
    62. {
    63.     precache_model(base_model)
    64.     precache_model(main_model)
    65.    
    66.     for(new i = 0; i < sizeof(minigun_sound); i++)
    67.         engfunc(EngFunc_PrecacheSound, minigun_sound[i])
    68.    
    69.     muzzleflash_spr_id = precache_model(muzzleflash_spr)
    70.     g_blood = precache_model("sprites/blood.spr")
    71.     g_bloodspray = precache_model("sprites/bloodspray.spr")    
    72.     g_exp_id = precache_model("sprites/zerogxplode.spr")
    73. }
    74.  
    75. public plugin_natives()
    76. {
    77.     register_native("give_minigun","native_give_minigun", 1)
    78. }
    79.  
    80. public native_give_minigun(id)
    81. {
    82.     g_had_minigun[id] = 1
    83.     create_minigun(id)
    84.     client_printcolor(id, "!g[ZE]!y Hold !t(E)!y for 3 seconds to put MW2 Auto-Minigun !!!")
    85. }
    86.  
    87. public event_newround()
    88. {
    89.     remove_entity_name("mw2_mingun_base")
    90.     remove_entity_name("mw2_mingun_main")
    91.     remove_entity_name("mw2_mingun_view")
    92.    
    93.     for(new i = 0; i < get_maxplayers(); i++)
    94.     {
    95.         if(is_user_alive(i) && is_user_connected(i))
    96.         {
    97.             reset_minigun(i)
    98.         }
    99.     }
    100. }
    101.  
    102. public event_death()
    103. {
    104.     static victim
    105.     victim = read_data(2)
    106.    
    107.     reset_minigun(victim)
    108. }
    109.  
    110. public reset_minigun(id)
    111. {
    112.     attach_view(id, id)
    113.    
    114.     g_had_minigun[id] = 0
    115.     g_player_main[id] = 0
    116.     g_player_main2[id] = 0
    117.     g_remoting[id] = 0
    118.     g_preparing[id] = 0
    119.     g_firing[id] = 0
    120.     g_ending[id] = 0
    121.    
    122.     remove_task(id+2479)
    123.  
    124.     message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
    125.     write_short(0)
    126.     message_end()  
    127. }
    128.  
    129. public create_minigun(id)
    130. {
    131.     if(!g_had_minigun[id])
    132.         return
    133.    
    134.     g_had_minigun[id] = 0
    135.    
    136.     new Float:Origin[3], Float:Angles[3]
    137.    
    138.     get_position(id, 40.0, 0.0, 0.0, Origin)
    139.     pev(id, pev_angles, Angles)
    140.    
    141.     // Make the Base
    142.     new ent = create_entity("info_target")
    143.     entity_set_origin(ent, Origin);
    144.    
    145.     Angles[0] = 0.0
    146.     entity_set_vector(ent, EV_VEC_angles, Angles)
    147.  
    148.     entity_set_string(ent,EV_SZ_classname, "mw2_mingun_base")
    149.     entity_set_model(ent, base_model);
    150.     entity_set_int(ent,EV_INT_solid, SOLID_NOT)
    151.    
    152.     entity_set_float(ent,EV_FL_takedamage,1.0)
    153.     entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)
    154.  
    155.     new Float:maxs[3] = {10.0,10.0,1.0}
    156.     new Float:mins[3] = {-10.0,-10.0,-1.0}
    157.     entity_set_size(ent,mins,maxs)
    158.    
    159.     set_entity_anim(ent, 0)
    160.     g_dead[ent] = 0
    161.     g_owner[ent] = id
    162.    
    163.     entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
    164.    
    165.     drop_to_floor(ent)
    166.    
    167.     // Create Main
    168.     ent = create_entity("info_target")
    169.    
    170.     Origin[2] -= 35.0
    171.     entity_set_origin(ent, Origin);
    172.     entity_set_vector(ent, EV_VEC_angles, Angles)
    173.    
    174.     entity_set_string(ent,EV_SZ_classname, "mw2_mingun_main")
    175.     entity_set_model(ent, main_model);
    176.     entity_set_int(ent,EV_INT_solid, SOLID_BBOX)
    177.    
    178.     entity_set_float(ent,EV_FL_takedamage,1.0)
    179.     entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)  
    180.  
    181.     new Float:maxs2[3] = {10.0,10.0,20.0}
    182.     new Float:mins2[3] = {-10.0,-10.0,-20.0}
    183.     entity_set_size(ent,mins2,maxs2)   
    184.    
    185.     set_entity_anim(ent, 0)
    186.     g_heat[ent] = 0
    187.    
    188.     entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)  
    189.     g_player_main[id] = ent
    190.     g_dead[ent] = 0
    191.     g_owner[ent] = id
    192.     g_reloading[ent] = 0
    193.    
    194.     drop_to_floor(ent)
    195.     if(!g_reg)
    196.     {
    197.         g_reg = 1
    198.         RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_main_takedamage")
    199.     }
    200.    
    201.     // Create View Ent
    202.     ent = create_entity("info_target")
    203.    
    204.     get_position(id, 40.0, 0.0, 10.0, Origin)
    205.    
    206.     entity_set_origin(ent, Origin);
    207.     entity_set_vector(ent, EV_VEC_angles, Angles)
    208.    
    209.     entity_set_string(ent,EV_SZ_classname, "mw2_mingun_view")
    210.     entity_set_model(ent, main_model);
    211.    
    212.     fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
    213.    
    214.     g_player_main2[id] = ent
    215. }
    216.  
    217. public ze_user_infected(id)
    218. {
    219.     reset_minigun(id)
    220. }
    221.  
    222. public do_remote(id)
    223. {
    224.     id -= 2479
    225.    
    226.     remote_minigun(id)
    227. }
    228.  
    229. public remote_minigun(id)
    230. {
    231.     if(!g_player_main[id])
    232.         return
    233.        
    234.     attach_view(id, g_player_main2[id])
    235.     engclient_cmd(id, "weapon_knife")
    236.    
    237.     set_task(1.0, "task_delay", id)
    238.    
    239.     client_printcolor(id, "!g[ZE]!y Press !t(E)!y to turn of the MW2-Auto Minigun !!!")
    240. }
    241.  
    242. public task_delay(id)
    243. {
    244.     g_remoting[id] = 1
    245. }
    246.  
    247. public client_PostThink(id)
    248. {
    249.     if(!g_remoting[id])
    250.         return
    251.     if(!g_player_main[id])
    252.         return 
    253.     if(!pev_valid(g_player_main[id]))
    254.     {
    255.         reset_minigun(id)
    256.         return
    257.     }
    258.    
    259.     if(!g_firing[id] && !g_reloading[g_player_main[id]])
    260.     {
    261.         if(g_heat[g_player_main[id]] > 0)
    262.         {
    263.             static Float:CurTime
    264.             CurTime = get_gametime()
    265.            
    266.             if(CurTime - get_pcvar_float(cvar_delay_attack) * 2 > g_check_heat[id])
    267.             {
    268.                 g_heat[g_player_main[id]]--
    269.                 g_check_heat[id] = CurTime
    270.             }
    271.         }
    272.     }
    273.    
    274.     static Message[64]
    275.    
    276.     if(g_heat[g_player_main[id]] <= 0)
    277.     {
    278.         set_hudmessage(0, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
    279.         formatex(Message, sizeof(Message), "Status: Good")
    280.     } else if(g_heat[g_player_main[id]] > 0 && g_heat[g_player_main[id]] < 100) {
    281.         set_hudmessage(255, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
    282.         formatex(Message, sizeof(Message), "Status: Heat %i%%", g_heat[g_player_main[id]])
    283.     } else if(g_heat[g_player_main[id]] >= 100) {
    284.         set_hudmessage(255, 0, 0, -1.0, 0.90, 0, 1.0, 1.0)
    285.         formatex(Message, sizeof(Message), "Status: OverHeat")
    286.     }
    287.    
    288.     ShowSyncHudMsg(id, g_sync_hud1, Message)
    289.    
    290.     static Float:NewAngles[3], Float:OldAngles[3], Float:Origin[3]
    291.     pev(id, pev_angles, NewAngles)
    292.     pev(g_player_main[id], pev_angles, OldAngles)
    293.    
    294.     NewAngles[2] = OldAngles[2]
    295.    
    296.     pev(g_player_main2[id], pev_origin, Origin)
    297.     //get_position(g_player_main2[id], -10.0, 0.0, 0.0, Origin)
    298.    
    299.     set_pev(g_player_main[id], pev_v_angle, NewAngles)
    300.     set_pev(g_player_main2[id], pev_angles, NewAngles)
    301.    
    302.     NewAngles[0] -= NewAngles[0] * 2
    303.     set_pev(g_player_main[id], pev_angles, NewAngles)
    304.    
    305.     if(get_user_weapon(id) != CSW_KNIFE)
    306.         engclient_cmd(id, "weapon_knife")
    307. }
    308.  
    309. public fw_main_think(ent)
    310. {
    311.     if(!pev_valid(ent))
    312.         return
    313.     if(pev(ent, pev_health) - 1000.0 < 0)
    314.     {
    315.         if(!g_dead[ent])
    316.             minigun_dead(ent)
    317.            
    318.         return
    319.     }
    320.    
    321.     if(!g_dead[ent])
    322.         entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)  
    323. }
    324.  
    325. public fw_main_takedamage(victim, inflictor, attacker, Float:Damage, damagebits)
    326. {
    327.     if(!is_user_alive(attacker) || !is_user_connected(attacker))
    328.         return HAM_IGNORED
    329.    
    330.     static Health
    331.     Health = pev(victim, pev_health) - 1000
    332.    
    333.     client_print(attacker, print_center, "MW2 Auto-Minigun Health: %i", Health)
    334.    
    335.     return HAM_HANDLED
    336. }
    337.  
    338. public minigun_dead(ent)
    339. {
    340.     g_dead[ent] = 1
    341.    
    342.     static Float:Origin[3]
    343.     pev(ent, pev_origin, Origin)
    344.    
    345.     message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    346.     write_byte(TE_EXPLOSION)
    347.     engfunc(EngFunc_WriteCoord, Origin[0])
    348.     engfunc(EngFunc_WriteCoord, Origin[1])
    349.     engfunc(EngFunc_WriteCoord, Origin[2])
    350.     write_short(g_exp_id)   // sprite index
    351.     write_byte(30)  // scale in 0.1's
    352.     write_byte(30)  // framerate
    353.     write_byte(0)   // flags
    354.     message_end()
    355.    
    356.     static id
    357.     id = g_owner[ent]
    358.    
    359.     if(is_user_connected(id))
    360.     {
    361.         reset_minigun(id)
    362.         client_printcolor(id, "!g[ZE]!y Your MW2 Auto-Minigun has been !tDestroyed!y !!!")
    363.     }
    364.    
    365.     Origin[0] = 9999.0
    366.     Origin[1] = 9999.0
    367.     Origin[2] = 9999.0
    368.    
    369.     set_pev(ent, pev_origin, Origin)
    370. }
    371.  
    372. public fw_CmdStart(id, uc_handle, seed)
    373. {
    374.     if(!is_user_alive(id) || !is_user_connected(id))
    375.         return FMRES_IGNORED
    376.     if(!g_player_main[id])
    377.         return FMRES_IGNORED
    378.        
    379.     static PressButton
    380.     PressButton = get_uc(uc_handle, UC_Buttons)
    381.    
    382.     if(g_remoting[id])
    383.     {
    384.         if(PressButton & IN_ATTACK)
    385.         {
    386.             static Float:CurTime
    387.             CurTime = get_gametime()
    388.            
    389.             if(CurTime - get_pcvar_float(cvar_delay_attack) > g_last_shoot[id])
    390.             {
    391.                 if(!g_preparing[id] && !g_firing[id] && !g_ending[id])
    392.                 {
    393.                     g_preparing[id] = 1
    394.                     g_firing[id] = 0
    395.                    
    396.                     set_entity_anim(g_player_main[id], 1)
    397.                     set_task(1.5, "start_attack", id)
    398.                    
    399.                     emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
    400.                 }
    401.                
    402.                 if(!g_preparing[id] && g_firing[id] && !g_ending[id] && g_heat[g_player_main[id]] < 100)
    403.                 {
    404.                     minigun_shoot(id)
    405.                    
    406.                     if(CurTime - get_pcvar_float(cvar_delay_attack) > g_check_heat[id])
    407.                     {
    408.                         if(g_heat[g_player_main[id]] < 100)
    409.                         {
    410.                             g_heat[g_player_main[id]]++
    411.                         }
    412.                        
    413.                         g_check_heat[id] = CurTime
    414.                     }
    415.                 } else if(g_heat[g_player_main[id]] >= 100) {
    416.                     if(!g_preparing[id] && g_firing[id] && !g_ending[id] && !g_reloading[g_player_main[id]])
    417.                     {
    418.                         g_firing[id] = 0
    419.                         g_preparing[id] = 0
    420.                         g_ending[id] = 1
    421.                        
    422.                         set_entity_anim(g_player_main[id], 3)
    423.                    
    424.                         emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
    425.                         set_task(2.0, "stop_attack", id)
    426.                        
    427.                         static Message[128]
    428.                         formatex(Message, sizeof(Message), "!g[ZE]!y System is overheat. Please wait !t%i!y seconds !!!", get_pcvar_float(cvar_reload_time))
    429.                        
    430.                         client_printcolor(id, Message)
    431.                        
    432.                         g_reloading[g_player_main[id]] = 1
    433.                         set_task(get_pcvar_float(cvar_reload_time), "reload_heat", id)
    434.                     }
    435.                 }
    436.                
    437.                 g_last_shoot[id] = CurTime
    438.             }
    439.            
    440.             PressButton &= ~IN_ATTACK
    441.             set_uc(uc_handle, UC_Buttons, PressButton)
    442.         } else {
    443.             if(pev(id, pev_oldbuttons) & IN_ATTACK)
    444.             {
    445.                 if(g_preparing[id] || g_firing[id])
    446.                 {
    447.                     g_firing[id] = 0
    448.                     g_preparing[id] = 0
    449.                     g_ending[id] = 1
    450.                    
    451.                     set_entity_anim(g_player_main[id], 3)
    452.                    
    453.                     emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
    454.                     set_task(2.0, "stop_attack", id)
    455.                 }
    456.             }
    457.         }
    458.     }
    459.    
    460.     if(PressButton & IN_USE)
    461.     {
    462.         if(g_remoting[id])
    463.         {
    464.             set_task(1.0, "task_delay2", id)
    465.             attach_view(id, id)
    466.             g_preparing[id] = 0
    467.             g_firing[id] = 0
    468.            
    469.             PressButton &= ~IN_USE
    470.             set_uc(uc_handle, UC_Buttons, PressButton)
    471.         } else {
    472.             if(!task_exists(id+2479))
    473.             {
    474.                 set_task(3.0, "do_remote", id+2479)
    475.                
    476.                 message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
    477.                 write_short(3)
    478.                 message_end()
    479.             }
    480.         }
    481.     } else {
    482.         if(pev(id, pev_oldbuttons) & IN_USE)
    483.         {
    484.             remove_task(id+2479)
    485.  
    486.             message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("BarTime"), {0,0,0}, id)
    487.             write_short(0)
    488.             message_end()
    489.         }
    490.     }
    491.    
    492.     return FMRES_HANDLED
    493. }
    494.  
    495. public reload_heat(id)
    496. {
    497.     if(!pev_valid(g_player_main[id]))
    498.         return
    499.    
    500.     g_heat[g_player_main[id]] = 0
    501.     g_reloading[g_player_main[id]] = 0
    502. }
    503.  
    504. public task_delay2(id)
    505. {
    506.     g_remoting[id] = 0
    507. }
    508.  
    509. public start_attack(id)
    510. {
    511.     g_preparing[id] = 0
    512.     g_firing[id] = 1
    513. }
    514.  
    515. public stop_attack(id)
    516. {
    517.     g_preparing[id] = 0
    518.     g_firing[id] = 0
    519.     g_ending[id] = 0
    520. }
    521.  
    522. public minigun_shoot(id)
    523. {
    524.     if(!g_remoting[id])
    525.     {
    526.         return PLUGIN_HANDLED
    527.     }
    528.    
    529.     static Float:CurTime
    530.     CurTime = get_gametime()
    531.    
    532.     if(CurTime - 0.1 > g_last_firesound[id])
    533.     {
    534.         PlaySound(id, minigun_sound[1])
    535.         emit_sound(g_player_main[id], CHAN_BODY, minigun_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
    536.         g_last_firesound[id] = CurTime
    537.     }
    538.    
    539.     set_entity_anim(g_player_main[id], 2)
    540.    
    541.     static Float:Origin[3], Float:AimOrigin[3]
    542.     get_position(g_player_main[id], 50.0, 0.0, 0.0, Origin)
    543.    
    544.     Origin[2] += 20.0
    545.    
    546.     message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    547.     write_byte(TE_EXPLOSION)
    548.     engfunc(EngFunc_WriteCoord, Origin[0])
    549.     engfunc(EngFunc_WriteCoord, Origin[1])
    550.     engfunc(EngFunc_WriteCoord, Origin[2])
    551.     write_short(muzzleflash_spr_id)    // sprite index
    552.     write_byte(5)    // scale in 0.1's
    553.     write_byte(10)    // framerate
    554.     write_byte(4)    // flags
    555.     message_end()  
    556.    
    557.     static Float:Punch[3]
    558.     Punch[0] = random_float(1.0, 5.0)
    559.     Punch[1] = random_float(1.0, 5.0)
    560.     Punch[2] = random_float(1.0, 10.0)
    561.    
    562.     set_pev(id, pev_punchangle, Punch)
    563.                
    564.     get_position(g_player_main[id], 70.0, 0.0, 30.0, Origin)
    565.     get_position(g_player_main[id], 4000.0, 0.0, 30.0, AimOrigin)
    566.     create_tracer(id, Origin, AimOrigin)
    567.    
    568.     get_position(g_player_main[id], 4000.0, -30.0, 50.0, AimOrigin)
    569.     create_tracer(id, Origin, AimOrigin)
    570.    
    571.     get_position(g_player_main[id], 4000.0, 30.0, -50.0, AimOrigin)
    572.     create_tracer(id, Origin, AimOrigin)
    573.    
    574.     get_position(g_player_main[id], 4000.0, -60.0, -70.0, AimOrigin)
    575.     create_tracer(id, Origin, AimOrigin)
    576.    
    577.     get_position(g_player_main[id], 4000.0, 60.0, 70.0, AimOrigin)
    578.     create_tracer(id, Origin, AimOrigin)   
    579.    
    580.     return PLUGIN_HANDLED
    581. }
    582.  
    583. // Ham Weapon Deploy Forward
    584. public fw_Item_Deploy_Post(weapon_ent)
    585. {
    586.     if(pev_valid(weapon_ent))
    587.         return HAM_IGNORED
    588.        
    589.     static id
    590.     id = pev(weapon_ent, pev_owner)
    591.    
    592.     if(g_remoting[id])
    593.         engclient_cmd(id, "weapon_knife")
    594.        
    595.     return HAM_HANDLED
    596. }
    597.  
    598. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
    599. {
    600.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    601.    
    602.     pev(id, pev_origin, vOrigin)
    603.     pev(id, pev_view_ofs,vUp) //for player
    604.     xs_vec_add(vOrigin,vUp,vOrigin)
    605.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    606.    
    607.     vAngle[0] = 0.0
    608.    
    609.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
    610.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
    611.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
    612.    
    613.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    614.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    615.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    616. }
    617.  
    618. stock create_tracer(id, Float:start[3], Float:end[3])
    619. {
    620.     new start_[3], end_[3]
    621.     FVecIVec(start, start_)
    622.     FVecIVec(end, end_)
    623.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    624.     write_byte(TE_TRACER)
    625.     write_coord(start_[0])
    626.     write_coord(start_[1])
    627.     write_coord(start_[2])
    628.     write_coord(end_[0])
    629.     write_coord(end_[1])
    630.     write_coord(end_[2])
    631.     message_end()
    632.    
    633.     static tr, Float:End_Origin[3], Target
    634.     engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr)   
    635.    
    636.     get_tr2(tr, TR_vecEndPos, End_Origin)
    637.     Target = get_tr2(tr, TR_pHit)
    638.    
    639.     if(is_user_alive(Target) && ze_is_user_zombie(Target))
    640.     {
    641.         static Float:Origin[3]
    642.         pev(Target, pev_origin, Origin)
    643.        
    644.         // Show some blood :)
    645.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    646.         write_byte(TE_BLOODSPRITE)
    647.         write_coord(floatround(Origin[0]))
    648.         write_coord(floatround(Origin[1]))
    649.         write_coord(floatround(Origin[2]))
    650.         write_short(g_bloodspray)
    651.         write_short(g_blood)
    652.         write_byte(70)
    653.         write_byte(random_num(1,2))
    654.         message_end()
    655.        
    656.        
    657.         ExecuteHamB(Ham_TakeDamage, Target, 0, id, random_float(get_pcvar_float(cvar_minigun_dmgrand_start), get_pcvar_float(cvar_minigun_dmgrand_end)), DMG_BULLET)
    658.     }
    659.    
    660.     make_bullet(id, End_Origin)
    661. }
    662.  
    663. stock make_bullet(id, Float:Origin[3])
    664. {
    665.     // Find target
    666.     new target, body
    667.     get_user_aiming(id, target, body, 999999)
    668.    
    669.     if(target > 0 && target <= get_maxplayers())
    670.     {
    671.         new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3]
    672.         pev(id, pev_origin, fStart)
    673.        
    674.         // Get ids view direction
    675.         velocity_by_aim(id, 64, fVel)
    676.        
    677.         // Calculate position where blood should be displayed
    678.         fStart[0] = Origin[0]
    679.         fStart[1] = Origin[1]
    680.         fStart[2] = Origin[2]
    681.         fEnd[0] = fStart[0]+fVel[0]
    682.         fEnd[1] = fStart[1]+fVel[1]
    683.         fEnd[2] = fStart[2]+fVel[2]
    684.        
    685.         // Draw traceline from victims origin into ids view direction to find
    686.         // the location on the wall to put some blood on there
    687.         new res
    688.         engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res)
    689.         get_tr2(res, TR_vecEndPos, fRes)
    690.        
    691.         // Show some blood :)
    692.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    693.         write_byte(TE_BLOODSPRITE)
    694.         write_coord(floatround(fStart[0]))
    695.         write_coord(floatround(fStart[1]))
    696.         write_coord(floatround(fStart[2]))
    697.         write_short(g_bloodspray)
    698.         write_short(g_blood)
    699.         write_byte(70)
    700.         write_byte(random_num(1,2))
    701.         message_end()
    702.        
    703.        
    704.         } else {
    705.         new decal = 41
    706.        
    707.         // Check if the wall hit is an entity
    708.         if(target)
    709.         {
    710.             // Put decal on an entity
    711.             message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    712.             write_byte(TE_DECAL)
    713.             write_coord(floatround(Origin[0]))
    714.             write_coord(floatround(Origin[1]))
    715.             write_coord(floatround(Origin[2]))
    716.             write_byte(decal)
    717.             write_short(target)
    718.             message_end()
    719.             } else {
    720.             // Put decal on "world" (a wall)
    721.             message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    722.             write_byte(TE_WORLDDECAL)
    723.             write_coord(floatround(Origin[0]))
    724.             write_coord(floatround(Origin[1]))
    725.             write_coord(floatround(Origin[2]))
    726.             write_byte(decal)
    727.             message_end()
    728.         }
    729.        
    730.         // Show sparcles
    731.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    732.         write_byte(TE_GUNSHOTDECAL)
    733.         write_coord(floatround(Origin[0]))
    734.         write_coord(floatround(Origin[1]))
    735.         write_coord(floatround(Origin[2]))
    736.         write_short(id)
    737.         write_byte(decal)
    738.         message_end()
    739.     }
    740. }
    741.  
    742. stock set_entity_anim(ent, anim)
    743. {
    744.     entity_set_float(ent, EV_FL_animtime, get_gametime())
    745.     entity_set_float(ent, EV_FL_framerate, 1.0)
    746.     entity_set_int(ent, EV_INT_sequence, anim)
    747. }
    748.  
    749. stock client_printcolor(const id, const input[], any:...)
    750. {
    751.     new iCount = 1, iPlayers[32]
    752.     static szMsg[191]
    753.    
    754.     vformat(szMsg, charsmax(szMsg), input, 3)
    755.     replace_all(szMsg, 190, "!g", "^4")
    756.     replace_all(szMsg, 190, "!y", "^1")
    757.     replace_all(szMsg, 190, "!t", "^3")
    758.    
    759.     if(id) iPlayers[0] = id
    760.     else get_players(iPlayers, iCount, "ch")
    761.    
    762.     for (new i = 0; i < iCount; i++)
    763.     {
    764.         if(is_user_connected(iPlayers[i]))
    765.         {
    766.             message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
    767.             write_byte(iPlayers[i])
    768.             write_string(szMsg)
    769.             message_end()
    770.         }
    771.     }
    772. }
He who fails to plan is planning to fail

Post Reply

Create an account or sign in to join the discussion

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

Create an account

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

Register

Sign in

Who is online

Users browsing this forum: No registered users and 7 guests