local bfg_think_ent = Entities.CreateByClassname("info_teleport_destination") bfg_think_ent.ValidateScriptScope() bfg_think_ent.DispatchSpawn() PrecacheEntityFromTable({ classname = "info_particle_system", effect_name = "spell_skeleton_bits_green"}) local NextSlowTick = Time() bfg_think_ent.GetScriptScope().BFGProjectileThink <- function() { for (local projectile; projectile = Entities.FindByClassname(projectile, "tf_projectile_rocket");) { if (!projectile.IsEFlagSet(EFL_IS_BEING_LIFTED_BY_BARNACLE) && projectile.GetModelName() == "models/player/heavy.mdl") { projectile.ValidateScriptScope() projectile.GetScriptScope().BFGBallThink <- BFGBallThink AddThinkToEnt(projectile, "BFGBallThink") SetDestroyCallback(projectile, function() { local scope = self.GetScriptScope() local player = self.GetOwner() if (player && player.IsValid()) { EntFire("player", "RunScriptCode", "self.RemoveEFlags(EFL_IS_BEING_LIFTED_BY_BARNACLE)") if (!("beams" in scope)) return foreach (beam in scope.beams) { if (beam && beam.IsValid()) { beam.AcceptInput("TurnOff", "", null, null) beam.Kill() } } for (local child = player.FirstMoveChild(); child != null; child = child.NextMovePeer()) if (child.GetClassname() == "info_teleport_destination") EntFireByHandle(child, "Kill", "", -1, null, null) } }) projectile.AddEFlags(EFL_IS_BEING_LIFTED_BY_BARNACLE) } } return -1 } AddThinkToEnt(bfg_think_ent, "BFGProjectileThink") ::SetDestroyCallback <- function(entity, callback) { entity.ValidateScriptScope() local scope = entity.GetScriptScope() scope.setdelegate({}.setdelegate({ parent = scope.getdelegate() id = entity.GetScriptId() index = entity.entindex() callback = callback _get = function(k) { return parent[k] } _delslot = function(k) { if (k == id) { entity = EntIndexToHScript(index) local scope = entity.GetScriptScope() scope.self <- entity callback.pcall(scope) } delete parent[k] } }) ) } ::BFGBallThink <- function() { local rocket = self for (local player; player = Entities.FindByClassname(player, "player");) { if (player.IsAlive() && player.GetTeam() != rocket.GetTeam()) { if (NextSlowTick < Time()) { ClientPrint(null, 3, "SLOW TICK") player.AddCustomAttribute("major move speed bonus", 0.25, 0.5) player.AddCustomAttribute("fire rate bonus", 4, 0.5) DispatchParticleEffect("spell_skeleton_bits_green", player.GetCenter(), Vector()) NextSlowTick = Time() + 0.5 } if (!player.IsEFlagSet(EFL_IS_BEING_LIFTED_BY_BARNACLE)) { local beamtarget = Entities.CreateByClassname("info_teleport_destination") beamtarget.KeyValueFromString("targetname", "player_beamtarget_" + player.entindex()) beamtarget.SetOrigin(player.EyePosition()) beamtarget.AcceptInput("SetParent", "!activator", player, player) beamtarget.AcceptInput("SetParentAttachment", "head", null, null) local hBeam = Entities.CreateByClassname("env_laser") hBeam.KeyValueFromInt("ClipStyle", 1) hBeam.KeyValueFromInt("spawnflags", 1) hBeam.KeyValueFromInt("width", 2) hBeam.KeyValueFromInt("renderamt", 255) hBeam.KeyValueFromString("rendercolor", "55 255 55") hBeam.KeyValueFromInt("damage", 200) hBeam.KeyValueFromInt("NoiseAmplitude", 6) hBeam.KeyValueFromInt("dissolvetype", 1) hBeam.KeyValueFromString("texture", "sprites/laserbeam.spr") hBeam.KeyValueFromString("LaserTarget", "player_beamtarget_" + player.entindex()) hBeam.SetOrigin(rocket.GetOrigin()) hBeam.DispatchSpawn() hBeam.KeyValueFromString("classname", "megaton") hBeam.SetTeam(self.GetOwner().GetTeam()) hBeam.SetOwner(self.GetOwner()) local rocket_scope = rocket.GetScriptScope() if (!("beams" in rocket_scope)) { rocket_scope.beams <- [] } rocket_scope.beams.append(hBeam) hBeam.ValidateScriptScope() hBeam.GetScriptScope().BeamThink <- function() { if (rocket && rocket.IsValid()) { hBeam.SetOrigin(rocket.GetOrigin()) } return -1 } AddThinkToEnt(hBeam, "BeamThink") player.AddEFlags(EFL_IS_BEING_LIFTED_BY_BARNACLE) } } } return -1 }