好的,下面是一个简单的FiveM NPC插件示例,符合您提供的要求。请将以下代码放入`server.lua`和`client.lua`文件中。
**server.lua**ESX = nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
local players_signed = {}
-- 发放移民局签证
RegisterNetEvent('immigration:issueVisa')
AddEventHandler('immigration:issueVisa', function()
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
-- 检查玩家是否已经领取过签证
if players_signed[_source] then
TriggerClientEvent('esx:showNotification', _source, '你已经领取过移民局签证了。')
return
end
-- 获取玩家信息
local playerName = GetPlayerName(_source)
local playerID = _source
local entryTime = os.date('%Y-%m-%d %H:%M:%S')
-- 发放物品
xPlayer.addInventoryItem('hamburger', 10) -- 10个蔬菜汉堡
xPlayer.addInventoryItem('water', 10) -- 10瓶矿泉水
xPlayer.addAccountMoney('bank', 500) -- 500美金现金
-- 记录玩家已领取状态
players_signed[_source] = true
-- 发送签证信息
TriggerClientEvent('esx:showNotification', _source, '签证已发放!ID: ' .. playerID .. ', 姓名: ' .. playerName .. ', 入境时间: ' .. entryTime ..
'\n请在2日内携带签证至市政府办理身份证。')
end)
**client.lua**local isInRange = false
-- 创建NPC
Citizen.CreateThread(function()
local pedHash = GetHashKey("s_m_y_cop_01") -- 警察模型
RequestModel(pedHash)
while not HasModelLoaded(pedHash) do
Wait(500)
end
local npc = CreatePed(1, pedHash, -1035.7046, -2734.1345, 20.1693, 141.2658, false, true)
SetEntityInvincible(npc, true) -- 不受攻击
SetEntityVisible(npc, true)
FreezeEntityPosition(npc, true) -- NPC不能移动
-- 在NPC头顶显示名字
while true do
Citizen.Wait(0)
DrawText3D(-1035.7046, -2734.1345, 21.1693, "移民警察\n请新入境游客到此处领取入境签证及国家礼品")
end
end)
-- 绘制文字函数
function DrawText3D(x, y, z, text)
local onScreen, _x, _y = World3dToScreen2d(x, y, z)
local p = GetGameplayCamCoords()
local distance = Vdist(p.x, p.y, p.z, x, y, z)
local scale = (1 / distance) * 2
local fov = (1 / GetGameplayCamFov()) * 100
scale = scale * fov
if onScreen then
SetTextScale(0.0 * scale, 0.55 * scale)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry("STRING")
AddTextComponentString(text)
DrawText(_x, _y)
end
end
-- 检测E键
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local distance = GetDistanceBetweenCoords(coords, -1035.7046, -2734.1345, 20.1693, true)
if distance < 2.0 then
isInRange = true
ESX.ShowHelpNotification("按 ~INPUT_CONTEXT~ 领取移民局签证")
if IsControlJustReleased(0, 38) then -- E键
TriggerServerEvent('immigration:issueVisa')
end
else
isInRange = false
end
end
end)
以上代码实现了您的需求。在 `server.lua` 中,主要处理发放签证的逻辑和物品;而在 `client.lua` 中,创建了一个警察 NPC,并且可以通过 E 键与之互动进行签证领取。
请确保您的 `__resource.lua` 或 `fxmanifest.lua` 文件中包含了这两个文件,并且您安装了 ESX 框架。 |