139 lines
		
	
	
		
			No EOL
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			No EOL
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- IMPORTANT DISCLAIMER:
 | 
						|
-- This file contains critical functions for elevator operation.
 | 
						|
-- DO NOT modify anything unless you know exactly what you are doing.
 | 
						|
-- Any incorrect changes can break the entire elevator system.
 | 
						|
 | 
						|
-- Global system variables
 | 
						|
isInsideElevator = false
 | 
						|
currentTextUI = nil
 | 
						|
 | 
						|
-- Function to update screen text
 | 
						|
-- @param newText - New text to display (nil to hide)
 | 
						|
function updateTextUI(newText)
 | 
						|
    if currentTextUI ~= newText then
 | 
						|
        if newText then
 | 
						|
            lib.showTextUI(newText)
 | 
						|
        else
 | 
						|
            lib.hideTextUI()
 | 
						|
        end
 | 
						|
        currentTextUI = newText
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Function to get floor menu options
 | 
						|
-- @returns table - Menu options for available floors
 | 
						|
function getFloorMenu()
 | 
						|
    local options = {}
 | 
						|
    local currentFloor = GlobalState.elevator.currentFloor
 | 
						|
    
 | 
						|
    -- If elevator is moving, show disabled option
 | 
						|
    if GlobalState.elevator.isMoving then
 | 
						|
        return {
 | 
						|
            {
 | 
						|
                title = Config.Messages.elevatorMoving,
 | 
						|
                disabled = true
 | 
						|
            }
 | 
						|
        }
 | 
						|
    end
 | 
						|
    
 | 
						|
    -- Create options for each floor
 | 
						|
    for floor, floorData in ipairs(Config.Elevator.floors) do
 | 
						|
        -- Don't show current floor as an option
 | 
						|
        if floor ~= currentFloor then
 | 
						|
            table.insert(options, {
 | 
						|
                title = floorData.label,
 | 
						|
                description = floorData.description,
 | 
						|
                icon = 'building',
 | 
						|
                onSelect = function()
 | 
						|
                    SelectFloor(floor,currentFloor) -- Execute this function to select the floor (this move the elevator and plays the animation)
 | 
						|
                end
 | 
						|
            })
 | 
						|
        end
 | 
						|
    end
 | 
						|
    
 | 
						|
    return options
 | 
						|
end
 | 
						|
 | 
						|
-- Inside elevator zone
 | 
						|
-- This zone handles all interactions when player is inside the elevator
 | 
						|
local insideZone = lib.zones.box({
 | 
						|
    -- Zone position and size from config
 | 
						|
    coords = Config.Elevator.insideZone.coords,
 | 
						|
    size = Config.Elevator.insideZone.size,
 | 
						|
    rotation = Config.Elevator.insideZone.rotation,
 | 
						|
 | 
						|
    -- Called when player enters elevator
 | 
						|
    onEnter = function()
 | 
						|
        isInsideElevator = true
 | 
						|
        SetInteriorProbeLength(50.0) -- Prevents texture loss in interior (CRITICAL, MAKE SURE TO KEEP THIS)
 | 
						|
    end,
 | 
						|
 | 
						|
    -- Called when player exits elevator
 | 
						|
    onExit = function()
 | 
						|
        isInsideElevator = false
 | 
						|
        updateTextUI(nil) -- Hide any UI text
 | 
						|
        SetInteriorProbeLength(0.0) -- Reset interior probe length
 | 
						|
    end,
 | 
						|
 | 
						|
    -- Called every frame while player is inside elevator
 | 
						|
    inside = function()
 | 
						|
        -- Only allow floor selection if elevator is not moving
 | 
						|
        if not GlobalState.elevator.isMoving then
 | 
						|
            -- Show floor selection prompt
 | 
						|
            updateTextUI('[E] ' .. Config.Messages.selectFloor)
 | 
						|
 | 
						|
            -- Check if player pressed the interaction key (E)
 | 
						|
            if IsControlJustPressed(0, 38) then
 | 
						|
                -- Register and show the floor selection menu
 | 
						|
                lib.registerContext({
 | 
						|
                    id = 'elevator_floor_menu',
 | 
						|
                    title = Config.Messages.elevatorTitle,
 | 
						|
                    options = getFloorMenu() -- Get available floor options
 | 
						|
                })
 | 
						|
                lib.showContext('elevator_floor_menu')
 | 
						|
            end
 | 
						|
        else
 | 
						|
            updateTextUI(nil) -- Hide UI text while elevator is moving
 | 
						|
        end
 | 
						|
    end
 | 
						|
})
 | 
						|
 | 
						|
-- Elevator call zone
 | 
						|
-- This zone handles calling the elevator from outside
 | 
						|
local callZone = lib.zones.box({
 | 
						|
    -- Zone position and size from config
 | 
						|
    coords = Config.Elevator.callZone.coords,
 | 
						|
    size = Config.Elevator.callZone.size,
 | 
						|
    rotation = Config.Elevator.callZone.rotation,
 | 
						|
 | 
						|
    -- Called when player exits the call zone
 | 
						|
    onExit = function()
 | 
						|
        updateTextUI(nil) -- Hide any UI text
 | 
						|
    end,
 | 
						|
 | 
						|
    -- Called every frame while player is in call zone
 | 
						|
    inside = function()
 | 
						|
        local state = GlobalState.elevator
 | 
						|
        
 | 
						|
        -- Show "elevator moving" text if elevator is in motion
 | 
						|
        if state.isMoving then
 | 
						|
            updateTextUI(Config.Messages.elevatorMoving)
 | 
						|
        else
 | 
						|
            -- Get player position and nearest floor
 | 
						|
            local playerCoords = GetEntityCoords(cache.ped)
 | 
						|
            local nearestFloor = getNearestFloor(playerCoords.z)
 | 
						|
            
 | 
						|
            -- Only show call prompt if elevator is on a different floor
 | 
						|
            if nearestFloor ~= state.currentFloor then
 | 
						|
                updateTextUI('[E] ' .. Config.Messages.callElevator)
 | 
						|
                
 | 
						|
                -- Check if player pressed interaction key and is not inside elevator
 | 
						|
                if IsControlJustPressed(0, 38) and not isInsideElevator then
 | 
						|
                    CallElevator(playerCoords,nearestFloor) -- Call elevator to player's floor                    
 | 
						|
                end
 | 
						|
            else
 | 
						|
                updateTextUI(nil) -- Hide UI text if elevator is already on this floor
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
}) |