Ir para conteúdo

Ajuda com setMetadata e Random


Maticus_

Posts Recomendados

Estou tentando criar um plugin onde o player usa /minerar e é teleportado para o world minerar, consegui fazer com que ele fosse teleportado, porem ele sempre é teleportado para a coordenada X:0 Y:bloco mais alto Z:0 e não aleatoriamente e a outra dúvida é que tentei colocar um temporizador pra ele não ficar flodando o comando fazendo assim ficar gerando novas chunks sem parar mas não funciona como teoricamente deveria ser

Código: (nao ser colocar ele direto aqui daquele jeito bonitinho e tals)

https://pastebin.com/6LP81NKP

mas aí tenho os problemas como nas imagens anexadas, ele começa executando o else setando a Metadata, quando uso o comando /minerar a primeira vez nao acontece nada, ai uso novamente ele é teleportado

esse é meu segundo plugin, o primeiro foi para bloquear colocar/usar blocos de redstone e outros que possibilitavam dupe no servidor

image.png

image.png

image.png

Link para o comentário
Compartilhar em outros sites

Há vários problemas nesse código...

1: Tire isso:

Location cAleatorio = (Location) randomLoc.getWorld();

não faz sentido! Você está tentando converter um MUNDO para uma Localização '-'

2: O retorno dessa chamada de método

randomLoc.getWorld().getHighestBlockAt(randomLoc); 

não está sendo usado em lugar nenhum. Você deve setar o Y do randomLoc para o valor retornado por essa função. Ex:

randomLoc.setY(randomLoc.getWorld().getHighestBlockAt(randomLoc).getY());

Senão ela não terá efeito.

3: Tire isso

player.teleport(Bukkit.getWorld("minerar").getSpawnLocation());

Não faz sentido também. Você já está teleportando o jogador pra randomLoc, por que teleportar ele pro spawnLocation novamente?

4: O jogador não será teleportado na primeira vez que executar o comando pois na linha 7 você está dizendo que ele só será teleportado caso o metadado tempoMinerar exista, porém, na primeira vez que ele executar o comando, isso não existirá...

O mais correto seria verificar se o tempoMinerar existe, e se o delay já expirou antes de chegar na lógica de teleportar. Por exemplo:

if (tem o metadado tempoMinerar) {
   // verifica se o delay já expirou aqui, retorne caso não tenha expirado.
}

resto da lógica aqui...

5: A lógica do delay está errada. Você precisa verificar tempo (System.currentTimeMillis) atual MENOS o tempo que você salvou no metadado é menor que 1000.

Você está apenas pegando o tempo atual e verificando se é menor do que 1000, isso SEMPRE será falso...

 

 

Isso deve funcionar:

@Override
public boolean onCommand(CommandSender sender, Command cmd, String clabel, String[] args) {
  Player player = (Player) sender;

  if (clabel.equalsIgnoreCase("minerar")) {
    if (player.hasPermission("mts.minerar")) {

      // Verifica o delay antes de chegar na lógica do comando
      if (player.hasMetadata("tempoMinerar")) {
        System.out.println("Executado parte 4 setmetadata");
        long tempoQueFoiExecutado = player.getMetadata("tempoMinerar").get(0).asLong();
        long tempo = System.currentTimeMillis() - tempoQueFoiExecutado;
        System.out.println("Executado parte 5 long tempo");
        if (tempo <= 1000) {
          System.out.println("Executado parte 6 long verificado");
          player.sendMessage(ChatColor.GREEN + "Aguarde para usar o comando novamente");
          System.out.println("Executado parte 6 tempo igual menor 1000");
          return true;
        }
      }

      System.out.println("Executado parte 1");
      Random random = new Random();
      World world = Bukkit.getWorld("minerar");
      
      int X = 20000;
      int Z = 20000;

      int x = random.nextInt(X);
      int y = 1;
      int z = random.nextInt(Z);

      Location randomLoc = new Location(world, x, y, z);
      randomLoc.setY(randomLoc.getWorld().getHighestBlockAt(randomLoc).getY());
      
      player.teleport(randomLoc);
      System.out.println("Executado parte 2 random");

      player.sendMessage(ChatColor.GREEN + "Teleportado ao Mundo Minerar");
      player.sendMessage(ChatColor.GREEN + "Mundo de Mineracao! Aqui voce so podera coletar recursos");
      player.sendMessage(ChatColor.GREEN + "Nada que construir aqui e protegido!");
      System.out.println("Executado parte 3 teleporte e mensagens");
      
      // Você só deve setar o metadado apenas se ele executar o comando, não antes.
      player.setMetadata("tempoMinerar", new FixedMetadataValue(plugin, System.currentTimeMillis()));
    }
    else {
      player.sendMessage(ChatColor.RED + "Voce nao tem permissao para isso");
      System.out.println("sem permissao");
      return true;
    }
  }
  return false;
}

 

Link para o comentário
Compartilhar em outros sites

9 horas atrás, leonardosc disse:

Há vários problemas nesse código...

1: Tire isso:


Location cAleatorio = (Location) randomLoc.getWorld();

não faz sentido! Você está tentando converter um MUNDO para uma Localização '-'

2: O retorno dessa chamada de método


randomLoc.getWorld().getHighestBlockAt(randomLoc); 

não está sendo usado em lugar nenhum. Você deve setar o Y do randomLoc para o valor retornado por essa função. Ex:


randomLoc.setY(randomLoc.getWorld().getHighestBlockAt(randomLoc).getY());

Senão ela não terá efeito.

3: Tire isso


player.teleport(Bukkit.getWorld("minerar").getSpawnLocation());

Não faz sentido também. Você já está teleportando o jogador pra randomLoc, por que teleportar ele pro spawnLocation novamente?

4: O jogador não será teleportado na primeira vez que executar o comando pois na linha 7 você está dizendo que ele só será teleportado caso o metadado tempoMinerar exista, porém, na primeira vez que ele executar o comando, isso não existirá...

O mais correto seria verificar se o tempoMinerar existe, e se o delay já expirou antes de chegar na lógica de teleportar. Por exemplo:


if (tem o metadado tempoMinerar) {
   // verifica se o delay já expirou aqui, retorne caso não tenha expirado.
}

resto da lógica aqui...

5: A lógica do delay está errada. Você precisa verificar tempo (System.currentTimeMillis) atual MENOS o tempo que você salvou no metadado é menor que 1000.

Você está apenas pegando o tempo atual e verificando se é menor do que 1000, isso SEMPRE será falso...

 

 

Isso deve funcionar:


@Override
public boolean onCommand(CommandSender sender, Command cmd, String clabel, String[] args) {
  Player player = (Player) sender;

  if (clabel.equalsIgnoreCase("minerar")) {
    if (player.hasPermission("mts.minerar")) {

      // Verifica o delay antes de chegar na lógica do comando
      if (player.hasMetadata("tempoMinerar")) {
        System.out.println("Executado parte 4 setmetadata");
        long tempoQueFoiExecutado = player.getMetadata("tempoMinerar").get(0).asLong();
        long tempo = System.currentTimeMillis() - tempoQueFoiExecutado;
        System.out.println("Executado parte 5 long tempo");
        if (tempo <= 1000) {
          System.out.println("Executado parte 6 long verificado");
          player.sendMessage(ChatColor.GREEN + "Aguarde para usar o comando novamente");
          System.out.println("Executado parte 6 tempo igual menor 1000");
          return true;
        }
      }

      System.out.println("Executado parte 1");
      Random random = new Random();
      World world = Bukkit.getWorld("minerar");
      
      int X = 20000;
      int Z = 20000;

      int x = random.nextInt(X);
      int y = 1;
      int z = random.nextInt(Z);

      Location randomLoc = new Location(world, x, y, z);
      randomLoc.setY(randomLoc.getWorld().getHighestBlockAt(randomLoc).getY());
      
      player.teleport(randomLoc);
      System.out.println("Executado parte 2 random");

      player.sendMessage(ChatColor.GREEN + "Teleportado ao Mundo Minerar");
      player.sendMessage(ChatColor.GREEN + "Mundo de Mineracao! Aqui voce so podera coletar recursos");
      player.sendMessage(ChatColor.GREEN + "Nada que construir aqui e protegido!");
      System.out.println("Executado parte 3 teleporte e mensagens");
      
      // Você só deve setar o metadado apenas se ele executar o comando, não antes.
      player.setMetadata("tempoMinerar", new FixedMetadataValue(plugin, System.currentTimeMillis()));
    }
    else {
      player.sendMessage(ChatColor.RED + "Voce nao tem permissao para isso");
      System.out.println("sem permissao");
      return true;
    }
  }
  return false;
}

 

Muito obrigado irmão, o código deu certo, e obrigado por explicar as partes desnecessárias e tudo ❤️❤️ vamos ser amiguinhos, pode me ajudar mais pra frente kkkjkkjk

Link para o comentário
Compartilhar em outros sites

Em 15/09/2018 em 20:29, Maticus_ disse:

Muito obrigado irmão, o código deu certo, e obrigado por explicar as partes desnecessárias e tudo ❤️❤️ vamos ser amiguinhos, pode me ajudar mais pra frente kkkjkkjk

Se a sua duvida já foi resolvida então marque como resolvido.

Link para o comentário
Compartilhar em outros sites

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