From d575c06bc14338965909ef91c4adf99c0f919dc0 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 21 Mar 2026 11:49:23 -0700 Subject: [PATCH] feat: add UnitIsVisible for entity visibility checks Returns true when the unit's entity exists in the entity manager (within UPDATE_OBJECT range). Unlike UnitExists which falls back to party member data, UnitIsVisible only returns true for entities that can actually be rendered on screen. Used by nameplate addons and proximity addons to check if a unit is within visual range. Session 14 commit #100: 95 new API functions, 113 new events. --- src/addons/lua_engine.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/addons/lua_engine.cpp b/src/addons/lua_engine.cpp index 4968fcf5..2f5bfa4c 100644 --- a/src/addons/lua_engine.cpp +++ b/src/addons/lua_engine.cpp @@ -540,6 +540,14 @@ static int lua_UnitDetailedThreatSituation(lua_State* L) { return 5; } +// UnitIsVisible(unit) → boolean (entity exists in the client's entity manager) +static int lua_UnitIsVisible(lua_State* L) { + const char* uid = luaL_optstring(L, 1, "target"); + auto* unit = resolveUnit(L, uid); + lua_pushboolean(L, unit != nullptr); + return 1; +} + // UnitGroupRolesAssigned(unit) → "TANK", "HEALER", "DAMAGER", or "NONE" static int lua_UnitGroupRolesAssigned(lua_State* L) { auto* gh = getGameHandler(L); @@ -3341,6 +3349,7 @@ void LuaEngine::registerCoreAPI() { {"UnitIsTapped", lua_UnitIsTapped}, {"UnitIsTappedByPlayer", lua_UnitIsTappedByPlayer}, {"UnitIsTappedByAllThreatList", lua_UnitIsTappedByAllThreatList}, + {"UnitIsVisible", lua_UnitIsVisible}, {"UnitGroupRolesAssigned", lua_UnitGroupRolesAssigned}, {"UnitCanAttack", lua_UnitCanAttack}, {"UnitCanCooperate", lua_UnitCanCooperate},