::TeleBlimpEvents <- { OnGameEvent_recalculate_holidays = function(_) { if(GetRoundState() == 3) delete ::TeleBlimpEvents } flLastTeleportTime = 0 OnGameEvent_player_spawn = function(params) { local hPlayer = GetPlayerFromUserID(params.userid) EntFireByHandle(hPlayer, "RunScriptCode", "TeleBlimpEvents.Bot_TeleBlimp(self)", -1, null, null) } Bot_TeleBlimp = function(hPlayer) { if(hPlayer.getclass() == CTFBot && hPlayer.HasBotTag("bot_teleblimp")) for(local hTank; hTank = FindByClassname(hTank, "tank_boss");) { local hTank_scope = hTank.GetScriptScope() if("hTeleporter" in hTank_scope) { local vecTeleport = hTank_scope.hTeleporter.GetOrigin() + hTank_scope.hTeleporter.GetUpVector() * 16 local Trace = { start = vecTeleport end = vecTeleport hullmin = hPlayer.GetBoundingMins() hullmax = hPlayer.GetBoundingMaxs() mask = MASK_PLAYERSOLID_BRUSHONLY ignore = hPlayer } TraceHull(Trace) if(!("startsolid" in Trace)) { local flTime = Time() if(flTime - flLastTeleportTime > 0.1) { hTank_scope.hTeleporter.EmitSound("MVM.Robot_Teleporter_Deliver") DispatchParticleEffect(hTank.GetTeam() == 3 ? "teleportedin_blue" : "teleportedin_red", vecTeleport, Vector(1)) flLastTeleportTime = flTime } hPlayer.SetAbsOrigin(vecTeleport) local flUberTime = Convars.GetFloat("tf_mvm_engineer_teleporter_uber_duration") hPlayer.AddCondEx(TF_COND_INVULNERABLE, flUberTime, null) hPlayer.AddCondEx(TF_COND_INVULNERABLE_WEARINGOFF, flUberTime, null) hPlayer.AddCondEx(TF_COND_TELEPORTED, 30, null) break } } } } } __CollectGameEventCallbacks(TeleBlimpEvents) local TELEBLIMP_VALUES_TABLE = { TELEBLIMP_MODEL_DEFAULT = "models/bots/boss_bot/boss_blimp_pure.mdl" TELEBLIMP_MODEL_DAMAGE1 = "models/bots/boss_bot/boss_blimp_main_damage1.mdl" TELEBLIMP_MODEL_DAMAGE2 = "models/bots/boss_bot/boss_blimp_main_damage2.mdl" TELEBLIMP_MODEL_DAMAGE3 = "models/bots/boss_bot/boss_blimp_main_damage3.mdl" TELEBLIMP_SKIN_RED = 0 TELEBLIMP_SKIN_BLUE = 1 } foreach(k,v in TELEBLIMP_VALUES_TABLE) if(!(k in TankExt.ValueOverrides)) ROOT[k] <- v PrecacheModel(TELEBLIMP_MODEL_DEFAULT) PrecacheModel(TELEBLIMP_MODEL_DAMAGE1) PrecacheModel(TELEBLIMP_MODEL_DAMAGE2) PrecacheModel(TELEBLIMP_MODEL_DAMAGE3) TankExt.NewTankScript("teleblimp", { Model = { Default = TELEBLIMP_MODEL_DEFAULT Damage1 = TELEBLIMP_MODEL_DAMAGE1 Damage2 = TELEBLIMP_MODEL_DAMAGE2 Damage3 = TELEBLIMP_MODEL_DAMAGE3 } DisableChildModels = 1 OnSpawn = function(hTank, sName, hPath) { hTank.SetAbsAngles(QAngle(0, hTank.GetAbsAngles().y, 0)) hTank.SetSkin(hTank.GetTeam() == 3 ? TELEBLIMP_SKIN_BLUE : TELEBLIMP_SKIN_RED) local hTank_scope = hTank.GetScriptScope() local flSpeed = GetPropFloat(hTank, "m_speed") hTank_scope.hTrackTrain <- SpawnEntityFromTable("func_tracktrain", { origin = hTank.GetOrigin() speed = flSpeed startspeed = flSpeed target = hPath.GetName() }) hTank_scope.flLastSpeed <- flSpeed hTank_scope.TeleBlimpThink <- function() { local vecTrackTrain = hTrackTrain.GetOrigin() self.SetAbsOrigin(vecTrackTrain) self.GetLocomotionInterface().Reset() local flSpeed = GetPropFloat(self, "m_speed") if(flSpeed == 0) flSpeed = 0.0001 if(flSpeed != flLastSpeed) { flLastSpeed = flSpeed SetPropFloat(hTrackTrain, "m_flSpeed", flSpeed) } return -1 } local bBlueTeam = hTank.GetTeam() == 3 hTank_scope.hTeleporter <- SpawnEntityFromTable("prop_dynamic", { model = "models/buildables/teleporter_light.mdl" defaultanim = "running" body = 1 skin = bBlueTeam ? 1 : 0 origin = "-50 0 -10" angles = "0 0 180" disableshadows = 1 }) local hParticle = SpawnEntityFromTable("info_particle_system", { effect_name = bBlueTeam ? "teleporter_blue_wisps_level3" : "teleporter_red_wisps_level3" start_active = 1 origin = "-50 0 -10" angles = "0 0 180" }) TankExt.SetParentArray([hTank_scope.hTeleporter, hParticle], hTank) TankExt.AddThinkToEnt(hTank, "TeleBlimpThink") } OnDeath = function() { if(hTrackTrain && hTrackTrain.IsValid()) hTrackTrain.Destroy() local hDestruction = FindByClassnameNearest("tank_destruction", self.GetOrigin(), 16) if(hDestruction && hDestruction.IsValid()) hDestruction.Destroy() } })