Shei Vintras multi Class Banish
My Actual best Version here
Edit: post #121 contains an improved update from @a_moss_snake
Update:
- Bugfix ... when spell really wasn't already memmed, there could be an errormessage caused by the return of "NIL"
- found the syntax to eliminate the need of the spells precise rankname within the declaration
Attn 1: Fixed and running, the event now will select the right Rank of the spell, if a ranked spell is used to banish the mobs. At the full code you see "BRD={name='Slumber of the Diabo',type='spell'}," despite the fact that my bard uses RK. II
Attn 2: if using a spell to banish mobs, it's best to mem it befor starting events. If Spell is not memmed, Ill attemt to load it into gem 13. Some automation might remem the spell it considered right for gem 13
[CODE title="Bugfix and Rankname of spells"]cmV0dXJuIHsKIGxvYWQgPSB7CiAgYWx3YXlzID0gZmFsc2UsCiAgY2xhc3MgPSAiIiwKICB6b25lID0gIiIsCiB9LAogY29kZSA9ICJMUzB0UUhSNWNHVWdUWEVLTFMwdFFIUjVjR1VnU1cxSGRXa0tDbXh2WTJGc0lHMXhJRDBnY21WeGRXbHlaU2duYlhFbktRb0tiRzlqWVd3Z2NtVnhkV2x5WldSZmVtOXVaU0E5SUNkaGEyaGxkbUYwZDI5ZmJXbHpjMmx2YmljS2JHOWpZV3dnWW1GdVpWOXRiMkpmYm1GdFpTQTlJQ2RrWVhScFlYSWdlR2tnZEdGMmRXVnNhVzBuQ214dlkyRnNJRk53Wld4c1RHOWhaR1ZrSUQwZ2RISjFaUXBzYjJOaGJDQmlZVzVsY3lBOUlIc0tJQ0FnSUVKU1JEMTdibUZ0WlQwblUyeDFiV0psY2lCdlppQjBhR1VnUkdsaFltOG5MSFI1Y0dVOUozTndaV3hzSjMwc0NpQWdJQ0JEVEZJOWUyNWhiV1U5SjBKc1pYTnpaV1FnUTJoaGFXNXpKeXgwZVhCbFBTZGhZU2Q5TEFvZ0lDQWdSVTVEUFh0dVlXMWxQU2RDWldkMWFXeGxjbHduY3lCQ1lXNXBjMmh0Wlc1MEp5eDBlWEJsUFNkaFlTZDlMQW9nSUNBZ1VHRnNQWHR1WVcxbFBTZFRhR0ZqYTJ4bGN5QnZaaUJVZFc1aGNtVW5MSFI1Y0dVOUoyRmhKMzBzQ2lBZ0lDQlRTRTA5ZTI1aGJXVTlKMVpwY25Wc1pXNTBJRkJoY21Gc2VYTnBjeWNzZEhsd1pUMG5ZV0VuZlN3S0lDQWdJRTVsWXoxN2JtRnRaVDBuVUdWemRHbHNaVzUwSUZCaGNtRnNlWE5wY3ljc2RIbHdaVDBuWVdFbmZTd0tJQ0FnSUVSU1ZUMTdibUZ0WlQwblVHRnlZV3g1ZEdsaklGTndiM0psY3ljc2RIbHdaVDBuWVdFbmZTd0tJQ0FnSUZKT1J6MTdibUZ0WlQwblIzSmhjM0FnYjJZZ1UzbHNkbUZ1SUZOd2FYSnBkSE1uTEhSNWNHVTlKMkZoSjMwc0NuMEtiRzlqWVd3Z1puVnVZM1JwYjI0Z1UzUnZjRVJRVXlncENpQWdJQ0J0Y1M1amJXUW9KeTl6Y1hWbGJHTm9JQzl0Y1hBZ2IyNG5LUW9nSUNBZ2JYRXVaR1ZzWVhrb01UQXBDaUFnSUNCcFppQnRjUzVVVEU4dVRXVXVRMnhoYzNNdVUyaHZjblJPWVcxbEtDa2dQVDBnSjBKU1JDY2dkR2hsYmdvZ0lDQWdJQ0FnSUcxeExtTnRaQ2duTDNOeGRXVnNZMmdnTDNSM2FYTjBJRzltWmljcENpQWdJQ0FnSUNBZ2JYRXVaR1ZzWVhrb01UQXBDaUFnSUNBZ0lDQWdiWEV1WTIxa0tDY3ZjM0YxWld4amFDQXZjM1J2Y0hOdmJtY25LUW9nSUNBZ0lDQWdJRzF4TG1SbGJHRjVLREV3S1FvZ0lDQWdaVzVrQ2lBZ0lDQXRMVzF4TG1OdFpDZ25MMkYwZEdGamF5QnZabVluS1NBZ0xpNHVJRzFoZVdKbElHUmxZV04wYVhaaGRHVWdZWFIwWVdOcklHSjFkQ0J6WVhabElITjBZWFJsSUhSdklISmxZV04wYVhaaGRHVWdZWFFnVTNSaGNuUkVjSE1LSUNBZ0lDMHRiWEV1WkdWc1lYa29NVEFwQ2lBZ0lDQnRjUzVqYldRb0p5OXpjWFZsYkdOb0lDOWliM2h5SUhCaGRYTmxKeWtLSUNBZ0lHMXhMbVJsYkdGNUtERXdLUW9nSUNBZ2QyaHBiR1VnYlhFdVZFeFBMazFsTGtOaGMzUnBibWN1U1VRb0tTQmtid29nSUNBZ0lDQWdiWEV1WkdWc1lYa29NakF3S1FvZ0lDQWdaVzVrQ21WdVpBcHNiMk5oYkNCbWRXNWpkR2x2YmlCU1pYTjFiV1ZFVUZNb0tRb2dJQ0J0Y1M1amJXUW9KeTl6Y1hWbGJHTm9JQzl0Y1hBZ2IyWm1KeWtLSUNBZ2JYRXVaR1ZzWVhrb01UQXBDaUFnSUdsbUlHMXhMbFJNVHk1TlpTNURiR0Z6Y3k1VGFHOXlkRTVoYldVb0tTQTlQU0FuUWxKRUp5QjBhR1Z1Q2lBZ0lDQnRjUzVqYldRb0p5OXpjWFZsYkdOb0lDOTBkMmx6ZENCdmJpY3BDaUFnSUNCdGNTNWtaV3hoZVNneE1Da0tJQ0FnWlc1a0NpQWdJRzF4TG1OdFpDZ25MM054ZFdWc1kyZ2dMMkp2ZUhJZ2RXNXdZWFZ6WlNjcENpQWdJRzF4TG1SbGJHRjVLREV3S1FwbGJtUUtiRzlqWVd3Z1puVnVZM1JwYjI0Z2IyNWZiRzloWkNncENpQWdJQ0JwWmlCdGNTNVVURTh1V205dVpTNVRhRzl5ZEU1aGJXVW9LU0IrUFNCeVpYRjFhWEpsWkY5NmIyNWxJSFJvWlc0Z2NtVjBkWEp1SUdWdVpBb2dJQ0FnYkc5allXd2dZbUZ1WlNBOUlHSmhibVZ6VzIxeExsUk1UeTVOWlM1RGJHRnpjeTVUYUc5eWRFNWhiV1VvS1YwS0lDQWdJR3h2WTJGc0lITndaV3hzYm1GdFpTQTlJRzF4TGxSTVR5NVRjR1ZzYkNoMGIzTjBjbWx1WnloaVlXNWxMbTVoYldVcEtTNVNZVzVyVG1GdFpTZ3BDaUFnSUNCd2NtbHVkQ2h6Y0dWc2JHNWhiV1VwQ2lBZ0lDQnBaaUJpWVc1bElHRnVaQ0JpWVc1bExuUjVjR1VnUFQwZ0ozTndaV3hzSnlCMGFHVnVDaUFnSUNBZ0lDQWdhV1lnYlhFdVZFeFBMazFsTGtkbGJTaHpjR1ZzYkc1aGJXVXBLQ2tnUGlBd0lIUm9aVzRnY21WMGRYSnVJR1Z1WkNBZ0xTMGdVMmh2ZFd4a0lHSmxJRzFsYlcxbFpDQmhiSEpsWVdSNUNpQWdJQ0FnSUNBZ1UzUnZjRVJRVXlncENpQWdJQ0FnSUNBZ2JYRXVZMjFrWmlnbkwyMWxiWE53Wld4c0lERXpJQ0lsY3lJbkxDQnpjR1ZzYkc1aGJXVXBDaUFnSUNBZ0lDQWdiWEV1WkdWc1lYa29KelJ6SnlrS0lDQWdJQ0FnSUNCdGNTNVVURTh1VjJsdVpHOTNLQ2RUY0dWc2JFSnZiMnRYYm1RbktTNUViME5zYjNObEtDa0tJQ0FnSUNBZ0lDQlNaWE4xYldWRVVGTW9LUW9nSUNBZ1pXNWtDbVZ1WkFvdExTMUFjbVYwZFhKdUlHSnZiMnhsWVc0Z1FGSmxkSFZ5Ym5NZ2RISjFaU0JwWmlCMGFHVWdZV04wYVc5dUlITm9iM1ZzWkNCbWFYSmxMQ0J2ZEdobGNuZHBjMlVnWm1Gc2MyVXVDbXh2WTJGc0lHWjFibU4wYVc5dUlHTnZibVJwZEdsdmJpZ3BDaUFnSUNCeVpYUjFjbTRnYlhFdVZFeFBMbHB2Ym1VdVUyaHZjblJPWVcxbEtDa2dQVDBnY21WeGRXbHlaV1JmZW05dVpTQmhibVFnYlhFdVZFeFBMbE53WVhkdVEyOTFiblFvS0NjbGN5QnVjR01uS1RwbWIzSnRZWFFvWW1GdVpWOXRiMkpmYm1GdFpTa3BLQ2tnUGlBd0NpQWdJQ0F0TFhKbGRIVnliaUIwY25WbENtVnVaQXBzYjJOaGJDQm1kVzVqZEdsdmJpQjBZWEpuWlhSZlltRnVaVjl0YjJJb0tRb2dJQ0FnYVdZZ2JYRXVWRXhQTGxSaGNtZGxkQzVEYkdWaGJrNWhiV1VvS1NCK1BTQmlZVzVsWDIxdllsOXVZVzFsSUhSb1pXNEtJQ0FnSUNBZ0lDQnRjUzVqYldSbUtDY3ZiWEYwWVhJZ0pYTWdibkJqSnl3Z1ltRnVaVjl0YjJKZmJtRnRaU2tLSUNBZ0lDQWdJQ0J0Y1M1a1pXeGhlU2cxTUNrS0lDQWdJR1Z1WkFwbGJtUUtiRzlqWVd3Z1puVnVZM1JwYjI0Z1kyRnpkQ2h6Y0dWc2JDa0tJQ0FnSUcxeExtTnRaR1lvSnk5allYTjBJQ1Z6Snl3Z2MzQmxiR3d1VW1GdWEwNWhiV1VvS1NrS0lDQWdJRzF4TG1SbGJHRjVLRFV3SzNOd1pXeHNMazE1UTJGemRGUnBiV1VvS1NrS1pXNWtDbXh2WTJGc0lHWjFibU4wYVc5dUlIVnpaVjloWVNoaFlTa0tJQ0FnSUcxeExtTnRaR1lvSnk5aGJIUWdZV04wYVhaaGRHVWdKWE1uTENCaFlTNUpSQ2dwS1FvZ0lDQWdiWEV1WkdWc1lYa29OVEFyWVdFdVUzQmxiR3d1UTJGemRGUnBiV1VvS1NrS1pXNWtDbXh2WTJGc0lHWjFibU4wYVc5dUlHSmhibVZmY21WaFpIa29ZbUZ1WlNrS0lDQWdJR2xtSUdKaGJtVXVkSGx3WlNBOVBTQW5jM0JsYkd3bklIUm9aVzRLSUNBZ0lDQWdJQ0J5WlhSMWNtNGdiWEV1VkV4UExrMWxMbE53Wld4c1VtVmhaSGtvWW1GdVpTNXVZVzFsS1NCaGJtUWdibTkwSUcxeExsUk1UeTVOWlM1RFlYTjBhVzVuS0NrS0lDQWdJR1ZzYzJWcFppQmlZVzVsTG5SNWNHVWdQVDBnSjJGaEp5QjBhR1Z1Q2lBZ0lDQWdJQ0FnY21WMGRYSnVJRzF4TGxSTVR5NU5aUzVCYkhSQlltbHNhWFI1VW1WaFpIa29ZbUZ1WlM1dVlXMWxLU0JoYm1RZ2JtOTBJRzF4TGxSTVR5NU5aUzVEWVhOMGFXNW5LQ2tLSUNBZ0lHVnVaQXBsYm1RS2JHOWpZV3dnWm5WdVkzUnBiMjRnWVdOMGFXOXVLQ2tLSUNBZ0lHeHZZMkZzSUcxNVgyTnNZWE56SUQwZ2JYRXVWRXhQTGsxbExrTnNZWE56TGxOb2IzSjBUbUZ0WlNncENpQWdJQ0JzYjJOaGJDQmlZVzVsSUQwZ1ltRnVaWE5iYlhsZlkyeGhjM05kQ2lBZ0lDQXRMU0JwWmlCdWIzUWdZU0JpWVc1bElHTnNZWE56TENCeVpYUjFjbTRLSUNBZ0lHbG1JRzV2ZENCaVlXNWxJSFJvWlc0Z2NtVjBkWEp1SUdWdVpBb2dJQ0FnTFMwZ2FXWWdZbUZ1WlNCaFltbHNhWFI1SUdsemJpZDBJSEpsWVdSNUxDQnlaWFIxY200S0lDQWdJR2xtSUcxNVgyTnNZWE56SUg0OUlDZENVa1FuSUdGdVpDQnViM1FnWW1GdVpWOXlaV0ZrZVNoaVlXNWxLU0IwYUdWdUlISmxkSFZ5YmlCbGJtUUtJQ0FnSUZOMGIzQkVVRk1vS1FvZ0lDQWdkR0Z5WjJWMFgySmhibVZmYlc5aUtDa0tJQ0FnSUdsbUlHSmhibVV1ZEhsd1pTQTlQU0FuYzNCbGJHd25JSFJvWlc0S0lDQWdJQ0FnSUNCallYTjBLRzF4TGxSTVR5NVRjR1ZzYkNoaVlXNWxMbTVoYldVcEtRb2dJQ0FnWld4elpRb2dJQ0FnSUNBZ0lIVnpaVjloWVNodGNTNVVURTh1VFdVdVFXeDBRV0pwYkdsMGVTaGlZVzVsTG01aGJXVXBLUW9nSUNBZ1pXNWtDaUFnSUNCM2FHbHNaU0J0Y1M1VVRFOHVUV1V1UTJGemRHbHVaeWdwSUdSdkNpQWdJQ0FnSUNBZ2JYRXVaRzlsZG1WdWRITW9LUW9nSUNBZ0lDQWdJRzF4TG1SbGJHRjVLRFV3S1FvZ0lDQWdaVzVrQ2lBZ0lDQlNaWE4xYldWRVVGTW9LUXBsYm1RS2NtVjBkWEp1SUh0dmJteHZZV1E5YjI1ZmJHOWhaQ3dnWTI5dVpHWjFibU05WTI5dVpHbDBhVzl1TENCaFkzUnBiMjVtZFc1alBXRmpkR2x2Ym4wPSIsCiBjYXRlZ29yeSA9ICJUb2wiLAogdHlwZSA9ICJjb25kaXRpb25zIiwKIG5hbWUgPSAiU2hlaUJhbmlzaCIsCn0=[/CODE]
full source code:
[CODE title="SheiBanish sourcecode"]
---@type Mq
---@type ImGui
local mq = require('mq')
local required_zone = 'akhevatwo_mission'
local bane_mob_name = 'datiar xi tavuelim'
local SpellLoaded = true
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(tostring(bane.name)).RankName()
print(spellname)
if bane and bane.type == 'spell' then
if 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
--return true
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}
[/CODE]