RevScript Monster Loot Effect TFS / Canary

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
Script compartido por Gazia, un script que permite agregar un efecto a los montruos cuando mueren, como en el tibia oficial, asi bien hasta que looteen el cuerpo.

Este script utiliza EventCallback, tal y como esta es para TFS unicamente.
Ver el segundo codigo para Canary.

Código Lua:
local maxTries = 100
local repeatInterval = 2300 -- Intervalo de repetición en milisegundos (2 segundos)

local function tryEffect(pos, itemId, tries)
    if tries <= 0 then return end
    tries = tries - 1
    local tile = Tile(pos)
    local corpse = tile:getItemById(itemId)
    if not corpse or corpse:getSize() == 0 then return end
    pos:sendMagicEffect(252)
    addEvent(tryEffect, repeatInterval, pos, itemId, tries)
end

local event = EventCallback

function event.onDropLoot(monster, corpse)
    if not corpse or not corpse:isContainer() then return end
    local pos = corpse:getPosition()
    local itemId = corpse:getId()
    tryEffect(pos, itemId, maxTries)
end

event:register()

local creatureevent = CreatureEvent("effectmonster")

function creatureevent.onKill(player, target)
    if not target:isMonster() then return end
    local pos = target:getPosition()
    local corpse = target:getType()
    if corpse then
        pos:sendMagicEffect(252) -- Envía el efecto mágico cuando el monstruo es asesinado
        addEvent(tryRepeatedEffect, repeatInterval, pos, maxTries)
    end
end

function tryRepeatedEffect(pos, tries)
    if tries <= 0 then return end
    local tile = Tile(pos)
    local corpse = tile:getTopDownItem()
    if not corpse or corpse:getSize() == 0 then return end
    pos:sendMagicEffect(252) -- Envía el efecto mágico
    tries = tries - 1
    addEvent(tryRepeatedEffect, repeatInterval, pos, tries)
end

creatureevent:register()


Para canary habria que encontrar la funcion onDropLoot, agregar esta parte dentro:
Código Lua:
local maxTries = 100
local repeatInterval = 2300 -- Intervalo de repetición en milisegundos (2 segundos)

local function tryEffect(pos, itemId, tries)
    if tries <= 0 then return end
    tries = tries - 1
    local tile = Tile(pos)
    local corpse = tile:getItemById(itemId)
    if not corpse or corpse:getSize() == 0 then return end
    pos:sendMagicEffect(252)
    addEvent(tryEffect, repeatInterval, pos, itemId, tries)
end

 if not corpse or not corpse:isContainer() then
     return
 end
    local pos = corpse:getPosition()
    local itemId = corpse:getId()
    if pos then
    tryEffect(pos, itemId, maxTries)
    end

Crear un script en creaturescripts y agregar esto dentro:

Código Lua:
local creatureevent = CreatureEvent("effectmonster")

function creatureevent.onKill(player, target)
    if not target:isMonster() then return end
    local pos = target:getPosition()
    local corpse = target:getType()
    if corpse then
        pos:sendMagicEffect(252) -- Envía el efecto mágico cuando el monstruo es asesinado
        addEvent(tryRepeatedEffect, repeatInterval, pos, maxTries)
    end
end

function tryRepeatedEffect(pos, tries)
    if tries <= 0 then return end
    local tile = Tile(pos)
    local corpse = tile:getTopDownItem()
    if not corpse or corpse:getSize() == 0 then return end
    pos:sendMagicEffect(252) -- Envía el efecto mágico
    tries = tries - 1
    addEvent(tryRepeatedEffect, repeatInterval, pos, tries)
end

creatureevent:register()
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
Script por Baldi para la version Canary 13.3x

Código Lua:
local repeatInterval = 2400 -- Intervalo de repetición en milisegundos (2 segundos)
local magicEffectID = 263 -- DUPLICAR EL EFECTO 252 Y DALE A LA OPCION SYNCHRONIZED EN MI CASO 263

local function tryEffect(pos, itemId)
    local tile = Tile(pos)
    local corpse = tile:getItemById(itemId)
    if not corpse or corpse:getSize() == 0 then
        pos:removeMagicEffect(magicEffectID)  -- Elimina el efecto si el cuerpo está vacío
        return
    end
    pos:sendMagicEffect(magicEffectID)
    addEvent(tryEffect, repeatInterval, pos, itemId)  -- Llamada recursiva sin contador de intentos
end

local function tryRepeatedEffect(pos)
    local tile = Tile(pos)
    local corpse = tile:getTopDownItem()
    if not corpse or corpse:getSize() == 0 then
        pos:removeMagicEffect(magicEffectID)  -- Elimina el efecto si el cuerpo está vacío
        return
    end
    pos:sendMagicEffect(magicEffectID)
    addEvent(tryRepeatedEffect, repeatInterval, pos)  -- Llamada recursiva sin contador de intentos
end

local callback = EventCallback()

function callback.monsterOnDropLoot(monster, corpse, killer, mostDamage, unjustified, mostDamage_unjustified)
    if not corpse or not corpse:isContainer() then
        local pos = monster:getPosition()
        pos:removeMagicEffect(magicEffectID)  -- Elimina el efecto si el cuerpo está vacío
        return
    end
    local pos = monster:getPosition()
    local itemId = corpse:getId()
    tryEffect(pos, itemId)
end

callback:register()

local creatureevent = CreatureEvent("effectmonster")

function creatureevent.onDeath(player, target)
    if not target:isMonster() then return end
    local pos = target:getPosition()
    local corpse = target:getType()
    if corpse and corpse:isContainer() then
        tryRepeatedEffect(pos)
    end
end

creatureevent:register()
 
Arriba