DopingControl v0.6.1
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
-- DopingControl scan/reach.lua
|
||||
-- Unit readability probe: online FALLBACK via UnitIsConnected, distance via
|
||||
-- UnitXP_SP3 "distanceBetween". Distance is DIAGNOSTIC ONLY -- it is written
|
||||
-- into the store but NEVER used as a filter (readability is
|
||||
-- decided from the read RESULT, not from a range assumption).
|
||||
--
|
||||
-- ONLINE IS A FALLBACK ONLY (measured
|
||||
-- in-game): the raid roster online flag (GetRaidRosterInfo return 8) is
|
||||
-- SERVER TRUTH and wins in scan/engine.lua scanOne -- UnitIsConnected can
|
||||
-- read nil mid-zoning while the player is actually online (false-offline
|
||||
-- bug). The reach online result is only consulted for roster entries
|
||||
-- WITHOUT a roster flag (the party path).
|
||||
--
|
||||
-- Pure Lua 5.0, dofile-loadable offline: the WoW calls live in ReadUnit,
|
||||
-- which is only invoked in-game; Normalize is pure and offline-tested.
|
||||
|
||||
DopingControl = DopingControl or {}
|
||||
local DC = DopingControl
|
||||
|
||||
DC_Reach = DC_Reach or {}
|
||||
local R = DC_Reach
|
||||
|
||||
-- ------------------------------------------------------------------
|
||||
-- Normalize(haveOnline, onlineRaw, distOk, distVal) -> online, distance
|
||||
-- haveOnline : bool -- UnitIsConnected existed AND its pcall succeeded.
|
||||
-- UnitIsConnected returns 1/nil, where nil is read
|
||||
-- as offline -- BUT it can also read nil mid-zoning
|
||||
-- while the player is online (measured in-game),
|
||||
-- which is why the engine only uses this value as a
|
||||
-- fallback when there is no roster online flag.
|
||||
-- onlineRaw : raw UnitIsConnected return (1/nil/false)
|
||||
-- distOk : pcall success of UnitXP("distanceBetween", ...)
|
||||
-- distVal : its first return
|
||||
-- Returns:
|
||||
-- online : true|false|nil -- nil = could not determine; the caller
|
||||
-- (engine scanOne) consults this at all
|
||||
-- only for entries without a roster flag
|
||||
-- distance : number|nil -- nil = not measurable (no UnitXP_SP3, or
|
||||
-- the call failed / returned a non-number)
|
||||
-- ------------------------------------------------------------------
|
||||
function R.Normalize(haveOnline, onlineRaw, distOk, distVal)
|
||||
local online = nil
|
||||
if haveOnline then
|
||||
if onlineRaw then
|
||||
online = true
|
||||
else
|
||||
online = false
|
||||
end
|
||||
end
|
||||
local distance = nil
|
||||
if distOk and type(distVal) == "number" then
|
||||
distance = distVal
|
||||
end
|
||||
return online, distance
|
||||
end
|
||||
|
||||
-- ------------------------------------------------------------------
|
||||
-- ReadUnit(unit) -> online, distance (WoW runtime only)
|
||||
-- Every foreign-unit call is pcall-wrapped (hard rule).
|
||||
-- Missing UnitXP_SP3 only drops the diagnostic distance
|
||||
-- -- the online read runs regardless.
|
||||
-- ------------------------------------------------------------------
|
||||
function R.ReadUnit(unit)
|
||||
local haveOnline = false
|
||||
local onlineRaw = nil
|
||||
if UnitIsConnected then
|
||||
local ok, v = pcall(UnitIsConnected, unit)
|
||||
if ok then
|
||||
haveOnline = true
|
||||
onlineRaw = v
|
||||
end
|
||||
end
|
||||
local distOk = false
|
||||
local distVal = nil
|
||||
if UnitXP then
|
||||
distOk, distVal = pcall(UnitXP, "distanceBetween", "player", unit)
|
||||
end
|
||||
return R.Normalize(haveOnline, onlineRaw, distOk, distVal)
|
||||
end
|
||||
Reference in New Issue
Block a user