Ir para conteúdo
  • Cadastre-se

(Resolvido)Script para disisti do evento Capture the flag


Ir para solução Resolvido por Storm,

Posts Recomendados

Enfim  eu to com uma script do Capture the flag porem eu gostaria de uma script de um portal que ao entrar nele disistisse do evento

 

Segue o script do evento ::

--[[
	Capture The Flag System
	Author: Maxwell Denisson(MaXwEllDeN)
	Version: 2.0
	Contact: [email protected]
]]

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

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

	teams = {
		["Vermelho"] = {
			temple = 2, -- TownID da equipe vermelha
			outfit = {lookType = 749},

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

		["Verde"] = {
			temple =1, -- TownID da equipe verde
			outfit = {lookType = 747},

			flag = {
				id = 1437,
				flag_pos = {x = 146, y = 951, z = 7}, -- Posição onde a bandeira verde vai ser criada
				gnd_pos = {x = 144, y = 953, 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)
	doPlayerSetTown(uid, getPlayerStorageValue(uid, 16701))
	doTeleportThing(uid, getTownTemplePosition(getPlayerStorageValue(uid, 16701)))
	doRemoveCondition(uid, CONDITION_OUTFIT)
	doCreatureAddHealth(uid, getCreatureMaxHealth(uid))
	doCreatureAddMana(uid, getCreatureMaxMana(uid))

	setPlayerStorageValue(uid, 16701, -1)
	setPlayerStorageValue(uid, 16700, -1)
	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)
	CTF.returnFlag(uid)

	if finish then
		CTF.close(finish)
		return "close"
	end

	return true
end

function CTF.close(win)

	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
		doPlayerAddItem(cid, 11192, 100)
		doPlayerAddItem(cid, 2160, 710)
		doPlayerAddItem(cid, 8306, 10)
			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()

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

	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

 

Link para o post
Compartilhar em outros sites

Cria um teleporte que manda pro templo e no TILE embaixo dele , coloque ;

XML

<movevent type="StepIn" actionid="920" event="script" value="ip.lua"/>

Script

function onStepIn(cid, item, position, fromPosition)
         CTF.removePlayer(cid)
         return true
end

Basicamente é um tile que remove o player do evento.

Link para o post
Compartilhar em outros sites

@Sttorm 

Cara eu testei aqui e deu o seguinte Erro

[23/05/2018 10:35:55] [Error - MoveEvents Interface] 
[23/05/2018 10:35:55] data/movements/scripts/ip.lua:onStepIn
[23/05/2018 10:35:55] Description: 
[23/05/2018 10:35:55] data/movements/scripts/ip.lua:2: attempt to index global 'CTF' (a nil value)
[23/05/2018 10:35:55] stack traceback:
[23/05/2018 10:35:55]     data/movements/scripts/ip.lua:2: in function <data/movements/scripts/ip.lua:1>

Link para o post
Compartilhar em outros sites
1 minuto atrás, Jociel disse:

@Sttorm 

Cara eu testei aqui e deu o seguinte Erro

[23/05/2018 10:35:55] [Error - MoveEvents Interface] 
[23/05/2018 10:35:55] data/movements/scripts/ip.lua:onStepIn
[23/05/2018 10:35:55] Description: 
[23/05/2018 10:35:55] data/movements/scripts/ip.lua:2: attempt to index global 'CTF' (a nil value)
[23/05/2018 10:35:55] stack traceback:
[23/05/2018 10:35:55]     data/movements/scripts/ip.lua:2: in function <data/movements/scripts/ip.lua:1>


Essa script acima que você passou do CTF , você colocou ela na pasta LIB ?

Link para o post
Compartilhar em outros sites

@Sttorm 

Sim inclusive ja esta funcionando tudo so a parte se o player querer desistir do evento nao funcionar pois se botar somente um portal normal quando ele morre ele volta para o evento

Link para o post
Compartilhar em outros sites

Ok , tenta assim então :

function removePlayerCTF(cid)
	doPlayerSetTown(cid, getPlayerStorageValue(cid, 16701))
	doTeleportThing(cid, getTownTemplePosition(getPlayerStorageValue(cid, 16701)))
	doRemoveCondition(cid, CONDITION_OUTFIT)
	doCreatureAddHealth(cid, getCreatureMaxHealth(cid))
	doCreatureAddMana(cid, getCreatureMaxMana(cid))
	setPlayerStorageValue(cid, 16701, -1)
	setPlayerStorageValue(cid, 16700, -1)
	return true
end

function onStepIn(cid, item, position, fromPosition)
         removePlayerCTF(cid)
         return true
end

 

Link para o post
Compartilhar em outros sites

@Sttorm 

no caso essa nova script continua sendo um tile abaixo do tp certo?

pq se for assim o player continua participando do evento porem nao consta nenhum erro na distro

Link para o post
Compartilhar em outros sites
3 minutos atrás, Jociel disse:

@Sttorm 

no caso essa nova script continua sendo um tile abaixo do tp certo?

pq se for assim o player continua participando do evento porem nao consta nenhum erro na distro

Ele continuar participando do evento de que modo ?

Link para o post
Compartilhar em outros sites

@Sttorm 

tipo quando esta acontecendo o evento, e os players morrem de dentro do evento eles volta para o inicio do evento ,

entao mesmo com o evento acabado e o player morrem fora, eles voltam para dentro do inicio do evento como se ainda estivecem participando

Link para o post
Compartilhar em outros sites
  • Solução

@Jociel Agora eu entendi , o problema é nos creatureevents :

function removePlayerCTF(cid)
	doPlayerSetTown(cid, getPlayerStorageValue(cid, 16701))
	doTeleportThing(cid, getTownTemplePosition(getPlayerStorageValue(cid, 16701)))
	doRemoveCondition(cid, CONDITION_OUTFIT)
	doCreatureAddHealth(cid, getCreatureMaxHealth(cid))
	doCreatureAddMana(cid, getCreatureMaxMana(cid))
	setPlayerStorageValue(cid, 16701, -1)
	setPlayerStorageValue(cid, 16700, -1)
	return true
end

function onStepIn(cid, item, position, fromPosition)
         removePlayerCTF(cid)
    unregisterCreatureEvent(cid, "CTFLogout")
	unregisterCreatureEvent(cid, "CTFAttack")
	unregisterCreatureEvent(cid, "CTFCombat")
	unregisterCreatureEvent(cid, "CTFDeath")
         return true
end

 

Link para o post
Compartilhar em outros sites
20 horas atrás, Sttorm disse:

@Jociel Agora eu entendi , o problema é nos creatureevents :


function removePlayerCTF(cid)
	doPlayerSetTown(cid, getPlayerStorageValue(cid, 16701))
	doTeleportThing(cid, getTownTemplePosition(getPlayerStorageValue(cid, 16701)))
	doRemoveCondition(cid, CONDITION_OUTFIT)
	doCreatureAddHealth(cid, getCreatureMaxHealth(cid))
	doCreatureAddMana(cid, getCreatureMaxMana(cid))
	setPlayerStorageValue(cid, 16701, -1)
	setPlayerStorageValue(cid, 16700, -1)
	return true
end

function onStepIn(cid, item, position, fromPosition)
         removePlayerCTF(cid)
    unregisterCreatureEvent(cid, "CTFLogout")
	unregisterCreatureEvent(cid, "CTFAttack")
	unregisterCreatureEvent(cid, "CTFCombat")
	unregisterCreatureEvent(cid, "CTFDeath")
         return true
end

 

Funcionou!! vlw ? 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Edit :@Sttorm 

aproveitando esse topico você poderia me ajudar em outra coisinha uma action que só pode-se entrar no portal depois q o evento acabasse

 

 

Editado por Jociel
mais uma ajudinha (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo