package de.tobiyas.racesandclasses.addins.potions;
import static de.tobiyas.racesandclasses.translation.languages.Keys.health_full;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.bukkit.ChatColor;
import org.bukkit.Effect;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.Potion;
import org.bukkit.potion.PotionType;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.APIs.LanguageAPI;
import de.tobiyas.racesandclasses.APIs.LevelAPI;
import de.tobiyas.racesandclasses.playermanagement.health.HealthManager;
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;
@SuppressWarnings("deprecation")
public class HealthPotionManager implements Listener {
/**
* The Cooldown of the potion (default: 10 seconds)
*/
private final int HEALTH_POTION_COOLDOWN = 20 * 10;
/**
* the plugin to use.
*/
private final RacesAndClasses plugin;
/**
* the list of names for mana-potions.
*/
private final List<String> HEALTH_POTION_NAMES = Arrays.asList("HealingPotion", "HeilTrank");
/**
* people with cooldown on Health flasks.
*/
private final Set<UUID> cooldown = new HashSet<UUID>();
public HealthPotionManager(RacesAndClasses plugin) {
this.plugin = plugin;
}
public void reload(){
cooldown.clear();
HandlerList.unregisterAll(this);
plugin.registerEvents(this);
}
@EventHandler
public void healthPotionUsed(PlayerInteractEvent event){
ItemStack item = event.getItem();
if(item == null) return;
if(!item.hasItemMeta()) return;
if(!item.getItemMeta().hasDisplayName()) return;
if(!item.getItemMeta().hasLore()) return;
if(item.getItemMeta().getLore().size() < 1) return;
String itemName = item.getItemMeta().getDisplayName().toLowerCase();
itemName = ChatColor.stripColor(itemName.toLowerCase());
//looking for the Name of the potion.
boolean found = false;
for(String name : HEALTH_POTION_NAMES){
name = name.toLowerCase();
if(itemName.contains(name)){
found = true;
break;
}
}
if(!found) return;
//looking for any line with: 'XX Health'.
int health = 0;
int minLevel = 0;
for(String loreLine : item.getItemMeta().getLore()){
loreLine = ChatColor.stripColor(loreLine.toLowerCase());
if(loreLine.contains("health") || loreLine.contains("leben")) {
String manaLine = loreLine.replaceAll("[^0-9]", "");
try{ health = Integer.parseInt(manaLine); }catch(NumberFormatException exp){ continue; }
}
if(!loreLine.contains("level")) {
String levelLine = loreLine.replaceAll("[^0-9]", "");
try{ minLevel = Integer.parseInt(levelLine); }catch(NumberFormatException exp){ continue; }
}
}
if(health <= 0 ) return;
event.setCancelled(true);
//here we are sure to have a Health potion!
//If not enough level -> Break!
final RaCPlayer racPlayer = RaCPlayerManager.get().getPlayer(event.getPlayer());
if(minLevel > 0 && LevelAPI.getCurrentLevel(racPlayer) < minLevel){
LanguageAPI.sendTranslatedMessage(event.getPlayer(), Keys.restrictions_not_met_MinimumLevel);
return;
}
final HealthManager healthManager = racPlayer.getHealthManager();
if(healthManager.getCurrentHealth() >= healthManager.getMaxHealth()){
LanguageAPI.sendTranslatedMessage(event.getPlayer(), health_full);
return;
}
healthManager.heal(health);
cooldown.add(racPlayer.getUniqueId());
if(item.getAmount() == 1) event.getPlayer().getInventory().remove(item);
if(item.getAmount() > 1) item.setAmount(item.getAmount() - 1);
new DebugBukkitRunnable("HealthPotionCooldownRemover"){
@Override
protected void runIntern() {
cooldown.remove(racPlayer.getUniqueId());
}
}.runTaskLater(RacesAndClasses.getPlugin(), HEALTH_POTION_COOLDOWN);
event.getPlayer().getWorld().playEffect(event.getPlayer().getLocation(), Effect.POTION_BREAK, new Potion(PotionType.WATER));
}
}