如何获取最接近的玩家(FiveM Lua)
2020-6-18 12:48:17
收藏:0
阅读:183
评论:1
这是关于使用 LUA 语言进行 FiveM 脚本编写的问题;
我想要获取执行事件的玩家最接近的玩家的 ID 或名称。我该如何做到这一点?我目前有:(Client.lua)
while true do
Citizen.Wait(0)
local ped = GetPlayerPed(-1)
if IsPedInAnyVehicle(ped, false) then
local vehicle = GetVehiclePedIsIn(ped, false)
TriggerServerEvent("cartag:checkTagged")
end
end
end)
然后触发服务器事件:
-- 检查玩家是否被标记
AddEventHandler("cartag:checkTagged", function()
local ped = source
if tableIndex(tag, ped) then
local indexNr = tableIndex(tag, ped)
if tag[indexNr].tagged then
TriggerClientEvent("cartag:playerIt", ped)
end
end
end)
然后返回客户端事件:
-- 当玩家是 it
AddEventHandler("cartag:playerIt", function()
local ped = GetPlayerPed(-1)
local vehicle = GetVehiclePedIsIn(ped, false)
local t, distance = GetClosestPlayer()
if IsPedInAnyVehicle(t, false) then
if HasEntityCollidedWithAnything(vehicle) then
local dis = Vdist(coords.x, coords.y, coords.z, coordsFront.x, coordsFront.y, coordsFront.z)
if dis <= 1.2 then
-- 触发标签事件
TriggerServerEvent("cartag:tag", closestPlayerId)
end
end
end
end)
GetClosestPlayer 的代码如下:
local players = GetPlayers()
local closestDistance = -1
local closestPlayer = -1
local ped = GetPlayerPed(-1)
local coords = GetEntityCoords(ped)
for i, v in ipairs(players) do
local target = GetPlayerPed(v)
if (target ~= ped) then
local targetCoords = GetEntityCoords(GetPlayerPed(v))
local distance = Vdist(targetCoords.x, targetCoords.y, targetCoords.z, coords.x, coords.y, coords.z)
if (closestDistance == -1 or closestDistance > distance) then
closestPlayer = v
closestDistance = distance
end
end
end
return closestPlayer, closestDistance
end
这也会调用以下代码:
local players = {}
for _, player in ipairs(GetActivePlayers()) do
local ped_ = GetPlayerPed(player)
table.insert(players, ped_)
end
return players
end
不知怎么地,这在测试时总是给出一个随机数,距离指向地图下面的出生点,城市的北部。
所以; 我如何检查谁是最近的玩家,这个玩家有多远,以及这个玩家是否在车里? 提前感谢! (尝试过其他主题的方法,但它们似乎不起作用) 注意:我不想使用 ESX,想要使脚本独立。(这是一个标签游戏脚本,用于汽车...听起来很奇怪,不要责怪我 x) )
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我不知道这是否能帮到您,但您可以尝试其中一款功能:
https://runtime.fivem.net/doc/natives/?_0x7196842CB375CDB3
https://runtime.fivem.net/doc/natives/?_0xC33AB876A77F8164
我个人使用下面的功能获取距离(用于本地聊天,但在您的情况下也应适用),这是我为自己的 JS 框架编写的。
Lua 转换版本:
for i = 1, 255, 1 do if NetworkIsPlayerActive(i) then local player = GetPlayerFromServerId(id) local me = GetPlayerServerId(i) local coords = GetEntityCoords(GetPlayerPed(i)) local mycoords = GetEntityCoords(GetPlayerPed(player)) local dist = Vdist(mycoords, coords) if me == id or dist <= 15 then TriggerEvent('chat:addMessage', { args = { 'It works' }, color: { 230, 171, 255 } }) break end end end原始的 JS 版本: https://github.com/Jones3106/NodeRP/blob/master/client/events.js#L27
RegisterNetEvent('NodeRP.Client.SendLocalMsg'); onNet("NodeRP.Client.SendLocalMsg", (name, id, msg) => { for (let i = 0; i < 255; i++) { if (NetworkIsPlayerActive(i)) { let player = GetPlayerFromServerId(id); let me = GetPlayerServerId(i); let coords = GetEntityCoords(GetPlayerPed(i)); let mycoords = GetEntityCoords(GetPlayerPed(player)); let dist = Vdist(mycoords, coords); if(me == id || dist <= 15) { emit('chat:addMessage', { args: [ `${name} ${NodeRP.Locales[Config.Locale]["localchat"]}: ${msg}` ], color: [230, 171, 255] }); break; } } } });希望可以帮到您。