ENT.Base = "base_gmodentity"
ENT.Type = "anim"
ENT.PrintName = "Grenade Drone"
ENT.Spawnable = true
ENT.AutomaticFrameAdvance = true

ENT.BatteryCount = 300
ENT.HealthCount = 10
ENT.GrenadeCount = 3

if CLIENT then
    local droneRT = nil
    local droneRTMat = nil

    function GetDroneRT()
        if not droneRT then
            droneRT = GetRenderTarget("mur_drone_grenade_rt", ScrW(), ScrH(), false)
            droneRTMat = CreateMaterial("mur_drone_grenade_rt_mat", "UnlitGeneric", {
                ["$basetexture"] = droneRT:GetName(),
                ["$ignorez"] = 1,
                ["$vertexcolor"] = 1,
                ["$vertexalpha"] = 1
            })
        end
        return droneRT
    end

    local GrenadeNotifyEnd = 0
    local GrenadeNotifyMat = Material("posvetka/nizhniya_posvedka.png")

    net.Receive("MuR_GrenadeDropped", function()
        GrenadeNotifyEnd = CurTime() + 1.5 -- показывать 1.5 секунды
    end)

    local function DrawSignalNoise(strength)
        if strength > 1 then return end

        local sw, sh = ScrW(), ScrH()
        local noise = (1 - strength) * 200
        local lines = (1 - strength) * 40

        for i = 1, noise do
            surface.SetDrawColor(255, 255, 255, math.random(10, 40))
            surface.DrawRect(
                math.random(0, sw),
                math.random(0, sh),
                math.random(1, 3),
                math.random(1, 3)
            )
        end

        for i = 1, lines do
            local y = math.random(0, sh)
            surface.SetDrawColor(255, 255, 255, math.random(10, 40))
            surface.DrawRect(0, y, sw, math.random(1, 3))
        end

        if strength < 0.3 then
            local shake = (0.3 - strength) * 4
            surface.SetDrawColor(255, 255, 255, 20)
            surface.DrawRect(
                math.random(-shake, shake),
                math.random(-shake, shake),
                sw,
                sh
            )
        end
    end

    hook.Add("HUDPaint", "MuR_GrenadeDropImage", function()
        if GrenadeNotifyEnd <= CurTime() then return end

        local sw, sh = ScrW(), ScrH()
        local w, h = 282, 152  -- размер картинки

        local timeLeft = GrenadeNotifyEnd - CurTime()
        local alpha = math.Clamp(timeLeft * 255, 0, 255)

        surface.SetMaterial(GrenadeNotifyMat)
        surface.SetDrawColor(255, 255, 255, alpha)
        surface.DrawTexturedRect(sw/2 - w/2, sh/2 - h/2, w, h)
    end)

    function DrawScanlines(sw, sh, spacing)
        spacing = spacing or 3
        surface.SetDrawColor(0, 0, 0, 40)
        for y = 0, sh, spacing do
            surface.DrawLine(0, y, sw, y)
        end
    end

    function DrawGlitchNoise(sw, sh, strength)
        strength = strength or 1
        local count = math.floor(80 * strength)
        for i = 1, count do
            local x = math.random(0, sw)
            local y = math.random(0, sh)
            local w = math.random(1, 4)
            local h = math.random(1, 4)
            local c = math.random(80, 140)
            surface.SetDrawColor(c, c, c, 80)
            surface.DrawRect(x, y, w, h)
        end
    end

    function DrawCornerBrackets(x, y, w, h, len, thick, col)
        col = col or color_white
        thick = thick or 2
        len = len or 20
        surface.SetDrawColor(col)

        surface.DrawRect(x, y, len, thick)
        surface.DrawRect(x, y, thick, len)
        surface.DrawRect(x + w - len, y, len, thick)
        surface.DrawRect(x + w - thick, y, thick, len)
        surface.DrawRect(x, y + h - thick, len, thick)
        surface.DrawRect(x, y + h - len, thick, len)
        surface.DrawRect(x + w - len, y + h - thick, len, thick)
        surface.DrawRect(x + w - thick, y + h - len, thick, len)
    end

    function DrawCrosshair(cx, cy, size, gap, thick, col)
        col = col or color_white
        size = size or 20
        gap = gap or 4
        thick = thick or 2
        surface.SetDrawColor(col)

        surface.DrawRect(cx - size, cy - thick / 2, size - gap, thick)
        surface.DrawRect(cx + gap, cy - thick / 2, size - gap, thick)
        surface.DrawRect(cx - thick / 2, cy - size, thick, size - gap)
        surface.DrawRect(cx - thick / 2, cy + gap, thick, size - gap)
    end

    function DrawArcSegment(cx, cy, radius, startAng, endAng, thick, steps, col)
        col = col or color_white
        thick = thick or 2
        steps = steps or 32
        surface.SetDrawColor(col)

        local step = (endAng - startAng) / steps
        for i = 0, steps - 1 do
            local a1 = math.rad(startAng + step * i)
            local a2 = math.rad(startAng + step * (i + 1))
            local x1, y1 = cx + math.cos(a1) * radius, cy + math.sin(a1) * radius
            local x2, y2 = cx + math.cos(a2) * radius, cy + math.sin(a2) * radius
            surface.DrawLine(x1, y1, x2, y2)
        end
    end

    local DRONE = nil
    local Thermal = false
    local ThermalKeyHeld = false
    local Zoom = 1

    local DefMats = {}
    local DefClrs = {}
    local DoXRay = false

    local FLIR = {
        ["$pp_colour_addr"]       = -.3,
        ["$pp_colour_addg"]       = -.4,
        ["$pp_colour_addb"]       = -.4,
        ["$pp_colour_brightness"] = .1,
        ["$pp_colour_contrast"]   = 1,          -- да-да, мой флир, биба
        ["$pp_colour_colour"]     = 0,
        ["$pp_colour_mulr"]       = 0,
        ["$pp_colour_mulg"]       = 0,
        ["$pp_colour_mulb"]       = 0,
    }

    net.Receive("MuR_DroneCam_Grenade", function()
        local ent = net.ReadEntity()
        DRONE = ent
        Thermal = false
        Zoom = 1

        local pulseAlpha = 0
        local pulseDir = 1
        local lastBattBeep = 0
        local lastDmgBeep = 0
        local startTime = CurTime()
        local smoothBatt = 1
        local smoothHP = 1
        local ppTab = {
            ["$pp_colour_addr"] = 0.05,
            ["$pp_colour_addg"] = 0.02,
            ["$pp_colour_addb"] = 0,
            ["$pp_colour_brightness"] = -0.03,
            ["$pp_colour_contrast"] = 1.15,
            ["$pp_colour_colour"] = 0.5,
            ["$pp_colour_mulr"] = 0.05,
            ["$pp_colour_mulg"] = 0.05,
            ["$pp_colour_mulb"] = 0
        }

        hook.Add("RenderScreenspaceEffects", "DroneCam", function()
            if not IsValid(ent) then return end

            local rt = GetDroneRT()
            render.CopyRenderTargetToTexture(rt)

            local timeLeft = math.max(ent:GetNW2Float('RemoveTime') - CurTime(), 0)
            local battFrac = math.Clamp(timeLeft / ent.BatteryCount, 0, 1)

            if battFrac < 0.2 then
                ppTab["$pp_colour_addr"] = 0.1 * (1 - battFrac / 0.2)
                ppTab["$pp_colour_contrast"] = 1.15 + 0.2 * (1 - battFrac / 0.2)
            else
                ppTab["$pp_colour_addr"] = 0.05
                ppTab["$pp_colour_contrast"] = 1.15
            end

            DrawColorModify(ppTab)
            DrawSharpen(0.8, 0.8)
        end)

        hook.Add("HUDPaint", "DroneCam", function()
            if not IsValid(ent) then return end
            local sw, sh = ScrW(), ScrH()
            local cx, cy = sw / 2, sh / 2
            local time = CurTime()
            local elapsed = time - startTime

            pulseAlpha = pulseAlpha + pulseDir * FrameTime() * 400
            if pulseAlpha >= 255 then pulseDir = -1 pulseAlpha = 255
            elseif pulseAlpha <= 100 then pulseDir = 1 pulseAlpha = 100 end

            local timeLeft = math.max(ent:GetNW2Float('RemoveTime') - CurTime(), 0)
            local battFrac = math.Clamp(timeLeft / ent.BatteryCount, 0, 1)
            local hpFrac = math.Clamp(ent:Health() / ent.HealthCount, 0, 1)

            smoothBatt = Lerp(FrameTime() * 3, smoothBatt, battFrac)
            smoothHP = Lerp(FrameTime() * 5, smoothHP, hpFrac)

            local vel = ent:GetVelocity():Length()
            local spd = math.Round(vel * 0.068)
            local tr = util.TraceLine({start = ent:GetPos(), endpos = ent:GetPos() - Vector(0, 0, 10000), filter = ent})
            local agl = math.Round(ent:GetPos().z - tr.HitPos.z)
            local dist2 = LocalPlayer():GetPos():DistToSqr(ent:GetPos())
            local signal = math.Clamp(1 - (dist2 / (10000 * 10000)), 0, 1)
            local canDisarm = dist2 < 50000
            local killTime = ent:GetNWFloat("EmergencyCountdown", 0)

            DrawScanlines(sw, sh, 32)
            DrawGlitchNoise(sw, sh, signal)

            local frameCol = Color(255, 150, 40, 120)
            DrawCornerBrackets(40, 40, sw - 80, sh - 80, 60, 3, frameCol)

            local crossCol = Color(255, 150, 40, pulseAlpha)
            DrawCrosshair(cx, cy, 25, 8, 2, crossCol)

            surface.SetDrawColor(255, 50, 50, 100)
            DrawArcSegment(cx, cy, 60, 0, 360, 2, 64, Color(255, 50, 50, 50))
            if tr.Hit then
                local screenData = tr.HitPos:ToScreen()
                if screenData.visible then
                    surface.SetDrawColor(255, 0, 0, 200)
                    surface.DrawRect(screenData.x - 2, screenData.y - 2, 4, 4)
                    draw.SimpleText("⚠ МЕСТО ПАДЕНИЯ", "MuR_Font1", screenData.x, screenData.y - 15, Color(255, 50, 50, 200), TEXT_ALIGN_CENTER)
                end
            end

            local targetDist = tr.HitPos:Distance(ent:GetPos())
            if targetDist < 500 then
                local lockCol = Color(255, 80, 60, pulseAlpha)
                DrawCrosshair(cx, cy, 35, 5, 3, lockCol)
                draw.SimpleText(string.format("%.1fm", targetDist * 0.0254), "MuR_Font2", cx, cy + 50, lockCol, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP)
            end

            draw.SimpleText("◈ ДРОН СО СБРОСОМ", "MuR_Font3", 80, 60, Color(255, 150, 40, 255), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP)
            draw.SimpleText(string.format("ВРЕМЯ РАБОТЫ %.1fs", elapsed), "MuR_Font1", 80, 95, Color(150, 150, 150, 200), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP)
            draw.SimpleText(os.date("%H:%M:%S"), "MuR_Font1", 80, 115, Color(150, 150, 150, 200), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP)

            local grenadesLeft = ent:GetNW2Int("Grenades", 3)
            draw.SimpleText(string.format("БОЕКОМПЛЕКТ: %d/3", grenadesLeft), "MuR_Font3", 80, 140, grenadesLeft > 0 and Color(255, 50, 50) or Color(100, 100, 100), TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP)

            local telemX = sw - 80
            local spdCol = spd > 60 and Color(255, 200, 60) or Color(255, 150, 40)
            draw.SimpleText(string.format("%03d km/h", spd), "MuR_Font3", telemX, 60, spdCol, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP)
            draw.SimpleText("СКОР", "MuR_Font1", telemX, 95, Color(100, 100, 100), TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP)

            draw.SimpleText(string.format("%04d m", agl), "MuR_Font3", telemX, 120, Color(255, 150, 40), TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP)
            draw.SimpleText("ВЫС", "MuR_Font1", telemX, 155, Color(100, 100, 100), TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP)

            local sigCol = signal < 0.25 and Color(255, 60, 60) or (signal < 0.5 and Color(255, 200, 60) or Color(255, 150, 40))
            local sigBars = math.floor(signal * 5)
            local sigStr = string.rep("▮", sigBars) .. string.rep("▯", 5 - sigBars)
            draw.SimpleText(sigStr, "MuR_Font2", telemX, 180, sigCol, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP)
            draw.SimpleText(string.format("%d%%", math.Round(signal * 100)), "MuR_Font1", telemX, 210, sigCol, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP)

            local barW, barH = 250, 12
            local barX, barY = 80, sh - 180

            local battCol = smoothBatt < 0.2 and Color(255, 60, 60) or (smoothBatt < 0.4 and Color(255, 200, 60) or Color(255, 150, 40))
            surface.SetDrawColor(30, 30, 30, 200)
            surface.DrawRect(barX, barY, barW, barH)
            surface.SetDrawColor(battCol.r, battCol.g, battCol.b, 255)
            surface.DrawRect(barX + 2, barY + 2, (barW - 4) * smoothBatt, barH - 4)
            surface.SetDrawColor(battCol.r, battCol.g, battCol.b, 100)
            surface.DrawOutlinedRect(barX, barY, barW, barH, 1)
            draw.SimpleText(string.format("ЗАРЯД %d%%", math.Round(smoothBatt * 100)), "MuR_Font1", barX, barY - 20, battCol, TEXT_ALIGN_LEFT, TEXT_ALIGN_BOTTOM)
            draw.SimpleText(string.format("%.0fs", timeLeft), "MuR_Font1", barX + barW, barY - 20, Color(150, 150, 150), TEXT_ALIGN_RIGHT, TEXT_ALIGN_BOTTOM)

            barY = sh - 130
            local hpCol = smoothHP < 0.3 and Color(255, 60, 60) or (smoothHP < 0.6 and Color(255, 200, 60) or Color(255, 150, 40))
            surface.SetDrawColor(30, 30, 30, 200)
            surface.DrawRect(barX, barY, barW, barH)
            surface.SetDrawColor(hpCol.r, hpCol.g, hpCol.b, 255)
            surface.DrawRect(barX + 2, barY + 2, (barW - 4) * smoothHP, barH - 4)
            surface.SetDrawColor(hpCol.r, hpCol.g, hpCol.b, 100)
            surface.DrawOutlinedRect(barX, barY, barW, barH, 1)
            draw.SimpleText(string.format("ПРОЧНОСТЬ %d%%", math.Round(smoothHP * 100)), "MuR_Font1", barX, barY - 20, hpCol, TEXT_ALIGN_LEFT, TEXT_ALIGN_BOTTOM)

            local ctrlX, ctrlY = sw - 80, sh - 200
            local ctrlCol = Color(150, 150, 150, 200)
            draw.SimpleText("▶ [J] САМОУНИЧТОЖЕНИЕ", "MuR_Font1", ctrlX, ctrlY, Color(255, 80, 80, 200), TEXT_ALIGN_RIGHT)
            draw.SimpleText("▶ [ALT] ТЕПЛОВИЗОР", "MuR_Font1", ctrlX, ctrlY + 22, ctrlCol, TEXT_ALIGN_RIGHT)
            draw.SimpleText("▼ [ПКМ] СБРОСИТЬ ГРАНАТУ", "MuR_Font1", ctrlX, ctrlY + 44, Color(255, 80, 60, 200), TEXT_ALIGN_RIGHT)
            draw.SimpleText("▲ [SHIFT] ВВЕРХ", "MuR_Font1", ctrlX, ctrlY + 66, ctrlCol, TEXT_ALIGN_RIGHT)
            draw.SimpleText("▼ [CTRL] ВНИЗ", "MuR_Font1", ctrlX, ctrlY + 88, ctrlCol, TEXT_ALIGN_RIGHT)

            local rY = ctrlY + 110 
            if canDisarm then 
                draw.SimpleText("◉ [R] ВЕРНУТЬ ДРОН", "MuR_Font1", ctrlX, rY, Color(40, 255, 120, 200), TEXT_ALIGN_RIGHT) 
            else 
                draw.SimpleText("✖ СЛИШКОМ ДАЛЕКО", "MuR_Font1", ctrlX, rY, Color(255, 100, 60, 200), TEXT_ALIGN_RIGHT) 
            end

            if ent:GetNW2Bool('Boost') then
                local boostFlash = math.sin(time * 15) > 0 and 255 or 180
                draw.SimpleText("◀◀ УСКОРЕНИЕ ▶▶", "MuR_Font2", cx, sh - 100, Color(255, 200, 60, boostFlash), TEXT_ALIGN_CENTER)
            end

            if smoothBatt < 0.15 then
                local warnFlash = math.sin(time * 8) > 0 and 255 or 100
                draw.SimpleText("⚠ НИЗКИЙ ЗАРЯД ⚠", "MuR_Font4", cx, 80, Color(255, 60, 60, warnFlash), TEXT_ALIGN_CENTER)
                if time > lastBattBeep then
                    surface.PlaySound("buttons/button17.wav")
                    lastBattBeep = time + 0.8
                end
            end

            if smoothHP < 0.25 then
                local dmgFlash = math.sin(time * 6) > 0 and 255 or 100
                draw.SimpleText("⚠ КРИТИЧЕСКИЕ ПОВРЕЖДЕНИЯ ⚠", "MuR_Font3", cx, 130, Color(255, 120, 60, dmgFlash), TEXT_ALIGN_CENTER)
                if time > lastDmgBeep then
                    surface.PlaySound("buttons/button10.wav")
                    lastDmgBeep = time + 1.5
                end
            end

            if signal < 0.2 then
                local sigFlash = math.sin(time * 10) > 0 and 255 or 100
                draw.SimpleText("◢◤ СЛАБЫЙ СИГНАЛ ◢◤", "MuR_Font3", cx, 180, Color(255, 80, 60, sigFlash), TEXT_ALIGN_CENTER)
            end
            DrawSignalNoise(signal)
            if ent:GetNWBool("Jammed") then
                local jamStrength = ent:GetNWFloat("JamStrength", 1)

                DrawHeavySignalNoise(jamStrength)

                local jamFlash = math.sin(time * 8) > 0 and 255 or 120
                draw.SimpleText(
                    "◢◤ ОБНАРУЖЕНЫ ПОМЕХИ ◢◤",
                    "MuR_Font3",
                    cx,
                    220,
                    Color(255, 80, 60, jamFlash),
                    TEXT_ALIGN_CENTER
                )
            end
            
            if killTime > CurTime() then
                local left = math.max(0, killTime - CurTime())
                local flash = math.sin(CurTime() * 10) > 0 and 255 or 120

                draw.SimpleText(
                    string.format("САМОУНИЧТОЖЕНИЕ: %.1f", left),
                    "MuR_Font3",
                    cx,
                    260,
                    Color(255, 50, 50, flash),
                    TEXT_ALIGN_CENTER
                )
            end
        end)

        hook.Add("CreateMove", "DroneCam", function(cmd)
            cmd:SetForwardMove(0)
            cmd:SetSideMove(0)
            cmd:RemoveKey(IN_JUMP)
            cmd:RemoveKey(IN_USE)
        end)

        hook.Add("CalcView", "DroneCam", function(ply, pos, angles, fov)
            if not IsValid(ent) then
                hook.Remove("CalcView", "DroneCam")
                hook.Remove("CreateMove", "DroneCam")
                hook.Remove("RenderScreenspaceEffects", "DroneCam")
                hook.Remove("HUDPaint", "DroneCam")
                return
            end

            local dPos = ent:GetPos()
            local dAng = ent:GetAngles()
            local vel  = ent:GetVelocity():Length()

            local offset = Vector(-8 - math.Clamp(vel * 0.015, 0, 5), 0, -2)
            local camPos = dPos + ent:GetForward() * offset.x + ent:GetUp() * offset.z

            local camAng = Angle(dAng.p, dAng.y, dAng.r)
            camAng.p = ply:EyeAngles().p

            local dynFov = 40 + math.Clamp(vel * 0.025, 0, 15)
            dynFov = Lerp(Zoom, 20, dynFov)

            return {
                origin = camPos,
                angles = camAng,
                fov    = math.Clamp(dynFov, 20, 120),
                drawviewer = true
            }
        end)
    end)

    hook.Add("Think", "mur_drone_ThermalToggle", function()
        if not IsValid(DRONE) then return end
        if DRONE:GetClass() ~= "mur_drone_grenade" then return end

        if input.IsKeyDown(KEY_LALT) and not ThermalKeyHeld then
            ThermalKeyHeld = true
            Thermal = not Thermal

            surface.PlaySound(Thermal and "sw/misc/nv_on.wav" or "sw/misc/nv_off.wav")
            net.Start("MuR_ThermalState")
            net.WriteBool(Thermal)
            net.SendToServer()
        end

        if not input.IsKeyDown(KEY_LALT) then
            ThermalKeyHeld = false
        end
    end)

    local function ApplyXRay()
        for _, v in ipairs(ents.GetAll()) do
            if not v:GetModel() then continue end
            if string.sub(v:GetModel(), -3) ~= "mdl" then continue end

            if v:IsPlayer() then
            elseif v:IsNPC() then
            elseif v.LVS or v.LFS then
            else
                continue 
            end

            local col = v:GetColor()
            if col.a <= 0 then continue end

            if not DefClrs[v] then
                DefClrs[v] = Color(col.r, col.g, col.b, col.a)
            end

            local entmat = v:GetMaterial()
            if not DefMats[v] then
                DefMats[v] = entmat
            end

            v:SetColor(Color(255,255,255,255))
            v:SetMaterial("xray/living")
        end
    end


    hook.Add("RenderScene", "mur_drone_FLIR_Apply", function()
        if not Thermal then return end
        if not IsValid(DRONE) then return end
        if DRONE:GetClass() ~= "mur_drone_grenade" then return end

        if not DoXRay then
            DoXRay = true
            ApplyXRay()
        end
    end)

    local function RenderFLIR()
        DrawColorModify(FLIR)
        DrawBloom(0,1,1,1,0,0,0,0,0)
        DrawMotionBlur(FrameTime() * 50, 0.5, 0.05)
        DrawBokehDOF(0.15, 1, 12)
    end

    hook.Add("HUDPaintBackground", "mur_drone_FLIR_Effects", function()
        if not Thermal then return end
        if not IsValid(DRONE) then return end
        if DRONE:GetClass() ~= "mur_drone_grenade" then return end

        RenderFLIR()
    end)

    hook.Add("Think", "mur_drone_FLIR_AutoOff", function()
        if Thermal and not IsValid(DRONE) then
            Thermal = false
        end

        if not Thermal and DoXRay then
            DoXRay = false

            for ent, mat in pairs(DefMats) do
                if IsValid(ent) then ent:SetMaterial(mat) end
            end
            for ent, clr in pairs(DefClrs) do
                if IsValid(ent) then
                    ent:SetRenderMode(RENDERMODE_TRANSALPHA)
                    ent:SetColor(Color(clr.r, clr.g, clr.b, clr.a))
                end
            end

            DefMats = {}
            DefClrs = {}
        end
    end)

    hook.Add("Think", "mur_drone_Zoom", function()
        if not IsValid(DRONE) then return end
        if DRONE:GetClass() ~= "mur_drone_grenade" then return end

        local delta = input.GetAnalogValue(ANALOG_MOUSE_WHEEL)

        if delta ~= 0 then
            Zoom = Zoom - delta * 0.05

            Zoom = math.Clamp(Zoom, 0, 1)
        end
    end)

    hook.Add("Think", "DroneEmergencyKey", function()
        if not IsValid(DRONE) then return end
        if DRONE:GetClass() ~= "mur_drone_grenade" then return end

        if input.IsKeyDown(KEY_J) and not DRONE._KillKeyHeld then
            DRONE._KillKeyHeld = true

            net.Start("MuR_DroneEmergency")
            net.SendToServer()
        end

        if not input.IsKeyDown(KEY_J) then
            DRONE._KillKeyHeld = false
        end
    end)

    hook.Add("PlayerBindPress", "mur_drone_ZoomBlock", function(ply, bind, pressed)
        if not IsValid(DRONE) then return end
        if DRONE:GetClass() ~= "mur_drone_grenade" then return end

        if bind == "invprev" then
        Zoom = math.Clamp(Zoom - 0.1, 0, 1)
        return true 
    end

        if bind == "invnext" then
            Zoom = math.Clamp(Zoom + 0.1, 0, 1)
            return true 
        end
    end)
end
