Ir para conteúdo
  • Cadastre-se

(Resolvido)talkaction que da goto em player aleatorio


Ir para solução Resolvido por lordzetros,

Posts Recomendados

Diga em poucas palavras a base utilizada (Nome do servidor ou nome do website).

YFS 0.4

Base: 

Peguei um script aqui no tibiaking, quando dou o comando ele da goto em um player aleatorio do server (online)

 

Qual erro está surgindo/O que você procura?

queria bloquear o comando pra os players que estao treinando, (eu nao dar goto neles)

 

Você tem o código disponível? Se tiver publique-o aqui:


 
Citar

 

function onSay(cid, words, param, channel)
    local function doTeleportToOnlinePlayers(cid)
        local ons = getPlayersOnline()
        if #ons < 2 then
            return doPlayerSendCancel(cid, "Don't have any player online, beyond you.")
        end

        if(player_rand == cid) then
            return addEvent(doTeleportToOnlinePlayers, 1, cid)
        end
    
        local player_rand = ons[math.random(#ons)]
        local pos = getClosestFreeTile(cid, getThingPos(player_rand), true, false)
        if(not pos or isInArray({pos.x, pos.y}, 0)) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Cannot perform action.")
            return true
        end

        local tmp = getThingPos(cid)
        if(doTeleportThing(cid, pos, true) and not isPlayerGhost(cid)) then
            doSendMagicEffect(tmp, CONST_ME_POFF)
            doSendMagicEffect(pos, CONST_ME_TELEPORT)
        end
        return true
    end
    return doTeleportToOnlinePlayers(cid)
end

 

Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.

Link para o post
Compartilhar em outros sites

Cara... não sei se é por conta que estou mexendo com Lua há pouco tempo, mas não tenho ideia alguma de como fazer essa verificação no meu conhecimento (posso dá uma estudada para te informar melhor), se for em APENAS uma área o local de trainer, o que pode ser feito é o mesmo mecanismo que fazem em zona de eventos/pvps, o script dá um check se o player está em uma determinada área, de x até z, e caso ele esteja, o mesmo não teleporta. Então fica a ideia aí para o pessoal mais experiente, vou tentar bolar aqui, pode ser que demore ou não, :D.

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites

sim, pode ser area tambem, ja tentei mexer de varias formas e não consegui, tentei botar por storage, tambem não consegui, inclusive tentei botar por area tambem, mas nao funcionou

Link para o post
Compartilhar em outros sites

@poko360 cara, tentei não fazer dessa forma, na qual não fizesse uma busca bruta, porém, só consegui dessa forma, espero que o ajude-o temporariamente e que alguém se manisfeste, caso resolva isso gastando menos memória para processamento...
 

function onSay(cid, words, param, channel)
	function getAllPlayersInArea(fromPosition, toPosition)
		local players = {}
		for _, pid in ipairs(getPlayersOnline()) do
			local f = {x = fromPosition.x, y = fromPosition.y, z = fromPosition.z}
			local t = {x = toPosition.x, y = toPosition.y, z = toPosition.z}
			local min = (fromPosition.z > toPosition.z and toPosition.z or fromPosition.z)
			for index = 0, math.abs(toPosition.z - fromPosition.z) do
				f.z = min + index
				t.z = min + index
				if isInRange(getPlayerPosition(pid), f, t) then
					table.insert(players, pid)
				end
			end    
		end
		return players
	end 
	
    local function doTeleportToOnlinePlayers(cid)
		local trainerArea = {{x = 1022, y = 1026, z = 7}, {x = 1025, y = 1029, z = 7}}  --- {canto superior direito}, {canto inferior direito} - pegando a area toda
		local playersTrainer = getAllPlayersInArea(trainerArea[1], trainerArea[2])
		
        local ons = getPlayersOnline()
        if #ons < 2 then
            return doPlayerSendCancel(cid, "Don't have any player online, beyond you.")
        end
		
		for index, jogador in ipairs(ons) do
			for index2, jogador2 in ipairs(playersTrainer) do
				if (ons[index] == playersTrainer[index2]) then
					table.remove(ons, index)
				end
			end
		end
			
        local player_rand = ons[math.random(#ons)]		
		if ((player_rand == cid)) then
			doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
            return true
        end
		
        local pos = getClosestFreeTile(cid, getThingPos(player_rand), true, false)
        if(not pos or isInArray({pos.x, pos.y}, 0)) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Cannot perform action.")
            return true
        end

        local tmp = getThingPos(cid)
        if(doTeleportThing(cid, pos, true) and (not isPlayerGhost(cid))) then
            doSendMagicEffect(tmp, CONST_ME_POFF)
            doSendMagicEffect(pos, CONST_ME_TELEPORT)
        end
        return true
    end
	doTeleportToOnlinePlayers(cid)
end

Teste aí e manda um retorno, :D. Na variável trainerArea é onde você vai colocar o canto superior direito e inferior direito da localização do trainer.

Editado por lordzetros (veja o histórico de edições)

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites

@lordzetros
funcionou perfeitamente 90%
faltou uma coisa kkk, ta aparecendo meu char falando o comando do lado do player
ai o player vai saber q fui nele em ghost

 tem como arrumar isso?

Editado por poko360 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Solução

Opa, é mesmo, tinha me esquecido disso, vou arrumar, quando editar esse post aqui eu te marco.

Edit: @poko360
 

function onSay(cid, words, param, channel)
	function getAllPlayersInArea(fromPosition, toPosition)
		local players = {}
		for _, pid in ipairs(getPlayersOnline()) do
			local f = {x = fromPosition.x, y = fromPosition.y, z = fromPosition.z}
			local t = {x = toPosition.x, y = toPosition.y, z = toPosition.z}
			local min = (fromPosition.z > toPosition.z and toPosition.z or fromPosition.z)
			for index = 0, math.abs(toPosition.z - fromPosition.z) do
				f.z = min + index
				t.z = min + index
				if isInRange(getPlayerPosition(pid), f, t) then
					table.insert(players, pid)
				end
			end    
		end
		return players
	end 
	
    local function doTeleportToOnlinePlayers(cid)
		local trainerArea = {{x = 1022, y = 1026, z = 7}, {x = 1025, y = 1029, z = 7}}  --- {canto superior direito}, {canto inferior direito} - pegando a area toda
		local playersTrainer = getAllPlayersInArea(trainerArea[1], trainerArea[2])
		
        local ons = getPlayersOnline()
        if #ons < 2 then
            return doPlayerSendCancel(cid, "Don't have any player online, beyond you.")
        end
		
		for index, jogador in ipairs(ons) do
			for index2, jogador2 in ipairs(playersTrainer) do
				if (ons[index] == playersTrainer[index2]) then
					table.remove(ons, index)
				end
			end
		end
			
        local player_rand = ons[math.random(#ons)]		
		if (player_rand == cid) then
            return false
        end
		
        local pos = getClosestFreeTile(cid, getThingPos(player_rand), true, false)
        if(not pos or isInArray({pos.x, pos.y}, 0)) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Cannot perform action.")
            return true
        end

        local tmp = getThingPos(cid)
        if(doTeleportThing(cid, pos, true) and (not isPlayerGhost(cid))) then
            doSendMagicEffect(tmp, CONST_ME_POFF)
            doSendMagicEffect(pos, CONST_ME_TELEPORT)
        end
        return true
    end
	doTeleportToOnlinePlayers(cid)
	return true
end

 

Editado por lordzetros (veja o histórico de edições)

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites
47 minutos atrás, poko360 disse:

agora sim 100%, mt obrigado, REP+

Opa, que bom que resolveu, fiz uma pequena modificação numa verificação que se tornava inútil, se quiser copiar o novo código, ^^. Abç.

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites

@poko360 Tem certeza? Aqui tá normal, o.O. Vou atualizar novamente.

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

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