add sborka

This commit is contained in:
2026-03-31 10:27:04 +03:00
commit f5e5f56c84
2345 changed files with 382127 additions and 0 deletions

View File

@@ -0,0 +1,92 @@
include("shared.lua")
function ENT:PreDraw()
local Body = self:GetBody()
if not IsValid( Body ) then return false end
Body:DrawModel()
return false
end
function ENT:PreDrawTranslucent()
return false
end
function ENT:DamageFX()
self.nextDFX = self.nextDFX or 0
if self.nextDFX < CurTime() then
self.nextDFX = CurTime() + 0.05
local HP = self:GetHP()
local MaxHP = self:GetMaxHP()
if HP > MaxHP * 0.25 then return end
local effectdata = EffectData()
effectdata:SetOrigin( self:LocalToWorld( Vector(-60,0,-10) ) )
effectdata:SetNormal( self:GetUp() )
effectdata:SetMagnitude( math.Rand(0.5,1.5) )
effectdata:SetEntity( self )
util.Effect( "lvs_exhaust_fire", effectdata )
end
end
function ENT:OnFrame()
self:AnimRotor()
self:DamageFX()
end
function ENT:AnimRotor()
local RPM = self:GetThrottle() * 2500
self.RPM = self.RPM and (self.RPM + RPM * RealFrameTime() * 0.5) or 0
local Rot = Angle( -self.RPM,0,0)
Rot:Normalize()
local Body = self:GetBody()
if not IsValid( Body ) then return end
Body:ManipulateBoneAngles( 19, Rot )
end
function ENT:PaintCrosshairSquare( Pos2D, Col )
local X = Pos2D.x + 1
local Y = Pos2D.y + 1
local Size = 20
surface.SetDrawColor( 0, 0, 0, 80 )
surface.DrawLine( X - Size, Y + Size, X - Size * 0.5, Y + Size )
surface.DrawLine( X + Size, Y + Size, X + Size * 0.5, Y + Size )
surface.DrawLine( X - Size, Y + Size, X - Size, Y + Size * 0.5 )
surface.DrawLine( X - Size, Y - Size, X - Size, Y - Size * 0.5 )
surface.DrawLine( X + Size, Y + Size, X + Size, Y + Size * 0.5 )
surface.DrawLine( X + Size, Y - Size, X + Size, Y - Size * 0.5 )
surface.DrawLine( X - Size, Y - Size, X - Size * 0.5, Y - Size )
surface.DrawLine( X + Size, Y - Size, X + Size * 0.5, Y - Size )
if Col then
surface.SetDrawColor( Col.r, Col.g, Col.b, Col.a )
else
surface.SetDrawColor( 255, 255, 255, 255 )
end
X = Pos2D.x
Y = Pos2D.y
surface.DrawLine( X - Size, Y + Size, X - Size * 0.5, Y + Size )
surface.DrawLine( X + Size, Y + Size, X + Size * 0.5, Y + Size )
surface.DrawLine( X - Size, Y + Size, X - Size, Y + Size * 0.5 )
surface.DrawLine( X - Size, Y - Size, X - Size, Y - Size * 0.5 )
surface.DrawLine( X + Size, Y + Size, X + Size, Y + Size * 0.5 )
surface.DrawLine( X + Size, Y - Size, X + Size, Y - Size * 0.5 )
surface.DrawLine( X - Size, Y - Size, X - Size * 0.5, Y - Size )
surface.DrawLine( X + Size, Y - Size, X + Size * 0.5, Y - Size )
self:PaintCrosshairCenter( Pos2D, Col )
end

View File

@@ -0,0 +1,160 @@
AddCSLuaFile( "shared.lua" )
AddCSLuaFile( "cl_init.lua" )
include("shared.lua")
function ENT:OnSpawn( PObj )
local DriverSeat = self:AddDriverSeat( Vector(200,0,0), Angle(0,-90,0) )
DriverSeat:SetCameraDistance( 0.2 )
DriverSeat.HidePlayer = true
self:AddEngineSound( Vector(-133,0,55) )
self:DrawShadow( false )
local Body = ents.Create( "lvs_gunship_body" )
Body:SetPos( self:GetPos() )
Body:SetAngles( self:GetAngles() )
Body:Spawn()
Body:Activate()
Body:SetParent( self )
Body:SetSkin( 1 )
self:DeleteOnRemove( Body )
self:TransferCPPI( Body )
self:SetBody( Body )
local Rotor = self:AddRotor( Vector(-133,0,55), Angle(0,0,0), 0, 4000 )
Rotor:SetRotorEffects( true )
local ID = Body:LookupAttachment( "muzzle" )
local Muzzle = Body:GetAttachment( ID )
self.weaponSND = self:AddSoundEmitter( Body:WorldToLocal( Muzzle.Pos ), "npc/combine_gunship/gunship_weapon_fire_loop6.wav", "npc/combine_gunship/gunship_fire_loop1.wav" )
self.weaponSND:SetSoundLevel( 110 )
self.weaponSND:SetParent( Body, ID )
end
function ENT:SetRotor( PhysRot )
local Body = self:GetBody()
if not IsValid( Body ) then return end
if self._oldPhysRot ~= PhysRot then
self._oldPhysTor = PhysRot
if PhysRot then
Body:SetSkin( 1 )
else
Body:SetSkin( 0 )
end
end
end
function ENT:OnTick()
local PhysRot = self:GetThrottle() < 0.85
if not self:IsEngineDestroyed() then
self:SetRotor( PhysRot )
end
self:AnimBody()
self:BodySounds()
end
function ENT:BodySounds()
local T = CurTime()
if (self._nextBodySND or 0) > T then return end
self._nextBodySND = T + 2
local HP = self:GetHP()
if self._oldHPsnd ~= HP then
if isnumber( self._oldHPsnd ) then
if self._oldHPsnd > HP and math.abs(self._oldHPsnd - HP) > 100 then
self:EmitSound("NPC_CombineGunship.Pain")
end
end
self._oldHPsnd = HP
end
local trace = self:GetEyeTrace()
local SeeEnemy = IsValid( trace.Entity ) and trace.Entity ~= self._oldEnemySND and trace.Entity.LVS and self:IsEnemy( trace.Entity )
if SeeEnemy then
self._oldEnemySND = trace.Entity
self:EmitSound("NPC_CombineGunship.SeeEnemy")
end
end
function ENT:AnimBody()
local PhysObj = self:GetPhysicsObject()
if not IsValid( PhysObj ) then return end
local Body = self:GetBody()
if not IsValid( Body ) then return end
local FT = FrameTime()
local LocalAngles = self:WorldToLocalAngles( self:GetAimVector():Angle() )
local VelL = self:WorldToLocal( self:GetPos() + self:GetVelocity() )
local AngVel = PhysObj:GetAngleVelocity()
local Steer = self:GetSteer()
self._smLocalAngles = self._smLocalAngles and self._smLocalAngles + (LocalAngles - self._smLocalAngles) * FT * 4 or LocalAngles
self._smVelL = self._smVelL and self._smVelL + (VelL - self._smVelL) * FT * 10 or VelL
self._smAngVel = self._smAngVel and self._smAngVel + (AngVel - self._smAngVel) * FT * 10 or AngVel
self._smSteer = self._smSteer and self._smSteer + (Steer - self._smSteer) * FT * 0.2 or Steer
Body:SetPoseParameter("flex_vert", self._smSteer.y * 10 + self._smLocalAngles.p * 0.5 )
Body:SetPoseParameter("flex_horz", self._smAngVel.z * 0.25 - self._smSteer.x * 10 + self._smLocalAngles.y * 0.5 )
Body:SetPoseParameter("fin_accel", self._smVelL.x * 0.0015 + self._smSteer.y * 2 + self._smVelL.z * 0.008 )
Body:SetPoseParameter("fin_sway", -self._smVelL.y * 0.007 - self._smSteer.x * 5 )
Body:SetPoseParameter("antenna_accel", self._smVelL.x * 0.005 )
Body:SetPoseParameter("antenna_sway", -self._smVelL.y * 0.005 )
end
function ENT:FireBellyCannon()
local base = self:GetBody()
if not IsValid( base ) then return end
local Muzzle = base:GetAttachment( base:LookupAttachment( "bellygun" ) )
if not Muzzle then return end
local traceTarget = util.TraceLine( {
start = Muzzle.Pos,
endpos = Muzzle.Pos + base:GetAimVector() * 50000,
filter = self:GetCrosshairFilterEnts()
} )
local traceBrush = util.TraceLine( {
start = Muzzle.Pos,
endpos = Muzzle.Pos + base:GetAimVector() * 50000,
mask = MASK_SOLID_BRUSHONLY,
} )
local Driver = self:GetDriver()
local dmginfo = DamageInfo()
dmginfo:SetAttacker( IsValid( Driver ) and Driver or self )
dmginfo:SetInflictor( self )
dmginfo:SetDamage( 500 )
dmginfo:SetDamageType( DMG_DISSOLVE )
dmginfo:SetDamagePosition( traceBrush.HitPos )
util.BlastDamageInfo( dmginfo, traceBrush.HitPos, 500 )
local HitEnt = traceTarget.Entity
if not IsValid( HitEnt ) then return end
dmginfo:SetDamage( 5000 )
HitEnt:TakeDamageInfo( dmginfo )
end

View File

@@ -0,0 +1,247 @@
ENT.Base = "lvs_base_helicopter"
ENT.PrintName = "Combine Gunship"
ENT.Author = "Luna"
ENT.Information = "Combine Synth Gunship from Half Life 2 + Episodes"
ENT.Category = "[LVS] - Helicopters"
ENT.VehicleCategory = "Helicopters"
ENT.VehicleSubCategory = "Combine"
ENT.Spawnable = true
ENT.AdminSpawnable = false
ENT.DisableBallistics = true
ENT.MDL = "models/blu/combine_gunship.mdl"
ENT.GibModels = {
"models/gibs/gunship_gibs_engine.mdl",
"models/gibs/gunship_gibs_eye.mdl",
"models/gibs/gunship_gibs_headsection.mdl",
"models/gibs/gunship_gibs_midsection.mdl",
"models/gibs/gunship_gibs_nosegun.mdl",
"models/gibs/gunship_gibs_sensorarray.mdl",
"models/gibs/gunship_gibs_tailsection.mdl",
"models/gibs/gunship_gibs_wing.mdl",
}
ENT.AITEAM = 1
ENT.MaxHealth = 1600
ENT.MaxVelocity = 2150
ENT.ThrustUp = 1
ENT.ThrustDown = 0.8
ENT.ThrustRate = 1
ENT.ThrottleRateUp = 0.2
ENT.ThrottleRateDown = 0.2
ENT.TurnRatePitch = 1
ENT.TurnRateYaw = 1
ENT.TurnRateRoll = 1
ENT.GravityTurnRateYaw = 2
ENT.ForceLinearDampingMultiplier = 1.5
ENT.ForceAngleMultiplier = 1
ENT.ForceAngleDampingMultiplier = 1
ENT.EngineSounds = {
{
sound = "^npc/combine_gunship/engine_whine_loop1.wav",
--sound_int = "lvs/vehicles/helicopter/loop_interior.wav",
Pitch = 0,
PitchMin = 0,
PitchMax = 255,
PitchMul = 100,
Volume = 1,
VolumeMin = 0,
VolumeMax = 1,
SoundLevel = 125,
UseDoppler = true,
},
{
sound = "npc/combine_gunship/engine_rotor_loop1.wav",
Pitch = 0,
PitchMin = 0,
PitchMax = 255,
PitchMul = 100,
Volume = 1,
VolumeMin = 0,
VolumeMax = 1,
SoundLevel = 125,
UseDoppler = true,
},
}
function ENT:OnSetupDataTables()
self:AddDT( "Entity", "Body" )
end
function ENT:GetAimAngles()
local Muzzle = self:GetAttachment( self:LookupAttachment( "muzzle" ) )
if not Muzzle then return end
local trace = self:GetEyeTrace()
local AimAngles = self:WorldToLocalAngles( (trace.HitPos - Muzzle.Pos):GetNormalized():Angle() )
return AimAngles
end
function ENT:WeaponsInRange()
return self:AngleBetweenNormal( self:GetForward(), self:GetAimVector() ) < 75
end
function ENT:BellyInRange()
return self:AngleBetweenNormal( -self:GetUp(), self:GetAimVector() ) < 45
end
function ENT:InitWeapons()
local weapon = {}
weapon.Icon = Material("lvs/weapons/mg.png")
weapon.Ammo = 2000
weapon.Delay = 0.1
weapon.HeatRateUp = 0.2
weapon.HeatRateDown = 0.25
weapon.StartAttack = function( ent )
if not IsValid( ent.weaponSND ) then return end
ent.weaponSND:EmitSound("NPC_CombineGunship.CannonStartSound")
self.ShouldPlaySND = true
end
weapon.FinishAttack = function( ent )
if not IsValid( ent.weaponSND ) then return end
self.ShouldPlaySND = false
ent.weaponSND:Stop()
ent.weaponSND:EmitSound("NPC_CombineGunship.CannonStopSound")
end
weapon.Attack = function( ent )
if not ent:WeaponsInRange() then
ent.ShouldPlaySND = false
return true
end
ent.ShouldPlaySND = true
local Body = ent:GetBody()
if not IsValid( Body ) then return end
local Muzzle = Body:GetAttachment( Body:LookupAttachment( "muzzle" ) )
if not Muzzle then return end
local trace = ent:GetEyeTrace()
local bullet = {}
bullet.Src = Muzzle.Pos
bullet.Dir = (trace.HitPos - Muzzle.Pos):GetNormalized()
bullet.Spread = Vector(0.02,0.02,0.02)
bullet.TracerName = "lvs_pulserifle_tracer_large"
bullet.Force = 2000
bullet.HullSize = 6
bullet.Damage = 18
bullet.Velocity = 12000
bullet.Attacker = self:GetDriver()
bullet.Callback = function(att, tr, dmginfo)
local effectdata = EffectData()
effectdata:SetOrigin( tr.HitPos + tr.HitNormal )
effectdata:SetNormal( tr.HitNormal * 2 )
effectdata:SetRadius( 10 )
util.Effect( "cball_bounce", effectdata, true, true )
end
self:LVSFireBullet( bullet )
local effectdata = EffectData()
effectdata:SetOrigin( Muzzle.Pos )
effectdata:SetNormal( Muzzle.Ang:Forward() )
effectdata:SetEntity( ent )
util.Effect( "lvs_pulserifle_muzzle", effectdata )
ent:TakeAmmo()
end
weapon.OnThink = function( ent, active )
if not IsValid( ent.weaponSND ) then return end
local ShouldPlay = ent.ShouldPlaySND and active
if ent._oldShouldPlaySND ~= ShouldPlay then
ent._oldShouldPlaySND = ShouldPlay
if ShouldPlay then
ent.weaponSND:Play()
else
ent.weaponSND:Stop()
end
end
end
weapon.OnSelect = function( ent ) ent:EmitSound("physics/metal/weapon_impact_soft3.wav") end
self:AddWeapon( weapon )
local color_red = Color(255,0,0,255)
local weapon = {}
weapon.Icon = Material("lvs/weapons/warplaser.png")
weapon.Ammo = -1
weapon.Delay = 4
weapon.HeatRateUp = 0
weapon.HeatRateDown = 0.05
weapon.Attack = function( ent )
if ent:GetAI() and not ent:BellyInRange() then return true end
ent:SetHeat( 100 )
ent:SetOverheated( true )
local effectdata = EffectData()
effectdata:SetOrigin( ent:GetPos() )
effectdata:SetEntity( ent:GetBody() )
util.Effect( "lvs_warpcannon_charge", effectdata )
timer.Simple( 2, function()
if not IsValid( ent ) then return end
local effectdata = EffectData()
effectdata:SetOrigin( ent:GetPos() )
effectdata:SetEntity( ent:GetBody() )
util.Effect( "lvs_warpcannon_fire", effectdata )
timer.Simple( 0.2, function()
if not IsValid( ent ) then return end
ent:FireBellyCannon()
end )
end )
end
weapon.OnSelect = function( ent ) ent:EmitSound("physics/metal/weapon_impact_soft3.wav") end
weapon.HudPaint = function( ent, X, Y, ply )
local base = ent:GetBody()
if not IsValid( base ) then return end
local Muzzle = base:GetAttachment( base:LookupAttachment( "bellygun" ) )
if not Muzzle then return end
local trace = util.TraceLine( {
start = Muzzle.Pos,
endpos = Muzzle.Pos + base:GetAimVector() * 50000,
mask = MASK_SOLID_BRUSHONLY
} )
local Pos2D = trace.HitPos:ToScreen()
ent:PaintCrosshairSquare( Pos2D, ent:BellyInRange() and color_white or color_red )
ent:LVSPaintHitMarker( Pos2D )
end
self:AddWeapon( weapon )
end