Ir para conteúdo

[Arquivado][Systems] Bombermana


hsz

Posts Recomendados

script retirado de : http://otland.net/f81/bomberman-73864/

PRESISO DE AJUDA PRA MONTAR O MAP DAI EU POSTO PARA VOCÊ.

 

talkactions.xml

<talkaction words="z;Z" event="script" value="bomb.lua"/>

 

BOMB.lua

function getPlayersInRange(position, radiusx, radiusy)
local creaturesList = {}
for x = -radiusx, radiusx do
	for y = -radiusy, radiusy do
		if not (x == 0 and y == 0) then
			local creature = getTopCreature({x = position.x+x, y = position.y+y, z = position.z})
			if creature.type == 1 then
				table.insert(creaturesList, creature.uid)
			end
		end
	end
end

local creature = getTopCreature(position)
if creature.type == 1 then
	if not(table.find(creaturesList, creature.uid)) then
		table.insert(creaturesList, creature.uid)
	end
end
   return creaturesList
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=490, y=495, z=9},
to = {x=504, y=505, z=9},
storage = {
	placed = 10001,
	max = 10002,
	radius = 10003
},
delay = 3000,
bombID = 10570,
effect = CONST_ME_FIREAREA,
blockID = 9468,
text = "BOOM!",
temple = {x=498, y=541, z=9},
exceptions = {
	{x=490, y=495, z=9},
	{x=491, y=495, z=9},
	{x=490, y=496, z=9},

	{x=503, y=495, z=9},
	{x=504, y=495, z=9},
	{x=504, y=496, z=9},

	{x=490, y=505, z=9},
	{x=491, y=505, z=9},
	{x=490, y=504, z=9},

	{x=503, y=505, z=9},
	{x=504, y=505, z=9},
	{x=504, y=504, z=9}
}
}
function reset()
local dummy = doCreateItem(10570, 1, {x=486,y=498,z=9})
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, 8304).uid, getTileItemById(pos, 8306).uid, getTileItemById(pos, 8310).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=497, y=500, z=9}, 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 8304 or r==2 and 8306 or r==3 and 8310, 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=497, y=500, z=9}, 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 8304 or r==2 and 8306 or r==3 and 8310, 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

 

 

lever.lua

function getPlayersInRange(position, radiusx, radiusy)
local creaturesList = {}
for x = -radiusx, radiusx do
	for y = -radiusy, radiusy do
		if not (x == 0 and y == 0) then
			local creature = getTopCreature({x = position.x+x, y = position.y+y, z = position.z})
			if creature.type == 1 then
				table.insert(creaturesList, creature.uid)
			end
		end
	end
end

local creature = getTopCreature(position)
if creature.type == 1 then
	if not(table.find(creaturesList, creature.uid)) then
		table.insert(creaturesList, creature.uid)
	end
end
   return creaturesList
end

local t, n, storage = {
{x=496, y=537, z=9},
{x=497, y=537, z=9},
{x=498, y=537, z=9},
{x=499, y=537, z=9}
}, {
{x=490, y=495, z=9},
{x=504, y=505, z=9},
{x=504, y=495, z=9},
{x=490, y=505, z=9}
}, {
placed = 10001,
max = 10002,
radius = 10003
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
if item.itemid == 1946 then
	return doTransformItem(item.uid, item.itemid - 1)
end

local v = getPlayersInRange({x=497, y=500, z=9}, 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

 

 

Items.xml

 

 

	<item id="2195" name="boots of haste">
	<attribute key="weight" value="750" />
	<attribute key="slotType" value="feet" />
	<attribute key="speed" value="40" />
	<attribute key="showattributes" value="1" />
	<attribute key="showduration" value="1" />
	<attribute key="decayTo" value="0" />
	<attribute key="duration" value="30" />
</item>
...
<item id="8304" name="eternal flames">
	<attribute key="moveable" value="0" />
</item>
...
<item id="8306" name="pure energy">
	<attribute key="moveable" value="0" />
</item>
...
<item id="8310" name="neutral matter">
	<attribute key="moveable" value="0" />
</item>
...
<item id="10570" article="a" name="war crystal">
	<attribute key="moveable" value="0" />
</item>

 

movements.xml

	<movevent type="StepIn" itemid="10764" event="script" value="bombtiles.lua"/>
<movevent type="AddItem" itemid="10764" tileitem="1" event="script" value="bombtiles.lua"/>
<movevent type="StepIn" itemid="8304" event="script" value="powerups.lua"/>
<movevent type="StepIn" itemid="8306" event="script" value="powerups.lua"/>
<movevent type="StepIn" itemid="8310" event="script" value="powerups.lua"/>

 

bombtiles.lua

 

 

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

function onAddItem(moveItem, tileItem, position, cid)
if not isInArray({8304, 8306, 8310, 9468, 10570}, moveItem.itemid) then
	doRemoveItem(moveItem.uid)
end
end

 

powerups.lua

 

local t = {
from = {x=490, y=495, z=9},
to = {x=504, y=505, z=9},
storage = {
	max = 10002,
	radius = 10003
}
}
function onStepIn(cid, item, pos, fromPos)
if isInRange(pos, t.from, t.to) then
	if item.itemid == 8304 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 == 8306 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 == 8310 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

Editado por hsz
Link para o comentário
Compartilhar em outros sites

  • 7 years later...
Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...