This is an error in split. It'll be fixed later today and I'm just going to start using the library version of the split function.
This is an error in split. It'll be fixed later today and I'm just going to start using the library version of the split function.
Is anyone working on or currently has a ranger or corsair gearswap script they'd be willing to share?
v0.800 GearSwap will probably go live later today. It features:
* The addition of a "pretarget" function. This function will be called when there is a valid spell in the outgoing text buffer and will be passed the current spell/abil tables. This is the only function where change_target() will be valid now. In the event of an <st*> target, there will be no information in the spell.target table beyond spell.target.raw. Otherwise, all functions valid in pretarget are valid here. This is the solution to <st*> targs.
* "precast" will now be the time right before sending the outgoing action packet. This is where cast_delay and verify_equip() will be implemented.
* "buff_change" used to pass a string as its second argument that was either "gain" or "loss." I received several comments that this was confusing. Now it will be buff_change(<buff name>,<gain>). If <gain> is true, then you gained the buff. If it's false, you lost the buff. Keep in mind that buff_change only fires when your buff line changes. It will not fire if you overwrite a Minuet on yourself, for instance.
* Various internal changes that hopefully no one will notice.
* I exposed another library or two to the user environment. If you weren't already looking for these then you probably won't care about them.
* Updated documentation of course.
I've noticed that Bokwus/Manibozho/etc. "Path" augmented gear is not handled by the augment parser. Sorry. They use a different format than everything else. I'll see what I can do.
Updated my lua files to be compatible with 0.8, along with a ton of bug fixes and improvements. Very close to release-worthy. For now, still in test phase, however I've been actively using them instead of spellcast and haven't had any real show-stoppers.
One more major change to GearSwap is incoming. Thorny, Motenten, Arcon, Cair, Iryoku, and everyone else on #lua that I've forgotten deserve a lot of credit for these adjustments. It's going to be a big QoL boost for all GearSwap users.
This might require minor adjustment by users, but the API should be generally unchanged. I will, however, be changing the precast/midcast definitions.
Currently:
The future:Code:pretarget - When the full, SE-format-valid command hits the outgoing text event. precast - When the outgoing action packet hits the outgoing chunk event. midcast - When an incoming action packet (that codes an action) hits the incoming chunk event. aftercast - When an incoming action packet or action message packet (that codes completion or interruption of an ability/spell) hits the incoming chunk event pet_midcast - When an incoming action packet (that codes an action by your pet) hits the incoming chunk event. pet_aftercast - When an incoming action packet or action message packet (that codes completion or interruption of an ability/spell by your pet) hits the incoming chunk event
It turns out that the server absolutely respects the order of chunks and that I can force an outgoing UDP packet to send by putting a dummy command in the command buffer. Also, windower sticks any injected outgoing packets onto the end of the next outgoing packet in the order that they were injected. So I can do:Code:pretarget - When the full, SE-format-valid command hits the outgoing text event. precast - When the outgoing action packet can be calculated. midcast - When the outgoing action packet can be calculated. aftercast - When an incoming action packet or action message packet (that codes completion or interruption of an ability/spell) hits the incoming chunk event pet_midcast - When an incoming action packet (that codes an action by your pet) hits the incoming chunk event. pet_aftercast - When an incoming action packet or action message packet (that codes completion or interruption of an ability/spell by your pet) hits the incoming chunk event
So now GearSwap has injected entirely accurate precast gear and midcast gear with totally negligible / no added cast delay. I've clocked this at 0.25-0.55 seconds Text command -> server response latency, which is approximately exactly what I get without GearSwap running.* User command comes in (text)
* GearSwap triggers pretarget using the information inferred from that command.
** This injects pretarget equip packets.
* If the spell is not canceled, GearSwap converts the result to an action packet if possible and block the text.
** If it is not possible, GearSwap lets the text go through (st commands) and waits until it can calculate an action packet from it, then blocks that outgoing text
* Now that GearSwap has the outgoing action packet, it triggers precast with it.
** This injects precast equip packets.
* If the spell is not canceled, GearSwap now injects the action packet.
* Now that GearSwap has injected the action packet, everything injected after this point will be considered to be after the action. Thus, it triggers midcast.
** This injects midcast equip packets.
* Now that the pretarget, precast, and midcast events are all finished, GearSwap adds "/assist <me>" to the outgoing text buffer.
* This is treated as a command and cues an outgoing UDP packet, which sends the pretarget gear, precast gear, action packet, and midcast gear.
* GearSwap intercepts the "/assist <me>" chunk and blocks it, but the rest of the packet goes out as designed.
You want to precast and midcast Stone 1? You got it, budday.
Now that I think about it, it might even be possible to midcast weaponskills. That would require some testing... but there's no real benefit to it over precasting them.
Working on a COR GS, and I want to put in a check so I dont shoot off my QD bullet, in spellcast I have
What would be the best way to go about it in lua? Also I'm guessing this would go in the precast section? Thanks.Code:<if commandprefix="/range|/ra|/weaponskill|/ws"> <if EquipAmmo="Animikii bullet"> <cancelspell /> <equip when="all"><ammo>remove</ammo></equip> <addtochat>Trying to shoot Animikii Bullet. Action cancelled.</addtochat> <return /> </if> </if>
Test it with something other than your rare bullet first.Code:if spell.name:lower() == 'ranged attack' and player.equipment.ammo:lower() == 'animikii bullet' then cancel_spell() add_to_chat(8,'Danger, Will Robinson! Attempting to shoot Animikii Bullet! Cancelled!') return end
Also, a version of GearSwap with the instant precast/midcasts is on the -dev launcher. Avoid using items on yourself and make sure it loads after Shortcuts.
is not working anymore, is there any workaround or is a bug?Code:if spell.target.type == 'PLAYER' and not buffactive.pianissimo then cast_delay(1.5) windower.send_command('@input /raw /ja "Pianissimo" <me>') end
Code:if spell.target.type == 'PLAYER' and not buffactive.pianissimo and not spell.target.charmed then cancel_spell() send_command('input /ja "Pianissimo" <me>;wait 1.5;input /ma "'..spell.name..'" <me>;') end
Had a few questions about BLU and GS please,
1) What would be the best way to handle spells with GS, since BLU has different sets for STR DEX AGI MND etc spells would it be better to have the sets at the top in get_sets, and in the precast function have the grouped spells all listed by type OR should/could i have the spells referenced at the top in the get_sets function and the precast would be a generic spell.name?
2) For spells like stoneskin, or cure spells where I want to precast in fastcast gear but finish in recast or Cure Pot gear I assume I would need to have them in both precast and midcast function? Or is it possible to not have them repeat like that?
3) I use a F10 bind for WS which also doubles as a quick way to change back to idle gear if for whatever reason I am not in idle.
Above is a sample of the code used to do that, the <else> part from when not engaged would fire combatmode for aftercast, I believe aftercast () call would work but the syntax for that I am not sure of.Code:<elseif commandprefix="/weaponskill" > <if status="Engaged"> blah blah blah </if> <else> <cmd>CombatMode</cmd> <cancelspell /> <return /> </else> </elseif>
4) Organizing the layout, I tend to want to organize things either alphabetically, in order of relevance or by type. I am not sure if function must be ordered a certain way or they wont work right, able to shed any light on that please?
The way I would like to order would be:
get_sets
self_command
status_change
precast
midcast
aftercast
with event inside each group in alphabetical order if possible.
5) verify_equip() it was mentioned that it is bad to use in high lag events/zones, I am wondering if that is because the action would just take longer to fire because it takes more time to verify that gear has changed or if something else would happen?
I noticed at least with the limited testing I did and eyeballing so not that accurate that it seemed the BLU spells would start to cast a fraction of a second before I would blink gear. I am not sure if that is just cosmetic issue or if the server didnt calculate the gear change. So I guess the real question would be, should I worry about either a cast delay 0.3, verify_equip() or nothing at all?
I thank you for the help in answering these questions.
1) There are a few ways to handle it. What I would do is probably something like this:
Code:bluSpellStats = T{"spell1"="stat1", "spell2"="stat1", "spell3"="stat1", "spell4"="stat2", "spell5"="stat2", etc... } bluSpells = {default fallback gear set} bluSpells.stat1 = {default gear set for stat 1} bluSpells.stat2 = {default gear set for stat 2} bluSpells.spell1 = {unique gear set for spell 1} bluSpells.spell2 = set_combine(bluSpells.stat1, {some other item}) if spell.skill=="BlueMagic" then if bluSpells[spell.english] then equip(bluSpells[spell.english]) elseif bluSpellStats[spell.english] then equip(bluSpells[bluSpellStats[spell.english]]) else equip(bluSpells) end end
2) Yes, you need to specify what gear you want to change in midcast if you want the gear to change in midcast.
3) Bind:
/console gs c tryweaponskill
And then handle it in the self_command(commandArgs) function. If commandArgs == 'tryweaponskill', either send_command() the weaponskill you want to use, or equip() your idle set.
4) If you keep everything in functions then you shouldn't have a problem. The entire file should be loaded before the first function is called, so you don't have to worry about something not being declared yet. If you put code at the 'global' level of the file, where it's going to run as soon as it tries to load the file, then you may have issues. However I wouldn't recommend doing that unless you are very sure of what you're doing.
5) verify_equip() is being deprecated since it's not needed anymore (dev version, not live yet). I wouldn't worry too much about it right now. The gear you specify should always be equipped at the appropriate time (ie: stuff you call equip() for in the precast() function will be equipped before the spell is cast).
1) I am really new to this still, so if done your way the spell stats would be done in the get_sets function?
3) The only issue with doing it that way is that I use a macro+variable to bind either CDC or Req to f10 as i see fit. Is there another way to maybe do this?
3) set up a second self command "toggle WS" that toggles between CDC and Requiescat.
As far as the next version of GearSwap, we've confirmed that precast/midcast are accurate regardless of casting time. Also, there's no more need for a delay between changing gear and casting Impact.
If someone else doesn't do it first, tonight I'm going to test whether there are things (like TP Bonus) that affect WSs when worn at precast but you can take them off for midcast. If it turns out that everything for WSs is calculated at precast, then I will make it so that the "midcast" phase is an aftercast for WSs and there will be no chance of ever going an attack round in your WS gear. If there is a reason to have a midcast phase for WSs, then we will continue to have a midcast phase. I'm going to make the "midcast" phase into "aftercast" for JAs regardless, because they don't have a readies phase.
This is weirdly stable and might be ready to be pushed as soon as tomorrow night.
Ok so say I want to do the route where get_sets has the spells and precast function does just a generic call.
how would i add multiple spells under one set?
above is the set where CDC would be called based on spell name, if I wanted both CDC and Req to use the same set how would I add Requisicat to the list?Code:sets.precast.WS['Chant du Cygne'] = {head="Uk'uxkaj Cap",neck="Light Gorget",lear="Bladeborn Earring",rear="Steelflash Earring", body="Assim. Jubbah +1",hands="Assim. Bazu. +1", back="Rancorous Mantle",waist="Wanion Belt",legs="Manibozho Brais",feet="Assim. Charuqs +1"}
I would make a base set like
then for CdC if is exactly the same set, (and if Requiescat is the same set)Code:sets.precast.WS = {head="Uk'uxkaj Cap",neck="Light Gorget",lear="Bladeborn Earring",rear="Steelflash Earring", body="Assim. Jubbah +1",hands="Assim. Bazu. +1", back="Rancorous Mantle",waist="Wanion Belt",legs="Manibozho Brais",feet="Assim. Charuqs +1"}
Another Ex. using set_combine, assuming is the WS is the base set for RequiescatCode:sets.precast.WS['Chant du Cygne'] = sets.precast.WS sets.precast.WS['Requiescat'] = sets.precast.WS
Code:sets.precast.['Requiescat']= set_combine(sets.precast.WS, { left_ring="Requiestcat Ring", right_ring="Requiestcat Ring", waist ="Requiestcat waist", })