编程
帮我写一个酒店菜单插件好的,下面是一个简单的酒店菜单插件的示例代码。这个插件将包括服务器端和客户端的Lua脚本。我们会使用FiveM的ESX框架作为基础。
### server.lua
-- server.lua
ESX = nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
-- 定义一个事件来处理酒店菜单请求
RegisterServerEvent('hotel:requestMenu')
AddEventHandler('hotel:requestMenu', function()
local xPlayer = ESX.GetPlayerFromId(source)
-- 这里可以定义你的酒店菜单项
local menu = {
{name = "单人间", price = 100},
{name = "双人间", price = 200},
{name = "豪华套房", price = 500}
}
-- 发送菜单到客户端
TriggerClientEvent('hotel:showMenu', source, menu)
end)
### client.lua
-- client.lua
-- 显示酒店菜单
RegisterNetEvent('hotel:showMenu')
AddEventHandler('hotel:showMenu', function(menu)
local elements = {}
for i=1, #menu do
table.insert(elements, {
label = menu.name .. ' - $' .. menu.price,
value = menu.name,
price = menu.price
})
end
-- 使用esx_menu_default或其他菜单库显示菜单
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'hotel_menu', {
title = '酒店菜单',
align = 'top-left',
elements = elements
}, function(data, menu)
-- 处理选项选择
local selectedRoom = data.current.value
local roomPrice = data.current.price
-- 确认是否可以支付房费
local xPlayer = ESX.GetPlayerData()
if xPlayer.getMoney() >= roomPrice then
xPlayer.removeMoney(roomPrice)
ESX.ShowNotification('您已成功预订 ' .. selectedRoom)
menu.close()
else
ESX.ShowNotification('您没有足够的钱!')
end
end, function(data, menu)
menu.close()
end)
end)
-- 在合适的地方(例如玩家按下一个键)触发请求菜单事件
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if IsControlJustReleased(0, Keys['E']) then -- 按 'E' 打开菜单
TriggerServerEvent('hotel:requestMenu')
end
end
end)
### 注释翻译
- server.lua中的代码定义了一个触发事件 `hotel:requestMenu` ,用于请求酒店菜单,并在菜单中添加了三种房间类型。
- client.lua中的代码在客户端显示酒店菜单,并处理用户的选择。如果用户选择了房间并且有足够的钱,则从玩家账户中扣除房费。
- 使用 `ESX.ShowNotification` 提示用户操作结果。
你可以根据需求修改菜单内容和价格。如果需要进一步的功能,如房间预订状态管理,可以再进行扩展。
页:
[1]