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,384 @@
swv3 = swv3 or {}
local util = util
local pairs = pairs
local table = table
local istable = istable
local IsInWorld = util.IsInWorld
local TraceLine = util.TraceLine
local QuickTrace = util.QuickTrace
local Effect = util.Effect
local MASK_ALL = MASK_ALL
local tableinsert = table.insert
local IsValid = IsValid
local DMG_BLAST = DMG_BLAST
local soundSpeed = 18005.25*18005.25 -- 343m/s
local Level = {
[1] = {
112,
150,
150,
},
[2] = {
112,
150,
150,
},
[3] = {
112,
150,
150,
},
}
local BigExplosionSoundLevels = {
[1] = {
150,
150,
150,
},
[2] = {
150,
150,
150,
},
[3] = {
150,
150,
150,
},
}
local BigExplosionSounds = {
}
net.Receive("swv3_net_sound_new",function()
local pos = net.ReadVector()
local tab = net.ReadTable()
if not tab[1] then return end
local e1 = tab[1]
local e2 = tab[2] or e1
local e3 = tab[3] or e2
local div = math.Clamp(math.ceil(1),1,#Level)
local vol = 1
local currange = 1000 / div
local curRange_min = currange*5
curRange_min = curRange_min*curRange_min
local curRange_mid = currange*14
curRange_mid = curRange_mid * curRange_mid
local curRange_max = currange*40
curRange_max = curRange_max * curRange_max
local ply = LocalPlayer():GetViewEntity()
local plypos = ply:GetPos()
local distance = ply:GetPos():DistToSqr(pos)
hook.Run("SWV3Explosion",e1,pos,distance,e2,e3)
if distance <= curRange_min then
if not LocalPlayer():InVehicle() then
util.ScreenShake(pos,10,75,2,math.sqrt(curRange_min))
end
if BigExplosionSounds[e1] then
sound.Play(e1,pos,BigExplosionSoundLevels[div][1],100,1 * vol)
else
sound.Play(e1,pos,Level[div][1],100,1 * vol)
end
elseif distance <= curRange_mid then
timer.Simple(distance/soundSpeed,function()
if not LocalPlayer():InVehicle() then
util.ScreenShake(pos,3,75,1.5,math.sqrt(curRange_mid))
end
if BigExplosionSounds[e3] then
sound.Play(e2,pos,BigExplosionSoundLevels[div][2],100,1 * vol)
else
sound.Play(e2,pos,Level[div][2],100,0.5 * vol)
end
end)
else
timer.Simple(distance/soundSpeed,function()
if BigExplosionSounds[e2] then
sound.Play(e1,pos,BigExplosionSoundLevels[div][3],100,1 * vol)
else
sound.Play(e3,pos,Level[div][3],100,1 * vol)
end
end)
end
end)
--Particles
game.AddParticles( "particles/Missile_Thrust.pcf")
game.AddParticles( "particles/Rocket_Thrust.pcf")
game.AddParticles( "particles/AAM_Thrust.pcf")
game.AddParticles( "particles/WP_trail.pcf")
game.AddParticles( "particles/sw_flare.pcf")
game.AddParticles( "particles/gb5_emp.pcf")
game.AddParticles( "particles/gwa_agm62.pcf")
game.AddParticles( "particles/gw_mark77.pcf")
game.AddParticles( "particles/gwa_m388.pcf")
game.AddParticles( "particles/gwa_t12.pcf")
game.AddParticles( "particles/gwa_blu1.pcf")
game.AddParticles( "particles/gwa_fab100.pcf")
game.AddParticles( "particles/gw_moab_gp100_pack.pcf")
game.AddParticles( "particles/gw_gbu12.pcf")
game.AddParticles( "particles/gw_mk84.pcf")
game.AddParticles( "particles/gw_m66.pcf")
game.AddParticles( "particles/gwa_blockbuster.pcf")
game.AddParticles( "particles/gwa_mk82a3.pcf")
game.AddParticles( "particles/gw_rocket_test.pcf")
game.AddParticles( "particles/gw_death.pcf")
game.AddParticles( "particles/gwa_mop.pcf")
game.AddParticles( "particles/gwa_sdb.pcf")
game.AddParticles( "particles/gwa_water_splode.pcf")
game.AddParticles( "particles/gwa_foab.pcf")
game.AddParticles( "particles/gwa_tallboy.pcf")
game.AddParticles( "particles/gwa_m61.pcf")
game.AddParticles( "particles/gwa_foab_new.pcf")
game.AddParticles( "particles/gwa_w48.pcf")
game.AddParticles( "particles/gwa_actual_tallboy.pcf")
game.AddParticles( "particles/gwa_grigori.pcf")
game.AddParticles( "particles/gwa_grandslam.pcf")
game.AddParticles( "particles/gwa_agm_norm.pcf")
game.AddParticles( "particles/gwa_fizzle.pcf")
game.AddParticles( "particles/gwa_littleboy_fizzle.pcf")
game.AddParticles( "particles/gwa_gas.pcf")
game.AddParticles( "particles/gwa_rds1.pcf")
game.AddParticles( "particles/gw_m66_new.pcf")
game.AddParticles( "particles/gw_dirty.pcf")
game.AddParticles( "particles/gw_b61.pcf")
game.AddParticles( "particles/gw_gbu12_new.pcf")
game.AddParticles( "particles/gw_mike.pcf")
game.AddParticles( "particles/gw_must.pcf")
game.AddParticles( "particles/gw_250lb.pcf")
game.AddParticles( "particles/gw_500lb.pcf")
game.AddParticles( "particles/gw_1000kg.pcf")
game.AddParticles( "particles/gw_bunker.pcf")
game.AddParticles( "particles/gw_2000lb.pcf")
game.AddParticles( "particles/gw_foabn.pcf")
game.AddParticles( "particles/gw_moabn.pcf")
game.AddParticles( "particles/doi_explosion_fx.pcf")
game.AddParticles( "particles/doi_explosion_fx_b.pcf")
game.AddParticles( "particles/doi_explosion_fx_c.pcf")
game.AddParticles( "particles/doi_explosion_fx_grenade.pcf")
game.AddParticles( "particles/doi_explosion_fx_new.pcf")
game.AddParticles( "particles/doi_impact_fx.pcf" )
game.AddParticles( "particles/doi_weapon_fx.pcf" )
game.AddParticles( "particles/gb_water.pcf")
game.AddParticles( "particles/gb5_100lb.pcf")
game.AddParticles( "particles/gb5_500lb.pcf")
game.AddParticles( "particles/gb5_1000lb.pcf")
game.AddParticles( "particles/gb5_jdam.pcf")
game.AddParticles( "particles/gb5_large_explosion.pcf")
game.AddParticles( "particles/gb5_napalm.pcf")
game.AddParticles( "particles/gb5_light_bomb.pcf")
game.AddParticles( "particles/gb5_high_explosive_2.pcf")
game.AddParticles( "particles/gb5_high_explosive.pcf")
game.AddParticles( "particles/gb5_fireboom.pcf")
game.AddParticles( "particles/neuro_tank_ap.pcf")
game.AddParticles( "particles/ins_rockettrail.pcf")
game.AddParticles( "particles/ammo_cache_ins.pcf")
game.AddParticles( "particles/doi_rockettrail.pcf")
game.AddParticles( "particles/mnb_flamethrower.pcf")
game.AddParticles( "particles/impact_fx_ins.pcf" )
game.AddParticles( "particles/environment_fx.pcf")
game.AddParticles( "particles/water_impact.pcf")
game.AddParticles( "particles/explosion_fx_ins.pcf")
game.AddParticles( "particles/weapon_fx_tracers.pcf" )
game.AddParticles( "particles/weapon_fx_ins.pcf" )
game.AddParticles( "particles/gred_particles.pcf" )
game.AddParticles( "particles/fire_01.pcf" )
game.AddParticles( "particles/doi_explosions_smoke.pcf" )
game.AddParticles( "particles/explosion_fx_ins_b.pcf" )
game.AddParticles( "particles/ins_smokegrenade.pcf" )
game.AddParticles( "particles/ww1_gas.pcf" )
--Decals
game.AddDecal("scorch_1kg","decals/scorch_1kg")
game.AddDecal("scorch_25kg","decals/scorch_25kg")
game.AddDecal("scorch_50kg","decals/scorch_50kg")
game.AddDecal("scorch_100kg","decals/scorch_100kg")
game.AddDecal("scorch_250kg","decals/scorch_250kg")
game.AddDecal("scorch_500kg","decals/scorch_500kg")
game.AddDecal("scorch_1000kg","decals/scorch_1000kg")
game.AddDecal("scorch_1500kg","decals/scorch_1500kg")
game.AddDecal("scorch_3000kg","decals/scorch_3000kg")
game.AddDecal("scorch_5000kg","decals/scorch_5000kg")
game.AddDecal("scorch_9000kg","decals/scorch_9000kg")
--Fonts
surface.CreateFont( "sw_digital", {
font = "DS-Digital",
extended = false,
size = 20,
weight = 500,
blursize = 0,
scanlines = 0,
antialias = true,
underline = false,
italic = false,
strikeout = false,
symbol = false,
rotary = false,
shadow = false,
additive = false,
outline = false,
} )
surface.CreateFont("sw_hud", {
font = "Roboto",
size = 20,
weight = 550,
antialias = true,
scanlines = 2,
shadow = true
})
--Missile coordinates
swv3 = istable( swv3 ) and swv3 or {}
swv3.ThemeColor = Color(255,0,0,255)
CreateClientConVar( "sw_coord_x", 0, true, true,"Missile target coordinate on X axis")
CreateClientConVar( "sw_coord_y", 0, true, true,"Missile target coordinate on Y axis")
CreateClientConVar( "sw_coord_z", 0, true, true,"Missile target coordinate on Z axis")
CreateClientConVar( "sw_launch_allowed", 0, true, true,"Allow missile launch")
local FrameSizeX = 500
local FrameSizeY = 190
function swv3:OpenCoordinatesMenu( keep_position )
local xPos
local yPos
if IsValid( swv3.Frame ) then
if keep_position then
xPos = swv3.Frame:GetX()
yPos = swv3.Frame:GetY()
end
swv3.Frame:Close()
swv3.Frame = nil
end
swv3.Frame = vgui.Create( "DFrame" )
swv3.Frame:SetSize( FrameSizeX, FrameSizeY )
swv3.Frame:SetTitle( "" )
swv3.Frame:SetDraggable( true )
swv3.Frame:SetScreenLock( true )
swv3.Frame:MakePopup()
swv3.Frame:Center()
if keep_position and xPos and yPos then
swv3.Frame:SetPos( xPos, yPos )
end
local LCFrame = vgui.Create( "DPanel",swv3.Frame )
LCFrame:SetPos(330,80)
LCFrame:SetSize( 150, 60 )
local XCoord = vgui.Create( "DLabel",LCFrame )
local YCoord = vgui.Create( "DLabel",LCFrame )
local ZCoord = vgui.Create( "DLabel",LCFrame )
local LC = vgui.Create( "DLabel",LCFrame )
local Status = vgui.Create( "DLabel",LCFrame )
LC:SetPos(0,45)
LC:SetTextColor(Color(0,0,0))
LC:SetText( "Status:" )
local LaunchButton = vgui.Create( "DButton", swv3.Frame )
LaunchButton:SetPos( 330, 30 )
LaunchButton:SetSize( 150, 30 )
local XFrame = vgui.Create( "DPanel",swv3.Frame )
XFrame:SetPos(10,30)
XFrame:SetSize( 300, 40 )
local XLabel = vgui.Create( "DLabel",XFrame )
XLabel:SetTextColor(Color(255,0,0))
XLabel:SetText( "X coordinate" )
local XEntry = vgui.Create( "DTextEntry",XFrame) -- create the form as a child of frame
XEntry:SetNumeric(true)
XEntry:SetPos(0,15)
XEntry:Dock( BOTTOM )
XEntry.OnEnter = function( self )
local X = GetConVar("sw_coord_x")
X:SetInt(self:GetValue())
end
local YFrame = vgui.Create( "DPanel",swv3.Frame )
YFrame:SetPos(10,80)
YFrame:SetSize( 300, 40 )
local YLabel = vgui.Create( "DLabel",YFrame )
YLabel:SetTextColor(Color(255,0,0))
YLabel:SetText( "Y coordinate" )
local YEntry = vgui.Create( "DTextEntry",YFrame) -- create the form as a child of frame
YEntry:SetNumeric(true)
YEntry:SetPos(0,15)
YEntry:Dock( BOTTOM )
YEntry.OnEnter = function( self )
local Y = GetConVar("sw_coord_y")
Y:SetInt(self:GetValue())
end
local ZFrame = vgui.Create( "DPanel",swv3.Frame )
ZFrame:SetPos(10,130)
ZFrame:SetSize( 300, 40 )
local ZLabel = vgui.Create( "DLabel",ZFrame )
ZLabel:SetTextColor(Color(255,0,0))
ZLabel:SetText( "Z coordinate" )
local ZEntry = vgui.Create( "DTextEntry",ZFrame) -- create the form as a child of frame
ZEntry:SetNumeric(true)
ZEntry:SetPos(0,15)
ZEntry:Dock( BOTTOM )
ZEntry.OnEnter = function( self )
local Z = GetConVar("sw_coord_z")
Z:SetInt(self:GetValue())
end
swv3.Frame.Paint = function(self, w, h )
draw.RoundedBox( 8, 0, 0, w, h, Color( 0, 0, 0, 255 ) )
draw.RoundedBoxEx( 8, 1, 26, w-2, h-27, Color( 255, 255, 255, 255 ), false, false, true, true )
draw.RoundedBoxEx( 8, 0, 0, w, 25, swv3.ThemeColor, true, true )
draw.SimpleText( "[SW Bombs V3] - Missile target coordinates ", "sw_hud", 5, 11, Color(255,255,255,255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER )
XCoord:SetTextColor(Color(0,0,0))
XCoord:SetText( "X:"..GetConVar("sw_coord_x"):GetInt() )
YCoord:SetPos(0,15)
YCoord:SetTextColor(Color(0,0,0))
YCoord:SetText( "Y:"..GetConVar("sw_coord_y"):GetInt() )
ZCoord:SetPos(0,30)
ZCoord:SetTextColor(Color(0,0,0))
ZCoord:SetText( "Z:"..GetConVar("sw_coord_z"):GetInt() )
Status:SetPos(40,45)
if GetConVar("sw_launch_allowed"):GetInt() == 1 then
LaunchButton:SetText( "Disallow launch" )
LaunchButton.DoClick = function()
RunConsoleCommand( "sw_launch_allowed", 0 )
end
Status:SetTextColor(Color(0,255,0))
Status:SetText( "Ready" )
else
LaunchButton:SetText( "Allow launch" )
LaunchButton.DoClick = function()
RunConsoleCommand( "sw_launch_allowed", 1 )
end
Status:SetTextColor(Color(255,0,0))
Status:SetText( "Standby" )
end
end
end
concommand.Add( "sw_open_targeting_menu", function( ply, cmd, args ) swv3:OpenCoordinatesMenu() end )

View File

@@ -0,0 +1,191 @@
swv3 = swv3 or {}
local util = util
local pairs = pairs
local table = table
local istable = istable
local IsInWorld = util.IsInWorld
local TraceLine = util.TraceLine
local QuickTrace = util.QuickTrace
local Effect = util.Effect
local MASK_ALL = MASK_ALL
local tableinsert = table.insert
local IsValid = IsValid
local DMG_BLAST = DMG_BLAST
local AddNetworkString = util.AddNetworkString
local tab = {}
AddNetworkString("swv3_net_sound_new")
swv3.CreateSound = function(pos,rsound,e1,e2,e3)
tab[1] = e1 or nil
tab[2] = e2 or nil
tab[3] = e3 or nil
net.Start("swv3_net_sound_new")
net.WriteVector(pos)
net.WriteTable(tab)
net.Broadcast()
end
hook.Remove( "PlayerLeaveVehicle", "!!LVS_Exit" )
hook.Add( "PlayerLeaveVehicle", "ExitUAV", function( ply, Pod )
if not ply:IsPlayer() or not IsValid( Pod ) then return end
local Vehicle = Pod:lvsGetVehicle()
if not IsValid( Vehicle ) then return end
if not LVS.FreezeTeams then
ply:lvsSetAITeam( Vehicle:GetAITEAM() )
end
ply._lvsNextUse = CurTime() + 0.25
hook.Run( "LVS.UpdateRelationship", Vehicle )
local pos = Vehicle:LocalToWorld( Vehicle:OBBCenter() )
local vel = Vehicle:GetVelocity()
local radius = Vehicle:BoundingRadius()
local mins, maxs = ply:GetHull()
local PosCenter = Pod:OBBCenter()
local StartPos = Pod:LocalToWorld( PosCenter )
local FilterPlayer = { ply }
local Filter = table.Copy( Vehicle:GetCrosshairFilterEnts() )
table.insert( Filter, ply )
local zOffset = 15
local ValidPositions = {}
if Vehicle.LVSUAV and IsValid(Vehicle:GetNWEntity("UAVControl")) then
local ExitPos = Vehicle:GetNWEntity("UAVControl"):LocalToWorld( Vector(-50,0,20) )
if not ExitPos then return end
if util.IsInWorld( ExitPos ) then
ply:SetPos( ExitPos )
ply:SetEyeAngles( (Pod:GetPos() - ExitPos):Angle() )
end
else
if isvector( Pod.ExitPos ) and Vehicle:GetUp().z > 0.9 then
local data = {
pos = Vehicle:LocalToWorld( Pod.ExitPos ),
dist = 1,
}
table.insert( ValidPositions, data )
end
local LocalDesiredExitPosition = Vehicle:WorldToLocal( Pod:GetPos() )
if vel:Length() > (Pod.PlaceBehindVelocity or 100) then
LocalDesiredExitPosition.y = LocalDesiredExitPosition.y - radius
local traceBehind = util.TraceLine( {
start = pos,
endpos = pos - vel:GetNormalized() * (radius + 50),
filter = Filter,
} )
local tracePlayer = util.TraceHull( {
start = traceBehind.HitPos + Vector(0,0,maxs.z + zOffset),
endpos = traceBehind.HitPos + Vector(0,0,zOffset),
maxs = Vector( maxs.x, maxs.y, 0 ),
mins = Vector( mins.x, mins.y, 0 ),
filter = FilterPlayer,
} )
if not tracePlayer.Hit and util.IsInWorld( tracePlayer.HitPos ) then
local data = {
pos = traceBehind.HitPos,
dist = 0,
}
table.insert( ValidPositions, data )
end
end
local DesiredExitPosition = Pod:LocalToWorld( LocalDesiredExitPosition )
for ang = 0, 360, 15 do
local X = math.cos( math.rad( ang ) ) * radius
local Y = math.sin( math.rad( ang ) ) * radius
local Z = Pod:OBBCenter().z
local EndPos = StartPos + Vector(X,Y,Z)
local traceWall = util.TraceLine( {start = StartPos,endpos = EndPos,filter = Filter} )
local traceVehicle = util.TraceLine( {
start = traceWall.HitPos,
endpos = StartPos,
filter = FilterPlayer,
} )
local CenterWallVehicle = (traceWall.HitPos + traceVehicle.HitPos) * 0.5
if traceWall.Hit or not util.IsInWorld( CenterWallVehicle ) then continue end
local GoundPos = CenterWallVehicle - Vector(0,0,radius)
local traceGround = util.TraceLine( {start = CenterWallVehicle,endpos = GoundPos,filter = Filter} )
if not traceGround.Hit or not util.IsInWorld( traceGround.HitPos ) then continue end
local tracePlayerRoof = util.TraceHull( {
start = traceGround.HitPos + Vector(0,0,zOffset),
endpos = traceGround.HitPos + Vector(0,0,maxs.z + zOffset),
maxs = Vector( maxs.x, maxs.y, 0 ),
mins = Vector( mins.x, mins.y, 0 ),
filter = FilterPlayer,
} )
if tracePlayerRoof.Hit or not util.IsInWorld( tracePlayerRoof.HitPos ) then continue end
local tracePlayer = util.TraceHull( {
start = traceGround.HitPos + Vector(0,0,maxs.z + zOffset),
endpos = traceGround.HitPos + Vector(0,0,zOffset),
maxs = Vector( maxs.x, maxs.y, 0 ),
mins = Vector( mins.x, mins.y, 0 ),
filter = FilterPlayer,
} )
if tracePlayer.Hit then continue end
local traceBack = util.TraceLine( {
start = tracePlayer.HitPos + Vector(0,0,zOffset),
endpos = StartPos,
filter = FilterPlayer,
} )
local data = {
pos = tracePlayer.HitPos,
dist = (traceBack.HitPos - DesiredExitPosition):Length(),
}
table.insert( ValidPositions, data )
end
local ExitPos
local ExitDist
for _, data in pairs( ValidPositions ) do
if not ExitPos or not ExitDist or ExitDist > data.dist then
ExitPos = data.pos
ExitDist = data.dist
end
end
-- all my plans failed, lets just let source do its thing
if not ExitPos then return end
local ViewAngles = (StartPos - ExitPos):Angle()
ViewAngles.p = 0
ViewAngles.r = 0
ply:SetPos( ExitPos )
ply:SetEyeAngles( ViewAngles )
end
end )