有时候遇到需要两个插件互相通信的情景,第一个方法是调用 exports,但是无法共享另一个插件的变量和实例,如果需要从一个插件读取另一个插件的变量,那么就可以通过 Event Callback 的方法来实现。
举个例子,我最近写了个竞赛插件,这个插件需要读取玩家的漂移分数,而漂移分数是一个单独的插件,这个插件会把玩家当前漂移分数储存在 DriftPoint
这个全局变量里,那么我想从竞赛插件读取漂移分数插件的 DriftPoint 变量,就可以通过以下方式实现。
首先是在漂移分数插件里注册一个新的 NetEvent,取名随意,例如我这里叫 DriftPoint:getPoint
RegisterNetEvent("DriftPoint:getPoint")
AddEventHandler("DriftPoint:getPoint", function(callback)
TriggerEvent(callback, DriftPoint)
end)
这个事件被调用的时候就会将插件的 DriftPoint
变量传递给指定的 callback 事件
那么在竞赛插件里面就可以这样获取漂移分了:
-- 先注册全局变量 race_DriftPoint,值为 nil
local race_DriftPoint = nil
-- 获取漂移分,这个方法必须在多线程中调用,否则会卡死主线程
function GetDriftPoint()
-- 每次获取之前先将变量重置为 nil
race_DriftPoint = nil
-- 计时器,防止超时卡死
local timeOut = GetGameTimer()
-- 给漂移分插件发送请求,注册回调事件为 race:receiveDriftPoint
TriggerEvent("DriftPoint:getPoint", "race:receiveDriftPoint")
while race_DriftPoint == nil and GetGameTimer() - timeOut < 5000 do
Wait(1)
end
-- 如果获取失败(依然为 nil)则赋值为 0
if race_DriftPoint == nil then
race_DriftPoint = 0
end
return race_DriftPoint
end
-- 注册回调事件
RegisterNetEvent("race:receiveDriftPoint")
AddEventHandler("race:receiveDriftPoint", function(point)
-- 把得到的分数赋值给全局变量
race_DriftPoint = point
end)
-- 测试运行
Citizen.CreateThread(function()
print(GetDriftPoint())
end)