• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TalkAction Bomberman

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>
 
The game starts.. every one plays etc.. but when I kill the 3 players i still am in the bomb arena.. the barrels nor game will reset :s
 
I have a question about the file called lever.lua
i have understand its is a action script but what would i write in actions.xml
 
you can register it with actionid or uniqueid, look at other examples in your actions.xml and copy the line.
 
Only problem I got that if anyone uses that Area+ Thingy, it will go through the walls.
 
@Cykotitan

Could you make a new thread with all bugs and ect fixed and so it can be used on TFS 0.3.6 too :p
 
it can be used in 0.3.6 (it was designed on 0.3.6, in fact). but theres some problems in 0.4.
i was going to release a v2.0 either way but i couldn't find time to finish the final touches
 
[Warning - Event::loadScript] Event onSay not found (data/talkactions/scripts/bomb.lua)
HELP
 
Help Cyko Last player standing didn't teleported to temple and makes bugs in my server log when he still in the event Really need Help!!
 
Last edited:
Back
Top