2019-08-17 12:07:57 +02:00
package com.dre.brewery ;
import org.bukkit.Material ;
2019-08-17 18:53:06 +02:00
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 ;
2019-08-17 18:53:06 +02:00
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 ;
2019-08-17 18:53:06 +02:00
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
2019-08-17 18:53:06 +02:00
private final Inventory inv ;
2019-08-18 22:45:12 +02:00
private final int invSize ;
2019-08-17 12:07:57 +02:00
2019-08-17 18:53:06 +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
2019-08-17 18:53:06 +02:00
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 ) {
2019-08-17 18:53:06 +02:00
// 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) " ) ;
}
}
}
}
2019-08-17 18:53:06 +02:00
// 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 ) {
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( item ) ) {
2019-08-17 18:53:06 +02:00
// 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
}
}
}
2019-08-17 18:53:06 +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 ) {
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( item ) ) {
2019-10-16 17:21:04 +02:00
brews + + ;
}
}
}
}
public Inventory getInventory ( ) {
return inv ;
}
2019-11-14 15:46:15 +01:00
2019-10-16 17:21:04 +02:00
public static void onUpdate ( ) {
mcBarrelTime + + ;
}
2019-08-17 18:53:06 +02:00
// 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 ;
}
2019-08-17 18:53:06 +02:00
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 ) {
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( event . getCursor ( ) ) ) {
2019-08-17 18:53:06 +02:00
if ( event . getAction ( ) = = InventoryAction . SWAP_WITH_CURSOR & & event . getCurrentItem ( ) ! = null & & event . getCurrentItem ( ) . getType ( ) = = Material . POTION ) {
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( event . getCurrentItem ( ) ) ) {
2019-08-17 18:53:06 +02:00
// 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
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( event . getCurrentItem ( ) ) ) {
2019-08-17 18:53:06 +02:00
if ( brews = = - 1 ) {
countBrews ( ) ;
}
brews - - ;
}
break ;
} else if ( event . getClickedInventory ( ) . getType ( ) = = InventoryType . PLAYER ) {
// Moving Brew into MC Barrel
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( event . getCurrentItem ( ) ) ) {
2019-08-17 18:53:06 +02:00
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 ) {
2019-11-14 15:46:15 +01:00
if ( Brew . isBrew ( event . getCurrentItem ( ) ) ) {
2019-08-17 18:53:06 +02:00
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
}
}