package de.tobiyas.racesandclasses.playermanagement.spellmanagement.mana; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerToggleSprintEvent; import org.bukkit.util.Vector; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.resolvers.WorldResolver; import de.tobiyas.racesandclasses.eventprocessing.events.mana.ManaRegenerationEvent; import de.tobiyas.racesandclasses.util.traitutil.TraitRegionChecker; import de.tobiyas.util.schedule.DebugBukkitRunnable; import de.tobiyas.util.vollotile.ParticleEffects; import de.tobiyas.util.vollotile.VollotileCodeManager; public class ManaFoodBarRunner extends DebugBukkitRunnable implements Listener { private final ManaManager manaManager; /** * The plugin to use. */ private final RacesAndClasses plugin; /** * The Ticks for the Sprint. */ private int sprintTick = 0; /** * IF the Player is sprinting. */ private boolean isSprinting = false; public ManaFoodBarRunner(ManaManager manaManager) { super("ManaFoodbarRunner"); this.manaManager = manaManager; this.plugin = RacesAndClasses.getPlugin(); } /** * Starts this runnable. */ public void start(){ this.runTaskTimer(RacesAndClasses.getPlugin(), 10, 10); Bukkit.getPluginManager().registerEvents(this, RacesAndClasses.getPlugin()); } @Override protected void runIntern() { //sprinting is always active! if(isSprinting){ if(manaManager.getPlayer().getGameMode() != GameMode.SURVIVAL) isSprinting = false; else sprintTick++; int eventyTicksMana = plugin.getConfigManager().getGeneralConfig().getConfig_magic_sprintingManaDrainInterval() * 2; if(sprintTick >= eventyTicksMana){ double howMany = plugin.getConfigManager().getGeneralConfig().getConfig_magic_sprintingManaCost(); if(howMany > 0 || manaManager.getPlayer().getGameMode() == GameMode.SURVIVAL) { manaManager.drownMana(howMany); //also play some fancy particles. VollotileCodeManager.getVollotileCode().sendParticleEffect(ParticleEffects.ENCHANTMENT_TABLE, manaManager.getPlayer().getLocation(), new Vector(0.2, 0, 0.2), 1, 4, manaManager.getPlayer().getPlayer()); } sprintTick = 0; } } if(!isActive()) return; Player player = manaManager.getPlayer().getPlayer(); player.setFoodLevel(getLevel()); player.setSaturation(20); //just to be sure. if(plugin.getConfigManager().getGeneralConfig().getConfig_magic_sprintingManaCost() > 0 && player.getFoodLevel() <= 2 && player.isSprinting()){ isSprinting = false; player.setSprinting(false); } } private int getLevel(){ double current = this.manaManager.getCurrentMana(); double max = this.manaManager.getMaxMana(); if(max == 0) return 1; double percent = current / max; int calcedLevel = (int)Math.floor(percent * 20d); if(current == 0) calcedLevel = 0; return calcedLevel; } /** * If the Runner is active and can be used. * * @return true if active and can be used. */ private boolean isActive(){ return plugin.getConfigManager().getGeneralConfig().isConfig_useFoodManaBar() && manaManager.getPlayer().isOnline(); } @EventHandler(priority = EventPriority.LOWEST) public void foodLevelChange(FoodLevelChangeEvent event){ if(!isActive()) return; if(!TraitRegionChecker.isInDisabledLocation(event.getEntity().getLocation())) event.setCancelled(true); } @EventHandler(priority = EventPriority.LOWEST) public void damageByFoodlevel(EntityDamageEvent event){ if(event.getCause() != DamageCause.STARVATION) return; if(!event.getEntity().getUniqueId().equals(manaManager.getPlayer().getUniqueId())) return; if(!isActive()) return; if(!WorldResolver.isDisabledWorld(event.getEntity().getWorld())) { event.setCancelled(true); } } @EventHandler(priority = EventPriority.LOWEST) public void healByFoodlevel(EntityRegainHealthEvent event){ if(event.getRegainReason() != RegainReason.SATIATED) return; if(!event.getEntity().getUniqueId().equals(manaManager.getPlayer().getUniqueId())) return; if(!isActive()) return; if(!WorldResolver.isDisabledWorld(event.getEntity().getWorld())) { event.setCancelled(true); } } @EventHandler public void playerStartsSprinting(PlayerToggleSprintEvent event){ if(plugin.getConfigManager().getGeneralConfig().getConfig_magic_sprintingManaCost() <= 0) return; if(!event.getPlayer().getUniqueId().equals(manaManager.getPlayer().getUniqueId())) return; isSprinting = event.isSprinting(); if(isSprinting && manaManager.getCurrentMana() <= 2){ event.setCancelled(true); isSprinting = false; } } @EventHandler public void playerGainsMana(ManaRegenerationEvent event){ if(!event.getPlayer().getUniqueId().equals(manaManager.getPlayer().getUniqueId())) return; if(plugin.getConfigManager().getGeneralConfig().getConfig_magic_manaRefillWhileSprinting()) return; if(event.getPlayer().isSprinting()){ event.setCancelled(true); event.setAmount(0); } } @EventHandler public void playerLeave(PlayerQuitEvent event){ if(plugin.getConfigManager().getGeneralConfig().getConfig_magic_sprintingManaCost() <= 0) return; if(!event.getPlayer().getUniqueId().equals(manaManager.getPlayer().getUniqueId())) return; isSprinting = false; } }