Fiz por direção, basta configurar a tabela "dirPref" e ver quais direções você quer dar prioridade pra sumonar:
local delay = {}
function onUse(cid, item, frompos, item2, topos)
local maxSummons = 8 -- máximo de summons permitidos por player
local timeForReuse = 5 -- segundos para usar novamente
local cost = 1500 -- gold para sumonar
local dirPref = {NORTHWEST, SOUTHEAST, NORTHEAST, SOUTHWEST, NORTH, SOUTH, EAST, WEST}
local monsters = { -- tabela com monstros, e a quantidade que vai sumonar
["Rat"] = 3,
["Tiger"] = 2,
}
if delay[0] and delay[0] - os.time() > 0 then
return doPlayerSendCancel(cid, "Espere "..(delay[0] - os.time()).." segundos para puxar a alavanca novamente.")
end
local monsterCount = 0
local guid = getPlayerGUID(cid)
if delay[guid] then
for _, mid in pairs(delay[guid]) do
if isCreature(mid) then
monsterCount = monsterCount + 1
else
delay[guid][_] = nil
end
end
else
delay[guid] = {}
end
if monsterCount >= maxSummons then
return doPlayerSendCancel(cid, "Há muitos monstros sumonados por você, mate-os primeiro!")
end
if not doPlayerRemoveMoney(cid, cost) then
return doPlayerSendCancel(cid, "Você não tem dinheiro suficiente para pagar!")
end
delay[0] = os.time() + timeForReuse
monsterCount = 0
local dir = 1
for monsterName, number in pairs(monsters) do
for _ = 1, number do
local range = 1
local pos = getPosByDir(getThingPos(cid), dirPref[dir], range)
local loops = 0
while doTileQueryAdd(cid, pos, 0, false) ~= 1 and loops <= #dirPref * 2 do
dir = (dir + 1) > #dirPref and 1 or dir + 1
if dir == 1 then
range = range + 1
end
pos = getPosByDir(getThingPos(cid), dirPref[dir], range)
loops = loops + 1
end
if doTileQueryAdd(cid, pos, 0, false) ~= 1 then
pos = getClosestFreeTile(cid, getThingPos(cid), true)
end
local newMonster = doCreateMonster(monsterName, pos, false)
if isCreature(newMonster) then
monsterCount = monsterCount + 1
table.insert(delay[guid], newMonster)
doSendMagicEffect(getThingPos(newMonster), CONST_ME_TELEPORT)
if monsterCount >= maxSummons then
return true
end
end
end
end
return true
end