1
0
Fork 0
forked from Simnation/Main
Main/resources/[defaultmaps]/prompt_sandy_cityhall/client/open.lua
2025-08-05 16:33:46 +02:00

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
})