CLASS.Name = "Bloated Zombie"

CLASS.TranslationName = "class_bloated_zombie"

CLASS.Description = "description_bloated_zombie"

CLASS.Help = "controls_bloated_zombie"



CLASS.Wave = 3 / 6



CLASS.Health = 325

CLASS.Speed = 120

CLASS.JumpPower = 150

CLASS.Mass = DEFAULT_MASS * 2



CLASS.CanTaunt = true



CLASS.Points = 6



CLASS.SWEP = "weapon_zs_bloatedzombie"



CLASS.Model = Model("models/player/fatty/fatty.mdl")



CLASS.DeathSounds = {"npc/ichthyosaur/water_growl5.wav"}



CLASS.VoicePitch = 0.6



CLASS.CanFeignDeath = true



sound.Add({

	name = "fatty.footstep",

    channel = CHAN_BODY,

    volume = 0.8,

    soundlevel = 65,

    pitchstart = 75,

    pitchend = 75,

    sound = {"npc/zombie/foot1.wav", "npc/zombie/foot2.wav", "npc/zombie/foot3.wav"}

})



sound.Add({

	name = "fatty.footscuff",

    channel = CHAN_BODY,

    volume = 0.8,

    soundlevel = 65,

    pitchstart = 75,

    pitchend = 75,

    sound = {"npc/zombie/foot_slide1.wav", "npc/zombie/foot_slide2.wav", "npc/zombie/foot_slide3.wav"}

})



local DIR_BACK = DIR_BACK

local ACT_HL2MP_ZOMBIE_SLUMP_RISE = ACT_HL2MP_ZOMBIE_SLUMP_RISE

local ACT_HL2MP_SWIM_PISTOL = ACT_HL2MP_SWIM_PISTOL

local ACT_HL2MP_IDLE_CROUCH_ZOMBIE = ACT_HL2MP_IDLE_CROUCH_ZOMBIE

local ACT_HL2MP_WALK_CROUCH_ZOMBIE_01 = ACT_HL2MP_WALK_CROUCH_ZOMBIE_01

local ACT_HL2MP_RUN_ZOMBIE = ACT_HL2MP_RUN_ZOMBIE



function CLASS:PlayPainSound(pl)

	pl:EmitSound("npc/zombie_poison/pz_idle"..math.random(2, 3)..".wav", 72, math.Rand(75, 85))



	return true

end



local mathrandom = math.random

local StepSounds = {

	"npc/zombie/foot1.wav",

	"npc/zombie/foot2.wav",

	"npc/zombie/foot3.wav"

}

local ScuffSounds = {

	"npc/zombie/foot_slide1.wav",

	"npc/zombie/foot_slide2.wav",

	"npc/zombie/foot_slide3.wav"

}

function CLASS:PlayerFootstep(pl, vFootPos, iFoot, strSoundName, fVolume, pFilter)

	if mathrandom() < 0.15 then

		pl:EmitSound(ScuffSounds[mathrandom(#ScuffSounds)], 70, 75)

	else

		pl:EmitSound(StepSounds[mathrandom(#StepSounds)], 70, 75)

	end



	return true

end



function CLASS:CalcMainActivity(pl, velocity)

	local feign = pl.FeignDeath

	if feign and feign:IsValid() then

		if feign:GetDirection() == DIR_BACK then

			pl.CalcSeqOverride = pl:LookupSequence("zombie_slump_rise_02_fast")

		else

			pl.CalcIdeal = ACT_HL2MP_ZOMBIE_SLUMP_RISE

		end



		return true

	end



	if pl:WaterLevel() >= 3 then

		pl.CalcIdeal = ACT_HL2MP_SWIM_PISTOL

	elseif pl:Crouching() then

		if velocity:Length2D() <= 0.5 then

			pl.CalcIdeal = ACT_HL2MP_IDLE_CROUCH_ZOMBIE

		else

			pl.CalcIdeal = ACT_HL2MP_WALK_CROUCH_ZOMBIE_01 - 1 + math.ceil((CurTime() / 4 + pl:EntIndex()) % 3)

		end

	else

		pl.CalcIdeal = ACT_HL2MP_RUN_ZOMBIE

	end



	return true

end



function CLASS:UpdateAnimation(pl, velocity, maxseqgroundspeed)

	local feign = pl.FeignDeath

	if feign and feign:IsValid() then

		if feign:GetState() == 1 then

			pl:SetCycle(1 - math.max(feign:GetStateEndTime() - CurTime(), 0) * 0.666)

		else

			pl:SetCycle(math.max(feign:GetStateEndTime() - CurTime(), 0) * 0.666)

		end

		pl:SetPlaybackRate(0)

		return true

	end



	local len2d = velocity:Length2D()

	if len2d > 0.5 then

		pl:SetPlaybackRate(math.min(len2d / maxseqgroundspeed, 3))

	else

		pl:SetPlaybackRate(1)

	end



	return true

end



function CLASS:DoAnimationEvent(pl, event, data)

	if event == PLAYERANIMEVENT_ATTACK_PRIMARY then

		pl:AnimRestartGesture(GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_GMOD_GESTURE_RANGE_ZOMBIE, true)

		return ACT_INVALID

	end

end



function CLASS:DoesntGiveFear(pl)

	return pl.FeignDeath and pl.FeignDeath:IsValid()

end



if SERVER then

	function CLASS:AltUse(pl)

		pl:StartFeignDeath()

	end



	local function Bomb(pl, pos, dir)

		if not IsValid(pl) then return end



		dir:RotateAroundAxis(dir:Right(), 30)



		local effectdata = EffectData()

			effectdata:SetOrigin(pos)

			effectdata:SetNormal(dir:Forward())

		util.Effect("fatexplosion", effectdata, true)



		for i=1, 6 do

			local ang = Angle()

			ang:Set(dir)

			ang:RotateAroundAxis(ang:Up(), math.Rand(-30, 30))

			ang:RotateAroundAxis(ang:Right(), math.Rand(-30, 30))



			local heading = ang:Forward()



			local ent = ents.CreateLimited("projectile_poisonflesh")

			if ent:IsValid() then

				ent:SetPos(pos)

				ent:SetOwner(pl)

				ent:Spawn()

				ent:SetTeamID(TEAM_UNDEAD)

				local phys = ent:GetPhysicsObject()

				if phys:IsValid() then

					phys:Wake()

					phys:SetVelocityInstantaneous(heading * math.Rand(120, 250))

				end

			end

		end

	end



	function CLASS:OnKilled(pl, attacker, inflictor, suicide, headshot, dmginfo, assister)

		if attacker ~= pl and not suicide then

			local pos = pl:LocalToWorld(pl:OBBCenter())

			local ang = pl:SyncAngles()

			timer.Simple(0, function() Bomb(pl, pos, ang) end)

		end

	end

end



if CLIENT then

	CLASS.Icon = "zombiesurvival/killicons/zombie"

end

