|
BLM lua that works with death
サーバ: Asura
Game: FFXI
Posts: 31
By Asura.Icewell 2017-01-11 00:18:45
Anyone have a blm lua that works with death, so that it doesn't swap out to lower MP gear even when you cast other spells like blind or breakga?
サーバ: Asura
Game: FFXI
Posts: 115
By Asura.Pintseyes 2017-01-12 10:46:44
-- This is lua is built using Mote's modified includes,
-- which you can find in my GearSwap/libs folder here: <a href="https://github.com/Lygre/addons/tree/mac-blm/GearSwap/libs" rel="nofollow">https://github.com/Lygre/addons/tree/mac-blm/GearSwap/libs</a>
---- Macro/Keybind/Toggles/SelfCommands you may need
-- Magic Burst: /console gs c toggle MagicBurst
-- AF Body: /console gs c toggle ConsMP
-- AOE for auto nuke: /console gs c toggle AOE
--- This is makes the nuke() function use AOE nukes or not
-- Element for auto nuke: /console gs c element (Earth, Wind, Ice, Fire, Water, Lightning) - case sensitive
--- Selects an element for nuke() to use
-- Auto Nuke: /console gs c nuke
-- Death Mode: /console gs c toggle DeatCast
--- Saved Death Mode toggle for last
--- This one toggle will handle everything for Death
--- This includes idle/engaged, casting other spells/self-buffs
--- The only other thing you have to do is the Magic Burst toggle,
--- as it decides whether the handler will put your Death-specific MB set on over your
--- regular one.
--- It also remembers what casting mode you were in when you turned Death Mode on
--- and return to it upon exiting Death Mode
-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job. Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------
-- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
include('organizer-lib')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
-- Setup vars that are user-dependent. Can override this function in a sidecar file.
function job_setup()
state.OffenseMode:options('None', 'Locked')
state.CastingMode:options('Normal', 'Mid', 'Resistant', 'CMP','DeatMB')
state.IdleMode:options('Normal', 'PDT')
MagicBurstIndex = 0
state.MagicBurst = M(false, 'Magic Burst')
state.ConsMP = M(false, 'AF Body')
state.DeatCast = M(false, 'Death Mode')
element_table = L{'Earth','Wind','Ice','Fire','Water','Lightning'}
state.AOE = M(false, 'AOE')
lowTierNukes = S{'Stone', 'Water', 'Aero', 'Fire', 'Blizzard', 'Thunder',
'Stone II', 'Water II', 'Aero II', 'Fire II', 'Blizzard II', 'Thunder II',
'Stone III', 'Water III', 'Aero III', 'Fire III', 'Blizzard III', 'Thunder III',
'Stonega', 'Waterga', 'Aeroga', 'Firaga', 'Blizzaga', 'Thundaga',
'Stonega II', 'Waterga II', 'Aeroga II', 'Firaga II', 'Blizzaga II', 'Thundaga II'}
degrade_array = {
['Fire'] = {'Fire','Fire II','Fire III','Fire IV','Fire V','Fire VI'},
['Firega'] = {'Firaga','Firaga II','Firaga III','Firaja'},
['Ice'] = {'Blizzard','Blizzard II','Blizzard III','Blizzard IV','Blizzard V','Blizzard VI'},
['Icega'] = {'Blizzaga','Blizzaga II','Blizzaga III','Blizzaja'},
['Wind'] = {'Aero','Aero II','Aero III','Aero IV','Aero V','Aero VI'},
['Windga'] = {'Aeroga','Aeroga II','Aeroga III','Aeroja'},
['Earth'] = {'Stone','Stone II','Stone III','Stone IV','Stone V','Stone VI'},
['Earthga'] = {'Stonega','Stonega II','Stonega III','Stoneja'},
['Lightning'] = {'Thunder','Thunder II','Thunder III','Thunder IV','Thunder V','Thunder VI'},
['Lightningga'] = {'Thundaga','Thundaga II','Thundaga III','Thundaja'},
['Water'] = {'Water', 'Water II','Water III', 'Water IV','Water V','Water VI'},
['Waterga'] = {'Waterga','Waterga II','Waterga III','Waterja'},
['Aspirs'] = {'Aspir','Aspir II','Aspir III'},
['Sleepgas'] = {'Sleepga','Sleepga II'}
}
-- Additional local binds
send_command('bind ^` gs c toggle MagicBurst')
send_command('bind !` gs c toggle ConsMP')
send_command('bind @` gs c toggle DeatCast')
organizer_items = {aeonic="Khatvanga"}
select_default_macro_book()
end
-- Called when this job file is unloaded (eg: job change)
function user_unload()
send_command('unbind ^`')
send_command('unbind @`')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
--------------------------------------
-- Start defining the sets
--------------------------------------
---- Precast Sets ----
-- Precast sets to enhance JAs
sets.precast.JA['Mana Wall'] = {back="Taranus's cape",feet="Wicce Sabots +1"}
sets.precast.JA.Manafont = {body="Sorcerer's Coat +2"}
-- equip to maximize HP (for Tarus) and minimize MP loss before using convert
sets.precast.JA.Convert = {}
-- Fast cast sets for spells
sets.precast.FC = {}
sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})
sets.precast.FC['Enfeebling Magic'] = sets.precast.FC
sets.precast.FC['Elemental Magic'] = set_combine(sets.precast.FC, {ear1="Barkarole earring"})
sets.precast.FC['Healing Magic'] = set_combine(sets.precast.FC, {body="Heka's Kalasiris",legs="Doyen pants", back="Pahtli Cape"})
--Death sets
-- Default Idle set while Death Mode is on
sets.DeatCastIdle = {}
-- Default FC set when Death Mode is on and no matching DeatMB subtable is found for specific spell
---More specific FC sets under Death Mode could be implemented, but I really saw no point.
sets.precast.FC.DeatMB = {}
-- Base midcast table for actually casting 'Death'
sets.midcast['Death'] = {}
-- Set to be imposed on top of above base Death set when Death Mode and Magic Burst Mode are both on
sets.MB_death = {}
-- Weaponskill sets
-- Default set for any weaponskill that isn't any more specifically defined
sets.precast.WS = {}
-- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
sets.precast.WS['Myrkr'] = {}
---- Midcast Sets ----
sets.midcast.FastRecast = {}
sets.midcast['Healing Magic'] = {}
sets.midcast['Enhancing Magic'] = {}
sets.midcast.Refresh = {}
sets.midcast.Haste = {}
sets.midcast.Phalanx = {}
sets.midcast.Aquaveil = {}
sets.midcast.Stoneskin = {}
sets.midcast['Enfeebling Magic'] = {}
sets.midcast['Enfeebling Magic'].Mid = set_combine(sets.midcast['Enfeebling Magic'],{})
sets.midcast['Enfeebling Magic'].Resistant = set_combine(sets.midcast['Enfeebling Magic'].Mid, { })
sets.midcast.ElementalEnfeeble = sets.midcast['Enfeebling Magic']
sets.midcast['Dark Magic'] = {}
sets.midcast.Drains = set_combine(sets.midcast['Dark Magic'], {})
sets.midcast.Aspirs = sets.midcast.Drains
sets.midcast.Stun = {}
-- Elemental Magic sets
sets.midcast['Elemental Magic'] = {}
sets.midcast['Elemental Magic'].Mid = set_combine(sets.midcast['Elemental Magic'], {})
sets.midcast['Elemental Magic'].Resistant = set_combine(sets.midcast['Elemental Magic'].Mid, {})
sets.midcast['Elemental Magic'].CMP = set_combine(sets.midcast['Elemental Magic'], {})
sets.midcast['Elemental Magic'].HighTierNuke = set_combine(sets.midcast['Elemental Magic'], {})
sets.midcast['Elemental Magic'].HighTierNuke.Mid = set_combine(sets.midcast['Elemental Magic'].HighTierNuke, {})
sets.midcast['Elemental Magic'].HighTierNuke.Resistant = set_combine(sets.midcast['Elemental Magic'].HighTierNuke.Mid, {})
sets.midcast['Elemental Magic'].HighTierNuke.CMP = set_combine(sets.midcast['Elemental Magic'].HighTierNuke, {})
sets.midcast.Impact = {head=empty,body="Twilight Cloak"}
--Death Midcast subtables
---The foremost set for each magic skill exists to fall back on while Death Mode is on, and no more specifically defined set
---exists for the spell
----To add more specific sets, as seen below on line 163, define a specific set for either the spell's name or corresponding spellMap
----(This set can be the empty set '{}', if you don't care to use it outside of Death Mode or something)
----e.g. sets.midcast.Tornado = {}
----Then define another set subtable, e.g. sets.midcast.Tornado.DeatMB = {what-have-you}
sets.midcast.FastRecast.DeatMB = sets.precast.FC.DeatMB
---Death Enhancing Magic
sets.midcast['Enhancing Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
----Death Refresh specific
sets.midcast.Refresh.DeatMB = set_combine(sets.midcast['Enhancing Magic'].DeatMB, {head="Amalric Coif"})
---Death Enfeebling Magic
sets.midcast['Enfeebling Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
---Death Dark Magic
sets.midcast['Dark Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
----Death Aspirs spellMap specific
sets.midcast.Aspirs.DeatMB = set_combine(sets.precast.FC.DeatMB, {})
---Death Elemental Magic
sets.midcast['Elemental Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
---Death Healing Magic
sets.midcast['Healing Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
--Set to be overlaid on top of the default midcast set for the spell you're casting when Magic Burst mode is toggled on
--(excluding when Death Mode is on.[see: sets.MB_death])
sets.magic_burst = {}
--Set to be equipped when Day/Weather match current spell element
sets.Obi = {waist='Hachirin-no-Obi'}
-- Resting sets
sets.resting = {}
-- Idle sets
-- Normal refresh idle set
sets.idle = { }
-- Idle mode that keeps PDT gear on, but doesn't prevent normal gear swaps for precast/etc.
sets.idle.PDT = {}
-- Town gear.
sets.idle.Town = sets.idle
sets.TreasureHunter = {waist="Chaac Belt"}
-- Set for Conserve MP toggle, puts AF body on
sets.ConsMP = {body="Spaekona's coat +1"}
-- Defense sets
sets.defense.PDT = {}
sets.defense.MDT = {}
sets.Kiting = {feet="Herald's gaiters"}
sets.latent_refresh = {waist="Fucho-no-obi"}
-- Buff sets: Gear that needs to be worn to actively enhance a current player buff.
sets.buff['Mana Wall'] = {back="Taranus's cape",feet="Wicce Sabots +1"}
-- Engaged sets
-- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
-- sets if more refined versions aren't defined.
-- If you create a set with both offense and defense modes, the offense mode should be first.
-- EG: sets.engaged.Dagger.Accuracy.Evasion
-- Normal melee group
--!!!!!Commented out until I make rule to handle engaged set during death mode (will use customize_melee_set)
--[[sets.engaged = {}]]
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
-- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
function job_precast(spell, action, spellMap, eventArgs)
enable('feet','back')
if state.DeatCast.value then
if spell.action_type == 'Magic' then
classes.CustomClass = 'DeatMB'
end
elseif spell.type == 'BlackMagic' and spell.target.type == 'MONSTER' then
refine_various_spells(spell, action, spellMap, eventArgs)
end
end
function job_post_precast(spell, action, spellMap, eventArgs)
if state.DeatCast.value then
return
elseif spell.english == "Impact" then
equip({head=empty,body="Twilight Cloak"})
elseif spellMap == 'Cure' or spellMap == 'Curaga' then
gear.default.obi_waist = "Hachirin-no-obi"
end
end
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_midcast(spell, action, spellMap, eventArgs)
if state.DeatCast.value then
if spell.action_type == 'Magic' then
if spell.english == 'Death' then
equip(sets.midcast['Death'])
else
classes.CustomClass = 'DeatMB'
state.CastingMode:set('DeatMB')
end
end
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.action_type == 'Magic' and state.MagicBurst.value then
if state.DeatCast.value then
if spell.english == 'Death' then
equip(sets.MB_death)
elseif spell.skill == 'Elemental Magic' then
if state.MagicBurst.value and sets.magic_burst then
local equipSet = sets.magic_burst
if equipSet[spell.english] then
equipSet = equipSet[spell.english]
end
if equipSet[spellMap] then
equipSet = equipSet[spellMap]
end
if equipSet[state.CastingMode.value] then
equipSet = equipSet[state.CastingMode.value]
end
equip(equipSet)
end
end
end
end
if spell.element == world.day_element or spell.element == world.weather_element then
if string.find(spell.english,'helix') then
equip(sets.midcast.Helix)
else
equip(sets.Obi)
end
end
if spell.skill == 'Elemental Magic' and state.ConsMP.value and not state.DeatCast.value then
equip(sets.ConsMP)
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
-- Lock feet after using Mana Wall.
if buffactive['Mana Wall'] and not state.DeatCast.value then
enable('feet','back')
equip(sets.buff['Mana Wall'])
disable('feet','back')
end
if not spell.interrupted then
if spell.english == "Sleep II" or spell.english == "Sleepga II" then -- Sleep II Countdown --
send_command('wait 60;input /echo Sleep Effect: [WEARING OFF IN 30 SEC.];wait 15;input /echo Sleep Effect: [WEARING OFF IN 15 SEC.];wait 10;input /echo Sleep Effect: [WEARING OFF IN 5 SEC.]')
elseif spell.english == "Sleep" or spell.english == "Sleepga" then -- Sleep & Sleepga Countdown --
send_command('wait 30;input /echo Sleep Effect: [WEARING OFF IN 30 SEC.];wait 15;input /echo Sleep Effect: [WEARING OFF IN 15 SEC.];wait 10;input /echo Sleep Effect: [WEARING OFF IN 5 SEC.]')
elseif spell.english == "Break" then -- Break Countdown --
send_command('wait 25;input /echo Break Effect: [WEARING OFF IN 5 SEC.]')
end
end
end
function nuke(spell, action, spellMap, eventArgs)
if player.target.type == 'MONSTER' then
if state.AOE.value then
send_command('input /ma "'..degrade_array[element_table:append('ga')][#degrade_array[element_table:append('ga')]]..'" '..tostring(player.target.name))
else
send_command('input /ma "'..degrade_array[element_table][#degrade_array[element_table]]..'" '..tostring(player.target.name))
end
else
add_to_chat(5,'A Monster is not targetted.')
end
end
function job_self_command(commandArgs, eventArgs)
if commandArgs[1] == 'element' then
if commandArgs[2] then
if element_table:contains(commandArgs[2]) then
element_table = commandArgs[2]
add_to_chat(5, 'Current Nuke element ['..element_table..']')
else
add_to_chat(5,'Incorrect Element value')
return
end
else
add_to_chat(5,'No element specified')
end
elseif commandArgs[1] == 'nuke' then
nuke()
end
end
function refine_various_spells(spell, action, spellMap, eventArgs)
local aspirs = S{'Aspir','Aspir II','Aspir III'}
local sleeps = S{'Sleep','Sleep II'}
local sleepgas = S{'Sleepga','Sleepga II'}
local newSpell = spell.english
local spell_recasts = windower.ffxi.get_spell_recasts()
local cancelling = 'All '..spell.english..' spells are on cooldown. Cancelling spell casting.'
local spell_index
if spell_recasts[spell.recast_id] > 0 then
if spell.skill == 'Elemental Magic' then
local ele = tostring(spell.element):append('ga')
--local ele2 = string.sub(ele,1,-2)
if table.find(degrade_array[ele],spell.name) then
spell_index = table.find(degrade_array[ele],spell.name)
if spell_index > 1 then
newSpell = degrade_array[ele][spell_index - 1]
add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
eventArgs.cancel = true
end
else
spell_index = table.find(degrade_array[spell.element],spell.name)
if spell_index > 1 then
newSpell = degrade_array[spell.element][spell_index - 1]
add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
eventArgs.cancel = true
end
end
elseif aspirs:contains(spell.name) then
spell_index = table.find(degrade_array['Aspirs'],spell.name)
if spell_index > 1 then
newSpell = degrade_array['Aspirs'][spell_index - 1]
add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
eventArgs.cancel = true
end
elseif sleepgas:contains(spell.name) then
spell_index = table.find(degrade_array['Sleepgas'],spell.name)
if spell_index > 1 then
newSpell = degrade_array['Sleepgas'][spell_index - 1]
add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
eventArgs.cancel = true
end
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
-- Called when a player gains or loses a buff.
-- buff == buff gained or lost
-- gain == true if the buff was gained, false if it was lost.
function job_buff_change(buff, gain)
-- Unlock feet when Mana Wall buff is lost.
if buff == "Mana Wall" and not gain then
enable('feet','back')
handle_equipping_gear(player.status)
end
if buff == "Commitment" and not gain then
equip({ring2="Capacity Ring"})
if player.equipment.right_ring == "Capacity Ring" then
disable("ring2")
else
enable("ring2")
end
end
end
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
if stateField == 'Offense Mode' then
if newValue == 'Locked' then
disable('main','sub','range')
else
enable('main','sub','range')
end
end
if stateField == 'Death Mode' then
if newValue == true then
state.OffenseMode:set('Locked')
predeathcastmode = state.CastingMode.value
--[[Insert 'equip(<set consisting of Death weapon and sub, to have them automatically lock when changing into Death mode>)']]
elseif newValue == false then
state.CastingMode:set(predeathcastmode)
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
--[[function job_update(cmdParams, eventArgs)
job_display_current_state(eventArgs)
eventArgs.handled = true
end]]
function display_current_job_state(eventArgs)
eventArgs.handled = true
local msg = ''
if state.OffenseMode.value ~= 'None' then
msg = msg .. 'Combat ['..state.OffenseMode.value..']'
if state.CombatForm.has_value then
msg = msg .. ' (' .. state.CombatForm.value .. ')'
end
msg = msg .. ', '
end
--[[if state.HybridMode.value ~= 'Normal' then
msg = msg .. '/' .. state.HybridMode.value
end]]
msg = msg .. 'Casting ['..state.CastingMode.value..'], Idle ['..state.IdleMode.value..']'
if state.MagicBurst.value then
msg = msg .. ', MB [ON]'
else
msg = msg .. ', MB [OFF]'
end
if state.ConsMP.value then
msg = msg .. ', AF Body [ON]'
else
msg = msg .. ', AF Body [OFF]'
end
if state.DeatCast.value then
msg = msg .. ', Death Mode [ON]'
else
msg = msg .. ', Death Mode [OFF]'
end
if state.DefenseMode.value ~= 'None' then
msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')'
end
if state.Kiting.value then
msg = msg .. ', Kiting [ON]'
end
if state.PCTargetMode.value ~= 'default' then
msg = msg .. ', Target PC: '..state.PCTargetMode.value
end
if state.SelectNPCTargets.value == true then
msg = msg .. ', Target NPCs'
end
add_to_chat(122, msg)
end
-- Custom spell mapping.
function job_get_spell_map(spell, default_spell_map)
if spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then
if lowTierNukes:contains(spell.english) then
return 'LowTierNuke'
else
return 'HighTierNuke'
end
end
end
-- Modify the default idle set after it was constructed.
--- This is where I handle Death Mode Idle set construction, rather than weave it into the Idle state var
function customize_idle_set(idleSet)
if state.DeatCast.value then
idleSet = set_combine(idleSet, sets.DeatCastIdle)
end
if player.mpp < 51 then
idleSet = set_combine(idleSet, sets.latent_refresh)
end
if buffactive['Mana Wall'] then
idleSet = set_combine(idleSet, sets.buff['Mana Wall'])
end
return idleSet
end
--- This is where I handle Death Mode Melee set modifications
function customize_melee_set(meleeSet)
if state.DeatCast.value then
meleeSet = set_combine(meleeSet, sets.DeatCastIdle)
end
if buffactive['Mana Wall'] then
meleeSet = set_combine(meleeSet, sets.buff['Mana Wall'])
end
return meleeSet
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
-- Select default macro book on initial load or subjob change.
function select_default_macro_book()
set_macro_page(1, 19)
end
This is not my lua. This is only a lua I use as a template for code. I've never used it so if something doesn't work you'll need to post in the help thread.
サーバ: Shiva
Game: FFXI
Posts: 1052
By Shiva.Arislan 2017-01-12 11:14:39
This is the one I use and it works:
https://github.com/ArislanShiva/luas/blob/master/Arislan-BLM.lua
Winkey-D to toggle over to death casting mode, which will automatically change your idle and precast to high-mp, and disable midcast swapping for anything other than impact/elemental magic/death.
You'll be able to cast blind/breakga without dropping your mp level, but you won't be casting in potency. If you have a high-mp enfeeb set, you could always add exceptions for that in the casting rules.
By olson2189 2017-02-06 22:49:41
Has anyone ever had the problem of MP dropping for no reason when changing inbetween sets with Death mode on? As an example, both my death midcast and death precast sets have 2,250+ MP, but when I equip one, and then the other directly using '//gs equip ...', my MP drops to below 2,100, but the set I'm switching to has 2,250+, so I'm so confused as to why the MP drop is happening.
Bismarck.Phaded
By Bismarck.Phaded 2017-02-07 02:09:45
Gearswap Spellcast and even in game swaps have always lowered your MP/HP when using swaps due to how gear is being put on. Using Gearswap you can set slot priorities so that your MP doesn't tank during pre to midcast.
head={name="Merlinic Hood",priority=16}
feet={name="Merlinic Crackows",priority=1}
In the above example it would equip Head slot first and Feet slot last. You would have to go through all of your precast sets and give priority to your highest MP items. This would in effect raise your MP before equipping your potency set. Tank jobs would also benefit in prioritizing HP in their precasts so mages don't have to constantly cure after each time you cast.
This is of course assuming you are using a non-Mote lua, but I'd say his Death set probably needs to be prioritized the same way.
By Sammeh 2017-02-07 07:07:44
I stubmled across this gem in the PLD forums a while back asking the same thing about HP.
http://www.ffxiah.com/forum/topic/46016/first-and-final-line-of-defense-v20/17/#3067025
As Phaded said. it's about priority.
Quote from thread:
Quote: There are a few ways to mitigate this issue.
Now, say your idle set has 2500 max HP, and your FC set has 2200. You're just kinda screwed there. you're gonna lose that 300 HP. (Well, you could pump in some HP+ on the spare slots in the FC set. <,<) However, it's entirely possibly that you're actually losing More HP than the difference between the fully equipped sets due to the equip order.
For example,(totally random number to illustrate the point, mind you.)
Idle head: 100 -> FC head 40 HP. -60 current HP loss.
then idle hands 40 HP -> FC hands 100 max HP +60.
Equipped in this order you lose 60 current HP. However if equipped in reverse there would have been no loss.
Basically, during swaps, you need to increase your max HP first, then do the swaps that drop it. This is of course, a huge pain in the ***. But it can help, depending on your sets.
Also, there's the option of equipping HP+ gear in the fastcast set. And sacrificing the lesser amounts of fastcast to lose less current HP. Of course, if you were already Idling in most of your HP+ gear, then this won't help much. But I've never been big on stacking HP, precisely because I'm just going to lose most it. And if I wanted to sit there and not swap gear, I'd have been playing 14. -.-;
Important note. Unless you specifically code other wise, the equip order in gearswap is static. The order you list the slots inside a set means Nothing.
the default equip order is described in the slots.lua located at Windower4\res\slots.lua. in the windower folder.
return {
[0] = {id=0,en="Main"},
[1] = {id=1,en="Sub"},
[2] = {id=2,en="Range"},
[3] = {id=3,en="Ammo"},
[4] = {id=4,en="Head"},
[5] = {id=5,en="Body"},
[6] = {id=6,en="Hands"},
[7] = {id=7,en="Legs"},
[8] = {id=8,en="Feet"},
[9] = {id=9,en="Neck"},
[10] = {id=10,en="Waist"},
[11] = {id=11,en="Left Ear"},
[12] = {id=12,en="Right Ear"},
[13] = {id=13,en="Left Ring"},
[14] = {id=14,en="Right Ring"},
[15] = {id=15,en="Back"},
}, {"id", "en"}
Coding sets for priority is explained in the Advanced sets tables.txt found at Windower4\addons\GearSwap\beta_examples_and_information\Advanced sets tables.txt
As an example, my rather out of date fast cast set.
sets.precast = {
ammo="Incantor Stone", -- 0 HP
head={name="Chev. Armet +1",priority=9}, -- +125 HP
neck="Orunmila's Torque",--0 HP
ear1="Loquacious Earring",--0 HP
ear2={name="Etiolation Earring",priority=11},-- +50 HP
body={name="Odyssean Chestplate",priority=-1},--+66 HP
hands={name="Leyline Gloves",priority=7},--+25 HP
ring1={name="Meridian Ring",priority=15},-- +90 HP
ring2={name="Prolix Ring",priority=8},-- 0 HP
back={name="Xucau Mantle",priority=14},-- +100 HP
waist={name="Creed Baudrier",priority=13},-- +40 HP
legs={name="Enif Cosciales",priority=10},--+40HP
feet={ name="Odyssean Greaves", augments={'"Fast Cast"+3',priority=12}} }
The weird part here, is that the swaps for priority go in descending order. so the piece with priority 15 would swap first and the piece with 0(or -1, etc) would go last.
The other thing you have to consider is the hp values for gear in other sets. you can't base the priority purely of the current set alone. So what if Chevalier's head has +125 HP? If your Idle head has more than that, then it shouldn't go first. Need to swap elsewhere, then swap head when a sufficient current/max HP gap has built up.
You have to consider the changes going from idle to FC, then from FC to midcast. etc.
It's also useful to note, that you should Never be able to get hit in you precast set.(Provided the midcast set is a complete set that will swap you out of the precast pieces) So you can swap to whatever meets the HP/FC needs. It's the midcast phase where you have to consider the risk of being hit.
All this being said, it is a huuuge pain in the *** to consider all the factors. And it can't eliminate the max HP differences of entire sets.(of course, you can always tweak the sets...) But it does help.
By olson2189 2017-02-07 13:25:25
Ah, okay. Very helpful - thanks to you both for the insight. I am using a Mote lua - will the 'priority=' syntax still work? Phaded seemed to suggest there may be a problem if using Mote's lua.
Thanks!
Bismarck.Phaded
By Bismarck.Phaded 2017-02-07 16:56:49
I'm going to guess the syntax is the same. I don't use mote's stuff so I never know if he has some custom user setup for things hidden in a sidecar file somewhere.
By Sammeh 2017-02-07 17:46:58
It's a gearswap core function so you should be fine regardless of it. I don't know how mote's would be able to account for gear and know which priority to do it without logging every stat (and augment) of every possibility.. too much.
Should be good to go.
Anyone have a blm lua that works with death, so that it doesn't swap out to lower MP gear even when you cast other spells like blind or breakga?
|
|