Files
2026-03-31 10:27:04 +03:00

114 lines
3.5 KiB
Lua

local PLUGIN = PLUGIN
-- Конфигурационные переменные
ix.config.Add("dynamicHeightEnabled", true, "Включить динамическую высоту камеры.", nil, {
category = "Динамическая высота"
})
ix.config.Add("dynamicHeightMaxManual", false, "Использовать ручную максимальную высоту.", nil, {
category = "Динамическая высота"
})
ix.config.Add("dynamicHeightMinManual", false, "Использовать ручную минимальную высоту.", nil, {
category = "Динамическая высота"
})
ix.config.Add("dynamicHeightMin", 16, "Минимальная высота камеры (присед).", nil, {
data = {min = 5, max = 180},
category = "Динамическая высота"
})
ix.config.Add("dynamicHeightMax", 64, "Максимальная высота камеры (стоя).", nil, {
data = {min = 5, max = 180},
category = "Динамическая высота"
})
local function UpdateView(ply)
if not ix.config.Get("dynamicHeightEnabled", true) then
if ply.ixDynamicHeightChanged then
ply:SetViewOffset(Vector(0, 0, 64))
ply:SetViewOffsetDucked(Vector(0, 0, 28))
ply.ixDynamicHeightChanged = nil
end
return
end
-- Определяем высоту модели
local height_max = 64
local height_min = 16
-- Создаем временную сущность для измерения высоты стоя
local entity = ents.Create("base_anim")
entity:SetModel(ply:GetModel())
entity:ResetSequence(entity:LookupSequence("idle_all_01"))
local bone = entity:LookupBone("ValveBiped.Bip01_Neck1")
if bone then
height_max = entity:GetBonePosition(bone).z + 5
end
-- Создаем временную сущность для измерения высоты приседа
local entity2 = ents.Create("base_anim")
entity2:SetModel(ply:GetModel())
entity2:ResetSequence(entity2:LookupSequence("cidle_all"))
local bone2 = entity2:LookupBone("ValveBiped.Bip01_Neck1")
if bone2 then
height_min = entity2:GetBonePosition(bone2).z + 5
end
-- Удаляем временные сущности
entity:Remove()
entity2:Remove()
-- Применяем настройки высоты
local min = ix.config.Get("dynamicHeightMin", 16)
local max = ix.config.Get("dynamicHeightMax", 64)
if ix.config.Get("dynamicHeightMinManual", false) then
ply:SetViewOffsetDucked(Vector(0, 0, min))
else
ply:SetViewOffsetDucked(Vector(0, 0, height_min))
end
if ix.config.Get("dynamicHeightMaxManual", false) then
ply:SetViewOffset(Vector(0, 0, max))
else
ply:SetViewOffset(Vector(0, 0, height_max))
end
ply.ixDynamicHeightChanged = true
end
local function UpdateTrueModel(ply)
if ply:GetNWString("ixDynamicHeight:TrueModel") ~= ply:GetModel() then
ply:SetNWString("ixDynamicHeight:TrueModel", ply:GetModel())
UpdateView(ply)
end
end
function PLUGIN:PlayerSpawn(ply)
UpdateTrueModel(ply)
end
function PLUGIN:PlayerTick(ply)
UpdateTrueModel(ply)
end
-- Обновление при изменении конфигов
local function OnConfigChanged(key, oldValue, newValue)
if string.StartWith(key, "dynamicHeight") then
for _, ply in pairs(player.GetAll()) do
UpdateView(ply)
end
end
end
function PLUGIN:OnConfigChanged(key, oldValue, newValue)
if key == "dynamicHeightEnabled" or
key == "dynamicHeightMin" or
key == "dynamicHeightMax" or
key == "dynamicHeightMinManual" or
key == "dynamicHeightMaxManual" then
OnConfigChanged(key, oldValue, newValue)
end
end