S2
pedido

premium account

Por s2dieginho, 03 de set. de 2013 em Scripts

scripts
resolvido
6
1.1k
s2dieginhoS
03 de setembro de 2013 às 17:23

parte 1°

tipo queria um sistema de Premium Account, na minha cidade templo tem 2 teleportes que levao a cidades exclusivas para ''P.A'' queria que so'' P.A ''entrassem nesse teleportes

apos o tempo da sua p.a acabar se ele voltar para cidade templo nao poder mais entrar nesse teleportes ''P.A'' ate renovar sua ''P.A''

quando o tempo da sua ''P.A'' acabar se o player tiver logado dentro das areas ''P.A'' ele ser teletansportado de volta para a cidade templo.

 

pf queria o mais rapido possivel a 1° parte

 

parte 2°

queria que tive-se um limite de tempo para sair de lá

ex:. minha p.a acabo mais o player tem +1 hora para sair ou sera teletransportado de volta para templo estandotando online ou nao ou ate mesmo caçando...

Editado Setembro 3 por s2dieginho

OmegaO
03 de setembro de 2013 às 18:47

1ª parte:

 

TAG movements.xml:

<movevent type="StepIn" actionid="26282" event="script" value="premiumtp.lua"/>
<movevent type="StepIn" actionid="26283" event="script" value="premiumtp.lua"/>

premiumtp.lua em movements/scripts:

 

 

 

function onStepIn(cid, item, position, fromPos)
	local config = {
	pos_cidade1 = {x=160,y=50,z=7},
	nome_cidade1 = "Angola",
	pos_cidade2 = {x=180,y=1080,z=7},
	nome_cidade2 = "Vila Mimosa"
	}
	
	if item.actionid == 26282 then
		if isPremium(cid) then
			doTeleportThing(cid, config.pos_cidade1)
			doSendMagicEffect(config.pos_cidade1, 10)
			doPlayerSendTextMessage(cid, 27, "Voce chegou em "..config.nome_cidade1".")
		else
			doPlayerSendCancel(cid, "Apenas jogadores premium podem usar esse teleporte.")
			doTeleportThing(cid, fromPos)
			doSendMagicEffect(fromPos,2)
		end
	elseif item.actionid == 26283 then
		if isPremium(cid) then
			doTeleportThing(cid, config.pos_cidade2)
			doSendMagicEffect(config.pos_cidade2, 10)
			doPlayerSendTextMessage(cid, 27, "Voce chegou em "..config.nome_cidade2".")
		else
			doPlayerSendCancel(cid, "Apenas jogadores premium podem usar esse teleporte.")
			doTeleportThing(cid, fromPos)
			doSendMagicEffect(fromPos,2)
		end
	end
	return true
end	

 

 

 

 

 

2ª parte:

 

Cara, aqui eu me compliquei um pouco. Tentei pensar em um jeito melhor de checar se o cara estava em uma área PA, mas não consegui:

  • Você vai definir no script 4 posições:
  • Pos1 será a área de início da primeira área PA (escolha o canto superior esquerdo da área e z=7)
  • Pos2 será o fim da área PA (canto inferior direito, z=7)
  • Pos3 e 4 serão a mesma coisa, mas para a segunda área PA
  • A cada 5min (configurável), o servidor vai checar se os jogadores free estão na área definida (embaixo e acima também) e vai remover os que estiverem.

Alguns possíveis problemas:

  • O código, imagino eu, terá um grande custo no desempenho por checar uma área bem grande, então é melhor que o tempo de checagem não seja muito baixo (testa você mesmo pra ver se trava ou não aí)
  • Possivelmente os jogadores poderão se esquivar da checagem geral, então você pode usar uma função no login (particularmente, eu acho desnecessário)
  • Não fiz a parte do aviso antecipado porque iria criar mais problemas do que vale a pena, mas é fácil de colocar, se você fizer questão
  • Ele checa do z=2 até z=12, se tiver alguma área acima ou abaixo disso, procura isInAreaMultifloor(...,5) e muda o 5 pra 7.

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

TAG no globalevents.xml:

<globalevent name="PremiumAreaCheck" interval="300000" event="script" value="PACheck.lua"/> 
-- intervalo de 5 minutos em milissegundos para chamar o código. Se o seu servidor considerar o intervalo em segundos, divida o tempo por 1000

Arquivo PACheck.lua em globalevents/scripts:

 

 

 

function isInAreaMultifloor(pos,pos1,pos2,var)	
	for Floor = (pos1.z-var), (pos1.z+var) do
		if isInArea({x=pos.x,y=posy,z=Floor}, {x=pos1.x,y=pos1.y,z=Floor}, {x=pos2.x,y=pos2.y,z=Floor}) then
			return true
		end
	end
	return false
end

function onThink()
	local pos1,pos2 = {x=1,y=1,z=1}, {x=2,y=2,z=2}
	local pos3,pos4 = {x=3,y,3,z=3}, {x=4,y=4,z=4}
	local players = getPlayersOnline()
	for _,pid in ipairs(players) do
		if not isPremium(pid) then
			 if isInAreaMultifloor(getCreaturePosition(pid), pos1, pos2, 5) or isInAreaMultifloor(getCreaturePosition(pid), pos3, pos4, 5) then
				doPlayerSendTextMessage(pid,21,'Sua PA expirou e voce estava em uma area premium. Por favor, para continuar acessando aquela area, renove sua PA.')
				doTeleportThing(pid, getTownTemplePosition(1))
				doSendMagicEffect(getTownTemplePosition(1), 10)
			end
		end
	end
	return true
end

 

 

Editado Setembro 3 por omega blueheaven

03 de setembro de 2013 às 20:01

maneiro

Editado Setembro 3 por AlekysRocha19

OmegaO
03 de setembro de 2013 às 20:12

pra que serve o pos1,pos2,pos3,pos4?

 

Nesse momento eu estou me esforçando o máximo que posso para não ser grosso. Então vou dizer simplesmente: Releia. O. Que. Eu. Postei.

s2dieginhoS
03 de setembro de 2013 às 21:16

vlw cara deu certo aqui

rep+ pra voce :D

BeekiB
03 de setembro de 2013 às 21:57

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