local ROCKETBLIMP_VALUES_TABLE = { ROCKETBLIMP_MODEL = "models/bots/boss_bot/boss_blimp_pure.mdl" ROCKETBLIMP_MODEL_DAMAGE1 = "models/bots/boss_bot/boss_blimp_main_damage1.mdl" ROCKETBLIMP_MODEL_DAMAGE2 = "models/bots/boss_bot/boss_blimp_main_damage2.mdl" ROCKETBLIMP_MODEL_DAMAGE3 = "models/bots/boss_bot/boss_blimp_main_damage3.mdl" ROCKETBLIMP_TURRET_MODEL = "models/props_frontline/tank_turret.mdl" ROCKETBLIMP_SND_SHOOT_CRIT = "weapons/airstrike_fire_crit.wav" ROCKETBLIMP_SND_SHOOT = "weapons/airstrike_fire_01.wav" ROCKETBLIMP_PROJECTILE_MODEL = "models/weapons/w_models/w_rocket_airstrike/w_rocket_airstrike.mdl" ROCKETBLIMP_PROJECTILE_SPREAD = 5 ROCKETBLIMP_PROJECTILE_SPLASH_RADIUS = 146 ROCKETBLIMP_PROJECTILE_SPEED = 770 ROCKETBLIMP_PROJECTILE_DAMAGE = 135 ROCKETBLIMP_SKIN_BLUE = 1 ROCKETBLIMP_SKIN_RED = 0 ROCKETBLIMP_ROTATE_SPEED_DEFAULT = 100 } foreach(k,v in ROCKETBLIMP_VALUES_TABLE) if(!(k in TankExt.ValueOverrides)) ROOT[k] <- v PrecacheModel(ROCKETBLIMP_PROJECTILE_MODEL) PrecacheModel(ROCKETBLIMP_MODEL) PrecacheModel(ROCKETBLIMP_MODEL_DAMAGE1) PrecacheModel(ROCKETBLIMP_MODEL_DAMAGE2) PrecacheModel(ROCKETBLIMP_MODEL_DAMAGE3) PrecacheSound(ROCKETBLIMP_SND_SHOOT) PrecacheSound(ROCKETBLIMP_SND_SHOOT_CRIT) TankExt.NewTankScript("rocketblimp", { OnSpawn = function(hTank, sName, hPath) { local bBlueTeam = hTank.GetTeam() == 3 hTank.SetAbsAngles(QAngle(0, hTank.GetAbsAngles().y, 0)) TankExt.SetTankModel(hTank, ROCKETBLIMP_MODEL) hTank.SetSkin(hTank.GetTeam() == 3 ? ROCKETBLIMP_SKIN_BLUE : ROCKETBLIMP_SKIN_RED) for(local hChild = hTank.FirstMoveChild(); hChild != null; hChild = hChild.NextMovePeer()) hChild.DisableDraw() local hTank_scope = hTank.GetScriptScope() local flSpeed = GetPropFloat(hTank, "m_speed") hTank_scope.flRotateSpeed <- ROCKETBLIMP_ROTATE_SPEED_DEFAULT hTank_scope.vecMount <- null local hModel = SpawnEntityFromTable("prop_dynamic", { targetname = "rocketprop", origin = "8 0 76", angles = "45 0 180", modelscale = "0.75", model = ROCKETBLIMP_TURRET_MODEL, skin = bBlueTeam ? 2 : 0 }) hTank_scope.hMimic <- SpawnEntityFromTable("tf_point_weapon_mimic", { targetname = "rocketshoot", origin = "10 0 -56", angles = "45 0 0", damage = ROCKETBLIMP_PROJECTILE_DAMAGE, modelscale = 1, modeloverride = ROCKETBLIMP_PROJECTILE_MODEL, speedmax = ROCKETBLIMP_PROJECTILE_SPEED, speedmin = ROCKETBLIMP_PROJECTILE_SPEED, splashradius = ROCKETBLIMP_PROJECTILE_SPLASH_RADIUS, spreadangle = ROCKETBLIMP_PROJECTILE_SPREAD }) TankExt.SetParentArray([hTank_scope.hMimic, hModel], hTank) hTank_scope.hStickies <- [] hTank_scope.flTimeNext <- Time() hTank_scope.hTrackTrain <- SpawnEntityFromTable("func_tracktrain", { origin = hTank.GetOrigin() speed = flSpeed startspeed = flSpeed target = hPath.GetName() }) hTank_scope.flLastSpeed <- flSpeed hTank_scope.ShootStickies <- function(iStickyCount = 1, bCrit = false) { local sMultiple = iStickyCount > 1 ? "FireMultiple" : "FireOnce" local sStickyCount = iStickyCount.tostring() SetPropBool(hMimic, "m_bCrits", bCrit) hMimic.AcceptInput(sMultiple, sStickyCount, null, null) EmitSoundEx({ sound_name = bCrit ? ROCKETBLIMP_SND_SHOOT_CRIT : ROCKETBLIMP_SND_SHOOT entity = self filter_type = RECIPIENT_FILTER_GLOBAL sound_level = 82 }) } hTank_scope.RocketThink <- function() { foreach(i, hSticky in hStickies) if(!(hSticky && hSticky.IsValid())) hStickies.remove(i) local FindStickies = function(hMimic) { for(local hSticky; hSticky = FindByClassnameWithin(hSticky, "tf_projectile_rocket", hMimic.GetOrigin(), 64);) if(GetPropEntity(hSticky, "m_hThrower") == null && hSticky.GetOwner() == null) { hSticky.SetTeam(self.GetTeam()) hSticky.SetOwner(self) hStickies.append(hSticky) } } if(hMimic && hMimic.IsValid()) FindStickies(hMimic) if(Time() >= flTimeNext) { flTimeNext += 0.25 EntFireByHandle(self, "CallScriptFunction", "ShootStickies", -1, null, null) } local vecTrackTrain = hTrackTrain.GetOrigin() self.SetAbsOrigin(vecTrackTrain) self.GetLocomotionInterface().Reset() local vecOrigin = self.GetOrigin() local angRotation = self.GetAbsAngles() vecMount = vecOrigin + RotatePosition(Vector(), angRotation, self.GetAttachmentOrigin(self.LookupAttachment("hMimic")) - vecOrigin) local flSpeed = GetPropFloat(self, "m_speed") if(flSpeed == 0) flSpeed = 0.0001 if(flSpeed != flLastSpeed) { flLastSpeed = flSpeed SetPropFloat(hTrackTrain, "m_flSpeed", flSpeed) } return -1 } hTank_scope.Think <- function() { if(self.GetModelName() != ROCKETBLIMP_MODEL) TankExt.SetTankModel(self, ROCKETBLIMP_MODEL) local vecTrackTrain = hTrackTrain.GetOrigin() self.SetAbsOrigin(vecTrackTrain) self.GetLocomotionInterface().Reset() local flSpeed = GetPropFloat(self, "m_speed") if(flSpeed == 0) flSpeed = 0.001 if(flSpeed != flLastSpeed) { flLastSpeed = flSpeed SetPropFloat(hTrackTrain, "m_flSpeed", flSpeed) } return -1 } TankExt.AddThinkToEnt(hTank, "RocketThink") TankExt.AddThinkToEnt(hTank, "Think") } OnDeath = function() { if(hTrackTrain && hTrackTrain.IsValid()) hTrackTrain.Destroy() local hDestruction = FindByClassnameNearest("tank_destruction", self.GetOrigin(), 16) if(hDestruction && hDestruction.IsValid()) hDestruction.Destroy() } })