2013-05-09 21:47:58 +02:00
|
|
|
package com.dre.brewery.listeners;
|
|
|
|
|
2016-05-18 20:28:28 +02:00
|
|
|
import com.dre.brewery.BRecipe;
|
|
|
|
import com.dre.brewery.Barrel;
|
|
|
|
import com.dre.brewery.Brew;
|
|
|
|
import com.dre.brewery.P;
|
|
|
|
import com.dre.brewery.integration.LogBlockBarrel;
|
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.Material;
|
2016-04-20 06:13:21 +02:00
|
|
|
import org.bukkit.block.Block;
|
|
|
|
import org.bukkit.block.BlockState;
|
|
|
|
import org.bukkit.block.BrewingStand;
|
|
|
|
import org.bukkit.entity.HumanEntity;
|
2013-05-09 21:47:58 +02:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.EventPriority;
|
|
|
|
import org.bukkit.event.Listener;
|
2016-05-18 20:28:28 +02:00
|
|
|
import org.bukkit.event.inventory.*;
|
2013-05-09 21:47:58 +02:00
|
|
|
import org.bukkit.inventory.BrewerInventory;
|
2016-04-20 06:13:21 +02:00
|
|
|
import org.bukkit.inventory.Inventory;
|
2016-05-18 20:28:28 +02:00
|
|
|
import org.bukkit.inventory.ItemFlag;
|
2013-05-09 21:47:58 +02:00
|
|
|
import org.bukkit.inventory.ItemStack;
|
2016-05-18 20:28:28 +02:00
|
|
|
import org.bukkit.inventory.meta.PotionMeta;
|
2016-04-20 06:13:21 +02:00
|
|
|
import org.bukkit.scheduler.BukkitRunnable;
|
2013-05-09 21:47:58 +02:00
|
|
|
|
2016-05-18 20:28:28 +02:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.UUID;
|
2013-05-09 21:47:58 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
2016-04-23 17:45:01 +02:00
|
|
|
* 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.
|
2016-04-21 07:36:26 +02:00
|
|
|
* Nothing here should interfere with vanilla brewing.
|
2016-04-23 17:45:01 +02:00
|
|
|
*
|
2016-04-21 07:36:26 +02:00
|
|
|
* 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.
|
2016-04-23 17:45:01 +02:00
|
|
|
*
|
2016-04-21 07:36:26 +02:00
|
|
|
* @author ProgrammerDan (1.9 distillation update only)
|
2016-04-21 05:55:15 +02:00
|
|
|
*/
|
2013-05-09 21:47:58 +02:00
|
|
|
public class InventoryListener implements Listener {
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-20 06:13:21 +02:00
|
|
|
/* === Recreating manually the prior BrewEvent behavior. === */
|
|
|
|
private HashSet<UUID> trackedBrewmen = new HashSet<UUID>();
|
|
|
|
private HashMap<Block, Integer> trackedBrewers = new HashMap<Block, Integer>();
|
2016-04-23 17:45:01 +02:00
|
|
|
private static final int DISTILLTIME = 401;
|
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
/**
|
|
|
|
* Start tracking distillation for a person when they open the brewer window.
|
|
|
|
* @param event
|
|
|
|
*/
|
2016-04-20 06:13:21 +02:00
|
|
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
|
|
|
public void onBrewerOpen(InventoryOpenEvent event) {
|
2016-04-21 05:55:15 +02:00
|
|
|
if (!P.use1_9) return;
|
2016-04-20 06:13:21 +02:00
|
|
|
HumanEntity player = event.getPlayer();
|
|
|
|
Inventory inv = event.getInventory();
|
|
|
|
if (player == null || inv == null || !(inv instanceof BrewerInventory)) return;
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 07:36:26 +02:00
|
|
|
P.p.debugLog("Starting brew inventory tracking");
|
2016-04-20 06:13:21 +02:00
|
|
|
trackedBrewmen.add(player.getUniqueId());
|
|
|
|
}
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
/**
|
|
|
|
* Stop tracking distillation for a person when they close the brewer window.
|
|
|
|
* @param event
|
|
|
|
*/
|
2016-04-20 06:13:21 +02:00
|
|
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
|
|
|
public void onBrewerClose(InventoryCloseEvent event) {
|
2016-04-21 05:55:15 +02:00
|
|
|
if (!P.use1_9) return;
|
2016-04-20 06:13:21 +02:00
|
|
|
HumanEntity player = event.getPlayer();
|
|
|
|
Inventory inv = event.getInventory();
|
|
|
|
if (player == null || inv == null || !(inv instanceof BrewerInventory)) return;
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 07:36:26 +02:00
|
|
|
P.p.debugLog("Stopping brew inventory tracking");
|
2016-04-20 06:13:21 +02:00
|
|
|
trackedBrewmen.remove(player.getUniqueId());
|
|
|
|
}
|
2016-04-21 05:55:15 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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.
|
2016-04-23 17:45:01 +02:00
|
|
|
*
|
2016-04-21 05:55:15 +02:00
|
|
|
* @param event the Click event.
|
|
|
|
*/
|
2016-04-20 06:13:21 +02:00
|
|
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
|
|
|
public void onBrewerClick(InventoryClickEvent event) {
|
2016-04-21 05:55:15 +02:00
|
|
|
if (!P.use1_9) return;
|
2016-04-20 06:13:21 +02:00
|
|
|
HumanEntity player = event.getWhoClicked();
|
|
|
|
Inventory inv = event.getInventory();
|
|
|
|
if (player == null || inv == null || !(inv instanceof BrewerInventory)) return;
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-20 06:13:21 +02:00
|
|
|
UUID puid = player.getUniqueId();
|
|
|
|
if (!trackedBrewmen.contains(puid)) return;
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
if (InventoryType.BREWING != inv.getType()) return;
|
2016-04-23 17:45:01 +02:00
|
|
|
if (event.getAction() == InventoryAction.NOTHING) return; // Ignore clicks that do nothing
|
|
|
|
|
2016-04-20 06:13:21 +02:00
|
|
|
BrewerInventory brewer = (BrewerInventory) inv;
|
|
|
|
final Block brewery = brewer.getHolder().getBlock();
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
// 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
|
|
|
|
}
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
// Now check if we should bother to track it.
|
2016-04-21 07:36:26 +02:00
|
|
|
trackedBrewers.put(brewery, new BukkitRunnable() {
|
2016-04-23 17:45:01 +02:00
|
|
|
private int brewTime = DISTILLTIME;
|
2016-04-21 07:36:26 +02:00
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
BlockState now = brewery.getState();
|
|
|
|
if (now instanceof BrewingStand) {
|
|
|
|
BrewingStand stand = (BrewingStand) now;
|
2016-04-23 17:45:01 +02:00
|
|
|
if (brewTime == DISTILLTIME) { // only check at the beginning (and end) for distillables
|
|
|
|
if (!isCustomAndDistill(stand.getInventory())) {
|
|
|
|
this.cancel();
|
|
|
|
trackedBrewers.remove(brewery);
|
|
|
|
P.p.debugLog("nothing to distill");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
brewTime--; // count down.
|
|
|
|
stand.setBrewingTime(brewTime); // arbitrary for now
|
|
|
|
|
|
|
|
if (brewTime <= 1) { // Done!
|
|
|
|
//BrewEvent doBrew = new BrewEvent(brewery, brewer);
|
|
|
|
//Bukkit.getServer().getPluginManager().callEvent(doBrew);
|
|
|
|
|
|
|
|
BrewerInventory brewer = stand.getInventory();
|
|
|
|
if (!runDistill(brewer)) {
|
|
|
|
this.cancel();
|
|
|
|
trackedBrewers.remove(brewery);
|
|
|
|
stand.setBrewingTime(0);
|
|
|
|
P.p.debugLog("All done distilling");
|
|
|
|
} else {
|
|
|
|
brewTime = DISTILLTIME; // go again.
|
|
|
|
P.p.debugLog("Can distill more! Continuing.");
|
2016-04-20 06:13:21 +02:00
|
|
|
}
|
|
|
|
}
|
2016-04-21 07:36:26 +02:00
|
|
|
} else {
|
|
|
|
this.cancel();
|
|
|
|
trackedBrewers.remove(brewery);
|
|
|
|
P.p.debugLog("The block was replaced; not a brewing stand.");
|
2016-04-20 06:13:21 +02:00
|
|
|
}
|
2016-04-21 07:36:26 +02:00
|
|
|
}
|
2016-05-18 20:28:28 +02:00
|
|
|
}.runTaskTimer(P.p, 2L, 1L).getTaskId());
|
2016-04-20 06:13:21 +02:00
|
|
|
}
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
private boolean isCustomAndDistill(BrewerInventory brewer) {
|
2016-04-21 07:36:26 +02:00
|
|
|
ItemStack item = brewer.getItem(3); // ingredient
|
2016-04-21 05:55:15 +02:00
|
|
|
if (item == null || Material.GLOWSTONE_DUST != item.getType()) return false; // need dust in the top slot.
|
|
|
|
for (int slot = 0; slot < 3; slot++) {
|
2016-04-20 06:13:21 +02:00
|
|
|
item = brewer.getItem(slot);
|
|
|
|
if (item != null) {
|
|
|
|
if (item.getType() == Material.POTION) {
|
|
|
|
if (item.hasItemMeta()) {
|
|
|
|
int uid = Brew.getUID(item);
|
2016-04-21 05:55:15 +02:00
|
|
|
Brew pot = Brew.potions.get(uid);
|
|
|
|
if (pot != null && pot.canDistill()) { // need at least one distillable potion.
|
2016-04-20 06:13:21 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2016-04-21 05:55:15 +02:00
|
|
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
2013-05-09 21:47:58 +02:00
|
|
|
public void onBrew(BrewEvent event) {
|
2016-04-23 17:45:01 +02:00
|
|
|
if (runDistill(event.getContents())) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean runDistill(BrewerInventory inv) {
|
2013-05-09 21:47:58 +02:00
|
|
|
int slot = 0;
|
|
|
|
ItemStack item;
|
|
|
|
boolean custom = false;
|
2013-07-03 18:06:13 +02:00
|
|
|
Boolean[] contents = new Boolean[3];
|
2013-05-09 21:47:58 +02:00
|
|
|
while (slot < 3) {
|
|
|
|
item = inv.getItem(slot);
|
2013-07-03 18:06:13 +02:00
|
|
|
contents[slot] = false;
|
2013-05-09 21:47:58 +02:00
|
|
|
if (item != null) {
|
|
|
|
if (item.getType() == Material.POTION) {
|
|
|
|
if (item.hasItemMeta()) {
|
2013-07-03 18:06:13 +02:00
|
|
|
int uid = Brew.getUID(item);
|
|
|
|
if (Brew.potions.containsKey(uid)) {
|
2013-05-09 21:47:58 +02:00
|
|
|
// has custom potion in "slot"
|
2013-07-03 18:06:13 +02:00
|
|
|
if (Brew.get(uid).canDistill()) {
|
|
|
|
// is further distillable
|
|
|
|
contents[slot] = true;
|
|
|
|
custom = true;
|
|
|
|
}
|
2013-05-09 21:47:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
slot++;
|
|
|
|
}
|
|
|
|
if (custom) {
|
|
|
|
Brew.distillAll(inv, contents);
|
2016-04-23 17:45:01 +02:00
|
|
|
return true;
|
2013-05-09 21:47:58 +02:00
|
|
|
}
|
2016-04-23 17:45:01 +02:00
|
|
|
return false;
|
2013-05-09 21:47:58 +02:00
|
|
|
}
|
|
|
|
|
2016-05-18 20:28:28 +02:00
|
|
|
// convert potions from 1.8 for color and to remove effect descriptions in 1.9
|
|
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = false)
|
|
|
|
public void onInventoryClickLow(InventoryClickEvent event) {
|
|
|
|
if (!P.use1_9) return;
|
|
|
|
|
|
|
|
if (event.getCurrentItem() != null && event.getCurrentItem().getType().equals(Material.POTION)) {
|
|
|
|
ItemStack item = event.getCurrentItem();
|
|
|
|
if (item.hasItemMeta()) {
|
|
|
|
PotionMeta potion = ((PotionMeta) item.getItemMeta());
|
|
|
|
if (!potion.hasItemFlag(ItemFlag.HIDE_POTION_EFFECTS)) {
|
|
|
|
Brew brew = Brew.get(potion);
|
|
|
|
if (brew != null) {
|
|
|
|
BRecipe recipe = brew.getCurrentRecipe();
|
|
|
|
if (recipe != null) {
|
|
|
|
Brew.PotionColor.valueOf(recipe.getColor()).colorBrew(potion, item, brew.canDistill());
|
|
|
|
item.setItemMeta(potion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-19 16:23:12 +02:00
|
|
|
// convert to non colored Lore when taking out of Barrel/Brewer
|
2014-04-09 00:35:08 +02:00
|
|
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
2013-08-19 16:23:12 +02:00
|
|
|
public void onInventoryClick(InventoryClickEvent event) {
|
|
|
|
if (event.getInventory().getType() == InventoryType.BREWING) {
|
|
|
|
if (event.getSlot() > 2) {
|
|
|
|
return;
|
|
|
|
}
|
2015-01-10 00:15:13 +01:00
|
|
|
} else if (!(event.getInventory().getHolder() instanceof Barrel)) {
|
2013-08-30 21:19:49 +02:00
|
|
|
return;
|
2013-08-19 16:23:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ItemStack item = event.getCurrentItem();
|
|
|
|
if (item != null) {
|
2014-05-19 15:17:55 +02:00
|
|
|
if (item.getType() == Material.POTION) {
|
2013-08-19 16:23:12 +02:00
|
|
|
if (item.hasItemMeta()) {
|
|
|
|
PotionMeta meta = (PotionMeta) item.getItemMeta();
|
|
|
|
Brew brew = Brew.get(meta);
|
|
|
|
if (brew != null) {
|
2013-08-30 21:19:49 +02:00
|
|
|
if (Brew.hasColorLore(meta)) {
|
|
|
|
brew.convertLore(meta, false);
|
|
|
|
item.setItemMeta(meta);
|
|
|
|
}
|
2013-08-19 16:23:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-04-23 17:45:01 +02:00
|
|
|
|
2014-01-07 09:44:54 +01:00
|
|
|
// block the pickup of items where getPickupDelay is > 1000 (puke)
|
2014-02-16 17:11:02 +01:00
|
|
|
@EventHandler(ignoreCancelled = true)
|
2014-01-07 09:44:54 +01:00
|
|
|
public void onInventoryPickupItem(InventoryPickupItemEvent event){
|
2014-04-08 16:11:20 +02:00
|
|
|
if (event.getItem().getPickupDelay() > 1000) {
|
2014-01-07 09:44:54 +01:00
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
2014-04-09 00:35:08 +02:00
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onInventoryClose(InventoryCloseEvent event) {
|
2014-05-06 23:19:25 +02:00
|
|
|
if (P.p.useLB) {
|
2015-01-10 00:15:13 +01:00
|
|
|
if (event.getInventory().getHolder() instanceof Barrel) {
|
|
|
|
try {
|
|
|
|
LogBlockBarrel.closeBarrel(event.getPlayer(), event.getInventory());
|
|
|
|
} catch (Exception e) {
|
|
|
|
P.p.errorLog("Failed to Log Barrel to LogBlock!");
|
2016-05-18 20:28:28 +02:00
|
|
|
P.p.errorLog("Brewery was tested with version 1.94 of LogBlock!");
|
2015-01-10 00:15:13 +01:00
|
|
|
e.printStackTrace();
|
2014-04-09 00:35:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-05-09 21:47:58 +02:00
|
|
|
}
|