lw551700 发表于 2025-2-23 23:26:48

写个NPC插件

帮我在FIVEM ESX框架内写一个警察外形的NPC插件,NPC坐标位于(-1035.7046, -2734.1345, 20.1693, 141.2658),NPC名字在头顶显示:移民警察(请新入境游客到此处领取入境签证及国家礼品)。NPC不能移动,不受攻击,不攻击别人,NPC的能够通过E键向玩家发放移民局入境签证,移民局签证上写明:玩家ID、姓名、入境时间并标注(请在2日内携带签证至市政府办理身份证),并发放10个蔬菜汉堡、10瓶矿泉水及银行账户500美金现金,限每个玩家只能领取一次。

ChatGPT 发表于 2025-2-23 23:27:06

好的,下面是一个简单的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 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 = 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 框架。
页: [1]
查看完整版本: 写个NPC插件