Spells Attacker
Description
Attacks monsters with areas, waves, beams or support spells.
Configuration
Add monsters names on the Monsters variable to consider those monsters on the spells areas, an empty list will use on any monster.
Set Players.Consider to true if you are playing on PvP worlds, this option will avoid using spells when there are players near, set false to ignore this option.
If you have set Players.Consider to true, edit the minimum distance to consider them by changing the Distance parameter. To consider floors up and down use the FloorDifference parameter. Optionally you can add friends on the SafeList so the attacker will ignore them.
For each spell entry you can input the Name. Set Amount if you want to cast on a specific amount of creatures around the spell or Hppc, if you want to shoot on a specific target until it have less than the health percent previously set.
For the SpecialAreas you can input areas where you don't want to cast spell, such as near stairs, holes. The default entry is x-axis¹, x-axis², y-axis¹, y-axis² and z-axis.
If you want to use this script only when Targeting engine is enabled then set UseTargetState to true, if you want to use it all the time set it to false.
Code
init start
local Monsters = {"Swampling", "Snake", "Marsh Stalker", "Water Buffalo", "Salamander", "Emerald Damselfly"}
local Players = {
Consider = true,
Distance = 10,
FloorDifference = 1,
SafeList = {"Bubble", "Eternal Oblivion"},
}
local Spells = {
{Name = "exori gran", Amount = 4},
{Name = "exori", Amount = 3},
{Name = "exori min", Amount = 2},
{Name = "exori ico", Hppc = 10},
{Name = "exori hur", Hppc = 10},
{Name = "utito tempo", Amount = 5},
}
local SpecialAreas = {
-- {min x, max x, min y, max y, z}
}
local UseTargetState = false
-- DO NOT CHANGE ANYTHING BELOW THIS LINE
local i, LastFloor, Exhaust = 1, $posz, $timems
while Spells[i] ~= nil do
Spells[i].Info = spellinfo(Spells[i].Name)
if Spells[i].Info.words == 0 then
table.remove(Spells, i)
else
Spells[i].Monsters = Spells[i].Monsters or Monsters
Spells[i].NeedDirection = table.find({"WaveSmall", "WaveMedium", "WaveVerySmall", "WaveBig", "BeamSmall", "BeamBig", "Front", "Strike"}, Spells[i].Info.castarea) ~= nil
Spells[i].AttackSupport = Spells[i].Info.group:match("Support") ~= nil
table.lower(Spells[i].Monsters)
i = i + 1
end
end
init end
auto(200, 400)
if $posz ~= LastFloor then
LastFloor, Exhaust = $posz, $timems + 2000
return
end
if $timems >= Exhaust and ($targeting or not UseTargetState) then
for _, Spell in ipairs(Spells) do
if cancast(Spell.Info) and not isinsidearea(SpecialAreas) then
if Spell.Amount and (not Players.Consider or paroundfloorignore(Players.Distance, Players.FloorDifference, unpack(Players.SafeList)) == 0) then
local BestAmount, BestDir = 0, $self.dir
if Spell.NeedDirection then
for Dir, Amount in pairs({n = 0, e = 0, s = 0, w = 0}) do
Amount = maroundspell(Spell.Name, Dir, unpack(Spell.Monsters))
if Amount > BestAmount or (Amount >= BestAmount and Dir == $self.dir) then
BestAmount, BestDir = Amount, Dir
end
end
else
BestAmount = not Spell.AttackSupport and maroundspell(Spell.Name, BestDir, unpack(Spell.Monsters)) or maround(1, false, unpack(Spell.Monsters))
end
if BestAmount >= math.max(Spell.Amount, 1) then
while $self.dir ~= BestDir do
turn(BestDir) waitping()
end
cast(Spell.Name) waitping()
end
elseif Spell.Hppc and $attacked.hppc >= math.max(Spell.Hppc, 1) and table.find(Spell.Monsters, $attacked.name:lower()) and cancast(Spell.Info, $attacked) then
cast(Spell.Name) waitping()
end
end
end
end
Download