• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver
Resource icon

Release Lua Event Manager (LEM) Event Library (1 Viewer)

I did change the great Shei LEM of Dragonslayer (sorry, mixup!) a bit to enable multi-root and breaking spell casts. Worked quite well for me (let's not talk about the first try). Comments welcome!

Update: now with random picking of spawns, proper detection of LOS. Might be able to win the raid, but I haven't managed (did not fail on banes, though)

[CODE lang="Lua" title="Shei"]
---@type Mq
local mq = require('mq')
-- does kinda also work on raid...
local required_zone = {
['akhevatwo_mission'] = true,
['akhevatwo_raid'] = true,
}
local bane_mob_name = 'datiar xi tavuelim'

local banes = {
CLR={
{name='Blessed Chains',type='aa', order='1'},
{name='Shackle',type='spell', order='2'}
},
BRD={
{name='Slumber of the Diabo',type='spell',order='1'},
{name='Wave of Nocturn',type='spell',order='2'}
},
ENC={
{name='Beam of Slumber',type='aa',order='1'},
{name='Shackle',type='spell',order='3'},
{name='Beguiler\'s Banishment',type='aa',order='2'}
},
PAL={
{name='Shackles of Tunare',type='aa',order='1'},
{name='Shackle',type='spell',order='2'}
},
SHM={
{name='Shackle',type='spell',order='3'},
{name='Spiritual Rebuke',type='aa',order='1'},
{name='Virulent Paralysis',type='aa',order='2'}
},
NEC={
{name='Pestilent Paralysis',type='aa',order='1'},
{name='Shackle',type='spell',order='2'}
},
DRU={
{name='Paralytic Spray',type='aa',order='1'},
{name='Paralytic Spores',type='aa',order='2'},
{name='Vinelash Assault',type='spell',order='3'},
{name='Shackle',type='spell',order='4'}
},
RNG={
{name='Grasp of Sylvan Spirits',type='aa',order='1'},
{name='Vinelash Assault',type='spell',order='2'},
{name='Blusterbolt',type='spell',order='3'},
{name='Flusterbolt',type='spell',order='4'},
{name='Enveloping Roots',type='spell',order='5'},
{name='Shackle',type='spell',order='6'}
},
WIZ={
{name='Frost Shackles',type='aa',order='1'},
{name='Strong Root',type='aa',order='2'},
{name='Restless Ice Block',type='spell',order='3'},
{name='Ice Block',type='spell',order='4'}
}
}
local unbreakable = {
['CLR'] = true,
--['DRU'] = true,
--['SHM'] = true,
-- adapt to your healing setup
}

local function StopDPS()
mq.cmd('/squelch /mqp on')
mq.delay(10)
if mq.TLO.Me.Class.ShortName() == 'BRD' then
mq.cmd('/squelch /twist off')
mq.delay(10)
mq.cmd('/squelch /stopsong')
mq.delay(10)
end
mq.cmd('/squelch /boxr pause')
mq.delay(10)
if (mq.TLO.Me.Casting.ID()) and (not unbreakable[mq.TLO.Me.Class.ShortName()]) then
mq.cmd('/squelch /stopcast')
mq.delay(100)
end
end
local function ResumeDPS()
mq.cmd('/squelch /mqp off')
mq.delay(10)
if mq.TLO.Me.Class.ShortName() == 'BRD' then
mq.cmd('/squelch /twist on')
mq.delay(10)
end
mq.cmd('/squelch /boxr unpause')
mq.delay(10)
end
local function on_load()
if not required_zone[mq.TLO.Zone.ShortName()] then return end
math.randomseed(os.time()*mq.TLO.Me.ID())
local bane = banes[mq.TLO.Me.Class.ShortName()]
if not bane then
print('Sadly I will be of no help here')
return end
for _, data in ipairs(bane) do
if data.type == 'spell' then
local Spellname = mq.TLO.Spell(data.name).RankName()
if mq.TLO.Me.Gem(Spellname)() and mq.TLO.Me.Gem(Spellname)() > 0 then
print('Spell '..data.name..' memmed, good boy')
else
print('Spell '..data.name..' not memmed, you suck')
end
end
end
end
local function isBaneableMob(spawn)
-- 200 should be enough
return ((spawn.Type() == 'NPC') and (spawn.CleanName() == bane_mob_name) and (spawn.LineOfSight()) and (spawn.Distance() < 200))
end
---@return boolean @Returns true if the action should fire, otherwise false.
local function condition()
local bane_mob_spawn = mq.getFilteredSpawns(isBaneableMob)
return required_zone[mq.TLO.Zone.ShortName()] and #bane_mob_spawn > 0
end


local function target_bane_mob()
local bane_mob_spawn = mq.getFilteredSpawns(isBaneableMob)
local bane_mob_count = #bane_mob_spawn
if bane_mob_count > 1 then
--random defeates distance sorting, might weight it
--table.sort(bane_mob_spawn, function(a, b) return a['Distance'] > b['Distance'] end )
Index = math.random(bane_mob_count)
else Index = 1
end
if #bane_mob_spawn > 0 then
mq.cmdf('/mqtar ${Spawn[%s]}', bane_mob_spawn[Index]['ID'])
mq.delay(50)
mq.cmd('/face fast')
end
end
local function cast(spell)
if mq.TLO.Target.CleanName() == bane_mob_name then
mq.cmdf('/cast %s', spell.RankName())
mq.cmdf('/dgtell all used %s for bane on [%s] -- [%s]', spell.RankName(), mq.TLO.Target.CleanName(), mq.TLO.Target.ID())
mq.delay(50+spell.MyCastTime())
end
end
local function use_aa(aa)
if mq.TLO.Target.CleanName() == bane_mob_name then
mq.cmdf('/alt activate %s', aa.ID())
mq.cmdf('/dgtell all used %s for bane on [%s] -- [%s]', aa.Spell.Name(), mq.TLO.Target.CleanName(), mq.TLO.Target.ID())
mq.delay(50+aa.Spell.CastTime())
end
end
local function bane_ready(data)
if not unbreakable[mq.TLO.Me.Class.ShortName()] then
if data.type == 'spell' then
return mq.TLO.Me.SpellReady(mq.TLO.Spell(data.name).RankName())()
elseif data.type == 'aa' then
return mq.TLO.Me.AltAbilityReady(data.name)()
end
else
if data.type == 'spell' then
return (mq.TLO.Me.SpellReady(mq.TLO.Spell(data.name).RankName())() and not mq.TLO.Me.Casting())
elseif data.type == 'aa' then
return (mq.TLO.Me.AltAbilityReady(data.name)() and not mq.TLO.Me.Casting())
end
end
end
local function action()
print('Action!')
local bane = banes[mq.TLO.Me.Class.ShortName()]
-- if not a bane class, return
if not bane then return end
table.sort(bane, function(a, b) return a['order'] < b['order'] end )
local breakcond = false
while breakcond == false do
local bane_mob_spawn = mq.getFilteredSpawns(isBaneableMob)
if #bane_mob_spawn > 0 then
for _, data in ipairs(bane) do
if bane_ready(data) then
StopDPS()
target_bane_mob()
if data.type == 'spell' then
cast(mq.TLO.Spell(data.name))
else
use_aa(mq.TLO.Me.AltAbility(data.name))
end
while mq.TLO.Me.Casting() do
mq.delay(50)
end
break
end
end
else
breakcond = true
ResumeDPS()
end
mq.doevents()
mq.delay(50)
end
end
return {onload=on_load, condfunc=condition, actionfunc=action}
[/CODE]

And for good measure, here my modified self-cure stuff:
[CODE lang="Lua" title="Seaport"]local mq = require('mq')
local library = require('lem.library')
local itemname = 'Seaport Cure-All'
local buffname1 = 'Venomous Touch of Vinitras'
local buffname2 = 'Rotting Touch of Vinitras'
--local buffname3 = 'Corrupting Touch of Vinitras'

---@return boolean @Returns true if the action should fire, otherwise false.
local function condition()
return (mq.TLO.FindItem(itemname)() ~= nil) and (mq.TLO.FindItem(itemname).TimerReady() == 0) and (((mq.TLO.Me.Buff(buffname1)() ~= nil) and (mq.TLO.Me.Buff(buffname1).Duration() < 3000) and (mq.TLO.Me.Buff(buffname1).Duration() > 100)) or ((mq.TLO.Me.Buff(buffname2)() ~= nil) and (mq.TLO.Me.Buff(buffname2).Duration() < 3000) and (mq.TLO.Me.Buff(buffname2).Duration() > 100)))--or ((mq.TLO.Me.Buff(buffname3)() == !nil) and (mq.TLO.Me.Buff(buffname3).Duration() < 13000)))
end

local function action()
if mq.TLO.Me.Class.ShortName() == 'BRD' then
mq.cmd('/squelch /twist off')
mq.delay(10)
mq.cmd('/squelch /stopsong')
mq.delay(10)
end
while mq.TLO.Me.Casting.ID() do
mq.cmd('/squelch /stopcast')
mq.delay(50)
end
mq.cmdf('/useitem "%s"', itemname)
mq.cmd('/dgt all used Cureall! Slacking on cures, dudes...')
if mq.TLO.Me.Class.ShortName() == 'BRD' then
mq.cmd('/squelch /twist on')
mq.delay(10)
end
end

return {condfunc=condition, actionfunc=action}[/CODE]

Thanks to durango for the headsup at SHM & dewey for the exhaustive list of banes!
And Kaen for () 🙃
 
Last edited:
Trying to write a lem and failing.

Text Event:
Event Pattern: #*#Weakness Evinced devitalizes the skin of #1#.#*#

Code:
local mq=require('mq')
local function event_handler(line, name)
if name == mq.TLO.Me.CleanName() then
mq.cmd('/nav locxyz -587 668 196')
mq.cmd('/mqpause on')
end

end
return {eventfunc=event_handler}


This text trigger works:
Weakness Evinced devitalizes the skin of ShamanName.

This trigger does not:
Weakness Evinced devitalizes the skin of RogueName, BardName, ShamanName and MonkName.


Can someone help me straighten this out when multiple "Names" are being used. Any help would be appreciated.

Think I found my answer. Will have to try it out later.

Correct Event Pattern:
#*#Weakness Evinced devitalizes the skin of #1#.#*#

Correct Code:
local mq=require('mq')
local function event_handler(line, names)
if string.find(names, mq.TLO.Me.CleanName()) then
mq.cmd('/nav locxyz -587 668 196')
mq.cmd('/mqpause on')
end

end
return {eventfunc=event_handler}

Go to know I guess :)
 
Last edited:
selo
Code:
cmV0dXJuIHsKIG5hbWUgPSAic2VsbyIsCiB0eXBlID0gImNvbmRpdGlvbnMiLAogY2F0ZWdvcnkgPSAiIiwKIGxvYWQgPSB7CiAgYWx3YXlzID0gZmFsc2UsCiAgem9uZSA9ICIiLAogIGNsYXNzID0gIiIsCiB9LAogY29kZSA9ICJMUzB0UUhSNWNHVWdUWEVLYkc5allXd2diWEVnUFNCeVpYRjFhWEpsS0NkdGNTY3BDbXh2WTJGc0lHeHBZbkpoY25rZ1BTQnlaWEYxYVhKbEtDZHNaVzB1YkdsaWNtRnllU2NwQ2dwc2IyTmhiQ0JpZFdabWJtRnRaU0E5SUNkVFpXeHZYQ2R6SUVGalkyVnNaWEpoYm1Sdkp3b0thV1lnYm05MElIQmhZMnRoWjJVdWJHOWhaR1ZrV3lkc1pXMHVaWFpsYm5SekoxMGdkR2hsYmlCd2NtbHVkQ2duVkdocGN5QnpZM0pwY0hRZ2FYTWdhVzUwWlc1a1pXUWdkRzhnWW1VZ2FXMXdiM0owWldRZ2RHOGdUSFZoSUVWMlpXNTBJRTFoYm1GblpYSWdLRXhGVFNrdUlGUnllU0FpWEdFdGRDOXNkV0VnY25WdUlHeGxiVnhoTFhRaUp5a2daVzVrQ2dvdExTMUFjbVYwZFhKdUlHSnZiMnhsWVc0Z1FGSmxkSFZ5Ym5NZ2RISjFaU0JwWmlCMGFHVWdZV04wYVc5dUlITm9iM1ZzWkNCbWFYSmxMQ0J2ZEdobGNuZHBjMlVnWm1Gc2MyVXVDbXh2WTJGc0lHWjFibU4wYVc5dUlHTnZibVJwZEdsdmJpZ3BDaUFnSUNCWGNtbDBaUzVFWldKMVp5Z25SVTVVUlZJZ1kyOXVaR2wwYVc5dUp5a0tJQ0FnSUMwdElFTm9aV05ySUdWMlpYSjVkR2hwYm1jZ2RXNWtaWElnZEdobElITjFiaUJxZFhOMElHRnpJR0Z1SUdWNFlXMXdiR1V1SUZWemRXRnNiSGtnZVc5MUlHTmhiaUJuWlhRZ1lYZGhlU0IzYVhSb0lHTm9aV05yYVc1bklHRWdiRzkwSUd4bGMzTWdZbVZtYjNKbElHTmhjM1JwYm1jdUNpQWdJQ0J5WlhSMWNtNGdibTkwSUcxeExsUk1UeTVOWlM1Q2RXWm1LR0oxWm1adVlXMWxLU2dwSUdGdVpBb2dJQ0FnSUNBZ0lHMXhMbFJNVHk1TlpTNUdjbVZsUW5WbVpsTnNiM1J6S0NrZ1BpQXdJR0Z1WkFvZ0lDQWdJQ0FnSUc1dmRDQnRjUzVVVEU4dVRXVXVTVzUyYVhNb0tTQmhibVFLSUNBZ0lDQWdJQ0J0Y1M1VVRFOHVUV1V1VTNSaGJtUnBibWNvS1NCaGJtUUtJQ0FnSUNBZ0lDQnNhV0p5WVhKNUxtbHVYMk52Ym5SeWIyd29LUXBsYm1RS0NteHZZMkZzSUdaMWJtTjBhVzl1SUdGamRHbHZiaWdwQ2lBZ0lDQlhjbWwwWlM1RVpXSjFaeWduUlU1VVJWSWdZV04wYVc5dUp5a0tJQ0FnSUZkeWFYUmxMa2x1Wm04b0oxVnphVzVuSUZObGJHOWNKM01nVTI5dVlYUmhKeWtLSUNBZ0lHMXhMbU50WkNnbkwzUjNhWE4wSUdWdVpDY3BDaUFnSUNCdGNTNWtaV3hoZVNneE1EQXBDaUFnSUNCdGNTNWpiV1FvSnk5aGJIUWdZV04wSURNM01EUW5LUXBsYm1RS0NuSmxkSFZ5YmlCN1kyOXVaR1oxYm1NOVkyOXVaR2wwYVc5dUxDQmhZM1JwYjI1bWRXNWpQV0ZqZEdsdmJuMD0iLAp9

travel song
Code:
cmV0dXJuIHsKIG5hbWUgPSAidHJhdmVsIHNvbmciLAogdHlwZSA9ICJjb25kaXRpb25zIiwKIGNhdGVnb3J5ID0gIiIsCiBsb2FkID0gewogIGFsd2F5cyA9IGZhbHNlLAogIHpvbmUgPSAiIiwKICBjbGFzcyA9ICIiLAogfSwKIGNvZGUgPSAiTFMwdFFIUjVjR1VnVFhFS2JHOWpZV3dnYlhFZ1BTQnlaWEYxYVhKbEtDZHRjU2NwQ214dlkyRnNJR3hwWW5KaGNua2dQU0J5WlhGMWFYSmxLQ2RzWlcwdWJHbGljbUZ5ZVNjcENncHNiMk5oYkNCaWRXWm1ibUZ0WlNBOUlDZFRaV3h2WENkeklGTnZibWNnYjJZZ1ZISmhkbVZzSndvS2FXWWdibTkwSUhCaFkydGhaMlV1Ykc5aFpHVmtXeWRzWlcwdVpYWmxiblJ6SjEwZ2RHaGxiaUJ3Y21sdWRDZ25WR2hwY3lCelkzSnBjSFFnYVhNZ2FXNTBaVzVrWldRZ2RHOGdZbVVnYVcxd2IzSjBaV1FnZEc4Z1RIVmhJRVYyWlc1MElFMWhibUZuWlhJZ0tFeEZUU2t1SUZSeWVTQWlYR0V0ZEM5c2RXRWdjblZ1SUd4bGJWeGhMWFFpSnlrZ1pXNWtDZ290TFMxQWNtVjBkWEp1SUdKdmIyeGxZVzRnUUZKbGRIVnlibk1nZEhKMVpTQnBaaUIwYUdVZ1lXTjBhVzl1SUhOb2IzVnNaQ0JtYVhKbExDQnZkR2hsY25kcGMyVWdabUZzYzJVdUNteHZZMkZzSUdaMWJtTjBhVzl1SUdOdmJtUnBkR2x2YmlncENpQWdJQ0JYY21sMFpTNUVaV0oxWnlnblJVNVVSVklnWTI5dVpHbDBhVzl1SnlrS0lDQWdJQzB0SUVOb1pXTnJJR1YyWlhKNWRHaHBibWNnZFc1a1pYSWdkR2hsSUhOMWJpQnFkWE4wSUdGeklHRnVJR1Y0WVcxd2JHVXVJRlZ6ZFdGc2JIa2dlVzkxSUdOaGJpQm5aWFFnWVhkaGVTQjNhWFJvSUdOb1pXTnJhVzVuSUdFZ2JHOTBJR3hsYzNNZ1ltVm1iM0psSUdOaGMzUnBibWN1Q2lBZ0lDQnlaWFIxY200Z2JtOTBJRzF4TGxSTVR5NU5aUzVDZFdabUtHSjFabVp1WVcxbEtTZ3BJR0Z1WkFvZ0lDQWdJQ0FnSUcxeExsUk1UeTVOWlM1R2NtVmxRblZtWmxOc2IzUnpLQ2tnUGlBd0lHRnVaQW9nSUNBZ0lDQWdJRzF4TGxSTVR5NU5aUzVUZEdGdVpHbHVaeWdwSUdGdVpBb2dJQ0FnSUNBZ0lHeHBZbkpoY25rdWFXNWZZMjl1ZEhKdmJDZ3BDbVZ1WkFvS2JHOWpZV3dnWm5WdVkzUnBiMjRnWVdOMGFXOXVLQ2tLSUNBZ0lGZHlhWFJsTGtSbFluVm5LQ2RGVGxSRlVpQmhZM1JwYjI0bktRb2dJQ0FnVjNKcGRHVXVTVzVtYnlnblZYTnBibWNnVTJWc2Ixd25jeUJUYjI1bklHOW1JRlJ5WVhabGJDY3BDaUFnSUNCdGNTNWpiV1FvSnk5emFXNW5JRFluS1FvZ0lDQWdiWEV1WkdWc1lYa29NekF3TUNrS1pXNWtDZ3B5WlhSMWNtNGdlMk52Ym1SbWRXNWpQV052Ym1ScGRHbHZiaXdnWVdOMGFXOXVablZ1WXoxaFkzUnBiMjU5IiwKfQ==

these two events are meant to be used together. turn one on to start with and make a hotkey on your lead toon that does the following:

/end
/dex bardname /makemevisible
/dex bardname /lem cond "selo"
/dex bardname /lem cond "travel song"
/dex bardname /twist end

this will essentially toggle the two events on/off using one hotkey and make travel song persistent as you zone; selo also won't break group perfected invis or other invises which is why /makemevisible is part of the toggle hotkey
also in the travel song event change /sing 6 to whichever gem you put travel song in
 
Last edited:
The Dragonslayer one on the overview page.

---@type Mq
---@type ImGui

local mq = require('mq')

local required_zone = 'akhevatwo_mission'
local bane_mob_name = 'datiar xi tavuelim'

local banes = {
BRD={name='Slumber of the Diabo',type='spell'},
CLR={name='Blessed Chains',type='aa'},
ENC={name='Beguiler\'s Banishment',type='aa'},
Pal={name='Shackles of Tunare',type='aa'},
SHM={name='Virulent Paralysis',type='aa'},
Nec={name='Pestilent Paralysis',type='aa'},
DRU={name='Paralytic Spores',type='aa'},
RNG={name='Grasp of Sylvan Spirits',type='aa'},
}

local function StopDPS()
mq.cmd('/squelch /mqp on')
mq.delay(10)
if mq.TLO.Me.Class.ShortName() == 'BRD' then
mq.cmd('/squelch /twist off')
mq.delay(10)
mq.cmd('/squelch /stopsong')
mq.delay(10)
end
--mq.cmd('/attack off') ... maybe deactivate attack but save state to reactivate at StartDps
--mq.delay(10)
mq.cmd('/squelch /boxr pause')
mq.delay(10)
while mq.TLO.Me.Casting.ID() do
mq.delay(200)
end
end

local function ResumeDPS()
mq.cmd('/squelch /mqp off')
mq.delay(10)
if mq.TLO.Me.Class.ShortName() == 'BRD' then
mq.cmd('/squelch /twist on')
mq.delay(10)
end
mq.cmd('/squelch /boxr unpause')
mq.delay(10)
end

local function on_load()
if mq.TLO.Zone.ShortName() ~= required_zone then return end
local bane = banes[mq.TLO.Me.Class.ShortName()]
local Spellname = mq.TLO.Spell(bane.name).RankName()
if bane and bane.type == 'spell' then
if mq.TLO.Me.Gem(Spellname)() and mq.TLO.Me.Gem(Spellname)() > 0 then return end -- Should be memmed already
StopDPS()
mq.cmdf('/memspell 13 "%s"', Spellname)
mq.delay('4s')
mq.TLO.Window('SpellBookWnd').DoClose()
ResumeDPS()
end
end

---@return boolean @Returns true if the action should fire, otherwise false.
local function condition()
return mq.TLO.Zone.ShortName() == required_zone and mq.TLO.SpawnCount(('%s npc'):format(bane_mob_name))() > 0
end

local function target_bane_mob()
if mq.TLO.Target.CleanName() ~= bane_mob_name then
mq.cmdf('/mqtar %s npc', bane_mob_name)
mq.delay(50)
end
end

local function cast(spell)
mq.cmdf('/cast %s', spell.RankName())
mq.delay(50+spell.MyCastTime())
end

local function use_aa(aa)
mq.cmdf('/alt activate %s', aa.ID())
mq.delay(50+aa.Spell.CastTime())
end

local function bane_ready(bane)
if bane.type == 'spell' then
return mq.TLO.Me.SpellReady(bane.name) and not mq.TLO.Me.Casting()
elseif bane.type == 'aa' then
return mq.TLO.Me.AltAbilityReady(bane.name) and not mq.TLO.Me.Casting()
end
end

local function action()
local my_class = mq.TLO.Me.Class.ShortName()
local bane = banes[my_class]
-- if not a bane class, return
if not bane then return end
-- if bane ability isn't ready, return
if my_class ~= 'BRD' and not bane_ready(bane) then return end
StopDPS()
target_bane_mob()
if bane.type == 'spell' then
cast(mq.TLO.Spell(bane.name))
else
use_aa(mq.TLO.Me.AltAbility(bane.name))
end
while mq.TLO.Me.Casting() do
mq.doevents()
mq.delay(50)
end
ResumeDPS()
end

return {onload=on_load, condfunc=condition, actionfunc=action}
I know this one when I first attempted to use it last week was throwing an error on my pally. I narrowed it down to the local banes having the class name for PAL being lower case written as Pal. Once I switched it to PAL, it worked fine for me.
 
Looks like we will need at least two scripts for the LS missions. I'm the worst at making these but I'm sure someone can whip these up in no time.

Hero's are Forged:

Pet attack Egg until the Egg sack has been destroyed.
Radius roughly 125

Trigger Text: Gives locations, 1 trigger per Warp, Roughly 4 warps during event.

The Spider Queen scuttles off to the lower floor of the structure to the northwest.
The Spider Queen scuttles off to the upper floor of the structure to the northwest.
The Spider Queen scuttles off to the lower floor of the structure to the southeast.
The Spider Queen scuttles off to the upper floor of the structure to the southeast.

Final Fugue:

Cast stun/mez/charm on Captain Kar when he shields himself. Currently, I do not believe the mez/charm works as this appears to be bugged.

Trigger to pause DPS and start Stunning:
Kar roars, pulls his shield from his back, and sets his feet.

Trigger to resume DPS:
Kar is finally distracted by blows to the head and drops his sheild.

I realize "sheild" is misspelled but this is what I copied directly out of the logs. Could be corrected in the future. Text search could be shorted to compensate.
 
Last edited:
Looks like we will need at least two scripts for the LS missions. I'm the worst at making these but I'm sure someone can whip these up in no time.

Hero's are Forged:

Pet attack Egg until the Egg sack has been destroyed.

Final Fugue:

Cast stun/mez/charm on Captain Kar when he shields himself. Currently, I do not believe the mez/charm works as this appears to be bugged.
If you can outline the strat a bit more, it would help. Or are those the only 2 elements, else tank&spank?
 
If you can outline the strat a bit more, it would help. Or are those the only 2 elements, else tank&spank?
I have added more information. I should have put all this together better instead of having a late night thought without any real substance.
 
I have added more information. I should have put all this together better instead of having a late night thought without any real substance.
Thanks :-) I did not try any mission in beta, thats why I asked. Is the LEM supposed to control only pet classes/stunners, or do all classes need to pause dps/back off and reengage?
 
Nice LEM for targeting your pet and casting illusions. Plugins do not handle this.
I am using Emperor Ssraeshza as an example. Just replace the name.

[CODE title="Emperor Ssraeshza"]cmV0dXJuIHsKIG5hbWUgPSAiRW1wZXJvciBTc3JhZXNoemEiLAogY29kZSA9ICJiRzlqWVd3Z2JYRWdQU0J5WlhGMWFYSmxLQ2R0Y1NjcENteHZZMkZzSUdaMWJtTjBhVzl1SUdOdmJtUnBkR2x2YmlncENncHBaaUFvZEc5emRISnBibWNvYlhFdVZFeFBMbEJsZEM1Q2RXWm1LQ2RRWlhRZ1NXeHNkWE5wYjI0NklFVnRjR1Z5YjNJZ1UzTnlZV1Z6YUhwaEp5a3BJRDA5SUNkT1ZVeE1KeWtnWVc1a0lHMXhMbFJNVHk1TlpTNVFaWFF1U1VRb0tTQitQU0F3SUdGdVpDQnViM1FnYlhFdVZFeFBMazFsTGtsdWRtbHpLQ2tnWVc1a0lHNXZkQ0J0Y1M1VVRFOHVUV1V1UTJGemRHbHVaeTVKUkNncElHRnVaQ0J0Y1M1VVRFOHVUV1V1V0ZSaGNtZGxkQ2dwSUhSb1pXNEtJRzF4TG1OdFpDZ25MMkp2ZUhJZ1VHRjFjMlVuS1FvZ2JYRXVaR1ZzWVhrb0p6RnpKeWtLSUcxeExtTnRaQ2duTDNSaGNtZGxkQ0J3WlhRZ2FXUWdKeUF1TGlCMGIzTjBjbWx1WnlodGNTNVVURTh1VFdVdVVHVjBMa2xFS0NrcEtRb2diWEV1WkdWc1lYa29KekZ6SnlrS0lHMXhMbU50WkNnbkwzVnpaV2wwWlcwZ0lrMWxkR0Z0YjNKd2FDQlhZVzVrSUMwZ1JXMXdaWEp2Y2lCVGMzSmhaWE5vZW1FaUp5a0tJRzF4TG1SbGJHRjVLQ2N6Y3ljcENpQnRjUzVqYldRb0p5OWliM2h5SUhWdWNHRjFjMlVuS1FvZ1pXNWtDZ29nSUNBZ0lDQWdJQW9nSUNBZ0lDQUtDaUFnSUNBZ0lDQUtDZ3BsYm1RS2NtVjBkWEp1SUh0amIyNWtablZ1WXoxamIyNWthWFJwYjI1OSIsCiBjYXRlZ29yeSA9ICJVbHRpbHR5IiwKIGxvYWQgPSB7CiAgY2xhc3MgPSAiIiwKICBhbHdheXMgPSBmYWxzZSwKICB6b25lID0gIiIsCiB9LAogdHlwZSA9ICJjb25kaXRpb25zIiwKfQ==[/CODE]


Code:
local mq = require('mq')
local function condition()

if (tostring(mq.TLO.Pet.Buff('Pet Illusion: Emperor Ssraeshza')) == 'NULL') and mq.TLO.Me.Pet.ID() ~= 0 and not mq.TLO.Me.Invis() and not mq.TLO.Me.Casting.ID() and mq.TLO.Me.XTarget() then
 mq.cmd('/boxr Pause')
 mq.delay('1s')
 mq.cmd('/target pet id ' .. tostring(mq.TLO.Me.Pet.ID()))
 mq.delay('1s')
 mq.cmd('/useitem "Metamorph Wand - Emperor Ssraeshza"')
 mq.delay('3s')
 mq.cmd('/boxr unpause')
 end

        
      

      


end
return {condfunc=condition}
 
[CODE title="Stun Kar the Unmovable - Cleric Edition"]cmV0dXJuIHsKIGNhdGVnb3J5ID0gIkxTIiwKIHR5cGUgPSAiZXZlbnRzIiwKIHBhdHRlcm4gPSAiIyojS2FyIHJvYXJzLCBwdWxscyBoaXMgc2hpZWxkIGZyb20gaGlzIGJhY2ssIGFuZCBzZXRzIGhpcyBmZWV0IzEjIiwKIGNvZGUgPSAiYkc5allXd2diWEVnUFNCeVpYRjFhWEpsS0NkdGNTY3BDZ3BzYjJOaGJDQm1kVzVqZEdsdmJpQmxkbVZ1ZEY5b1lXNWtiR1Z5S0d4cGJtVXNJSFJoY21kbGRDa0tJQ0FnSUd4dlkyRnNJSE4wZFc0Z1BTQnRjUzVVVEU4dVUzQmxiR3dvSjBGM1pXSnZiSFFuS1M1U1lXNXJUbUZ0WlNncENpQWdJQ0J0Y1M1amJXUm1LQ2N2WTJ4eUlIQmhkWE5sSUc5dUp5a0tDaUFnSUNCcFppQnRjUzVVVEU4dVZHRnlaMlYwTGtOc1pXRnVUbUZ0WlNncElINDlJQ2RMWVhJZ2RHaGxJRlZ1Ylc5MllXSnNaU2NnZEdobGJnb2dJQ0FnSUNBZ0lHMXhMbU50WkNnbkwyMXhkR0Z5SUV0aGNpQjBhR1VnVlc1dGIzWmhZbXhsSUc1d1l5Y3BDaUFnSUNBZ0lDQWdiWEV1WkdWc1lYa29OVEFwQ2lBZ0lDQmxibVFLSUNBZ0lIZG9hV3hsSUc1dmRDQnRjUzVVVEU4dVRXVXVVM0JsYkd4U1pXRmtlU2h6ZEhWdUtTZ3BJRzl5SUcxeExsUk1UeTVOWlM1RFlYTjBhVzVuS0NrZ1pHOEtJQ0FnSUNBZ0lDQnRjUzVrWld4aGVTZ3hNREF3S1FvZ0lDQWdaVzVrQ2lBZ0lDQnRjUzVqYldSbUtDY3ZZMkZ6ZENBbGN5Y3NJSE4wZFc0cENpQWdJQ0J0Y1M1a1pXeGhlU2d4TURBd0syMXhMbFJNVHk1VGNHVnNiQ2h6ZEhWdUtTNU5lVU5oYzNSVWFXMWxLQ2twQ2dvZ0lDQWdiWEV1WTIxa1ppZ25MMk5zY2lCd1lYVnpaU0J2Wm1ZbktRcGxibVFLQ25KbGRIVnliaUI3WlhabGJuUm1kVzVqUFdWMlpXNTBYMmhoYm1Sc1pYSjkiLAogbG9hZCA9IHsKICBhbHdheXMgPSBmYWxzZSwKICB6b25lID0gIiIsCiAgY2xhc3MgPSAiIiwKIH0sCiBuYW1lID0gIlN0dW4gS2FyIChDbHIpIiwKfQ==[/CODE]

[CODE title="Code"]local mq = require('mq')

local function event_handler(line, target)
local stun = mq.TLO.Spell('Awebolt').RankName()
mq.cmdf('/clr pause on')
if mq.TLO.Target.CleanName() ~= 'Kar the Unmovable' then
mq.cmd('/mqtar Kar the Unmovable npc')
mq.delay(50)
end
while not mq.TLO.Me.SpellReady(stun)() or mq.TLO.Me.Casting() do
mq.delay(1000)
end
mq.cmdf('/cast %s', stun)
mq.delay(1000+mq.TLO.Spell(stun).MyCastTime())
mq.cmdf('/clr pause off')
end
return {eventfunc=event_handler}
[/CODE]

Can change to any stunning class, just change the spell name and the pause to whatever plugin. Can probably modify it fairly easily to handle multiple classes, but cleric is what Im using right now.
 
Anyone able to help me write a LEM for a toon to click back to campfire if it dies? I think it should be relatively easy, but I'm a straight noob. They are bound in guild lobby, maybe something about entering guild lobby with rez sickness on --> using Insignia? Bonus points if it will only click back if the toon just died and if it's able to turn off invis/SoS before clicking if it's on.
 
a mac?

 

EQ Anashti Sul, Damsel of Decay TBM Group mission
*I would like to thank a_moss_snake, aquietone, Hytiek for helping me through creating this LEM. They did much of the heavy lifting and I could not have made this work without their help.

Change local curecaster ='PCName' to the name of the toon you want to cast cure

Use this on your Healer

[CODE title="Import to LEM"]cmV0dXJuIHsKIG5hbWUgPSAiQW5hc2h0aSBTdWwsIERhbXNlbCBvZiBEZWNheSAgIC0gSGVhbGVyIiwKIGxvYWQgPSB7CiAgYWx3YXlzID0gZmFsc2UsCiAgem9uZSA9ICIiLAogIGNsYXNzID0gIiIsCiB9LAogdHlwZSA9ICJjb25kaXRpb25zIiwKIGNhdGVnb3J5ID0gIk1pc3Npb25zIiwKIGNvZGUgPSAiYkc5allXd2diWEVnUFNCeVpYRjFhWEpsS0NkdGNTY3BDbXh2WTJGc0lHTjFjbVZEWVhOMFpYSWdQU0FuWVdOdmJtbGhKd3BzYjJOaGJDQmpkWEpsVTNCbGJHd2dQU2RGY21Ga2FXTmhkR1VnUkdselpXRnpaU2NLYkc5allXd2daRzkwTVNBOUoxZHBkR2hsY21sdVp5QlFhSGx6YVdOaGJHbDBlU0JZU1VsSkp3cHNiMk5oYkNCa2IzUXlJRDBuVjJsMGFHVnlhVzVuSUVaaGFYUm9JRmhKU1VrbkNteHZZMkZzSUdSdmRETWdQU2RYYVhSb1pYSnBibWNnVEdsdFluTWdXRWxKU1NjS2JHOWpZV3dnWTNWeVpYTWdQU0I3Q2lBZ0lDQWdRbE5VUFh0dVlXMWxQU0pPWVhSMWNtVW5jeUJUWVd4MlpTSXNkSGx3WlQwbllXRW5mU3dLSUNBZ0lDQkRURkk5ZTI1aGJXVTlKMUIxY21sbWFXVmtJRk53YVhKcGRITW5MSFI1Y0dVOUoyRmhKMzBzQ2lBZ0lDQWdSRkpWUFh0dVlXMWxQU2RRZFhKcFptbGxaQ0JUY0dseWFYUnpKeXgwZVhCbFBTZGhZU2Q5TEFvZ0lDQWdJRTVGUXoxN2JtRnRaVDBuUlcxaWNtRmpaU0IwYUdVZ1JHVmpZWGtuTEhSNWNHVTlKMkZoSjMwc0NpQWdJQ0FnVTBoTlBYdHVZVzFsUFNkUWRYSnBabWxsWkNCVGNHbHlhWFJ6Snl4MGVYQmxQU2RoWVNkOUxBb2dJQ0FnSUZOSVJEMTdibUZ0WlQwblVIVnlhWFI1SUc5bUlFUmxZWFJvSnl4MGVYQmxQU2RoWVNkOUNpQWdJQ0I5Q2dwc2IyTmhiQ0JtZFc1amRHbHZiaUJ2Ymw5c2IyRmtLQ2tLSUNBZ0lHeHZZMkZzSUdOMWNtVWdQU0JqZFhKbGMxdHRjUzVVVEU4dVRXVXVRMnhoYzNNdVUyaHZjblJPWVcxbEtDbGRDbVZ1WkFvS2JHOWpZV3dnWm5WdVkzUnBiMjRnWTI5dVpHbDBhVzl1S0NrS2FXWWdiWEV1VkV4UExrMWxMa0oxWm1Zb1pHOTBNU2t1U1VRb0tTQitQU0J1YVd3Z2IzSWdiWEV1VkV4UExrMWxMa0oxWm1Zb1pHOTBNaWt1U1VRb0tTQitQU0J1YVd3Z2RHaGxiZ29nSUNBZ2NtVjBkWEp1SUhSeWRXVUtJQ0FnSUdWdVpBcGxibVFLQ214dlkyRnNJR1oxYm1OMGFXOXVJR05oYzNRb2MzQmxiR3dwQ2lBZ0lDQnRjUzVqYldSbUtDY3ZZMkZ6ZENBbGN5Y3NJSE53Wld4c0xsSmhibXRPWVcxbEtDa3BDaUFnSUNCdGNTNWtaV3hoZVNnMU1DdHpjR1ZzYkM1TmVVTmhjM1JVYVcxbEtDa3BDbVZ1WkFvS2JHOWpZV3dnWm5WdVkzUnBiMjRnZFhObFgyRmhLR0ZoS1FvZ0lDQWdiWEV1WTIxa1ppZ25MMkZzZENCaFkzUnBkbUYwWlNBbGN5Y3NJR0ZoTGtsRUtDa3BDaUFnSUNCdGNTNWtaV3hoZVNnMU1DdGhZUzVUY0dWc2JDNURZWE4wVkdsdFpTZ3BLUXBsYm1RS0NteHZZMkZzSUdaMWJtTjBhVzl1SUdOMWNtVmZjbVZoWkhrb1kzVnlaU2tLSUNBZ0lHbG1JRzF4TGxSTVR5NU5aUzVIWlcwb1kzVnlaVk53Wld4c0tTZ3BJSFJvWlc0S0lDQWdJQ0FnSUNCeVpYUjFjbTRnYlhFdVZFeFBMazFsTGxOd1pXeHNVbVZoWkhrb1kzVnlaVk53Wld4c0tTZ3BJR0Z1WkNCdWIzUWdiWEV1VkV4UExrMWxMa05oYzNScGJtY29LUW9nSUNBZ1pXeHpaV2xtSUdOMWNtVXVkSGx3WlNBOVBTQW5ZV0VuSUhSb1pXNEtJQ0FnSUNBZ0lDQnlaWFIxY200Z2JYRXVWRXhQTGsxbExrRnNkRUZpYVd4cGRIbFNaV0ZrZVNoamRYSmxMbTVoYldVcEtDa2dZVzVrSUc1dmRDQnRjUzVVVEU4dVRXVXVRMkZ6ZEdsdVp5Z3BDaUFnSUNCbGJtUUtaVzVrQ2dwc2IyTmhiQ0JtZFc1amRHbHZiaUJoWTNScGIyNG9LUW9nSUNBZ2JHOWpZV3dnYlhsZlkyeGhjM01nUFNCdGNTNVVURTh1VFdVdVEyeGhjM011VTJodmNuUk9ZVzFsS0NrS0lDQWdJR3h2WTJGc0lHTjFjbVVnUFNCamRYSmxjMXR0ZVY5amJHRnpjMTBLSUNBZ0lDMHRJR2xtSUc1dmRDQmhJR04xY21VZ1kyeGhjM01zSUhKbGRIVnliZ29nSUNBZ2FXWWdZM1Z5WlNBOVBTQnVhV3dnZEdobGJnb2dJQ0FnSUNBZ0lHMXhMbU50WkdZb0p5OTBaV3hzSUNWeklHSjFabVp0WlNBaUpYTWlKeXhqZFhKbFEyRnpkR1Z5TEdOMWNtVlRjR1ZzYkNrS0lDQWdJQ0FnSUNCdGNTNWtaV3hoZVNnMU1EQXdLUW9nSUNBZ1pXNWtJQ0FLSUNBZ0lDMHRJR2xtSUdOMWNtVWdZV0pwYkdsMGVTQnBjMjRuZENCeVpXRmtlU3dnY21WMGRYSnVDaUFnSUNCcFppQnRjUzVVVEU4dVRXVXVRMnhsWVc1T1lXMWxLQ2tnZmowZ1kzVnlaVU5oYzNSbGNpQmhibVFnYm05MElHTjFjbVZmY21WaFpIa29ZM1Z5WlNrZ2RHaGxiZ29nSUNBZ0lDQndjbWx1ZEdZb0owRkJJRzV2ZENCeVpXRmtlU0JoYm1RZ2JtOTBJR05oYzNSbGNpd2daMjlwYm1jZ2RHOGdZWE5ySUNWeklHWnZjaUJqZFhKbE9pQWxjeWNzWTNWeVpVTmhjM1JsY2l4amRYSmxVM0JsYkd3cENpQWdJQ0FnSUNBZ2JYRXVZMjFrWmlnbkwzUmxiR3dnSlhNZ1luVm1abTFsSUNJbGN5SW5MR04xY21WRFlYTjBaWElzWTNWeVpWTndaV3hzS1FvZ0lDQWdJQ0FnSUcxeExtUmxiR0Y1S0RVd01EQXBDaUFnSUNCbGJITmxhV1lnYlhFdVZFeFBMazFsTGtOc1pXRnVUbUZ0WlNncElEMDlJR04xY21WRFlYTjBaWElnWVc1a0lHNXZkQ0JqZFhKbFgzSmxZV1I1S0dOMWNtVXBJSFJvWlc0S0lDQWdJQ0FnSUNCd2NtbHVkR1lvSjBGQklHNXZkQ0J5WldGa2VTQmlkWFFnU1NCaGJTQmpkWEpsSUdOaGMzUmxjaXdnWjI5cGJtY2dkRzhnWTJGemRDQmpkWEpsT2lBbGN5Y3NZM1Z5WlZOd1pXeHNLUW9nSUNBZ0lDQWdJQ0FnSUNCdGNTNWpiV1JtS0NjdmRHRnlaMlYwSUNWekp5eHRjUzVVVEU4dVRXVXVUbUZ0WlNncEtRb2dJQ0FnSUNBZ0lDQWdJQ0J0Y1M1a1pXeGhlU2cxTURBcENpQWdJQ0FnSUNBZ0lDQWdJR05oYzNRb2JYRXVWRXhQTGxOd1pXeHNLR04xY21WVGNHVnNiQ2twQ2lBZ0lDQmxibVFLQ2lBZ0lDQnBaaUJqZFhKbElINDlJRzVwYkNCaGJtUWdZM1Z5WlY5eVpXRmtlU2hqZFhKbEtTQjBhR1Z1Q2lBZ0lDQWdJQ0FnY0hKcGJuUm1LQ2RCUVNCamRYSmxJSFZ3T2lBbGN5Y3NZM1Z5WlM1dVlXMWxLUW9nSUNBZ0lDQWdJSFZ6WlY5aFlTaHRjUzVVVEU4dVRXVXVRV3gwUVdKcGJHbDBlU2hqZFhKbExtNWhiV1VwS1FvZ0lDQWdaVzVrQ2lBZ0lDQnRjUzVrWld4aGVTZ3hNREF3S1FwbGJtUWdJQW9nQ25KbGRIVnliaUI3YjI1c2IyRmtQVzl1WDJ4dllXUXNJR052Ym1SbWRXNWpQV052Ym1ScGRHbHZiaXdnWVdOMGFXOXVablZ1WXoxaFkzUnBiMjU5IiwKfQ==[/CODE]

[CODE lang="Lua" title="Anashti Sul, Damsel of Decay - Healer"]local mq = require('mq')
local cureCaster = 'PCName'
local cureSpell ='Eradicate Disease'
local dot1 ='Withering Physicality XIII'
local dot2 ='Withering Faith XIII'
local dot3 ='Withering Limbs XIII'
local cures = {
BST={name="Nature's Salve",type='aa'},
CLR={name='Purified Spirits',type='aa'},
DRU={name='Purified Spirits',type='aa'},
NEC={name='Embrace the Decay',type='aa'},
SHM={name='Purified Spirits',type='aa'},
SHD={name='Purity of Death',type='aa'}
}

local function on_load()
local cure = cures[mq.TLO.Me.Class.ShortName()]
end

local function condition()
if mq.TLO.Me.Buff(dot1).ID() ~= nil or mq.TLO.Me.Buff(dot2).ID() ~= nil then
return true
end
end

local function cast(spell)
mq.cmdf('/cast %s', spell.RankName())
mq.delay(50+spell.MyCastTime())
end

local function use_aa(aa)
mq.cmdf('/alt activate %s', aa.ID())
mq.delay(50+aa.Spell.CastTime())
end

local function cure_ready(cure)
if mq.TLO.Me.Gem(cureSpell)() then
return mq.TLO.Me.SpellReady(cureSpell)() and not mq.TLO.Me.Casting()
elseif cure.type == 'aa' then
return mq.TLO.Me.AltAbilityReady(cure.name)() and not mq.TLO.Me.Casting()
end
end

local function action()
local my_class = mq.TLO.Me.Class.ShortName()
local cure = cures[my_class]
-- if not a cure class, return
if cure == nil then
mq.cmdf('/tell %s buffme "%s"',cureCaster,cureSpell)
mq.delay(5000)
end
-- if cure ability isn't ready, return
if mq.TLO.Me.CleanName() ~= cureCaster and not cure_ready(cure) then
printf('AA not ready and not caster, going to ask %s for cure: %s',cureCaster,cureSpell)
mq.cmdf('/tell %s buffme "%s"',cureCaster,cureSpell)
mq.delay(5000)
elseif mq.TLO.Me.CleanName() == cureCaster and not cure_ready(cure) then
printf('AA not ready but I am cure caster, going to cast cure: %s',cureSpell)
mq.cmdf('/target %s',mq.TLO.Me.Name())
mq.delay(500)
cast(mq.TLO.Spell(cureSpell))
end

if cure ~= nil and cure_ready(cure) then
printf('AA cure up: %s',cure.name)
use_aa(mq.TLO.Me.AltAbility(cure.name))
end
mq.delay(1000)
end

return {onload=on_load, condfunc=condition, actionfunc=action}[/CODE]

USE THIS ON OTHER TOONS
[CODE title="Import to LEM"]cmV0dXJuIHsKIG5hbWUgPSAiQW5hc2h0aSBTdWwsIERhbXNlbCBvZiBEZWNheSAgLSBPdGhlciIsCiBsb2FkID0gewogIGFsd2F5cyA9IGZhbHNlLAogIHpvbmUgPSAiIiwKICBjbGFzcyA9ICIiLAogfSwKIHR5cGUgPSAiY29uZGl0aW9ucyIsCiBjYXRlZ29yeSA9ICJNaXNzaW9ucyIsCiBjb2RlID0gImJHOWpZV3dnYlhFZ1BTQnlaWEYxYVhKbEtDZHRjU2NwQ214dlkyRnNJR04xY21WRFlYTjBaWElnUFNBblFXTnZibWxoSndwc2IyTmhiQ0JqZFhKbFUzQmxiR3dnUFNkRmNtRmthV05oZEdVZ1JHbHpaV0Z6WlNjS2JHOWpZV3dnWkc5ME1TQTlKMWRwZEdobGNtbHVaeUJRYUhsemFXTmhiR2wwZVNCWVNVbEpKd3BzYjJOaGJDQmtiM1F5SUQwblYybDBhR1Z5YVc1bklFWmhhWFJvSUZoSlNVa25DbXh2WTJGc0lHUnZkRE1nUFNkWGFYUm9aWEpwYm1jZ1RHbHRZbk1nV0VsSlNTY0tiRzlqWVd3Z1kzVnlaWE1nUFNCN0NpQWdJQ0FnUWxOVVBYdHVZVzFsUFNKT1lYUjFjbVVuY3lCVFlXeDJaU0lzZEhsd1pUMG5ZV0VuZlN3S0lDQWdJQ0JEVEZJOWUyNWhiV1U5SjFCMWNtbG1hV1ZrSUZOd2FYSnBkSE1uTEhSNWNHVTlKMkZoSjMwc0NpQWdJQ0FnUkZKVlBYdHVZVzFsUFNkUWRYSnBabWxsWkNCVGNHbHlhWFJ6Snl4MGVYQmxQU2RoWVNkOUxBb2dJQ0FnSUU1RlF6MTdibUZ0WlQwblJXMWljbUZqWlNCMGFHVWdSR1ZqWVhrbkxIUjVjR1U5SjJGaEozMHNDaUFnSUNBZ1UwaE5QWHR1WVcxbFBTZFFkWEpwWm1sbFpDQlRjR2x5YVhSekp5eDBlWEJsUFNkaFlTZDlMQW9nSUNBZ0lGTklSRDE3Ym1GdFpUMG5VSFZ5YVhSNUlHOW1JRVJsWVhSb0p5eDBlWEJsUFNkaFlTZDlDaUFnSUNCOUNncHNiMk5oYkNCbWRXNWpkR2x2YmlCdmJsOXNiMkZrS0NrS0lDQWdJR3h2WTJGc0lHTjFjbVVnUFNCamRYSmxjMXR0Y1M1VVRFOHVUV1V1UTJ4aGMzTXVVMmh2Y25ST1lXMWxLQ2xkQ21WdVpBb0tiRzlqWVd3Z1puVnVZM1JwYjI0Z1kyOXVaR2wwYVc5dUtDa0thV1lnYlhFdVZFeFBMazFsTGtKMVptWW9aRzkwTVNrdVNVUW9LU0IrUFNCdWFXd2diM0lnYlhFdVZFeFBMazFsTGtKMVptWW9aRzkwTXlrdVNVUW9LU0IrUFNCdWFXd2dkR2hsYmdvZ0lDQWdjbVYwZFhKdUlIUnlkV1VLSUNBZ0lHVnVaQXBsYm1RS0NteHZZMkZzSUdaMWJtTjBhVzl1SUdOaGMzUW9jM0JsYkd3cENpQWdJQ0J0Y1M1amJXUm1LQ2N2WTJGemRDQWxjeWNzSUhOd1pXeHNMbEpoYm10T1lXMWxLQ2twQ2lBZ0lDQnRjUzVrWld4aGVTZzFNQ3R6Y0dWc2JDNU5lVU5oYzNSVWFXMWxLQ2twQ21WdVpBb0tiRzlqWVd3Z1puVnVZM1JwYjI0Z2RYTmxYMkZoS0dGaEtRb2dJQ0FnYlhFdVkyMWtaaWduTDJGc2RDQmhZM1JwZG1GMFpTQWxjeWNzSUdGaExrbEVLQ2twQ2lBZ0lDQnRjUzVrWld4aGVTZzFNQ3RoWVM1VGNHVnNiQzVEWVhOMFZHbHRaU2dwS1FwbGJtUUtDbXh2WTJGc0lHWjFibU4wYVc5dUlHTjFjbVZmY21WaFpIa29ZM1Z5WlNrS0lDQWdJR2xtSUcxeExsUk1UeTVOWlM1SFpXMG9ZM1Z5WlZOd1pXeHNLU2dwSUhSb1pXNEtJQ0FnSUNBZ0lDQnlaWFIxY200Z2JYRXVWRXhQTGsxbExsTndaV3hzVW1WaFpIa29ZM1Z5WlZOd1pXeHNLU2dwSUdGdVpDQnViM1FnYlhFdVZFeFBMazFsTGtOaGMzUnBibWNvS1FvZ0lDQWdaV3h6WldsbUlHTjFjbVV1ZEhsd1pTQTlQU0FuWVdFbklIUm9aVzRLSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiWEV1VkV4UExrMWxMa0ZzZEVGaWFXeHBkSGxTWldGa2VTaGpkWEpsTG01aGJXVXBLQ2tnWVc1a0lHNXZkQ0J0Y1M1VVRFOHVUV1V1UTJGemRHbHVaeWdwQ2lBZ0lDQmxibVFLWlc1a0NncHNiMk5oYkNCbWRXNWpkR2x2YmlCaFkzUnBiMjRvS1FvZ0lDQWdiRzlqWVd3Z2JYbGZZMnhoYzNNZ1BTQnRjUzVVVEU4dVRXVXVRMnhoYzNNdVUyaHZjblJPWVcxbEtDa0tJQ0FnSUd4dlkyRnNJR04xY21VZ1BTQmpkWEpsYzF0dGVWOWpiR0Z6YzEwS0lDQWdJQzB0SUdsbUlHNXZkQ0JoSUdOMWNtVWdZMnhoYzNNc0lISmxkSFZ5YmdvZ0lDQWdhV1lnWTNWeVpTQTlQU0J1YVd3Z2RHaGxiZ29nSUNBZ0lDQWdJRzF4TG1OdFpHWW9KeTkwWld4c0lDVnpJR0oxWm1adFpTQWlKWE1pSnl4amRYSmxRMkZ6ZEdWeUxHTjFjbVZUY0dWc2JDa0tJQ0FnSUNBZ0lDQnRjUzVrWld4aGVTZzFNREF3S1FvZ0lDQWdaVzVrSUNBS0lDQWdJQzB0SUdsbUlHTjFjbVVnWVdKcGJHbDBlU0JwYzI0bmRDQnlaV0ZrZVN3Z2NtVjBkWEp1Q2lBZ0lDQnBaaUJ0Y1M1VVRFOHVUV1V1UTJ4bFlXNU9ZVzFsS0NrZ2ZqMGdZM1Z5WlVOaGMzUmxjaUJoYm1RZ2JtOTBJR04xY21WZmNtVmhaSGtvWTNWeVpTa2dkR2hsYmdvZ0lDQWdJQ0J3Y21sdWRHWW9KMEZCSUc1dmRDQnlaV0ZrZVNCaGJtUWdibTkwSUdOaGMzUmxjaXdnWjI5cGJtY2dkRzhnWVhOcklDVnpJR1p2Y2lCamRYSmxPaUFsY3ljc1kzVnlaVU5oYzNSbGNpeGpkWEpsVTNCbGJHd3BDaUFnSUNBZ0lDQWdiWEV1WTIxa1ppZ25MM1JsYkd3Z0pYTWdZblZtWm0xbElDSWxjeUluTEdOMWNtVkRZWE4wWlhJc1kzVnlaVk53Wld4c0tRb2dJQ0FnSUNBZ0lHMXhMbVJsYkdGNUtEVXdNREFwQ2lBZ0lDQmxiSE5sYVdZZ2JYRXVWRXhQTGsxbExrTnNaV0Z1VG1GdFpTZ3BJRDA5SUdOMWNtVkRZWE4wWlhJZ1lXNWtJRzV2ZENCamRYSmxYM0psWVdSNUtHTjFjbVVwSUhSb1pXNEtJQ0FnSUNBZ0lDQndjbWx1ZEdZb0owRkJJRzV2ZENCeVpXRmtlU0JpZFhRZ1NTQmhiU0JqZFhKbElHTmhjM1JsY2l3Z1oyOXBibWNnZEc4Z1kyRnpkQ0JqZFhKbE9pQWxjeWNzWTNWeVpWTndaV3hzS1FvZ0lDQWdJQ0FnSUNBZ0lDQnRjUzVqYldSbUtDY3ZkR0Z5WjJWMElDVnpKeXh0Y1M1VVRFOHVUV1V1VG1GdFpTZ3BLUW9nSUNBZ0lDQWdJQ0FnSUNCdGNTNWtaV3hoZVNnMU1EQXBDaUFnSUNBZ0lDQWdJQ0FnSUdOaGMzUW9iWEV1VkV4UExsTndaV3hzS0dOMWNtVlRjR1ZzYkNrcENpQWdJQ0JsYm1RS0NpQWdJQ0JwWmlCamRYSmxJSDQ5SUc1cGJDQmhibVFnWTNWeVpWOXlaV0ZrZVNoamRYSmxLU0IwYUdWdUNpQWdJQ0FnSUNBZ2NISnBiblJtS0NkQlFTQmpkWEpsSUhWd09pQWxjeWNzWTNWeVpTNXVZVzFsS1FvZ0lDQWdJQ0FnSUhWelpWOWhZU2h0Y1M1VVRFOHVUV1V1UVd4MFFXSnBiR2wwZVNoamRYSmxMbTVoYldVcEtRb2dJQ0FnWlc1a0NpQWdJQ0J0Y1M1a1pXeGhlU2d4TURBd0tRcGxibVFnSUFvZ0NuSmxkSFZ5YmlCN2IyNXNiMkZrUFc5dVgyeHZZV1FzSUdOdmJtUm1kVzVqUFdOdmJtUnBkR2x2Yml3Z1lXTjBhVzl1Wm5WdVl6MWhZM1JwYjI1OSIsCn0=[/CODE]

[CODE lang="Lua" title="Anashti Sul, Damsel of Decay - Other"]local mq = require('mq')
local cureCaster = 'PCName'
local cureSpell ='Eradicate Disease'
local dot1 ='Withering Physicality XIII'
local dot2 ='Withering Faith XIII'
local dot3 ='Withering Limbs XIII'
local cures = {
BST={name="Nature's Salve",type='aa'},
CLR={name='Purified Spirits',type='aa'},
DRU={name='Purified Spirits',type='aa'},
NEC={name='Embrace the Decay',type='aa'},
SHM={name='Purified Spirits',type='aa'},
SHD={name='Purity of Death',type='aa'}
}

local function on_load()
local cure = cures[mq.TLO.Me.Class.ShortName()]
end

local function condition()
if mq.TLO.Me.Buff(dot1).ID() ~= nil or mq.TLO.Me.Buff(dot3).ID() ~= nil then
return true
end
end

local function cast(spell)
mq.cmdf('/cast %s', spell.RankName())
mq.delay(50+spell.MyCastTime())
end

local function use_aa(aa)
mq.cmdf('/alt activate %s', aa.ID())
mq.delay(50+aa.Spell.CastTime())
end

local function cure_ready(cure)
if mq.TLO.Me.Gem(cureSpell)() then
return mq.TLO.Me.SpellReady(cureSpell)() and not mq.TLO.Me.Casting()
elseif cure.type == 'aa' then
return mq.TLO.Me.AltAbilityReady(cure.name)() and not mq.TLO.Me.Casting()
end
end

local function action()
local my_class = mq.TLO.Me.Class.ShortName()
local cure = cures[my_class]
-- if not a cure class, return
if cure == nil then
mq.cmdf('/tell %s buffme "%s"',cureCaster,cureSpell)
mq.delay(5000)
end
-- if cure ability isn't ready, return
if mq.TLO.Me.CleanName() ~= cureCaster and not cure_ready(cure) then
printf('AA not ready and not caster, going to ask %s for cure: %s',cureCaster,cureSpell)
mq.cmdf('/tell %s buffme "%s"',cureCaster,cureSpell)
mq.delay(5000)
elseif mq.TLO.Me.CleanName() == cureCaster and not cure_ready(cure) then
printf('AA not ready but I am cure caster, going to cast cure: %s',cureSpell)
mq.cmdf('/target %s',mq.TLO.Me.Name())
mq.delay(500)
cast(mq.TLO.Spell(cureSpell))
end

if cure ~= nil and cure_ready(cure) then
printf('AA cure up: %s',cure.name)
use_aa(mq.TLO.Me.AltAbility(cure.name))
end
mq.delay(1000)
end

return {onload=on_load, condfunc=condition, actionfunc=action}[/CODE]
 
ok struggling, aim is to check if tank has a specific buff, then send buffme request if i dont find the buff on me

struggling with first line to check buff, though its taken from the jboots exampled , also
the tell line is borked as well. Many thanks


[CODE title="lasssitue buff request"]local mq = require('mq')
local library = require('library')

local buffname = 'Lassitude'

local function condition()

not mq.TLO.Me.Buff(buffname)() and
Write.Debug('ENTER condition')
mq.TLO.Spell(buffname).Stacks() and
mq.TLO.Me.FreeBuffSlots() > 0 and
not mq.TLO.Me.Invis() and
library.in_control()
end

local function action()
Write.Debug('ENTER action')
Write.Info('Requesting Lassitude)
mq.cmdf('/dgt Shamanbox buffme lassitude , name, message )
end
return {condfunc=condition, actionfunc=action}[/CODE]
 
I was messing around trying to figure out LEM.
I made this to check spawnchecker list but I don't know how to make it re-occurring (with custom set timer)

Its saved in my Lem Conditions folder.
 
well ok so now i got it to continually check.
now to make some flags so it doesn't keep spamming me.

nm think i got it so far.
working with a 15min rescan. will figure out flagging and not messaging if the mob has been seen in last 10 min or something.
 

Attachments

Last edited:
ok I got it mostly working, I think.
will check for spawns. beep and either spam or popup message boxes and won't report the same mob if it stays up unless its been over 10 min.
I like the message box pop-ups cause they are tiny and can stay there not getting lost in the spam of combat.Screenshot 2024-01-02 091801.png
 
Last edited:
won't let me export.
you can toggle CaseSensativity
customize delays, messages, and message types.

[CODE lang="Lua" title="SpawnChecker"]local mq = require('mq')
local mq = require('mq')

-- Do not edit this if condition
if not package.loaded['events'] then
print('This script is intended to be imported to Lua Event Manager (LEM). Try "\a-t/Lua run lem\a-x"')
end
local lip = require 'lib.LIP'
-----------------CUSTOMIZABLE VARIABLES-------------------
local scanTimer = 1200 -- number of seconds before notifying you again about the same mob being up still. Default 10 min
local delayTimer = 1.5 -- delay between each mob reported. you can miss some output and duplicate others if this is set to low.
-- your spawn list. default is MQ2SpawnMaster.ini. you can change this since this does not care about zone
-- This means you can shorten the list of duplicate entries. formating is Spawn1=Mobname
-- ThIS IsNOT Case SENSatiVe!
local spawnsFile = 'SpawnList.ini'
local caseSens = true -- by default we are not case sensative, but you can change this here
local messageType = 'message' -- message|boxes You can choose either message /echo's in chat, or boxes (pop-up windows with message and loc)
local doBeep = true -- do you wan to hear beep's?
-- Customize your message below \n indicates a new line leave the 2 %s they are the spawn name and location respectivly.
local messageText = 'Spawn <<%s>> is Up! \nLOC: %s'
----------------------------------------------------------
local config_dir = mq.configDir:gsub('\\', '/') .. '/'
local config_file = 'MQ2SpawnMaster.ini'
if spawnsFile then config_file = spawnsFile end
local foundName = ''
local filePath = string.format('%s%s', config_dir, config_file)
local fileData = {}
local localData = {}
local list = {} -- contains a list of mobs we did find.
local curTime = os.time()
local spawnTime = os.time()
local beep = '/beep'
local LocSpawn = ''
local outPutType = ''
--- Split function
---@param inputstr string
---@param sep string
---@return table
local function split(inputstr, sep)
if type(inputstr) == 'string' then
sep = sep or '%s'
local t = {}
for field, s in string.gmatch(inputstr, "([^" .. sep .. "]*)(" .. sep .. "?)") do
table.insert(t, field)
if s == "" then
return t
end
end
else
return {}
end
end

--- Converts an Lua table created from the ini library to a flat table for use with ListClipper
---@param remoteTbl table Lua table in original format from Spawnmaster.ini conversion
local function convertToLocalFormat(remoteTbl)
local temp = {}
for _, v in pairs(remoteTbl) do
if type(v) == 'table' then
for key, value in pairs(v) do
local categories = split(value, '=')
if categories[2] and string.len(categories[2]) > 0 then
end

table.insert(temp, {
spawn = key,
name = categories[1],
})
end
end
end
return temp
end


--- Loads the SpawnMaster .ini file into a Lua table
---@param file_path any
local function loadfileData(file_path)
local t = {}
mq.cmd((string.format('/echo Loading data from %s', config_file)))
fileData = lip.load(file_path) or {}
t = convertToLocalFormat(fileData) or {}
-- localData = fileData
mq.cmd((string.format('/echo Found %d Spawns', #t)))
return t
end

local function findspawn(spawn)
local mySpawn = mq.TLO.Spawn(string.format('npc "%s"', spawn))
local tmpSpawn = string.format('%s', mySpawn.CleanName())
local tmpLw1 = ''
local tmpLw2 = ''
if not caseSens then
tmpLw1 = string.upper('%s', tmpSpawn)
tmpLw2 = string.upper('%s', spawn)
else
tmpLw1 = tmpSpawn
tmpLw2 = spawn
end
if tmpLw1 == tmpLw2 then
LocSpawn = mySpawn.Loc()
return mySpawn.ID()
end
return 0
end


local function on_load()
-- Perform any initial setup here when the event is loaded.

-- load the Spawn List. We only need to do this once. you can reload the file by restarting the Lua.
localData = loadfileData(filePath)
if messageType == 'message' then outPutType = '/echo' else outPutType = '/msgbox' end
if doBeep then
messageText = '/multiline ; ' .. beep .. '; ' .. outPutType .. ' ' .. messageText
else
messageText = '/multiline ; ' .. outPutType .. ' ' .. messageText
end
end

---@return boolean @Returns true if the action should fire, otherwise false.
local function condition()
-- Implement the condition to evaluate here.
local tmpName = nil
local spawnCount = #localData
local foundLoc = nil
for i = 1, spawnCount do
if findspawn(localData.name) ~= 0 then
spawnTime = os.time()
foundName = string.format('%s', localData.name)
local found = false
for j = 1, #list do
if list[j].name == foundName then
list[j].flag = true
found = true
break
end
end
if not found then
table.insert(list, {
name = foundName,
loc = LocSpawn,
seen = spawnTime,
flag = false,
})
end
end
end
mq.delay(delayTimer)
if list[1] then
return true
else
return false
end
end

local function action()

local currentTime = os.time()
local removalIndices = {} -- To store indices that need to be removed

if #list > 0 then
for i = 1, #list do
if list.flag then
if currentTime - list.seen > scanTimer then
-- Mark for removal
table.insert(removalIndices, i)
end
else
mq.cmd(string.format(messageText, (string.upper(list.name)), list.loc))
--mq.cmd(string.format('/multiline ; /beep; /echo <<%s>> is UP! LOC: %s', (string.upper(list.name)), list.loc))
--mq.cmd(string.format('%s Spawn <<%s>> is Up! \nLOC: %s ', messageText, (string.upper(list.name)), list.loc))
list.flag = true
end
mq.delay(delayTimer) -- slight pause for sanity
end

-- Remove marked entries
for i = #removalIndices, 1, -1 do
table.remove(list, removalIndices)
end
end
end

return {onload=on_load, condfunc=condition, actionfunc=action}
[/CODE]


also attached my spawn list file. removed all of the duplicates and numbered the spawn#=
 

Attachments

Last edited:
hello all i am trying to get a updated lem that is download and opens in notepad into my Lua event manger and confused on how to do this with out being able to copy code to clipboard and inport it
 
new to LEM was told by another its a must have on some things.... No mistake it is a must have i do love it, if your thinking about getting this an waiting then let me help you out.... GET IT! lol its well worth it an helps a ton.
 
I updated post#129 this checks if your pause before casting.
LEM for targeting your pet and casting illusions. Plugins do not handle this.
I am using Emperor Ssraeshza as an example. Just replace the name.

[CODE title="LEM for targeting your pet and casting illusions:"]cmV0dXJuIHsKIFsibG9hZCJdID0gewogIFsiem9uZSJdID0gIiIsCiAgWyJjbGFzcyJdID0gIiIsCiAgWyJhbHdheXMiXSA9IGZhbHNlLAogfSwKIFsibmFtZSJdID0gIkVtcGVyb3IgU3NyYWVzaHphIiwKIFsidHlwZSJdID0gImNvbmRpdGlvbnMiLAogWyJjb2RlIl0gPSAiYkc5allXd2diWEVnUFNCeVpYRjFhWEpsS0NkdGNTY3BDbXh2WTJGc0lHWjFibU4wYVc5dUlHTnZibVJwZEdsdmJpZ3BDZ3B0Y1M1a1pXeGhlU2duTW5NbktRcHBaaUFvZEc5emRISnBibWNvYlhFdVZFeFBMbEJsZEM1Q2RXWm1LQ2RRWlhRZ1NXeHNkWE5wYjI0NklFVnRjR1Z5YjNJZ1UzTnlZV1Z6YUhwaEp5a3BJRDA5SUNkT1ZVeE1KeWtnWVc1a0lHMXhMbFJNVHk1TlpTNVFaWFF1U1VRb0tTQitQU0F3SUdGdVpDQnViM1FnYlhFdVZFeFBMazFsTGtsdWRtbHpLQ2tnWVc1a0lHNXZkQ0J0Y1M1VVRFOHVUV1V1UTJGemRHbHVaeTVKUkNncElHRnVaQ0J0Y1M1VVRFOHVUV1V1V0ZSaGNtZGxkQ2dwSUdGdVpDQnViM1FnYlhFdVZFeFBMa05YVkU0dVVHRjFjMlZrS0NrZ2RHaGxiZ29nYlhFdVkyMWtLQ2N2WW05NGNpQlFZWFZ6WlNjcENpQnRjUzVrWld4aGVTZ25NWE1uS1FvZ2JYRXVZMjFrS0NjdmRHRnlaMlYwSUhCbGRDQnBaQ0FuSUM0dUlIUnZjM1J5YVc1bktHMXhMbFJNVHk1TlpTNVFaWFF1U1VRb0tTa3BDaUJ0Y1M1a1pXeGhlU2duTVhNbktRb2diWEV1WTIxa0tDY3ZkWE5sYVhSbGJTQWlUV1YwWVcxdmNuQm9JRmRoYm1RZ0xTQkZiWEJsY205eUlGTnpjbUZsYzJoNllTSW5LUW9nYlhFdVpHVnNZWGtvSnpaekp5a0tJRzF4TG1OdFpDZ25MMkp2ZUhJZ2RXNXdZWFZ6WlNjcENpQmxibVFnSUFvS0lDQWdJQ0FnSUNBS0lDQWdJQ0FnQ2dvZ0lDQWdJQ0FnQ2dvS1pXNWtDbkpsZEhWeWJpQjdZMjl1WkdaMWJtTTlZMjl1WkdsMGFXOXVmUT09IiwKIFsiY2F0ZWdvcnkiXSA9ICJVbHRpbHR5IiwKfQ==[/CODE]

Code:
local mq = require('mq')
local function condition()

mq.delay('2s')
if (tostring(mq.TLO.Pet.Buff('Pet Illusion: Emperor Ssraeshza')) == 'NULL') and mq.TLO.Me.Pet.ID() ~= 0 and not mq.TLO.Me.Invis() and not mq.TLO.Me.Casting.ID() and mq.TLO.Me.XTarget() and not mq.TLO.CWTN.Paused() then
 mq.cmd('/boxr Pause')
 mq.delay('1s')
 mq.cmd('/target pet id ' .. tostring(mq.TLO.Me.Pet.ID()))
 mq.delay('1s')
 mq.cmd('/useitem "Metamorph Wand - Emperor Ssraeshza"')
 mq.delay('6s')
 mq.cmd('/boxr unpause')
 end

        
      

      


end
return {condfunc=condition}
 
Shadowhaven - One door RAID - Charm lem

lem for use in the one door RAID in Shadowhaven, not the misson. This will pause the toon, run to a location far enough to avoid the charm by the eye, and then return.

This is my first publically posted Lua, so comments and suggestions are more than welcome! Thank you @aquietone for walking me through this, putting up with my silly questions, and providing 90% of the structure for this!

Note - occasionally the run location from the emote will overlap with the whirling debris spawning and thus result in the toon taking an untimely death. You can edit the location it runs to if you like, but I found it so rare that it was not worth it.

[CODE lang="ini" title="import lem"]cmV0dXJuIHsKIFsibG9hZCJdID0gewogIFsiY2xhc3MiXSA9ICIiLAogIFsiYWx3YXlzIl0gPSBmYWxzZSwKICBbInpvbmUiXSA9ICIiLAogfSwKIFsidHlwZSJdID0gImV2ZW50cyIsCiBbImNhdGVnb3J5Il0gPSAiTm9TIiwKIFsibmFtZSJdID0gIk9uZWRvb3JyYWlkIiwKIFsicGF0dGVybiJdID0gIiMqI1RoZSBtb25zdHJvc2l0eSdzIHNpbmdsZSBib2JiaW5nIGV5ZSB0dXJucyB0b3dhcmQgIzEjLiMqIyIsCiBbImNvZGUiXSA9ICJiRzlqWVd3Z2JYRWdQU0J5WlhGMWFYSmxLQ2R0Y1NjcENteHZZMkZzSUdaMWJtTjBhVzl1SUdWMlpXNTBYMmhoYm1Sc1pYSW9iR2x1WlN3Z2RHRnlaMlYwS1FvZ0lDQWdhV1lnYm05MElHMXhMbFJNVHk1YWIyNWxMbE5vYjNKMFRtRnRaU2dwSUQwOUlDZHphR0ZrYjNkb1lYWmxiblIzYjE5eVlXbGtKeUIwYUdWdUlISmxkSFZ5YmlCbGJtUUtJQ0FnSUd4dlkyRnNJRzE1WDJOc1lYTnpJRDBnYlhFdVZFeFBMazFsTGtOc1lYTnpMbE5vYjNKMFRtRnRaU2dwQ2lBZ0lDQnNiMk5oYkNCcFgyRnRYMjFoSUQwZ2JYRXVWRXhQTGtkeWIzVndMazFsYldKbGNpZ3dLUzVOWVdsdVFYTnphWE4wS0NrS0lDQWdJR3h2WTJGc0lHMTVYMjVoYldVZ1BTQnRjUzVVVEU4dVRXVXVRMnhsWVc1T1lXMWxLQ2tLSUNBZ0lHeHZZMkZzSUcxaFgyNWhiV1VnUFNCdGNTNVVURTh1UjNKdmRYQXVUV0ZwYmtGemMybHpkQzVEYkdWaGJrNWhiV1VvS1FvZ0lDQWdhV1lnYm05MElHbGZZVzFmYldFZ1lXNWtJSFJoY21kbGREcG1hVzVrS0cxNVgyNWhiV1VwSUhSb1pXNEtJQ0FnSUNBZ0lDQnBaaUJ0ZVY5amJHRnpjeUE5UFNBblFrVlNKeUJoYm1RZ2JYRXVWRXhQTGsxbExrRmpkR2wyWlVScGMyTXVUbUZ0WlNncElEMDlJRzF4TGxSTVR5NVRjR1ZzYkNnblJuSmxibnBwWldRZ1VtVnpiMngyWlNCRWFYTmphWEJzYVc1bEp5a3VVbUZ1YTA1aGJXVW9LU0IwYUdWdUNpQWdJQ0FnSUNBZ0lDQWdJRzF4TG1OdFpDZ25MM04wYjNCa2FYTmpKeWtLSUNBZ0lDQWdJQ0JsYm1RS0lDQWdJQ0FnSUNCdGNTNWpiV1JtS0NjdkpYTWdiVzlrWlNBd0p5d2diWGxmWTJ4aGMzTXBDaUFnSUNBZ0lDQWdiWEV1WTIxa0tDY3ZiWEZ3SUc5dUp5a0tJQ0FnSUNBZ0lDQnRjUzVqYldRb0p5OTBkMmx6ZENCdlptWW5LUW9nSUNBZ0lDQWdJRzF4TG1OdFpDZ25MM1JwYldWa0lEVWdMMkZtYjJ4c2IzY2diMlptSnlrS0lDQWdJQ0FnSUNCdGNTNWpiV1FvSnk5dVlYWWdjM1J2Y0NjcENpQWdJQ0FnSUNBZ2JYRXVZMjFrS0NjdmRHRnlaMlYwSUdOc1pXRnlKeWtLSUNBZ0lDQWdJQ0J0Y1M1a1pXeGhlU2d4TURBcENpQWdJQ0FnSUNBZ2JYRXVZMjFrS0NjdmJtRjJJR3h2WXlBNE1qQXVOak1nTFRZMU5pNDJPU0F0T0RndU5EVW5LUW9nSUNBZ0lDQWdJRzF4TG1SbGJHRjVLREV5TURBd0tRb2dJQ0FnSUNBZ0lHMXhMbU50WkdZb0p5OGxjeUJ0YjJSbElESW5MQ0J0ZVY5amJHRnpjeWtLSUNBZ0lDQWdJQ0J0Y1M1amJXUW9KeTl0Y1hBZ2IyWm1KeWtLSUNBZ0lDQWdJQ0J0Y1M1amJXUW9KeTkwZDJsemRDQnZiaWNwQ2lBZ0lDQmxibVFLWlc1a0NncHlaWFIxY200Z2UyVjJaVzUwWm5WdVl6MWxkbVZ1ZEY5b1lXNWtiR1Z5ZlE9PSIsCn0=[/CODE]

Event Pattern - #*#The monstrosity's single bobbing eye turns toward #1#.#*#

[CODE lang="Lua" title="Lua"]local mq = require('mq')
local function event_handler(line, target)
if not mq.TLO.Zone.ShortName() == 'shadowhaventwo_raid' then return end
local my_class = mq.TLO.Me.Class.ShortName()
local i_am_ma = mq.TLO.Group.Member(0).MainAssist()
local my_name = mq.TLO.Me.CleanName()
local ma_name = mq.TLO.Group.MainAssist.CleanName()
if not i_am_ma and target:find(my_name) then
if my_class == 'BER' and mq.TLO.Me.ActiveDisc.Name() == mq.TLO.Spell('Frenzied Resolve Discipline').RankName() then
mq.cmd('/stopdisc')
end
mq.cmdf('/%s mode 0', my_class)
mq.cmd('/mqp on')
mq.cmd('/twist off')
mq.cmd('/timed 5 /afollow off')
mq.cmd('/nav stop')
mq.cmd('/target clear')
mq.delay(100)
mq.cmd('/nav loc 820.63 -656.69 -88.45')
mq.delay(12000)
mq.cmdf('/%s mode 2', my_class)
mq.cmd('/mqp off')
mq.cmd('/twist on')
end
end

return {eventfunc=event_handler}[/CODE]
 
Last edited:
Probably a better way to go about this but LEM will dump items off your cursor in 20 seconds, or immediately if you are in combat

[CODE title="LEM import"]cmV0dXJuIHsKIFsiY29kZSJdID0gImJHOWpZV3dnYlhFZ1BTQnlaWEYxYVhKbEtDZHRjU2NwQ2dwc2IyTmhiQ0JtZFc1amRHbHZiaUJqYjI1a2FYUnBiMjRvS1FvZ0lDQWdjbVYwZFhKdUlHMXhMbFJNVHk1RGRYSnpiM0l1U1VRb0tTQitQU0J1YVd3S1pXNWtDZ3BzYjJOaGJDQm1kVzVqZEdsdmJpQmhZM1JwYjI0b0tRb2dJQ0JqZFhKemIzSkpkR1Z0SUQwZ2JYRXVWRXhQTGtOMWNuTnZjaTVPWVcxbEtDa0tJQ0FnWTI5dFltRjBJRDBnYlhFdVZFeFBMazFsTGtOdmJXSmhkRk4wWVhSbEtDa0tJQ0FnYkc5allXd2daR1ZzWVhsNklEMGdNakF3TURBS0lDQWdiRzlqWVd3Z1pHVnNZWGwwWlhoMENnb2dJQ0JwWmlCamIyMWlZWFFnUFQwZ0owTlBUVUpCVkNjZ2RHaGxiZ29nSUNBZ0lDQWdaR1ZzWVhsNklEMGdNVEF3Q2lBZ0lDQWdJQ0JrWld4aGVYUmxlSFFnUFNBaWJtOTNJZ29nSUNCbGJITmxDaUFnSUNBZ0lDQmtaV3hoZVhvZ1BTQXlNREF3TUFvZ0lDQWdJQ0FnWkdWc1lYbDBaWGgwSUQwZ0luUjNaVzUwZVNJS0lDQWdaVzVrQ2lBZ0lDQUtJQ0FnSUcxeExtTnRaR1lvSWk5a1ozUWdMUzArSUNWeklHOXVJR04xY25OdmNpNGdRWFYwYnlCcGJuWmxiblJ2Y25rZ2FXNGdKWE1nYzJWamIyNWtjeTRpTENCamRYSnpiM0pKZEdWdExDQmtaV3hoZVhSbGVIUXBDaUFnSUNCdGNTNWtaV3hoZVNoa1pXeGhlWG9zSUdaMWJtTjBhVzl1S0NrZ2NtVjBkWEp1SUcxeExsUk1UeTVEZFhKemIzSXVTVVFvS1NBOVBTQnVhV3dnWlc1a0tRb2dJQ0FnTFMxdGNTNWtaV3hoZVNoa1pXeGhlWG9wQ2lBZ0lDQnBaaUJ0Y1M1VVRFOHVRM1Z5YzI5eUxrbEVLQ2tnZmowZ2JtbHNJSFJvWlc0S0lDQWdJQ0FnSUcxeExtTnRaQ2duTDJSbmVtRWdMMkYxZEc5cGJuWW5LUW9nSUNBZ1pXNWtDbVZ1WkFvS2NtVjBkWEp1SUh0amIyNWtablZ1WXoxamIyNWthWFJwYjI0c0lHRmpkR2x2Ym1aMWJtTTlZV04wYVc5dWZRPT0iLAogWyJuYW1lIl0gPSAiSXRlbV9vbl9DdXJzb3IiLAogWyJ0eXBlIl0gPSAiY29uZGl0aW9ucyIsCiBbImxvYWQiXSA9IHsKICBbImNsYXNzIl0gPSAiIiwKICBbImFsd2F5cyJdID0gZmFsc2UsCiAgWyJ6b25lIl0gPSAiIiwKIH0sCiBbImNhdGVnb3J5Il0gPSAiQWxsU3R1ZmYiLAp9[/CODE]


[CODE title="Code"]local mq = require('mq')

local function condition()
return mq.TLO.Cursor.ID() ~= nil
end

local function action()
cursorItem = mq.TLO.Cursor.Name()
combat = mq.TLO.Me.CombatState()
local delayz = 20000
local delaytext

if combat == 'COMBAT' then
delayz = 100
delaytext = "now"
else
delayz = 20000
delaytext = "twenty"
end

mq.cmdf("/dgt --> %s on cursor. Auto inventory in %s seconds.", cursorItem, delaytext)
mq.delay(delayz, function() return mq.TLO.Cursor.ID() == nil end)
--mq.delay(delayz)
if mq.TLO.Cursor.ID() ~= nil then
mq.cmd('/dgza /autoinv')
end
end

return {condfunc=condition, actionfunc=action}[/CODE]
 
Ok well I know this is two simple little Scripts to monitor if your character is out of food and drink. I am always forgetting because I may have too many windows open and can't see so did this Lua. Hope others might find it useful

[CODE title="Out of Drink" highlight="2"]Out of Drink
cmV0dXJuIHsKIGNhdGVnb3J5ID0gIk1pc2MgLSBRdWFpbGl0eSBvZiBMaWZlIiwKIGxvYWQgPSB7CiAgYWx3YXlzID0gZmFsc2UsCiAgem9uZSA9ICIiLAogIGNsYXNzID0gIiIsCiB9LAogcGF0dGVybiA9ICIjKiNZb3UgYXJlIG91dCBvZiBkcmluay4jKiMiLAogY29kZSA9ICJiRzlqWVd3Z2JYRWdQU0J5WlhGMWFYSmxLQ2R0Y1NjcENncHNiMk5oYkNCbWRXNWpkR2x2YmlCbGRtVnVkRjlvWVc1a2JHVnlLQ2tLSUNBZ0lHMXhMbU50WkNnbkwyUm5kQ0JoYkd3Z1NTQmhiU0J2ZFhRZ2IyWWdSSEpwYm1zaEp5a0taVzVrQ2dweVpYUjFjbTRnZXlCbGRtVnVkR1oxYm1NZ1BTQmxkbVZ1ZEY5b1lXNWtiR1Z5SUgwPSIsCiB0eXBlID0gImV2ZW50cyIsCiBuYW1lID0gIm91dG9mZHJpbmsiLAp9[/CODE]

[CODE title="Out of Food" highlight="2"]Out of Food
cmV0dXJuIHsKIGNhdGVnb3J5ID0gIk1pc2MgLSBRdWFpbGl0eSBvZiBMaWZlIiwKIGxvYWQgPSB7CiAgYWx3YXlzID0gZmFsc2UsCiAgem9uZSA9ICIiLAogIGNsYXNzID0gIiIsCiB9LAogcGF0dGVybiA9ICIjKiNZb3UgYXJlIG91dCBvZiBGb29kLiMqIyIsCiBjb2RlID0gImJHOWpZV3dnYlhFZ1BTQnlaWEYxYVhKbEtDZHRjU2NwQ2dwc2IyTmhiQ0JtZFc1amRHbHZiaUJsZG1WdWRGOW9ZVzVrYkdWeUtDa0tJQ0FnSUcxeExtTnRaQ2duTDJSbmRDQmhiR3dnU1NCaGJTQnZkWFFnYjJZZ1JtOXZaQ0VuS1FwbGJtUUtDbkpsZEhWeWJpQjdJR1YyWlc1MFpuVnVZeUE5SUdWMlpXNTBYMmhoYm1Sc1pYSWdmUT09IiwKIHR5cGUgPSAiZXZlbnRzIiwKIG5hbWUgPSAib3V0b2Zmb29kIiwKfQ==[/CODE]
 
I am wanting to work on a Shei event for Raid version similar to the Baning but for curing. I am basically understand the steps needed except for how to get the charname to target out of the message.
I get that it would be : Pattern: #*##1# You are unworthy.#*# or Pattern: #*##1#,#2#, #3#, You are unworthy.#*# but I can't figure out how to get the #1# etc values into the mq.cmd('/target.....'), is it mq.cmd('/target %s') ?
 
I am wanting to work on a Shei event for Raid version similar to the Baning but for curing. I am basically understand the steps needed except for how to get the charname to target out of the message.
I get that it would be : Pattern: #*##1# You are unworthy.#*# or Pattern: #*##1#,#2#, #3#, You are unworthy.#*# but I can't figure out how to get the #1# etc values into the mq.cmd('/target.....'), is it mq.cmd('/target %s') ?
the #1#, #2# etc can be read in the lem, so for instance
pattern =
#*#I am calling these toons #1#, #2#, and #3#.#*#

the function=
Code:
local function event_handler(line, name1, name2, name3)
    cmdf('/mqtarget %s', name1)
    printf('Targeting %s', name1)
    cmdf('/mqtarget %s', name2)
    printf('Targeting %s', name3)
    cmdf('/mqtarget %s', name3)
    printf('Targeting %s', name3)
end

emote happens:
I am calling these toons Bob, James, and Tony.
Targeting Bob
Targeting James
Targeting Tony

you of course would want to do whatever you need to between those targeting steps. the "F" in cmdf and printf, is what allows you to put the name in for the %s.
 
Your toons do not auto cure each other? I am guessing you play on more than one computer. I use a paladin splash lem for aoe twincast cure and let the healers get any left over cures.
 
I play on two on the same network so it is more for when I am in a raid with guild and the ones not easily reachable in the moment need to do cures.

Thank you for the help Trapper
 
OK I get that now. I just do shie by myself so all cures are easy. If I do add others I make sure they have a curer in the grp with them.. :)
 
Sharing this LEM that I use for AFK xping. Sometimes the mobs nuke me from outside of campradius, which causes a pet to run outside of radius and engage the mob. This LEM runs on the tank, and checks for when there is an xtarget, but no current target. It will set the xtarget to current target, then tell all the mages to send their pets. I plan to extend this eventually into something more general, maybe set everyone to chase, go kill it, then return to camp and go back to camp mode...

[CODE lang="Lua" title="Check for Xtarget mob that is outside of camp radius"]local mq = require('mq')

---@return boolean @Returns true if the action should fire, otherwise false.
local function on_load()
-- Perform any initial setup here when the event is loaded.
end

local function condition()
return true
end

local function action()
if mq.TLO.Me.XTarget() > 0 then
if not mq.TLO.Target() then
mq.cmdf('/target npc %s', mq.TLO.Me.XTarget(1).CleanName())
end
end
if mq.TLO.Target() then
if mq.TLO.Target.PctHPs() < 90 then
mq.cmdf('/dge mag /target npc %s', mq.TLO.Target.CleanName())
mq.cmdf('/dge mag /pet attack')
end
end
mq.delay(1000)
end

return {onload=on_load, condfunc=condition, actionfunc=action}[/CODE]

Edit: Updated the xtarget check to if mq.TLO.Me.XTarget() > 1 since nothing on xtarget makes it return 1 not 0
Edit again: I think this might be just server not updating quickly on emu. Changed it back to > 0 , but sometimes it will try to set a target when there isn't one.
 
Last edited:
I tend to use a lot of Pet classes so I tweaked the lem event to just use which ever Metamorph item the character has in inventory. I can swap pet illusions by just swapping the metamorph item on my toon and clicking off the buff on my pet.

It will only fire if the CWTN plugins are not paused and I plan to add a check to disable this event if non-pet class

[CODE lang="ini" title="import lem"]cmV0dXJuIHsKIFsibG9hZCJdID0gewogIFsiYWx3YXlzIl0gPSBmYWxzZSwKICBbInpvbmUiXSA9ICIiLAogIFsiY2xhc3MiXSA9ICIiLAogfSwKIFsiY2F0ZWdvcnkiXSA9ICJQZXRzIiwKIFsidHlwZSJdID0gImNvbmRpdGlvbnMiLAogWyJjb2RlIl0gPSAiYkc5allXd2diWEVnUFNCeVpYRjFhWEpsS0NkdGNTY3BDbXh2WTJGc0lHWjFibU4wYVc5dUlHTnZibVJwZEdsdmJpZ3BDZ3BwWmlBb2JYRXVWRXhQTGtacGJtUkpkR1Z0S0NKTlpYUmhiVzl5Y0dnZ0lpa3VTVVFvS1NCaGJtUWdkRzl6ZEhKcGJtY29iWEV1VkV4UExsQmxkQzVDZFdabUtDSlFaWFFnU1d4c2RYTnBiMjRpS1NrZ1BUMGdKMDVWVEV3bktTQWdZVzVrSUcxeExsUk1UeTVEVjFST0xsQmhkWE5sWkNncElINDlJSFJ5ZFdVZ1lXNWtJRzF4TGxSTVR5NU5aUzVRWlhRdVNVUW9LU0IrUFNBd0lHRnVaQ0J1YjNRZ2JYRXVWRXhQTGsxbExrbHVkbWx6S0NrZ1lXNWtJRzV2ZENCdGNTNVVURTh1VFdVdVEyRnpkR2x1Wnk1SlJDZ3BJR0Z1WkNCdGNTNVVURTh1VFdVdVdGUmhjbWRsZENncElIUm9aVzRLQ2lCc2IyTmhiQ0JOYjNKd2FFbDBaVzBnUFNCdGNTNVVURTh1Um1sdVpFbDBaVzBvSWsxbGRHRnRiM0p3YUNBaUtTNU9ZVzFsS0NrZ0NpQnRjUzVqYldRb0p5OTBZWEpuWlhRZ2NHVjBJR2xrSUNjZ0xpNGdkRzl6ZEhKcGJtY29iWEV1VkV4UExrMWxMbEJsZEM1SlJDZ3BLU2tLSUcxeExtUmxiR0Y1S0NjeGN5Y3BDaUJ3Y21sdWRDQW9JbFZ6YVc1bklDSXNJRTF2Y25Cb1NYUmxiU2tLSUcxeExtTnRaR1lvSnk5MWMyVnBkR1Z0SUNJbGN5SW5MRTF2Y25Cb1NYUmxiU2tLSUcxeExtUmxiR0Y1S0NjemN5Y3BDZ29nWlc1a0NncGxibVFLY21WMGRYSnVJSHRqYjI1a1puVnVZejFqYjI1a2FYUnBiMjU5IiwKIFsibmFtZSJdID0gIlBldCBJbGx1c2lvbiIsCn0=[/CODE]

[CODE lang="Lua" title="Lua event"]
local mq = require('mq')
local function condition()

if (mq.TLO.FindItem("Metamorph ").ID() and tostring(mq.TLO.Pet.Buff("Pet Illusion")) == 'NULL') and mq.TLO.CWTN.Paused() ~= true and mq.TLO.Me.Pet.ID() ~= 0 and not mq.TLO.Me.Invis() and not mq.TLO.Me.Casting.ID() and mq.TLO.Me.XTarget() then

local MorphItem = mq.TLO.FindItem("Metamorph ").Name()
mq.cmd('/target pet id ' .. tostring(mq.TLO.Me.Pet.ID()))
mq.delay('1s')
print ("Using ", MorphItem)
mq.cmdf('/useitem "%s"',MorphItem)
mq.delay('3s')

end

end
return {condfunc=condition}
[/CODE]
 
Someone asked in Discord earlier about a HUD for Dots/Debuffs on target cast by You.

This will only show when you have a target and the target has any non beneficial buff cast by you.
  • Displays buff name : Duration left.
  • Changes colors when duration is 18 seconds or less.
  • you can click to recast if it is a spell.
1709970415917.png

just Import the code below.

[CODE title="Dots"]cmV0dXJuIHsKIFsibmFtZSJdID0gIkRvdHMiLAogWyJ0eXBlIl0gPSAiY29uZGl0aW9ucyIsCiBbImxvYWQiXSA9IHsKICBbImFsd2F5cyJdID0gZmFsc2UsCiAgWyJ6b25lIl0gPSAiIiwKICBbImNsYXNzIl0gPSAiIiwKIH0sCiBbImNhdGVnb3J5Il0gPSAiIiwKIFsiY29kZSJdID0gImJHOWpZV3dnYlhFZ1BTQnlaWEYxYVhKbEtDZHRjU2NwQ25KbGNYVnBjbVVvSWtsdFIzVnBJaWtLYkc5allXd2daM1ZwVDNCbGJpQTlJR1poYkhObENncHNiMk5oYkNCbWRXNWpkR2x2YmlCblpYUkVkWEpoZEdsdmJpaHBLUW9nSUNBZ2JHOWpZV3dnY21WdFlXbHVhVzVuSUQwZ2JYRXVWRXhQTGxSaGNtZGxkQzVDZFdabUtHa3BMa1IxY21GMGFXOXVLQ2tnYjNJZ01Bb2dJQ0FnY21WdFlXbHVhVzVuSUQwZ2NtVnRZV2x1YVc1bklDOGdNVEF3TUNBdExTQmpiMjUyWlhKMElIUnZJSE5sWTI5dVpITUtJQ0FnSUMwdElFTmhiR04xYkdGMFpTQm9iM1Z5Y3l3Z2JXbHVkWFJsY3l3Z1lXNWtJSE5sWTI5dVpITUtJQ0FnSUd4dlkyRnNJR2dnUFNCdFlYUm9MbVpzYjI5eUtISmxiV0ZwYm1sdVp5QXZJRE0yTURBcElHOXlJREFLSUNBZ0lISmxiV0ZwYm1sdVp5QTlJSEpsYldGcGJtbHVaeUFsSURNMk1EQWdMUzBnY21WdFlXbHVhVzVuSUhObFkyOXVaSE1nWVdaMFpYSWdjbVZ0YjNacGJtY2dhRzkxY25NS0lDQWdJR3h2WTJGc0lHMGdQU0J0WVhSb0xtWnNiMjl5S0hKbGJXRnBibWx1WnlBdklEWXdLU0J2Y2lBd0NpQWdJQ0JzYjJOaGJDQnpJRDBnY21WdFlXbHVhVzVuSUNVZ05qQWdJQ0FnSUMwdElISmxiV0ZwYm1sdVp5QnpaV052Ym1SeklHRm1kR1Z5SUhKbGJXOTJhVzVuSUcxcGJuVjBaWE1LSUNBZ0lDMHRJRVp2Y20xaGRDQjBhR1VnZEdsdFpTQnpkSEpwYm1jZ1lYTWdTQ0E2SUUwZ09pQlRDaUFnSUNCc2IyTmhiQ0J6VW1WdFlXbHVhVzVuSUQwZ2MzUnlhVzVuTG1admNtMWhkQ2dpSlRBeVpEb2xNREprSWl3Z2JTd2djeWtLSUNBZ0lISmxkSFZ5YmlCelVtVnRZV2x1YVc1bkNtVnVaQW9LYkc5allXd2dablZ1WTNScGIyNGdZMjkxYm5STmVVUnZkSE1vWkdWaWRXWm1RMjkxYm5RcENpQWdJQ0JzYjJOaGJDQkVSVUpWUmtZZ1BTQnRjUzVVVEU4dVZHRnlaMlYwTGtKMVptWUtJQ0FnSUd4dlkyRnNJRzE1Ukc5MGN5QTlJREFLSUNBZ0lHWnZjaUJwSUQwZ01Td2daR1ZpZFdabVEyOTFiblFnWkc4S0lDQWdJQ0FnSUNCcFppQkVSVUpWUmtZb2FTbCtQU0J1YVd3Z1lXNWtJRVJGUWxWR1JpaHBLUzVEWVhOMFpYSW9LU0E5UFNCdGNTNVVURTh1VFdVdVJHbHpjR3hoZVU1aGJXVW9LU0JoYm1RZ2JtOTBJRVJGUWxWR1JpaHBLUzVDWlc1bFptbGphV0ZzS0NrZ2RHaGxiZ29nSUNBZ0lDQWdJQ0FnSUNCdGVVUnZkSE1nUFNCdGVVUnZkSE1nS3lBeENpQWdJQ0FnSUNBZ1pXNWtDaUFnSUNCbGJtUUtJQ0FnSUhKbGRIVnliaUJ0ZVVSdmRITUtaVzVrQ2dvdExTMUFjR0Z5WVcwZ1JFVkNWVVpHSUUxUlFuVm1aZ3BzYjJOaGJDQm1kVzVqZEdsdmJpQmtjbUYzUkdWaWRXWm1jeWhrWldKMVptWkRiM1Z1ZEN3Z1JFVkNWVVpHS1FvZ0lDQWdiRzlqWVd3Z2MzUnlhVzVuSUQwZ0p5Y0tJQ0FnSUdadmNpQnBJRDBnTVN3Z1pHVmlkV1ptUTI5MWJuUWdaRzhLSUNBZ0lDQWdJQ0J6ZEhKcGJtY2dQU0FuSndvZ0lDQWdJQ0FnSUdsbUlFUkZRbFZHUmlocEtYNDlJRzVwYkNCaGJtUWdSRVZDVlVaR0tHa3BMa05oYzNSbGNpZ3BJRDA5SUcxeExsUk1UeTVOWlM1RWFYTndiR0Y1VG1GdFpTZ3BJR0Z1WkNCdWIzUWdSRVZDVlVaR0tHa3BMa0psYm1WbWFXTnBZV3dvS1NCMGFHVnVDaUFnSUNBZ0lDQWdJQ0FnSUd4dlkyRnNJR1IxY2lBOUlHZGxkRVIxY21GMGFXOXVLR2twQ2lBZ0lDQWdJQ0FnSUNBZ0lHeHZZMkZzSUdSMWNsTmxZMjl1WkhNZ1BTQkVSVUpWUmtZb2FTa3VSSFZ5WVhScGIyNHVWRzkwWVd4VFpXTnZibVJ6S0NrZ2IzSWdNQW9nSUNBZ0lDQWdJQ0FnSUNCc2IyTmhiQ0J1WVcxbElEMGdSRVZDVlVaR0tHa3BMazVoYldVb0tRb2dJQ0FnSUNBZ0lDQWdJQ0J6ZEhKcGJtY2dQU0J6ZEhKcGJtY3VabTl5YldGMEtDSWxjMXgwWEhSY2RGeDBYSFJjZENJc0lHNWhiV1VwQ2lBZ0lDQWdJQ0FnSUNBZ0lFbHRSM1ZwTGtKbFoybHVSM0p2ZFhBb0tRb2dJQ0FnSUNBZ0lDQWdJQ0JwWmlCa2RYSlRaV052Ym1SeklEdzlJREU0SUhSb1pXNEtDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkpiVWQxYVM1UWRYTm9VM1I1YkdWRGIyeHZjaWhKYlVkMWFVTnZiQzVVWlhoMExERXVNQ3d3TERBc01Ta0tJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lFbHRSM1ZwTGxSbGVIUW9jM1J5YVc1bktRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1NXMUhkV2t1VTJGdFpVeHBibVVvU1cxSGRXa3VSMlYwVjJsdVpHOTNWMmxrZEdnb0tTQXRJRFkxS1FvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnU1cxSGRXa3VWR1Y0ZENoa2RYSXBDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkpiVWQxYVM1UWIzQlRkSGxzWlVOdmJHOXlLQ2tLSUNBZ0lDQWdJQ0FnSUNBZ1pXeHpaUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdTVzFIZFdrdVZHVjRkQ2h6ZEhKcGJtY3BDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkpiVWQxYVM1VFlXMWxUR2x1WlNoSmJVZDFhUzVIWlhSWGFXNWtiM2RYYVdSMGFDZ3BJQzBnTmpVcENpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCSmJVZDFhUzVVWlhoMEtHUjFjaWtLSUNBZ0lDQWdJQ0FnSUNBZ1pXNWtDaUFnSUNBZ0lDQWdJQ0FnSUVsdFIzVnBMa1Z1WkVkeWIzVndLQ2tLSUNBZ0lDQWdJQ0FnSUNBZ0xTMGdZMnhwWTJzZ2RHOGdZMkZ6ZEFvZ0lDQWdJQ0FnSUNBZ0lDQnBaaUJKYlVkMWFTNUpjMGwwWlcxSWIzWmxjbVZrS0NrZ2RHaGxiZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnU1cxSGRXa3VTWE5OYjNWelpWSmxiR1ZoYzJWa0tEQXBJSFJvWlc0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnRjUzVqYldSbUtDY3ZZMkZ6ZENBaUpYTWlKeXh1WVcxbEtRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1pXNWtDaUFnSUNBZ0lDQWdJQ0FnSUdWdVpBb2dJQ0FnSUNBZ0lHVnVaQW9nSUNBZ1pXNWtDbVZ1WkFvS0NtWjFibU4wYVc5dUlFZFZTVjlrWldKMVptWnpLRzl3Wlc0cENpQWdJQ0JwWmlCdGNTNVVURTh1VFdVdVdtOXVhVzVuS0NrZ2RHaGxiaUJ5WlhSMWNtNGdaVzVrQ2lBZ0lDQnBaaUJuZFdsUGNHVnVJSFJvWlc0S0lDQWdJQ0FnSUNCc2IyTmhiQ0J6YUc5M0lEMGdabUZzYzJVS0lDQWdJQ0FnSUNCdmNHVnVMQ0J6YUc5M0lEMGdTVzFIZFdrdVFtVm5hVzRvSWtSdmRITWpJeUl1TG0xeExsUk1UeTVOWlM1RWFYTndiR0Y1VG1GdFpTZ3BMQ0J2Y0dWdUxDQmlhWFF6TWk1aWIzSW9TVzFIZFdsWGFXNWtiM2RHYkdGbmN5NUJiSGRoZVhOQmRYUnZVbVZ6YVhwbExDQkpiVWQxYVZkcGJtUnZkMFpzWVdkekxrNXZSR1ZqYjNKaGRHbHZiaWtwQ2lBZ0lDQWdJQ0FnYVdZZ2JtOTBJSE5vYjNjZ2RHaGxiZ29nSUNBZ0lDQWdJQ0FnSUNCSmJVZDFhUzVGYm1Rb0tRb2dJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiM0JsYmdvZ0lDQWdJQ0FnSUdWdVpBb2dJQ0FnSUNBZ0lHeHZZMkZzSUdSbFluVm1aa052ZFc1MElEMGdiWEV1VkV4UExsUmhjbWRsZEM1Q2RXWm1RMjkxYm5Rb0tTQnZjaUF3Q2lBZ0lDQWdJQ0FnYVdZZ1pHVmlkV1ptUTI5MWJuUWdQaUF3SUhSb1pXNEtJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ1kyOTFiblJOZVVSdmRITW9aR1ZpZFdabVEyOTFiblFwSUQ0Z01DQjBhR1Z1Q2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrY21GM1JHVmlkV1ptY3loa1pXSjFabVpEYjNWdWRDeHRjUzVVVEU4dVZHRnlaMlYwTGtKMVptWXBDaUFnSUNBZ0lDQWdJQ0FnSUdWdVpBb2dJQ0FnSUNBZ0lHVnVaQW9nSUNBZ0lDQWdJRWx0UjNWcExrVnVaQ2dwQ2lBZ0lDQWdJQ0FnY21WMGRYSnVJRzl3Wlc0S0lDQWdJR1Z1WkFwbGJtUUtDaTB0SUVSdklHNXZkQ0JsWkdsMElIUm9hWE1nYVdZZ1kyOXVaR2wwYVc5dUNtbG1JRzV2ZENCd1lXTnJZV2RsTG14dllXUmxaRnNuWlhabGJuUnpKMTBnZEdobGJnb2dJQ0FnY0hKcGJuUW9KMVJvYVhNZ2MyTnlhWEIwSUdseklHbHVkR1Z1WkdWa0lIUnZJR0psSUdsdGNHOXlkR1ZrSUhSdklFeDFZU0JGZG1WdWRDQk5ZVzVoWjJWeUlDaE1SVTBwTGlCVWNua2dJbHhoTFhRdmJIVmhJSEoxYmlCc1pXMWNZUzE0SWljcENtVnVaQW9LYkc5allXd2dablZ1WTNScGIyNGdiMjVmYkc5aFpDZ3BDaUFnSUNBdExTQlFaWEptYjNKdElHRnVlU0JwYm1sMGFXRnNJSE5sZEhWd0lHaGxjbVVnZDJobGJpQjBhR1VnWlhabGJuUWdhWE1nYkc5aFpHVmtMZ29nSUNBZ2JYRXVhVzFuZFdrdWFXNXBkQ2duUkc5MGN5QlRkR0YwZFhNbkxDQkhWVWxmWkdWaWRXWm1jeWtLWlc1a0Nnb3RMUzFBY21WMGRYSnVJR0p2YjJ4bFlXNGdRRkpsZEhWeWJuTWdkSEoxWlNCcFppQjBhR1VnWVdOMGFXOXVJSE5vYjNWc1pDQm1hWEpsTENCdmRHaGxjbmRwYzJVZ1ptRnNjMlV1Q214dlkyRnNJR1oxYm1OMGFXOXVJR052Ym1ScGRHbHZiaWdwQ2lBZ0lDQnlaWFIxY200Z2JYRXVWRXhQTGxSaGNtZGxkQ2dwSUg0OUlHNXBiQXBsYm1RS0NncHNiMk5oYkNCbWRXNWpkR2x2YmlCaFkzUnBiMjRvS1FvZ0lDQWdMUzBnU1cxd2JHVnRaVzUwSUhSb1pTQmhZM1JwYjI0Z2RHOGdjR1Z5Wm05eWJTQm9aWEpsTGdvZ0lDQWdhV1lnWTI5MWJuUk5lVVJ2ZEhNb2JYRXVWRXhQTGxSaGNtZGxkQzVDZFdabVEyOTFiblFvS1NrZ1BpQXdJSFJvWlc0S0lDQWdJQ0FnSUNCbmRXbFBjR1Z1SUQwZ2RISjFaUW9nSUNBZ0lDQWdJR1ZzYzJVS0lDQWdJQ0FnSUNCbmRXbFBjR1Z1SUQwZ1ptRnNjMlVLSUNBZ0lHVnVaQXBsYm1RS0NuSmxkSFZ5YmlCN2IyNXNiMkZrUFc5dVgyeHZZV1FzSUdOdmJtUm1kVzVqUFdOdmJtUnBkR2x2Yml3Z1lXTjBhVzl1Wm5WdVl6MWhZM1JwYjI1OSIsCn0=[/CODE]

Edit #1: Now you can click to recast if it's a spell.
 
Last edited:
Tweaked this one. Some randos were sitting, which prevents ducking. I added a /stand and it works great now for ducking.


Icebound Avatar of War

Text Event: Avatar of War duck emote
Added by: @aquietone


Code:
cmV0dXJuIHsKIFsiY29kZSJdID0gImJHOWpZV3dnYlhFZ1BTQnlaWEYxYVhKbEtDZHRjU2NwQ2dwc2IyTmhiQ0JtZFc1amRHbHZiaUJsZG1WdWRGOW9ZVzVrYkdWeUtHeHBibVVzSUc1aGJXVXBDaUFnSUNCcFppQnVZVzFsSUQwOUlHMXhMbFJNVHk1TlpTNURiR1ZoYms1aGJXVW9LU0JoYm1RZ2JtOTBJRzF4TGxSTVR5NU5aUzVFZFdOcmFXNW5LQ2tnZEdobGJnb2dJQ0FnSUNBZ0lDMHRJSEJoZFhObElHRjFkRzl0WVhScGIyNHNJR0ZzZEdWeWJtRjBhWFpsYkhrZ2FHRjJaU0JoZFhSdmMzUmhibVFnYjJabUNpQWdJQ0FnSUNBZ2JYRXVZMjFrWmlnbkx5VnpJSEJoZFhObElHOXVKeXdnYlhFdVZFeFBMazFsTGtOc1lYTnpMbE5vYjNKMFRtRnRaU2dwS1FvZ0lDQWdJQ0FnSUcxeExtTnRaQ2duTDIxeGNDQnZiaWNwQ2lBZ0lDQWdJQ0FnYlhFdVkyMWtLQ2N2YzNSaGJtUW5LUW9nSUNBZ0lDQWdJRzF4TG1OdFpDZ25MM1IzYVhOMElHOW1aaWNwQ2lBZ0lDQWdJQ0FnYlhFdVkyMWtLQ2N2YTJWNWNISmxjM01nUkZWRFN5Y3BDaUFnSUNCbGJtUUtaVzVrQ2dweVpYUjFjbTRnZTJWMlpXNTBablZ1WXoxbGRtVnVkRjlvWVc1a2JHVnlmUT09IiwKIFsibG9hZCJdID0gewogIFsiY2xhc3MiXSA9ICIiLAogIFsiYWx3YXlzIl0gPSBmYWxzZSwKICBbInpvbmUiXSA9ICIiLAogfSwKIFsidHlwZSJdID0gImV2ZW50cyIsCiBbIm5hbWUiXSA9ICJhb3dkdWNrIiwKIFsicGF0dGVybiJdID0gIiMqI1RoZSBpY2UgZW5jcnVzdGVkIEF2YXRhciBvZiBXYXIgc2hvdXRzIHRoYXQgIzEjIG11c3QgYmVuZCB0aGUga25lZSEjKiMiLAogWyJjYXRlZ29yeSJdID0gIkljZWJvdW5kIEF2YXRhciBvZiBXYXIiLAogWyJzaW5nbGVjb21tYW5kIl0gPSBmYWxzZSwKfQ==

Code:
#*#The ice encrusted Avatar of War shouts that #1# must bend the knee!#*#

Lua:
local mq = require('mq')

local function event_handler(line, name)
    if name == mq.TLO.Me.CleanName() and not mq.TLO.Me.Ducking() then
        -- pause automation, alternatively have autostand off
        mq.cmdf('/%s pause on', mq.TLO.Me.Class.ShortName())
        mq.cmd('/mqp on')
        mq.cmd('/stand')
        mq.cmd('/twist off')
        mq.cmd('/keypress DUCK')
    end
end

return {eventfunc=event_handler}
 
I am playing around with using LEM for the Bidil raid event, and have some preliminary triggers, but they did not seem to work during the raid. If I can get some eyes looking at these to see if I missed anything, it would be much appreciated.

Log Text:
Time&Date Come close to me. Bow to me, Toon1. Kneel before me, Toon2. Clap for me, Toon3. Raise your hands in praise of me, Toon4. Dance for me, Toon5. Dance for me, Toon6. Raise your hands in praise of me, Toon7. Kneel before me, Toon8.

I had the period in the text strings, but I was wondering if you are the last one in the list, since there is no further text after the period, will the #*# work for nothing at all there?
["pattern"] = "#*#Kneel before me, #1##*#";
I did have it set to ["pattern"] = "#*#Kneel before me, #1#.#*#";

I know I did have a missing space before the name in one pattern, but the others were correct, and I do not think they actually fired.

Also, is there a way to write a debug log so I can look afterwards to see which triggers fired, and when? Thanks for all your help!
 
I am playing around with using LEM for the Bidil raid event, and have some preliminary triggers, but they did not seem to work during the raid. If I can get some eyes looking at these to see if I missed anything, it would be much appreciated.

Log Text:
Time&Date Come close to me. Bow to me, Toon1. Kneel before me, Toon2. Clap for me, Toon3. Raise your hands in praise of me, Toon4. Dance for me, Toon5. Dance for me, Toon6. Raise your hands in praise of me, Toon7. Kneel before me, Toon8.

I had the period in the text strings, but I was wondering if you are the last one in the list, since there is no further text after the period, will the #*# work for nothing at all there?
["pattern"] = "#*#Kneel before me, #1##*#";
I did have it set to ["pattern"] = "#*#Kneel before me, #1#.#*#";

I know I did have a missing space before the name in one pattern, but the others were correct, and I do not think they actually fired.

Also, is there a way to write a debug log so I can look afterwards to see which triggers fired, and when? Thanks for all your help!
#1##*# wouldn't work for me either. I had to have a character in there #1#.#*#. I'm a bit frustrated with this myself as sometimes my events work, and other times they don't, but they work 100% when I test them with a random NPC and a gsay.
 
I tried writing one for VS anniversary in game. Using a copy from a run away but I cannot get it trigger no matter what.

I see https://www.redguides.com/community...versary-raid-karnors-castle-mad-emperor.2516/ has the trigger phase #*#Venril Sathir focuses his Intent on #1# <-- It is actually intent not Intent but I digress.

An example would be:

Venril Sathir focuses his intent on Willsmith

I have tried all of these for event triggers:

#*#Venril Sathir focuses his Intent on #1##*#
#*#Venril Sathir focuses his Intent on #1#
#*#Sathir focuses his Intent on #1#

None will trigger the phrase. It seems if the #1# is at the end of the sentence with no full stop or any other defining character it fails. Any ideas on how to fix this?
 
1710800540176.png

I have tried rearranging the trigger and manually firing it to see if I can troubleshoot. Even when I do this it still does not fire!

Just be clear I know the real trigger is this:

1710800611437.png

But am struggling to get any traction on whatever I write.
 
View attachment 59218

I have tried rearranging the trigger and manually firing it to see if I can troubleshoot. Even when I do this it still does not fire!

Just be clear I know the real trigger is this:

View attachment 59219

But am struggling to get any traction on whatever I write.
Put trailing punctuation like a period if the event string has one. #1#.
Otherwise, just end it with #1# and do the parsing of the string within the Lua code.

The most simple case:
Lua:
if name:find(mq.TLO.Me.CleanName()) then
  -- do stuff
end
but you can get much more complex if there are more names or anything, variable number of names, etc.
 
Release Lua Event Manager (LEM) Event Library

Users who are viewing this thread

Back
Top
Cart