Ir para conteúdo

Laço for repetindo a mensagem enviada


joao100101

Posts Recomendados

Olá pessoal, estou com uma dúvida aqui.

Estou tentando criar um pl de chat ak e criei um laço for que loopa as coordenadas do player e checa se tem algum player online próximo a elas. O que acontece é que a mensagem fica sendo enviada duas vezes quando ele está longe de todo mundo, já tentei usar return; break; e.setCancelled(true);.  Código abaixo:

		for (Player all : Bukkit.getOnlinePlayers()) {
			double x = p.getLocation().getX() + 100;
			double y = p.getLocation().getY() + 100;
			double z = p.getLocation().getZ() + 100;
			if (Bukkit.getOnlinePlayers().size() > 1) {
				if (all.getLocation().getX() < x) {
					if (all.getLocation().getY() < y) {
						if (all.getLocation().getZ() < z) {
							all.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
						} else {
							p.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
							p.sendMessage("§eNinguém proximo para te escutar.");
						}
					} else {
						p.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
						p.sendMessage("§eNinguém proximo para te escutar.");
					}

 

Alguém poderia me ajudar com uma possível solução?

Link para o comentário
Compartilhar em outros sites

Meu amigo, tem bastante coisa errada por aí.

Começando pela maneira que você está usando para checar.

Você está chegando se o x,y,z é menor que o do player, e não se ele está perto.

Vamos supor que o player que mandou a mensagem está no x 1650.

daí todo player que tiver com x abaixo de 1650 vai escutar o que ele falou.

No caso eu te recomendo à utilizar o ``Player#getNearByEntities``

Exemplo: 

  List<Entity> entities = p.getNearbyEntities(100, 50, 100)
                .stream().filter(it -> it instanceof Player)
                .collect(Collectors.toList());

  if (!entities.isEmpty()) {
  	for (Entity entity : entities) {
    		Player player = ((Player) entity);
  		player.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
  	}
  } else{
    p.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
    p.sendMessage("§eNinguém proximo para te escutar.");
  }

 

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

1 hora atrás, Rafaelrain disse:

Meu amigo, tem bastante coisa errada por aí.

Começando pela maneira que você está usando para checar.

Você está chegando se o x,y,z é menor que o do player, e não se ele está perto.

Vamos supor que o player que mandou a mensagem está no x 1650.

daí todo player que tiver com x abaixo de 1650 vai escutar o que ele falou.

No caso eu te recomendo à utilizar o ``Player#getNearByEntities``

Exemplo: 


  List<Entity> entities = p.getNearbyEntities(100, 50, 100)
                .stream().filter(it -> it instanceof Player)
                .collect(Collectors.toList());

  if (!entities.isEmpty()) {
  	for (Entity entity : entities) {
    		Player player = ((Player) entity);
  		player.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
  	}
  } else{
    p.sendMessage("§e[l] §f" + p.getName() + "§e: " + msg + "§r");
    p.sendMessage("§eNinguém proximo para te escutar.");
  }

 

entendi, vou dar uma olhada melhor ak, vlw (y)

Link para o comentário
Compartilhar em outros sites

@EventHandler
    void chat(AsyncPlayerChatEvent e) {
        e.setCancelled(true);
        String rawMessage = e.getMessage();
        String message = "§e[l] §f"+e.getPlayer().getName()+": §7"+rawMessage;
        int distance = 50;
        for(Player pl : e.getRecipients()) {
            if(pl.getLocation().distance(e.getPlayer().getLocation()) <= distance) {
                pl.sendMessage(message);
            }
        }
    }

acredito que isso funcione (não foi testado)

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...