#include <amxmodx>
#include <zombieplague>
#include <cstrike>
#include <vector>

#define TE_EXPLOSION 3
#define TE_SMOKE 5
#define TE_IMPLOSION 14
#define TE_BEAMCYLINDER 21
#define TE_EXPLFLAG_NONE 0

new Fireball
new Smoke
new iSprite
new g_zclass_boom

new const zclass_name[] = { "-Boomer-" }
new const zclass_info[] = { "會被擊退" }
new const zclass_model[] = { "3fung_ser2" }
new const zclass_clawmodel[] = {"v_fungser.mdl" }
const zclass_health = 550
const zclass_speed = 280
const Float:zclass_gravity = 1.0
const Float:zclass_knockback = 8.0

public plugin_init()
{
	register_plugin("[ZP] Boomer","1.0","Awp King + oN.")
	register_event("DeathMsg","death","a")
	register_clcmd("zb_boom", "pushboom")
	g_zclass_boom = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel,  zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
}
public plugin_precache()
{
	iSprite = precache_model( "sprites/shockwave.spr")
	Fireball = precache_model("sprites/zerogxplode.spr")
	Smoke = precache_model("sprites/steam1.spr")
	precache_sound("ambience/particle_suck1.wav")
}
public explode(id)
{
 	new origin[3]
 	get_user_origin(id,origin)
 	message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
 	write_byte( TE_IMPLOSION )
 	write_coord(origin[0])
 	write_coord(origin[1])
 	write_coord(origin[2])
 	write_byte(100)
 	write_byte(20)
 	write_byte(5)
 	message_end()

}
public blastcircles(id){
 	new origin[3]
 	get_user_origin(id,origin)
 	// blast circles
 	message_begin(MSG_PAS, SVC_TEMPENTITY, origin)
 	write_byte(TE_BEAMCYLINDER)
 	write_coord(origin[0])
 	write_coord(origin[1])
 	write_coord(origin[2] - 16)
 	write_coord(origin[0])
 	write_coord(origin[1])
 	write_coord(origin[2] - 16 + 300)
 	write_short(iSprite)
 	write_byte(0) // startframe
 	write_byte(0) // framerate
 	write_byte(6) // life
 	write_byte(16)  // width
 	write_byte(0) // noise
 	write_byte(188)
 	write_byte(220)
 	write_byte(255)
 	write_byte(255) //brightness
 	write_byte(0) // speed
 	message_end()

	message_begin(MSG_PAS, SVC_TEMPENTITY, origin)
 	write_byte(TE_BEAMCYLINDER)
 	write_coord(origin[0])
 	write_coord(origin[1])
 	write_coord(origin[2] - 16)
 	write_coord(origin[0])
 	write_coord(origin[1])
 	write_coord(origin[2] - 16 + (300 / 2))
 	write_short(iSprite)
 	write_byte(0) // startframe
 	write_byte(0) // framerate
 	write_byte(6) // life
 	write_byte(16)  // width
 	write_byte(0) // noise
 	write_byte(188)
 	write_byte(220)
 	write_byte(255)
 	write_byte(255) //brightness
 	write_byte(0) // speed
 	message_end()

 	return PLUGIN_CONTINUE
}
public apacheexplode(id){
 	new origin[3]
 	get_user_origin(id,origin)
 	// random explosions
 	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
 	write_byte(TE_EXPLOSION) // This just makes a dynamic light now
 	write_coord(origin[0] + random_num(-100, 100))
 	write_coord(origin[1] + random_num(-100, 100))
 	write_coord(origin[2] + random_num(-50, 50))
 	write_short(Fireball)
 	write_byte(random_num(0,20) + 20) // scale * 10
 	write_byte(12) // framerate
 	write_byte(TE_EXPLFLAG_NONE)
 	message_end()
 	// lots of smoke
 	message_begin( MSG_PVS, SVC_TEMPENTITY, origin )
 	write_byte( TE_SMOKE )
 	write_coord(origin[0] + random_num(-100, 100))
 	write_coord(origin[1] + random_num(-100, 100))
 	write_coord(origin[2] + random_num(-50, 50))
 	write_short(Smoke)
 	write_byte(60) // scale * 10
 	write_byte(10) // framerate
 	message_end()
}
public death(id)
{
      new victim = read_data(2)
      new id = victim
      if(zp_get_user_zombie_class(id) == g_zclass_boom && zp_get_user_zombie(id))
      {
             BlowUp(id)
      }
}
public pushboom(id)
{
      if(zp_get_user_zombie_class(id) == g_zclass_boom && zp_get_user_zombie(id))
      {
             BlowUp(id)
             user_kill(id, 0)
      }
}
public BlowUp(id)
{
	new origin[3]
	get_user_origin(id,origin)
	emit_sound(id,CHAN_STATIC, "ambience/particle_suck1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
 	set_task(0.5,"apacheexplode", id)
 	set_task(0.5,"blastcircles", id)
 	set_task(1.0,"bum", 0)
 	explode(id)
}
public bum(id)
{
   	new distanceBetween
   	new origin[3]
   	get_user_origin(id,origin)
   	if(is_user_alive(id) && !zp_get_user_zombie(id))
   	{
   		new origin1[3]
   		get_user_origin(id,origin1)
   		distanceBetween = get_distance(origin, origin1)
   		if(distanceBetween < 240.0)
   		{
       	    		zp_infect_user(id, origin[id])
   		}
	}
}  