Files
VnUtest/garrysmod/lua/autorun/server/sv_lvs_missile_fix.lua
2026-03-31 10:27:04 +03:00

66 lines
2.8 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Фикс краша IVP от lvs_missile вылетающих за пределы карты
-- IVP Failed at ivu_vhash.cxx 157 — физдвижок падает когда ракета улетает за map boundary
-- Решение: отслеживаем lvs_missile и удаляем их до краша при выходе за пределы
if not SERVER then return end
-- Получаем границы карты при старте
local mapMin, mapMax
hook.Add("InitPostEntity", "MRP_LVSMissileSafetyInit", function()
local wMin, wMax = game.GetWorld():GetModelBounds()
-- Fallback for weird maps
if not wMin or wMin == vector_origin then
wMin = Vector(-16384, -16384, -16384)
wMax = Vector(16383, 16383, 16383)
end
-- margin 1000 instead of 2000 to be safer on small maps
local margin = Vector(1000, 1000, 1000)
mapMin = wMin + margin
mapMax = wMax - margin
print("[MRP] LVS Missile Safety initialized. Bounds: " .. tostring(mapMin) .. " -> " .. tostring(mapMax))
end)
-- Таймер мониторинга, не хук Think (чтобы не перегружать каждый тик)
timer.Create("MRP_LVSMissileWatchdog", 0.1, 0, function()
if not mapMin then return end
for _, ent in ipairs(ents.FindByClass("lvs_missile")) do
if not IsValid(ent) then continue end
-- ЗАЩИТА 1: Не удаляем ракеты которые еще не инициализированы через Enable()
if not ent.IsEnabled or not ent.SpawnTime then
continue
end
local pos = ent:GetPos()
local age = CurTime() - ent.SpawnTime
-- ЗАЩИТА 2: Не удаляем ракеты моложе 1 сек (время на полную инициализацию)
if age < 1 then
continue
end
-- Проверка 1: вышла за границы карты
local outOfBounds = pos.x < mapMin.x or pos.x > mapMax.x
or pos.y < mapMin.y or pos.y > mapMax.y
or pos.z < mapMin.z or pos.z > mapMax.z
-- Проверка 2: координаты явно безумные (> 15000 = за пределами любой карты GMod)
local crazyOrigin = pos:Length() > 15000
if outOfBounds or crazyOrigin then
-- Безопасное удаление через SafeRemoveEntityDelayed
-- НЕ вызываем Detonate() — это создаст взрыв в рандомной точке
if ent.IsDetonated then continue end
ent.IsDetonated = true
print("[Debug] Watchdog: Removing OOB missile age=" .. string.format("%.2f", age) .. "s at " .. tostring(pos))
SafeRemoveEntityDelayed(ent, 0)
end
end
end)