Gearswap Support Thread |
||
Gearswap Support Thread
Offline
Posts: 9
Thanks for the response. I wouldn't mind taking a look at yours. I also might try kinematics instead. The one I was using is from the bluemage tagged post on this forum.
Asura.Byrne
Offline
Ok cool, when I get home I'll put mine up on github and send you a link.
It's based off the same lua that yours is, but I've made many changes to it, such as a few additional sets, and some cleaning up of some of the arguments, extensions of some functionalities, and added rules for specific spells. In addition to most of those things that should seem fairly self explanatory, there are a few things to go over before I post it. Pressing F12 will disable swapping of main and sub slots, which if you would like I can actually reverse it to where the lua starts off with the slots disabled by default. Secondly the way that nukes are handled in mine is different to yours, Instead of putting your nuking gear into the BlueMagic.INT set, it will be in the BlueMagic.SUB set, with the exception of the Tenebral Crush set, which is it's own set due to pixie hairpin +1 and Archon ring. Additionally, any function sets that contain gear that you do not have, you should put something you do have in it's place, or replace the portion after the equal such that it looks like "sets.BlahBlah.Whatever = {}" Asura.Byrne
Offline
All right, revised lua here:
https://pastebin.com/UzQr8pC3 Free game for anyone that wants a more meticulously formatted and up-to-date version of the lua on The-Beast-Within Guide. If I was to do something like this for an AM3 set and a JA:
Code if buffactive["Aftermath: Lv.3"] and equipSet['AM3'] then equipSet = equipSet['AM3'] end if buffactive["Double Shot"] and equipSet['Doubleshot'] then equipSet = equipSet['Doubleshot'] end Which would take precedence? Would it just be in the order of the code or possibly JA use? So i'm running into a pretty *** annoying bug with smn that i think is more an issue with gearswap itself, but here's my lua below anyway.
What happens: Thunderspark is really really *** prone to missing the midcast gearswap for BP damage. I'm talking like a 30-50% chance to happen, especially in higher lag situations like cleaving. There's two suspicious issues with it: 1: something is causing GS to swap to something else. 2: it's lagging and it's swapping to post cast before pact lands. Code -- Initialization function for this job file. function get_sets() mote_include_version = 2 -- Load and initialize the include file. include('Mote-Include.lua') end -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked. function job_setup() state.Buff["Avatar's Favor"] = buffactive["Avatar's Favor"] or false state.Buff["Astral Conduit"] = buffactive["Astral Conduit"] or false state.Moving = M(false, "moving") spirits = S{"LightSpirit", "DarkSpirit", "FireSpirit", "EarthSpirit", "WaterSpirit", "AirSpirit", "IceSpirit", "ThunderSpirit"} avatars = S{"Carbuncle", "Fenrir", "Diabolos", "Ifrit", "Titan", "Leviathan", "Garuda", "Shiva", "Ramuh", "Odin", "Alexander", "Cait Sith"} -- Any spells placed in magicalRagePacts will force weapons and ammo magicalRagePacts = S{ 'Inferno','Earthen Fury','Tidal Wave','Aerial Blast','Diamond Dust','Judgment Bolt','Searing Light','Howling Moon','Ruinous Omen', 'Fire II','Stone II','Water II','Aero II','Blizzard II','Thunder II', 'Fire IV','Stone IV','Water IV','Aero IV','Blizzard IV','Thunder IV', 'Thunderspark','Burning Strike','Meteorite','Nether Blast','Flaming Crush', 'Meteor Strike','Heavenly Strike','Wind Blade','Geocrush','Grand Fall','Thunderstorm', 'Holy Mist','Lunar Bay','Night Terror','Level ? Holy'} pacts = {} pacts.cure = {['Carbuncle']='Healing Ruby'} pacts.curaga = {['Carbuncle']='Healing Ruby II', ['Garuda']='Whispering Wind', ['Leviathan']='Spring Water'} pacts.buffoffense = {['Carbuncle']='Glittering Ruby', ['Ifrit']='Crimson Howl', ['Garuda']='Hastega', ['Ramuh']='Rolling Thunder', ['Fenrir']='Ecliptic Growl'} pacts.buffdefense = {['Carbuncle']='Shining Ruby', ['Shiva']='Frost Armor', ['Garuda']='Aerial Armor', ['Titan']='Earthen Ward', ['Ramuh']='Lightning Armor', ['Fenrir']='Ecliptic Howl', ['Diabolos']='Noctoshield', ['Cait Sith']='Reraise II'} pacts.buffspecial = {['Ifrit']='Inferno Howl', ['Garuda']='Fleet Wind', ['Titan']='Earthen Armor', ['Diabolos']='Dream Shroud', ['Carbuncle']='Soothing Ruby', ['Fenrir']='Heavenward Howl', ['Cait Sith']='Raise II'} pacts.debuff1 = {['Shiva']='Diamond Storm', ['Ramuh']='Shock Squall', ['Leviathan']='Tidal Roar', ['Fenrir']='Lunar Cry', ['Diabolos']='Pavor Nocturnus', ['Cait Sith']='Eerie Eye'} pacts.debuff2 = {['Shiva']='Sleepga', ['Leviathan']='Slowga', ['Fenrir']='Lunar Roar', ['Diabolos']='Somnolence'} pacts.sleep = {['Shiva']='Sleepga', ['Diabolos']='Nightmare', ['Cait Sith']='Mewing Lullaby'} pacts.nuke2 = {['Ifrit']='Fire II', ['Shiva']='Blizzard II', ['Garuda']='Aero II', ['Titan']='Stone II', ['Ramuh']='Thunder II', ['Leviathan']='Water II'} pacts.nuke4 = {['Ifrit']='Fire IV', ['Shiva']='Blizzard IV', ['Garuda']='Aero IV', ['Titan']='Stone IV', ['Ramuh']='Thunder IV', ['Leviathan']='Water IV'} pacts.bp70 = {['Ifrit']='Flaming Crush', ['Shiva']='Rush', ['Garuda']='Predator Claws', ['Titan']='Mountain Buster', ['Ramuh']='Chaotic Strike', ['Leviathan']='Spinning Dive', ['Carbuncle']='Meteorite', ['Fenrir']='Eclipse Bite', ['Diabolos']='Nether Blast',['Cait Sith']='Regal Scratch'} pacts.bp75 = {['Ifrit']='Meteor Strike', ['Shiva']='Heavenly Strike', ['Garuda']='Wind Blade', ['Titan']='Geocrush', ['Ramuh']='Thunderstorm', ['Leviathan']='Grand Fall', ['Carbuncle']='Holy Mist', ['Fenrir']='Lunar Bay', ['Diabolos']='Night Terror', ['Cait Sith']='Level ? Holy'} pacts.astralflow = {['Ifrit']='Inferno', ['Shiva']='Diamond Dust', ['Garuda']='Aerial Blast', ['Titan']='Earthen Fury', ['Ramuh']='Judgment Bolt', ['Leviathan']='Tidal Wave', ['Carbuncle']='Searing Light', ['Fenrir']='Howling Moon', ['Diabolos']='Ruinous Omen', ['Cait Sith']="Altana's Favor"} -- Wards table for creating custom timers wards = {} -- Base duration for ward pacts. wards.durations = { ['Crimson Howl'] = 60, ['Earthen Armor'] = 60, ['Inferno Howl'] = 60, ['Heavenward Howl'] = 60, ['Rolling Thunder'] = 120, ['Fleet Wind'] = 120, ['Shining Ruby'] = 180, ['Frost Armor'] = 180, ['Lightning Armor'] = 180, ['Ecliptic Growl'] = 180, ['Glittering Ruby'] = 180, ['Hastega'] = 180, ['Noctoshield'] = 180, ['Ecliptic Howl'] = 180, ['Dream Shroud'] = 180, ['Reraise II'] = 3600 } -- Icons to use when creating the custom timer. wards.icons = { ['Earthen Armor'] = 'spells/00299.png', -- 00299 for Titan ['Shining Ruby'] = 'spells/00043.png', -- 00043 for Protect ['Dream Shroud'] = 'spells/00304.png', -- 00304 for Diabolos ['Noctoshield'] = 'spells/00106.png', -- 00106 for Phalanx ['Inferno Howl'] = 'spells/00298.png', -- 00298 for Ifrit ['Hastega'] = 'spells/00358.png', -- 00358 for Hastega ['Rolling Thunder'] = 'spells/00104.png', -- 00358 for Enthunder ['Frost Armor'] = 'spells/00250.png', -- 00250 for Ice Spikes ['Lightning Armor'] = 'spells/00251.png', -- 00251 for Shock Spikes ['Reraise II'] = 'spells/00135.png', -- 00135 for Reraise ['Fleet Wind'] = 'abilities/00074.png', -- } -- Flags for code to get around the issue of slow skill updates. wards.flag = false wards.spell = '' end ------------------------------------------------------------------------------------------------------------------- -- 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 user_setup() state.OffenseMode:options('None', 'Normal', 'Acc','Locked')--press f9 to change, normal will be standard midcast acc is midcast.acc for BP state.CastingMode:options('Normal', 'Resistant') state.IdleMode:options('none', 'Normal', 'PDT', 'MDT') gear.perp_staff = {name=""} select_default_macro_book() end -- Define sets and vars used by this job file. function init_gear_sets() -------------------------------------- -- Precast Sets -------------------------------------- -- Precast sets to enhance JAs sets.precast.JA['Astral Flow'] = {head="Glyphic Horn +1"} sets.precast.JA['Elemental Siphon'] = { main={ name="Keraunos", augments={'Pet: Mag. Acc.+15','"Elemental Siphon"+25',}}, sub="Vox Grip", ammo="Esper Stone +1", head={ name="Telchine Cap", augments={'"Elemental Siphon"+35',}}, body={ name="Telchine Chas.", augments={'"Elemental Siphon"+35',}}, hands={ name="Telchine Gloves", augments={'"Elemental Siphon"+35',}}, legs={ name="Telchine Braconi", augments={'"Elemental Siphon"+35',}}, feet="Beck. Pigaches +1", neck="Incanter's Torque", waist="Kobo Obi", left_ear="Andoaa Earring", right_ear="Smn. Earring", left_ring="Zodiac Ring", right_ring="Evoker's Ring", back={ name="Conveyance Cape", augments={'Summoning magic skill +5','Pet: Enmity+7','Blood Pact Dmg.+1','Blood Pact ab. del. II -1',}}, } sets.precast.JA['Mana Cede'] = {hands="Beck. Bracers +1"} -- Pact delay reduction gear sets.precast.BloodPactWard = { main="Nirvana", ammo="Sancus Sachet +1", body="Con. Doublet +3",} sets.precast.BloodPactRage = sets.precast.BloodPactWard -- Fast cast sets for spells sets.precast.FC = { main="Oranyan", sub="Clerisy Strap +1", ammo="Impatiens", head={ name="Merlinic Hood", augments={'"Mag.Atk.Bns."+27','"Fast Cast"+7','CHR+10','Mag. Acc.+11',}}, body="Inyanga Jubbah +1", hands={ name="Merlinic Dastanas", augments={'Mag. Acc.+27','"Fast Cast"+6','MND+6','"Mag.Atk.Bns."+4',}}, legs={ name="Psycloth Lappas", augments={'MP+80','Mag. Acc.+15','"Fast Cast"+7',}}, feet={ name="Merlinic Crackows", augments={'Mag. Acc.+4','"Fast Cast"+7','"Mag.Atk.Bns."+7',}}, neck="Voltsurge Torque", waist="Witful Belt", left_ear="Etiolation Earring", right_ear="Loquac. Earring", left_ring="Kishar Ring", right_ring="Veneficium Ring", back="Perimede Cape", } sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"}) -- Weaponskill sets -- Default set for any weaponskill that isn't any more specifically defined sets.precast.WS = {body="twilight cloak"} -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found. sets.precast.WS['Myrkr'] = {body="witching robe"} -------------------------------------- -- Midcast sets -------------------------------------- sets.midcast.FastRecast = { main="Oranyan", sub="Clerisy Strap +1", ammo="Impatiens", head={ name="Merlinic Hood", augments={'"Mag.Atk.Bns."+27','"Fast Cast"+7','CHR+10','Mag. Acc.+11',}}, body="Inyanga Jubbah +1", hands={ name="Merlinic Dastanas", augments={'Mag. Acc.+27','"Fast Cast"+6','MND+6','"Mag.Atk.Bns."+4',}}, legs={ name="Psycloth Lappas", augments={'MP+80','Mag. Acc.+15','"Fast Cast"+7',}}, feet={ name="Merlinic Crackows", augments={'Mag. Acc.+4','"Fast Cast"+7','"Mag.Atk.Bns."+7',}}, neck="Voltsurge Torque", waist="Witful Belt", left_ear="Etiolation Earring", right_ear="Loquac. Earring", left_ring="Kishar Ring", right_ring="Veneficium Ring", back="Perimede Cape", } sets.midcast.Cure = {main="iridal staff"} sets.midcast.Stoneskin = {neck="twilight torque"} sets.midcast['Elemental Magic'] = {main="marin staff"} sets.midcast['Dark Magic'] = {main="serenity"} -- Avatar pact sets. All pacts are Ability type. sets.midcast.Pet.BloodPactWard = { main={ name="Espiritus", augments={'Summoning magic skill +15','Pet: Mag. Acc.+30','Pet: Damage taken -4%',}}, sub="Vox Grip", ammo="Sancus Sachet +1", head="Beckoner's Horn +1", body="Beck. Doublet +1", hands="Beck. Bracers +1", legs="Beck. Spats +1", feet="Beck. Pigaches +1", neck="Incanter's Torque", waist="Kobo Obi", left_ear="Andoaa Earring", right_ear="Smn. Earring", left_ring="Evoker's Ring", right_ring="Globidonta Ring", back={ name="Conveyance Cape", augments={'Summoning magic skill +5','Pet: Enmity+7','Blood Pact Dmg.+1','Blood Pact ab. del. II -1',}}, } sets.midcast.Pet.DebuffBloodPactWard = { main={ name="Grioavolr", augments={'Blood Pact Dmg.+5','Pet: INT+11','Pet: Mag. Acc.+29','Pet: "Mag.Atk.Bns."+28','DMG:+13',}}, sub="Vox Grip", ammo="Sancus Sachet +1", head="Convoker's Horn +3", body="Con. Doublet +3", hands="Convo. Bracers +3", legs="Convo. Spats +3", feet="Convo. Pigaches +3", neck="Adad Amulet", waist="Regal Belt", left_ear="Lugalbanda Earring", right_ear="Andoaa Earring", left_ring="Globidonta Ring", right_ring="Defending Ring", back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Pet: Magic Damage+10','Pet: "Regen"+10',}}, } sets.midcast.Pet.DebuffBloodPactWard.Acc = { main={ name="Grioavolr", augments={'Blood Pact Dmg.+5','Pet: INT+11','Pet: Mag. Acc.+29','Pet: "Mag.Atk.Bns."+28','DMG:+13',}}, sub="Vox Grip", ammo="Sancus Sachet +1", head="Convoker's Horn +3", body="Con. Doublet +3", hands="Convo. Bracers +3", legs="Convo. Spats +3", feet="Convo. Pigaches +3", neck="Adad Amulet", waist="Regal Belt", left_ear="Lugalbanda Earring", right_ear="Andoaa Earring", left_ring="Globidonta Ring", right_ring="Defending Ring", back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Pet: Magic Damage+10','Pet: "Regen"+10',}}, } sets.midcast.Pet.PhysicalBloodPactRage = { main="Nirvana", sub="Elan Strap +1", ammo="Sancus Sachet +1", head={ name="Helios Band", augments={'Pet: Attack+30 Pet: Rng.Atk.+30','Pet: "Dbl. Atk."+8','Blood Pact Dmg.+7',}}, body="Con. Doublet +3", hands={ name="Merlinic Dastanas", augments={'Pet: Mag. Acc.+21 Pet: "Mag.Atk.Bns."+21','Blood Pact Dmg.+8','Pet: DEX+8','Pet: Mag. Acc.+8','Pet: "Mag.Atk.Bns."+8',}}, legs={ name="Apogee Slacks +1", augments={'Pet: STR+20','Blood Pact Dmg.+14','Pet: "Dbl. Atk."+4',}}, feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: Attack+35','Blood Pact Dmg.+8',}}, neck="Shulmanu Collar", waist="Incarnation Sash", left_ear="Gelos Earring", right_ear="Lugalbanda Earring", left_ring="Varar Ring +1", right_ring="Varar Ring +1", back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: Haste+10',}}, } sets.midcast.Pet.PhysicalBloodPactRage.Acc = set_combine(sets.midcast.Pet.PhysicalBloodPactRage, {waist="Incarnation Sash"}) sets.midcast.Pet.MagicalBloodPactRage = { main={ name="Grioavolr", augments={'Blood Pact Dmg.+8','Pet: AGI+6','Pet: Mag. Acc.+5','Pet: "Mag.Atk.Bns."+28',}}, sub="Elan Strap +1", ammo="Sancus Sachet +1", head={ name="Apogee Crown +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}, body={ name="Apo. Dalmatica +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}, hands={ name="Merlinic Dastanas", augments={'Pet: Mag. Acc.+21 Pet: "Mag.Atk.Bns."+21','Blood Pact Dmg.+8','Pet: DEX+8','Pet: Mag. Acc.+8','Pet: "Mag.Atk.Bns."+8',}}, legs={ name="Apogee Slacks +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}, feet={ name="Apogee Pumps +1", augments={'MP+80','Pet: "Mag.Atk.Bns."+35','Blood Pact Dmg.+8',}}, neck="Adad Amulet", waist="Regal Belt", left_ear="Lugalbanda Earring", right_ear="Gelos Earring", left_ring="Varar Ring +1", right_ring="Varar Ring +1", back={ name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Pet: Magic Damage+10','Pet: "Regen"+10',}}, } sets.midcast.Pet.MagicalBloodPactRage.Acc = set_combine(sets.midcast.Pet.MagicalBloodPactRage, {waist="Incarnation Sash"}) -- Spirits cast magic spells, which can be identified in standard ways. sets.midcast.Pet.WhiteMagic = {ear1="loquacious earring"} sets.midcast.Pet['Elemental Magic'] = {neck="henic torque"} sets.midcast.Pet['Elemental Magic'].Resistant = {"Mizu. Kubikazari"} -------------------------------------- -- Idle/resting/defense/etc sets -------------------------------------- -- Resting sets sets.resting = {neck="stone gorget"} -- Idle sets sets.idle = { main={ name="Keraunos", augments={'"Refresh"+1',}}, sub="Oneiros Grip", ammo="Sancus Sachet +1", head="Convoker's Horn +3", body={ name="Apo. Dalmatica +1", augments={'Summoning magic skill +20','Enmity-6','Pet: Damage taken -4%',}}, hands="Asteria Mitts +1", legs="Assid. Pants +1", feet={ name="Merlinic Crackows", augments={'INT+7','DEX+10','"Refresh"+2','Accuracy+6 Attack+6','Mag. Acc.+19 "Mag.Atk.Bns."+19',}}, neck="Loricate Torque +1", waist="Fucho-no-Obi", left_ear={ name="Moonshade Earring", augments={'Mag. Acc.+4','Latent effect: "Refresh"+1',}}, right_ear="Etiolation Earring", left_ring="Evoker's Ring", right_ring="Defending Ring", back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: Haste+10',}}, } sets.idle.PDT = set_combine(sets.idle, {waist="Fucho-no-Obi"}) --sets.idle.avatar is over wrote by sets.idle.avatar.favor if you have avatar favor up it will over write. sets.idle.Avatar = { main="Nirvana", sub="Oneiros Grip", ammo="Sancus Sachet +1", head="Convoker's Horn +3", body={ name="Apo. Dalmatica +1", augments={'Summoning magic skill +20','Enmity-6','Pet: Damage taken -4%',}}, hands="Asteria Mitts +1", legs="Assid. Pants +1", feet={ name="Merlinic Crackows", augments={'INT+7','DEX+10','"Refresh"+2','Accuracy+6 Attack+6','Mag. Acc.+19 "Mag.Atk.Bns."+19',}}, neck="Caller's Pendant", waist="Fucho-no-Obi", left_ear={ name="Moonshade Earring", augments={'Mag. Acc.+4','Latent effect: "Refresh"+1',}}, right_ear="Evans Earring", left_ring="Evoker's Ring", right_ring="Defending Ring", back={ name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Pet: Attack+10 Pet: Rng.Atk.+10','Pet: Haste+10',}}, } sets.idle.PDT.Avatar = set_combine(sets.idle.Avatar, {waist="Fucho-no-Obi"}) sets.idle.Spirit = set_combine(sets.idle.Avatar, {waist="Fucho-no-Obi"}) --gear automatically equiped when walking in adoulin areas is sets.Adoulin and sets.Movespeed is eqiped always when moving is detected. sets.Adoulin = { body="Councilor's Garb", } sets.MoveSpeed = { feet = "Herald's Gaiters", } sets.idle.Town = {neck="Wiglen gorget"} sets.idle.Avatar.Favor = set_combine(sets.idle.Avatar, {head="Beckoner's Horn +1"}) sets.idle.Avatar.Melee = {neck="smithy's torque"} sets.perp = {legs="Hagondes Pants +1"} sets.perp.Day = {legs="psycloth lappas"} sets.perp.Weather = {legs="Gyve trousers"} sets.perp.Carbuncle = {legs="nares trews"} sets.perp.Alexander = sets.midcast.Pet.BloodPactWard sets.perp.staff_and_grip = {main=gear.perp_staff,sub="Achaq Grip"} -- Defense sets sets.defense.PDT = {legs="portent pants"} sets.defense.MDT = {legs="haven hose"} sets.Kiting = {feet="Herald's gaiters"} sets.latent_refresh = {waist="Fucho-no-obi"} -------------------------------------- -- Engaged sets -------------------------------------- -- Normal melee group sets.engaged = {feet="regal pumps"} end ------------------------------------------------------------------------------------------------------------------- -- Job-specific hooks for standard casting events. ------------------------------------------------------------------------------------------------------------------- mov = {counter=0} if player and player.index and windower.ffxi.get_mob_by_index(player.index) then mov.x = windower.ffxi.get_mob_by_index(player.index).x mov.y = windower.ffxi.get_mob_by_index(player.index).y mov.z = windower.ffxi.get_mob_by_index(player.index).z end moving = false windower.raw_register_event('prerender',function() mov.counter = mov.counter + 1; if mov.counter>15 then local pl = windower.ffxi.get_mob_by_index(player.index) if pl and pl.x and mov.x then dist = math.sqrt( (pl.x-mov.x)^2 + (pl.y-mov.y)^2 + (pl.z-mov.z)^2 ) if dist > 1 and not moving then state.Moving.value = true send_command('gs equip sets.MoveSpeed') moving = true elseif dist < 1 and moving then state.Moving.value = false send_command('gs c update') moving = false end end if pl and pl.x then mov.x = pl.x mov.y = pl.y mov.z = pl.z end mov.counter = 0 end end) -- 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) if state.Buff['Astral Conduit'] and pet_midaction() then eventArgs.handled = true end end function job_precast(spell, action, spellMap, eventArgs) if spell.type == 'BloodPactRage' and magicalRagePacts:contains(spell.english) then enable('main', 'sub', 'range', 'ammo') add_to_chat(122,'Weapons Unlocked due to magical BloodPactRage.') elseif buffactive["Aftermath: Lv.1"] or buffactive["Aftermath: Lv.2"] or player.tp > 1000 then disable('main', 'sub', 'range', 'ammo') add_to_chat(122,'Weapon locked Aftermath engaged MagicalBloodPactRage not detected.') elseif not buffactive["Aftermath: Lv.1"] or buffactive["Aftermath: Lv.2"] and player.tp < 1000 then enable('main', 'sub', 'range', 'ammo') add_to_chat(122,'Weapons free') end end function job_midcast(spell, action, spellMap, eventArgs) if state.Buff['Astral Conduit'] and pet_midaction() then eventArgs.handled = true end end -- Runs when pet completes an action. function job_pet_aftercast(spell, action, spellMap, eventArgs) if not spell.interrupted and spell.type == 'BloodPactWard' and spellMap ~= 'DebuffBloodPactWard' then wards.flag = true wards.spell = spell.english send_command('wait 4; gs c reset_ward_flag') 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) if state.Buff[buff] ~= nil then handle_equipping_gear(player.status) elseif storms:contains(buff) then handle_equipping_gear(player.status) end end -- Called when the player's pet's status changes. -- This is also called after pet_change after a pet is released. Check for pet validity. function job_pet_status_change(newStatus, oldStatus, eventArgs) if pet.isvalid and not midaction() and not pet_midaction() and (newStatus == 'Engaged' or oldStatus == 'Engaged') then handle_equipping_gear(player.status, newStatus) end end -- Called when a player gains or loses a pet. -- pet == pet structure -- gain == true if the pet was gained, false if it was lost. function job_pet_change(petparam, gain) classes.CustomIdleGroups:clear() if gain then if avatars:contains(pet.name) then classes.CustomIdleGroups:append('Avatar') elseif spirits:contains(pet.name) then classes.CustomIdleGroups:append('Spirit') end else select_default_macro_book('reset') end end ------------------------------------------------------------------------------------------------------------------- -- User code that supplements standard library decisions. ------------------------------------------------------------------------------------------------------------------- -- Custom spell mapping. function job_get_spell_map(spell) if spell.type == 'BloodPactRage' then if magicalRagePacts:contains(spell.english) then return 'MagicalBloodPactRage' else return 'PhysicalBloodPactRage' end elseif spell.type == 'BloodPactWard' and spell.target.type == 'MONSTER' then return 'DebuffBloodPactWard' end end -- Modify the default idle set after it was constructed. function customize_idle_set(idleSet) if pet.isvalid then if pet.element == world.day_element then idleSet = set_combine(idleSet, sets.perp.Day) end if pet.element == world.weather_element then idleSet = set_combine(idleSet, sets.perp.Weather) end if sets.perp[pet.name] then idleSet = set_combine(idleSet, sets.perp[pet.name]) end gear.perp_staff.name = elements.perpetuance_staff_of[pet.element] if gear.perp_staff.name and (player.inventory[gear.perp_staff.name] or player.wardrobe[gear.perp_staff.name]) then idleSet = set_combine(idleSet, sets.perp.staff_and_grip) end if state.Buff["Avatar's Favor"] and avatars:contains(pet.name) then idleSet = set_combine(idleSet, sets.idle.Avatar.Favor) end if pet.status == 'Engaged' then idleSet = set_combine(idleSet, sets.idle.Avatar.Melee) end end if player.mpp < 51 then idleSet = set_combine(idleSet, sets.latent_refresh) end return idleSet end -- Called by the 'update' self-command, for common needs. -- Set eventArgs.handled to true if we don't want automatic equipping of gear. function job_update(cmdParams, eventArgs) classes.CustomIdleGroups:clear() if pet.isvalid then if avatars:contains(pet.name) then classes.CustomIdleGroups:append('Avatar') elseif spirits:contains(pet.name) then classes.CustomIdleGroups:append('Spirit') end end end -- Set eventArgs.handled to true if we don't want the automatic display to be run. function display_current_job_state(eventArgs) end ------------------------------------------------------------------------------------------------------------------- -- User self-commands. ------------------------------------------------------------------------------------------------------------------- -- Called for custom player commands. function job_self_command(cmdParams, eventArgs) if cmdParams[1]:lower() == 'petweather' then handle_petweather() eventArgs.handled = true elseif cmdParams[1]:lower() == 'siphon' then handle_siphoning() eventArgs.handled = true elseif cmdParams[1]:lower() == 'pact' then handle_pacts(cmdParams) eventArgs.handled = true elseif cmdParams[1] == 'reset_ward_flag' then wards.flag = false wards.spell = '' eventArgs.handled = true end end ------------------------------------------------------------------------------------------------------------------- -- Utility functions specific to this job. ------------------------------------------------------------------------------------------------------------------- -- Cast the appopriate storm for the currently summoned avatar, if possible. function handle_petweather() if player.sub_job ~= 'SCH' then add_to_chat(122, "You can not cast storm spells") return end if not pet.isvalid then add_to_chat(122, "You do not have an active avatar.") return end local element = pet.element if element == 'Thunder' then element = 'Lightning' end if S{'Light','Dark','Lightning'}:contains(element) then add_to_chat(122, 'You do not have access to '..elements.storm_of[element]..'.') return end local storm = elements.storm_of[element] if storm then send_command('@input /ma "'..elements.storm_of[element]..'" <me>') else add_to_chat(123, 'Error: Unknown element ('..tostring(element)..')') end end -- Custom uber-handling of Elemental Siphon function handle_siphoning() if areas.Cities:contains(world.area) then add_to_chat(122, 'Cannot use Elemental Siphon in a city area.') return end local siphonElement local stormElementToUse local releasedAvatar local dontRelease -- If we already have a spirit out, just use that. if pet.isvalid and spirits:contains(pet.name) then siphonElement = pet.element dontRelease = true -- If current weather doesn't match the spirit, but the spirit matches the day, try to cast the storm. if player.sub_job == 'SCH' and pet.element == world.day_element and pet.element ~= world.weather_element then if not S{'Light','Dark','Lightning'}:contains(pet.element) then stormElementToUse = pet.element end end -- If we're subbing /sch, there are some conditions where we want to make sure specific weather is up. -- If current (single) weather is opposed by the current day, we want to change the weather to match -- the current day, if possible. elseif player.sub_job == 'SCH' and world.weather_element ~= 'None' then -- We can override single-intensity weather; leave double weather alone, since even if -- it's partially countered by the day, it's not worth changing. if get_weather_intensity() == 1 then -- If current weather is weak to the current day, it cancels the benefits for -- siphon. Change it to the day's weather if possible (+0 to +20%), or any non-weak -- weather if not. -- If the current weather matches the current avatar's element (being used to reduce -- perpetuation), don't change it; just accept the penalty on Siphon. if world.weather_element == elements.weak_to[world.day_element] and (not pet.isvalid or world.weather_element ~= pet.element) then -- We can't cast lightning/dark/light weather, so use a neutral element if S{'Light','Dark','Lightning'}:contains(world.day_element) then stormElementToUse = 'Wind' else stormElementToUse = world.day_element end end end end -- If we decided to use a storm, set that as the spirit element to cast. if stormElementToUse then siphonElement = stormElementToUse elseif world.weather_element ~= 'None' and (get_weather_intensity() == 2 or world.weather_element ~= elements.weak_to[world.day_element]) then siphonElement = world.weather_element else siphonElement = world.day_element end local command = '' local releaseWait = 0 if pet.isvalid and avatars:contains(pet.name) then command = command..'input /pet "Release" <me>;wait 1.1;' releasedAvatar = pet.name releaseWait = 10 end if stormElementToUse then command = command..'input /ma "'..elements.storm_of[stormElementToUse]..'" <me>;wait 4;' releaseWait = releaseWait - 4 end if not (pet.isvalid and spirits:contains(pet.name)) then command = command..'input /ma "'..elements.spirit_of[siphonElement]..'" <me>;wait 4;' releaseWait = releaseWait - 4 end command = command..'input /ja "Elemental Siphon" <me>;' releaseWait = releaseWait - 1 releaseWait = releaseWait + 0.1 if not dontRelease then if releaseWait > 0 then command = command..'wait '..tostring(releaseWait)..';' else command = command..'wait 1.1;' end command = command..'input /pet "Release" <me>;' end if releasedAvatar then command = command..'wait 1.1;input /ma "'..releasedAvatar..'" <me>' end send_command(command) end -- Handles executing blood pacts in a generic, avatar-agnostic way. -- cmdParams is the split of the self-command. -- gs c [pact] [pacttype] function handle_pacts(cmdParams) if areas.Cities:contains(world.area) then add_to_chat(122, 'You cannot use pacts in town.') return end if not pet.isvalid then add_to_chat(122,'No avatar currently available. Returning to default macro set.') select_default_macro_book('reset') return end if spirits:contains(pet.name) then add_to_chat(122,'Cannot use pacts with spirits.') return end if not cmdParams[2] then add_to_chat(123,'No pact type given.') return end local pact = cmdParams[2]:lower() if not pacts[pact] then add_to_chat(123,'Unknown pact type: '..tostring(pact)) return end if pacts[pact][pet.name] then if pact == 'astralflow' and not buffactive['astral flow'] then add_to_chat(122,'Cannot use Astral Flow pacts at this time.') return end -- Leave out target; let Shortcuts auto-determine it. send_command('@input /pet "'..pacts[pact][pet.name]..'"') else add_to_chat(122,pet.name..' does not have a pact of type ['..pact..'].') end end -- Event handler for updates to player skill, since we can't rely on skill being -- correct at pet_aftercast for the creation of custom timers. windower.raw_register_event('incoming chunk', function (id) if id == 0x62 then if wards.flag then create_pact_timer(wards.spell) wards.flag = false wards.spell = '' end end end) -- Function to create custom timers using the Timers addon. Calculates ward duration -- based on player skill and base pact duration (defined in job_setup). function create_pact_timer(spell_name) -- Create custom timers for ward pacts. if wards.durations[spell_name] then local ward_duration = wards.durations[spell_name] if ward_duration < 181 then local skill = player.skills.summoning_magic if skill > 300 then skill = skill - 300 if skill > 200 then skill = 200 end ward_duration = ward_duration + skill end end local timer_cmd = 'timers c "'..spell_name..'" '..tostring(ward_duration)..' down' if wards.icons[spell_name] then timer_cmd = timer_cmd..' '..wards.icons[spell_name] end send_command(timer_cmd) end end -- Select default macro book on initial load or subjob change. function select_default_macro_book(reset) if reset == 'reset' then -- lost pet, or tried to use pact when pet is gone end -- Default macro set/book set_macro_page(4, 16) end You need to not equip aftercast gear if you're using a bloodpact ability. It's entirely possible the JA completion packet comes in after the avatar JA start packet.
You use JA : Precast event equips gear Pet starts ability : Pet midcast event equips gear Your JA has finished: Aftercast event equips gear (your pet is now casting with your aftercast gear) Pets JA has finished: Pet aftercast event equips gear Leviathan.Celebrindal
Offline
Issue with some updates to my RNG lua...
Cele's RNG lua Firstly, I added in a rule for double shot(line 536), in the hopes that it will combine my Oshosi Mask(and future Oshosi pieces,likely) with my currently active midshot set. It isn't fully working as intended. Second, it gets really messed up if both Double Shot and Camouflage are active...since I have defined sets for Camouflage I would like it to default to my Camouflage set. Any help is appreciated! I can't figure out why my refoccilation stone isn't equipping for any of my elemental nukes outside of weather-based ones. Any ideas?
https://pastebin.com/CdkJdTS7 Shiva.Hiep said: » I can't figure out why my refoccilation stone isn't equipping for any of my elemental nukes outside of weather-based ones. Any ideas? https://pastebin.com/CdkJdTS7 You have it named gear.obi_waist = "Refoccilation Stone" but then try to call it in most sets with gear.ElementalObi Asura.Chiaia said: » Shiva.Hiep said: » I can't figure out why my refoccilation stone isn't equipping for any of my elemental nukes outside of weather-based ones. Any ideas? https://pastebin.com/CdkJdTS7 You have it named gear.obi_waist = "Refoccilation Stone" but then try to call it in most sets with gear.ElementalObi Offline
Posts: 78
https://pastebin.com/93GbgPSg
Could someone help me out? I've been struggling with getting sets.midcast.Stoneskin and sets.midcast.Refresh to work; I can load them using //gs equip sets.midcast.Stoneskin, but if I actually cast stoneskin, it equips my sets.midcast['Enhancing Magic'] set. I tried switching the order around to no avail, I've used set_combine in stoneskin to combine the sets.midcast['Enhancing Magic'] with the Stoneskin potency items and I've tried adding Stoneskin to the list of spells in GearSwap/libs/Mote-Mappings.lua. The one thing that has made it work so far is blatantly deleting the sets.midcast['Enhancing Magic'], which I don't want to do obviously since it'd affect my other enhancing spells. I figured it must be a priority problem of some sorts, but I don't know how to fix this. Also, I've added all enspells in GearSwap/libs/Mote-Mappings.lua under the group 'Enspell', one by one. Does this mean I can use them as sets.midcast.Enspell in my RDM lua? Thanks in advance for helping out! :) Ragnarok.Martel
Offline
I can't tell from looking at your lua, because it's a motenten lua and has includes that aren't shown in that pastebin, but presumably the sets.midcast.spellname rule occurs in the midcast rules in the include, and then is overwritten by your enhancing magic rule in the job_post_midcast function.
To avoid this you'd either need to add some kind of exception to prevent the job_post_midcast enhancing magic rule from activating on select spells, or you'd need a sets.midcast.spellname rule duplicate in your job_post_midcast. Offline
Posts: 78
Is there a better standardized RDM lua I can adjust that has it's priorities right? If there isn't, which of these would you reckon has the priority description in it?
libs/Modes.lua libs/Mote-Globals.lua libs/Mote-Include.lua libs/Mote-Mappings.lua libs/Mote-SelfCommands.lua libs/Mote-TreasureHunter.lua libs/Mote-Utility.lua libs/organizer-lib.lua I have a feeling it's Mote-Include, which is this one: https://pastebin.com/qUVZJZu8 I've been trying to find where the ['Enhancing Magic'] spell list is, but I can't find it in any of the files. That would be the easiest fix for me, just removing stoneskin from that list. I can't find it anywhere though. Thanks for helping out btw! Ragnarok.Martel
Offline
The skill a spell uses is part of the resources, so it's not going to be listed in a job lua, cause there's no need to do so.(DON'T edit your resources.)
It looks like the midcast call, and the functions it calls are in mote include, but I have trouble making sense of some of mote's stuff, and editing it would probably be a really bad idea. Let's go for the simple solution. On line 262 where you have, elseif spell.skill == 'Enhancing Magic' then Do this instead. elseif spell.skill == 'Enhancing Magic' not sets.midcast[spell.english] then The, not sets.midcast[spell.english] portion added to this rule checks to see if a gear set matching set.midcast.exactspellname exists. If you're casting stoneskin then it would look for sets.midcast.Stoneskin. If it finds such a set in your get_sets then the rule fails, and the enhancing section is skipped. Offline
Posts: 78
It should work, but when I reload GS it gives an error message saying "then" is expected near "not", even though it's right behind the argument. I feel stupid for asking, but what is GS on about?
Edit: Fixed it by making it say "and not [arg] then" Offline
Posts: 78
At least it works for individual spells now, do you also know a sets.midcast[arg] for groups of spells like Cure or Status removal (in my case enspells)? Thanks a lot for the help btw, learning a lot! :)
Edit: For clarification, I've added 6 T1 enspells in this list: https://pastebin.com/nzmeL1gy Made the group name "Enspell", but I'm not quite sure how to utilize it in the job lua yet. How do I refer to this list, or is this done automatically? Edit 2: Nvm, asked a little too soon! Managed to make another "and not [arg]" behind the first one using [spellMap]! :) Thanks again for your help, it's been a valuable evening! Ragnarok.Martel
Offline
Rainemard said: » It should work, but when I reload GS it gives an error message saying "then" is expected near "not", even though it's right behind the argument. I feel stupid for asking, but what is GS on about? Edit: Fixed it by making it say "and not [arg] then" Asura.Byrne said: » Asura.Ladyofhonor said: » So what's the best way to get the same ring to equip in both slots? Best I've seen just says to have ring1 at the start of a gearset and ring2 at the end, is that the best that can be done? I'm not entirely sure what you mean by this, would you mind clarifying? Do you mean equipping two of the same ring name, or equipping the exact same ring to two different slots? Asura.Wyrd said: » Asura.Byrne said: » Asura.Ladyofhonor said: » So what's the best way to get the same ring to equip in both slots? Best I've seen just says to have ring1 at the start of a gearset and ring2 at the end, is that the best that can be done? I'm not entirely sure what you mean by this, would you mind clarifying? Do you mean equipping two of the same ring name, or equipping the exact same ring to two different slots? Discovered this is only seemingly an issue if if both earrings are in the same place (ie wardrobe2, inventory, etc). Putting each in a different container seems to circumvent the issue. Edit: Next day with both Mache Earrings in different wardrobes the trouble began again. The behavior seems rather inconsistent. Can anyone please explain to me how to get gearswap to use a specific augmented equipment.
Leviathan.Celebrindal
Offline
Asura.Bloodkitten said: » Can anyone please explain to me how to get gearswap to use a specific augmented equipment. 1. equip the piece of gear in question. 2. use //gs export 3. in notepad++ look in the "data" folder of Gearswap, and you'll see a folder titled "export". When you did the previous command, it created a file with the naming convention of <character> <timestamp>. 4. Open file. 5. See the piece of gear in question with all the proper augments already there. 6. Copy/Paste into the lua you need it in. thank you
so.. i dont know why buy as long as i can remember, my gearswap does NOT allow me to use "gs" as a shortcut, EVERY command i use has to be "gearswap" gearswap c, gs c DOES NOT WORK. any solution?
Hello, don't know if anyone can help me but my doom equipement dosen't equip. it seem like that it dosen't reconise buffactive['Doom'] buffactive['doom'] or buffactive.Doom
but when i try it with buffactive['Protect'] it seem to work :( Code function job_setup() state.Buff.Doom = buffactive['Doom'] or false -- /BLU Spell Maps blue_magic_maps = {} blue_magic_maps.Enmity = S{'Blank Gaze', 'Geist Wall', 'Jettatura', 'Soporific', 'Poison Breath', 'Blitzstrahl', 'Sheep Song', 'Chaotic Eye'} blue_magic_maps.Cure = S{'Wild Carrot'} blue_magic_maps.Buffs = S{'Cocoon', 'Refueling'} rayke_duration = 50 gambit_duration = 98 end Code function job_buff_change(buff,gain) if buffactive['Doom'] and gain then handle_equipping_gear(player.status) end -- If we gain or lose any haste buffs, adjust which gear set we target. if buffactive['Reive Mark'] then equip(sets.Reive) disable('neck') else enable('neck') end end Lakshmi.Reddwarf said: » so.. i dont know why buy as long as i can remember, my gearswap does NOT allow me to use "gs" as a shortcut, EVERY command i use has to be "gearswap" gearswap c, gs c DOES NOT WORK. any solution? Fenrir.Dracosam said: » Hello, don't know if anyone can help me but my doom equipement dosen't equip. it seem like that it dosen't reconise buffactive['Doom'] buffactive['doom'] or buffactive.Doom but when i try it with buffactive['Protect'] it seem to work :( Sylph.Subadai said: » Lakshmi.Reddwarf said: » so.. i dont know why buy as long as i can remember, my gearswap does NOT allow me to use "gs" as a shortcut, EVERY command i use has to be "gearswap" gearswap c, gs c DOES NOT WORK. any solution? OMG i think you're right, i have it set for my DRK to switch to Greatsword. i'll try removing that to see what happens. Sylph.Subadai said: » Fenrir.Dracosam said: » Hello, don't know if anyone can help me but my doom equipement dosen't equip. it seem like that it dosen't reconise buffactive['Doom'] buffactive['doom'] or buffactive.Doom but when i try it with buffactive['Protect'] it seem to work :( Fenrir.Dracosam said: » Sylph.Subadai said: » Fenrir.Dracosam said: » Hello, don't know if anyone can help me but my doom equipement dosen't equip. it seem like that it dosen't reconise buffactive['Doom'] buffactive['doom'] or buffactive.Doom but when i try it with buffactive['Protect'] it seem to work :( See here for a solution, assuming you're using Mote-libs. thanks i will try and test it. but i don't understand why it work when i try 'protect' and when i go test it for doom it's not working :( i will come back to you tommorow night ;) still not working ... maybe i missed something in my code here it is if you have 2 sec to take a look https://pastebin.com/mpJG4NTF Is there a reason you decided to change the original doom function in my lua? The way you're trying to do it seems over-complicated.
Try one of these, maybe it'll help: Code state.Buff.Doom = buffactive['doom'] or false Code state.Buff.Doom = buffactive['doomed'] or false |
||
All FFXI content and images © 2002-2024 SQUARE ENIX CO., LTD. FINAL
FANTASY is a registered trademark of Square Enix Co., Ltd.
|