package de.tobiyas.racesandclasses.addins.food; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.APIs.LanguageAPI; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager; import de.tobiyas.racesandclasses.translation.languages.Keys; import de.tobiyas.util.schedule.DebugBukkitRunnable; public class FoodManager implements Listener { /** * The plugin to use for calls. */ private final RacesAndClasses plugin; /** * The map of currently eating people. */ private final Map<RaCPlayer,Food> eating = new HashMap<RaCPlayer, Food>(); /** * the task for the Eat-Ticker. */ private BukkitTask task; public FoodManager(RacesAndClasses plugin) { this.plugin = plugin; } public void reload(){ //First unregister + kill old task: HandlerList.unregisterAll(this); if(task != null) task.cancel(); eating.clear(); //Now check if enabled: if(!plugin.getConfigManager().getGeneralConfig().isConfig_food_enabled()) return; plugin.registerEvents(this); task = new DebugBukkitRunnable("FoodListenerEating"){ @Override protected void runIntern() { Iterator<Entry<RaCPlayer,Food>> it = eating.entrySet().iterator(); while(it.hasNext()){ Entry<RaCPlayer,Food> entry = it.next(); RaCPlayer player = entry.getKey(); if(!player.isOnline()){ it.remove(); continue; } Food food = entry.getValue(); food.tick(player); if(!food.isValid()) { LanguageAPI.sendTranslatedMessage(player, Keys.food_finished); it.remove(); } } } }.runTaskTimer(plugin, 20 * 1, 20 * 1); } @SuppressWarnings("deprecation") @EventHandler public void playerInteract(PlayerInteractEvent event){ //only RightClick is accepted. if(!(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) return; RaCPlayer player = RaCPlayerManager.get().getPlayer(event.getPlayer()); if(eating.containsKey(player)) return; //player is moving. if(event.getPlayer().getVelocity().length() > 0.1) return; //already eating. if(eating.containsKey(player)) return; ItemStack item = event.getItem(); if(item == null) return; Food food = new Food(item); if(food.isValid()){ event.setCancelled(true); //Player has max health. if(player.getHealth() >= player.getMaxHealth()){ LanguageAPI.sendTranslatedMessage(player, Keys.health_full); return; } item.setAmount(item.getAmount() - 1); player.getPlayer().setItemInHand(item); eating.put(player, food); LanguageAPI.sendTranslatedMessage(player, Keys.food_eat); } } @EventHandler public void playerMove(PlayerMoveEvent event){ if(event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) return; RaCPlayer player = RaCPlayerManager.get().getPlayer(event.getPlayer()); if(!eating.containsKey(player)) return; eating.remove(player); LanguageAPI.sendTranslatedMessage(player, Keys.food_cancle); } }