Buff casting loop issue. (No Stacking check)

Discussion in 'E3' started by gratefuljim73, Jul 9, 2023.

  1. gratefuljim73

    gratefuljim73 Orc Pawn

    Messages:
    4
    Hello.

    Long Long Long time EQ player .. fairly new to PEQ emu.

    I have an issue I can't seem to figure out.. maybe I'm not configuring my buffs section right.... but I can't fathom how to do it.

    Issue is:

    I have my buffs section setup... but if i get higher level buffs placed on me that what i can self cast.... and it does not stack... i'm in an endless casting loop trying to overwrite a higher spell that mine wont overide or stack with.

    Example from my E3 (version 7) ToonName_PEQTGC.ini

    Self Buff=Worn Totem/CheckFor|Blessing of Swiftness
    Self Buff=Blessing of Piety/CheckFor|Blessing of Piety/Gem|1/MinMana|35
    Self Buff=Bravery/CheckFor|Bravery/Gem|8/MinMana|35
    Self Buff=Symbol of Ryltan/CheckFor|Symbol of Ryltan/Gem|7/MinMana|35
    Self Buff=Guard/CheckFor|Guard/Gem|6/MinMana|35



    So ... If i use Bocoh buff bots in Guild Lobby.... I'm stuck in a self buff loop trying to overwrite Temperance with my lesser Bravery .....

    Is there some stacking check i'm not accounting for???

    I'm too used to "other" mq2 compiles that have stack checks ...

    example: ${Spell[Illusion: Skeleton].Stacks}


    I am not seeing any STACKING checks on the e3_Casting.inc either . . . . .
    I'm assuming there should be a stacking check in there.. would only make sense since it handles the casting routines.


    What do i do ????
     
    Last edited: Jul 9, 2023
  2. eonEQemu

    eonEQemu Froglok Krup Watcher

    Messages:
    301
    add /CheckFor|Temperance to the end of the Buff line that is trying to cast.
    Other option is to temporarily comment out the line using * or // in your ini. and for spells, just make a Macro where you /tell or in /g chat say to the cleric the name of the spell you want to buff. So you can still use it when Temp wears off.
    example
    /bcg //g Bravery
    /bcg //g Guard
    /bcg //g Symbol of Ryltan
     
  3. gratefuljim73

    gratefuljim73 Orc Pawn

    Messages:
    4
    I have a solution for this.

    e3_BuffCheck.inc needs to be altered:


    ORIGINAL:

    Code:
    SUB buffBots(ArrayName)
    /if (${Debug} || ${Debug_BuffCheck}) /echo |- buffBots [${ArrayName}] ==>
        /declare s                    int local
        /declare buffTargetID        int local
        /declare buffTarget            string local
        /declare buffSpellID        int local
        /declare buffCheckForID        int local 
        /declare buffSpellName        string local
        /declare buffCheckForName    string local
        /declare currentBuffs        string local
        /declare currentSongs        string local
     /for s 1 to ${${ArrayName}.Size[1]}
        /if (${Debug} || ${Debug_BuffCheck}) /echo buffing ${${ArrayName}[${s},${iCastName}]} on ${${ArrayName}[${s},${iCastTarget}]} checkFor ${${ArrayName}[${s},${iCheckFor}]}
        /if (${Select[${ArrayName},InstantBuffs2D,SelfBuffs2D]}) {
            /varset buffTargetID ${Me.ID}
            /varset buffTarget ${Me.Name}
        } else /if (${Select[${ArrayName},CombatBuffs2D,BotBuffs2D]}) {
            /varset buffTargetID ${Spawn[=${${ArrayName}[${s},${iCastTarget}]}].ID}
            /varset buffTarget ${${ArrayName}[${s},${iCastTarget}]}
        }
        /varset buffSpellName        ${${ArrayName}[${s},${iSpellName}]}
        /varset buffSpellID        ${${ArrayName}[${s},${iSpellID}]}]
        /varset buffCheckForName    ${${ArrayName}[${s},${iCheckFor}]}
        /varset buffCheckForID        ${${ArrayName}[${s},${iCheckForID}]}
      /if (!${Bool[${NetBots[${buffTarget}].ID}]}) /goto :skipBuff
        |/echo ${buffSpellName} ${buffSpellID} ${buffCheckForName} ${buffCheckForID} ${Bool[${NetBots[${buffTarget}].Buff.Find[${buffSpellID} ]}]}
      |/echo ${buffSpellName} ${Select["${buffSpellName}","Thief's Eyes", "Fists of Wu", "Commanding Voice","Cry Havoc"]}
      /if (${Select[${buffSpellID},8001,8002,8000,8003]}) {
        /call meleeCombatBuffs "${ArrayName}" ${s}
        /goto :skipBuff
      }
      |------- Self ------|
      /if (${Select[${ArrayName},SelfBuffs2D,InstantBuffs2D]}) {
        /if (!${Bool[${Me.Buff[${buffSpellName}]}]} || (${Bool[${Me.Buff[${buffSpellName}]}]} && ${Me.Buff[${buffSpellName}].Duration.TotalSeconds} <= ${buffRecastTime})) {
          /if (!${Bool[${Me.Song[${buffSpellName}]}]} && !${Bool[${Me.Song[${buffCheckForName}]}]}) {             
            /if (${Spell[${buffSpellID}].NewStacks} && !${Bool[${Me.Buff[${buffCheckForName}]}]}) {
              /call check_Ready "${ArrayName}" ${s}
              /if (${c_Ready} && ${${ArrayName}[${s},${iIfs}]}) {
                /if (${check_Mana["${ArrayName}",${s}]}) {
                  /call e3_Cast ${buffTargetID} "${ArrayName}" ${s}
                }
              } else /if (${Debug} || ${Debug_BuffCheck}) /echo ${buffSpellName} is not ready for ${buffTarget}
            } else /if (${Debug} || ${Debug_BuffCheck}) /echo buff does not stack, or checkfor buff exists
          } else /if (${Debug} || ${Debug_BuffCheck}) /echo buff or checkfor buff exists in songs
        } else /if (${Debug} || ${Debug_BuffCheck}) /echo buff exists with duration > 30 seconds
      } else {
      |------- Netbots ------|
     
        /if (!${Bool[${NetBots[${buffTarget}].Buff.Find[${buffSpellID} ]}]}    && !${Bool[${NetBots[${buffTarget}].ShortBuff.Find[${buffSpellID} ]}]} && ${NetBots[${buffTarget}].FreeBuffSlots}>0 && ${Bool[${NetBots[${buffTarget}].InZone}]}) {
          /if (!${Bool[${NetBots[${buffTarget}].Buff.Find[${buffCheckForID} ]}]}    && !${Bool[${NetBots[${buffTarget}].ShortBuff.Find[${buffCheckForID} ]}]}) {
           /if (!${Spell[${buffSpellID}].NewStacks}) /goto :skipBuff
           /if (!${${ArrayName}[${s},${iTargetType}].Equal[Single in Group]} || ${Bool[${Group.Member[${buffTarget}]}]}) {
              /call check_Ready "${ArrayName}" ${s}
              /if (${c_Ready} && ${${ArrayName}[${s},${iIfs}]}) {
                /if (${check_Distance[${buffTargetID},${${ArrayName}[${s},${iMyRange}]}]}) {
                  /if (${check_Mana["${ArrayName}",${s}]}) {
                    /call e3_Cast ${buffTargetID} "${ArrayName}" ${s}
                    /delay 3 ${Target.BuffsPopulated}
                    /if (${castReturn.Equal[CAST_SUCCESS]} && !${Bool[${NetBots[${buffTarget}].Buff.Find[${buffSpellID} ]}]}    && !${Bool[${NetBots[${buffTarget}].ShortBuff.Find[${buffSpellID} ]}]}) {
                      /call CreateTimer "nht${Target.ID}-${buffSpellID}" "${noHoldDelay}"
                    }
                  }
                } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~failed check_Distance~    ${buffTargetID} ${${ArrayName}[${s},${iMyRange}]}
              }
            } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~Bot is not in group for groupbuff~
          } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~Bot has checkFoR buff~
        } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~Bot has buff or short buff~
      }
      :skipBuff
      /doevents Follow
      /doevents Stop
      /doevents MoveHere
      /doevents clickit
      /doevents bark
      /doevents BackOff
      /doevents Assist
     /if (!${ActionTaken}) /next s
    /if (${Debug} || ${Debug_BuffCheck}) /echo <== buffBots -|
    /RETURN
    

    ALTERED TO SKIP IF BUFF DOES NOT STACK...


    Code:
    SUB buffBots(ArrayName)
    /if (${Debug} || ${Debug_BuffCheck}) /echo |- buffBots [${ArrayName}] ==>
        /declare s                    int local
        /declare buffTargetID        int local
        /declare buffTarget            string local
        /declare buffSpellID        int local
        /declare buffCheckForID        int local 
        /declare buffSpellName        string local
        /declare buffCheckForName    string local
        /declare currentBuffs        string local
        /declare currentSongs        string local
     /for s 1 to ${${ArrayName}.Size[1]}
        /if (${Debug} || ${Debug_BuffCheck}) /echo buffing ${${ArrayName}[${s},${iCastName}]} on ${${ArrayName}[${s},${iCastTarget}]} checkFor ${${ArrayName}[${s},${iCheckFor}]}
        /if (${Select[${ArrayName},InstantBuffs2D,SelfBuffs2D]}) {
            /varset buffTargetID ${Me.ID}
            /varset buffTarget ${Me.Name}
        } else /if (${Select[${ArrayName},CombatBuffs2D,BotBuffs2D]}) {
            /varset buffTargetID ${Spawn[=${${ArrayName}[${s},${iCastTarget}]}].ID}
            /varset buffTarget ${${ArrayName}[${s},${iCastTarget}]}
        }
        /varset buffSpellName        ${${ArrayName}[${s},${iSpellName}]}
        /varset buffSpellID        ${${ArrayName}[${s},${iSpellID}]}]
        /varset buffCheckForName    ${${ArrayName}[${s},${iCheckFor}]}
        /varset buffCheckForID        ${${ArrayName}[${s},${iCheckForID}]}
      /if (!${Bool[${NetBots[${buffTarget}].ID}]}) /goto :skipBuff
        |/echo ${buffSpellName} ${buffSpellID} ${buffCheckForName} ${buffCheckForID} ${Bool[${NetBots[${buffTarget}].Buff.Find[${buffSpellID} ]}]}
      |/echo ${buffSpellName} ${Select["${buffSpellName}","Thief's Eyes", "Fists of Wu", "Commanding Voice","Cry Havoc"]}
      /if (${Select[${buffSpellID},8001,8002,8000,8003]}) {
        /call meleeCombatBuffs "${ArrayName}" ${s}
        /goto :skipBuff
      }
      |------- Self ------|
      /if (${Select[${ArrayName},SelfBuffs2D,InstantBuffs2D]}) {
        /if (!${Bool[${Me.Buff[${buffSpellName}]}]} || (${Bool[${Me.Buff[${buffSpellName}]}]} && ${Me.Buff[${buffSpellName}].Duration.TotalSeconds} <= ${buffRecastTime})) {
          /if (!${Bool[${Me.Song[${buffSpellName}]}]} && !${Bool[${Me.Song[${buffCheckForName}]}]}) {
         
            | --- Stacking check to bypass buff if it does not stack
            /if (!${Spell[${buffSpellID}].NewStacks}) /goto :skipBuff
            | --- Stacking check to bypass buff if it does not stack
                 
            /if (${Spell[${buffSpellID}].NewStacks} && !${Bool[${Me.Buff[${buffCheckForName}]}]}) {
              /call check_Ready "${ArrayName}" ${s}
              /if (${c_Ready} && ${${ArrayName}[${s},${iIfs}]}) {
                /if (${check_Mana["${ArrayName}",${s}]}) {
                  /call e3_Cast ${buffTargetID} "${ArrayName}" ${s}
                }
              } else /if (${Debug} || ${Debug_BuffCheck}) /echo ${buffSpellName} is not ready for ${buffTarget}
            } else /if (${Debug} || ${Debug_BuffCheck}) /echo buff does not stack, or checkfor buff exists
          } else /if (${Debug} || ${Debug_BuffCheck}) /echo buff or checkfor buff exists in songs
        } else /if (${Debug} || ${Debug_BuffCheck}) /echo buff exists with duration > 30 seconds
      } else {
      |------- Netbots ------|
     
        /if (!${Bool[${NetBots[${buffTarget}].Buff.Find[${buffSpellID} ]}]}    && !${Bool[${NetBots[${buffTarget}].ShortBuff.Find[${buffSpellID} ]}]} && ${NetBots[${buffTarget}].FreeBuffSlots}>0 && ${Bool[${NetBots[${buffTarget}].InZone}]}) {
          /if (!${Bool[${NetBots[${buffTarget}].Buff.Find[${buffCheckForID} ]}]}    && !${Bool[${NetBots[${buffTarget}].ShortBuff.Find[${buffCheckForID} ]}]}) {
         
           | --- Stacking check to bypass buff if it does not stack
           /if (!${Spell[${buffSpellID}].NewStacks}) /goto :skipBuff
           | --- Stacking check to bypass buff if it does not stack
    
           /if (!${Spell[${buffSpellID}].NewStacks}) /goto :skipBuff
           /if (!${${ArrayName}[${s},${iTargetType}].Equal[Single in Group]} || ${Bool[${Group.Member[${buffTarget}]}]}) {
              /call check_Ready "${ArrayName}" ${s}
              /if (${c_Ready} && ${${ArrayName}[${s},${iIfs}]}) {
                /if (${check_Distance[${buffTargetID},${${ArrayName}[${s},${iMyRange}]}]}) {
                  /if (${check_Mana["${ArrayName}",${s}]}) {
                    /call e3_Cast ${buffTargetID} "${ArrayName}" ${s}
                    /delay 3 ${Target.BuffsPopulated}
                    /if (${castReturn.Equal[CAST_SUCCESS]} && !${Bool[${NetBots[${buffTarget}].Buff.Find[${buffSpellID} ]}]}    && !${Bool[${NetBots[${buffTarget}].ShortBuff.Find[${buffSpellID} ]}]}) {
                      /call CreateTimer "nht${Target.ID}-${buffSpellID}" "${noHoldDelay}"
                    }
                  }
                } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~failed check_Distance~    ${buffTargetID} ${${ArrayName}[${s},${iMyRange}]}
              }
            } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~Bot is not in group for groupbuff~
          } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~Bot has checkFoR buff~
        } else /if (${Debug} || ${Debug_BuffCheck}) /echo ~Bot has buff or short buff~
      }
      :skipBuff
      /doevents Follow
      /doevents Stop
      /doevents MoveHere
      /doevents clickit
      /doevents bark
      /doevents BackOff
      /doevents Assist
     /if (!${ActionTaken}) /next s
    /if (${Debug} || ${Debug_BuffCheck}) /echo <== buffBots -|
    /RETURN
    
     
    Last edited: Jul 10, 2023
    • Like Like x 1
  4. gratefuljim73

    gratefuljim73 Orc Pawn

    Messages:
    4
    I've fully tested this change... works nice


    Just required:

    /if (!${Spell[${buffSpellID}].NewStacks}) /goto :skipBuff

    At self and netbot pre-array checks

    HOPEFULLY this can be incorporated into the E3 v7 master that Cream maintains.
     
  5. cream

    cream GM Staff Member

    Messages:
    239
    that same check already exists in the code, how is duplicating the same logic fixing something?