Skip to content

Hooks

This document describes the hooks available in the Free Look module for managing freelook functionality.


FreelookToggled

Purpose

Called when freelook is toggled on or off.

Parameters

  • enabled (boolean): Whether freelook is being enabled or disabled.

Realm

Client.

When Called

This hook is triggered when: - Freelook is toggled on or off - After PreFreelookToggle hook - When the freelook state changes

Example Usage

-- Track freelook toggles
hook.Add("FreelookToggled", "TrackFreelookToggles", function(enabled)
    local char = LocalPlayer():getChar()
    if char then
        local freelookToggles = char:getData("freelook_toggles", 0)
        char:setData("freelook_toggles", freelookToggles + 1)

        -- Track toggle patterns
        local togglePatterns = char:getData("freelook_toggle_patterns", {})
        table.insert(togglePatterns, {
            enabled = enabled,
            time = os.time()
        })
        char:setData("freelook_toggle_patterns", togglePatterns)
    end
end)

-- Apply freelook toggle effects
hook.Add("FreelookToggled", "FreelookToggleEffects", function(enabled)
    -- Play toggle sound
    LocalPlayer():EmitSound(enabled and "buttons/button24.wav" or "buttons/button10.wav", 75, 100)

    -- Apply screen effect
    LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 255, 0, 10), 0.3, 0)

    -- Notify player
    local status = enabled and "on" or "off"
    LocalPlayer():notify("Freelook turned " .. status .. "!")

    -- Create particle effect
    local effect = EffectData()
    effect:SetOrigin(LocalPlayer():GetPos())
    effect:SetMagnitude(1)
    effect:SetScale(1)
    util.Effect("Explosion", effect)
end)

-- Track freelook toggle statistics
hook.Add("FreelookToggled", "TrackFreelookToggleStats", function(enabled)
    local char = LocalPlayer():getChar()
    if char then
        -- Track toggle frequency
        local toggleFrequency = char:getData("freelook_toggle_frequency", 0)
        char:setData("freelook_toggle_frequency", toggleFrequency + 1)

        -- Track toggle patterns
        local togglePatterns = char:getData("freelook_toggle_patterns", {})
        table.insert(togglePatterns, {
            enabled = enabled,
            time = os.time()
        })
        char:setData("freelook_toggle_patterns", togglePatterns)
    end
end)

PreFreelookToggle

Purpose

Called before freelook is toggled on or off.

Parameters

  • enabled (boolean): Whether freelook is being enabled or disabled.

Realm

Client.

When Called

This hook is triggered when: - Freelook is about to be toggled - Before the freelook state changes - Before FreelookToggled hook

Example Usage

-- Control freelook toggling
hook.Add("PreFreelookToggle", "ControlFreelookToggling", function(enabled)
    local char = LocalPlayer():getChar()
    if char then
        -- Check if freelook is disabled
        if char:getData("freelook_disabled", false) then
            LocalPlayer():notify("Freelook is disabled!")
            return false
        end

        -- Check if player is in a vehicle
        if LocalPlayer():InVehicle() then
            LocalPlayer():notify("Cannot use freelook in a vehicle!")
            return false
        end

        -- Check if player is in water
        if LocalPlayer():WaterLevel() >= 2 then
            LocalPlayer():notify("Cannot use freelook underwater!")
            return false
        end

        -- Check cooldown
        local lastToggle = char:getData("last_freelook_toggle_time", 0)
        if os.time() - lastToggle < 1 then -- 1 second cooldown
            LocalPlayer():notify("Please wait before toggling freelook again!")
            return false
        end

        -- Update last toggle time
        char:setData("last_freelook_toggle_time", os.time())
    end

    return true
end)

-- Track freelook toggle attempts
hook.Add("PreFreelookToggle", "TrackFreelookToggleAttempts", function(enabled)
    local char = LocalPlayer():getChar()
    if char then
        local toggleAttempts = char:getData("freelook_toggle_attempts", 0)
        char:setData("freelook_toggle_attempts", toggleAttempts + 1)
    end
end)

-- Apply pre-toggle effects
hook.Add("PreFreelookToggle", "PreFreelookToggleEffects", function(enabled)
    -- Play pre-toggle sound
    LocalPlayer():EmitSound("ui/buttonclick.wav", 75, 100)

    -- Apply screen effect
    LocalPlayer():ScreenFade(SCREENFADE.IN, Color(255, 255, 0, 5), 0.1, 0)

    -- Notify player
    local status = enabled and "on" or "off"
    LocalPlayer():notify("Attempting to turn freelook " .. status .. "...")
end)

ShouldUseFreelook

Purpose

Called to determine if freelook should be used for a player.

Parameters

  • player (Player): The player to check.

Realm

Client.

When Called

This hook is triggered when: - Freelook input is being processed - Before any freelook calculations - Before PreFreelookToggle hook

Example Usage

-- Control freelook usage
hook.Add("ShouldUseFreelook", "ControlFreelookUsage", function(player)
    local char = player:getChar()
    if char then
        -- Check if freelook is disabled
        if char:getData("freelook_disabled", false) then
            return false
        end

        -- Check if player is in a vehicle
        if player:InVehicle() then
            return false
        end

        -- Check if player is in water
        if player:WaterLevel() >= 2 then
            return false
        end

        -- Check if player is crouching
        if player:KeyDown(IN_DUCK) then
            return false
        end

        -- Check if player is sprinting
        if player:KeyDown(IN_SPEED) then
            return false
        end

        -- Check if player is in a restricted area
        if char:getData("in_restricted_area", false) then
            return false
        end
    end

    return true
end)

-- Track freelook usage checks
hook.Add("ShouldUseFreelook", "TrackFreelookUsageChecks", function(player)
    local char = player:getChar()
    if char then
        local usageChecks = char:getData("freelook_usage_checks", 0)
        char:setData("freelook_usage_checks", usageChecks + 1)
    end
end)

-- Apply freelook usage check effects
hook.Add("ShouldUseFreelook", "FreelookUsageCheckEffects", function(player)
    local char = player:getChar()
    if char then
        -- Check if freelook is disabled
        if char:getData("freelook_disabled", false) then
            player:notify("Freelook is disabled!")
        end
    end
end)