|
Gearswap Support Thread
By Lunareticc 2015-04-10 14:43:41
With the help of Pergatory I solved my problem podcast for my avatar.
By cons I lost a function that I had in my old gearswap I can not seem to fit into that one.
Can you help me? I am looking to have a set when my pet is engage and equip the Refresh pieces depending on time of day.
Here is my gearswap for Idle function.
function idle()
if TownIdle:contains(world.area:lower()) then
return
end
if pet.isvalid then
if string.find(pet.name,'Spirit') then
equip(sets.aftercast.Spirit)
elseif pet.status == 'Engaged' then
equip(sets.aftercast.Perp_Normal,{hands=PetDOTHands, feet=PetDOTFeet})
elseif world.time >= 17*60 or world.time < 7*60 then
equip(sets.aftercast.night_time)
else
equip(sets.aftercast.days_time)
end
equip(sets.aftercast.Perp_Normal)
else
equip(sets.aftercast.None)
end
end
Quetzalcoatl.Senyn
サーバ: Quetzalcoatl
Game: FFXI
Posts: 106
By Quetzalcoatl.Senyn 2015-04-10 22:17:18
Need help with something qq
I think I did the right coding for Mug, but when I use it, the character stays in the Mug set, instead of switching back to tp gear.
Really no idea why it won't go back into the tp set, it works for all other JA's.
Code -- Precast sets to enhance JAs
sets.precast.JA['Collaborator'] = {head="Raider's Bonnet +2"}
sets.precast.JA['Accomplice'] = {head="Raider's Bonnet +2"}
sets.precast.JA['Flee'] = {feet="Pillager's Poulaines +1"}
sets.precast.JA['Hide'] = {body="Pillager's Vest +1"}
sets.precast.JA['Conspirator'] = {} -- {body="Raider's Vest +2"}
sets.precast.JA['Steal'] = {head="Plunderer's Bonnet",hands="Pillager's Armlets +1",legs="Pillager's Culottes +1",feet="Pillager's Poulaines +1"}
sets.precast.JA['Despoil'] = {legs="Raider's Culottes +2",feet="Raider's Poulaines +2"}
sets.precast.JA['Perfect Dodge'] = {hands="Plunderer's Armlets +1"}
sets.precast.JA['Feint'] = {} -- {legs="Plunderer's culottes"}
sets.precast.JA['Mug'] = {
head="Pillager's bonnet +1",neck="Fotia gorget",ear1="Dawn Earring",ear2="Suppanomimi",
body="Dread jupon",hands="Pillager's armlets +1",ring1="Epona's Ring",ring2="Rajas Ring",
back="Meanagh cape +1",waist="Chaac Belt",legs="Pillager's culottes +1",feet="Plunderer's poulaines +1"}
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-11 23:24:35
With the help of Pergatory I solved my problem podcast for my avatar.
By cons I lost a function that I had in my old gearswap I can not seem to fit into that one.
Can you help me? I am looking to have a set when my pet is engage and equip the Refresh pieces depending on time of day.
Here is my gearswap for Idle function. Code
function idle()
if TownIdle:contains(world.area:lower()) then
return
end
if pet.isvalid then
if string.find(pet.name,'Spirit') then
equip(sets.aftercast.Spirit)
elseif pet.status == 'Engaged' then
equip(sets.aftercast.Perp_Normal,{hands=PetDOTHands, feet=PetDOTFeet})
elseif world.time >= 17*60 or world.time < 7*60 then
equip(sets.aftercast.night_time)
else
equip(sets.aftercast.days_time)
end
equip(sets.aftercast.Perp_Normal)
else
equip(sets.aftercast.None)
end
end I haven't tested this code since I wrote it on the fly but it should work for you. Code
function aftercast(spell, action)
update_gear()
end
function pet_aftercast(spell)
update_pet_gear()
end
function status_change(new, old)
update_gear()
end
function pet_status_change(new, old)
update_pet_gear()
end
function update_gear()
if player.status == 'Engaged' then
equip(sets.Engaged)
elseif player.status == 'Idle' then
equip(sets.aftercast.None)
else
equip(sets.Resting)
end
update_pet_gear()
end
function update_pet_gear()
if pet.isvalid then
if player.status == 'Resting' then
add_to_chat(8,'----- You cannot Rest with an avatar out. -----')
end
if string.find(pet.name, 'Spirit') then
equip(sets.aftercast.Spirit)
end
if pet.status == 'Engaged' then
if world.time >= 17*60 or world.time < 7*60 then
equip(sets.aftercast.night_time)
else
equip(sets.aftercast.days_time)
end
elseif pet.status == 'Idle' then
equip(sets.aftercast.Perp_Normal)
end
end
end
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-12 00:01:19
Quetzalcoatl.Senyn said: »Need help with something qq
I think I did the right coding for Mug, but when I use it, the character stays in the Mug set, instead of switching back to tp gear.
Really no idea why it won't go back into the tp set, it works for all other JA's.
Code -- Precast sets to enhance JAs
sets.precast.JA['Collaborator'] = {head="Raider's Bonnet +2"}
sets.precast.JA['Accomplice'] = {head="Raider's Bonnet +2"}
sets.precast.JA['Flee'] = {feet="Pillager's Poulaines +1"}
sets.precast.JA['Hide'] = {body="Pillager's Vest +1"}
sets.precast.JA['Conspirator'] = {} -- {body="Raider's Vest +2"}
sets.precast.JA['Steal'] = {head="Plunderer's Bonnet",hands="Pillager's Armlets +1",legs="Pillager's Culottes +1",feet="Pillager's Poulaines +1"}
sets.precast.JA['Despoil'] = {legs="Raider's Culottes +2",feet="Raider's Poulaines +2"}
sets.precast.JA['Perfect Dodge'] = {hands="Plunderer's Armlets +1"}
sets.precast.JA['Feint'] = {} -- {legs="Plunderer's culottes"}
sets.precast.JA['Mug'] = {
head="Pillager's bonnet +1",neck="Fotia gorget",ear1="Dawn Earring",ear2="Suppanomimi",
body="Dread jupon",hands="Pillager's armlets +1",ring1="Epona's Ring",ring2="Rajas Ring",
back="Meanagh cape +1",waist="Chaac Belt",legs="Pillager's culottes +1",feet="Plunderer's poulaines +1"} Your set looks fine to me syntax-wise.
It seems really odd that Mug won't equip when everything else works as you say. Try doing //gs showswaps and see if Mug really isn't equipping at precast.
Quetzalcoatl.Senyn
サーバ: Quetzalcoatl
Game: FFXI
Posts: 106
By Quetzalcoatl.Senyn 2015-04-12 00:17:58
Nono, mug IS equipping, but AFTER the mug, it won't go back into tp set.
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-12 01:19:50
Whats the rest of your lua look like?
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-12 03:54:59
I'm currently in the process of building a strategem-esque nuking self-command, to cast nukes of any element using a generic macro, and have run into a problem. I set up a new mode called "ElementMode", set up the description, all that. It cycles just fine, and will cast single target nukes no problem. What I'm trying to figure out is how/if it is possible to use the same functionality with agas/ras for BLM or GEO without changing the format I have it in too drastically. The relevant code: Code state.ElementMode = M{['description'] = 'Element Mode'}
state.ElementMode:options('Stone','Water','Aero','Fire','Blizzard','Thunder') Code elseif cmdParams[1]:lower() == 'nuke' then
handle_elements(cmdParams)
eventArgs.handled = true
end Code function handle_elements(cmdParams)
-- cmdParams[1] == 'nuke'
-- cmdParams[2] == tier to cast
-- cmdParams[3] == target(s)
local nuke = state.ElementMode.value
local tier = cmdParams[2]:lower()
local target = cmdParams[3]:lower()
if tier == 'i' then
if target == 'ra' then
send_command('input /ma "" <t>')
elseif target == 'aga' then
send_command('input /ma "" <t>')
else
send_command('input /ma "'..nuke..'" <t>')
end
else
if target == 'ra' then
send_command('input /ma "" <t>')
elseif target == 'aga' then
send_command('input /ma "" <t>')
else
send_command('input /ma "'..nuke..''..tier..'" <t>')
end
end
end The macro format would be:
gs c nuke iv 1
for Tier 4 single-target of your current element.
I'm not sure how/if to map the agas and ras to match the cycle. Perhaps there's a way to incorporate the general spell elements in the options list instead of the actual spell name and change it to the corresponding spell.id? Idk
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-12 16:25:19
Kinematic's Smn example contains some excellent logic for what you are trying to accomplish. Just define the nuke-types (T4, T5, -aja) instead of the pact-types.
Using that as an example I came up with this.
I'm not sure if the code works it's just an example to give you ideas. Code
function job_setup()
-- example macro command: /console gs c nuke aja fire to cast Firaja
nukes = {}
nukes.nuke4 = {['Fire']='Fire IV', ['Blizzard']='Blizzard IV', ['Aero']='Aero IV', ['Stone']='Stone IV',
['Thunder']='Thunder IV', ['Water']='Water IV'}
nukes.nuke5 = {['Fire']='Fire V', ['Blizzard']='Blizzard V', ['Aero']='Aero V', ['Stone']='Stone V',
['Thunder']='Thunder V', ['Water']='Water V'}
nukes.aja = {['Fire']='Firaja', ['Blizzard']='Blizzaja', ['Aero']='Aeroja', ['Stone']='Stoneja',
['Thunder']='Thundaja', ['Water']='Waterja'}
end
-------------------------------------------------------------------------------------------------------------------
-- User self-commands.
-------------------------------------------------------------------------------------------------------------------
-- Called for custom player commands.
function job_self_command(cmdParams, eventArgs)
if cmdParams[1]:lower() == 'nuke' then
handle_nukes(cmdParams)
eventArgs.handled = true
end
end
function handle_nukes(cmdParams)
if areas.Cities:contains(world.area) then
add_to_chat(8, 'You cannot nuke in town.')
return
end
if not cmdParams[3] then
add_to_chat(8,'No nuke-type or nuke-element given.')
return
end
local nuke_type = cmdParams[2]:lower()
local nuke_element = cmdParams[3]:lower()
if not nukes[nuke_type] then
add_to_chat(123,'Unknown nuke type: '..tostring(nuke_type))
return
end
if not nukes[nuke_element] then
add_to_chat(123,'Unknown nuke element: '..tostring(nuke_element))
return
end
if nukes[nuke_type][nuke_element] then
-- Leave out target; let Shortcuts auto-determine it.
send_command('@input /ma "'..nukes[nuke_type][nuke_element]..'"')
else
add_to_chat(122, '-- The spell you are trying to cast has not been defined. --')
end
end
Once you get that working then make a personal Globals file. One file which affects all your jobs.
By default, Kinematics looks for a file named, Vafruvant-Globals.lua and includes it if that file exists. Place the code there along with checks for Fotia Gorget/Belt, the mega-Obi, Mecisto. Mantle, etc. That way you won't have to edit every single JOB file.
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-12 17:40:37
That's great! I'll test it when I get home! I don't play SMN so I didn't even think of checking there. Thanks.
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-13 02:51:19
So, it's still not quite what I was looking for. Let me see how to better describe it...
So, you're BLM with 100+ gifts, you have the following spells:
Singles I-VI, Agas III, Jas - 10 types
I don't want to have to specify the element in this macro; I want that controlled by the mode. I want to have 10 macros to cover 60 nukes. Somehow, the mode cycle must control the element, otherwise it still requires 60 macros to map them all. I can use what I posted to cover singles just fine, it's just renaming the local nuke on Aga/Ja/Ra that is causing the hang-up.
The tables seem like a good idea, it's just not what I'm looking for. I want to tell the handle function to look a couple tables and rename the local nuke based on the current cycled element and just add in the tier to the send_command based on the macro. The problem with the SMN thing is that it uses your current summoned avatar to look at a table for a single corresponding pact, not different tiers.
Maybe what I'm looking for isn't possible, though I hope that it is. I'm going to try and get a functional model for now, in hopes that maybe myself or someone else will be able to devise a cleaner model based on that.
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-13 03:05:29
I'm going to try and get a functional model for now, in hopes that maybe myself or someone else will be able to devise a cleaner model based on that. This is what I made, though it's not the prettiest, it works for what I'm looking for: Code function user_setup()
state.ElementMode = M{['description'] = 'Element Mode'}
state.ElementMode:options('Stone','Water','Aero','Fire','Blizzard','Thunder')
send_command('bind f11 gs c cycle ElementMode')
end
function job_setup()
nukes = {}
nukes.t1 = {['Stone']='Stone',['Water']='Water',['Aero']='Aero',['Fire']='Fire',['Blizzard']='Blizzard',['Thunder']='Thunder'}
nukes.t2 = {['Stone']='Stone II',['Water']='Water II',['Aero']='Aero II',['Fire']='Fire II',['Blizzard']='Blizzard II',['Thunder']='Thunder II'}
nukes.t3 = {['Stone']='Stone III',['Water']='Water III',['Aero']='Aero III',['Fire']='Fire III',['Blizzard']='Blizzard III',['Thunder']='Thunder III'}
nukes.t4 = {['Stone']='Stone IV',['Water']='Water IV',['Aero']='Aero IV',['Fire']='Fire IV',['Blizzard']='Blizzard IV',['Thunder']='Thunder IV'}
nukes.t5 = {['Stone']='Stone V',['Water']='Water V',['Aero']='Aero V',['Fire']='Fire V',['Blizzard']='Blizzard V',['Thunder']='Thunder V'}
nukes.t6 = {['Stone']='Stone VI',['Water']='Water VI',['Aero']='Aero VI',['Fire']='Fire VI',['Blizzard']='Blizzard VI',['Thunder']='Thunder VI'}
nukes.aga1 = {['Stone']='Stonega',['Water']='Waterga',['Aero']='Aeroga',['Fire']='Firaga',['Blizzard']='Blizzaga',['Thunder']='Thundaga'}
nukes.aga2 = {['Stone']='Stonega II',['Water']='Waterga II',['Aero']='Aeroga II',['Fire']='Firaga II',['Blizzard']='Blizzaga II',['Thunder']='Thundaga II'}
nukes.aga3 = {['Stone']='Stonega III',['Water']='Waterga III',['Aero']='Aeroga III',['Fire']='Firaga III',['Blizzard']='Blizzaga III',['Thunder']='Thundaga III'}
nukes.aja = {['Stone']='Stoneja',['Water']='Waterja',['Aero']='Aeroja',['Fire']='Firaja',['Blizzard']='Blizzaja',['Thunder']='Thundaja'}
nukes.ra1 = {['Stone']='Stonera',['Water']='Watera',['Aero']='Aerora',['Fire']='Fira',['Blizzard']='Blizzara',['Thunder']='Thundara'}
nukes.ra2 = {['Stone']='Stonera II',['Water']='Watera II',['Aero']='Aerora II',['Fire']='Fira II',['Blizzard']='Blizzara II',['Thunder']='Thundara II'}
end
-------------------------------------------------------------------------------------------------------------------
-- User self-commands.
-------------------------------------------------------------------------------------------------------------------
-- Called for custom player commands.
function job_self_command(cmdParams, eventArgs)
if cmdParams[1]:lower() == 'nuke' then
handle_nukes(cmdParams)
eventArgs.handled = true
end
end
function handle_nukes(cmdParams)
-- example macro command: "/console gs c nuke aja" when ElementMode is set to Fire to cast Firaja
if areas.Cities:contains(world.area) then
add_to_chat(8, 'You cannot nuke in town.')
return
end
local nuke_type = cmdParams[2]:lower()
local nuke_element = state.ElementMode.value
if nukes[nuke_type] then
-- Leave out target; let Shortcuts auto-determine it.
send_command('@input /ma "'..nukes[nuke_type][nuke_element]..'"')
else
add_to_chat(122, '-- The spell you are trying to cast has not been defined. --')
end
end
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-13 05:24:10
As long as it works the way you want then that's all that counts. ^^
Valefor.Seranos
サーバ: Valefor
Game: FFXI
Posts: 193
By Valefor.Seranos 2015-04-13 08:18:06
I tried searching, but haven't found anything. Is there code out there for a WHM lua that uses Cure tier based on HP missing? I think I have something like that for DNC, but searched and can't find for Cure spells.
Sorry if it's been in front of my nose...
Quetzalcoatl.Senyn
サーバ: Quetzalcoatl
Game: FFXI
Posts: 106
By Quetzalcoatl.Senyn 2015-04-13 08:48:16
I still can't figure out why I cannot get back into the tp set after mugging without initiating another action...
Any ideas.
Waltz changes gear back immediately after use, should I change:
sets.precast.JA['Mug'] into
sets.precast.Mug['Mug'] or something?
Feint and conspirator have different coding, but changing mug to match them throws an error.
Quetzalcoatl.Orestes
サーバ: Quetzalcoatl
Game: FFXI
Posts: 430
By Quetzalcoatl.Orestes 2015-04-13 10:08:09
Quetzalcoatl.Senyn said: »I still can't figure out why I cannot get back into the tp set after mugging without initiating another action...
Any ideas.
Waltz changes gear back immediately after use, should I change:
sets.precast.JA['Mug'] into
sets.precast.Mug['Mug'] or something?
Feint and conspirator have different coding, but changing mug to match them throws an error.
Your set naming convention posted earlier is fine. i.e. sets.precast.JA['Mug'] It's possible your lua is setup to equip gear for Mug until the buff wears, and not just during precast.
It's difficult to know for sure without seeing your whole lua. ( pastebin )
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-13 11:05:16
I tried searching, but haven't found anything. Is there code out there for a WHM lua that uses Cure tier based on HP missing? I think I have something like that for DNC, but searched and can't find for Cure spells.
Sorry if it's been in front of my nose... I have one for single-target cures. It's somewhere in this thread, but I'll repost it when I get home in about an hour.
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-13 12:21:14
I tried searching, but haven't found anything. Is there code out there for a WHM lua that uses Cure tier based on HP missing? I think I have something like that for DNC, but searched and can't find for Cure spells.
Sorry if it's been in front of my nose... Here ya go! Code -------------------------------------------------------------------------------------------------------------------
-- Automatic HP/MP Cure Downgrade Function
-------------------------------------------------------------------------------------------------------------------
-- Global intercept on precast.
function job_precast(spell, action, spellMap, eventArgs)
refine_cure(spell, action, spellMap, eventArgs)
end
local cure_mp_cost = {['Cure'] = 8, ['Cure II'] = 24, ['Cure III'] = 46, ['Cure IV'] = 88, ['Cure V'] = 135, ['Cure VI'] = 227}
-- Utility function for automatically adjusting the cure spell being used to match HP needs and MP limits.
-- Handle spell changes before attempting any precast stuff.
function refine_cure(spell, action, spellMap, eventArgs)
-- Only handles single-target cures.
if not spell.english:startswith('Cure') then
return
end
local newCure = spell.english
local missingHP
-- If curing ourself, get our exact missing HP
if spell.target.type == "SELF" then
missingHP = player.max_hp - player.hp
-- If curing someone in our alliance, we can estimate their missing HP
elseif spell.target.isallymember then
local target = find_player_in_alliance(spell.target.name)
local est_max_hp = target.hp / (target.hpp/100)
missingHP = math.floor(est_max_hp - target.hp)
end
-- If we have an estimated missing HP value, we can adjust the preferred spell used.
if missingHP ~= nil then
if player.main_job == 'WHM' then
if missingHP < 40 and spell.target.name == player.name then
-- Not worth curing yourself for so little.
-- Don't block when curing others to allow for waking them up.
add_to_chat(122,'Full HP!')
eventArgs.cancel = true
return
elseif missingHP < 150 then
newCure = 'Cure'
elseif missingHP < 350 then
newCure = 'Cure II'
elseif missingHP < 650 then
newCure = 'Cure III'
elseif missingHP < 1000 then
newCure = 'Cure IV'
elseif missingHP < 1600 then
newCure = 'Cure V'
else
newCure = 'Cure VI'
end
-- Rdm, Sch and Pld have high skill and up to Cure IV
elseif player.main_job == 'RDM' or player.main_job == 'SCH' or player.main_job == 'PLD' then
if missingHP < 40 and spell.target.name == player.name then
-- Not worth curing yourself for so little.
-- Don't block when curing others to allow for waking them up.
add_to_chat(122,'Full HP!')
eventArgs.cancel = true
return
elseif missingHP < 150 then
newCure = 'Cure'
elseif missingHP < 350 then
newCure = 'Cure II'
elseif missingHP < 650 then
newCure = 'Cure III'
else
newCure = 'Cure IV'
end
-- Subbing /whm or /rdm gets you up to Cure IV
elseif player.sub_job == 'WHM' or player.sub_job == 'RDM' then
if missingHP < 40 and spell.target.name == player.name then
-- Not worth curing yourself for so little.
-- Don't block when curing others to allow for waking them up.
add_to_chat(122,'Full HP!')
eventArgs.cancel = true
return
elseif missingHP < 150 then
newCure = 'Cure'
elseif missingHP < 300 then
newCure = 'Cure II'
elseif missingHP < 550 then
newCure = 'Cure III'
else
newCure = 'Cure IV'
end
-- Subbing /sch or /pld gets you up to Cure III
elseif player.sub_job == 'SCH' or player.sub_job == 'PLD' then
if missingHP < 40 and spell.target.name == player.name then
-- Not worth curing yourself for so little.
-- Don't block when curing others to allow for waking them up.
add_to_chat(122,'Full HP!')
eventArgs.cancel = true
return
elseif missingHP < 150 then
newCure = 'Cure'
elseif missingHP < 300 then
newCure = 'Cure II'
else
newCure = 'Cure III'
end
else
return
end
end
local mpCost = cure_mp_cost[newCure]
if buffactive['Light Arts'] or buffactive['Addendum: White'] then
mpCost = math.floor(mpCost * 0.9)
elseif buffactive['Dark Arts'] or buffactive['Addendum: Black'] then
mpCost = math.floor(mpCost * 1.1)
end
local downgrade
-- Downgrade the spell to what we can actually afford
if player.mp < mpCost and not (buffactive['Manafont'] or buffactive['Mana Well']) then
if player.mp < 8 then
add_to_chat(122, 'Insufficient MP ['..tostring(player.mp)..']. Cancelling.')
eventArgs.cancel = true
return
elseif player.mp < 24 then
newCure = 'Cure'
elseif player.mp < 46 then
newCure = 'Cure II'
elseif player.mp < 88 then
newCure = 'Cure III'
elseif player.mp < 135 then
newCure = 'Cure IV'
elseif player.mp < 227 then
newCure = 'Cure V'
end
downgrade = 'Insufficient MP ['..tostring(player.mp)..'] to completely heal '..tostring(spell.target.name)..'. Changing spell to '..newCure..'.'
end
if newCure ~= spell.english then
send_command('@input /ma "'..newCure..'" '..tostring(spell.target.raw))
if downgrade then
add_to_chat(122, downgrade)
end
eventArgs.cancel = true
return
end
if missingHP and missingHP > 0 then
add_to_chat(122,'Trying to heal '..tostring(missingHP)..' HP using '..newCure..'.')
end
end You should be able to just paste this into your job file, or make it a separate file and include it on the job file load. I personally have mine set to being an included file, so my function get_sets() looks like this: Code -- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
include('CureMod.lua')
end Either way should work, hope it helps!
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-13 21:52:32
Unrelated (possibly) I've been getting an error when I use gs c reset all, saying
"...GearSwap/libs/Mote-SelfCommands.lua:108: "_type" is not defined for numbers"
What in the world does that mean and what did I do to screw it up? lol
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-13 22:00:39
Well done Vafruvant!
You could further include other Return rules so you wouldn't blink. Code
if buffactive.Mute or buffactive.Silence or buffactive.Petrification or buffactive.Stun then
add_to_chat(8, '[ Canceled '..spell.name..'. Unable to Cast Spells]')
cancel_spell()
return
elseif spell.target.distance > 20 then
add_to_chat(8, '[ Canceled '..spell.name..'. '..spell.target.name..' is Out of Range. ]')
cancel_spell()
return
end
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-13 22:11:16
The command is gs c reset [variable].
You're getting the error message because cmdParams[2], "all" hasn't been defined as a variable in any user_setup() Modes.
I would just do gs reload.
サーバ: Asura
Game: FFXI
Posts: 363
By Asura.Vafruvant 2015-04-13 22:41:56
The command is gs c reset [variable].
You're getting the error message because cmdParams[2], "all" hasn't been defined as a variable in any user_setup() Modes.
I would just do gs reload. gs reload didn't do anything for it :/ It was working just a couple days ago, but I haven't played too much lately. reset all doesn't appear to be working on any file I have, one of which is just a direct copy of Mote's. It must be a lib issue, I guess. This is the segment of the SelfCommands.lua throwing the error, but it's a whole lot of idk: Code -- Function to reset values to their defaults.
-- User command format: gs c reset [field]
-- Or: gs c reset all
function handle_reset(cmdParams)
if #cmdParams == 0 then
if _global.debug_mode then add_to_chat(123,'handle_reset: parameter failure: reset type not specified') end
return
end
local state_var = get_state(cmdParams[1])
local oldVal
local newVal
local descrip
if state_var then
oldVal = state_var.value
state_var:reset()
newVal = state_var.value
local descrip = state_var.description or cmdParams[1]
if job_state_change then
job_state_change(descrip, newVal, oldVal)
end
add_to_chat(122,descrip..' is now '..state_var.current..'.')
handle_update({'auto'})
elseif cmdParams[1]:lower() == 'all' then
for k,v in pairs(state) do
if v._type == 'mode' then
oldVal = v.value
v:reset()
newVal = v.value
descrip = state_var.description
if descrip and job_state_change then
job_state_change(descrip, newVal, oldVal)
end
end
end
if job_reset_state then
job_reset_state('all')
end
if job_state_change then
job_state_change('Reset All')
end
add_to_chat(122,"All state vars have been reset.")
handle_update({'auto'})
elseif job_reset_state then
job_reset_state(cmdParams[1])
else
add_to_chat(123,'Mote-Libs: Reset: Unknown field ['..cmdParams[1]..']')
end
end
サーバ: Asura
Game: FFXI
Posts: 115
By Asura.Pintseyes 2015-04-14 03:11:21
Im sorry if this is somewhere within these posts. I have looked a bit, I'm pretty sure it's been asked.
I was using Weather/obi/ring. Mind you I suck bad at code so I have no clue how I got it to works "once upon a time".
The weathercheck in the lua was added after weather stopped working as an attempt to use Byrth's codes.
-------------------------------------------------------------------------------------------------------------------
-- 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')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
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')
state.CastingMode:options('Normal', 'Resistant', 'Proc')
state.IdleMode:options('Normal', 'PDT')
state.MagicBurst = M(false, 'Magic Burst')
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'}
-- Additional local binds
send_command('bind ^` input /ma Stun <t>')
send_command('bind @` gs c activate MagicBurst')
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()
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
function job_precast(spell, action, spellMap, eventArgs)
if spellMap == 'Cure' or spellMap == 'Curaga' then
gear.default.obi_waist = "Salire Belt"
elseif spell.skill == 'Elemental Magic' then
gear.default.obi_waist = "Aswang Sash"
if state.CastingMode.value == 'Proc' then
classes.CustomClass = 'Proc'
end
end
end
function job_precast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' then
gear.default.Ring1 = "Acumen Ring"
if state.CastingMode.value == 'Proc' then
classes.CustomClass = 'Proc'
end
end
end
function job_midcast(spell, action, spellMap, eventArgs)
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
equip(sets.magic_burst)
end
end
function aftercast(spell)
if player.status == 'Idle' then
equip_idle_set()
elseif sets.aftercast[player.status] then
equip(sets.aftercast[player.status],sets.aftercast[tp_level])
else
equip(sets.Idle,sets.aftercast)
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
-- Lock feet after using Mana Wall.
if not spell.interrupted then
if spell.english == 'Mana Wall' then
enable('feet')
equip(sets.buff['Mana Wall'])
disable('feet')
elseif spell.skill == 'Elemental Magic' then
state.MagicBurst:reset()
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff, gain)
-- Unlock feet when Mana Wall buff is lost.
if buff == "Mana Wall" and not gain then
enable('feet')
handle_equipping_gear(player.status)
end
end
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
if stateField == 'Offense Mode' then
if newValue == 'Normal' then
disable('main','sub','range')
else
enable('main','sub','range')
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- Custom spell mapping.
function job_get_spell_map(spell, default_spell_map)
if spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then
--[[ No real need to differentiate with current gear.
if lowTierNukes:contains(spell.english) then
return 'LowTierNuke'
else
return 'HighTierNuke'
end
--]]
end
end
-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
if player.mpp < 51 then
idleSet = set_combine(sets.idleSet, sets.refresh)
end
return idleSet
end
-- Function to display the current relevant user state when doing an update.
function display_current_job_state(eventArgs)
display_current_caster_state()
eventArgs.handled = true
end
function weathercheck(spell_element,set)
if not set then return end
if spell_element == world.weather_element or spell_element == world.day_element then
equip(set,sets.Obis[spell_element])
else
equip(set)
end
if set[spell_element] then equip(set[spell_element]) end
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, 1)
end
function to_windower_api(str)
return str:lower():gsub(' ','_')
end
-- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
end
My weather wasn't ever really a function. Instead the function was for default obi/ring. The gear set would point to the weather items as such
waist =gear.ElementalObi,
Ring1 =gear.Elemental Ring,}
Can someone please post weather, I think it has to use motes? I've tried recopying the old codes, no worky,I've tried straight up hijacked Byrths and adding his obi's/weather functions, no worky.. Can someone pleeease point me in the right direction.
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-14 04:58:07
@Pintseyes Code
function init_gear_sets()
-- Elemental Ring/Twilight Cape/Obi --
sets.Obi = {}
sets.Obi.Thunder = {ring1="Zodiac Ring", back="Twilight Cape", waist='Rairin Obi'}
sets.Obi.Water = {ring1="Zodiac Ring", back="Twilight Cape", waist='Suirin Obi'}
sets.Obi.Fire = {ring1="Zodiac Ring", back="Twilight Cape", waist='Karin Obi'}
sets.Obi.Ice = {ring1="Zodiac Ring", back="Twilight Cape", waist='Hyorin Obi'}
sets.Obi.Wind = {ring1="Zodiac Ring", back="Twilight Cape", waist='Furin Obi'}
sets.Obi.Earth = {ring1="Zodiac Ring", back="Twilight Cape", waist='Dorin Obi'}
sets.Obi.Light = {ring1="Zodiac Ring", back="Twilight Cape", waist='Korin Obi'}
sets.Obi.Dark = {ring1="Zodiac Ring", back="Twilight Cape", waist='Anrin Obi'}
sets.midcast['Elemental Magic'] = { } -- Nuking Gear
sets.magic_burst = {neck="Mizukage-no-Kubikazari"}
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' then
if state.MagicBurst.value then
equip(sets.magic_burst)
end
if spell.element == world.day_element or spell.element == world.weather_element then
equip(sets.midcast['Elemental Magic'], sets.Obi[spell.element])
end
end
end
If you have the Hachirin-no-Obi then do it like this. Code
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' then
if state.MagicBurst.value then
equip(sets.magic_burst)
end
if spell.element == world.day_element or spell.element == world.weather_element then
equip(sets.midcast['Elemental Magic'], {ring1="Zodiac Ring", back="Twilight Cape", waist="Hachirin-no-Obi"})
end
end
end
[+]
サーバ: Asura
Game: FFXI
Posts: 115
By Asura.Pintseyes 2015-04-14 13:32:44
Thanks for responding Quix. That code doesn't seem to be working properly. Using it, now I don't seem to swap to midcast-ele gear from my engaged set. Upon adding that code after my midcasts i got a EOF error. I had to add another END to make it stop or add a end to the very bottom of the file. notepad++ shows this code running all the way to the EOF. Lol this is probably wrong, but i always thought each function gets its own end and each if gets its own end. i guess im wrong cause i counted the ifs lol.
It may simply things by not having magic burst codes, I don't actually use any MB sets, I just didn't know how to remove some of the codes so I just left them and didnt add sets to accommodate.
Just as a FYI, I've reinstalled windower and/or gearswap a few times trying to get this to work out. I wouldn't think it's something to do with being out of date.. But IDK, hence why I'm here lol.. Here's how it looks when I add weather. Optionally the gearsets are also in my sidecar.
-------------------------------------------------------------------------------------------------------------------
-- 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')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
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')
state.CastingMode:options('Normal', 'Resistant', 'Proc')
state.IdleMode:options('Normal', 'PDT')
state.MagicBurst = M(false, 'Magic Burst')
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'}
-- Additional local binds
send_command('bind ^` input /ma Stun <t>')
send_command('bind @` gs c activate MagicBurst')
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()
sets.Obi = {}
sets.Obi.Thunder = {ring1="Zodiac Ring", back="Twilight Cape", waist='Rairin Obi'}
sets.Obi.Water = {ring1="Zodiac Ring", back="Twilight Cape", waist='Suirin Obi'}
sets.Obi.Fire = {ring1="Zodiac Ring", back="Twilight Cape", waist='Karin Obi'}
sets.Obi.Ice = {ring1="Zodiac Ring", back="Twilight Cape", waist='Hyorin Obi'}
sets.Obi.Wind = {ring1="Zodiac Ring", back="Twilight Cape", waist='Furin Obi'}
sets.Obi.Earth = {ring1="Zodiac Ring", back="Twilight Cape", waist='Dorin Obi'}
sets.Obi.Light = {ring1="Zodiac Ring", back="Twilight Cape", waist='Korin Obi'}
sets.Obi.Dark = {ring1="Zodiac Ring", back="Twilight Cape", waist='Anrin Obi'}
sets.midcast['Elemental Magic'] = { } -- Nuking Gear
sets.magic_burst = {neck="Mizukage-no-Kubikazari"}
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
function job_precast(spell, action, spellMap, eventArgs)
if spellMap == 'Cure' or spellMap == 'Curaga' then
gear.default.obi_waist = "Salire Belt"
elseif spell.skill == 'Elemental Magic' then
gear.default.obi_waist = "Aswang Sash"
if state.CastingMode.value == 'Proc' then
classes.CustomClass = 'Proc'
end
end
end
function job_precast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' then
gear.default.Ring1 = "Acumen Ring"
if state.CastingMode.value == 'Proc' then
classes.CustomClass = 'Proc'
end
end
end
function job_midcast(spell, action, spellMap, eventArgs)
end
function aftercast(spell)
if player.status == 'Idle' then
equip_idle_set()
elseif sets.aftercast[player.status] then
equip(sets.aftercast[player.status],sets.aftercast[tp_level])
else
equip(sets.Idle,sets.aftercast)
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' then
if state.MagicBurst.value then
equip(sets.magic_burst)
end
if spell.element == world.day_element or spell.element == world.weather_element then
equip(sets.midcast['Elemental Magic'], sets.Obi[spell.element])
end
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
-- Lock feet after using Mana Wall.
if not spell.interrupted then
if spell.english == 'Mana Wall' then
enable('feet')
equip(sets.buff['Mana Wall'])
disable('feet')
elseif spell.skill == 'Elemental Magic' then
state.MagicBurst:reset()
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff, gain)
-- Unlock feet when Mana Wall buff is lost.
if buff == "Mana Wall" and not gain then
enable('feet')
handle_equipping_gear(player.status)
end
end
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
if stateField == 'Offense Mode' then
if newValue == 'Normal' then
disable('main','sub','range')
else
enable('main','sub','range')
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- Custom spell mapping.
function job_get_spell_map(spell, default_spell_map)
if spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then
--[[ No real need to differentiate with current gear.
if lowTierNukes:contains(spell.english) then
return 'LowTierNuke'
else
return 'HighTierNuke'
end
--]]
end
end
-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
if player.mpp < 51 then
idleSet = set_combine(sets.idleSet, sets.refresh)
end
return idleSet
end
-- Function to display the current relevant user state when doing an update.
function display_current_job_state(eventArgs)
display_current_caster_state()
eventArgs.handled = true
end
function weathercheck(spell_element,set)
if not set then return end
if spell_element == world.weather_element or spell_element == world.day_element then
equip(set,sets.Obis[spell_element])
else
equip(set)
end
if set[spell_element] then equip(set[spell_element]) end
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, 1)
end
function to_windower_api(str)
return str:lower():gsub(' ','_')
end
Thanks again!!
Edit: I removed function job_precast(spell, action, spellMap, eventArgs) bot instances in my lua, those were for the old weather code. It seems to work now with a bit of a hiccup. Ring doesn't always change, sometimes Tamas ring is in it's place.
Otherwise, THANK YOU@! Weather is something that gives me reason to try to kill certain things or solo certain events. Not having it = sad black mage.
Edit:Edit: Think I got it. I believe the ring was equipting, my aftercast/engaged are equip so fast I couldnt tell if ring was working. Removed ring/waist from aftercast and now i can see those are in fact working.. You my friend are awesome.. Can't say it enough THANK YOU!
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-14 14:10:47
The code is correct. But you put in in the wrong place so it won't work for you. sets.anything goes into your sidecar not your main lua.
Also your library files are out of date so GearSwap won't function properly.
Also you have functions that don't belong there like "function to_windower_api()".
Also, if you have a sidecar then you must have "function user_setup()" in BOTH the main lua and the sidecar. They must also match word-for-word and var-to-var.
To get it working again, you almost have to start from scratch.
1. Download Kinematic's Library Files Version 2 and paste them into your data folder. There are 7 files and you need them all.
2. Copy a JOB file Version 2 and paste that with the rest of the luas. Use notepad to edit-in your own gear. Don't forget to rename the lua file.
3. (Optional not required) Follow these instructions how to properly make a sidecar.
Once you get everything working correctly then paste the code I gave you (just the sets part) into your sidecar not your main lua.
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-14 14:29:31
Edit: Think I got it. I believe the ring was equipting, my aftercast/engaged are equip so fast I couldnt tell if ring was working. Removed ring/waist from aftercast and now i can see those are in fact working.. You my friend are awesome.. Can't say it enough THANK YOU! Use //gs showswaps. It will show you exactly what gear is equipping in detail.
Glad I could help.
サーバ: Asura
Game: FFXI
Posts: 115
By Asura.Pintseyes 2015-04-14 14:36:52
Thank you again and again. I forgot about showswaps. Quicky question..
Can I add your code to my globals? I primarily play elemental types, SCH,BLM,RDM etc. Would adding that cause troubles for any non-elemental types? Does every jobs sidecar have to defines obi sets or can those also be added to globals?
Oh damn, I just saw your top post. Looks like I got a bit more to work out..
Ok ya, in fact the blm.lua I'm currently using is in fact from kinematics. It's just a lot uglier as I've tried editing it. Bit confused though. I just reinstalled gearswap, that wouldn't update my libraries? Kinematics tags say theyre almost a year old. lol
Now I do understand why weather worked, i recall editing a mote withing the gearswap folder (not data). Then it updated, then weather died.. All making sense now.
100 +1's for you Quix!
サーバ: Odin
Game: FFXI
Posts: 170
By Odin.Quixacotl 2015-04-14 16:07:46
You can add any rule to your Globals. By default, Kinematics looks for a file named Yourcharactername-Globals.lua and automatically includes it if it exists. In fact, it's a good idea so you won't need to add the same rules for every JOB.lua. One file that affects all your JOB.lua's because well... it's global. XD
Here's my own Quixacotl-Globals.lua http://pastebin.com/QKEVk8Zx
Note the functions are all prefixed as 'user_'.
Kinematics is a separate component from Gearswap. Think of it as an addon to an addon. Gearswap will update itself but it won't do anything to Kinematic's Libs. You have to manually update Kinematics.
However Motensen has been MIA for a year now and there's no telling if or when he will ever update his files again.
My guess is he got a cushy job over at Google with Aurieus.
By inkydo 2015-04-14 20:51:12
anyone why cant I get the same item to equip in a different slot...Like both my rings and ears I know they have the same name but I am calling them out.
sets.midcast['Blue Magic'].Physical = {
ammo="Mavi Tathlum",
head="Assim. Keffiyeh +1",
body="Assim. Jubbah +1",
hands={ name="Luh. Bazubands +1", augments={'Enhances "Azure Lore" effect',}},
legs={ name="Luhlaza Shalwar +1", augments={'Enhances "Assimilation" effect',}},
feet="Assim. Charuqs +1",
neck="Asperity Necklace",
waist="Caudata Belt",
left_ear="Flame Pearl",
right_ear="Flame Pearl",
left_ring="Ifrit Ring",
right_ring="Ifrit Ring",
back="Cornflower Cape"}
Edit Never mind i got it worked out... Was just not looking at it properly! lol
サーバ: Asura
Game: FFXI
Posts: 115
By Asura.Pintseyes 2015-04-15 08:53:47
You can add any rule to your Globals. By default, Kinematics looks for a file named Yourcharactername-Globals.lua and automatically includes it if it exists. In fact, it's a good idea so you won't need to add the same rules for every JOB.lua. One file that affects all your JOB.lua's because well... it's global. XD
Here's my own Quixacotl-Globals.lua http://pastebin.com/QKEVk8Zx
Note the functions are all prefixed as 'user_'.
Kinematics is a separate component from Gearswap. Think of it as an addon to an addon. Gearswap will update itself but it won't do anything to Kinematic's Libs. You have to manually update Kinematics.
However Motensen has been MIA for a year now and there's no telling if or when he will ever update his files again.
My guess is he got a cushy job over at Google with Aurieus.
Thank you for the responses. Explaining my confusion with Kinematics VS. Gearswap. Now I see where my idea is right, but wrong lol.
Same song and dance here, I used spellcast blah blah, quit blah blah.. GS Vs. Spellcast, WOW! what a huge change this is. I think for a lot of us returning we expect the old XML learn it on the fly edit it even faster coding that spellcast offered. The change is so massive we gotta start from scratch. Definitely worth the while IMO. Just saying from a returners point of view.
Thanks a million for clarifying the differences. Until just now I thought Kinematics was the MIA'er. You have left me with a working weather code (Band aide code till I get all this mote stuff worked out lol) and a kickass starting point to becoming a DIY gearswapper. Again, Thanks man, I really appreciate your time.
Just looking for someone to explain this addon a bit for me. It looks like it is an alternative to Spellcast.
Is it going to be replacing Spellcast? In which ways is it better or worse. I don't know any programming but I've slowly learned more and more about spellcast and the 'language' used in gearswap is confusing to me.
It says it uses packets so it potentially could be more detectable? but does that also eliminate any lag that spellcast may encounter?
I plan on redoing my PUP xml to include pet casting sets thanks to the new addon petschool. I'm just not sure if it's worth it to just wait until gearswap gets more popular or to go ahead and do it in spellcast.
If anyone could give me more info I'd greatly appreciate it.
|
|