Files
VnUtest/garrysmod/addons/lvs_base/lua/lvs_framework/init.lua
2026-03-31 10:27:04 +03:00

241 lines
5.7 KiB
Lua

local StartTime = SysTime()
if SERVER then
AddCSLuaFile("includes/circles/circles.lua")
end
local function FileIsEmpty( filename )
if file.Size( filename, "LUA" ) <= 1 then -- this is suspicous
local data = file.Read( filename, "LUA" )
if data and string.len( data ) <= 1 then -- confirm its empty
print("[LVS] - refusing to load '"..filename.."'! File is Empty!" )
return true
end
end
return false
end
for _, filename in pairs( file.Find("lvs_framework/autorun/*.lua", "LUA") ) do
if FileIsEmpty( "lvs_framework/autorun/"..filename ) then continue end
if string.StartWith( filename, "sv_") then -- sv_ prefix only load serverside
if SERVER then
include("lvs_framework/autorun/"..filename)
end
continue
end
if string.StartWith( filename, "cl_") then -- cl_ prefix only load clientside
if SERVER then
AddCSLuaFile("lvs_framework/autorun/"..filename)
else
include("lvs_framework/autorun/"..filename)
end
continue
end
-- everything else is shared
if SERVER then
AddCSLuaFile("lvs_framework/autorun/"..filename)
end
include("lvs_framework/autorun/"..filename)
end
hook.Run( "LVS:Initialize" )
print("[LVS] - initialized ["..math.Round((SysTime() - StartTime) * 1000,2).."ms]")
if CLIENT then
hook.Add( "InitPostEntity", "!!!lvscheckupdates", function()
timer.Simple(20, function()
LVS.CheckUpdates()
local convar = GetConVar( "no_error_hitboxes" )
if not convar then return end
convar:SetBool( false )
end)
end )
return
end
resource.AddWorkshop("2912816023")
local ValveWierdBlastDamageClass = {
["npc_strider"] = true, -- takes 70 damage for each blast damage as constant value ...
["npc_combinegunship"] = true, -- takes 44 damage as constant value ...
["func_breakable_surf"] = true, -- this entity dont care about anything that isnt a trace attack or blast damage
}
function LVS:BlastDamage( pos, forward, attacker, inflictor, damage, damagetype, radius, force )
local dmginfo = DamageInfo()
dmginfo:SetAttacker( attacker )
dmginfo:SetInflictor( inflictor )
dmginfo:SetDamage( damage )
dmginfo:SetDamageType( damagetype == DMG_BLAST and DMG_SONIC or damagetype )
if damagetype ~= DMG_BLAST then
dmginfo:SetDamagePosition( pos )
dmginfo:SetDamageForce( forward * force )
util.BlastDamageInfo( dmginfo, pos, radius )
return
end
util.BlastDamageInfo( dmginfo, pos, radius )
local FragmentAngle = 10
local NumFragments = 16
local NumFragmentsMissed = 0
local RegisteredHits = {}
local trace = util.TraceLine( {
start = pos,
endpos = pos - forward * radius,
filter = { attacker, inflictor },
} )
local startpos = trace.HitPos
for i = 1, NumFragments do
local ang = forward:Angle() + Angle( math.random(-FragmentAngle,FragmentAngle), math.random(-FragmentAngle,FragmentAngle), 0 )
local dir = ang:Forward()
local endpos = pos + dir * radius
local trace = util.TraceLine( {
start = startpos,
endpos = endpos,
filter = { attacker, inflictor },
} )
debugoverlay.Line( startpos, trace.HitPos, 10, Color( 255, 0, 0, 255 ), true )
if not trace.Hit then
NumFragmentsMissed = NumFragmentsMissed + 1
continue
end
if not IsValid( trace.Entity ) then continue end
if not RegisteredHits[ trace.Entity ] then
RegisteredHits[ trace.Entity ] = {}
end
table.insert( RegisteredHits[ trace.Entity ], {
origin = trace.HitPos,
force = forward * force,
} )
end
local Hull = Vector(10,10,10)
for _, ent in ipairs( ents.FindInSphere( pos, radius ) ) do
if not ent.LVS or ent == inflictor or ent == attacker then continue end
local trace = util.TraceHull( {
start = pos,
endpos = ent:LocalToWorld( ent:OBBCenter() ),
mins = -Hull,
maxs = Hull,
whitelist = true,
ignoreworld = true,
filter = ent,
} )
debugoverlay.Line( pos, trace.HitPos, 10, Color( 255, 0, 0, 255 ), true )
NumFragments = NumFragments + 1
if not RegisteredHits[ ent ] then
RegisteredHits[ ent ] = {}
end
table.insert( RegisteredHits[ ent ], {
origin = trace.HitPos,
force = forward * force,
} )
end
if NumFragmentsMissed == NumFragments then return end
local DamageBoost = NumFragments / ( NumFragments - NumFragmentsMissed )
for ent, data in pairs( RegisteredHits ) do
local NumHits = #data
local AverageOrigin = vector_origin
local AverageForce = vector_origin
for _, HitData in pairs( data ) do
AverageOrigin = AverageOrigin + HitData.origin
AverageForce = AverageForce + HitData.force
end
AverageOrigin = AverageOrigin / NumHits
AverageForce = AverageForce / NumHits
local TotalDamage = ( ( NumHits * DamageBoost ) / NumFragments ) * damage
--debugoverlay.Cross( AverageOrigin, 50, 10, Color( 255, 0, 255 ) )
-- hack
if ValveWierdBlastDamageClass[ ent:GetClass() ] then
util.BlastDamage( inflictor, attacker, pos, radius, damage )
continue
end
local dmginfo = DamageInfo()
dmginfo:SetAttacker( attacker )
dmginfo:SetInflictor( inflictor )
dmginfo:SetDamage( TotalDamage )
dmginfo:SetDamageForce( AverageForce )
dmginfo:SetDamagePosition( AverageOrigin )
dmginfo:SetDamageType( DMG_BLAST )
ent:TakeDamageInfo( dmginfo )
end
end
function LVS:FixVelocity()
local tbl = physenv.GetPerformanceSettings()
if tbl.MaxVelocity < 4000 then
local OldVel = tbl.MaxVelocity
tbl.MaxVelocity = 4000
physenv.SetPerformanceSettings(tbl)
print("[LVS] Low MaxVelocity detected! Increasing! "..OldVel.." => 4000")
end
if tbl.MaxAngularVelocity < 7272 then
local OldAngVel = tbl.MaxAngularVelocity
tbl.MaxAngularVelocity = 7272
physenv.SetPerformanceSettings(tbl)
print("[LVS] Low MaxAngularVelocity detected! Increasing! "..OldAngVel.." => 7272")
end
end
hook.Add( "InitPostEntity", "!!!lvscheckupdates", function()
timer.Simple(20, function()
LVS.CheckUpdates()
end)
end )