Jump to content
Close
Edirinacio

Scripting Preciso de ajuda no capture the frag

Recommended Posts

Preciso de alguém pra me ajudar no codigo de capture the flag

 

Criei um mini mapa de capture the flag e quero que o evento inicie uma vez e quando acabar inicie novamente sem parar, outra coisa que quero é que quando acabe o evento o player seje teletransportado para uma sala fechada não o templo.

 

O código é este aqui https://www.xtibia.com/forum/topic/218996-ctf-capture-the-flag-20automático/

CONFIGURAÇÃO QUE FICA NA LIB

--[[
	Capture The Flag System
	Author: Maxwell Denisson(MaXwEllDeN)
	Version: 2.0
	Contact: maxwellmda@gmail.com
]]

CTF_LIB = {
	waitpos = {x = 1009, y = 1019, z =7}, -- Posição da sala de espera
	tppos = {x = 1012, y = 1022, z =7}, -- Onde o TP vai aparecer

	days = {1, 2, 3, 4, 5, 6, 7}, -- Dias que o evento vai abrir
	xp_percent = 5.0, -- Porcentagem de exp que o player vai ganhar
	timeclose = 1, -- Tempo, em minutos, para iniciar o CTF
	winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer

	teams = {
		["Vermelho"] = {
			temple = 1, -- TownID da equipe vermelha
			outfit = {lookHead = 0, lookBody = 132, lookLegs = 113, lookFeet = 94},

			flag = {
				id = 1435,
				flag_pos = {x = 1011, y = 1027, z =7}, -- Posição onde a bandeira vermelha vai ser criada
				gnd_pos = {x = 1012, y = 1027, z =7}, -- Onde os players da equipe vermelha entregarão a bandeira.
			},
		},

		["Verde"] = {
			temple = 2, -- TownID da equipe verde
			outfit = {lookHead = 0, lookBody = 121, lookLegs = 101, lookFeet = 101},

			flag = {
				id = 1437,
				flag_pos = {x = 1022, y = 1027, z =7}, -- Posição onde a bandeira verde vai ser criada
				gnd_pos = {x = 1022, y = 1027, z =7}, -- Onde os players da equipe verde entregarão a bandeira.
			},
		},
	},
}

local CTF = CTF_LIB

function CTF.getMembers()
	local members = {}

	for _, cid in pairs(getPlayersOnline()) do
		if getPlayerStorageValue(cid, 16700) ~= -1 then
			table.insert(members, cid)
		end
	end

	return members
end

function CTF.getTeamMembers(team)
	local members = {}

	for _, cid in pairs(CTF.getMembers()) do
		if getPlayerStorageValue(cid, 16700) == team then
			table.insert(members, cid)
		end
	end

	return members
end

function CTF.removePlayer(uid)
	setPlayerStorageValue(uid, 16700, -1)
	doPlayerSetTown(uid, getPlayerStorageValue(uid, 16701))
	doTeleportThing(uid, getTownTemplePosition(getPlayerStorageValue(uid, 16701)))
	setPlayerStorageValue(uid, 16701, -1)

	doRemoveCondition(uid, CONDITION_OUTFIT)
	doCreatureAddHealth(uid, getCreatureMaxHealth(uid))
	doCreatureAddMana(uid, getCreatureMaxMana(uid))
	return true
end

function CTF.addPlayer(uid)
	local team = CTF.getTeamLivre()
	local n_team = CTF.teams[team]

	setPlayerStorageValue(uid, 16700, team)
	setPlayerStorageValue(uid, 16701, getPlayerTown(uid))

	doPlayerSetTown(uid, n_team.temple)
	doTeleportThing(uid, CTF.waitpos)

	doPlayerSendTextMessage(uid, 22, "Você agora faz parte do time ".. team .. ".")

	local outfit = getCreatureOutfit(uid)

	for i, v in pairs(n_team.outfit) do
		outfit[i] = v
	end

	registerCreatureEvent(uid, "CTFLogout")
	registerCreatureEvent(uid, "CTFAttack")
	registerCreatureEvent(uid, "CTFCombat")
	registerCreatureEvent(uid, "CTFDeath")
	doSetCreatureOutfit(uid, outfit, -1)
	return true
end

function CTF.getTeamLivre()
	local teams = {}

	for i, _ in pairs(CTF.teams) do
		table.insert(teams, {i, #CTF.getTeamMembers(i)})
	end

	if (teams[1][2] < teams[2][2]) then
		return teams[1][1]
	elseif (teams[1][2] > teams[2][2]) then
		return teams[2][1]
	end

	return teams[math.random(2)][1]
end

function CTF.broadCast(msg, class)
	for _, uid in pairs(CTF.getMembers()) do
		doPlayerSendTextMessage(uid, class or 20, msg)
	end

	return true
end

function CTF.getFlagTeam(flag)
	for i, v in pairs(CTF.teams) do
		if v.flag.id == flag then
			return i
		end
	end

	return ""
end

local score_sto = {}
local a = 0
for i, _ in pairs(CTF.teams) do
	score_sto[i] = 42314 + a
	a = a + 1
end

function CTF.createFlags()
	for i, v in pairs(CTF.teams) do
		local flag = doCreateItem(v.flag.id, 1, v.flag.flag_pos)
		doItemSetAttribute(flag, "aid", 63218)

		v.flag.gnd_pos.stackpos = 0
		local gnd = getThingFromPos(v.flag.gnd_pos).uid
		doItemSetAttribute(gnd, "aid", 63200)
		doItemSetAttribute(gnd, "team", i)

		setGlobalStorageValue(score_sto[i], 0)
	end

	return true
end

function CTF.removeFlags()
	for i, v in pairs(CTF.teams) do
		local flag = doFindItemInPos({v.flag.id}, v.flag.flag_pos)[1]
		if flag then
			doRemoveItem(flag.uid, 1)
		end

		v.flag.gnd_pos.stackpos = 0
		local gnd = getThingFromPos(v.flag.gnd_pos).uid
		doItemSetAttribute(gnd, "aid", 0)
	end

	return true
end

function CTF.start()
	doRemoveItem(doFindItemInPos({1387}, CTF.tppos)[1].uid, 1)
	setGlobalStorageValue(16705, -1)

	if #CTF.getMembers() < 2 then
		doBroadcastMessage("O CTF não pôde ser iniciado por falta de players.")

		for _, cid in pairs(CTF.getMembers()) do
			CTF.removePlayer(cid)
		end

		return false
	end

	CTF.broadCast("O CTF foi iniciado. Bom jogo!")

	for _, uid in pairs(CTF.getMembers()) do
		doTeleportThing(uid, getTownTemplePosition(getPlayerTown(uid)))
	end

	CTF.createFlags()
	return true
end

function CTF.returnFlag(uid, status)
	local team = getPlayerStorageValue(uid, 16702)

	if status then
		local msg = "O player ".. getCreatureName(uid) .. ", estava com a bandeira do time ".. team .. " "

		if status == 1 then
			msg = msg .. "e foi eliminado. "
		elseif status == 2 then
			msg = "e foi removido do evento. "
		end

		msg = msg .. "Portanto a bandeira do time ".. team .. " foi devolvida."
		CTF.broadCast(msg)
	end

	if CTF.teams[team] then
		local flag = doCreateItem(CTF.teams[team].flag.id, 1, CTF.teams[team].flag.flag_pos)
		doItemSetAttribute(flag, "aid", 63218)

		setPlayerStorageValue(uid, 16702, -1)
	end

	return true
end

function CTF.addPoint(uid)
	local finish
	local msg = "Capture The Flag:"

	setGlobalStorageValue(score_sto[getPlayerStorageValue(uid, 16700)], getGlobalStorageValue(score_sto[getPlayerStorageValue(uid, 16700)]) + 1)

	for i, _ in pairs(CTF.teams) do
		msg = msg .. "\nTime ".. i .. ": ".. getGlobalStorageValue(score_sto[i])

		if getGlobalStorageValue(score_sto[i]) >= CTF.winp then
			finish = i
		end
	end

	CTF.broadCast(getCreatureName(uid) .. " marcou um ponto para o time ".. getPlayerStorageValue(uid, 16700) .. ".", 22)
	CTF.broadCast(msg)
	if finish then
		CTF.close(finish)
	end

	return true
end

function CTF.close(win)
	for i, _ in pairs(CTF.teams) do
		setGlobalStorageValue(score_sto[i], 0)
	end

	if not win then
		doBroadcastMessage("O CTF acabou sem vencedores.")
	else
		CTF.broadCast("O time ".. win .. " marcou ".. CTF.winp .. " ponto(s) e venceu o evento.")
	end

	for _, cid in pairs(CTF.getMembers()) do
		if getPlayerStorageValue(cid, 16700) == win then
			local xp = math.ceil(getPlayerExperience(cid) * (CTF.xp_percent / 100), 215)
			doPlayerSendTextMessage(cid, 22, "Parabéns! Você ganhou o evento e obteve ".. CTF.xp_percent .."% de sua experiência total(".. xp ..").")
			doSendAnimatedText(getThingPos(cid), xp, 215)
			doPlayerAddExperience(cid, xp)
		end

		if getPlayerStorageValue(cid, 16702) ~= -1 then
			CTF.returnFlag(cid)
		end

		CTF.removePlayer(cid)
	end

	CTF.removeFlags()
	return true
end

local function Alert(uid)
	if (isCreature(uid)) then
		if getPlayerStorageValue(uid, 16702) == -1 or getPlayerStorageValue(uid, 16700) == -1 then
			return false
		end

		doSendAnimatedText(getThingPos(uid), "Flag!", math.random(50, 200))

		local bla = {18, 19, 21, 22, 23, 24}
		doSendMagicEffect(getThingPos(uid), bla[math.random(#bla)])

		if (os.time() - getPlayerStorageValue(uid, 16703) >= 60) then
			CTF.returnFlag(uid)
			return setPlayerStorageValue(uid, 16703, -1)
		end

		addEvent(Alert, 500, uid)
		return true
	end

	return false
end

function CTF.stealFlag(uid, team)
	setPlayerStorageValue(uid, 16702, team)
	setPlayerStorageValue(uid, 16703, os.time())

	CTF.broadCast(getCreatureName(uid) .. " roubou a bandeira do time ".. team .. "!")
	Alert(uid)
	return true
end

function doFindItemInPos(ids, pos) -- By Undead Slayer
	local results = {}

	for _ = 0, 255 do
		local findPos = {x = pos.x, y = pos.y, z = pos.z, stackpos = _}
		if isInArray(ids, getThingFromPos(findPos).itemid) then
			table.insert(results, getThingFromPos(findPos))
		end
	end

	return results
end

 

image.thumb.png.c2375b54a9fdba616bc457876c949385.png

 





Share this post


Link to post
Share on other sites

@Edirinacio Tenta isso

 

Altere a variável playerWinPos para a posição que você quer que o player seja teleportado

 

CONFIGURAÇÃO QUE FICA NA LIB

--[[
	Capture The Flag System
	Author: Maxwell Denisson(MaXwEllDeN)
	Version: 2.0
	Contact: maxwellmda@gmail.com
]]

CTF_LIB = {

    playerWinPos = {x=,y=,z=}, -- Posição que o player vencedor vai ser teleportado

	waitpos = {x = 1009, y = 1019, z =7}, -- Posição da sala de espera
	tppos = {x = 1012, y = 1022, z =7}, -- Onde o TP vai aparecer

	days = {1, 2, 3, 4, 5, 6, 7}, -- Dias que o evento vai abrir
	xp_percent = 5.0, -- Porcentagem de exp que o player vai ganhar
	timeclose = 1, -- Tempo, em minutos, para iniciar o CTF
	winp = 10, -- Quantos pontos uma equipe precisa marcar para vencer
	teams = {
		["Vermelho"] = {
			temple = 1, -- TownID da equipe vermelha
			outfit = {lookHead = 0, lookBody = 132, lookLegs = 113, lookFeet = 94},

			flag = {
				id = 1435,
				flag_pos = {x = 1011, y = 1027, z =7}, -- Posição onde a bandeira vermelha vai ser criada
				gnd_pos = {x = 1012, y = 1027, z =7}, -- Onde os players da equipe vermelha entregarão a bandeira.
			},
		},

		["Verde"] = {
			temple = 2, -- TownID da equipe verde
			outfit = {lookHead = 0, lookBody = 121, lookLegs = 101, lookFeet = 101},

			flag = {
				id = 1437,
				flag_pos = {x = 1022, y = 1027, z =7}, -- Posição onde a bandeira verde vai ser criada
				gnd_pos = {x = 1022, y = 1027, z =7}, -- Onde os players da equipe verde entregarão a bandeira.
			},
		},
	},
}

local CTF = CTF_LIB

function CTF.getMembers()
	local members = {}

	for _, cid in pairs(getPlayersOnline()) do
		if getPlayerStorageValue(cid, 16700) ~= -1 then
			table.insert(members, cid)
		end
	end

	return members
end

function CTF.getTeamMembers(team)
	local members = {}

	for _, cid in pairs(CTF.getMembers()) do
		if getPlayerStorageValue(cid, 16700) == team then
			table.insert(members, cid)
		end
	end

	return members
end

function CTF.removePlayer(uid)
	setPlayerStorageValue(uid, 16700, -1)
	doPlayerSetTown(uid, getPlayerStorageValue(uid, 16701))
	doTeleportThing(uid, getTownTemplePosition(getPlayerStorageValue(uid, 16701)))
	setPlayerStorageValue(uid, 16701, -1)

	doRemoveCondition(uid, CONDITION_OUTFIT)
	doCreatureAddHealth(uid, getCreatureMaxHealth(uid))
	doCreatureAddMana(uid, getCreatureMaxMana(uid))
	return true
end

function CTF.playerWinner(uid, playerWinPos)
    setPlayerStorageValue(uid, 16700, -1)
	setPlayerStorageValue(uid, 16701, -1)
    doTeleportThing(cid, playerWinPos)

    doRemoveCondition(uid, CONDITION_OUTFIT)
	doCreatureAddHealth(uid, getCreatureMaxHealth(uid))
	doCreatureAddMana(uid, getCreatureMaxMana(uid))
    return true
end

function CTF.addPlayer(uid)
	local team = CTF.getTeamLivre()
	local n_team = CTF.teams[team]

	setPlayerStorageValue(uid, 16700, team)
	setPlayerStorageValue(uid, 16701, getPlayerTown(uid))

	doPlayerSetTown(uid, n_team.temple)
	doTeleportThing(uid, CTF.waitpos)

	doPlayerSendTextMessage(uid, 22, "Você agora faz parte do time ".. team .. ".")

	local outfit = getCreatureOutfit(uid)

	for i, v in pairs(n_team.outfit) do
		outfit[i] = v
	end

	registerCreatureEvent(uid, "CTFLogout")
	registerCreatureEvent(uid, "CTFAttack")
	registerCreatureEvent(uid, "CTFCombat")
	registerCreatureEvent(uid, "CTFDeath")
	doSetCreatureOutfit(uid, outfit, -1)
	return true
end

function CTF.getTeamLivre()
	local teams = {}

	for i, _ in pairs(CTF.teams) do
		table.insert(teams, {i, #CTF.getTeamMembers(i)})
	end

	if (teams[1][2] < teams[2][2]) then
		return teams[1][1]
	elseif (teams[1][2] > teams[2][2]) then
		return teams[2][1]
	end

	return teams[math.random(2)][1]
end

function CTF.broadCast(msg, class)
	for _, uid in pairs(CTF.getMembers()) do
		doPlayerSendTextMessage(uid, class or 20, msg)
	end

	return true
end

function CTF.getFlagTeam(flag)
	for i, v in pairs(CTF.teams) do
		if v.flag.id == flag then
			return i
		end
	end

	return ""
end

local score_sto = {}
local a = 0
for i, _ in pairs(CTF.teams) do
	score_sto[i] = 42314 + a
	a = a + 1
end

function CTF.createFlags()
	for i, v in pairs(CTF.teams) do
		local flag = doCreateItem(v.flag.id, 1, v.flag.flag_pos)
		doItemSetAttribute(flag, "aid", 63218)

		v.flag.gnd_pos.stackpos = 0
		local gnd = getThingFromPos(v.flag.gnd_pos).uid
		doItemSetAttribute(gnd, "aid", 63200)
		doItemSetAttribute(gnd, "team", i)

		setGlobalStorageValue(score_sto[i], 0)
	end

	return true
end

function CTF.removeFlags()
	for i, v in pairs(CTF.teams) do
		local flag = doFindItemInPos({v.flag.id}, v.flag.flag_pos)[1]
		if flag then
			doRemoveItem(flag.uid, 1)
		end

		v.flag.gnd_pos.stackpos = 0
		local gnd = getThingFromPos(v.flag.gnd_pos).uid
		doItemSetAttribute(gnd, "aid", 0)
	end

	return true
end

function CTF.start()
	doRemoveItem(doFindItemInPos({1387}, CTF.tppos)[1].uid, 1)
	setGlobalStorageValue(16705, -1)

	if #CTF.getMembers() < 2 then
		doBroadcastMessage("O CTF não pôde ser iniciado por falta de players.")

		for _, cid in pairs(CTF.getMembers()) do
			CTF.removePlayer(cid)
		end

		return false
	end

	CTF.broadCast("O CTF foi iniciado. Bom jogo!")

	for _, uid in pairs(CTF.getMembers()) do
		doTeleportThing(uid, getTownTemplePosition(getPlayerTown(uid)))
	end

	CTF.createFlags()
	return true
end

function CTF.returnFlag(uid, status)
	local team = getPlayerStorageValue(uid, 16702)

	if status then
		local msg = "O player ".. getCreatureName(uid) .. ", estava com a bandeira do time ".. team .. " "

		if status == 1 then
			msg = msg .. "e foi eliminado. "
		elseif status == 2 then
			msg = "e foi removido do evento. "
		end

		msg = msg .. "Portanto a bandeira do time ".. team .. " foi devolvida."
		CTF.broadCast(msg)
	end

	if CTF.teams[team] then
		local flag = doCreateItem(CTF.teams[team].flag.id, 1, CTF.teams[team].flag.flag_pos)
		doItemSetAttribute(flag, "aid", 63218)

		setPlayerStorageValue(uid, 16702, -1)
	end

	return true
end

function CTF.addPoint(uid)
	local finish
	local msg = "Capture The Flag:"

	setGlobalStorageValue(score_sto[getPlayerStorageValue(uid, 16700)], getGlobalStorageValue(score_sto[getPlayerStorageValue(uid, 16700)]) + 1)

	for i, _ in pairs(CTF.teams) do
		msg = msg .. "\nTime ".. i .. ": ".. getGlobalStorageValue(score_sto[i])

		if getGlobalStorageValue(score_sto[i]) >= CTF.winp then
			finish = i
		end
	end

	CTF.broadCast(getCreatureName(uid) .. " marcou um ponto para o time ".. getPlayerStorageValue(uid, 16700) .. ".", 22)
	CTF.broadCast(msg)
	if finish then
		CTF.close(finish)
	end

	return true
end

function CTF.close(win)
	for i, _ in pairs(CTF.teams) do
		setGlobalStorageValue(score_sto[i], 0)
	end

	if not win then
		doBroadcastMessage("O CTF acabou sem vencedores.")
	else
		CTF.broadCast("O time ".. win .. " marcou ".. CTF.winp .. " ponto(s) e venceu o evento.")
	end

	for _, cid in pairs(CTF.getMembers()) do
		if getPlayerStorageValue(cid, 16700) == win then
			local xp = math.ceil(getPlayerExperience(cid) * (CTF.xp_percent / 100), 215)
			doPlayerSendTextMessage(cid, 22, "Parabéns! Você ganhou o evento e obteve ".. CTF.xp_percent .."% de sua experiência total(".. xp ..").")
			doSendAnimatedText(getThingPos(cid), xp, 215)
            CTF.playerWinner(cid, CTF.playerWinPos)
			doPlayerAddExperience(cid, xp)
		end

		if getPlayerStorageValue(cid, 16702) ~= -1 then
			CTF.returnFlag(cid)
		end

        if getPlayerStorageValue(cid, 16700) ~= win then
            CTF.removePlayer(cid)
        end
		
	end

	CTF.removeFlags()
    CTF.start()
	return true
end

local function Alert(uid)
	if (isCreature(uid)) then
		if getPlayerStorageValue(uid, 16702) == -1 or getPlayerStorageValue(uid, 16700) == -1 then
			return false
		end

		doSendAnimatedText(getThingPos(uid), "Flag!", math.random(50, 200))

		local bla = {18, 19, 21, 22, 23, 24}
		doSendMagicEffect(getThingPos(uid), bla[math.random(#bla)])

		if (os.time() - getPlayerStorageValue(uid, 16703) >= 60) then
			CTF.returnFlag(uid)
			return setPlayerStorageValue(uid, 16703, -1)
		end

		addEvent(Alert, 500, uid)
		return true
	end

	return false
end

function CTF.stealFlag(uid, team)
	setPlayerStorageValue(uid, 16702, team)
	setPlayerStorageValue(uid, 16703, os.time())

	CTF.broadCast(getCreatureName(uid) .. " roubou a bandeira do time ".. team .. "!")
	Alert(uid)
	return true
end

function doFindItemInPos(ids, pos) -- By Undead Slayer
	local results = {}

	for _ = 0, 255 do
		local findPos = {x = pos.x, y = pos.y, z = pos.z, stackpos = _}
		if isInArray(ids, getThingFromPos(findPos).itemid) then
			table.insert(results, getThingFromPos(findPos))
		end
	end

	return results
end

 





Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...