FO
dúvida

Arena PVP

Por Folspa, 03 de nov. de 2013 em Scripts

arena.xml
resolvido
otserv
tibia
13
1.6k
FolspaF
03 de novembro de 2013 às 16:19

Estava a ver um tutorial do Addict, porém nele não deixa claro o que eu faço com a parte do .xml.

http://www.xtibia.com/forum/topic/52720-como-fazer-uma-pvp-arena-100/

 

Lá diz apenas o que tem que se fazer, mas não onde, gostaria de saber onde eu coloco essas coisas aí.

OmegaO
03 de novembro de 2013 às 16:47

Postado 10/June/2007

Aquele tutorial tem mais de 6 anos. Tem maneiras mais tranquilas de se criar uma arena PVP hoje em dia.

Use o RME e selecione a ferramenta PVP (bandeira vermelha) para selecionar uma arena PVP. Depois, crie aquele script de alavanca que tem no tutorial e pronto, você tem sua arena PVP.

 

Outra maneira, sem usar o RME, é assim: crie um arquivo chamado pvparena.lua em creaturescripts/scripts com esse código:

 

local arena = {
frompos = {x=121, y=33, z=9},
topos = {x=128, y=37, z=9},
exit = {x=125, y=31, z=9} 
}

function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)
	if isPlayer(cid) then
		if isInArea(getPlayerPosition(cid), arena.frompos, arena.topos) then
			doTeleportThing(cid, arena.exit)
			doCreatureAddHealth(cid, getCreatureMaxHealth(cid), 65535, 256, true)
			doCreatureAddMana(cid, getCreatureMaxMana(cid))
			doRemoveConditions(cid, false)
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "[Arena] You were defeated.")
			return false
		end
	end
	return true
end

 

 

 

Em frompos você coloca a posição do canto superior esquerdo da sua arena e em topos você coloca a do canto inferior direito.

Adicione essa tag em creaturescripts.xml:

<event type="preparedeath" name="PVP_Arena" event="script" value="pvparena.lua"/>

E em login.lua (na pasta creaturescripts/scripts), procure por registerCreatureEvent, pule uma linha e adicione:

registerCreatureEvent(cid, "PVP_Arena")

E você ainda tem que fazer a alavanca como manda o tutorial do Addict. A segunda maneira é preferível porque você pode devolver o cara pra uma posição específica. Se usar a primeira, ele vai pro templo.

FolspaF
03 de novembro de 2013 às 16:56

Então, eu tentei uma gambiarra e até deu certo, mas acho que ficou estranho, segui o tutorial do Addict, porém usei a talkaction de teleport do outro tópico.

 

Esses meios seguram os itens dos jogadores? No caso, é para os jogadores não perderem os itens e nem ganharem exp.

OmegaO
03 de novembro de 2013 às 17:11

Então, eu tentei uma gambiarra e até deu certo, mas acho que ficou estranho, segui o tutorial do Addict, porém usei a talkaction de teleport do outro tópico.

 

Esses meios seguram os itens dos jogadores? No caso, é para os jogadores não perderem os itens e nem ganharem exp.

 

Claro, você morre e volta como se nada tivesse acontecido. Se você combinar os dois, nem fica com skull. Se usar só o primeiro, vai pro templo. Se usar o segundo, recebe skull. Mas em nenhum caso há nenhuma morte e a skull vai ser junto com o pz.

FolspaF
03 de novembro de 2013 às 17:40

Só mais uma coisa, tem como fazer algo sumir do mapa com uma talkaction? Por exemplo, tem uma parede ali, daí eu mando o comando e a parede some. Seria que nem o teleport com talkaction do outro tópico, só poderia usar esse comando de dentro de uma região específica.

OmegaO
03 de novembro de 2013 às 19:05

Só mais uma coisa, tem como fazer algo sumir do mapa com uma talkaction? Por exemplo, tem uma parede ali, daí eu mando o comando e a parede some. Seria que nem o teleport com talkaction do outro tópico, só poderia usar esse comando de dentro de uma região específica.

 

 

-- Mesma coisa: superior esquerdo e inferior direito
local frompos = {x=160, y=250, z=7}
local topos = {x="etc..."}

local parede_pos = {} -- Posição da parede

function onSay(cid, words, param)
	if isInArea(getThingPos(cid), frompos, topos) then
		local parede = getThingFromPos(parede_pos)
		if parede.itemid > 0 then
			doRemoveItem(parede.uid, 1)
		end
	else
		doPlayerSendCancel(cid, "You may not use this command here.")
	end
	return true
end

 

 

 

Avise/denuncie se estiver satisfeito ou comente se seu pedido ainda não tiver sido atendido.

FolspaF
03 de novembro de 2013 às 21:25

No caso, seria mais de uma parede. Como poderia especificar várias paredes sumirem?

OmegaO
03 de novembro de 2013 às 21:38

 

 

-- Mesma coisa: superior esquerdo e inferior direito
local frompos = {x=160, y=250, z=7}
local topos = {x="etc..."}

local parede_pos = { -- Posição das paredes
	[1] = {x=1,y=2,z=3},
	[2] = {x=3, y=4, z=6},
} 

function onSay(cid, words, param)
	if isInArea(getThingPos(cid), frompos, topos) then
		for _, ppos in ipairs(parede_pos) do
			local parede = getThingFromPos(ppos)
			if parede.itemid > 0 and getThingPos(parede.uid).stackpos > 0 then
				doRemoveItem(parede.uid, 1)
			end
		end
	else
		doPlayerSendCancel(cid, "You may not use this command here.")
	end
	return true
end

 

 

Editado Novembro 3 por omega blueheaven

FolspaF
03 de novembro de 2013 às 22:42

Deu quase certo, só que no caso, sumiu o chão e não a parede.

OmegaO
03 de novembro de 2013 às 22:45

Editado, tenta de novo.

FolspaF
03 de novembro de 2013 às 22:58

Hm, agora não aconteceu nada.

 

Não seria algo como "parede está lá" = 1, "parede não está lá" = 0?

OmegaO
03 de novembro de 2013 às 23:00

Não, vou ter que fazer algo mais complexo e agora estou ocupado. Talvez eu faça depois, se ninguém mais se disponibilizar.

1 mês depois...
OmegaO
05 de dezembro de 2013 às 23:07

Tópico movido para a seção de dúvidas e pedidos resolvidos.