premium account

s2dieginho
em Scripts

s2dieginho

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 23/08/13Posts: 12

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...

Omega

o/
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 17/06/07Posts: 1165Gênero: MasculinoChar no Tibia: Nenhum

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

 

 

AlekysRocha19

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 12/07/13Posts: 30

maneiro

Omega

o/
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 17/06/07Posts: 1165Gênero: MasculinoChar no Tibia: Nenhum

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.

s2dieginho

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 23/08/13Posts: 12

vlw cara deu certo aqui

rep+ pra voce :D

Beeki

Ex-Coordenador XDev
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 12/03/11Posts: 1900Gênero: MasculinoChar no Tibia: Nokte

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

Fabio Augustus - Infraestrutura

Skype: guhsvasc