114 lines
3.5 KiB
Lua
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
|