no i just double checked. i did use your improved getPlayersInRange if that matters
Code:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Bomberman" version="1.0" author="Cykotitan" enabled="yes">
<!--planting bombs-->
<talkaction words="z;Z" event="script"><![CDATA[
function getPlayersInRange(pos, rX, rY)
local ret = {}
for x = -rX, rX do
for y = -rY, rY do
local v = getTopCreature({x = pos.x+x, y = pos.y+y, z = pos.z}).uid
if isPlayer(v) == TRUE then
table.insert(ret, v)
end
end
end
return ret
end
function isPositionInArray(haystack, needle)
for i = 1, #haystack do
if haystack[i].x == needle.x and haystack[i].y == needle.y and haystack[i].z == needle.z then
return true
end
end
return false
end
local t = {
from = {x=397, y1252, z=7},
to = {x=411, y=1262, z=7},
storage = {
placed = 7315,
max = 4851,
radius = 7281
},
delay = 3000,
bombID = 10570,
effect = CONST_ME_FIREAREA,
blockID = 9468,
text = "BOOM!",
temple = {x=161, y=389, z=7},
exceptions = {
{x=397, y=1252, z=7},
{x=397, y=1253, z=7},
{x=398, y=1252, z=7},
{x=397, y=1261, z=7},
{x=397, y=1262, z=7},
{x=398, y=1262, z=7},
{x=410, y=1252, z=7},
{x=411, y=1252, z=7},
{x=411, y=1253, z=7},
{x=410, y=1262, z=7},
{x=411, y=1261, z=7},
{x=411, y=1262, z=7}
}
}
function reset()
local dummy = doCreateItem(10570, 1, {x=486,y=498,z=7})
for x = t.from.x, t.to.x do
for y = t.from.y, t.to.y do
local pos = {x=x,y=y,z=t.from.z}
local i1, i2, i3 = getTileItemById(pos, 4851).uid, getTileItemById(pos, 7281).uid, getTileItemById(pos, 7315).uid
if i1 > 0 then
doRemoveItem(i1)
end
if i2 > 0 then
doRemoveItem(i2)
end
if i3 > 0 then
doRemoveItem(i3)
end
if queryTileAddThing(dummy, pos, 4) == RETURNVALUE_NOERROR and not isPositionInArray(t.exceptions, pos) then
doCreateItem(t.blockID, 1, pos)
end
end
end
doRemoveItem(dummy)
end
local function boom(pos, cid)
local v = getTileItemById(pos, t.bombID).uid
if isPlayer(cid) and isInRange(getThingPos(cid), t.from, t.to) then
setPlayerStorageValue(cid, t.storage.placed, getPlayerStorageValue(cid, t.storage.placed) - 1)
doCreatureSay(cid, t.text, TALKTYPE_ORANGE_2, false, nil, pos)
doSendMagicEffect(pos, t.effect)
local c = getTopCreature(pos).uid
if isPlayer(c) and isInRange(getThingPos(c), t.from, t.to) then
doSendMagicEffect(pos, CONST_ME_GIFT_WRAPS)
doTeleportThing(c, t.temple)
doSendMagicEffect(t.temple, CONST_ME_MORTAREA)
local n1, n2 = getPlayerName(c), getPlayerName(cid)
doBroadcastMessage(n1==n2 and n1 .. " killed " .. (getPlayerSex(c) == 0 and "her" or "him") .. "self!" or n1 .. " was killed by " .. n2 .. "!", MESSAGE_STATUS_WARNING)
local a = getPlayersInRange({x=404, y=1257, z=7}, 7, 5)
if #a < 2 then
doBroadcastMessage(getPlayerName(a[1]) .. " has won the match!", MESSAGE_STATUS_WARNING)
doPlayerAddLevel(a[1], 1)
doTeleportThing(a[1], t.temple)
doSendMagicEffect(t.temple, CONST_ME_FIREWORK_RED)
reset()
reset()
end
else
local b = getTileItemById(pos, t.blockID).uid
if b > 0 then
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
doRemoveItem(b)
local r = math.random(10)
if r < 4 then
doCreateItem(r==1 and 4851 or r==2 and 7281 or r==3 and 7315, 1, _pos)
end
end
end
local N, E, W, S, l = 1, 1, 1, 1, getPlayerStorageValue(cid, t.storage.radius)
function loopDir(dir)
local _pos = {x=pos.x+(dir=="E" and E or dir=="W" and -W or 0), y=pos.y+(dir=="N" and -N or dir=="S" and S or 0), z=pos.z}
if queryTileAddThing(v, _pos, 4) == RETURNVALUE_NOERROR or getTileItemById(_pos, t.blockID).uid > 0 then
doSendMagicEffect(_pos, t.effect)
local c = getTopCreature(_pos).uid
if isPlayer(c) and isInRange(getThingPos(c), t.from, t.to) then
doSendMagicEffect(_pos, CONST_ME_GIFT_WRAPS)
doTeleportThing(c, t.temple)
doSendMagicEffect(t.temple, CONST_ME_MORTAREA)
local n1, n2 = getPlayerName(c), getPlayerName(cid)
doBroadcastMessage(n1==n2 and n1 .. " killed " .. (getPlayerSex(c) == 0 and "her" or "him") .. "self!" or n1 .. " was killed by " .. n2 .. "!", MESSAGE_STATUS_WARNING)
local a = getPlayersInRange({x=404, y=1257, z=7}, 7, 5)
if #a < 2 then
doBroadcastMessage(getPlayerName(a[1]) .. " has won the match!", MESSAGE_STATUS_WARNING)
doPlayerAddLevel(a[1], 1)
doTeleportThing(a[1], t.temple)
doSendMagicEffect(t.temple, CONST_ME_FIREWORK_RED)
reset()
reset()
return "endgame"
end
else
local b = getTileItemById(_pos, t.blockID).uid
if b > 0 then
doSendMagicEffect(_pos, CONST_ME_BLOCKHIT)
doRemoveItem(b)
local r = math.random(10)
if r < 4 then
doCreateItem(r==1 and 4851 or r==2 and 7281 or r==3 and 7315, 1, _pos)
end
return false
end
end
elseif queryTileAddThing(v, _pos, 4) == 3 then
return false
end
return true
end
while N <= l do
local q = loopDir("N")
if q == "endgame" then
return doRemoveItem(v, 1)
elseif not q then
break
else
N = N + 1
end
end
while E <= l do
local q = loopDir("E")
if q == "endgame" then
return doRemoveItem(v, 1)
elseif not q then
break
else
E = E + 1
end
end
while W <= l do
local q = loopDir("W")
if q == "endgame" then
return doRemoveItem(v, 1)
elseif not q then
break
else
W = W + 1
end
end
while S <= l do
local q = loopDir("S")
if q == "endgame" then
return doRemoveItem(v, 1)
elseif not q then
break
else
S = S + 1
end
end
end
doRemoveItem(v, 1)
end
function onSay(cid, words, param, channel)
if isInRange(getThingPos(cid), t.from, t.to) then
setPlayerStorageValue(cid, t.storage.placed, math.max(getPlayerStorageValue(cid, t.storage.placed), 0))
setPlayerStorageValue(cid, t.storage.max, math.max(getPlayerStorageValue(cid, t.storage.max), 1))
setPlayerStorageValue(cid, t.storage.radius, math.max(getPlayerStorageValue(cid, t.storage.radius), 1))
if getPlayerStorageValue(cid, t.storage.placed) < getPlayerStorageValue(cid, t.storage.max) then
doCreateItem(t.bombID, 1, getThingPos(cid))
addEvent(boom, t.delay, getThingPos(cid), cid)
setPlayerStorageValue(cid, t.storage.placed, getPlayerStorageValue(cid, t.storage.placed) + 1)
end
return true
end
end
]]></talkaction>
<!-- lever -->
<action uniqueid="20109" event="script"><![CDATA[
function getPlayersInRange(pos, rX, rY)
local ret = {}
for x = -rX, rX do
for y = -rY, rY do
local v = getTopCreature({x = pos.x+x, y = pos.y+y, z = pos.z}).uid
if isPlayer(v) == TRUE then
table.insert(ret, v)
end
end
end
return ret
end
local t, n, storage = {
{x=402, y=1266, z=7},
{x=403, y=1266, z=7},
{x=405, y=1266, z=7},
{x=406, y=1266, z=7}
}, {
{x=397, y=1252, z=7},
{x=397, y=1262, z=7},
{x=411, y=1252, z=7},
{x=411, y=1262, z=7}
}, {
placed = 7315,
max = 4851,
radius = 7281
}
function onUse(cid, item, fromPosition, itemEx, toPosition)
if item.itemid == 1946 then
return doTransformItem(item.uid, item.itemid - 1)
end
local v = getPlayersInRange({x=404, y=1257, z=7}, 7, 5)
if #v > 0 then
return doPlayerSendCancel(cid, "Please wait for the current match to end.")
end
local players = {}
for i = 1, #t do
local v = getTopCreature(t[i]).uid
players[i] = isPlayer(v) and v or nil
end
if #players < 2 then
return doPlayerSendCancel(cid, "You need at least 2 players to enter.")
end
local first = players[1] and 1 or players[2] and 2 or players[3] and 3 or players[4] and 4
for i = 1, 4 do
if players[i] then
setPlayerStorageValue(players[i], storage.placed, 0)
setPlayerStorageValue(players[i], storage.max, 1)
setPlayerStorageValue(players[i], storage.radius, 1)
doSendMagicEffect(t[i], CONST_ME_TELEPORT)
doTeleportThing(players[i], n[i])
doSendMagicEffect(n[i], CONST_ME_TELEPORT)
end
end
doTransformItem(item.uid, item.itemid + 1)
return true
end
]]></action>
<!--power ups-->
<movement type="StepIn" itemid="4851;7281;7315" event="script"><![CDATA[
local t = {
from = {x=397, y1252, z=7},
to = {x=411, y=1262, z=7},
storage = {
max = 4851,
radius = 7281
}
}
function onStepIn(cid, item, pos, fromPos)
if isInRange(pos, t.from, t.to) then
if item.itemid == 4851 then
local n = getPlayerStorageValue(cid, t.storage.max)
if n < 3 then
setPlayerStorageValue(cid, t.storage.max, n + 1)
doRemoveItem(item.uid)
doSendMagicEffect(pos, CONST_ME_FIREATTACK)
end
elseif item.itemid == 7281 then
local n = getPlayerSlotItem(cid, CONST_SLOT_FEET)
if n.itemid ~= 2195 then
doPlayerAddItem(cid, 2050, 1)
doPlayerAddItem(cid, 2050, 1)
doPlayerAddItem(cid, 2050, 1)
doDecayItem(doPlayerAddItem(cid, 2195, 1))
doPlayerRemoveItem(cid, 2050, 1)
doPlayerRemoveItem(cid, 2050, 1)
doPlayerRemoveItem(cid, 2050, 1)
doRemoveItem(item.uid)
doSendMagicEffect(pos, CONST_ME_ENERGYHIT)
end
elseif item.itemid == 7315 then
local n = getPlayerStorageValue(cid, t.storage.radius)
if n < 4 then
setPlayerStorageValue(cid, t.storage.radius, n + 1)
doRemoveItem(item.uid)
doSendMagicEffect(pos, CONST_ME_GROUNDSHAKER)
end
end
end
end
]]></movement>
<!--bomb tiles-->
<movement type="AddItem" itemid="10764" tileitem="1" event="script"><![CDATA[
function onStepIn(cid, item, pos, fromPos)
if math.abs(pos.x - fromPos.x) == math.abs(pos.y - fromPos.y) then
if item.actionid == 100 then
doItemSetAttribute(item.uid, "aid", 0)
else
doItemSetAttribute(getTileItemById(fromPos, 10764).uid, "aid", 100)
doTeleportThing(cid, fromPos, false)
end
end
end
]]></movement>
</mod>