• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver

Bug - Attempting to confirm bug. Please assist.

TheNomadMan

New member
Joined
Feb 8, 2014
RedCents
451¢
As far as I can tell; Kissassist is attempting to cast multiple DPS spells (including GoM spells) without waiting for the 1.5 sec recovery period to expire.

This causes DPSOn=2 to cast out of order:

Rich (BB code):
[DPS]
DPSOn=2
DPSSkip=10
DPSInterval=2
DPS1=Sunbeam Blessing|99|MA
DPS2=Clutch of Ro|98|Once
DPS3=Surge of Spineburrs|97|MA
DPS4=Nature's Withering Wrath|96
DPS5=Summer Suncrest|95

This will also cause the GoM spell to misfire, despite detection, and cause DPSOn=1 to skip spells it otherwise would have cast, at a given time.

Heal spells have a separate array of condition checks and are not affected by this issue. However; should a DPS spell attempt to follow a heal, the DPS spell fails and is skipped.

Locally, I have had the issue confirmed by two (2) other kissassist users. Furthermore; I have confirmed the issue, myself, on three (3) different machines in two (2) different locations. All three (3) of these machines have completely different hardware specs, all three (3) were running fresh EQ and MQ2 installs, and one (1) of them had a fresh win7 install. The tests were preformed with six (6) different characters (not including the other two previously mentioned user's chars) arrayed in a number of different configurations (tank, hunter, pullertank, assist, 2 chars, 3 chars, 3 chars w/ mercs) and were tested with several different ini's. The ini's were made by myself, by two (2) other kissassist users I know, and I tried a few ini's that had been posted to this board. I even used four (4) different versions of kissassist (7.2, 7.0.2, 7.0.1, and 6.8.8).

Results were the same every time:



I believe the problem lies here:

The following code appears to tell KA what to do "If the spell is ready and I am not a bard" as well what to do "If I am a bard" and then returns a result of CAST_SUCCESS or the previously /varset CAST_FAIL. But there is nothing to tell KA what to do "If the spell is not ready". Why KA is moving to CastWhat for spell casting during the recovery period, in the first place, may be more the issue here. I'm not experienced enough to say.

Rich (BB code):
            /target id ${castTargetID}
            /delay 10 ${Target.ID}==${castTargetID}
            /if (${Cast.Ready[${castWhat}]} && !${IAmABard}) {
                 /casting "${castWhat}" -maxtries|2
                | /call cast "${castWhat}" gem8 3s
                /doevents
                /varset CastResult ${Cast.Result}
                /call CheckCasting 30
            }
            /if (${IAmABard}) {
                /squelch /twist once ${castWhat}
                /varset CastResult CAST_SUCCESS
            }
        }
        /if (${WasTwisting} && !${Twist}) /squelch /twist
        /if (${Debug})    /echo ${CastResult}
    /return ${CastResult}

So: I injected a "If spell is not ready" help more clearly distinguish when KA is attempting to cast during the recovery period.

Rich (BB code):
            /target id ${castTargetID}
            /delay 10 ${Target.ID}==${castTargetID}
	    /if (!${Cast.Ready[${castWhat}]}) {
		/varset CastResult I_WASNT_READY
		}
            /if (${Cast.Ready[${castWhat}]} && !${IAmABard}) {
                 /casting "${castWhat}" -maxtries|2
                | /call cast "${castWhat}" gem8 3s
                /doevents
                /varset CastResult ${Cast.Result}
                /call CheckCasting 30
            }
            /if (${IAmABard}) {
                /squelch /twist once ${castWhat}
                /varset CastResult CAST_SUCCESS
            }
        }
        /if (${WasTwisting} && !${Twist}) /squelch /twist
        /if (${Debug})    /echo ${CastResult}
    /return ${CastResult}

Here are the results:


This is true in every test I've run, on every machine I've run it on, and was confirmed by two other kissassist users.

No special circumstances are required to replicate this issue. Simply /debug with kissassist running and look for "CAST_FAIL" to occur more often than "CAST_SUCCESS", when attempting to cast DPS spells.

I don't know what else I can do to prove the existence of this bug or disprove the existence of a one-off configuration. If you can think any tests that I, or others, can run please let me know. I'll do my best to see to it.

In the mean time; please post here if you're seeing the same behavior I am.
 
Last edited by a moderator:
Yes please let me know if anyone else is experiencing this issue.
 
From what I can tell, reading the Logic in the Combat and CombatCast sub's. This behavior is by design. Everyone is having this issue, especially if they cast Heals and are DPS Casters. Straight DPS casters would still have this issue, but it wouldn't be as noticeable.
 
I'd say the reason it's casting out of order is due to how close you have the spells casting. 1 every 1% of hp lost on the target. Dunno about you, but I take a bit more than 1% every time I damage a target. I could be wrong on that reasoning, but that seems likely to me.
 
DPSOn=2 just uses the |98 for casting order the 1% apart doesn't matter
 
I too am seeing this. It is causing problems with the spells NOT going off when they should. The boxed character(s) is (are) not putting out the damage they should and with my enchanter I noticed that she does not always mezz like she should. Heals seem to work just fine, but dps is not. I will keep an eye on this thread for a fix to this issue. Thank you TheNomadMan for your post.
 
Line 1147 ish find this code
Rich (BB code):
| -------------------------------------------------------------------------------------
| SUB: CheckCasting
| -------------------------------------------------------------------------------------
    Sub CheckCasting(int CCTime)
    /if (${IAmABard} && ${Twisting}) /return
    /declare CCTimer timer local ${CCTime}
        /if (!${CCTimer}) /varset CCTimer 30s
        :NotReady
            /if (${CCTimer}==0) /return
            /delay 5
        /if (${Me.Casting.ID} || ${Cast.Status.Equal[C]} )  /goto :NotReady
    /return
and replace with this code
Rich (BB code):
| -------------------------------------------------------------------------------------
| SUB: CheckCasting
| -------------------------------------------------------------------------------------
    Sub CheckCasting(int CCTime)
    /if (${IAmABard} && ${Twisting}) /return
    /declare CCTimer timer local ${CCTime}
        /if (!${CCTimer}) /varset CCTimer 30s
        :NotReady
            /if (${CCTimer}==0) /return
            /delay 5
        /if (${Me.Casting.ID} || ${Cast.Status.Equal[C]} || ${Cast.Status.Equal[T]} )  /goto :NotReady
        /delay 18 ${Cast.Status.Equal}
    /return  


see if that fixes the problem.
 
The end result appears to be the same :-(



Rich (BB code):
[Heals]
Help=Format Spell|% to heal at i.e. Devout Light Rk. II|50
HealsOn=1
Heals1=Protection of Direwood|80|Tap
Heals2=Survival of the Fortuitous|25
Heals3=Vivification|40
Heals4=Lunassuage|84
Heals5=Stemfang Rush|70
Heals6=Sterivida|90
Heals7=Promised Recovery|99|MA
Heals8=NULL
Heals9=NULL

Rich (BB code):
[DPS]
DPSOn=2
DPSSkip=10
DPSInterval=2
DPS1=Sunbeam Blessing|99|MA
DPS2=Clutch of Ro|98|Once
DPS3=Surge of Spineburrs|97|MA
DPS4=Nature's Withering Wrath|96
DPS5=Summer Suncrest|95
DPS6=NULL

- - - Updated - - -

Here's a snippet from the very start of a fight, where DPSOn=2 should have spells landing in the order specified. Such was not the case:



DPS1 Cast and Landed
DPS2 Skipped Due to Recovery
DPS3 Skipped Due to Recovery
DPS4 Cast and Landed
DPS5 Skipped Due to Recovery
DPS1 Skipped Due to Recovery
DPS2 Cast and Landed
DPS3 Skipped Due to Recovery
DPS5 Skipped Due to Recovery
DPS1 Skipped Due to Recovery

Two out of five worked right. And; this is without a single attempted heal spell
 
Last edited by a moderator:
My wiz and druid and shammy are casting normally. i don't know whats causing you to try and cast during cool down. I can't duplicate the problem.
 
Say; I dunno either. A few of the workarounds I've tried get it sorted out, to various extents, but seem to cause other problems. Based on my own conversations and the posts by ctaylor22 + needmymq2; it seems I'm not the only one seeing this happen, tho. :-/
 
Heya all,

I looked into the code after finally getting Notepad++ to work hehe, found some things that could cause described issues on lag.
I changed combat sub, combatcast sub, castwhat sub and checkcasting sub as follows. Note I used version 7.1 as source.... and code is untested yet.

Rich (BB code):
Sub Combat

        /doevents

        /if (!${MyTargetID} || !${Target.ID} || ${DMZ} || !${Target.LineOfSight} || ${Select[${Role},puller,pullertank,pullerpettank]} && ${Math.Distance[${CampYLoc},${CampXLoc}]}>=${MeleeDistance}) /return

        /if (${DebugCombat}) /echo Combat: Enter

        /if (${HealsOn}) /call CheckHealth

        /if (${ChaseAssist}) /call DoWeMove

        /declare CombatRadius int local ${MeleeDistance}

        /declare ZDist float local ${Math.Distance[${Target.Z}:${Me.Z}]}

        /if (${MezOn}) /call DoMezStuff

        | Check Target Hps and type NPC or NPC Pet

        /if (${DebugCombat}) /echo ${Spawn[${MyTargetID}].PctHPs}<=${AssistAt} && ${Spawn[${MyTargetID}].Distance}<${CombatRadius}

        /if (${Select[${Role},pettank]} && ${Spawn[${MyTargetID}].Distance}<${CombatRadius}) /call CombatPet

        /if (${AggroOn} && ${MainAssist.NotEqual[${Me}]} && ${Select[${Role},Tank]} && ${Spawn[${MyTargetID}].Distance}>${CombatRadius}) /call AggroCheck
 
        /if (${Spawn[${MyTargetID}].PctHPs}<=${AssistAt} && ${Spawn[${MyTargetID}].Distance}<${CombatRadius}) {

            /if (!${CombatStart}) {

                /if (${DebugCombat}) /echo Combat Start

                /varset MercAssisting 0

                /varset CombatStart 1

                /echo  ATTACKING -> ${Spawn[${MyTargetID}].CleanName} <-

                /if (${Select[${Role},Tank,PullerTank,pullerpettank,Hunter]}) /call BroadCast ${IRCOn} ${EQBCOn} y "TANKING-> ${Spawn[${MyTargetID}].CleanName} <- ID:${MyTargetID}"

                /if (${Group}==1 && ${Select[${Role},puller]} && ${Group.Puller.Name.Equal[${Me}]} && ${Spawn[=${MainAssist}].Type.Equal[Mercenary]} && ${Math.Distance[${CampYLoc},${CampXLoc}]}<${CampRadius}) /call AssignGroupRole unset "${Me.CleanName}" 3

            }

            /if (${FaceMobOn} && ${Target.ID}) /face fast

            /if (${Select[${Role},pullerpettank]}) /pet attack

            /if (${MeleeOn} && !${Attacking}) {

                /varset Attacking 1

                /if (${Me.Sitting}) /stand

                /if (!${AutoFireOn}) {

                    /if (${DebugCombat}) /echo Attack On

                    | Speed up tanks attacking inc mobs MQ2Melee /killthis can cause a delay

                    /if (${Select[${Role},tank,pullertank,hunter]}) {
                        /if (${Me.Mount.ID}) /dismount

                        /if (${Me.Ability[taunt]} && ${Me.AbilityReady[taunt]} && ${Target.Distance}<${Target.MaxRangeTo}*0.8 && ${Me.TargetOfTarget.ID}!=${Me.ID})  /doability taunt

                        /attack on

                        /stick ${StickHow} 13 id ${MyTargetID}

                    }

                    /killthis

                    /if (${StickHow.NotEqual[0]}) /stick ${StickHow} 12 id ${MyTargetID}

                    | Move closer if Z distance more than 4 due to levitation

                    /call ZCheck ${ZDist} 4.1

                }

                /if (${MeleeOn} && ${AutoFireOn} && !${Me.AutoFire}) {

                    /if (${DebugCombat}) /echo Autofire on

                    /echo Autofire On

                }

            }

            /varset  MyExp ${Me.PctExp}

            /varset  MyAAExp ${Me.PctAAExp}

            :Attack

                /doevents

                /if (${MercOn} && !${MercAssisting} && ${MyTargetID} && ${Mercenary.State.Equal[Active]}) /call MercsDoWhat

                /if (${MezOn}) /call DoMezStuff

                /if (${AEOn}) /call AECheck

                /if (${AggroOn}) /call AggroCheck

                /if (${PetOn}) /call CombatPet

                /if (${HealsOn}) /call CheckHealth

                /if (${CuresOn}) /call CheckCures

                /if (!${NamedCheck}) /call NamedWatch

                /if (${DPSOn}) /call CombatCast

                /call CheckBuffs

                /call WriteDebuffs

                /if (${IAmABard}) /call DoBardStuff

                /if (${DPSOn} || ${MeleeOn} || ${PetOn}) /call CombatTargetCheck

                /if (${Attacking} && ${MeleeOn} && ${Target.PctHPs}<=${Math.Calc[${AssistAt}-5]} && ${Target.Distance}<${CombatRadius} && !${AutoFireOn}) {

                    /if (!${Me.Combat}) {

                        /if (${Me.Sitting}) /stand
                        /if (${Me.Mount.ID}) /dismount
                        /killthis

                    }

                    /if (${StickHow.NotEqual[0]} && !${Stick.Active} && ${Target.Distance}>15) /stick ${StickHow} id ${MyTargetID}

                }

                /if (${CombatStart} && ${AutoFireOn}) {

                    /if (${Spawn[${MyTargetID}].ID}) /range

                }

                /if (${Spawn[${MyTargetID}].Type.Equal[Corpse]} || !${Spawn[${MyTargetID}].ID}) {

                    /call CombatReset

                    /call CheckForAdds Combat

                    | Random 1-2 sec delay so eveyone doesn't return to camp at once

                    /if (${ReturnToCamp} && ${MainAssist.NotEqual[${Me}]}) {

                        /delay ${Math.Calc[${Math.Rand[1]}+1]}s

                        /call DoWeMove

                    }

                    /return

                }

            /if (${Spawn[${MyTargetID}].Type.NotEqual[Corpse]} || ${Spawn[${MyTargetID}].ID} || ${Melee.Status.NotEqual[FEIGNING]}) /goto :Attack

        }

        /if (${DebugCombat}) /echo Combat: Leave

    /return

Rich (BB code):
    Sub CombatCast
        /if (${DebugCombat}) /echo CombatCast: Enter
        /declare i int local 0
        /declare DPSText string local
        /declare DPSAt int local ${AssistAt}
        /declare DPSTargetID int local ${MyTargetID}
        /declare DPSItem string local
        /for i 1 to ${DPS.Size}
          /if (${DebugCombat}) /echo ${DPS[${i}]} ${DPS[${i}].Arg[1,|]} ${DPS[${i}].Arg[2,|]} ${DPS[${i}].Arg[3,|]}
            /doevents
            /if (${Spawn[${MyTargetID}].Type.Equal[Corpse]} || !${Spawn[${MyTargetID}].ID})  {
				/if (${Me.Casting.ID}) /stopcast
				/return
			}
            /if (!${DPS[${i}].Length}) /return
            /if (${MezOn}) /call DoMezStuff
            /if (${MercOn} && !${MercAssisting} && ${MyTargetID} && ${Mercenary.State.Equal[Active]}) /call MercsDoWhat
            /if (${PetOn}) /call CombatPet
            /if (${HealsOn}) /call CheckHealth
            /if (${CuresOn}) /call CheckCures
            /if (${AggroOn}) /call AggroCheck
			|Check for user activated cast and delay till finished
			/call CheckCasting 300
			|Yes 300, Portalspells and Lesson take that long, MQ2Melee does cast outside of the macro too.
            /call CombatTargetCheck
            /if (${DebugCombat}) /echo ${DPS[${i}]} ${DPS[${i}].Arg[1,|]} ${DPS[${i}].Arg[2,|]} ${DPS[${i}].Arg[3,|]}
            | - Check for 2nd value in dps for mob health
            /if (${DPS[${i}].Arg[2,|].Length}) {
                /varset DPSText ${DPS[${i}]}
                /varset DPS[${i}] ${DPSText.Arg[1,|]}
                /varset DPSAt ${DPSText.Arg[2,|]}
                /if (${DPSText.Arg[3,|].Find[MA]}) /varset DPSTargetID ${Spawn[=${MainAssist}].ID}
                /if (${DPSText.Arg[3,|].Find[Me]} || ${DPSText.Arg[3,|].Find[Feign]}) /varset DPSTargetID ${Me.ID}
                /if (${DebugCombat}) /echo ${DPS[${i}].Arg[1,|]} ${DPSAt} ${DPSTargetID}
            }
            /if (${Me.Class.Name.Equal[Cleric]} && ${DPS[${i}].Find[Hammer]} && ${Me.Pet.ID}) /goto :skipcast
            /if (${Me.Class.Name.Equal[Wizard]} && ${Me.Pet.ID} && (${DPS[${i}].Find[sword]} || ${DPS[${i}].Find[blade]})) /goto :skipcast
            /if (${Target.PctHPs}<${DPSSkip} || ${DPS[${i}].Equal[NULL]} || ${ABTimer${i}} || ${DPSTimer${i}} || ${FDTimer${i}} || (!${Select[${MacroQuest.Server},zek]} && ${Target.Type.NotEqual[NPC]} && ${Target.Master.Type.NotEqual[NPC]})) /goto :skipcast
            /if (${Target.PctHPs}>${DPSAt} && ${DPSOn}==1) /goto :skipcast
                /if (${DebugCombat}) /echo CombatCast: "${DPS[${i}]}" Target: ${Target.ID} Timer: ${DPSTimer${i}}
                /if (${Select[${DPSText.Arg[3,|]},Me,MA]} && ${Me.Combat} && ${MainAssist.NotEqual[${Me}]}) {
                    /attack off
                    /delay 10 !${Me.Combat}
                }
                /call CastWhat "${DPS[${i}]}" ${DPSTargetID} DPS
                /if (${DebugCombat}) /echo CombatCast: ${Macro.Return}
                /if (${Macro.Return.Equal[CAST_SUCCESS]}) {
                    /echo ** ${DPS[${i}]} on >> ${Spawn[${DPSTargetID}].CleanName} <<
                    | Set timer for spells labeled once 5m
                    /if (${DPSText.Arg[3,|].Length} && ${DPSText.Arg[3,|].Find[once]}) {
                        /varset DPSTimer${i} 5m
                        /goto :skipcast
                    | Timers for items    
                    } else /if (${FindItemCount[=${DPS[${i}]}]}) {
                        /varcalc DPSTimer${i} ${FindItem[=${DPS[${i}]}].Spell.Duration.TotalSeconds}*10
                        /goto :skipcast
                    | FD to lose aggro
                    } else /if (${Select[${Me.Class.ShortName},MNK,NEC,SHD]} && ${DPSText.Arg[3,|].Find[Feign]}) {
                        /delay 30 ${Me.State.Equal[FEIGN]}
                        /varset FDTimer${i} 60s
                        /delay 10s ${Me.State.NotEqual[FEIGN]}
                        /if (${Me.State.Equal[FEIGN]} && !${Me.Sitting}) /stand
                    | Timers for spells
                    } else /if (${Me.Book[${DPS[${i}]}]}) {
                        | - Attack Buff Timers are seperate. DPS timers are cleared after every fight.
                        /if (${Select[${DPSTargetID},${Me.ID},${Spawn[=${MainAssist}].ID}]}) {
                            /varcalc ABTimer${i} (${Spell[${DPS[${i}]}].Duration.TotalSeconds}*${DurationMod})*10
                            /if (${DebugCombat}) /echo Spell:${DPS[${i}]} Timer:ABTimer${i} Time:${ABTimer${i}}
                            /goto :skipcast
                        | - Custom timer for counterbias
                        } else /if (${Me.Class.Name.Equal[Shaman]} && ${DPS[${i}].Find[counterbias]}) {
                            /varset DPSTimer${i} 1.5m
                            /goto :skipcast
                        | Custom timer for Chanter suffocation
                        } else /if (${Me.Class.Name.Equal[enchanter]} && ${DPS[${i}].Find[suffocation]}) {
                            /varset DPSTimer${i} 1m
                            /goto :skipcast
                        | Custom timer for Beastlord Feralgia Timer
                        } else /if (${Me.Class.Name.Equal[Beastlord]} && ${DPS[${i}].Find[feralgia]}) {
                            /varset DPSTimer${i} 1.5m
                            /goto :skipcast
                        | Regular spells
                        } else /if (${Spell[${DPS[${i}]}].Duration}>0) {
                            /varcalc DPSTimer${i} ${Spell[${DPS[${i}]}].Duration.TotalSeconds}*10
                            /goto :skipcast
                        | Spells with no timers assign DPS interval
                        } else {
                            /varset DPSTimer${i} ${DPSInterval}s
                            /goto :skipcast
                        }
                    | AA and disc timers
                    } else /if (${Spell[${DPS[${i}]}].Duration}>0) {
                        /varcalc DPSTimer${i} ${Spell[${DPS[${i}]}].Duration.TotalSeconds}*10
                        /goto :skipcast
                    | AA and disc with no timers assign DPS interval
                    } else {
                        /varset DPSTimer${i} ${DPSInterval}s
                        /goto :skipcast
                    }
                }
            :skipcast
            /if (${DebugCombat}) /echo ${DPS[${i}]} ${Macro.Return} DPSTimer${i} ${DPSTimer${i}}
            /if (${Select[${DPSText.Arg[3,|]},Me,MA]}) /call CombatTargetCheck
            | Reset values if 2nd value in dps for mob health exists
            /if (${DPSText.Arg[2,|].Length}) {
                /varset DPS[${i}] ${DPSText}
                /varset DPSAt ${AssistAt}
                /varset DPSText
                /varset DPSTargetID ${MyTargetID}
            }
        /next i
        /if (${DebugCombat}) /echo CombatCast: Leave
    /return
Rich (BB code):
Sub CastWhat(string castWhat,int castTargetID,string sentFrom)
        /if (${Debug}) /echo  CastWhat: Enter castWhat - ${castWhat} castTargetID - ${castTargetID}
        /declare WasTwisting bool local ${Twist}
        /varset CastResult CAST_FAIL
        /if (${Me.CombatAbility[${castWhat}]} && !${Me.CombatAbilityTimer[${castWhat}]}) {
            /if (${WasTwisting}) {
                /squelch /twist off
                /delay 20 !${Twist}
            }
            /if (${Target.ID}!=${castTargetID}) {
				/target id ${castTargetID}
				/delay 10 ${Target.ID}==${castTargetID}
			}
			/delay 2
            /disc ${castWhat}
            /varset CastResult CAST_SUCCESS
            /delay 25 ${Me.CombatAbilityTimer[${castWhat}]}
        }
        | - Check & cast if item
        /if (${FindItem[=${castWhat}].ID} && ${FindItem[${castWhat}].Timer}==0) {
            /if (${WasTwisting}) {
                /squelch /twist off
                /delay 30 !${Twist} && !${Me.Casting.ID}
            }
            /if (${Target.ID}!=${castTargetID}) {
				/target id ${castTargetID}
				/delay 10 ${Target.ID}==${castTargetID}
			}
			/delay 2
            /casting "${castWhat}|item" -targetid|${castTargetID}
            | /call Cast "${castWhat}"  item
            /varset CastResult ${Cast.Result}

            /call CheckCasting 50
            /delay 3

            /if (${WasTwisting} && !${Twist}) {
                |/delay 30
				|Saw no reason, why 3 seconds wait for nothing, Crystane.
                /squelch /twist
            }
            /return ${CastResult}
        }
        | - Check & cast if AA
         /if ((${Me.AltAbility[${castWhat}]} || ${castWhat.Find[Banestrike]}) && ${Me.AltAbilityReady[${castWhat}]}) {
			/if (${Target.ID}!=${castTargetID}) {
				/target id ${castTargetID}
				/delay 10 ${Target.ID}==${castTargetID}
			}
			/delay 2

            /if (!${IAmABard}) {
                /casting "${castWhat}"|alt -maxtries|2
                | /call Cast "${castWhat}" alt 5s
                /varset CastResult ${Cast.Result}
            }
            /if (${IAmABard}) {
                /alt act ${Me.AltAbility[${castWhat}].ID}
				/delay 2
                /if (${Me.AltAbilityReady[${castWhat}]}) {
                    /varset CastResult CAST_RECOVER
                } else {
                    /varset CastResult CAST_SUCCESS
                }
            }
			|Added Checkcasting since some AAs take some time to cast. Crystane
			/call CheckCasting 50
        }
        | - Check & cast if spell
        /if (${Me.Book[${castWhat}]} && ${Spell[${castWhat}].Mana}<=${Me.CurrentMana}) {
            | Mem spell if not memmed
            /if (!${Me.Gem[${castWhat}]}) {
            /if (${Attacking} && ${MainAssist.Equal[${Me}]} || ${HealsOn} && ${AggroTargetID} && ${sentFrom.NotEqual[Heal]}) /return
                /if (${Bool[${Plugin[mq2instantmem]}]}) {
                    /memspell ${MiscGem} "${castWhat}"
                } else {
                    /memorize "${castWhat}" ${MiscGem}
                }
				|Edit to prevent lag issues(e.g. lag prevents spell being memorized and macro delays 35s after)
                |/delay 350 ${Cast.Ready[${castWhat}]}
				/delay 30 ${Me.Gem[${castWhat}]}
				/if (${Me.Gem[${castWhat}]}) /delay 301 ${Cast.Ready[${castWhat}]}
            }
            /if (${Target.ID}!=${castTargetID}) {
				/target id ${castTargetID}
				/delay 10 ${Target.ID}==${castTargetID}
			}
			/delay 2
			/if (${Cast.Ready[${castWhat}]} && !${IAmABard}) {
                 /casting "${castWhat}" -maxtries|2
                | /call cast "${castWhat}" gem8 3s
                /doevents
                /varset CastResult ${Cast.Result}

                /call CheckCasting 100

                /delay 3
           }
            /if (${IAmABard}) {
                /squelch /twist once ${castWhat}
                /varset CastResult CAST_SUCCESS
            }
        }
        /if (${WasTwisting} && !${Twist}) /squelch /twist
        /if (${Debug})    /echo ${CastResult}
    /return ${CastResult}
Rich (BB code):
Sub CheckCasting(int CCTime)
    /if (${IAmABard} && ${Twisting}) /return
    /declare CCTimer timer local ${CCTime}
        /if (!${CCTimer}) /varset CCTimer 30s
        :NotReady
            /if (${CCTimer}==0) /return
            /delay 10 (!${Me.Casting.ID} && !${Cast.Status.Equal[C]} && !${Cast.Status.Equal[T]}) || ${Cast.Status.Equal}
        /if (${Me.Casting.ID} || ${Cast.Status.Equal[C]} || ${Cast.Status.Equal[T]})  /goto :NotReady
    /return


- - - Updated - - -

going to test my code now, I will look into the issue to cast in the order setup without skipping when i can
 
ok i just made the corrections you posted going to try it right now

ok i just tried it this is my log now from it the fails are when the spell gems are all greyed out

[2014/06/03 12:27:46] [MQ2] toggle Debug

[2014/06/03 12:27:46] [MQ2] >> Set Debug: On

[2014/06/03 12:27:46] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:46] [MQ2] CAST_FAIL

[2014/06/03 12:27:46] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:47] [MQ2] CAST_FAIL

[2014/06/03 12:27:47] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:47] [MQ2] CAST_FAIL

[2014/06/03 12:27:47] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:50] [MQ2] CAST_SUCCESS

[2014/06/03 12:27:50] [MQ2] ** Blistersteel Malosenia on >> Captain Ixtaz <<

[2014/06/03 12:27:50] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:27:50] [MQ2] CAST_FAIL

[2014/06/03 12:27:50] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:50] [MQ2] CAST_FAIL

[2014/06/03 12:27:51] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:27:51] [MQ2] CAST_FAIL

[2014/06/03 12:27:51] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:51] [MQ2] CAST_FAIL

[2014/06/03 12:27:51] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:27:51] [MQ2] CAST_FAIL

[2014/06/03 12:27:51] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:51] [MQ2] CAST_FAIL

[2014/06/03 12:27:52] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:27:54] [MQ2] CAST_SUCCESS

[2014/06/03 12:27:54] [MQ2] ** Fickle Magma on >> Captain Ixtaz <<

[2014/06/03 12:27:54] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:54] [MQ2] CAST_FAIL

[2014/06/03 12:27:54] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:54] [MQ2] CAST_FAIL

[2014/06/03 12:27:55] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:55] [MQ2] CAST_FAIL

[2014/06/03 12:27:55] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:55] [MQ2] CAST_FAIL

[2014/06/03 12:27:55] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:55] [MQ2] CAST_FAIL

[2014/06/03 12:27:55] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:58] [MQ2] CAST_SUCCESS

[2014/06/03 12:27:58] [MQ2] ** Blistersteel Malosenia on >> Captain Ixtaz <<

[2014/06/03 12:27:59] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:27:59] [MQ2] CAST_FAIL

[2014/06/03 12:27:59] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:59] [MQ2] CAST_FAIL

[2014/06/03 12:27:59] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:28:00] [MQ2] CAST_FAIL

[2014/06/03 12:28:00] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:00] [MQ2] CAST_FAIL

[2014/06/03 12:28:00] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:28:02] [MQ2] CAST_SUCCESS

[2014/06/03 12:28:02] [MQ2] ** Fickle Magma on >> Captain Ixtaz <<

[2014/06/03 12:28:02] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:02] [MQ2] CAST_FAIL

[2014/06/03 12:28:02] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:28:02] [MQ2] CAST_FAIL

[2014/06/03 12:28:03] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:03] [MQ2] CAST_FAIL

[2014/06/03 12:28:03] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:28:03] [MQ2] CAST_FAIL

[2014/06/03 12:28:03] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:03] [MQ2] CAST_FAIL

[2014/06/03 12:28:03] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:28:06] [MQ2] CAST_SUCCESS

[2014/06/03 12:28:06] [MQ2] ** Blistersteel Malosenia on >> Captain Ixtaz <<

[2014/06/03 12:28:06] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:28:07] [MQ2] CAST_FAIL

[2014/06/03 12:28:07] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:07] [MQ2] CAST_FAIL

[2014/06/03 12:28:07] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:28:07] [MQ2] CAST_FAIL

[2014/06/03 12:28:07] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:07] [MQ2] CAST_FAIL

[2014/06/03 12:28:07] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:28:08] [MQ2] CAST_FAIL

[2014/06/03 12:28:08] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:08] [MQ2] CAST_FAIL

[2014/06/03 12:28:08] [MQ2] CastWhat: Enter castWhat - Fickle Magma castTargetID - 5369

[2014/06/03 12:28:10] [MQ2] CAST_SUCCESS

[2014/06/03 12:28:10] [MQ2] ** Fickle Magma on >> Captain Ixtaz <<

[2014/06/03 12:28:10] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:28:10] [MQ2] CAST_FAIL

[2014/06/03 12:28:10] [MQ2] toggle Debug

[2014/06/03 12:28:10] [MQ2] >> Set Debug: Off

[2014/06/03 12:28:15] [MQ2] ** Blistersteel Malosenia on >> Captain Ixtaz <<

[2014/06/03 12:28:18] [MQ2] ** Fickle Magma on >> Captain Ixtaz <<
 
So far I know, the spells are sorted into an array for the correct order. Your debuglogs indicate your casts fail 2 times for unknown reason and then by design the macro goes on to try next spell.
 
CAST_FAIL this is not technically a fail. its not a valid mq2cast return. Its just what i use to indicate the spell didn't cast for what ever reason.

The main problem these people seem to be experiencing is the asynchronous behavior of mq2cast and KissAssist. Kiss sends a command and mq2cast will process it outside of the flow of the macro. This actually how all plugins work. All the code in Kiss tries to compensate for this and sync the 2 back up. This is mainly by making Kiss wait until MQ2Cast has completely finished its actions and sometimes it tries to cast so fast kiss doesn't even have time to react. I think this is what is causing the issues here along with the global cool down.

MQ2Cast is worst offender of these type of behavior too. I choose MQ2Cast to handle the spell casting when i started writing Kiss 3 years ago because it has some features a like that I wouldn't have to code for. Kiss was like 500 lines back then now its over 4000. I am beginning to think there is no true way to sync up Kiss and MQ2Cast anymore with the amount of aa/items/spells that toons can use now. I testing Kiss with spell-routines to move the cast handling back into the flow of the macro.
 
Looking at that, and at my own debugs, it appears each one is only attempted once before moving on:

[2014/06/03 12:27:46] [MQ2] toggle Debug

[2014/06/03 12:27:46] [MQ2] >> Set Debug: On

[2014/06/03 12:27:46] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:46] [MQ2] CAST_FAIL

[2014/06/03 12:27:46] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:47] [MQ2] CAST_FAIL

[2014/06/03 12:27:47] [MQ2] CastWhat: Enter castWhat - Spear Blistersteel castTargetID - 5369

[2014/06/03 12:27:47] [MQ2] CAST_FAIL

[2014/06/03 12:27:47] [MQ2] CastWhat: Enter castWhat - Blistersteel Malosenia castTargetID - 5369

[2014/06/03 12:27:50] [MQ2] CAST_SUCCESS

It seems to be going back and forth between Spear Blistersteel and Blistersteel Malo, looking for something it can cast, failing at each attempt during the "grey out" recovery period. This is the same sorta thing I'm seeing with the unmodified code.

- - - Updated - - -

That sounds awesome Maskoi. Finger's crossed! =)
 
me personaly i dont need help with this i dont care what may mage cast and what time is does. im just trying to help thenomadman because we are friends ingame and i have a different set up. i love just about everything about kissassist im too much of a noob to find problems :)
 
It didn't try to cast it all really. It was next on list combatcast sent it to castwhat. castwhat said can't cast this spell for ever reason global cool down, picking my nose, trade window open, spell no refreshed, all with in 2 seconds

This making me rethink my debug system a lot too. It can easily be confusing.
 
View attachment 6300Here try this UNOFFICIAL KissAssist 7.3 version see if fixes your casting issues and kill yours toons.

Let me know how long it runs until your character are dead or any other issues.

EDIT: Tweaked casting timing should be a little more responsive.

7.3 BETA MOVED TO OWN THREAD
 
Last edited:
Raid time; so I haven't had much time to test it, yet. Will play with it more, tonight. Initial impression is that everything is working, it's all just working a might slow. There's seconds after global cd, before each spell casts. Druid lets the tank die pretty readily due to slow response in healing. But it is not skipping on DPSOn=2, anymore, I don't believe. Meh... gotta get back to the raid....

- - - Updated - - -

So; out of combat healing seems dandy. And; DPS spells are casting in the correct order, if slowly (delays for mq2cast no longer needed?). However; heals and dps aren't playing well together. It seems that heals work fine at the start of a fight; but once the DPS routine starts, heals stop. I'm guessing that a number of DPS spells are being queued up and need be cleared to make room for a heal spell..? Perhaps the "fails" in 7.2 are part of what allowed healing to be so responsive (queue emptied quickly)..?

- - - Updated - - -

Injecting the following loop in to the spellgem casting check of CastWhat seems to make 7.2 behave very much like 7.3, but without so much delay around a cast. This makes my noob-self wonder if KA can't keep using mq2cast the way it is, with a "If spell is not ready" check and a reduction (down to 1?) of the number of DPS spells that are being queued up at any one time..? If I knew more about it; I'd try adding a counter limit of three or four on to that loop, so as to ensure it's not going to wait more than 1.5 to 2 secs for a spell to become ready. Thus, hopefully, only addressing global cd.
Rich (BB code):
            /target id ${castTargetID}
            /delay 10 ${Target.ID}==${castTargetID}
           :tryagain
	    /if (!${Cast.Ready[${castWhat}]} && !${IAmABard}) {
	         /delay 5
		 /goto :tryagain
	    }
            /if (${Cast.Ready[${castWhat}]} && !${IAmABard}) {
                 /casting "${castWhat}" -maxtries|2
                | /call cast "${castWhat}" gem8 3s
                /doevents
                /varset CastResult ${Cast.Result}
                /call CheckCasting 30
            }
            /if (${IAmABard}) {
                /squelch /twist once ${castWhat}
                /varset CastResult CAST_SUCCESS
            }

- - - Updated - - -

This injection seems to have the same effect, without the risk of getting stuck in a loop. The trade off being a potential extra second delay after global cd. Again; the remaining issue appears to be that once DPS spells get queued in, heals can't cast till all queued DPS spells have finished. Can CombatCast be made to only send one spell, at a time, to CastWhat?

Rich (BB code):
            /target id ${castTargetID}
            /delay 10 ${Target.ID}==${castTargetID}
	    /if (!${Cast.Ready[${castWhat}]} && !${IAmABard}) {
		/delay 15
	    }
            /if (${Cast.Ready[${castWhat}]} && !${IAmABard}) {
                 /casting "${castWhat}" -maxtries|2
                | /call cast "${castWhat}" gem8 3s
                /doevents
                /varset CastResult ${Cast.Result}
                /call CheckCasting 30
            }
            /if (${IAmABard}) {
                /squelch /twist once ${castWhat}
                /varset CastResult CAST_SUCCESS
            }
        }

- - - Updated - - -

With the above injections (either one, the loop seems better) and DPSOn=1, things seem to work near flawless like. Healing still seems a little sluggish, tho. It will cast one or two DPS before heal, when it should cast heal. Shorter queue with DPSOn=1? Or; something I missing?

- - - Updated - - -

Maybe queue is the wrong word? Array size in SUB: Sort Array, perhaps?
 
Last edited:
The code you posted above no longer works with Kiss 7.3. Are you using 7.3? /casting, ${Cast.Ready} and ${Cast.Result} are MQ2Cast TLO's. Using those just creates the problem again.

7.3 completely removed MQ2Cast Support and replaced it with with spell_routines.inc.

/casting, ${Cast.Ready} and ${Cast.Result} are now /call cast, ${Me.SpellReady[${castWhat}]} and ${Macro.Return}
 
I was using the 7.2 code for that

Injecting the following loop in to the spellgem casting check of CastWhat seems to make 7.2 behave very much like 7.3, but without so much delay around a cast.

As stated, using that loop, DPS works fine. Heals become sluggish waiting for DPS to finish. This is true of both 7.2, with the loop, and the unmodified 7.3 code. Which is why I was asking if the 7.2 code can be made to send only one DPS down at a time, rather than a queue (array?). Though, I think the same would work for 7.3 (one DPS at a time) once the extra delays are removed.
 
I just uploaded a new 7.3 file. I was working on more last night. It has a test for global cooldown in it and a lot of work on the debug to make it easier to read.

Switching from MQ2Cast to spell_routines is a MAJOR revision. Its going to take a week or so to fine tune and debug it. I am passing the new version to my testers as well.

spell_routines.inc is in your macro folder. all of the instructions are in that file as well for reference which you can read in notepad or any other text editor.

thanks for the input keep playing with it and we will nail it down hopefully this week. I am giving this my full attention until i am happy with it.
 
Likewise; thanks for hearing me and others out on this. An unexpected headache, I'm sure lol
 
Bug - Attempting to confirm bug. Please assist.

Users who are viewing this thread

Back
Top
Cart