Maticus_ Postado Setembro 14, 2018 Denunciar Compartilhar Postado Setembro 14, 2018 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 Link para o comentário Compartilhar em outros sites More sharing options...
leonardosc Postado Setembro 15, 2018 Denunciar Compartilhar Postado Setembro 15, 2018 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; } 2 Link para o comentário Compartilhar em outros sites More sharing options...
Maticus_ Postado Setembro 15, 2018 Autor Denunciar Compartilhar Postado Setembro 15, 2018 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 2 Link para o comentário Compartilhar em outros sites More sharing options...
RUSHyoutuber Postado Setembro 24, 2018 Denunciar Compartilhar Postado Setembro 24, 2018 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 More sharing options...
Maticus_ Postado Setembro 24, 2018 Autor Denunciar Compartilhar Postado Setembro 24, 2018 Resolvido. Link para o comentário Compartilhar em outros sites More sharing options...
Reset Postado Dezembro 18, 2018 Denunciar Compartilhar Postado Dezembro 18, 2018 Seu tópico foi marcado como Inativo. Para reverter está ação, entre em contato com a equipe de Moderação. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados