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