Available Ion cannon

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

Ion cannon

#1

Post by czirimbolo » 5 years ago

Can someone convert this to our mod? Thanks

Code: Select all

#include <amxmodx>
#include <fakemeta>
#include <zombieplague>

#define IGNORE_MONSTERS                 1
#define IGNORE_GLASS                    0x100

#define ION_RADIUS 	2000.0
#define ION_MAXDAMAGE 	54200.0

new const WPN_NAME[]	=	"Ion Cannon"

new const W_MODEL[]	=		"models/w_battery.mdl"

new SOUND_APPROACH[]	=	"zombie_plague/ion_canon/approach.wav"
new SOUND_START_PLANT[]	=	"zombie_plague/ion_canon/beacon_set.wav"
new SOUND_STOP[]	=		"vox/_comma.wav"
new SOUND_BEEP[]	=		"zombie_plague/ion_canon/beacon_beep.wav"
new SOUND_ATTACK[]	=		"zombie_plague/ion_canon/attack.wav"
new SOUND_READY[]	=		"zombie_plague/ion_canon/ready.wav"

new g_Target[33], i_Pitch[33]
new Float:i_BeaconTime[33]
new Float:ion_mid_origin[33][3]
new Float:beam_origin[33][8][3]
new Float:g_degrees[33][8]
new Float:g_distance[33]
new Float:ROTATION_SPEED[33]
new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, IonShake, LaserFlame

//---------------------------------------
new gItemID
new bool:gHasIon[33]
new const gCost = 30	// Item Cost
new bool:bInUse[33]
new g_msgDeathMsg
//---------------------------------------
public plugin_init ()
{
	register_plugin ( "[ZP] ExtraItem: Ion Cannon", "1.91", "A.F./ Makzz / Shidla" )
	
	gItemID		= zp_register_extra_item ( WPN_NAME, gCost, ZP_TEAM_ANY )
	
	IonShake	= get_user_msgid ( "ScreenShake" )
	g_msgDeathMsg	= get_user_msgid("DeathMsg")
	
	register_forward ( FM_PlayerPreThink, "fw_PlayerPreThink" )
}

public client_connect(id)
{
	g_Target[id] = 0
	gHasIon[id] = false
}

public plugin_precache ()
{
	precache_model ( W_MODEL )
	precache_sound ( SOUND_APPROACH )
	precache_sound ( SOUND_START_PLANT )
	precache_sound ( SOUND_BEEP )
	precache_sound ( SOUND_ATTACK )
	precache_sound ( SOUND_READY )
	precache_sound ( SOUND_STOP )
	IonBeam		= precache_model("sprites/ion_canon/ionbeam.spr")
	BlueFlare	= precache_model("sprites/ion_canon/bflare.spr")
	ReadyFire	= precache_model("sprites/ion_canon/fire.spr")
	BlueFire	= precache_model("sprites/ion_canon/blueflame.spr")
	LaserFlame	= precache_model("sprites/ion_canon/ion_laserflame.spr")
	Shockwave	= precache_model("sprites/shockwave.spr")
}

public ion_planted ( id )
{
	id -= 5000
	client_print ( id, print_chat, "Ion cannon beacon deploy" )
	
	g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	if(!g_Target[id])
		return
	
	set_pev(g_Target[id],pev_classname,"info_target_ion")
	engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
	
	set_pev(g_Target[id],pev_owner, id)
	set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
	set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
	
	wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
	set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
	
	ion_beacon(id)
	//set_task(5.0,"ion_startup", id)
	set_task ( 25.0, "Trace_Ready", id )
}

public ion_beacon ( id )
{
	if ( !g_Target[id] )
		return
	
	i_Pitch[id] += 3
	i_BeaconTime[id] -= 0.03
	if(i_Pitch[id] > 255)
		i_Pitch[id] = 255
	
	if(i_BeaconTime[id] < 0.30)
		i_BeaconTime[id] = 0.30
	
	emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
	set_task(i_BeaconTime[id],"ion_beacon", id)
}

public Trace_Ready(id)
{
	remove_task(id)
	// write origin of each
	new Float:mid_origin[33][3]
	pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
	// 1st
	beam_origin[id][0][0] = mid_origin[id][0] + 300.0
	beam_origin[id][0][1] = mid_origin[id][1] + 150.0
	beam_origin[id][0][2] = mid_origin[id][2]
	g_degrees[id][0] = 0.0
	// 2nd
	beam_origin[id][1][0] = mid_origin[id][0] + 300.0
	beam_origin[id][1][1] = mid_origin[id][1] - 150.0
	beam_origin[id][1][2] = mid_origin[id][2]
	g_degrees[id][1] = 45.0
	// 3rd 
	beam_origin[id][2][0] = mid_origin[id][0] - 300.0
	beam_origin[id][2][1] = mid_origin[id][1] - 150.0
	beam_origin[id][2][2] = mid_origin[id][2]
	g_degrees[id][2] = 90.0
	// 4th 
	beam_origin[id][3][0] = mid_origin[id][0] - 300.0
	beam_origin[id][3][1] = mid_origin[id][1] + 150.0
	beam_origin[id][3][2] = mid_origin[id][2]
	g_degrees[id][3] = 135.0
	// 5th 
	beam_origin[id][4][0] = mid_origin[id][0] + 150.0
	beam_origin[id][4][1] = mid_origin[id][1] + 300.0
	beam_origin[id][4][2] = mid_origin[id][2]
	g_degrees[id][4] = 180.0
	// 6th 
	beam_origin[id][5][0] = mid_origin[id][0] + 150.0
	beam_origin[id][5][1] = mid_origin[id][1] - 300.0
	beam_origin[id][5][2] = mid_origin[id][2]
	g_degrees[id][5] = 225.0
	// 7th 
	beam_origin[id][6][0] = mid_origin[id][0] - 150.0
	beam_origin[id][6][1] = mid_origin[id][1] - 300.0
	beam_origin[id][6][2] = mid_origin[id][2]
	g_degrees[id][6] = 270.0
	// 8th 
	beam_origin[id][7][0] = mid_origin[id][0] - 150.0
	beam_origin[id][7][1] = mid_origin[id][1] + 300.0
	beam_origin[id][7][2] = mid_origin[id][2]
	g_degrees[id][7] = 315.0
	
	// set the mid to global
	ion_mid_origin[id] = mid_origin[id]

	new Float:addtime
	for(new i; i < 8; i++) {
		addtime = addtime + 0.3
		new param[3]
		param[0] = i
		param[1] = id
		set_task(0.0 + addtime, "Trace_Start", _,param, 2)
	}

	Laser_Rotate(id) //To fix the laserdraw
	
	emit_sound ( g_Target[id], CHAN_ITEM, SOUND_READY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
	
	for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
		set_task(i+3.0, "Laser_Rotate", id)

	set_task(2.9,"AddSpeed", id)
	set_task(11.5,"CreateFire", id)
	set_task(12.5,"ClearLasers", id)
	set_task(15.2,"FireIonCannon", id)
	return PLUGIN_CONTINUE
}

public AddSpeed(id) {
	if(!g_Target[id]) return PLUGIN_CONTINUE
	
	if(ROTATION_SPEED[id] > 1.0) ROTATION_SPEED[id] = 1.0
	ROTATION_SPEED[id] += 0.1
	set_task(0.6,"AddSpeed", id)
	return PLUGIN_CONTINUE
}

public CreateFire(id) {
	if(!g_Target[id]) return PLUGIN_CONTINUE

	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
	write_byte(TE_SPRITE)
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
	write_short(ReadyFire)
	write_byte(30)
	write_byte(200)
	message_end()

	set_task(1.5,"CreateFire", id)
	return PLUGIN_CONTINUE
}

public ClearLasers(id)
	remove_task(1018+id)

public Laser_Rotate(id)
{
	g_distance[id] -= 0.467
	for(new i; i < 8; i++) {
		// Calculate new alpha
		g_degrees[id][i] += ROTATION_SPEED[id]
		if(g_degrees[id][i] > 360.0)
			g_degrees[id][i] -= 360.0

		// calcul the next origin
		new Float:tmp[33][3]
		tmp[id] = ion_mid_origin[id]

		tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
		tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
		tmp[id][2] += 0.0 // -.-
		beam_origin[id][i] = tmp[id]
	}
}

public Trace_Start(param[]) {
	new i = param[0]
	new id = param[1]

	new Float:get_random_z,Float:SkyOrigin[33][3]
	SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
	get_random_z = random_float(300.0,SkyOrigin[id][2])

	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
	write_byte(TE_SPRITE)
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
	write_short(BlueFire)
	write_byte(10)
	write_byte(100)
	message_end()
	
	TraceAll(param)
}

public TraceAll(param[]) {
	new i = param[0]
	new id = param[1]

	new Float:SkyOrigin[33][3]
	SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
	write_byte(TE_BEAMPOINTS)
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])		//start point (x)
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])		//start point (y)
	engfunc(EngFunc_WriteCoord, SkyOrigin[id][2])			//start point (z)

	engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])		//end point (x)
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])		//end point (y)
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])		//end point (z)
	write_short(IonBeam)	//model
	write_byte(0)		//startframe
	write_byte(0)		//framerate
	write_byte(1)		//life
	write_byte(50)		//width
	write_byte(0)		//noise
	write_byte(255)		//r
	write_byte(255)		//g
	write_byte(255)		//b
	write_byte(255)		//brightness
	write_byte(0)		//speed
	message_end()
	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
	write_byte(TE_SPRITE)
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
	engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
	write_short(LaserFlame)
	write_byte(5)
	write_byte(200)
	message_end()
	
	set_task(0.08,"TraceAll", 1018+id, param, 2)
}

public FireIonCannon(id) {
	new i = -1
	while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], ION_RADIUS + 8000)) != 0)
	{
		if(pev_valid(i) && pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)) {
			message_begin(MSG_ONE_UNRELIABLE, IonShake, {0,0,0}, i)
			write_short(255<<14) //ammount
			write_short(10<<14) //lasts this long
			write_short(255<<14) //frequency
			message_end()
		}
		//next player in spehre.
		continue
	}

	new Float:skyOrigin[33][3]
	skyOrigin[id] = tlx_distance_to_sky(g_Target[id])

	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
	write_byte(TE_BEAMPOINTS) 
	engfunc(EngFunc_WriteCoord, skyOrigin[id][0])	//start point (x)
	engfunc(EngFunc_WriteCoord, skyOrigin[id][1])	//start point (y)
	engfunc(EngFunc_WriteCoord, skyOrigin[id][2])	//start point (z)

	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])		//end point (x)
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])		//end point (y)
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])		//end point (z)
	write_short(IonBeam)	//model
	write_byte(0)		//startframe
	write_byte(0)		//framerate
	write_byte(15)		//life
	write_byte(255)		//width
	write_byte(0)		//noise
	write_byte(255)		//r
	write_byte(255)		//g
	write_byte(255)		//b
	write_byte(255)		//brightness
	write_byte(0)		//speed
	message_end()

	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
	write_byte(TE_BEAMCYLINDER)
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z

	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
	engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + ION_RADIUS - 1000.0) // something Z
	write_short(Shockwave) // sprite
	write_byte(0) // startframe
	write_byte(0) // framerate
	write_byte(100) // life
	write_byte(150) // width
	write_byte(0) // noise
	write_byte(0) // red
	write_byte(100) // green
	write_byte(250) // blue
	write_byte(150) // brightness
	write_byte(0) // speed
	message_end()

	for(new i = 1; i < 6; i++) {
		engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
		write_byte(TE_SPRITETRAIL)	// line of moving glow sprites with gravity, fadeout, and collisions
		engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
		engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
		engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
		engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
		engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
		engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
		write_short(BlueFlare) // (sprite index)
		write_byte(50) // (count)
		write_byte(random_num(27,30)) // (life in 0.1's)
		write_byte(10) // byte (scale in 0.1's)
		write_byte(random_num(30,70)) // (velocity along vector in 10's)
		write_byte(40) // (randomness of velocity in 10's)
		message_end()
	}
	
	wpn_radius_damage ( g_Target[id], ION_RADIUS, ION_MAXDAMAGE )
	emit_sound ( g_Target[id], CHAN_ITEM, SOUND_ATTACK, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
	
	ResetAll(id)
}

ResetAll ( id )
{
	set_pev ( g_Target[id], pev_flags, FL_KILLME )
	g_Target[id] = 0
	gHasIon[id] = false
}

/******************** Stocks ********************/
stock Float:tlx_distance_to_sky(id) // Get entity above sky.
{
	new Float:TraceEnd[3]
	pev(id, pev_origin, TraceEnd)

	new Float:f_dest[3]
	f_dest[0] = TraceEnd[0]
	f_dest[1] = TraceEnd[1]
	f_dest[2] = TraceEnd[2] + 8192.0

	new res, Float:SkyOrigin[3]
	engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
	get_tr2(res, TR_vecEndPos, SkyOrigin)

	return SkyOrigin
}
//return distance above us to sky
stock Float:is_user_outside(id) {
	new Float:origin[3], Float:dist

	pev(id, pev_origin, origin)
	dist = origin[2]

	while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
		origin[2] += 5.0 
	if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
		return (origin[2] - dist)

	return 0.0
}

stock ProgressBar(id, seconds, position)
{
	message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
	write_byte(seconds)
	write_byte(position)
	message_end()
}

public zp_extra_item_selected ( id, itemid )
{
	if ( itemid == gItemID )
	{
		if ( gHasIon[id] ) // Уже есть это оружие
		{ // Так что надо деньжат вернуть
			zp_set_user_ammo_packs ( id, zp_get_user_ammo_packs ( id ) + gCost )
			client_print ( id, print_chat, "[ZP] You already have a %s", WPN_NAME )
		}
		else 
		{
			gHasIon[id] = true
			
			emit_sound ( id, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM )
			
			client_print ( id, print_chat, "[ZP] You now have a %s", WPN_NAME )
		}
	}
}

public fw_PlayerPreThink ( id )
{
	if ( !gHasIon[id] || !is_user_alive ( id ) )
		return FMRES_IGNORED
	
	if ( pev ( id, pev_button ) & IN_USE )
	{
		if ( !bInUse[id] )
		{
			bInUse[id] = true
			if ( g_Target[id] ) // Уже поставил
			{
				client_print ( id, print_center, "You already planted a beacon" )
				return FMRES_IGNORED
			}
			else if ( is_user_outside ( id ) ) // Вне помещения
			{
				g_Target[id] = 0
				i_Pitch[id] = 97
				i_BeaconTime[id] = 1.12
				g_distance[id] = 350.0
				ROTATION_SPEED[id] = 0.0
				
				emit_sound ( id, CHAN_WEAPON, SOUND_START_PLANT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
				
				ProgressBar ( id, 5, 0 )
				set_task ( 5.0,"ion_planted", id+5000 )
			}
			else
			{
				client_print ( id, print_center,"You need to be outside to fire with an ion cannon" )
			}
		}
	}
	else if ( bInUse[id] )
	{
		bInUse[id] = false
		emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
		ProgressBar ( id, 0, 0 )
		remove_task(id+5000)
	}
	return FMRES_IGNORED
}

wpn_projectile_startpos ( player, forw, right, up, Float:out[3] )
{
	new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3],
	Float:vRight[3], Float:vUp[3]//, Float:vSrc[3]
	
	pev(player, pev_origin, vOrigin)
	pev(player, pev_v_angle, vAngle)
	
	engfunc(EngFunc_MakeVectors, vAngle)
	
	global_get(glb_v_forward, vForward)
	global_get(glb_v_right, vRight)
	global_get(glb_v_up, vUp)
	
	out[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
	out[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
	out[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
	
	//set_array_f(5, vSrc, 3)
}

stock wpn_radius_damage ( inflictor, Float:radius, Float:damage )
{
	new Float:vecSrc[3]
	pev(inflictor, pev_origin, vecSrc)
	
	new ent = -1
	new Float:tmpdmg = damage
	new hitCount = 0
	new Float:kickback = 1.0
	
	new Float:Tabsmin[3], Float:Tabsmax[3], Float:vecSpot[3],
	Float:Aabsmin[3], Float:Aabsmax[3], Float:vecSee[3]
	new trRes
	new Float:flFraction
	new Float:vecEndPos[3]
	new Float:distance
	new Float:origin[3], Float:vecPush[3]
	new Float:invlen
	new Float:velocity[3]
	
	// Calculate falloff
	new Float:falloff
	if (radius > 0.0)
		falloff = damage / radius
	else
		falloff = 1.0
	
	// Find monsters and players inside a specifiec radius
	while((ent = engfunc(EngFunc_FindEntityInSphere, ent, vecSrc, radius)) != 0)
	{
		if(!pev_valid(ent))
			continue
		if(!(pev(ent, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
			continue // Entity is not a player or monster, ignore it
		
		tmpdmg = damage
		
		// The following calculations are provided by Orangutanz, THANKS!
		// We use absmin and absmax for the most accurate information
		pev(ent, pev_absmin, Tabsmin)
		pev(ent, pev_absmax, Tabsmax)
		vecSpot[0] = (Tabsmin[0] + Tabsmax[0]) * 0.5
		vecSpot[1] = (Tabsmin[1] + Tabsmax[1]) * 0.5
		vecSpot[2] = (Tabsmin[2] + Tabsmax[2]) * 0.5
		
		pev(inflictor, pev_absmin, Aabsmin)
		pev(inflictor, pev_absmax, Aabsmax)
		vecSee[0] = (Aabsmin[0] + Aabsmax[0]) * 0.5
		vecSee[1] = (Aabsmin[1] + Aabsmax[1]) * 0.5
		vecSee[2] = (Aabsmin[2] + Aabsmax[2]) * 0.5
		
		engfunc(EngFunc_TraceLine, vecSee, vecSpot, 0, inflictor, trRes)
		get_tr2(trRes, TR_flFraction, flFraction)
		// Explosion can 'see' this entity, so hurt them! (or impact through objects has been enabled xD)
		if (flFraction >= 0.9 || get_tr2(trRes, TR_pHit) == ent)
		{
			// Work out the distance between impact and entity
			get_tr2(trRes, TR_vecEndPos, vecEndPos)

			distance = get_distance_f(vecSrc, vecEndPos) * falloff
			tmpdmg -= distance
			if (tmpdmg < 0.0)
				tmpdmg = 0.0
			
			origin[0] = vecSpot[0] - vecSee[0]
			origin[1] = vecSpot[1] - vecSee[1]
			origin[2] = vecSpot[2] - vecSee[2]
			
			invlen = 1.0/get_distance_f(vecSpot, vecSee)
			vecPush[0] = origin[0] * invlen
			vecPush[1] = origin[1] * invlen
			vecPush[2] = origin[2] * invlen

			pev(ent, pev_velocity, velocity)
			velocity[0] = velocity[0] + vecPush[0] * tmpdmg * kickback
			velocity[1] = velocity[1] + vecPush[1] * tmpdmg * kickback
			velocity[2] = velocity[2] + vecPush[2] * tmpdmg * kickback

			if (tmpdmg < 60.0)
			{
				velocity[0] *= 12.0
				velocity[1] *= 12.0
				velocity[2] *= 12.0
			}
			else
			{
				velocity[0] *= 4.0
				velocity[1] *= 4.0
				velocity[2] *= 4.0
			}
			set_pev(ent, pev_velocity, velocity)
		}
		// Send info to Damage system
		if(damage_user(ent, inflictor, floatround(tmpdmg)))
		{
			hitCount++
		}
	}
	
	return hitCount
}

damage_user(victim, attacker, dmg_take)
{
	new flags = pev(victim, pev_flags)
	new Float:takeDamage
	pev(victim, pev_takedamage, takeDamage)
	
	
	if(flags & FL_GODMODE || takeDamage == 0.0)
		return 0 // Player/Monster got godmode, ignore it
	
	if(flags & (FL_CLIENT | FL_FAKECLIENT))
	{ // The victim's definetely a player, do a check for team attack
		if(is_team_attack(attacker, victim))
		{
			// User's attacking someone from the same team, friendlyfire's disabled
			// and it's a templay game. So don't do any damage :)
			return 0
		}
		else if(!is_user_alive(victim))
			return 0 // Victim is not alive, ignore him
	}
	// Calculate remaining health after causing the damage
	new Float:health
	pev(victim, pev_health, health)
	if(health <= 0.0)
		return 0 // No more health, player or monster's already dead, ignore it
	
	health -= float(dmg_take)
	
	set_pev(victim, pev_dmg_inflictor, attacker) // Let other things (e.g. plugins) know, who attacked this player
	
	if(health > 0) // Player or monster doesn't die after causing the damage, so just decrease his health
		set_pev(victim, pev_health, health)
	else
	{
		kill_user(victim, attacker) // Player or monster dies after causing damage, so kill him 8)
		dmg_take = -1
	}
	
	return dmg_take
}

kill_user(victim, attacker)
{
	new flags = pev(victim, pev_flags)
	new bool:isVictimMonster = (flags & FL_MONSTER) ? true : false
	new Float:takeDamage
	pev(victim, pev_takedamage, takeDamage)
	
	if(flags & FL_GODMODE || takeDamage == 0.0) // We do not cause any damage if the victim has godemode
		return 0
	
	if(!isVictimMonster)
	{
		if(is_team_attack(attacker, victim)) // Team attack with disabled friendly fire on a teamplay game, what the hell we're doing here?
			return 0
	}
	
	new weapon[11] = "ion_cannon"
	
	// Kill Victim
	if(isVictimMonster)
	{
		// Monster
		// set_pev(victim, pev_flags, FL_KILLME)
		set_pev(victim, pev_health, -1)
	}
	else
	{ // Player
		set_msg_block(g_msgDeathMsg, BLOCK_ONCE)
		user_kill(victim, 1)
	}
	
	new Float:frags
	pev(attacker, pev_frags, frags)
	frags++
	
	set_pev(attacker, pev_frags, frags)
	
	if(isVictimMonster)
		return 1 // If the player killed a monster, we shouldn't continue on here
	
	new aname[32], aauthid[32], ateam[10]
	get_user_name(attacker, aname, 31)
	get_user_team(attacker, ateam, 9)
	get_user_authid(attacker, aauthid, 31)
	
 	if(attacker != victim) 
	{
 		new vname[32], vauthid[32], vteam[10]
		get_user_name(victim, vname, 31)
		get_user_team(victim, vteam, 9)
		get_user_authid(victim, vauthid, 31)
		
		// Log the kill information
		log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"", 
			aname, get_user_userid(attacker), aauthid, ateam, 
		 	vname, get_user_userid(victim), vauthid, vteam, weapon)
	} else {
		// User killed himself xD
		log_message("^"%s<%d><%s><%s>^" committed suicide with ^"%s^"", 
			aname, get_user_userid(attacker), aauthid, ateam, weapon)
	}
	return 1
}

bool:is_team_attack(attacker, victim)
{
	if(!(pev(victim, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)))
		return false // Victim is a monster, so definetely no team attack ;)
	
	if(get_user_team(victim) == get_user_team(attacker))
		return true // Team attack
	
	return false // No team attack or friendlyfire is disabled
}

/*
Известные баги:
1. При убийстве не выдаёт обладателю амопаки
2. При начале следующего раунда это дьявольское оружие продолжает работать
3. При отключении игрока устанволенное оружие не исчезает

Это всё исправимо, но мне уже влом :\
*/
Image

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

#2

Post by Night Fury » 5 years ago

  1. #include <zombie_escape>
  2.  
  3. #define IGNORE_MONSTERS                 1
  4. #define IGNORE_GLASS                    0x100
  5.  
  6. #define ION_RADIUS  2000.0
  7. #define ION_MAXDAMAGE   54200.0
  8.  
  9. new const WPN_NAME[]    =   "Ion Cannon"
  10.  
  11. new const W_MODEL[] =       "models/w_battery.mdl"
  12.  
  13. new SOUND_APPROACH[]    =   "zombie_plague/ion_canon/approach.wav"
  14. new SOUND_START_PLANT[] =   "zombie_plague/ion_canon/beacon_set.wav"
  15. new SOUND_STOP[]    =       "vox/_comma.wav"
  16. new SOUND_BEEP[]    =       "zombie_plague/ion_canon/beacon_beep.wav"
  17. new SOUND_ATTACK[]  =       "zombie_plague/ion_canon/attack.wav"
  18. new SOUND_READY[]   =       "zombie_plague/ion_canon/ready.wav"
  19.  
  20. new g_Target[33], i_Pitch[33]
  21. new Float:i_BeaconTime[33]
  22. new Float:ion_mid_origin[33][3]
  23. new Float:beam_origin[33][8][3]
  24. new Float:g_degrees[33][8]
  25. new Float:g_distance[33]
  26. new Float:ROTATION_SPEED[33]
  27. new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, IonShake, LaserFlame
  28.  
  29. //---------------------------------------
  30. new gItemID
  31. new bool:gHasIon[33]
  32. new const gCost = 30    // Item Cost
  33. new bool:bInUse[33]
  34. new g_msgDeathMsg
  35. //---------------------------------------
  36. public plugin_init ()
  37. {
  38.     register_plugin ( "[ZP] ExtraItem: Ion Cannon", "1.91", "A.F./ Makzz / Shidla" )
  39.    
  40.     gItemID     = ze_register_item ( WPN_NAME, gCost, 0)
  41.    
  42.     IonShake    = get_user_msgid ( "ScreenShake" )
  43.     g_msgDeathMsg   = get_user_msgid("DeathMsg")
  44.    
  45.     register_forward ( FM_PlayerPreThink, "fw_PlayerPreThink" )
  46. }
  47.  
  48. public client_connect(id)
  49. {
  50.     g_Target[id] = 0
  51.     gHasIon[id] = false
  52. }
  53.  
  54. public plugin_precache ()
  55. {
  56.     precache_model ( W_MODEL )
  57.     precache_sound ( SOUND_APPROACH )
  58.     precache_sound ( SOUND_START_PLANT )
  59.     precache_sound ( SOUND_BEEP )
  60.     precache_sound ( SOUND_ATTACK )
  61.     precache_sound ( SOUND_READY )
  62.     precache_sound ( SOUND_STOP )
  63.     IonBeam     = precache_model("sprites/ion_canon/ionbeam.spr")
  64.     BlueFlare   = precache_model("sprites/ion_canon/bflare.spr")
  65.     ReadyFire   = precache_model("sprites/ion_canon/fire.spr")
  66.     BlueFire    = precache_model("sprites/ion_canon/blueflame.spr")
  67.     LaserFlame  = precache_model("sprites/ion_canon/ion_laserflame.spr")
  68.     Shockwave   = precache_model("sprites/shockwave.spr")
  69. }
  70.  
  71. public ion_planted ( id )
  72. {
  73.     id -= 5000
  74.     client_print ( id, print_chat, "Ion cannon beacon deploy" )
  75.    
  76.     g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
  77.     if(!g_Target[id])
  78.         return
  79.    
  80.     set_pev(g_Target[id],pev_classname,"info_target_ion")
  81.     engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
  82.    
  83.     set_pev(g_Target[id],pev_owner, id)
  84.     set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
  85.     set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
  86.    
  87.     wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
  88.     set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
  89.    
  90.     ion_beacon(id)
  91.     //set_task(5.0,"ion_startup", id)
  92.     set_task ( 25.0, "Trace_Ready", id )
  93. }
  94.  
  95. public ion_beacon ( id )
  96. {
  97.     if ( !g_Target[id] )
  98.         return
  99.    
  100.     i_Pitch[id] += 3
  101.     i_BeaconTime[id] -= 0.03
  102.     if(i_Pitch[id] > 255)
  103.         i_Pitch[id] = 255
  104.    
  105.     if(i_BeaconTime[id] < 0.30)
  106.         i_BeaconTime[id] = 0.30
  107.    
  108.     emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
  109.     set_task(i_BeaconTime[id],"ion_beacon", id)
  110. }
  111.  
  112. public Trace_Ready(id)
  113. {
  114.     remove_task(id)
  115.     // write origin of each
  116.     new Float:mid_origin[33][3]
  117.     pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
  118.     // 1st
  119.     beam_origin[id][0][0] = mid_origin[id][0] + 300.0
  120.     beam_origin[id][0][1] = mid_origin[id][1] + 150.0
  121.     beam_origin[id][0][2] = mid_origin[id][2]
  122.     g_degrees[id][0] = 0.0
  123.     // 2nd
  124.     beam_origin[id][1][0] = mid_origin[id][0] + 300.0
  125.     beam_origin[id][1][1] = mid_origin[id][1] - 150.0
  126.     beam_origin[id][1][2] = mid_origin[id][2]
  127.     g_degrees[id][1] = 45.0
  128.     // 3rd
  129.     beam_origin[id][2][0] = mid_origin[id][0] - 300.0
  130.     beam_origin[id][2][1] = mid_origin[id][1] - 150.0
  131.     beam_origin[id][2][2] = mid_origin[id][2]
  132.     g_degrees[id][2] = 90.0
  133.     // 4th
  134.     beam_origin[id][3][0] = mid_origin[id][0] - 300.0
  135.     beam_origin[id][3][1] = mid_origin[id][1] + 150.0
  136.     beam_origin[id][3][2] = mid_origin[id][2]
  137.     g_degrees[id][3] = 135.0
  138.     // 5th
  139.     beam_origin[id][4][0] = mid_origin[id][0] + 150.0
  140.     beam_origin[id][4][1] = mid_origin[id][1] + 300.0
  141.     beam_origin[id][4][2] = mid_origin[id][2]
  142.     g_degrees[id][4] = 180.0
  143.     // 6th
  144.     beam_origin[id][5][0] = mid_origin[id][0] + 150.0
  145.     beam_origin[id][5][1] = mid_origin[id][1] - 300.0
  146.     beam_origin[id][5][2] = mid_origin[id][2]
  147.     g_degrees[id][5] = 225.0
  148.     // 7th
  149.     beam_origin[id][6][0] = mid_origin[id][0] - 150.0
  150.     beam_origin[id][6][1] = mid_origin[id][1] - 300.0
  151.     beam_origin[id][6][2] = mid_origin[id][2]
  152.     g_degrees[id][6] = 270.0
  153.     // 8th
  154.     beam_origin[id][7][0] = mid_origin[id][0] - 150.0
  155.     beam_origin[id][7][1] = mid_origin[id][1] + 300.0
  156.     beam_origin[id][7][2] = mid_origin[id][2]
  157.     g_degrees[id][7] = 315.0
  158.    
  159.     // set the mid to global
  160.     ion_mid_origin[id] = mid_origin[id]
  161.  
  162.     new Float:addtime
  163.     for(new i; i < 8; i++) {
  164.         addtime = addtime + 0.3
  165.         new param[3]
  166.         param[0] = i
  167.         param[1] = id
  168.         set_task(0.0 + addtime, "Trace_Start", _,param, 2)
  169.     }
  170.  
  171.     Laser_Rotate(id) //To fix the laserdraw
  172.    
  173.     emit_sound ( g_Target[id], CHAN_ITEM, SOUND_READY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  174.    
  175.     for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
  176.         set_task(i+3.0, "Laser_Rotate", id)
  177.  
  178.     set_task(2.9,"AddSpeed", id)
  179.     set_task(11.5,"CreateFire", id)
  180.     set_task(12.5,"ClearLasers", id)
  181.     set_task(15.2,"FireIonCannon", id)
  182.     return PLUGIN_CONTINUE
  183. }
  184.  
  185. public AddSpeed(id) {
  186.     if(!g_Target[id]) return PLUGIN_CONTINUE
  187.    
  188.     if(ROTATION_SPEED[id] > 1.0) ROTATION_SPEED[id] = 1.0
  189.     ROTATION_SPEED[id] += 0.1
  190.     set_task(0.6,"AddSpeed", id)
  191.     return PLUGIN_CONTINUE
  192. }
  193.  
  194. public CreateFire(id) {
  195.     if(!g_Target[id]) return PLUGIN_CONTINUE
  196.  
  197.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
  198.     write_byte(TE_SPRITE)
  199.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
  200.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
  201.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
  202.     write_short(ReadyFire)
  203.     write_byte(30)
  204.     write_byte(200)
  205.     message_end()
  206.  
  207.     set_task(1.5,"CreateFire", id)
  208.     return PLUGIN_CONTINUE
  209. }
  210.  
  211. public ClearLasers(id)
  212.     remove_task(1018+id)
  213.  
  214. public Laser_Rotate(id)
  215. {
  216.     g_distance[id] -= 0.467
  217.     for(new i; i < 8; i++) {
  218.         // Calculate new alpha
  219.         g_degrees[id][i] += ROTATION_SPEED[id]
  220.         if(g_degrees[id][i] > 360.0)
  221.             g_degrees[id][i] -= 360.0
  222.  
  223.         // calcul the next origin
  224.         new Float:tmp[33][3]
  225.         tmp[id] = ion_mid_origin[id]
  226.  
  227.         tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
  228.         tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
  229.         tmp[id][2] += 0.0 // -.-
  230.         beam_origin[id][i] = tmp[id]
  231.     }
  232. }
  233.  
  234. public Trace_Start(param[]) {
  235.     new i = param[0]
  236.     new id = param[1]
  237.  
  238.     new Float:get_random_z,Float:SkyOrigin[33][3]
  239.     SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
  240.     get_random_z = random_float(300.0,SkyOrigin[id][2])
  241.  
  242.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
  243.     write_byte(TE_SPRITE)
  244.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
  245.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
  246.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
  247.     write_short(BlueFire)
  248.     write_byte(10)
  249.     write_byte(100)
  250.     message_end()
  251.    
  252.     TraceAll(param)
  253. }
  254.  
  255. public TraceAll(param[]) {
  256.     new i = param[0]
  257.     new id = param[1]
  258.  
  259.     new Float:SkyOrigin[33][3]
  260.     SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
  261.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
  262.     write_byte(TE_BEAMPOINTS)
  263.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])      //start point (x)
  264.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])      //start point (y)
  265.     engfunc(EngFunc_WriteCoord, SkyOrigin[id][2])           //start point (z)
  266.  
  267.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])      //end point (x)
  268.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])      //end point (y)
  269.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])      //end point (z)
  270.     write_short(IonBeam)    //model
  271.     write_byte(0)       //startframe
  272.     write_byte(0)       //framerate
  273.     write_byte(1)       //life
  274.     write_byte(50)      //width
  275.     write_byte(0)       //noise
  276.     write_byte(255)     //r
  277.     write_byte(255)     //g
  278.     write_byte(255)     //b
  279.     write_byte(255)     //brightness
  280.     write_byte(0)       //speed
  281.     message_end()
  282.    
  283.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
  284.     write_byte(TE_SPRITE)
  285.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
  286.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
  287.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
  288.     write_short(LaserFlame)
  289.     write_byte(5)
  290.     write_byte(200)
  291.     message_end()
  292.    
  293.     set_task(0.08,"TraceAll", 1018+id, param, 2)
  294. }
  295.  
  296. public FireIonCannon(id) {
  297.     new i = -1
  298.     while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], ION_RADIUS + 8000)) != 0)
  299.     {
  300.         if(pev_valid(i) && pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)) {
  301.             message_begin(MSG_ONE_UNRELIABLE, IonShake, {0,0,0}, i)
  302.             write_short(255<<14) //ammount
  303.             write_short(10<<14) //lasts this long
  304.             write_short(255<<14) //frequency
  305.             message_end()
  306.         }
  307.         //next player in spehre.
  308.         continue
  309.     }
  310.  
  311.     new Float:skyOrigin[33][3]
  312.     skyOrigin[id] = tlx_distance_to_sky(g_Target[id])
  313.  
  314.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
  315.     write_byte(TE_BEAMPOINTS)
  316.     engfunc(EngFunc_WriteCoord, skyOrigin[id][0])   //start point (x)
  317.     engfunc(EngFunc_WriteCoord, skyOrigin[id][1])   //start point (y)
  318.     engfunc(EngFunc_WriteCoord, skyOrigin[id][2])   //start point (z)
  319.  
  320.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])      //end point (x)
  321.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])      //end point (y)
  322.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])      //end point (z)
  323.     write_short(IonBeam)    //model
  324.     write_byte(0)       //startframe
  325.     write_byte(0)       //framerate
  326.     write_byte(15)      //life
  327.     write_byte(255)     //width
  328.     write_byte(0)       //noise
  329.     write_byte(255)     //r
  330.     write_byte(255)     //g
  331.     write_byte(255)     //b
  332.     write_byte(255)     //brightness
  333.     write_byte(0)       //speed
  334.     message_end()
  335.  
  336.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
  337.     write_byte(TE_BEAMCYLINDER)
  338.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
  339.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
  340.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z
  341.  
  342.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
  343.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
  344.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + ION_RADIUS - 1000.0) // something Z
  345.     write_short(Shockwave) // sprite
  346.     write_byte(0) // startframe
  347.     write_byte(0) // framerate
  348.     write_byte(100) // life
  349.     write_byte(150) // width
  350.     write_byte(0) // noise
  351.     write_byte(0) // red
  352.     write_byte(100) // green
  353.     write_byte(250) // blue
  354.     write_byte(150) // brightness
  355.     write_byte(0) // speed
  356.     message_end()
  357.  
  358.     for(new i = 1; i < 6; i++) {
  359.         engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
  360.         write_byte(TE_SPRITETRAIL)  // line of moving glow sprites with gravity, fadeout, and collisions
  361.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
  362.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
  363.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
  364.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
  365.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
  366.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
  367.         write_short(BlueFlare) // (sprite index)
  368.         write_byte(50) // (count)
  369.         write_byte(random_num(27,30)) // (life in 0.1's)
  370.         write_byte(10) // byte (scale in 0.1's)
  371.         write_byte(random_num(30,70)) // (velocity along vector in 10's)
  372.         write_byte(40) // (randomness of velocity in 10's)
  373.         message_end()
  374.     }
  375.    
  376.     wpn_radius_damage ( g_Target[id], ION_RADIUS, ION_MAXDAMAGE )
  377.     emit_sound ( g_Target[id], CHAN_ITEM, SOUND_ATTACK, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  378.    
  379.     ResetAll(id)
  380. }
  381.  
  382. ResetAll ( id )
  383. {
  384.     set_pev ( g_Target[id], pev_flags, FL_KILLME )
  385.     g_Target[id] = 0
  386.     gHasIon[id] = false
  387. }
  388.  
  389. /******************** Stocks ********************/
  390. stock Float:tlx_distance_to_sky(id) // Get entity above sky.
  391. {
  392.     new Float:TraceEnd[3]
  393.     pev(id, pev_origin, TraceEnd)
  394.  
  395.     new Float:f_dest[3]
  396.     f_dest[0] = TraceEnd[0]
  397.     f_dest[1] = TraceEnd[1]
  398.     f_dest[2] = TraceEnd[2] + 8192.0
  399.  
  400.     new res, Float:SkyOrigin[3]
  401.     engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
  402.     get_tr2(res, TR_vecEndPos, SkyOrigin)
  403.  
  404.     return SkyOrigin
  405. }
  406. //return distance above us to sky
  407. stock Float:is_user_outside(id) {
  408.     new Float:origin[3], Float:dist
  409.  
  410.     pev(id, pev_origin, origin)
  411.     dist = origin[2]
  412.  
  413.     while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
  414.         origin[2] += 5.0
  415.     if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
  416.         return (origin[2] - dist)
  417.  
  418.     return 0.0
  419. }
  420.  
  421. stock ProgressBar(id, seconds, position)
  422. {
  423.     message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
  424.     write_byte(seconds)
  425.     write_byte(position)
  426.     message_end()
  427. }
  428.  
  429. public ze_select_item_pre(id, itemid)
  430. {
  431.     if (itemid != gItemID)
  432.         return ZE_ITEM_AVAILABLE
  433.  
  434.     if (ze_is_user_zombie(id))
  435.         return ZE_ITEM_DONT_SHOW
  436.  
  437.     if (gHasIon[id])
  438.         return ZE_ITEM_UNAVAILABLE
  439.  
  440.     return ZE_ITEM_AVAILABLE
  441. }
  442.  
  443. public ze_select_item_post(id, itemid)
  444. {
  445.     if (itemid != gItemID)
  446.         return
  447.  
  448.     gHasIon[id] = true
  449.     emit_sound(id, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  450.     ze_colored_print(id, "You now have a %s.", WPN_NAME)
  451. }
  452.  
  453. public fw_PlayerPreThink ( id )
  454. {
  455.     if ( !gHasIon[id] || !is_user_alive ( id ) )
  456.         return FMRES_IGNORED
  457.    
  458.     if ( pev ( id, pev_button ) & IN_USE )
  459.     {
  460.         if ( !bInUse[id] )
  461.         {
  462.             bInUse[id] = true
  463.             if ( g_Target[id] ) // Уже поставил
  464.             {
  465.                 client_print ( id, print_center, "You already planted a beacon" )
  466.                 return FMRES_IGNORED
  467.             }
  468.             else if ( is_user_outside ( id ) ) // Вне помещения
  469.             {
  470.                 g_Target[id] = 0
  471.                 i_Pitch[id] = 97
  472.                 i_BeaconTime[id] = 1.12
  473.                 g_distance[id] = 350.0
  474.                 ROTATION_SPEED[id] = 0.0
  475.                
  476.                 emit_sound ( id, CHAN_WEAPON, SOUND_START_PLANT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  477.                
  478.                 ProgressBar ( id, 5, 0 )
  479.                 set_task ( 5.0,"ion_planted", id+5000 )
  480.             }
  481.             else
  482.             {
  483.                 client_print ( id, print_center,"You need to be outside to fire with an ion cannon" )
  484.             }
  485.         }
  486.     }
  487.     else if ( bInUse[id] )
  488.     {
  489.         bInUse[id] = false
  490.         emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  491.         ProgressBar ( id, 0, 0 )
  492.         remove_task(id+5000)
  493.     }
  494.     return FMRES_IGNORED
  495. }
  496.  
  497. wpn_projectile_startpos ( player, forw, right, up, Float:out[3] )
  498. {
  499.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3],
  500.     Float:vRight[3], Float:vUp[3]//, Float:vSrc[3]
  501.    
  502.     pev(player, pev_origin, vOrigin)
  503.     pev(player, pev_v_angle, vAngle)
  504.    
  505.     engfunc(EngFunc_MakeVectors, vAngle)
  506.    
  507.     global_get(glb_v_forward, vForward)
  508.     global_get(glb_v_right, vRight)
  509.     global_get(glb_v_up, vUp)
  510.    
  511.     out[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  512.     out[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  513.     out[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  514.    
  515.     //set_array_f(5, vSrc, 3)
  516. }
  517.  
  518. stock wpn_radius_damage ( inflictor, Float:radius, Float:damage )
  519. {
  520.     new Float:vecSrc[3]
  521.     pev(inflictor, pev_origin, vecSrc)
  522.    
  523.     new ent = -1
  524.     new Float:tmpdmg = damage
  525.     new hitCount = 0
  526.     new Float:kickback = 1.0
  527.    
  528.     new Float:Tabsmin[3], Float:Tabsmax[3], Float:vecSpot[3],
  529.     Float:Aabsmin[3], Float:Aabsmax[3], Float:vecSee[3]
  530.     new trRes
  531.     new Float:flFraction
  532.     new Float:vecEndPos[3]
  533.     new Float:distance
  534.     new Float:origin[3], Float:vecPush[3]
  535.     new Float:invlen
  536.     new Float:velocity[3]
  537.    
  538.     // Calculate falloff
  539.     new Float:falloff
  540.     if (radius > 0.0)
  541.         falloff = damage / radius
  542.     else
  543.         falloff = 1.0
  544.    
  545.     // Find monsters and players inside a specifiec radius
  546.     while((ent = engfunc(EngFunc_FindEntityInSphere, ent, vecSrc, radius)) != 0)
  547.     {
  548.         if(!pev_valid(ent))
  549.             continue
  550.         if(!(pev(ent, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
  551.             continue // Entity is not a player or monster, ignore it
  552.        
  553.         tmpdmg = damage
  554.        
  555.         // The following calculations are provided by Orangutanz, THANKS!
  556.         // We use absmin and absmax for the most accurate information
  557.         pev(ent, pev_absmin, Tabsmin)
  558.         pev(ent, pev_absmax, Tabsmax)
  559.         vecSpot[0] = (Tabsmin[0] + Tabsmax[0]) * 0.5
  560.         vecSpot[1] = (Tabsmin[1] + Tabsmax[1]) * 0.5
  561.         vecSpot[2] = (Tabsmin[2] + Tabsmax[2]) * 0.5
  562.        
  563.         pev(inflictor, pev_absmin, Aabsmin)
  564.         pev(inflictor, pev_absmax, Aabsmax)
  565.         vecSee[0] = (Aabsmin[0] + Aabsmax[0]) * 0.5
  566.         vecSee[1] = (Aabsmin[1] + Aabsmax[1]) * 0.5
  567.         vecSee[2] = (Aabsmin[2] + Aabsmax[2]) * 0.5
  568.        
  569.         engfunc(EngFunc_TraceLine, vecSee, vecSpot, 0, inflictor, trRes)
  570.         get_tr2(trRes, TR_flFraction, flFraction)
  571.         // Explosion can 'see' this entity, so hurt them! (or impact through objects has been enabled xD)
  572.         if (flFraction >= 0.9 || get_tr2(trRes, TR_pHit) == ent)
  573.         {
  574.             // Work out the distance between impact and entity
  575.             get_tr2(trRes, TR_vecEndPos, vecEndPos)
  576.  
  577.             distance = get_distance_f(vecSrc, vecEndPos) * falloff
  578.             tmpdmg -= distance
  579.             if (tmpdmg < 0.0)
  580.                 tmpdmg = 0.0
  581.            
  582.             origin[0] = vecSpot[0] - vecSee[0]
  583.             origin[1] = vecSpot[1] - vecSee[1]
  584.             origin[2] = vecSpot[2] - vecSee[2]
  585.            
  586.             invlen = 1.0/get_distance_f(vecSpot, vecSee)
  587.             vecPush[0] = origin[0] * invlen
  588.             vecPush[1] = origin[1] * invlen
  589.             vecPush[2] = origin[2] * invlen
  590.  
  591.             pev(ent, pev_velocity, velocity)
  592.             velocity[0] = velocity[0] + vecPush[0] * tmpdmg * kickback
  593.             velocity[1] = velocity[1] + vecPush[1] * tmpdmg * kickback
  594.             velocity[2] = velocity[2] + vecPush[2] * tmpdmg * kickback
  595.  
  596.             if (tmpdmg < 60.0)
  597.             {
  598.                 velocity[0] *= 12.0
  599.                 velocity[1] *= 12.0
  600.                 velocity[2] *= 12.0
  601.             }
  602.             else
  603.             {
  604.                 velocity[0] *= 4.0
  605.                 velocity[1] *= 4.0
  606.                 velocity[2] *= 4.0
  607.             }
  608.             set_pev(ent, pev_velocity, velocity)
  609.         }
  610.         // Send info to Damage system
  611.         if(damage_user(ent, inflictor, floatround(tmpdmg)))
  612.         {
  613.             hitCount++
  614.         }
  615.     }
  616.    
  617.     return hitCount
  618. }
  619.  
  620. damage_user(victim, attacker, dmg_take)
  621. {
  622.     new flags = pev(victim, pev_flags)
  623.     new Float:takeDamage
  624.     pev(victim, pev_takedamage, takeDamage)
  625.    
  626.    
  627.     if(flags & FL_GODMODE || takeDamage == 0.0)
  628.         return 0 // Player/Monster got godmode, ignore it
  629.    
  630.     if(flags & (FL_CLIENT | FL_FAKECLIENT))
  631.     { // The victim's definetely a player, do a check for team attack
  632.         if(is_team_attack(attacker, victim))
  633.         {
  634.             // User's attacking someone from the same team, friendlyfire's disabled
  635.             // and it's a templay game. So don't do any damage :)
  636.             return 0
  637.         }
  638.         else if(!is_user_alive(victim))
  639.             return 0 // Victim is not alive, ignore him
  640.     }
  641.     // Calculate remaining health after causing the damage
  642.     new Float:health
  643.     pev(victim, pev_health, health)
  644.     if(health <= 0.0)
  645.         return 0 // No more health, player or monster's already dead, ignore it
  646.    
  647.     health -= float(dmg_take)
  648.    
  649.     set_pev(victim, pev_dmg_inflictor, attacker) // Let other things (e.g. plugins) know, who attacked this player
  650.    
  651.     if(health > 0) // Player or monster doesn't die after causing the damage, so just decrease his health
  652.         set_pev(victim, pev_health, health)
  653.     else
  654.     {
  655.         kill_user(victim, attacker) // Player or monster dies after causing damage, so kill him 8)
  656.         dmg_take = -1
  657.     }
  658.    
  659.     return dmg_take
  660. }
  661.  
  662. kill_user(victim, attacker)
  663. {
  664.     new flags = pev(victim, pev_flags)
  665.     new bool:isVictimMonster = (flags & FL_MONSTER) ? true : false
  666.     new Float:takeDamage
  667.     pev(victim, pev_takedamage, takeDamage)
  668.    
  669.     if(flags & FL_GODMODE || takeDamage == 0.0) // We do not cause any damage if the victim has godemode
  670.         return 0
  671.    
  672.     if(!isVictimMonster)
  673.     {
  674.         if(is_team_attack(attacker, victim)) // Team attack with disabled friendly fire on a teamplay game, what the hell we're doing here?
  675.             return 0
  676.     }
  677.    
  678.     new weapon[11] = "ion_cannon"
  679.    
  680.     // Kill Victim
  681.     if(isVictimMonster)
  682.     {
  683.         // Monster
  684.         // set_pev(victim, pev_flags, FL_KILLME)
  685.         set_pev(victim, pev_health, -1)
  686.     }
  687.     else
  688.     { // Player
  689.         set_msg_block(g_msgDeathMsg, BLOCK_ONCE)
  690.         user_kill(victim, 1)
  691.     }
  692.    
  693.     new Float:frags
  694.     pev(attacker, pev_frags, frags)
  695.     frags++
  696.    
  697.     set_pev(attacker, pev_frags, frags)
  698.    
  699.     if(isVictimMonster)
  700.         return 1 // If the player killed a monster, we shouldn't continue on here
  701.    
  702.     new aname[32], aauthid[32], ateam[10]
  703.     get_user_name(attacker, aname, 31)
  704.     get_user_team(attacker, ateam, 9)
  705.     get_user_authid(attacker, aauthid, 31)
  706.    
  707.     if(attacker != victim)
  708.     {
  709.         new vname[32], vauthid[32], vteam[10]
  710.         get_user_name(victim, vname, 31)
  711.         get_user_team(victim, vteam, 9)
  712.         get_user_authid(victim, vauthid, 31)
  713.        
  714.         // Log the kill information
  715.         log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
  716.             aname, get_user_userid(attacker), aauthid, ateam,
  717.             vname, get_user_userid(victim), vauthid, vteam, weapon)
  718.     } else {
  719.         // User killed himself xD
  720.         log_message("^"%s<%d><%s><%s>^" committed suicide with ^"%s^"",
  721.             aname, get_user_userid(attacker), aauthid, ateam, weapon)
  722.     }
  723.     return 1
  724. }
  725.  
  726. bool:is_team_attack(attacker, victim)
  727. {
  728.     if(!(pev(victim, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)))
  729.         return false // Victim is a monster, so definetely no team attack ;)
  730.    
  731.     if(get_user_team(victim) == get_user_team(attacker))
  732.         return true // Team attack
  733.    
  734.     return false // No team attack or friendlyfire is disabled
  735. }
  736.  
  737. /*
  738. Известные баги:
  739. 1. При убийстве не выдаёт обладателю амопаки
  740. 2. При начале следующего раунда это дьявольское оружие продолжает работать
  741. 3. При отключении игрока устанволенное оружие не исчезает
  742.  
  743. Это всё исправимо, но мне уже влом :\
  744. */
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

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

#3

Post by czirimbolo » 5 years ago

//// ze_extra_ioncannon.sma
//
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(1) : error 010: invalid function or declaration
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(38) : error 017: undefined symbol "register_plugin"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(40) : error 017: undefined symbol "ze_register_item"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(42) : error 017: undefined symbol "get_user_msgid"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(43) : error 017: undefined symbol "get_user_msgid"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : error 017: undefined symbol "register_forward"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : warning 215: expression has no effect
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : error 001: expected token: ";", but found ")"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : error 029: invalid expression, assumed zero
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 9 Errors.
// Could not locate output file compiled\ze_extra_ioncannon.amx (compile failed).
Image

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

#4

Post by Night Fury » 5 years ago

czirimbolo wrote: 5 years ago //// ze_extra_ioncannon.sma
//
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(1) : error 010: invalid function or declaration
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(38) : error 017: undefined symbol "register_plugin"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(40) : error 017: undefined symbol "ze_register_item"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(42) : error 017: undefined symbol "get_user_msgid"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(43) : error 017: undefined symbol "get_user_msgid"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : error 017: undefined symbol "register_forward"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : warning 215: expression has no effect
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : error 001: expected token: ";", but found ")"
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : error 029: invalid expression, assumed zero
// C:\Users\macie\Desktop\Compiler v1.8.3\scripting\ze_extra_ioncannon.sma(45) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 9 Errors.
// Could not locate output file compiled\ze_extra_ioncannon.amx (compile failed).
Can compile it fine with no errors.
Use editors like Notepad++, Sublime, etc..
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

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

#5

Post by czirimbolo » 5 years ago

The same errors with notpead++
Image

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

#6

Post by czirimbolo » 5 years ago

Can you fix this or send me amx file?
Image

Graphyt
Member
Member
Romania
Posts: 8
Joined: 5 years ago
Contact:

#7

Post by Graphyt » 5 years ago

czirimbolo wrote: 5 years ago Can you fix this or send me amx file?
Here's the AMXX compiled file.

CLICK

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

#8

Post by czirimbolo » 5 years ago

Managed to compile, everything is fine. Solved!
Image

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

#9

Post by czirimbolo » 5 years ago

Small request, can you block buying this gun in freeze time? (or at least 10 seconds on start) Players can buy and kill zombies on respawn. Lets make it available after 10 seconds
Image

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

#10

Post by Night Fury » 5 years ago

czirimbolo wrote: 5 years ago Small request, can you block buying this gun in freeze time? (or at least 10 seconds on start) Players can buy and kill zombies on respawn. Lets make it available after 10 seconds
  1. #include <zombie_escape>
  2.  
  3. #define IGNORE_MONSTERS                 1
  4. #define IGNORE_GLASS                    0x100
  5.  
  6. #define ION_RADIUS  2000.0
  7. #define ION_MAXDAMAGE   54200.0
  8.  
  9. new const WPN_NAME[]    =   "Ion Cannon"
  10.  
  11. new const W_MODEL[] =       "models/w_battery.mdl"
  12.  
  13. new SOUND_APPROACH[]    =   "zombie_plague/ion_canon/approach.wav"
  14. new SOUND_START_PLANT[] =   "zombie_plague/ion_canon/beacon_set.wav"
  15. new SOUND_STOP[]    =       "vox/_comma.wav"
  16. new SOUND_BEEP[]    =       "zombie_plague/ion_canon/beacon_beep.wav"
  17. new SOUND_ATTACK[]  =       "zombie_plague/ion_canon/attack.wav"
  18. new SOUND_READY[]   =       "zombie_plague/ion_canon/ready.wav"
  19.  
  20. new g_Target[33], i_Pitch[33]
  21. new Float:i_BeaconTime[33]
  22. new Float:ion_mid_origin[33][3]
  23. new Float:beam_origin[33][8][3]
  24. new Float:g_degrees[33][8]
  25. new Float:g_distance[33]
  26. new Float:ROTATION_SPEED[33]
  27. new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, IonShake, LaserFlame
  28.  
  29. //---------------------------------------
  30. new gItemID, bool:g_bCanBuy
  31. new bool:gHasIon[33]
  32. new const gCost = 30    // Item Cost
  33. new bool:bInUse[33]
  34. new g_msgDeathMsg
  35. //---------------------------------------
  36. public plugin_init ()
  37. {
  38.     register_plugin ( "[ZP] ExtraItem: Ion Cannon", "1.91", "A.F./ Makzz / Shidla" )
  39.    
  40.     gItemID     = ze_register_item ( WPN_NAME, gCost, 0)
  41.    
  42.     IonShake    = get_user_msgid ( "ScreenShake" )
  43.     g_msgDeathMsg   = get_user_msgid("DeathMsg")
  44.    
  45.     register_forward ( FM_PlayerPreThink, "fw_PlayerPreThink" )
  46. }
  47.  
  48. public client_connect(id)
  49. {
  50.     g_Target[id] = 0
  51.     gHasIon[id] = false
  52. }
  53.  
  54. public plugin_precache ()
  55. {
  56.     precache_model ( W_MODEL )
  57.     precache_sound ( SOUND_APPROACH )
  58.     precache_sound ( SOUND_START_PLANT )
  59.     precache_sound ( SOUND_BEEP )
  60.     precache_sound ( SOUND_ATTACK )
  61.     precache_sound ( SOUND_READY )
  62.     precache_sound ( SOUND_STOP )
  63.     IonBeam     = precache_model("sprites/ion_canon/ionbeam.spr")
  64.     BlueFlare   = precache_model("sprites/ion_canon/bflare.spr")
  65.     ReadyFire   = precache_model("sprites/ion_canon/fire.spr")
  66.     BlueFire    = precache_model("sprites/ion_canon/blueflame.spr")
  67.     LaserFlame  = precache_model("sprites/ion_canon/ion_laserflame.spr")
  68.     Shockwave   = precache_model("sprites/shockwave.spr")
  69. }
  70.  
  71. public ion_planted ( id )
  72. {
  73.     id -= 5000
  74.     client_print ( id, print_chat, "Ion cannon beacon deploy" )
  75.    
  76.     g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
  77.     if(!g_Target[id])
  78.         return
  79.    
  80.     set_pev(g_Target[id],pev_classname,"info_target_ion")
  81.     engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
  82.    
  83.     set_pev(g_Target[id],pev_owner, id)
  84.     set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
  85.     set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
  86.    
  87.     wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
  88.     set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
  89.    
  90.     ion_beacon(id)
  91.     //set_task(5.0,"ion_startup", id)
  92.     set_task ( 25.0, "Trace_Ready", id )
  93. }
  94.  
  95. public ion_beacon ( id )
  96. {
  97.     if ( !g_Target[id] )
  98.         return
  99.    
  100.     i_Pitch[id] += 3
  101.     i_BeaconTime[id] -= 0.03
  102.     if(i_Pitch[id] > 255)
  103.         i_Pitch[id] = 255
  104.    
  105.     if(i_BeaconTime[id] < 0.30)
  106.         i_BeaconTime[id] = 0.30
  107.    
  108.     emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
  109.     set_task(i_BeaconTime[id],"ion_beacon", id)
  110. }
  111.  
  112. public Trace_Ready(id)
  113. {
  114.     remove_task(id)
  115.     // write origin of each
  116.     new Float:mid_origin[33][3]
  117.     pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
  118.     // 1st
  119.     beam_origin[id][0][0] = mid_origin[id][0] + 300.0
  120.     beam_origin[id][0][1] = mid_origin[id][1] + 150.0
  121.     beam_origin[id][0][2] = mid_origin[id][2]
  122.     g_degrees[id][0] = 0.0
  123.     // 2nd
  124.     beam_origin[id][1][0] = mid_origin[id][0] + 300.0
  125.     beam_origin[id][1][1] = mid_origin[id][1] - 150.0
  126.     beam_origin[id][1][2] = mid_origin[id][2]
  127.     g_degrees[id][1] = 45.0
  128.     // 3rd
  129.     beam_origin[id][2][0] = mid_origin[id][0] - 300.0
  130.     beam_origin[id][2][1] = mid_origin[id][1] - 150.0
  131.     beam_origin[id][2][2] = mid_origin[id][2]
  132.     g_degrees[id][2] = 90.0
  133.     // 4th
  134.     beam_origin[id][3][0] = mid_origin[id][0] - 300.0
  135.     beam_origin[id][3][1] = mid_origin[id][1] + 150.0
  136.     beam_origin[id][3][2] = mid_origin[id][2]
  137.     g_degrees[id][3] = 135.0
  138.     // 5th
  139.     beam_origin[id][4][0] = mid_origin[id][0] + 150.0
  140.     beam_origin[id][4][1] = mid_origin[id][1] + 300.0
  141.     beam_origin[id][4][2] = mid_origin[id][2]
  142.     g_degrees[id][4] = 180.0
  143.     // 6th
  144.     beam_origin[id][5][0] = mid_origin[id][0] + 150.0
  145.     beam_origin[id][5][1] = mid_origin[id][1] - 300.0
  146.     beam_origin[id][5][2] = mid_origin[id][2]
  147.     g_degrees[id][5] = 225.0
  148.     // 7th
  149.     beam_origin[id][6][0] = mid_origin[id][0] - 150.0
  150.     beam_origin[id][6][1] = mid_origin[id][1] - 300.0
  151.     beam_origin[id][6][2] = mid_origin[id][2]
  152.     g_degrees[id][6] = 270.0
  153.     // 8th
  154.     beam_origin[id][7][0] = mid_origin[id][0] - 150.0
  155.     beam_origin[id][7][1] = mid_origin[id][1] + 300.0
  156.     beam_origin[id][7][2] = mid_origin[id][2]
  157.     g_degrees[id][7] = 315.0
  158.    
  159.     // set the mid to global
  160.     ion_mid_origin[id] = mid_origin[id]
  161.  
  162.     new Float:addtime
  163.     for(new i; i < 8; i++) {
  164.         addtime = addtime + 0.3
  165.         new param[3]
  166.         param[0] = i
  167.         param[1] = id
  168.         set_task(0.0 + addtime, "Trace_Start", _,param, 2)
  169.     }
  170.  
  171.     Laser_Rotate(id) //To fix the laserdraw
  172.    
  173.     emit_sound ( g_Target[id], CHAN_ITEM, SOUND_READY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  174.    
  175.     for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
  176.         set_task(i+3.0, "Laser_Rotate", id)
  177.  
  178.     set_task(2.9,"AddSpeed", id)
  179.     set_task(11.5,"CreateFire", id)
  180.     set_task(12.5,"ClearLasers", id)
  181.     set_task(15.2,"FireIonCannon", id)
  182.     return PLUGIN_CONTINUE
  183. }
  184.  
  185. public AddSpeed(id) {
  186.     if(!g_Target[id]) return PLUGIN_CONTINUE
  187.    
  188.     if(ROTATION_SPEED[id] > 1.0) ROTATION_SPEED[id] = 1.0
  189.     ROTATION_SPEED[id] += 0.1
  190.     set_task(0.6,"AddSpeed", id)
  191.     return PLUGIN_CONTINUE
  192. }
  193.  
  194. public CreateFire(id) {
  195.     if(!g_Target[id]) return PLUGIN_CONTINUE
  196.  
  197.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
  198.     write_byte(TE_SPRITE)
  199.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
  200.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
  201.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
  202.     write_short(ReadyFire)
  203.     write_byte(30)
  204.     write_byte(200)
  205.     message_end()
  206.  
  207.     set_task(1.5,"CreateFire", id)
  208.     return PLUGIN_CONTINUE
  209. }
  210.  
  211. public ClearLasers(id)
  212.     remove_task(1018+id)
  213.  
  214. public Laser_Rotate(id)
  215. {
  216.     g_distance[id] -= 0.467
  217.     for(new i; i < 8; i++) {
  218.         // Calculate new alpha
  219.         g_degrees[id][i] += ROTATION_SPEED[id]
  220.         if(g_degrees[id][i] > 360.0)
  221.             g_degrees[id][i] -= 360.0
  222.  
  223.         // calcul the next origin
  224.         new Float:tmp[33][3]
  225.         tmp[id] = ion_mid_origin[id]
  226.  
  227.         tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
  228.         tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
  229.         tmp[id][2] += 0.0 // -.-
  230.         beam_origin[id][i] = tmp[id]
  231.     }
  232. }
  233.  
  234. public Trace_Start(param[]) {
  235.     new i = param[0]
  236.     new id = param[1]
  237.  
  238.     new Float:get_random_z,Float:SkyOrigin[33][3]
  239.     SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
  240.     get_random_z = random_float(300.0,SkyOrigin[id][2])
  241.  
  242.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
  243.     write_byte(TE_SPRITE)
  244.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
  245.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
  246.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
  247.     write_short(BlueFire)
  248.     write_byte(10)
  249.     write_byte(100)
  250.     message_end()
  251.    
  252.     TraceAll(param)
  253. }
  254.  
  255. public TraceAll(param[]) {
  256.     new i = param[0]
  257.     new id = param[1]
  258.  
  259.     new Float:SkyOrigin[33][3]
  260.     SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
  261.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
  262.     write_byte(TE_BEAMPOINTS)
  263.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])      //start point (x)
  264.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])      //start point (y)
  265.     engfunc(EngFunc_WriteCoord, SkyOrigin[id][2])           //start point (z)
  266.  
  267.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])      //end point (x)
  268.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])      //end point (y)
  269.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])      //end point (z)
  270.     write_short(IonBeam)    //model
  271.     write_byte(0)       //startframe
  272.     write_byte(0)       //framerate
  273.     write_byte(1)       //life
  274.     write_byte(50)      //width
  275.     write_byte(0)       //noise
  276.     write_byte(255)     //r
  277.     write_byte(255)     //g
  278.     write_byte(255)     //b
  279.     write_byte(255)     //brightness
  280.     write_byte(0)       //speed
  281.     message_end()
  282.    
  283.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
  284.     write_byte(TE_SPRITE)
  285.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
  286.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
  287.     engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
  288.     write_short(LaserFlame)
  289.     write_byte(5)
  290.     write_byte(200)
  291.     message_end()
  292.    
  293.     set_task(0.08,"TraceAll", 1018+id, param, 2)
  294. }
  295.  
  296. public FireIonCannon(id) {
  297.     new i = -1
  298.     while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], ION_RADIUS + 8000)) != 0)
  299.     {
  300.         if(pev_valid(i) && pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)) {
  301.             message_begin(MSG_ONE_UNRELIABLE, IonShake, {0,0,0}, i)
  302.             write_short(255<<14) //ammount
  303.             write_short(10<<14) //lasts this long
  304.             write_short(255<<14) //frequency
  305.             message_end()
  306.         }
  307.         //next player in spehre.
  308.         continue
  309.     }
  310.  
  311.     new Float:skyOrigin[33][3]
  312.     skyOrigin[id] = tlx_distance_to_sky(g_Target[id])
  313.  
  314.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
  315.     write_byte(TE_BEAMPOINTS)
  316.     engfunc(EngFunc_WriteCoord, skyOrigin[id][0])   //start point (x)
  317.     engfunc(EngFunc_WriteCoord, skyOrigin[id][1])   //start point (y)
  318.     engfunc(EngFunc_WriteCoord, skyOrigin[id][2])   //start point (z)
  319.  
  320.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])      //end point (x)
  321.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])      //end point (y)
  322.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])      //end point (z)
  323.     write_short(IonBeam)    //model
  324.     write_byte(0)       //startframe
  325.     write_byte(0)       //framerate
  326.     write_byte(15)      //life
  327.     write_byte(255)     //width
  328.     write_byte(0)       //noise
  329.     write_byte(255)     //r
  330.     write_byte(255)     //g
  331.     write_byte(255)     //b
  332.     write_byte(255)     //brightness
  333.     write_byte(0)       //speed
  334.     message_end()
  335.  
  336.     engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
  337.     write_byte(TE_BEAMCYLINDER)
  338.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
  339.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
  340.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z
  341.  
  342.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
  343.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
  344.     engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + ION_RADIUS - 1000.0) // something Z
  345.     write_short(Shockwave) // sprite
  346.     write_byte(0) // startframe
  347.     write_byte(0) // framerate
  348.     write_byte(100) // life
  349.     write_byte(150) // width
  350.     write_byte(0) // noise
  351.     write_byte(0) // red
  352.     write_byte(100) // green
  353.     write_byte(250) // blue
  354.     write_byte(150) // brightness
  355.     write_byte(0) // speed
  356.     message_end()
  357.  
  358.     for(new i = 1; i < 6; i++) {
  359.         engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
  360.         write_byte(TE_SPRITETRAIL)  // line of moving glow sprites with gravity, fadeout, and collisions
  361.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
  362.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
  363.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
  364.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
  365.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
  366.         engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
  367.         write_short(BlueFlare) // (sprite index)
  368.         write_byte(50) // (count)
  369.         write_byte(random_num(27,30)) // (life in 0.1's)
  370.         write_byte(10) // byte (scale in 0.1's)
  371.         write_byte(random_num(30,70)) // (velocity along vector in 10's)
  372.         write_byte(40) // (randomness of velocity in 10's)
  373.         message_end()
  374.     }
  375.    
  376.     wpn_radius_damage ( g_Target[id], ION_RADIUS, ION_MAXDAMAGE )
  377.     emit_sound ( g_Target[id], CHAN_ITEM, SOUND_ATTACK, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  378.    
  379.     ResetAll(id)
  380. }
  381.  
  382. ResetAll ( id )
  383. {
  384.     set_pev ( g_Target[id], pev_flags, FL_KILLME )
  385.     g_Target[id] = 0
  386.     gHasIon[id] = false
  387. }
  388.  
  389. /******************** Stocks ********************/
  390. stock Float:tlx_distance_to_sky(id) // Get entity above sky.
  391. {
  392.     new Float:TraceEnd[3]
  393.     pev(id, pev_origin, TraceEnd)
  394.  
  395.     new Float:f_dest[3]
  396.     f_dest[0] = TraceEnd[0]
  397.     f_dest[1] = TraceEnd[1]
  398.     f_dest[2] = TraceEnd[2] + 8192.0
  399.  
  400.     new res, Float:SkyOrigin[3]
  401.     engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
  402.     get_tr2(res, TR_vecEndPos, SkyOrigin)
  403.  
  404.     return SkyOrigin
  405. }
  406. //return distance above us to sky
  407. stock Float:is_user_outside(id) {
  408.     new Float:origin[3], Float:dist
  409.  
  410.     pev(id, pev_origin, origin)
  411.     dist = origin[2]
  412.  
  413.     while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
  414.         origin[2] += 5.0
  415.     if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
  416.         return (origin[2] - dist)
  417.  
  418.     return 0.0
  419. }
  420.  
  421. stock ProgressBar(id, seconds, position)
  422. {
  423.     message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
  424.     write_byte(seconds)
  425.     write_byte(position)
  426.     message_end()
  427. }
  428.  
  429. public ze_game_started()
  430. {
  431.     g_bCanBuy = false
  432. }
  433.  
  434. public ze_zombie_release()
  435. {
  436.     g_bCanBuy = true
  437. }
  438.  
  439. public ze_select_item_pre(id, itemid)
  440. {
  441.     if (itemid != gItemID)
  442.         return ZE_ITEM_AVAILABLE
  443.  
  444.     if (ze_is_user_zombie(id))
  445.         return ZE_ITEM_DONT_SHOW
  446.  
  447.     if (gHasIon[id] || !g_bCanBuy)
  448.         return ZE_ITEM_UNAVAILABLE
  449.  
  450.     return ZE_ITEM_AVAILABLE
  451. }
  452.  
  453. public ze_select_item_post(id, itemid)
  454. {
  455.     if (itemid != gItemID)
  456.         return
  457.  
  458.     gHasIon[id] = true
  459.     emit_sound(id, CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
  460.     ze_colored_print(id, "You now have a %s.", WPN_NAME)
  461. }
  462.  
  463. public fw_PlayerPreThink ( id )
  464. {
  465.     if ( !gHasIon[id] || !is_user_alive ( id ) )
  466.         return FMRES_IGNORED
  467.    
  468.     if ( pev ( id, pev_button ) & IN_USE )
  469.     {
  470.         if ( !bInUse[id] )
  471.         {
  472.             bInUse[id] = true
  473.             if ( g_Target[id] ) // Уже поставил
  474.             {
  475.                 client_print ( id, print_center, "You already planted a beacon" )
  476.                 return FMRES_IGNORED
  477.             }
  478.             else if ( is_user_outside ( id ) ) // Вне помещения
  479.             {
  480.                 g_Target[id] = 0
  481.                 i_Pitch[id] = 97
  482.                 i_BeaconTime[id] = 1.12
  483.                 g_distance[id] = 350.0
  484.                 ROTATION_SPEED[id] = 0.0
  485.                
  486.                 emit_sound ( id, CHAN_WEAPON, SOUND_START_PLANT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  487.                
  488.                 ProgressBar ( id, 5, 0 )
  489.                 set_task ( 5.0,"ion_planted", id+5000 )
  490.             }
  491.             else
  492.             {
  493.                 client_print ( id, print_center,"You need to be outside to fire with an ion cannon" )
  494.             }
  495.         }
  496.     }
  497.     else if ( bInUse[id] )
  498.     {
  499.         bInUse[id] = false
  500.         emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  501.         ProgressBar ( id, 0, 0 )
  502.         remove_task(id+5000)
  503.     }
  504.     return FMRES_IGNORED
  505. }
  506.  
  507. wpn_projectile_startpos ( player, forw, right, up, Float:out[3] )
  508. {
  509.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3],
  510.     Float:vRight[3], Float:vUp[3]//, Float:vSrc[3]
  511.    
  512.     pev(player, pev_origin, vOrigin)
  513.     pev(player, pev_v_angle, vAngle)
  514.    
  515.     engfunc(EngFunc_MakeVectors, vAngle)
  516.    
  517.     global_get(glb_v_forward, vForward)
  518.     global_get(glb_v_right, vRight)
  519.     global_get(glb_v_up, vUp)
  520.    
  521.     out[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  522.     out[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  523.     out[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  524.    
  525.     //set_array_f(5, vSrc, 3)
  526. }
  527.  
  528. stock wpn_radius_damage ( inflictor, Float:radius, Float:damage )
  529. {
  530.     new Float:vecSrc[3]
  531.     pev(inflictor, pev_origin, vecSrc)
  532.    
  533.     new ent = -1
  534.     new Float:tmpdmg = damage
  535.     new hitCount = 0
  536.     new Float:kickback = 1.0
  537.    
  538.     new Float:Tabsmin[3], Float:Tabsmax[3], Float:vecSpot[3],
  539.     Float:Aabsmin[3], Float:Aabsmax[3], Float:vecSee[3]
  540.     new trRes
  541.     new Float:flFraction
  542.     new Float:vecEndPos[3]
  543.     new Float:distance
  544.     new Float:origin[3], Float:vecPush[3]
  545.     new Float:invlen
  546.     new Float:velocity[3]
  547.    
  548.     // Calculate falloff
  549.     new Float:falloff
  550.     if (radius > 0.0)
  551.         falloff = damage / radius
  552.     else
  553.         falloff = 1.0
  554.    
  555.     // Find monsters and players inside a specifiec radius
  556.     while((ent = engfunc(EngFunc_FindEntityInSphere, ent, vecSrc, radius)) != 0)
  557.     {
  558.         if(!pev_valid(ent))
  559.             continue
  560.         if(!(pev(ent, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
  561.             continue // Entity is not a player or monster, ignore it
  562.        
  563.         tmpdmg = damage
  564.        
  565.         // The following calculations are provided by Orangutanz, THANKS!
  566.         // We use absmin and absmax for the most accurate information
  567.         pev(ent, pev_absmin, Tabsmin)
  568.         pev(ent, pev_absmax, Tabsmax)
  569.         vecSpot[0] = (Tabsmin[0] + Tabsmax[0]) * 0.5
  570.         vecSpot[1] = (Tabsmin[1] + Tabsmax[1]) * 0.5
  571.         vecSpot[2] = (Tabsmin[2] + Tabsmax[2]) * 0.5
  572.        
  573.         pev(inflictor, pev_absmin, Aabsmin)
  574.         pev(inflictor, pev_absmax, Aabsmax)
  575.         vecSee[0] = (Aabsmin[0] + Aabsmax[0]) * 0.5
  576.         vecSee[1] = (Aabsmin[1] + Aabsmax[1]) * 0.5
  577.         vecSee[2] = (Aabsmin[2] + Aabsmax[2]) * 0.5
  578.        
  579.         engfunc(EngFunc_TraceLine, vecSee, vecSpot, 0, inflictor, trRes)
  580.         get_tr2(trRes, TR_flFraction, flFraction)
  581.         // Explosion can 'see' this entity, so hurt them! (or impact through objects has been enabled xD)
  582.         if (flFraction >= 0.9 || get_tr2(trRes, TR_pHit) == ent)
  583.         {
  584.             // Work out the distance between impact and entity
  585.             get_tr2(trRes, TR_vecEndPos, vecEndPos)
  586.  
  587.             distance = get_distance_f(vecSrc, vecEndPos) * falloff
  588.             tmpdmg -= distance
  589.             if (tmpdmg < 0.0)
  590.                 tmpdmg = 0.0
  591.            
  592.             origin[0] = vecSpot[0] - vecSee[0]
  593.             origin[1] = vecSpot[1] - vecSee[1]
  594.             origin[2] = vecSpot[2] - vecSee[2]
  595.            
  596.             invlen = 1.0/get_distance_f(vecSpot, vecSee)
  597.             vecPush[0] = origin[0] * invlen
  598.             vecPush[1] = origin[1] * invlen
  599.             vecPush[2] = origin[2] * invlen
  600.  
  601.             pev(ent, pev_velocity, velocity)
  602.             velocity[0] = velocity[0] + vecPush[0] * tmpdmg * kickback
  603.             velocity[1] = velocity[1] + vecPush[1] * tmpdmg * kickback
  604.             velocity[2] = velocity[2] + vecPush[2] * tmpdmg * kickback
  605.  
  606.             if (tmpdmg < 60.0)
  607.             {
  608.                 velocity[0] *= 12.0
  609.                 velocity[1] *= 12.0
  610.                 velocity[2] *= 12.0
  611.             }
  612.             else
  613.             {
  614.                 velocity[0] *= 4.0
  615.                 velocity[1] *= 4.0
  616.                 velocity[2] *= 4.0
  617.             }
  618.             set_pev(ent, pev_velocity, velocity)
  619.         }
  620.         // Send info to Damage system
  621.         if(damage_user(ent, inflictor, floatround(tmpdmg)))
  622.         {
  623.             hitCount++
  624.         }
  625.     }
  626.    
  627.     return hitCount
  628. }
  629.  
  630. damage_user(victim, attacker, dmg_take)
  631. {
  632.     new flags = pev(victim, pev_flags)
  633.     new Float:takeDamage
  634.     pev(victim, pev_takedamage, takeDamage)
  635.    
  636.    
  637.     if(flags & FL_GODMODE || takeDamage == 0.0)
  638.         return 0 // Player/Monster got godmode, ignore it
  639.    
  640.     if(flags & (FL_CLIENT | FL_FAKECLIENT))
  641.     { // The victim's definetely a player, do a check for team attack
  642.         if(is_team_attack(attacker, victim))
  643.         {
  644.             // User's attacking someone from the same team, friendlyfire's disabled
  645.             // and it's a templay game. So don't do any damage :)
  646.             return 0
  647.         }
  648.         else if(!is_user_alive(victim))
  649.             return 0 // Victim is not alive, ignore him
  650.     }
  651.     // Calculate remaining health after causing the damage
  652.     new Float:health
  653.     pev(victim, pev_health, health)
  654.     if(health <= 0.0)
  655.         return 0 // No more health, player or monster's already dead, ignore it
  656.    
  657.     health -= float(dmg_take)
  658.    
  659.     set_pev(victim, pev_dmg_inflictor, attacker) // Let other things (e.g. plugins) know, who attacked this player
  660.    
  661.     if(health > 0) // Player or monster doesn't die after causing the damage, so just decrease his health
  662.         set_pev(victim, pev_health, health)
  663.     else
  664.     {
  665.         kill_user(victim, attacker) // Player or monster dies after causing damage, so kill him 8)
  666.         dmg_take = -1
  667.     }
  668.    
  669.     return dmg_take
  670. }
  671.  
  672. kill_user(victim, attacker)
  673. {
  674.     new flags = pev(victim, pev_flags)
  675.     new bool:isVictimMonster = (flags & FL_MONSTER) ? true : false
  676.     new Float:takeDamage
  677.     pev(victim, pev_takedamage, takeDamage)
  678.    
  679.     if(flags & FL_GODMODE || takeDamage == 0.0) // We do not cause any damage if the victim has godemode
  680.         return 0
  681.    
  682.     if(!isVictimMonster)
  683.     {
  684.         if(is_team_attack(attacker, victim)) // Team attack with disabled friendly fire on a teamplay game, what the hell we're doing here?
  685.             return 0
  686.     }
  687.    
  688.     new weapon[11] = "ion_cannon"
  689.    
  690.     // Kill Victim
  691.     if(isVictimMonster)
  692.     {
  693.         // Monster
  694.         // set_pev(victim, pev_flags, FL_KILLME)
  695.         set_pev(victim, pev_health, -1)
  696.     }
  697.     else
  698.     { // Player
  699.         set_msg_block(g_msgDeathMsg, BLOCK_ONCE)
  700.         user_kill(victim, 1)
  701.     }
  702.    
  703.     new Float:frags
  704.     pev(attacker, pev_frags, frags)
  705.     frags++
  706.    
  707.     set_pev(attacker, pev_frags, frags)
  708.    
  709.     if(isVictimMonster)
  710.         return 1 // If the player killed a monster, we shouldn't continue on here
  711.    
  712.     new aname[32], aauthid[32], ateam[10]
  713.     get_user_name(attacker, aname, 31)
  714.     get_user_team(attacker, ateam, 9)
  715.     get_user_authid(attacker, aauthid, 31)
  716.    
  717.     if(attacker != victim)
  718.     {
  719.         new vname[32], vauthid[32], vteam[10]
  720.         get_user_name(victim, vname, 31)
  721.         get_user_team(victim, vteam, 9)
  722.         get_user_authid(victim, vauthid, 31)
  723.        
  724.         // Log the kill information
  725.         log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
  726.             aname, get_user_userid(attacker), aauthid, ateam,
  727.             vname, get_user_userid(victim), vauthid, vteam, weapon)
  728.     } else {
  729.         // User killed himself xD
  730.         log_message("^"%s<%d><%s><%s>^" committed suicide with ^"%s^"",
  731.             aname, get_user_userid(attacker), aauthid, ateam, weapon)
  732.     }
  733.     return 1
  734. }
  735.  
  736. bool:is_team_attack(attacker, victim)
  737. {
  738.     if(!(pev(victim, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)))
  739.         return false // Victim is a monster, so definetely no team attack ;)
  740.    
  741.     if(get_user_team(victim) == get_user_team(attacker))
  742.         return true // Team attack
  743.    
  744.     return false // No team attack or friendlyfire is disabled
  745. }
Last edited by Raheem 5 years ago, edited 3 times in total.
Reason: Updated
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

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

#11

Post by czirimbolo » 5 years ago

still can buy it at start
Image

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

#12

Post by Raheem » 5 years ago

Block damage at zombie pre-release time better using this plugin: viewtopic.php?f=15&t=3368
He who fails to plan is planning to fail

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

#13

Post by czirimbolo » 5 years ago

Raheem, this item its kind of a bomb, it can explode just right after freezetime and make a damage to zombies so I would like to block buying this item in freezetime.
Image

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

#14

Post by Raheem » 5 years ago

I get you, the damage not passing through the take damage function. that's why it will not be blocked.

Check now the code jack posted, i updated it.
He who fails to plan is planning to fail

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

#15

Post by czirimbolo » 5 years ago

Raheem, it works only in FIRST round, next rounds I can buy it in freezetime
Image

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

#16

Post by Raheem » 5 years ago

Check now.
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 6 guests