Brewery/src/com/dre/brewery/MCBarrel.java

202 lines
6.1 KiB
Java
Raw Normal View History

2019-08-17 12:07:57 +02:00
package com.dre.brewery;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Barrel;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
2019-08-17 12:07:57 +02:00
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
2019-08-17 12:07:57 +02:00
import java.util.ArrayList;
import java.util.List;
public class MCBarrel {
public static final byte OAK = 2;
public static final String TAG = "Btime";
public static int maxBrews = 6;
public static long mcBarrelTime; // Globally stored Barrel time. Difference between this and the time stored on each mc-barrel will give the barrel age time
public static List<MCBarrel> openBarrels = new ArrayList<>();
2019-08-17 12:07:57 +02:00
private byte brews = -1; // How many Brewery Brews are in this Barrel
private final Inventory inv;
2019-08-18 22:45:12 +02:00
private final int invSize;
2019-08-17 12:07:57 +02:00
public MCBarrel(Inventory inv) {
this.inv = inv;
2019-08-18 22:45:12 +02:00
invSize = inv.getSize();
2019-08-17 12:07:57 +02:00
}
// Now Opening this Barrel for a player
public void open() {
// if nobody had the inventory opened
if (inv.getViewers().size() == 1 && inv.getHolder() instanceof org.bukkit.block.Barrel) {
Barrel barrel = (Barrel) inv.getHolder();
PersistentDataContainer data = barrel.getPersistentDataContainer();
NamespacedKey key = new NamespacedKey(P.p, TAG);
if (!data.has(key, PersistentDataType.LONG)) return;
// Get the difference between the time that is stored on the Barrel and the current stored global mcBarrelTime
long time = mcBarrelTime - data.getOrDefault(key, PersistentDataType.LONG, mcBarrelTime);
data.remove(key);
barrel.update();
P.p.debugLog("Barrel Time since last open: " + time);
if (time > 0) {
2019-08-17 12:07:57 +02:00
brews = 0;
// if inventory contains potions
if (inv.contains(Material.POTION)) {
long loadTime = System.nanoTime();
for (ItemStack item : inv.getContents()) {
if (item != null) {
Brew brew = Brew.get(item);
if (brew != null) {
2019-08-18 22:45:12 +02:00
if (brews < maxBrews || maxBrews < 0) {
// The time is in minutes, but brew.age() expects time in mc-days
brew.age(item, ((float) time) / 20f, OAK);
2019-08-17 12:07:57 +02:00
}
brews++;
}
}
}
loadTime = System.nanoTime() - loadTime;
float ftime = (float) (loadTime / 1000000.0);
P.p.debugLog("opening MC Barrel with potions (" + ftime + "ms)");
}
}
}
}
// Closing Inventory. Check if we need to set a time on the Barrel
public void close() {
2019-08-17 12:07:57 +02:00
if (inv.getViewers().size() == 1) {
// This is the last viewer
for (ItemStack item : inv.getContents()) {
if (item != null) {
if (Brew.isBrew(item)) {
// We found a brew, so set time on this Barrel
if (inv.getHolder() instanceof org.bukkit.block.Barrel) {
Barrel barrel = (Barrel) inv.getHolder();
PersistentDataContainer data = barrel.getPersistentDataContainer();
data.set(new NamespacedKey(P.p, TAG), PersistentDataType.LONG, mcBarrelTime);
barrel.update();
}
return;
2019-08-17 12:07:57 +02:00
}
}
}
// No Brew found, ignore this Barrel
2019-08-17 12:07:57 +02:00
}
}
2019-10-16 17:21:04 +02:00
public void countBrews() {
brews = 0;
for (ItemStack item : inv.getContents()) {
if (item != null) {
if (Brew.isBrew(item)) {
2019-10-16 17:21:04 +02:00
brews++;
}
}
}
}
public Inventory getInventory() {
return inv;
}
2019-10-16 17:21:04 +02:00
public static void onUpdate() {
mcBarrelTime++;
}
// Used to visually stop Players from placing more than 6 (configurable) brews in the MC Barrels.
// There are still methods to place more Brews in that would be too tedious to catch.
// This is only for direct visual Notification, the age routine above will never age more than 6 brews in any case.
public void clickInv(InventoryClickEvent event) {
2019-08-18 22:45:12 +02:00
if (maxBrews >= invSize || maxBrews < 0) {
// There are enough brews allowed to fill the inventory, we don't need to keep track
return;
}
boolean adding = false;
switch (event.getAction()) {
case PLACE_ALL:
case PLACE_ONE:
case PLACE_SOME:
case SWAP_WITH_CURSOR:
// Placing Brew in MC Barrel
if (event.getCursor() != null && event.getClickedInventory() != null && event.getClickedInventory().getType() == InventoryType.BARREL && event.getCursor().getType() == Material.POTION) {
if (Brew.isBrew(event.getCursor())) {
if (event.getAction() == InventoryAction.SWAP_WITH_CURSOR && event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.POTION) {
if (Brew.isBrew(event.getCurrentItem())) {
// The item we are swapping with is also a brew, dont change the count and allow
break;
}
}
adding = true;
}
}
break;
case MOVE_TO_OTHER_INVENTORY:
if (event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.POTION && event.getClickedInventory() != null) {
if (event.getClickedInventory().getType() == InventoryType.BARREL) {
// Moving Brew out of MC Barrel
if (Brew.isBrew(event.getCurrentItem())) {
if (brews == -1) {
countBrews();
}
brews--;
}
break;
} else if (event.getClickedInventory().getType() == InventoryType.PLAYER) {
// Moving Brew into MC Barrel
if (Brew.isBrew(event.getCurrentItem())) {
adding = true;
}
}
}
break;
case PICKUP_ALL:
case PICKUP_ONE:
case PICKUP_HALF:
case PICKUP_SOME:
case COLLECT_TO_CURSOR:
// Pickup Brew from MC Barrel
if (event.getCurrentItem() != null && event.getClickedInventory() != null && event.getClickedInventory().getType() == InventoryType.BARREL && event.getCurrentItem().getType() == Material.POTION) {
if (Brew.isBrew(event.getCurrentItem())) {
if (brews == -1) {
countBrews();
}
brews--;
}
}
break;
case HOTBAR_MOVE_AND_READD:
case HOTBAR_SWAP:
brews = -1;
break;
default:
return;
}
if (adding) {
if (brews == -1) {
countBrews();
}
if (brews >= maxBrews) {
event.setCancelled(true);
P.p.msg(event.getWhoClicked(), P.p.languageReader.get("Player_BarrelFull"));
} else {
brews++;
}
}
2019-08-17 12:07:57 +02:00
}
}