Ir para conteúdo

Torneio PVP!


Roksas

Posts Recomendados

Iaaae galera suave braaits ? Hoje venho trazer para vocês um sistema de Torneio, mas, como funciona?

 

Vários players entram numa sala, falando com o NPC (tem horário configurável para poder falar), e para poder participar deve pagar uma quantia, ao pagar você é teleportado á Arena aonde começa a batalha.

 

O último que sobreviver vence :)

Vamos á instalação?

 

~~

 

Vá em data/npc, copie algum arquivo .XML da pasta e cole, renomeie para Tournament,

cole isso dentro:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Tournament" script="tournament.lua" walkinterval="2000" floorchange="0">
<health now="150" max="150"/>
<look type="128" head="20" body="100" legs="50" feet="99" corpse="2212"/>
<parameters>
<parameter key="message_greet" value="Hello |PLAYERNAME|. If you want to participate in the tournament say: {torneio} or {enter}."/>
</parameters>
</npc>

 

 

Ok, agora vá em data/npc/scripts, copie algum arquivo dessa pasta e cole, renomeie para tournament, cole isso:

 

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end

function creatureSayCallback(cid, type, msg)

if(not npcHandler:isFocused(cid)) then
return false
end

local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

local cfg = {
price = 100, -- Money to sign in tournament
startPos = {x = 1016, y = 1025, z = 7}, -- Posição central da sala de torneio
hour = "18:00:00", -- Hour to start
maxhour = "18:15:00", -- Max to start
}



if msgcontains(msg, 'torneio') or msgcontains(msg, 'enter') then
selfSay('You want to participate in the tournament by '..cfg.price..' gps / dollars?', cid)
talkState[talkUser] = 2


elseif talkState[talkUser] == 2 then

if msgcontains(msg, 'yes') or msgcontains(msg, 'sim') then

if os.date("%X") < cfg.hour or os.date("%X") > cfg.maxhour then
			selfSay('Registration for the tournament finished, come back later.', cid)
return true
end

if doPlayerRemoveMoney(cid, cfg.price) then
doTeleportThing(cid, {x = 1007, y = 1018, z = 7})
doPlayerSendTextMessage(cid, 27, "Welcome to the tournament, the fights will start on time, good luck, hahaha!")
else

selfSay('You do not have enough money ('..cfg.price..').', cid)
end
else
selfSay('Sure you do not want to participate? Okay, see you next time!!', cid)
talkState[talkUser] = 0
end
end
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

  • Configurando:

local cfg = {
price = 100, -- Money to sign in tournament
startPos = {x = 1016, y = 1025, z = 7}, -- Posição central da sala de torneio
hour = "18:00:00", -- Hour to start
maxhour = "18:15:00" -- Max to start
}

 

Price é o preço que paga para entrar no Torneio, startPos é as coordenadas do meio da sala de Torneio, e Hour é a hora do dia que começa, o Torneio no caso é diário, mude o horário de "18:00:00" para o horário desejado, entre aspas e no formato 00:00:00! Já o maxhour determina até quando o NPC vende inscrições, no caso coloquei por 15 minutos.

 

 

Agora vamos configurar a alavanca e o baú do vencedor! Vá em data/lib, abra o arquivo 050-function.lua ou function.lua, vá até a última linha de todas, pule 2 linhas e cole isso:

 

 

function getPlayersInArea(area)
local players = {}

for x = area.fromx,area.tox do
for y = area.fromy,area.toy do
for z = area.fromz,area.toz do

local m = getTopCreature({x=x, y=y, z=z}).uid

if m ~= 0 and isPlayer(m) then
table.insert(players, m)
end
end
end
end
return players
end

 

 

Essa é a lib que usaremos no nosso Torneio, muito bem, agora vá em data/actions/scripts, copie algum arquivo desta pasta e cole, renomeie para tournament e cole isso dentro:

 

 

function onUse(cid, item, frompos, item2, topos)

local cfg = {
salaAward = {x = 1016, y = 1014 , z = 7}, -- Coordenates of the award place
}

local area = {fromx = 1008, fromy = 1018, fromz = 7, tox = 1025, toy = 1033, toz = 7} -- Positions
local check = getPlayersInArea(area)
local maxhour = "18:15:00"

if #check > 1 then
doPlayerSendTextMessage(cid, 27, "Before everything ends up with other players!!")
return true
end

if os.date("%X") < maxhour then
doPlayerSendTextMessage(cid, 27, "Wait for all participants enter the arena!")
return true
end

doTeleportThing(cid, cfg.salaAward)
doPlayerSendTextMessage(cid, 20, "Congratulations, you won, take your prize in this room.")
doBroadcastMessage("The player "..getCreatureName(cid).." wins the Tournament! Congratulations.", MESSAGE_STATUS_CONSOLE_RED)
end

  • Configurando:

local cfg = {
salaAward = {x = 1016, y = 1014 , z = 7}, -- Coordenates of the award place
}

 

salaAward, coloque as coordenadas da sala de prêmio do vencedor do Torneio!

 

local area = {fromx = 1008, fromy = 1018, fromz = 7, tox = 1025, toy = 1033, toz = 7}

 

fromx - fromy - fromz, coloque as coordenadas (X,Y e Z) do canto superior esquerdo da sala de Torneio, e tox - toy - toz, coloque as coordenadas (X, Y e Z) do canto inferior direito da sala de Torneio.

 

local maxhour = "18:15:00", coloque igual ao script do NPC!

 

Na mesma pasta crie outro arquivo, mas agora com o nome de tournamentchest e adicione isso dentro:

 

function onUse(cid, item, frompos, item2, topos)

local cfg = {
awardId = 2148, -- Item ID of winner prize
awardAmount = 100, -- Amount of item ID
}

doPlayerAddItem(cid, cfg.awardId, cfg.awardAmount)
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
doPlayerSendTextMessage(cid, 27, "Thanks for sign, added +1 Tournament Points!")
return true
end

  • ​Configurando:

local cfg = {
awardId = 2148, -- Item ID of winner prize
awardAmount = 100, -- Amount of item ID
}

 

awardId coloque o ID do item que vai receber ao ganhar o Torneio, e awardAmount a quantidade!

 

Em actions.xml adicione essas tags:

 

<action actionid="13549" event="script" value="tournament.lua"/>
<action uniqueid="5531" event="script" value="tournamentchest.lua"/>

 

Muito bem, dirija-se á data/creaturescripts/scripts, copie algum arquivo da pasta e cole, renomeie para tournamentdeath, e adicione isso dentro:

 

local cfg = {
leftPos = {x = 1008, y = 1018, z = 7},
rightPos = {x = 1025, y = 1033, z = 7},
}

function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)
if isInRange(getCreaturePosition(pid), cfg.leftPos, cfg.rightPos) then
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
doCreatureAddHealth(cid, getCreatureMaxHealth(cid), 65535, 256, true)
doCreatureAddMana(cid, getCreatureMaxMana(cid))
doRemoveConditions(cid, false)
return false
end
return true
end

  • Configurando:

local cfg = {
leftPos = {x = 1008, y = 1018, z = 7},
rightPos = {x = 1025, y = 1033, z = 7},
}

 

leftPos coloque as coordenadas do canto superior esquerdo da Sala de Torneio, e rightPos coloque o canto inferior direito da sala :)

 

Agora em creaturescripts.xml adicione essa tag:

 

<event type="preparedeath" name="TournamentDeath" event="script" value="tournamentdeath.lua"/>

 

Prontinho galera, agora apenas adicione ACTION ID 13549 na alavanca e UNIQUE ID 5531 no baú do campeão :D

 

f0wvoi.jpg

 

 

Download Mapa Tournament (Tibia) - 4shared

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

Obrigado galera, espero que façam bom uso, não foi muito difícil de fazer, apenas fiquei uma meia hora pensando numa lógica bem legalzinha, aqui funcionou certinho, espero que tenham boas ideias para usá-lo!

 

Próximas versões poderei ver se faço para Poketibia, etc :)

Thanks!

Link para o comentário
Compartilhar em outros sites

esse script é bem parecido com o do dalton, da vapus.

 

é bem legal, porém como já existe ai você poderia implementar algumas coisas a mais como por exemplo, a cada pessoa que se inscrever no torneio, no npc tem uma opção que você consiga ver todos os inscritos .. seria interessante , já fiz parecido.

Link para o comentário
Compartilhar em outros sites

Não sabia que já existia, tem algo de diferente o outro deste?

 


local config = {
temporaryArea = {
	{x = 997, y = 1013, z = 7}, -- northwest corner of area where players must stand in order to join the event
	{x = 1001, y = 1015, z = 7} -- south east corner
},
arenaArea = {
	{x = 1003, y = 1009, z = 7}, -- nw corner of arena
	{x = 1015, y = 1019, z = 7}, -- se corner of arena
	{x = 1009, y = 1014, z = 7} -- center of arena
},
minPlayers = 2, -- min players required to start the battle
prize = {2160, 5467} -- rewards
}

function onThink(interval, lastExecution, thinkInterval)
local players, arenaPlayers = {}, {}
for x = (config.temporaryArea)[1].x, (config.temporaryArea)[2].x do
	for y = (config.temporaryArea)[1].y, (config.temporaryArea)[2].y do
		for z = (config.temporaryArea)[1].z, (config.temporaryArea)[2].z do
			if(isPlayer(getTopCreature({x = x, y = y, z = z}).uid)) then
				table.insert(players, getTopCreature({x = x, y = y, z = z}).uid)
			end
		end
	end
end
for x = (config.arenaArea)[1].x, (config.arenaArea)[2].x do
	for y = (config.arenaArea)[1].y, (config.arenaArea)[2].y do
		for z = (config.arenaArea)[1].z, (config.arenaArea)[2].z do
			if(isPlayer(getTopCreature({x = x, y = y, z = z}).uid)) then
				table.insert(arenaPlayers, getTopCreature({x = x, y = y, z = z}).uid)
			end
		end
	end
end
if(table.maxn(arenaPlayers) == 1) then
	doTeleportThing(arenaPlayers[1], getPlayerMasterPos(arenaPlayers[1]))
	doSendMagicEffect(getPlayerMasterPos(arenaPlayers[1]), CONST_ME_TELEPORT)
	doPlayerSendTextMessage(arenaPlayers[1], MESSAGE_STATUS_CONSOLE_BLUE, "You win a battle and recived your reward.")
	doPlayerAddItem(arenaPlayers[1], (config.prize)[math.random(1, table.maxn(config.prize))], 1)
elseif(table.maxn(arenaPlayers) < 1) then
	if(table.maxn(players) >= config.minPlayers) then
		for i = 1, config.minPlayers do
			doTeleportThing(players[i], (config.arenaArea)[3])
			doSendMagicEffect((config.arenaArea)[3], CONST_ME_TELEPORT)
			doPlayerSendTextMessage(players[i], MESSAGE_STATUS_WARNING, "The battle begins. Survive for glory!")
		end
	end
end
return true
end

 

Mais complexo, enfim .. tente adicionar os nomes dos participantes .. ou então faça assim por categoria para evitar que um level 300 lute com level 100 .. seria interessante :)

Link para o comentário
Compartilhar em outros sites

desculpem por postar aqui Galera queria saber pq quando coloco area no logout em um canto o player n fica com battle exemplo:

ele n consegue logar mais n fica com battle queria saber como colocar para ficar com battle quero colocar um evento no meu ot mais

meu servidor tem um sistema !ir que so pode viajar sem battle ai se o tile ficar sem battle ele vai conseguir fujir do evento Vlw

 

Do rep + pra quem me ajudar!

Link para o comentário
Compartilhar em outros sites

Jose, no evento, se ele atacar outra pessoa ele vai ficar com battle, não há nem como ele usar o comando "!ir" :)

 

~~

 

Galera, aguardem próximas versões :D

Link para o comentário
Compartilhar em outros sites

mais to falando do evento battlefield :) se o player n gosta to time que entrou ele da /ir e entra portal d novo queria que qnd ele entra-se no portal ja fica-se com battle que n pode-se logar e tals

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...