-- OT-MMO: monstruos ELITE de las dungeons (server/scripts/dungeon_elite.lua). El servidor manda por el opcode 139 -- «E|id,id,...» los elite vivos de tu copia; aqui solo se pintan: un marco dorado de dragon alrededor de su barra de -- vida sobre la cabeza (Creature::setHealthBarFrame) y, en el marco de objetivo (game_objetivo), «Elite» y el dragon del retrato. -- Lo usan otros modulos: modules.game_elite.esElite(criatura). local OPCODE = 139 local MARCO = '/game_elite/images/elite-barra' -- 49 x 12, con el hueco exacto de la barra de 31 x 4 en (9, 4) eliteController = Controller:new() local ids = {} -- [id de criatura] = true local marcados = {} -- [id de criatura] = criatura con el marco puesto function esElite(creature) return creature ~= nil and ids[creature:getId()] == true end -- El marco lo dibuja el propio cliente al pintar la barra (Creature::setHealthBarFrame, src/client/creature.cpp): sigue -- a la criatura al andar y no depende del zoom del mapa. Un cliente sin esa funcion solo ve «Elite» en el objetivo. local function pegar(creature) local id = creature:getId() if not ids[id] or marcados[id] or not creature.setHealthBarFrame then return end creature:setHealthBarFrame(MARCO) marcados[id] = creature end local function soltar(id) local c = marcados[id] marcados[id] = nil if c and c.setHealthBarFrame then c:setHealthBarFrame('') end end local function repasar() local mapa = modules.game_interface.getMapPanel() for _, c in ipairs(mapa and mapa:getSpectators() or {}) do if c:isMonster() then pegar(c) end end end local function onOpcode(protocol, opcode, buffer) local lista = buffer:match('^E|(.*)$') if not lista then return end for id in lista:gmatch('%d+') do ids[tonumber(id)] = true end repasar() if modules.game_objetivo and modules.game_objetivo.refrescarObjetivo then modules.game_objetivo.refrescarObjetivo() end end local function onAppear(creature) if ids[creature:getId()] then pegar(creature) end end local function onDeath(creature) if ids[creature:getId()] then ids[creature:getId()] = nil soltar(creature:getId()) end end local function limpiar() for id in pairs(marcados) do soltar(id) end ids, marcados = {}, {} end function eliteController:onInit() ProtocolGame.registerExtendedOpcode(OPCODE, onOpcode) connect(Creature, { onAppear = onAppear, onDeath = onDeath }) end function eliteController:onGameEnd() limpiar() end function eliteController:onTerminate() ProtocolGame.unregisterExtendedOpcode(OPCODE) disconnect(Creature, { onAppear = onAppear, onDeath = onDeath }) limpiar() end