Ir para conteúdo

Alguem me ajuda com uma duvida


zMaster_

Posts Recomendados

Eu fiz um Plugin que quando um jogador come uma melancia ele ganha um tempo de fly.

 

public class MelanciaAerodinamica implements Listener{
	Main plugin;

	public MelanciaAerodinamica(Main plugin) {
		this.plugin = plugin;
	}
	public static Main m = (Main)Bukkit.getPluginManager().getPlugin("Mineflyaddon");
	
	int comeu = 0;
	@EventHandler
	public void comer(PlayerInteractEvent c) {		
		Player p = c.getPlayer();
		ItemStack melancia = new ItemStack(Material.SPECKLED_MELON);
		melancia.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1);
		ItemMeta m = melancia.getItemMeta();
		m.setDisplayName(ChatColor.DARK_BLUE+""+ChatColor.BOLD+"Melancia Aerodinâmica");
		ArrayList<String> lore = new ArrayList<String>();
		lore.add("");
		lore.add("§7Comendo essa melancia você recebe");
		lore.add("§7a habilidade de voar por 5 minutos!");
		lore.add("");
		lore.add("§eA cada nivel de §5Lenhador §avocê");
		lore.add("§erecebe + 1 minuto de voo.");
		lore.add("§eE caso seja VIP seu tempo de voo é");
		lore.add("§eMultiplicado por:");
		lore.add("§e2* §aVIP§e, 3* §6VIP+§e, 4* §3MVP§e.");
		m.setLore(lore);
		m.addItemFlags(ItemFlag.HIDE_ENCHANTS);
		melancia.setItemMeta(m);
		melancia.getItemMeta().addItemFlags(ItemFlag.HIDE_ENCHANTS);
			
		if ((p.getInventory().getItemInHand().isSimilar(melancia)) && melancia.getItemMeta() != null) {
			if (c.getAction().equals(Action.RIGHT_CLICK_AIR) || c.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
				
				if (p.getWorld().getName().equalsIgnoreCase("world")) {
					p.sendMessage("§cVocê não pode usar isso aqui");
					return;
				} else
					
				if (comeu == 1) {
				p.sendMessage("§cEspere seu tempo de voo acabar para usar novamente!");
					return;
				} else 	
				comeu = 1;
				p.getInventory().removeItem(melancia);
				p.playSound(p.getLocation(), Sound.EAT, 10, 1);
				int tempo = (ExperienceAPI.getLevel(p, SkillType.WOODCUTTING.getName()) + 5);
				
				if (p.hasPermission("vip.vip")) tempo = tempo * 2;	
				if (p.hasPermission("vip.vip+")) tempo = tempo * 3;
				if (p.hasPermission("vip.mvp")) tempo = tempo * 4;
				
				if (p.getAllowFlight() == false) p.setAllowFlight(true);
				
				p.sendMessage("§6§lVocê possui §e"+tempo+"§6 minutos de voo");
				
				
				// Defiantly gonna use lambda, or this would look reaaalllly bad
				Contador timer = new Contador(plugin,
				        tempo,
				        () -> p.sendMessage(ChatColor.GOLD + ""+ChatColor.BOLD+"Aproveite!"),
				        () -> {
				            p.sendMessage(ChatColor.RED + "Seu efeito de voo acabou!");
				            p.playSound(p.getLocation(), Sound.BAT_TAKEOFF, 10, 2);
				            comeu = 1;	
				           
				            // Heal everyone
				            if (p.getAllowFlight() == true) p.setAllowFlight(false);
				        },
				        (t)  -> { if (p.getWorld().getName().equalsIgnoreCase("Ilhas")) {
				        	if (p.getAllowFlight() == false) p.setAllowFlight(true);
				        	p.playSound(p.getLocation(), Sound.NOTE_SNARE_DRUM, 10, 10);
				        	p.sendMessage(ChatColor.YELLOW + "Tempo de voo restante: " + (t.getSecondsLeft()) + "/" + (t.getTotalSeconds()) + " minutos"); 
				        }
				        }
				      
				);

				// Start scheduling, don't use the "run" method unless you want to skip a second
				
				timer.scheduleTimer();
				
												
			}			
		}	
	}
}

Até ai tudo bem...

Nesse código tem uma variavel "comeu" que checa se o jogador já esta voando por causa da melancia (por padrão ela é 0 que significa que o jogador pode comer a melancia e se ela for 1 significa que o jogador esta voando e não pode comer outra melancia por enquanto, e quando termina o tempo de voo ela volta pra 0)... Mas o problema é que se um jogador comer uma melancia e ja estiver voando se outro jogador tambem uma melancia vai mandar pra ele a mensagem falando pra ele esperar o tempo de voo dele acabar.

 

Como eu posso fazer um sistema pra checar se o jogador já comeu uma melancia sem esse problema (e sem usar o p.getAllowFlight())? 

Link para o comentário
Compartilhar em outros sites

Em 09/07/2020 em 12:47, United disse:

Mas o problema é que se um jogador comer uma melancia e ja estiver voando se outro jogador tambem uma melancia vai mandar pra ele a mensagem falando pra ele esperar o tempo de voo dele acabar.

Você está usando uma variavel publica(isso quer dizer que isso será igual pra todos os jogadores), você deve salvar esses dados em um Mapa, contendo o ID do jogador e uma Integer("comeu"). Exemplo:

 

Map<UUID, Integer> flyable = new HashMap<>(32);



// Adicionar um jogador;

this.flyable.put(player.getUniqueId());



// Verificar se o jogador esta com o modo voar ativo;

Integer value = flyable.get(player.getUniqueId());

boolean isActive =  value != null && value == 1;



// Remover jogador;

int value = flyable.remove(player.getUniqueId()); // Isso retorna ao valor da integer, você pode usar caso queira.

 

Link para o comentário
Compartilhar em outros sites

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