4ªU>nutscripts/vscriptsdirector_base_addonb<«Þÿ\ÿÿcoachfarts <- { MIN_TIME = 0 MAX_TIME = 100 nextFart = 0 isFarting = false fartPlayer = null fartTime = 0 reactionScenes = [ "scenes/Coach/painrelieftfirstaid04.vcd", "scenes/Coach/painrelieftpills02.vcd" ] function FindCoach() { local ent = null while((ent = Entities.FindByClassname(ent, "player")) != null) { if(ent.IsValid() && ent.IsSurvivor() && !ent.IsDead() && !ent.IsIncapacitated()) { if(ent.GetModelName().find("survivor_coach") != null) return ent } } return null } function GetBehindPosition(player) { local origin = player.GetOrigin() local angles = player.GetAngles() local yaw = angles.y * (PI / 180) local behindOffset = Vector(-cos(yaw) * 30, -sin(yaw) * 30, 20) return origin + behindOffset } function StartFart(player) { local self = DirectorScript.coachfarts local origin = player.GetOrigin() + Vector(0, 0, 20) local rumbleEnt = SpawnEntityFromTable("info_target", { targetname = "fart_rumble", origin = origin }) if(rumbleEnt != null && rumbleEnt.IsValid()) { EmitAmbientSoundOn("player/boomer/voice/idle/male_boomer_lurk_08.wav", 1.0, 100, 100, rumbleEnt) DoEntFire("!self", "Kill", "", 3.0, null, rumbleEnt) } self.fartPlayer = player self.fartTime = Time() + 2.0 self.isFarting = true } function ExecuteFart() { local self = DirectorScript.coachfarts local player = self.fartPlayer if(player == null || !player.IsValid()) { self.Reset() return } local origin = self.GetBehindPosition(player) local soundEnt = SpawnEntityFromTable("info_target", { targetname = "fart_sound", origin = origin }) if(soundEnt != null && soundEnt.IsValid()) { EmitAmbientSoundOn("physics/wood/wood_crate_impact_hard5.wav", 1.0, 80, 100, soundEnt) DoEntFire("!self", "Kill", "", 2.0, null, soundEnt) } local cloud = SpawnEntityFromTable("info_particle_system", { targetname = "fart_cloud", effect_name = "vomit_jar_b", origin = origin }) if(cloud != null && cloud.IsValid()) { DoEntFire("!self", "Start", "", 0, null, cloud) DoEntFire("!self", "Kill", "", 2.0, null, cloud) } local mist = SpawnEntityFromTable("info_particle_system", { targetname = "fart_mist", effect_name = "vomit_jar", origin = origin }) if(mist != null && mist.IsValid()) { DoEntFire("!self", "Start", "", 0, null, mist) DoEntFire("!self", "Kill", "", 8.0, null, mist) } local ent = null while((ent = Entities.FindByClassname(ent, "infected")) != null) { if(ent.IsValid()) { local dist = (ent.GetOrigin() - origin).Length() if(dist < 1500) { NetProps.SetPropInt(ent, "m_mobRush", 1) } } } local chaseTarget = SpawnEntityFromTable("info_goal_infected_chase", { origin = origin }) DoEntFire("!self", "Enable", "", 0.0, null, chaseTarget) DoEntFire("!self", "Kill", "", 8.0, null, chaseTarget) local ent = null while((ent = Entities.FindByClassname(ent, "player")) != null) { if(ent.IsValid() && ent.IsSurvivor() && !ent.IsDead() && ent != player) { local dist = (ent.GetOrigin() - origin).Length() if(dist < 100) { ent.HitWithVomit() } } } local scene = self.reactionScenes[RandomInt(0, self.reactionScenes.len() - 1)] player.PlayScene(scene, 0.5) self.Reset() } function Reset() { local self = DirectorScript.coachfarts self.isFarting = false self.fartPlayer = null self.fartTime = 0 self.nextFart = Time() + RandomFloat(self.MIN_TIME, self.MAX_TIME) } function tic() { local self = DirectorScript.coachfarts if(self.isFarting) { if(Time() >= self.fartTime && self.fartTime > 0) { self.ExecuteFart() } return } if(Time() < self.nextFart) return local coach = self.FindCoach() if(coach != null) { self.StartFart(coach) } else { self.nextFart = Time() + 5.0 } } function OnGameEvent_round_start(params) { PrecacheSound("player/boomer/voice/idle/male_boomer_lurk_08.wav") PrecacheSound("physics/wood/wood_crate_impact_hard5.wav") PrecacheEntityFromTable({ classname = "info_particle_system", effect_name = "vomit_jar_b" }) PrecacheEntityFromTable({ classname = "info_particle_system", effect_name = "vomit_jar" }) local thinker = SpawnEntityFromTable("info_target", { targetname = "coachfarts_thinker" }) if(thinker.ValidateScriptScope()) { thinker.GetScriptScope()["Think"] <- function() { DirectorScript.coachfarts.tic() return 0.1 } AddThinkToEnt(thinker, "Think") } DirectorScript.coachfarts.isFarting = false DirectorScript.coachfarts.fartPlayer = null DirectorScript.coachfarts.fartTime = 0 DirectorScript.coachfarts.nextFart = Time() + RandomFloat(15, 90) } } __CollectEventCallbacks(coachfarts, "OnGameEvent_", "GameEventCallbacks", RegisterScriptGameEventListener)