Ir para conteúdo
  • 0

Checar se tem player na área.


Lumus

Pergunta

Olá.

 

Alguém poderia me fazer uma função ou se já existe adaptar pra mim pra que ela:

 

cheque se tem players na área(só pode ter 1)

 

se tiver, ela retorna: Já tem jogador lá.

 

se não, ela teleporta ele pra uma área definida.

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

adiciona essas 3 funções na sua lib:

-- 14º
function getFloorsBetweenPos(fromPos, toPos)
return math.abs(fromPos.z - toPos.z)
end

-- 15º
function getLowestFloor(fromPos, toPos)
return fromPos.z > toPos.z and toPos.z or fromPos.z
end

-- 16º
function getAllPlayersInArea(fromPos, toPos)
local players = {}	
local andares = getFloorsBetweenPos(fromPos, toPos)
	for index, creature in ipairs(getPlayersOnline()) do
		local z = getLowestFloor(fromPos, toPos)
		local frompos = {x = fromPos.x, y = fromPos.y, z = fromPos.z}
		local topos = {x = toPos.x, y = toPos.y, z = toPos.z}		
		for i = 0, andares do
			z = z or 0
			frompos.z = z + i
			topos.z = z + i	
			if isInArea(getThingPos(creature), frompos, topos) then
				table.insert(players, creature)
			end
		end
	end
return players
end

Agora vc vai fazer o seguinte, chamar essa função getAllPlayersInArea(posicao1, posicao2) e aí ele vai pegar todos os players entre a area da posicao 1 e posicao 2.
Só que vc vai colocar o valor dessa função numa variavel:

local totalplayers = getAllPlayersInArea(posicao1, posicao2)

Feito isso você vai ter uma lista de todos os players que estão nessa area. Agora tudo que você precisa fazer é verificar se a condição de ter somente 1 player é verdadeira e teleportar ele caso seja:

if #totalplayers == 1 then
   doTeleportThing(totalplayers[1], posicaofinal)
end

EDIT: não vi que era pra 1.2, foi mal, mas é só adaptar as funções que mudaram de nome que vai dar certo.

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

  • 0

Vou dar um exemplo, como se ele tivesse que entrar em um teleport para acessar a sala:

 

Vá em data/movements/movements.xml e adicione a tag:

<movevent event="StepIn" fromuid="63001" touid="63016" script="others/questportal.lua" />
Agora em data/movements/scripts/others crie o arquivo questportal.lua com o seguinte conteúdo:

local pos = {160, 54, 7} -- posição do centro da sala
local maxX, maxY = 2, 2 -- exemplo para checar uma área de 5 x 5 sqms

function onStepIn(creature, item, position, fromPosition)
	local player = creature:getPlayer()
	if not player then return true end

	local spectators = Game.getSpectators(Position(pos), false, true, 0, maxX, 0, maxY)
	if #spectators > 0 then
		player:teleportTo(fromPosition)
		player:sendTextMessage(MESSAGE_INFO_DESCR, "Ja existe um player fazendo a quest.")
		return false
	end

	player:teleportTo(Position(pos))
	player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
	return true
end
Link para o comentário
Compartilhar em outros sites

  • 0

Vou dar um exemplo, como se ele tivesse que entrar em um teleport para acessar a sala:

 

Vá em data/movements/movements.xml e adicione a tag:

<movevent event="StepIn" fromuid="63001" touid="63016" script="others/questportal.lua" />

 

Agora em data/movements/scripts/others crie o arquivo questportal.lua com o seguinte conteúdo:

local pos = {160, 54, 7} -- posição do centro da sala
local maxX, maxY = 2, 2 -- exemplo para checar uma área de 5 x 5 sqms

function onStepIn(creature, item, position, fromPosition)
	local player = creature:getPlayer()
	if not player then return true end

	local spectators = Game.getSpectators(Position(pos), false, true, 0, maxX, 0, maxY)
	if #spectators > 0 then
		player:teleportTo(fromPosition)
		player:sendTextMessage(MESSAGE_INFO_DESCR, "Ja existe um player fazendo a quest.")
		return false
	end

	player:teleportTo(Position(pos))
	player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
	return true
end

 

@Edit uma dúvida:

eu conto a partir do eixo central?

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

  • 0

@Edit uma dúvida:

eu conto a partir do eixo central?

Com essa função ele faz uma checagem ao redor da posição, aconselho que sim.

Link para o comentário
Compartilhar em outros sites

  • 0

Pareceu funcional bruno. Muito obrigado. Como garantia coloquei 1 a mais tanto no x como para y.

Novamente, obrigado!

Obrigado ao Wolf por tentar me ajudar também.

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

  • 0

Pareceu funcional bruno. Muito obrigado. Como garantia coloquei 1 a mais tanto no x como para y.

Novamente, obrigado!

Obrigado ao Wolf por tentar me ajudar também.

Disponha :) por nada!

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...