Ir para conteúdo
Entre para seguir isso  
Dark

Mutant Arena

Recommended Posts

Dark    3
Dark

uloq.jpg

 

Nome Mutant Arena

Autor Dark

Testado TFS 8.6

 

Depois de um longo tempo desde meu ultimo tópico aqui no fórum (mais ou menos 3 anos :think:) voltei para trazer um script que fiz esses dias em casa.

 

Há muito tempo postei na área VIP do fórum (na época que ainda ela cavaleiro) um script de uma arena um pouco diferente da comum, porém perdi os scripts que estavam no meu PC inclusive esse e por isso refiz ele do zero para ver se ainda lembrava algo de LUA :)

 

A ideia do script é simples. Porque as Arenas tem que se restringir apenas à um quadrado onde você luta com o monstro? Que tal se você fosse levado para lutar com a criatura em seu próprio habitat?

 

É Exatamente isso que o script faz. Para cada monstro da arena você pode definir um habitat para, o player e o monstro, lutarem

:pega-el:

 

fotosd.png

 

 

Vamos começar ;)

 

 

 

~~ Criando a Arena e os Cenários ~~

 

A primeira coisa que devemos fazer é montar a arena seguindo o seguinte modelo

 

plantaia.png

 

Ela deve ter um piso do lado de fora (para entrar na arena), um piso do lado de dentro (para que o player possa desistir, ou caso ja tenha matado o monstro, ir para o próximo round) e um local com tamanho 1x1 (para ficar o item que marcará o tempo - podendo ser qualquer um, nas imagens acima usei um fire field amarelo).

 

Lembrando que a área principal da arena deve ficar vazia (pois é nela que aparecerá o cenário), qualquer coisa dentro da área principal será deletado.

 

Os pisos devem ter um determinado ActionId (No piso para entrar eu usei 12000 e o para desistir/avançar round eu coloquei 12001).

 

 

Agora vamos montar os habitats ou cenários.

 

Um cenário não é nada mais que uma área do seu mapa (de preferencia em um lugar longe dos olhos dos players) do tamanho da área principal da arena.

 

plantacenario.png

 

Esse pedaço do mapa será copiado para dentro da arena!!

 

Você pode montar quantos cenários você quiser, desde florestas até construções (nessa versão do script ele copia apenas o que estiver no z=7)

 

 

Feito isso é hora de instalar o script no server

 

 

~~ Instalando o script ~~

 

Instalar é bem simples!!

 

Vá até a pasta data/movements e abra o arquivo movements.xml e coloque isso lá dentro:

 

	
<movevent type="StepIn" actionid="12000" event="script" value="mutantArena.lua"/>
<movevent type="StepIn" actionid="12001" event="script" value="mutantArena.lua"/>

 

 

Lembrando que o ActionId 12000 é o do piso de entrada e o ActionId 12001 é o do piso de escape/avançar round

 

Agora vá até data/movements/scripts copie qualquer arquivo de la e renomeie para mutantArena.lua. Abra o arquivo, apague tudo o que estiver dentro e coloque isso:

 

----------------------------------------
-- Mutant Arena (v 0.1) - BETA
-- Develop By: Dark (OTBr)
-- www.otserv.com.br
----------------------------------------


-- Configurações Básicas do Sistema!!! --

CONFIG = {

iArena = {x=146,y=24,z=7},
fArena = {x=158,y=34,z=7},

storageLevel = 12004,
storageMonster = 12005,

posTeleporte = {x = 153, y=29, z=7},
posSaida = {x=160, y=31, z=7},

tempoRound = 20,
posItem = {x = 152, y=23, z=7},
itemTempo = {1500,1501,1502}

}


-- Leveis da Arena
LEVEL = {

[1] = {
	{monstro = "dwarf guard", cenario = "cave", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "cyclops", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "water elemental", cenario = "agua", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "orc shaman", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "giant spider", cenario = "deserto", magic = 10, pos={x=147,y=30,z=7}},
},

}

-- Cenarios
CENARIO = {

floresta = {
	i = {x=168,y=25,z=7},
	f = {x=180,y=35,z=7},
	m = 44
},

agua = {
	i = {x=168,y=38,z=7},
	f = {x=180,y=48,z=7},
	m = 53
},	

deserto = {
	i = {x=183,y=38,z=7},
	f = {x=195,y=48,z=7},
	m = 2
},

cave = {
	i = {x=183,y=25,z=7},
	f = {x=195,y=35,z=7},
	m = 38
},	

}
--------------------------------------------------

eventID = nil;

function onStepIn(cid, item, pos, fpos)

level = getPlayerStorageValue(cid, CONFIG.storageLevel)
if(level <= 0) then 
	setPlayerStorageValue(cid, CONFIG.storageLevel, 1) 
	level = 1
end
stopEvent(eventID)

if(item.actionid == 12000) then
	if(not havePlayer()) then
		if(LEVEL[level] ~= nil) then
			resetArena()
			setPlayerStorageValue(cid, CONFIG.storageMonster, 1)
			round = getPlayerStorageValue(cid, CONFIG.storageMonster)

			doTeleportThing(cid, CONFIG.posTeleporte)
			iniciarPartida(level, round)
		else
			doSendMagicEffect(pos, 2)
			doPlayerSendTextMessage(cid, 22, "Não há mais desafios para você aqui")
		end
	else
		doSendMagicEffect(pos, 2)
		doPlayerSendTextMessage(cid, 22, "Há um jogador na arena! Aguarde a sua vez")
	end		
else
	if(arenaIsEmpty()) then
		round = getPlayerStorageValue(cid, CONFIG.storageMonster)
		if(round < #LEVEL[level]) then
			setPlayerStorageValue(cid, CONFIG.storageMonster, round+1)
			resetArena()
			doTeleportThing(cid, CONFIG.posTeleporte)
			iniciarPartida(level, round+1)
		else
			doTeleportThing(cid, CONFIG.posSaida)
			setPlayerStorageValue(cid, CONFIG.storageLevel, level+1)
			doPlayerSendTextMessage(cid, 22, "GANHOU")
			resetArena()
		end

	else
		doSendMagicEffect(pos, 2)
		doTeleportThing(cid, CONFIG.posSaida, true)
		doSendMagicEffect(CONFIG.posSaida, 20)
		doSetMonsterOutfit(cid, "chicken", 5*60*1000)
		resetArena()
	end		
end


end

function havePlayer()
for w = 0, (CONFIG.fArena.x-CONFIG.iArena.x) do
	for z = 0, (CONFIG.fArena.y-CONFIG.iArena.y) do

		-- Verifica se há Player
		posArena = {x=CONFIG.iArena.x+w, y=CONFIG.iArena.y+z, z=7, stackpos=253}
		itemTemp = getThingFromPos(posArena)
		if(isPlayer(itemTemp.uid)) then return true end

	end
end
return false
end

function arenaIsEmpty()
for w = 0, (CONFIG.fArena.x-CONFIG.iArena.x) do
	for z = 0, (CONFIG.fArena.y-CONFIG.iArena.y) do
		-- Verifica se há Criaturas
		posArena = {x=CONFIG.iArena.x+w, y=CONFIG.iArena.y+z, z=7, stackpos=253}
		itemTemp = getThingFromPos(posArena)
		if(isCreature(itemTemp.uid)) then return false end
	end
end
return true
end

function iniciarPartida(lvl,round)

carregaCenario(LEVEL[lvl][round].cenario)

doSummonCreature(LEVEL[lvl][round].monstro, LEVEL[lvl][round].pos)
doSendMagicEffect(LEVEL[lvl][round].pos, LEVEL[lvl][round].magic)

mudarTempo(1)

end



function mudarTempo(estagio)

if(estagio <= #CONFIG.itemTempo) then

	posItem = CONFIG.posItem
	posItem.stackpos = 1
	itemT = getThingFromPos(posItem)
	if(itemT.uid ~= 0) then doRemoveItem(itemT.uid) end
	doCreateItem(CONFIG.itemTempo[estagio], 1, posItem)
	newTime = (CONFIG.tempoRound*1000) / #CONFIG.itemTempo
	eventID = addEvent(mudarTempo, newTime, estagio+1)

else
	resetArena()
end

end

function carregaCenario(cenario)

arrayCenario = CENARIO[cenario];

-- Copia Cenário
for w = 0, (CONFIG.fArena.x-CONFIG.iArena.x) do
	for z = 0, (CONFIG.fArena.y-CONFIG.iArena.y) do

		posCenario = {x=arrayCenario.i.x+w, y=arrayCenario.i.y+z, z=7, stackpos=0}
		posArena = {x=CONFIG.iArena.x+w, y=CONFIG.iArena.y+z, z=7, stackpos=0}

		cenarioTemp = getThingFromPos(posCenario)
		doCreateItem(cenarioTemp.itemid, 1, posArena)

		for s = 3, 1, -1 do
			posCenario.stackpos = s
			cenarioTemp = getThingFromPos(posCenario)
			if(cenarioTemp.itemid ~= 0) then doCreateItem(cenarioTemp.itemid, 1, posArena) end
		end
		doSendMagicEffect(posArena, arrayCenario.m)
	end
end

end

function resetArena()

for w = 0, (CONFIG.fArena.x-CONFIG.iArena.x) do
	for z = 0, (CONFIG.fArena.y-CONFIG.iArena.y) do

		--Coloca Piso
		posArena = {x=CONFIG.iArena.x+w, y=CONFIG.iArena.y+z, z=7, stackpos=0}
		doCreateItem(413, 1, posArena)

		-- Remove Criaturas
		posArena.stackpos = 253
		itemTemp = getThingFromPos(posArena)
		if(isCreature(itemTemp.uid) and not(isPlayer(itemTemp.uid))) then doRemoveCreature(itemTemp.uid) end
		if(isPlayer(itemTemp.uid)) then doTeleportThing(itemTemp.uid, CONFIG.posSaida, true) end

		-- Remove Itens
		for s = 3, 1, -1 do
			posArena.stackpos = s
			itemTemp = getThingFromPos(posArena)
			if(itemTemp.itemid ~= 0) then doRemoveItem(itemTemp.uid) end
		end

	end
end
end

 

Pronto, salve e feche! Agora vamos aprender a configura-lo

 

~~ Configurando o script ~~

 

 

As primeiras coisas que temos que configurar no Script é:

 

CONFIG = {

iArena = {x=146,y=24,z=7},
fArena = {x=158,y=34,z=7},

storageLevel = 12004,
storageMonster = 12005,

posTeleporte = {x = 153, y=29, z=7},
posSaida = {x=160, y=31, z=7},

tempoRound = 20,
posItem = {x = 152, y=23, z=7},
itemTempo = {1500,1501,1502}

}

 

iArena - Posição do primeiro SQM da área principal da Arena (canto esquerdo superior

 

fArena - Posição do último SQM da área principal da Arena (canto direito inferior)

 

StorageLevel - Storage value que será salvo o level da arena atual do usuário

 

StorageMonster - Storage value que será usado para salvar o round atual do usuário (é resetado toda vez que entra na arena)

 

posTeleporte - Posição para a qual o player será teleportado ao entrar na arena (uma posição dentro da arena)

 

posSaida - Posição para o qual o player será teleportado ao sair ou vencer a arena

 

tempoRound - Tempo (em segundos) que durará cada round (após o tempo o player é teleportado para fora)

 

posItem - Posição do local onde ficará o item que representará o tempo

 

itemTempo - Itens que representarão o tempo. Nesse exemplo está sendo usado o fire fileld amarelo (1500, 1501, 1502)

 

Como há três itens o tempo será dividido por 3 (A cada 6 Segundos o item muda para o próximo da lista).

 

Exemplo:

 

expulso.png

 

 

Após isso vamos configurar os leveis

 

LEVEL = {

[1] = {
	{monstro = "dwarf guard", cenario = "cave", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "cyclops", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "water elemental", cenario = "agua", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "orc shaman", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "giant spider", cenario = "deserto", magic = 10, pos={x=147,y=30,z=7}},
},

}

 

 

[x]={} - Cada Level é um Array contendo os monstros (na ordem que eles vão aparecer)

 

monstro - Nome do monstro que será sumonado

 

cenario - nome do cenário que aparecerá com o monstro (iremos configurar isso depois)

 

magic - Efeito que aparecerá no monstro sumonado

 

posItem - Posição da Arena em que o monstro será sumonado

 

Como exemplo vamos criar um 2º level (o player poderá lutar nesse level se ele já passou pelo 1º). Esse level terá 3 criaturas: A primeira será um orc, depois um orc shaman e por fim um orc leader e todos usarão o mesmo habitat, floresta.

 


[2] = {
	{monstro = "orc", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "orc shaman", cenario = "floresta", magic = 3, pos={x=147,y=30,z=7}},
	{monstro = "orc leader", cenario = "floresta", magic = 4, pos={x=147,y=30,z=7}},

},

 

E no geral ficaria assim:

 

LEVEL = {

[1] = {
	{monstro = "dwarf guard", cenario = "cave", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "cyclops", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "water elemental", cenario = "agua", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "orc shaman", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "giant spider", cenario = "deserto", magic = 10, pos={x=147,y=30,z=7}},
},
[2] = {
	{monstro = "orc", cenario = "floresta", magic = 2, pos={x=147,y=30,z=7}},
	{monstro = "orc shaman", cenario = "floresta", magic = 3, pos={x=147,y=30,z=7}},
	{monstro = "orc leader", cenario = "floresta", magic = 4, pos={x=147,y=30,z=7}},

},

}

 

E por fim vamos configurar os cenários

 

CENARIO = {

floresta = {
	i = {x=168,y=25,z=7},
	f = {x=180,y=35,z=7},
	m = 44
},

agua = {
	i = {x=168,y=38,z=7},
	f = {x=180,y=48,z=7},
	m = 53
},	

deserto = {
	i = {x=183,y=38,z=7},
	f = {x=195,y=48,z=7},
	m = 2
},

cave = {
	i = {x=183,y=25,z=7},
	f = {x=195,y=35,z=7},
	m = 38
},	

}

 

NOME DO CENARIO={} - Cada cenário é um array, sendo o nome dele o index. Esse nome é que será usado nos monstros para definir qual cenário usar

 

i - Posição do primeiro SQM do cenário (primeiro sqm do lado superior esquerdo). Caso de dúvida veja na Planta do Cenário o SQM marcado como Inicio

 

f - Posição do último SQM do cenário (último sqm do lado inferior direito). Caso de dúvida veja na Planta do Cenário o SQM marcado como Fim

 

Pronto. A Arena já está pronta para ser usada

;)

 

 

~~ Considerações finais ~~

 

Eu sei que o script é simples mas deem um desconto porque não mexo com LUA já faz uns 3 anos ;p.

 

O script se encontra em Beta por isso é muito provável que haja bugs. Estou pensando em futuras versões (não sei se é um futuro próximo ou longínquo) colocar novas funcionalidades, então se você tiver alguma sugestão por favor poste :)

 

Esse script NÃO pode ser postado em outros forums (Apesar de saber que ele será)

 

 

:bye:

Editado por Dark

Compartilhar este post


Link para o post
iuniX    4
iuniX

Meu deus a lenda está viva :o

 

Sobre o script, pelo que eu li não achei nenhum bug aparente. Script limpo, bem indentado e organização otima. (Não se esperava menos do grande Dark)

 

 

Aprovado e movido. Um exclusivo mais do que merecido.

Compartilhar este post


Link para o post
jedian    0
jedian

Nossaaaa \o/

Script incrííível, muito legal isso de habitat, muito legal mesmo!

map da floresta ficou mt legal, '-'

e o funcionamento do tempo ficou incrível também!

ahuahua até os efeitos nas imagens ficaram incríveis, ta muito legaal :D

Parabéns, vindo de mim, nem significa mt coisa, mas cara ta muito legal mesmo

Compartilhar este post


Link para o post
RiffyWare    0
RiffyWare

Nossa parabéns por tudo,

principalmente pela organização.

Compartilhar este post


Link para o post
Lyon    3
Lyon

Eita renasceu o Fenômeno!

3 anos desaparecido,e volta postando esse script fantástico!!

 

Parabéns senhor .LUA,realmente você lembrou algo! huahuahua

Compartilhar este post


Link para o post
Vittu    5
Vittu

Muito bom o script, exclusivo mas que merecido, a ideia muito boa de habitat natural para cada monster.

=))

Compartilhar este post


Link para o post
Gorgulf    0
Gorgulf

Muito, muito bom mesmo! Um toque a mais de rpg, sempre é bom ;)

Compartilhar este post


Link para o post
Lwkass    1
Lwkass

A lenda sempre volta uhahuahuahuauhau

Ótimo script, tava começando a faltar novo conteúdo postado dessa qualidade !

Compartilhar este post


Link para o post
hotmailw    0
hotmailw

parabéns pelo script, ficou muito daora, bastante criativo mano!

tomara que vc continue postando conteúdo, vlw..

Compartilhar este post


Link para o post
Conde2    0
Conde2

Eta porra Dark de volta =o

 

Tibia nunca morre no coração kkkkkkkkkkkk

Compartilhar este post


Link para o post
MaXwEllDeN    13
MaXwEllDeN

Owmaigad Dark a lenda *-*. Muito show o código, não se esperava menos... :D

Editado por MaXwEllDeN

Compartilhar este post


Link para o post
josejunior23    2
josejunior23

Pelos vistos as tuas ideias únicas continuam as mesmas, Parabéns!

Compartilhar este post


Link para o post
Biozard    0
Biozard

Script muito bom, fico show!!!

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×