--[[ | This file was obtained through the combined efforts | of Madbluntz & Plymouth Antiquarian Society. | | Credits: lifestorm, Gregory Wayne Rossel JR., | Maloy, DrPepper10 @ RIP, Atle! | | Visit for more: https://plymouth.thetwilightzone.ru/ --]] AddCSLuaFile("shared.lua") include('shared.lua') /*----------------------------------------------- *** Copyright (c) 2012-2023 by DrVrej, All rights reserved. *** No parts of this code or any of its contents may be reproduced, copied, modified or adapted, without the prior written consent of the author, unless otherwise indicated for stand-alone materials. -----------------------------------------------*/ ENT.Model = {"models/vj_hlr/hl1/apc_turret.mdl"} -- The game will pick a random model from the table when the SNPC is spawned | Add as many as you want ENT.StartHealth = 0 ENT.VJ_NPC_Class = {"CLASS_UNITED_STATES"} -- NPCs with the same class with be allied to each other ENT.HasDeathRagdoll = false -- If set to false, it will not spawn the regular ragdoll of the SNPC -- Tank Base ENT.Tank_SoundTbl_Turning = {"vj_hlr/hl1_npc/tanks/bradley_turret_rot.wav"} //ENT.Tank_ReloadShellSoundLevel = 75 ENT.Tank_AngleDiffuseNumber = 0 ENT.Tank_Shell_EntityToSpawn = "obj_vj_hlr1_rocket" -- The entity that is spawned when the shell is fired ENT.Tank_Shell_VelocitySpeed = 3000 -- How fast should the tank shell travel? util.AddNetworkString("vj_hlr1_m2a3bradleyg_shooteffects") -- Custom ENT.Bradley_DoingMissileAtk = false ENT.Bradley_NextMissileAtkT = 0 local vecMissile = Vector(28.65, 57.25, 19.28) local vecBullet = Vector(113.9, 2.62, 10.06) local sdReloadMissile = {"vj_hlr/hl1_npc/tanks/tow_reload.wav"} local sdReloadBullet = {"vj_hlr/hl1_npc/tanks/25mm_reload.wav"} local sdFireMissile = {"vj_hlr/hl1_npc/tanks/tow_firing.wav"} local sdFireBullet = {"vj_hlr/hl1_npc/tanks/biggun2.wav"} --------------------------------------------------------------------------------------------------------------------------------------------- function ENT:StartShootEffects() if !self.Bradley_DoingMissileAtk then net.Start("vj_hlr1_m2a3bradleyg_shooteffects") net.WriteEntity(self) net.Broadcast() end end --------------------------------------------------------------------------------------------------------------------------------------------- function ENT:Tank_CustomOnReloadShell() if CurTime() > self.Bradley_NextMissileAtkT && math.random(1, 5) == 1 then self.Bradley_DoingMissileAtk = true self.Tank_Shell_NextFireTime = 3 self.Tank_Shell_TimeUntilFire = 1.5 self.Tank_Shell_SpawnPos = vecMissile self.Tank_Shell_DynamicLightPos = vecMissile self.Tank_Shell_MuzzleFlashPos = vecMissile self.Tank_Shell_ParticlePos = vecMissile self.HasReloadShellSound = true self.Tank_SoundTbl_ReloadShell = sdReloadMissile self.Tank_SoundTbl_FireShell = sdFireMissile else -- If last attack was a missile attack then play the gun switch sound if self.Bradley_DoingMissileAtk then self.Tank_Shell_TimeUntilFire = 1 self.HasReloadShellSound = true else self.Tank_Shell_TimeUntilFire = 0.5 self.HasReloadShellSound = false end self.Bradley_DoingMissileAtk = false self.Tank_Shell_NextFireTime = 0 self.Tank_Shell_SpawnPos = vecBullet self.Tank_Shell_DynamicLightPos = vecBullet self.Tank_Shell_MuzzleFlashPos = vecBullet self.Tank_Shell_ParticlePos = vecBullet self.Tank_SoundTbl_ReloadShell = sdReloadBullet self.Tank_SoundTbl_FireShell = sdFireBullet end end --------------------------------------------------------------------------------------------------------------------------------------------- local vecZ40 = Vector(0, 0, 40) -- function ENT:Tank_CustomOnShellFire_BeforeShellCreate() if self.Bradley_DoingMissileAtk then return true end local ene = self:GetEnemy() local pos = self:LocalToWorld(vecBullet) self:FireBullets({ Damage = 1, Force = 100, HullSize = 10, Dir = (ene:GetPos() + ene:OBBCenter()) - pos, Src = pos, Spread = Vector(math.Rand(-50, 50), math.Rand(-50, 50), 0), TracerName = "VJ_HLR_Tracer_Large", Callback = function(attack, tr, dmginfo) local hitPos = tr.HitPos util.Decal("VJ_HLR_Scorch_Small", hitPos + tr.HitNormal, hitPos - tr.HitNormal) util.VJ_SphereDamage(self, self, hitPos, 50, 30, DMG_BLAST, true, true, {Force=100}) sound.Play("vj_hlr/hl1_weapon/explosion/explode"..math.random(3, 5)..".wav", hitPos, 70, 100, 1) sound.Play("vj_hlr/hl1_weapon/explosion/debris"..math.random(1, 3)..".wav", hitPos, 70, 100, 1) local spr = ents.Create("env_sprite") spr:SetKeyValue("model","vj_hl/sprites/zerogxplode.vmt") spr:SetKeyValue("GlowProxySize","2.0") spr:SetKeyValue("HDRColorScale","1.0") spr:SetKeyValue("renderfx","14") spr:SetKeyValue("rendermode","5") spr:SetKeyValue("renderamt","255") spr:SetKeyValue("disablereceiveshadows","0") spr:SetKeyValue("mindxlevel","0") spr:SetKeyValue("maxdxlevel","0") spr:SetKeyValue("framerate","15.0") spr:SetKeyValue("spawnflags","0") spr:SetKeyValue("scale","1.5") spr:SetPos(hitPos + vecZ40) spr:Spawn() spr:Fire("Kill","",0.9) timer.Simple(0.9, function() if IsValid(spr) then spr:Remove() end end) local expLight = ents.Create("light_dynamic") expLight:SetKeyValue("brightness", "4") expLight:SetKeyValue("distance", "300") expLight:SetLocalPos(hitPos) expLight:SetLocalAngles(self:GetAngles()) expLight:Fire("Color", "255 150 0") expLight:SetParent(self) expLight:Spawn() expLight:Activate() expLight:Fire("TurnOn", "", 0) expLight:Fire("Kill", "", 0.1) self:DeleteOnRemove(expLight) end }) return false end --------------------------------------------------------------------------------------------------------------------------------------------- function ENT:Tank_CustomOnShellFire_BeforeShellSpawn(shell, spawnPos) -- Only ran when its a missile attack, so no need to check if its bullet attacking shell.Rocket_AirMissile = true self.Bradley_NextMissileAtkT = CurTime() + math.Rand(12, 25) end --------------------------------------------------------------------------------------------------------------------------------------------- function ENT:Tank_ShellFireVelocity(shell, spawnPos, calculatedVel) return -- Done in the projectile instead end