Today i have made a test on Chaos for caster resist, that work so fine
So, auto-learning, configuration and filters function.
So with this, finish the unnecessary cast on NPC, of course.
Actually if you use only a simple macro. This only gives you a glimpse of the funny possibilities.
Needed for implement, add:
-
Event Resist: #Event Resist_Auto_Ban "Your target resisted the #1# spell#*#"
-
Event Sham debuff (need to enable the Analysis): #Event ShmDebuff "[#1#] [Debuff]:#*#>>>#2#:#3#<<<#*#has been debuffed (Shaman)#*#"
-
Cast filter: see for me Resist_Auto_Hold function, need to be implemented in or before your main cast function
- Some utilities function
You found on the capture a part of toons filter configuration file, and the macro function Updated
Code: Select all
Sub Event_Resist_Auto_Ban(line,SpellName)
| Only on NPC target
/if (!${Target.ID} || ${Target.Type.NotEqual[NPC]}) /return FALSE
| Excluse Nuke spell effect
/if ((${SpellName.Find[Strike]} || ${SpellName.Find[Blaze]}) && (${SpellName.Find[Recourse]} || ${SpellName.Find[Feedback]})) /return FALSE
| Only if target is Debuffed (SHM)
/if (${NetWorst.Request[radius300 pc shm101]}) {
/if (!${NPCDebuffList.Find[|${Target.Name}:${Target.ID}|]}) /return
}
| Declare local var
/declare TargetName string local ${Target.CleanName}
/declare TargetID string local ${Target.ID}
/declare ResistTargetName string local
/declare ResistSpellName string local
/declare ResistSpellState string local
/declare iniSave bool local FALSE
| Call string name reformat
/call CleanString "${Target.Name}"
/varset ResistTargetName ${Macro.Return}
/call CleanString "${SpellName}"
/varset ResistSpellName ${Macro.Return}
| Declare global resist var
/if (!${Defined[Resist_${ResistSpellName}]}) /declare Resist_${ResistSpellName} string global
/if (!${Resist_${ResistSpellName}.Length}) {
| Init the first Spell Resist try
/varset Resist_${ResistSpellName} |${ResistTargetName}#${TargetID}#1|
/varset iniSave TRUE
/varset ResistSpellState 1
} else /if (!${Resist_${ResistSpellName}.Find[|${ResistTargetName}#]} && !${Resist_${ResistSpellName}.Find[|${ResistTargetName}:${TargetID}#]}) {
| Set the first Spell Resist try
/varset Resist_${ResistSpellName} ${Resist_${ResistSpellName}}${ResistTargetName}#${TargetID}#1|
/varset iniSave TRUE
/varset ResistSpellState 1
} else /if (${Resist_${ResistSpellName}.Find[|${ResistTargetName}#${TargetID}#1|]}) {
| Set the second Spell Resist try
/call StringReplaceAll "Resist_${ResistSpellName}" "|${ResistTargetName}#${TargetID}#1|" "|${ResistTargetName}#${TargetID}#2|"
/varset iniSave TRUE
/varset ResistSpellState 2
} else /if (${Resist_${ResistSpellName}.Find[|${ResistTargetName}#${TargetID}#2|]}) {
| Hold the Spell Resist (NB without TargetID for maintain all the time)
/call StringReplaceAll "Resist_${ResistSpellName}" "|${ResistTargetName}#${TargetID}#2|" "|${ResistTargetName}#HOLD|"
/varset iniSave TRUE
/varset ResistSpellState HOLD
}
/if (${Defined[Resist_${ResistSpellName}]}) {
/declare i int local
/for i 1 to ${Math.Calc[${Resist_${ResistSpellName}.Count[|]}]}
| Clean the list if NPC is Dead and the Spell not HOLD
/if (${Resist_${ResistSpellName}.Arg[${i},|].Count[#]} == 2 && !${Spawn[id ${Resist_${ResistSpellName}.Arg[${i},|].Arg[2,#]}].ID}) {
/varset iniSave TRUE
/call ListDelbyArg "Resist_${ResistSpellName}" ${i} "|"
}
/next i
| Clear the var if list if empty
/if (${Resist_${ResistSpellName}.Equal[|]} || ${Resist_${ResistSpellName}.Equal[||]}) {
/varset iniSave FALSE
/deletevar Resist_${ResistSpellName}
}
}
/if (${iniSave}) {
| Broadcast and Save to ini
/if (${ResistSpellState.Length}) {
/if (${broadcast}==1) /${broadcastTell} [AutoResist] Change State: <${ResistSpellState}> for cast <${SpellName}> and target [${TargetName}].
/if (${broadcast}==1) /${chat} [AutoResist] Change State: <${ResistSpellState}> for cast <${SpellName}> and target [${TargetName}].
}
/ini "./Bots_Data/Bot_${Me.CleanName}.ini" "ResistSpell" "RESIST_${ResistSpellName}" "${Resist_${ResistSpellName}}"
}
/return
Sub Event_ShmDebuff(line,Sender,TargetName,TargetID)
/if (!${Defined[NPCDebuffList]}) /declare NPCDebuffList string global
/declare DebuffNPCName string local ${Spawn[id ${TargetID}].Name}
/if (!${NPCDebuffList.Length}) {
/varset NPCDebuffList |${DebuffNPCName}:${TargetID}|
} else /if (!${NPCDebuffList.Find[|${DebuffNPCName}:${TargetID}|]}) {
/varset NPCDebuffList ${NPCDebuffList}${DebuffNPCName}:${TargetID}|
}
/declare i int local
/for i 1 to ${Math.Calc[${NPCDebuffList.Count[|]}]}
| Clean the list if NPC is Dead
/if (${NPCDebuffList.Arg[${i},|].Find[:]} && !${Spawn[id ${NPCDebuffList.Arg[${i},|].Arg[2,:]}].ID}) /call ListDelbyArg "NPCDebuffList" ${i} "|"
/next i
| Clear the var if list if empty
/if (${NPCDebuffList.Equal[|]} || ${NPCDebuffList.Equal[||]}) /deletevar NPCDebuffList
/return
Sub Resist_Auto_Hold(ResistTargetName,ResistSpellName,Var)
/if (${Spawn[${ResistTargetName}].Type.NotEqual[NPC]}) /return FALSE
/declare ResistTargetID int local ${Spawn[${ResistTargetName}].ID}
/declare ResistTargetCleanName string local ${Spawn[${ResistTargetName}].CleanName}
/call CleanString "${ResistTargetName}"
/varset ResistTargetName ${Macro.Return}
/call CleanString "${ResistSpellName}"
/varset ResistSpellName ${Macro.Return}
/if (${Defined[Resist_${ResistSpellName}]} && ${Resist_${ResistSpellName}.Find[|${ResistTargetName}#HOLD|]}) {
/if (${Var.Length} && ${Defined[${Var}]}) /varset ${Var} 0
/if (${broadcast}==1) /${broadcastTell} [AutoResist] Skip casting <${ResistSpellName}> on [${ResistTargetCleanName}].
/if (${broadcast}==1) ${broadcastMsg} [AutoResist] Skip casting <${ResistSpellName}> on [${ResistTargetCleanName}].
/return TRUE
}
/if (${Ini[./Bots_Data/Bot_${Me.CleanName}.ini,ResistSpell,RESIST_${ResistSpellName}].Length} && ${Ini[./Bots_Data/Bot_${Me.CleanName}.ini,ResistSpell,RESIST_${ResistSpellName}].Find[|${ResistTargetName}#HOLD|]}) {
/if (!${Defined[Resist_${ResistSpellName}]}) /declare Resist_${ResistSpellName} string global
/varset Resist_${ResistSpellName} ${Ini[./Bots_Data/Bot_${Me.CleanName}.ini,ResistSpell,RESIST_${ResistSpellName}]}
/if (${Var.Length} && ${Defined[${Var}]}) /varset ${Var} 0
/if (${broadcast}==1) /${broadcastTell} [AutoResist] Skip casting <${ResistSpellName}> on [${ResistTargetCleanName}].
/if (${broadcast}==1) ${broadcastMsg} [AutoResist] Skip casting <${ResistSpellName}> on [${ResistTargetCleanName}].
/return TRUE
}
/return FALSE
some utility function need:
Code: Select all
Sub CleanString(Name)
/if (${Name.Find[,]}) {
/if (!${Defined[i]}) /declare i int local
/for i 1 to ${Name.Count[,]}
/varset Name ${Name.Left[${Math.Calc[${Name.Find[,]}-1]}]}${Name.Right[-${Name.Find[,]}]}
/next i
}
/if (${Name.Lower.Find[rk.]}) {
/varset Name ${Name.Left[${Math.Calc[${Name.Find[Rk.]}-1]}]}
}
/varset Name ${Name.Replace[ ,].Replace[',].Replace[.,]}
/return ${Name}
Sub ListReplacebyArg(string sList,string sElement,string sArg,string sDiv)
/if (!${Defined[sDiv]}) /declare sDiv string local |
/varset ${sList} ${sDiv}${${sList}}${sDiv}${sDiv}
/declare sright int local
/declare sleft int local
/declare splaceholder string local ${${sList}}
/varset splaceholder ${splaceholder.Arg[${sArg},${sDiv}]}
/varcalc sleft ${${sList}.Find[${sDiv}${splaceholder}${sDiv}]}
/varset splaceholder ${splaceholder}${sDiv}
/varcalc sright ${sleft}+${splaceholder.Length}
/varset ${sList} ${${sList}.Left[${sleft}]}${sElement}${sDiv}${${sList}.Right[-${sright}]}
/varset ${sList} ${${sList}.Left[-2].Right[-1]}
/if (${DebugList.Find[core]}) /echo List ${${sList}} sElement ${sElement} repladed arg ${sArg}
/return
Sub StringReplaceAll(string sList,string oldElement,string newElement)
/declare i int local
/declare sright int local
/declare sleft int local
/for i 1 to ${${sList}.Length}
/if (${${sList}.Find[${oldElement}]}) {
/varset ${sList} |${${sList}}||
/varcalc sleft ${${sList}.Find[${oldElement}]}-1
/varcalc sright ${sleft}+${oldElement.Length}
/varset ${sList} ${${sList}.Left[${sleft}]}${newElement}${${sList}.Right[-${sright}]}
/varset ${sList} ${${sList}.Left[-2].Right[-1]}
} else {
/if (${DebugList.Find[core]}) /echo List ${${sList}} oldElement ${oldElement} replaced newElement ${newElement}
/return
}
/next i
/echo Error in StringReplaceAll
/return