diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..03a93b3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.java] +indent_style = tab +indent_size = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_style = spaces +indent_size = 2 +trim_trailing_whitespace = true + diff --git a/pom.xml b/pom.xml index d4ce54f..a1841df 100644 --- a/pom.xml +++ b/pom.xml @@ -1,15 +1,15 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.dre brewery - 1.3.2 + 1.4.0 Brewery - UTF-8 - UTF-8 + UTF-8 + UTF-8 @@ -33,10 +33,10 @@ maven-compiler-plugin - 3.1 + 2.5.1 - 1.6 - 1.6 + 1.7 + 1.7 UTF-8 @@ -47,35 +47,19 @@ spigot-repo https://hub.spigotmc.org/nexus/content/groups/public/ - - true - always - - - - vault-repo - http://nexus.theyeticave.net/content/repositories/pub_releases - - + + vault-repo + http://nexus.theyeticave.net/content/repositories/pub_releases + + sk89q-repo - http://maven.sk89q.com/artifactory/repo/ - - true - always - + http://maven.sk89q.com/repo/ - - - dre-repo - http://server.die-reiche-erethons.com/maven2 - - true - always - - - addstar-repo http://maven.addstar.com.au/artifactory/ext-release-local/ @@ -84,60 +68,44 @@ always - + + md_5-releases + http://repo.md-5.net/content/repositories/releases/ + - - org.spigotmc - spigot-api - 1.8-R0.1-SNAPSHOT + org.bukkit + bukkit + 1.9-R0.1-SNAPSHOT + + + net.milkbowl.vault + VaultAPI + 1.5 + provided - - - net.milkbowl.vault - VaultAPI - 1.5 - provided - - com.sk89q worldguard - 6.0.0-SNAPSHOT + 6.1 - - com.dre - managerxl - 0.0.1-SNAPSHOT - compile - jar + com.griefcraft.lwc + LWCPlugin + 1.7.2 - - - com.griefcraft - lwc - 4.4.0 - compile - jar - - me.ryanhamshire - griefprevention - 7.8 + GriefPrevention + 14.5.1 compile - jar - - de.diddiz.LogBlock - LogBlock - 1.80 - compile - jar + de.diddiz + logblock + 1.94 diff --git a/resources/plugin.yml b/resources/plugin.yml index bb0bf5f..8ff27f3 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,7 +1,7 @@ name: Brewery -version: 1.3.2 +version: 1.4.0 main: com.dre.brewery.P -authors: [Milan Albrecht, Frank Baumann] +authors: [Milan Albrecht, Frank Baumann, ProgrammerDan] softdepend: [LWC, LogBlock, WorldGuard, GriefPrevention, Vault] commands: brewery: @@ -110,4 +110,4 @@ permissions: brewery.bypass.overdrink: description: Will despite config-setting not be kicked on overdrink brewery.bypass.teleport: - description: Will despite config-setting not be teleported on login \ No newline at end of file + description: Will despite config-setting not be teleported on login diff --git a/src/com/dre/brewery/BIngredients.java b/src/com/dre/brewery/BIngredients.java index 2a7874b..e26896c 100644 --- a/src/com/dre/brewery/BIngredients.java +++ b/src/com/dre/brewery/BIngredients.java @@ -1,16 +1,15 @@ package com.dre.brewery; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.HashMap; import java.util.Set; - +import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; -import org.bukkit.Material; -import org.bukkit.potion.PotionEffectType; import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffectType; public class BIngredients { public static Set possibleIngredients = new HashSet(); @@ -84,7 +83,11 @@ public class BIngredients { Brew.addOrReplaceEffects(potionMeta, brew.getEffects(), brew.getQuality()); cookedName = cookRecipe.getName(quality); - potion.setDurability(Brew.PotionColor.valueOf(cookRecipe.getColor()).getColorId(false)); + if (P.use1_9) { + potionMeta.setMainEffect(Brew.PotionColor.valueOf(cookRecipe.getColor()).getEffect()); + } else { + potion.setDurability(Brew.PotionColor.valueOf(cookRecipe.getColor()).getColorId(false)); + } } else { // new base potion @@ -92,14 +95,22 @@ public class BIngredients { if (state <= 1) { cookedName = P.p.languageReader.get("Brew_ThickBrew"); - potion.setDurability(Brew.PotionColor.BLUE.getColorId(false)); + if (P.use1_9) { + potionMeta.setMainEffect(Brew.PotionColor.BLUE.getEffect()); + } else { + potion.setDurability(Brew.PotionColor.BLUE.getColorId(false)); + } } else { for (Material ingredient : materials.keySet()) { if (cookedNames.containsKey(ingredient)) { // if more than half of the ingredients is of one kind if (materials.get(ingredient) > (getIngredientsCount() / 2)) { cookedName = cookedNames.get(ingredient); - potion.setDurability(Brew.PotionColor.CYAN.getColorId(true)); + if (P.use1_9) { + potionMeta.setMainEffect(Brew.PotionColor.CYAN.getEffect()); + } else { + potion.setDurability(Brew.PotionColor.CYAN.getColorId(true)); + } } } } @@ -108,7 +119,11 @@ public class BIngredients { if (cookedName == null) { // if no name could be found cookedName = P.p.languageReader.get("Brew_Undefined"); - potion.setDurability(Brew.PotionColor.CYAN.getColorId(true)); + if (P.use1_9) { + potionMeta.setMainEffect(Brew.PotionColor.CYAN.getEffect()); + } else { + potion.setDurability(Brew.PotionColor.CYAN.getColorId(true)); + } } potionMeta.setDisplayName(P.p.color("&f" + cookedName)); diff --git a/src/com/dre/brewery/BPlayer.java b/src/com/dre/brewery/BPlayer.java index ed198a1..c577433 100644 --- a/src/com/dre/brewery/BPlayer.java +++ b/src/com/dre/brewery/BPlayer.java @@ -1,22 +1,21 @@ package com.dre.brewery; import java.util.ArrayList; -import java.util.Map; import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.UUID; - +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.entity.Player; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.Material; -import org.bukkit.util.Vector; -import org.bukkit.Location; import org.bukkit.potion.PotionEffectType; -import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.util.Vector; public class BPlayer { private static Map players = new HashMap();// Players name/uuid and BPlayer @@ -339,10 +338,6 @@ public class BPlayer { Location home = null; if (homeType.equalsIgnoreCase("bed")) { home = player.getBedSpawnLocation(); - } else if (homeType.equalsIgnoreCase("ManagerXL")) { - if (com.dre.managerxl.MPlayer.get(player.getName()) != null) { - home = com.dre.managerxl.MPlayer.get(player.getName()).getHome(); - } } else if (homeType.startsWith("cmd: ")) { player.performCommand(homeType.substring(5)); } else if (homeType.startsWith("cmd:")) { diff --git a/src/com/dre/brewery/BRecipe.java b/src/com/dre/brewery/BRecipe.java index 320a832..d772dc9 100644 --- a/src/com/dre/brewery/BRecipe.java +++ b/src/com/dre/brewery/BRecipe.java @@ -2,9 +2,8 @@ package com.dre.brewery; import java.util.ArrayList; import java.util.List; - -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffectType; @@ -205,7 +204,11 @@ public class BRecipe { Brew brew = new Brew(uid, bIngredients, quality, distillruns, getAge(), wood, getName(5), false, false, true); - potion.setDurability(Brew.PotionColor.valueOf(getColor()).getColorId(false)); + if (P.use1_9) { + potionMeta.setMainEffect(Brew.PotionColor.valueOf(getColor()).getEffect()); + } else { + potion.setDurability(Brew.PotionColor.valueOf(getColor()).getColorId(false)); + } potionMeta.setDisplayName(P.p.color("&f" + getName(quality))); // This effect stores the UID in its Duration potionMeta.addCustomEffect((PotionEffectType.REGENERATION).createEffect((uid * 4), 0), true); diff --git a/src/com/dre/brewery/Brew.java b/src/com/dre/brewery/Brew.java index 546f131..eb89a14 100644 --- a/src/com/dre/brewery/Brew.java +++ b/src/com/dre/brewery/Brew.java @@ -1,22 +1,20 @@ package com.dre.brewery; -import java.util.Map; -import java.util.HashMap; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; - +import java.util.Map; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.BrewerInventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import org.bukkit.inventory.BrewerInventory; public class Brew { // represents the liquid in the brewed Potions - public static Map potions = new HashMap(); public static Boolean colorInBarrels; // color the Lore while in Barrels public static Boolean colorInBrewer; // color the Lore while in Brewer @@ -87,7 +85,6 @@ public class Brew { return null; } - // returns UID of custom Potion item public static int getUID(ItemStack item) { return getUID((PotionMeta) item.getItemMeta()); @@ -210,7 +207,7 @@ public class Brew { alc *= 1 - ((float) (10 - quality) * 0.04); // distillable Potions should have half alc after one and full alc after all needed distills alc /= 2; - alc *= 1.0F + ((float) distillRuns / currentRecipe.getDistillRuns()) ; + alc *= 1.0F + ((float) distillRuns / currentRecipe.getDistillRuns()); } else { // quality decides 10% - 100% alc *= ((float) quality / 10.0); @@ -294,7 +291,15 @@ public class Brew { this.stat = stat; if (currentRecipe != null && canDistill()) { if (stat) { - potion.setDurability(PotionColor.valueOf(currentRecipe.getColor()).getColorId(false)); + if (P.use1_9) { + PotionMeta potionMeta = (PotionMeta) potion.getItemMeta(); + potionMeta.setMainEffect(PotionColor.valueOf(currentRecipe.getColor()).getEffect()); + } else { + potion.setDurability(PotionColor.valueOf(currentRecipe.getColor()).getColorId(false)); + } + } else if (P.use1_9) { + PotionMeta potionMeta = (PotionMeta) potion.getItemMeta(); + potionMeta.setMainEffect(PotionColor.valueOf(currentRecipe.getColor()).getEffect()); } else { potion.setDurability(PotionColor.valueOf(currentRecipe.getColor()).getColorId(true)); } @@ -302,7 +307,6 @@ public class Brew { } // Distilling section --------------- - // distill all custom potions in the brewer public static void distillAll(BrewerInventory inv, Boolean[] contents) { int slot = 0; @@ -332,12 +336,21 @@ public class Brew { addOrReplaceEffects(potionMeta, getEffects(), quality); potionMeta.setDisplayName(P.p.color("&f" + recipe.getName(quality))); - slotItem.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(canDistill())); + if (P.use1_9) { + potionMeta.setMainEffect(PotionColor.valueOf(recipe.getColor()).getEffect()); + } else { + slotItem.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(canDistill())); + } + } else { quality = 0; removeEffects(potionMeta); potionMeta.setDisplayName(P.p.color("&f" + P.p.languageReader.get("Brew_DistillUndefined"))); - slotItem.setDurability(PotionColor.GREY.getColorId(canDistill())); + if (P.use1_9) { + potionMeta.setMainEffect(PotionColor.GREY.getEffect()); + } else { + slotItem.setDurability(PotionColor.GREY.getColorId(canDistill())); + } } // Distill Lore @@ -356,7 +369,6 @@ public class Brew { } // Ageing Section ------------------ - public void age(ItemStack item, float time, byte woodType) { if (stat) { return; @@ -364,15 +376,13 @@ public class Brew { PotionMeta potionMeta = (PotionMeta) item.getItemMeta(); ageTime += time; - + // if younger than half a day, it shouldnt get aged form if (ageTime > 0.5) { if (wood == 0) { wood = woodType; - } else { - if (wood != woodType) { - woodShift(time, woodType); - } + } else if (wood != woodType) { + woodShift(time, woodType); } BRecipe recipe = ingredients.getAgeRecipe(wood, ageTime, distillRuns > 0); if (recipe != null) { @@ -381,12 +391,20 @@ public class Brew { addOrReplaceEffects(potionMeta, getEffects(), quality); potionMeta.setDisplayName(P.p.color("&f" + recipe.getName(quality))); - item.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(canDistill())); + if (P.use1_9) { + potionMeta.setMainEffect(PotionColor.valueOf(recipe.getColor()).getEffect()); + } else { + item.setDurability(PotionColor.valueOf(recipe.getColor()).getColorId(canDistill())); + } } else { quality = 0; removeEffects(potionMeta); potionMeta.setDisplayName(P.p.color("&f" + P.p.languageReader.get("Brew_BadPotion"))); - item.setDurability(PotionColor.GREY.getColorId(canDistill())); + if (P.use1_9) { + potionMeta.setMainEffect(PotionColor.GREY.getEffect()); + } else { + item.setDurability(PotionColor.GREY.getColorId(canDistill())); + } } } @@ -434,7 +452,6 @@ public class Brew { } // Lore ----------- - // Converts to/from qualitycolored Lore public void convertLore(PotionMeta meta, Boolean toQuality) { if (currentRecipe == null) { @@ -521,14 +538,12 @@ public class Brew { if (currentRecipe.getWood() > 0) { int quality = ingredients.getWoodQuality(currentRecipe, wood); addOrReplaceLore(meta, getQualityColor(quality), P.p.languageReader.get("Brew_Woodtype")); - } else { - if (meta.hasLore()) { - List existingLore = meta.getLore(); - int index = indexOfSubstring(existingLore, P.p.languageReader.get("Brew_Woodtype")); - if (index > -1) { - existingLore.remove(index); - meta.setLore(existingLore); - } + } else if (meta.hasLore()) { + List existingLore = meta.getLore(); + int index = indexOfSubstring(existingLore, P.p.languageReader.get("Brew_Woodtype")); + if (index > -1) { + existingLore.remove(index); + meta.setLore(existingLore); } } } @@ -587,7 +602,7 @@ public class Brew { } // True if the PotionMeta has colored Lore - public static Boolean hasColorLore(PotionMeta meta) { + public static Boolean hasColorLore(PotionMeta meta) { return meta.hasLore() && !meta.getLore().get(1).startsWith(P.p.color("&7")); } @@ -645,23 +660,25 @@ public class Brew { } public static enum PotionColor { - PINK(1), - CYAN(2), - ORANGE(3), - GREEN(4), - BRIGHT_RED(5), - BLUE(6), - BLACK(8), - RED(9), - GREY(10), - WATER(11), - DARK_RED(12), - BRIGHT_GREY(14); + PINK(1, PotionEffectType.REGENERATION), + CYAN(2, PotionEffectType.SPEED), + ORANGE(3, PotionEffectType.FIRE_RESISTANCE), + GREEN(4, PotionEffectType.POISON), + BRIGHT_RED(5, PotionEffectType.HEAL), + BLUE(6, PotionEffectType.NIGHT_VISION), + BLACK(8, PotionEffectType.WEAKNESS), + RED(9, PotionEffectType.INCREASE_DAMAGE), + GREY(10, PotionEffectType.SLOW), + WATER(11, PotionEffectType.WATER_BREATHING), + DARK_RED(12, PotionEffectType.HARM), + BRIGHT_GREY(14, PotionEffectType.INVISIBILITY); private final int colorId; + private final PotionEffectType effect; - private PotionColor(int colorId) { + private PotionColor(int colorId, PotionEffectType effect) { this.colorId = colorId; + this.effect = effect; } // gets the Damage Value, that sets a color on the potion @@ -672,6 +689,11 @@ public class Brew { } return (short) (colorId + 32); } + + public PotionEffectType getEffect() { + return effect; + } + } -} \ No newline at end of file +} diff --git a/src/com/dre/brewery/P.java b/src/com/dre/brewery/P.java index c69fabb..f71d447 100644 --- a/src/com/dre/brewery/P.java +++ b/src/com/dre/brewery/P.java @@ -1,46 +1,44 @@ package com.dre.brewery; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; -import java.util.List; -import java.util.ArrayList; -import java.util.ListIterator; -import java.util.HashMap; -import java.io.IOException; -import java.io.File; -import java.util.UUID; - -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.configuration.ConfigurationSection; - +import com.dre.brewery.filedata.*; +import com.dre.brewery.integration.LogBlockBarrel; import com.dre.brewery.integration.WGBarrel; import com.dre.brewery.integration.WGBarrelNew; import com.dre.brewery.integration.WGBarrelOld; -import org.apache.commons.lang.math.NumberUtils; -import org.bukkit.event.HandlerList; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.block.Block; - import com.dre.brewery.listeners.*; -import com.dre.brewery.filedata.*; -import com.dre.brewery.integration.LogBlockBarrel; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.UUID; +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; public class P extends JavaPlugin { public static P p; public static String configVersion = "1.3.1"; public static boolean debug; public static boolean useUUID; + public static boolean use1_9; public static boolean updateCheck; // Third Party Enabled @@ -57,6 +55,7 @@ public class P extends JavaPlugin { public EntityListener entityListener; public InventoryListener inventoryListener; public WorldListener worldListener; + public Compat1_9 compat1_9; // Language public String language; @@ -68,7 +67,12 @@ public class P extends JavaPlugin { // Version check String v = Bukkit.getBukkitVersion(); - useUUID = !v.matches(".*1\\.[1-6].*") && !v.matches(".*1\\.7\\.[0-5].*"); + useUUID = !v.matches(".*1\\.[0-6].*") && !v.matches(".*1\\.7\\.[0-5].*"); + use1_9 = !v.matches(".*1\\.[0-8].*"); + if (use1_9) { + log("&cExperimental support for Bukkit 1.9 enabled."); + log("&cPlease note that the changes of 1.9 make a build of Brewery with the same quality as for older versions impossible."); + } // load the Config try { @@ -94,6 +98,7 @@ public class P extends JavaPlugin { entityListener = new EntityListener(); inventoryListener = new InventoryListener(); worldListener = new WorldListener(); + compat1_9 = new Compat1_9(); getCommand("Brewery").setExecutor(new CommandListener()); p.getServer().getPluginManager().registerEvents(blockListener, p); @@ -101,6 +106,9 @@ public class P extends JavaPlugin { p.getServer().getPluginManager().registerEvents(entityListener, p); p.getServer().getPluginManager().registerEvents(inventoryListener, p); p.getServer().getPluginManager().registerEvents(worldListener, p); + if (use1_9) { + p.getServer().getPluginManager().registerEvents(compat1_9, p); + } // Heartbeat p.getServer().getScheduler().runTaskTimer(p, new BreweryRunnable(), 650, 1200); diff --git a/src/com/dre/brewery/integration/GriefPreventionBarrel.java b/src/com/dre/brewery/integration/GriefPreventionBarrel.java index a992d16..421c42f 100644 --- a/src/com/dre/brewery/integration/GriefPreventionBarrel.java +++ b/src/com/dre/brewery/integration/GriefPreventionBarrel.java @@ -1,42 +1,47 @@ package com.dre.brewery.integration; +import com.dre.brewery.P; +import me.ryanhamshire.GriefPrevention.Claim; +import me.ryanhamshire.GriefPrevention.GriefPrevention; +import me.ryanhamshire.GriefPrevention.PlayerData; import org.bukkit.block.Block; import org.bukkit.entity.Player; -import com.dre.brewery.P; -import me.ryanhamshire.GriefPrevention.Configuration.WorldConfig; -import me.ryanhamshire.GriefPrevention.GriefPrevention; -import me.ryanhamshire.GriefPrevention.Messages; -import me.ryanhamshire.GriefPrevention.PlayerData; -import me.ryanhamshire.GriefPrevention.TextMode; - public class GriefPreventionBarrel { + + static P brewery = P.p; + static GriefPrevention griefPrevention = GriefPrevention.instance; + public static boolean checkAccess(Player player, Block sign) { + PlayerData playerData = griefPrevention.dataStore.getPlayerData(player.getUniqueId()); - WorldConfig wc = GriefPrevention.instance.getWorldCfg(player.getWorld()); - /*if (!wc.Enabled()) { + if (!griefPrevention.claimsEnabledForWorld(player.getWorld()) || playerData.ignoreClaims || !griefPrevention.config_claims_preventTheft) { return true; - }*/ - - PlayerData playerData = GriefPrevention.instance.dataStore.getPlayerData(player.getName()); + } // block container use during pvp combat - if (playerData.inPvpCombat() && wc.getPvPBlockContainers()) { - GriefPrevention.sendMessage(player, TextMode.Err, Messages.PvPNoContainers); + if (playerData.inPvpCombat()) { + brewery.msg(player, brewery.languageReader.get("Error_NoBarrelAccess")); return false; } // check permissions for the claim the Barrel is in - if (wc.getContainersRules().Allowed(sign.getLocation(), player, true).Denied()) { - P.p.msg(player, P.p.languageReader.get("Error_NoBarrelAccess")); - return false; + Claim claim = griefPrevention.dataStore.getClaimAt(sign.getLocation(), false, playerData.lastClaim); + if (claim != null) { + playerData.lastClaim = claim; + String noContainersReason = claim.allowContainers(player); + if (noContainersReason != null) { + brewery.msg(player, brewery.languageReader.get("Error_NoBarrelAccess")); + return false; + } } // drop any pvp protection, as the player opens a barrel if (playerData.pvpImmune) { playerData.pvpImmune = false; - GriefPrevention.sendMessage(player, TextMode.Warn, Messages.PvPImmunityEnd); } + return true; } + } diff --git a/src/com/dre/brewery/listeners/Compat1_9.java b/src/com/dre/brewery/listeners/Compat1_9.java new file mode 100644 index 0000000..c42fca8 --- /dev/null +++ b/src/com/dre/brewery/listeners/Compat1_9.java @@ -0,0 +1,31 @@ +package com.dre.brewery.listeners; + +import com.dre.brewery.Brew; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; + +// Workaround to remove unwanted potion effects +public class Compat1_9 implements Listener { + + @EventHandler + public void onPlayerDrink(PlayerItemConsumeEvent event) { + ItemStack item = event.getItem(); + Brew brew = Brew.get(item); + if (brew == null) { + return; + } + + if (item.getType() == Material.POTION) { + try { + PotionMeta meta = (PotionMeta) item.getItemMeta(); + meta.setMainEffect(null); + item.setItemMeta(meta); + } catch (Exception exception) {} + } + } + +} diff --git a/src/com/dre/brewery/listeners/InventoryListener.java b/src/com/dre/brewery/listeners/InventoryListener.java index dea31a0..c75aed6 100644 --- a/src/com/dre/brewery/listeners/InventoryListener.java +++ b/src/com/dre/brewery/listeners/InventoryListener.java @@ -1,16 +1,28 @@ package com.dre.brewery.listeners; +import java.util.HashMap; +import java.util.HashSet; +import java.util.UUID; + +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.BrewingStand; +import org.bukkit.entity.HumanEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.BrewEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryPickupItemEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.BrewerInventory; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.Bukkit; import org.bukkit.Material; import com.dre.brewery.Barrel; @@ -18,8 +30,148 @@ import com.dre.brewery.Brew; import com.dre.brewery.P; import com.dre.brewery.integration.LogBlockBarrel; +/** + * Updated for 1.9 to replicate the "Brewing" process for distilling. + * Because of how metadata has changed, the brewer no longer triggers as previously described. + * So, I've added some event tracking and manual forcing of the brewing "animation" if the + * set of ingredients in the brewer can be distilled. + * Nothing here should interfere with vanilla brewing. + * + * Note in testing I did discover a few ways to "hack" brewing to distill your brews alongside + * potions; put fuel and at least one "valid" water bottle w/ a brewing component. You can distill + * two brews this way, just remove them before the "final" distillation or you will actually + * brew the potion as well. + * + * @author ProgrammerDan (1.9 distillation update only) + */ public class InventoryListener implements Listener { + + /* === Recreating manually the prior BrewEvent behavior. === */ + private HashSet trackedBrewmen = new HashSet(); + private HashMap trackedBrewers = new HashMap(); + + /** + * Start tracking distillation for a person when they open the brewer window. + * @param event + */ + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onBrewerOpen(InventoryOpenEvent event) { + if (!P.use1_9) return; + HumanEntity player = event.getPlayer(); + Inventory inv = event.getInventory(); + if (player == null || inv == null || !(inv instanceof BrewerInventory)) return; + + P.p.debugLog("Starting brew inventory tracking"); + trackedBrewmen.add(player.getUniqueId()); + } + + /** + * Stop tracking distillation for a person when they close the brewer window. + * @param event + */ + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onBrewerClose(InventoryCloseEvent event) { + if (!P.use1_9) return; + HumanEntity player = event.getPlayer(); + Inventory inv = event.getInventory(); + if (player == null || inv == null || !(inv instanceof BrewerInventory)) return; + + P.p.debugLog("Stopping brew inventory tracking"); + trackedBrewmen.remove(player.getUniqueId()); + } + /** + * Clicking can either start or stop the new brew distillation tracking. + * Note that server restart will halt any ongoing brewing processes and + * they will _not_ restart until a new click event. + * + * @param event the Click event. + */ + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onBrewerClick(InventoryClickEvent event) { + if (!P.use1_9) return; + HumanEntity player = event.getWhoClicked(); + Inventory inv = event.getInventory(); + if (player == null || inv == null || !(inv instanceof BrewerInventory)) return; + + UUID puid = player.getUniqueId(); + if (!trackedBrewmen.contains(puid)) return; + + if (InventoryType.BREWING != inv.getType()) return; + + BrewerInventory brewer = (BrewerInventory) inv; + final Block brewery = brewer.getHolder().getBlock(); + + // If we were already tracking the brewer, cancel any ongoing event due to the click. + Integer curTask = trackedBrewers.get(brewery); + if (curTask != null) { + Bukkit.getScheduler().cancelTask(curTask); // cancel prior + } + + // Now check if we should bother to track it. + trackedBrewers.put(brewery, new BukkitRunnable() { + private int brewTime = 401; + @Override + public void run() { + BlockState now = brewery.getState(); + if (now instanceof BrewingStand) { + BrewingStand stand = (BrewingStand) now; + // check if still custom + BrewerInventory brewer = stand.getInventory(); + if (isCustomAndDistill(brewer) ) { + + // Still a valid brew distillation + brewTime = brewTime - 1; // count down. + stand.setBrewingTime(brewTime); // arbitrary for now + + if (brewTime <= 1) { // Done! + BrewEvent doBrew = new BrewEvent(brewery, brewer); + Bukkit.getServer().getPluginManager().callEvent(doBrew); + if (!doBrew.isCancelled()) { // BrewEvent _wasn't_ cancelled. + this.cancel(); + trackedBrewers.remove(brewery); + stand.setBrewingTime(0); + P.p.debugLog("All done distilling"); + } else { + brewTime = 401; // go again. + P.p.debugLog("Can distill more! Continuing."); + } + } + } else { + this.cancel(); + trackedBrewers.remove(brewery); + } + } else { + this.cancel(); + trackedBrewers.remove(brewery); + P.p.debugLog("The block was replaced; not a brewing stand."); + } + } + }.runTaskTimer(P.p, 2l, 1l).getTaskId()); + } + + private boolean isCustomAndDistill(BrewerInventory brewer) { + ItemStack item = brewer.getItem(3); // ingredient + if (item == null || Material.GLOWSTONE_DUST != item.getType()) return false; // need dust in the top slot. + Boolean[] contents = new Boolean[3]; + for (int slot = 0; slot < 3; slot++) { + item = brewer.getItem(slot); + contents[slot] = false; + if (item != null) { + if (item.getType() == Material.POTION) { + if (item.hasItemMeta()) { + int uid = Brew.getUID(item); + Brew pot = Brew.potions.get(uid); + if (pot != null && pot.canDistill()) { // need at least one distillable potion. + return true; + } + } + } + } + } + return false; + } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onBrew(BrewEvent event) { int slot = 0;