2016-04-14 16:24:03 +00:00
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines ;
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib ;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHandler ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItemSerializer ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItemSerializer.ItemFlag ;
import me.mrCookieSlime.Slimefun.Lists.RecipeType ;
import me.mrCookieSlime.Slimefun.Objects.Category ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker ;
import me.mrCookieSlime.Slimefun.api.BlockStorage ;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock ;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu ;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset ;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow ;
import me.mrCookieSlime.Slimefun.api.item_transport.RecipeSorter ;
import org.apache.commons.lang.ArrayUtils ;
import org.bukkit.Bukkit ;
import org.bukkit.Material ;
import org.bukkit.block.Block ;
import org.bukkit.entity.Player ;
import org.bukkit.event.inventory.InventoryClickEvent ;
import org.bukkit.inventory.Inventory ;
import org.bukkit.inventory.ItemStack ;
import org.bukkit.material.MaterialData ;
public abstract class AutomatedCraftingChamber extends SlimefunItem {
private static final int [ ] border = { 0 , 1 , 3 , 4 , 5 , 7 , 8 , 13 , 14 , 15 , 16 , 17 , 50 , 51 , 52 , 53 } ;
private static final int [ ] border_in = { 9 , 10 , 11 , 12 , 13 , 18 , 22 , 27 , 31 , 36 , 40 , 45 , 46 , 47 , 48 , 49 } ;
private static final int [ ] border_out = { 23 , 24 , 25 , 26 , 32 , 35 , 41 , 42 , 43 , 44 } ;
public static Map < String , ItemStack > recipes = new HashMap < String , ItemStack > ( ) ;
public AutomatedCraftingChamber ( Category category , ItemStack item , String name , RecipeType recipeType , ItemStack [ ] recipe ) {
super ( category , item , name , recipeType , recipe ) ;
2016-11-23 15:51:57 +00:00
new BlockMenuPreset ( name , " &6Automated Crafting Chamber " ) {
2016-04-14 16:24:03 +00:00
@Override
public void init ( ) {
constructMenu ( this ) ;
}
@Override
public void newInstance ( final BlockMenu menu , final Block b ) {
2018-06-06 09:41:56 +00:00
if ( ! BlockStorage . hasBlockInfo ( b ) | | BlockStorage . getLocationInfo ( b . getLocation ( ) , " enabled " ) = = null | | BlockStorage . getLocationInfo ( b . getLocation ( ) , " enabled " ) . equals ( " false " ) ) {
2016-11-23 15:51:57 +00:00
menu . replaceExistingItem ( 6 , new CustomItem ( new MaterialData ( Material . SULPHUR ) , " &7Enabled: &4 \ u2718 " , " " , " &e> Click to enable this Machine " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 6 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
BlockStorage . addBlockInfo ( b , " enabled " , " true " ) ;
newInstance ( menu , b ) ;
return false ;
}
} ) ;
}
else {
2016-11-23 15:51:57 +00:00
menu . replaceExistingItem ( 6 , new CustomItem ( new MaterialData ( Material . REDSTONE ) , " &7Enabled: &2 \ u2714 " , " " , " &e> Click to disable this Machine " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 6 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
BlockStorage . addBlockInfo ( b , " enabled " , " false " ) ;
newInstance ( menu , b ) ;
return false ;
}
} ) ;
}
}
@Override
public boolean canOpen ( Block b , Player p ) {
return p . hasPermission ( " slimefun.inventory.bypass " ) | | CSCoreLib . getLib ( ) . getProtectionManager ( ) . canAccessChest ( p . getUniqueId ( ) , b , true ) ;
}
@Override
public int [ ] getSlotsAccessedByItemTransport ( ItemTransportFlow flow ) {
return new int [ 0 ] ;
}
@Override
public int [ ] getSlotsAccessedByItemTransport ( BlockMenu menu , ItemTransportFlow flow , ItemStack item ) {
if ( flow . equals ( ItemTransportFlow . WITHDRAW ) ) return getOutputSlots ( ) ;
List < Integer > slots = new ArrayList < Integer > ( ) ;
for ( int slot : getInputSlots ( ) ) {
if ( menu . getItemInSlot ( slot ) ! = null ) slots . add ( slot ) ;
}
Collections . sort ( slots , new RecipeSorter ( menu ) ) ;
return ArrayUtils . toPrimitive ( slots . toArray ( new Integer [ slots . size ( ) ] ) ) ;
}
} ;
registerBlockHandler ( name , new SlimefunBlockHandler ( ) {
@Override
public void onPlace ( Player p , Block b , SlimefunItem item ) {
BlockStorage . addBlockInfo ( b , " enabled " , " false " ) ;
}
@Override
public boolean onBreak ( Player p , Block b , SlimefunItem item , UnregisterReason reason ) {
BlockMenu inv = BlockStorage . getInventory ( b ) ;
if ( inv ! = null ) {
for ( int slot : getInputSlots ( ) ) {
2018-04-26 03:40:46 +00:00
if ( inv . getItemInSlot ( slot ) ! = null ) {
b . getWorld ( ) . dropItemNaturally ( b . getLocation ( ) , inv . getItemInSlot ( slot ) ) ;
inv . replaceExistingItem ( slot , null ) ;
}
2016-04-14 16:24:03 +00:00
}
for ( int slot : getOutputSlots ( ) ) {
2018-04-26 03:40:46 +00:00
if ( inv . getItemInSlot ( slot ) ! = null ) {
b . getWorld ( ) . dropItemNaturally ( b . getLocation ( ) , inv . getItemInSlot ( slot ) ) ;
inv . replaceExistingItem ( slot , null ) ;
}
2016-04-14 16:24:03 +00:00
}
}
return true ;
}
} ) ;
}
@SuppressWarnings ( " deprecation " )
protected void constructMenu ( BlockMenuPreset preset ) {
for ( int i : border ) {
preset . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ,
new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
for ( int i : border_in ) {
preset . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 11 ) , " " ) ,
new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
for ( int i : border_out ) {
preset . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 1 ) , " " ) ,
new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
for ( int i : getOutputSlots ( ) ) {
preset . addMenuClickHandler ( i , new AdvancedMenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack cursor , ClickAction action ) {
return false ;
}
@Override
public boolean onClick ( InventoryClickEvent e , Player p , int slot , ItemStack cursor , ClickAction action ) {
return cursor = = null | | cursor . getType ( ) = = null | | cursor . getType ( ) = = Material . AIR ;
}
} ) ;
}
2016-11-23 15:51:57 +00:00
preset . addItem ( 2 , new CustomItem ( new MaterialData ( Material . WORKBENCH ) , " &eRecipe " , " " , " &bPut in the Recipe you want to craft " , " &4Enhanced Crafting Table Recipes ONLY " ) ,
2016-04-14 16:24:03 +00:00
new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
public abstract int getEnergyConsumption ( ) ;
public int [ ] getInputSlots ( ) {
return new int [ ] { 19 , 20 , 21 , 28 , 29 , 30 , 37 , 38 , 39 } ;
}
public int [ ] getOutputSlots ( ) {
return new int [ ] { 33 , 34 } ;
}
private Inventory inject ( Block b ) {
int size = BlockStorage . getInventory ( b ) . toInventory ( ) . getSize ( ) ;
Inventory inv = Bukkit . createInventory ( null , size ) ;
for ( int i = 0 ; i < size ; i + + ) {
2016-11-23 15:51:57 +00:00
inv . setItem ( i , new CustomItem ( Material . COMMAND , " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US " , 0 ) ) ;
2016-04-14 16:24:03 +00:00
}
for ( int slot : getOutputSlots ( ) ) {
inv . setItem ( slot , BlockStorage . getInventory ( b ) . getItemInSlot ( slot ) ) ;
}
return inv ;
}
protected boolean fits ( Block b , ItemStack [ ] items ) {
return inject ( b ) . addItem ( items ) . isEmpty ( ) ;
}
protected void pushItems ( Block b , ItemStack [ ] items ) {
Inventory inv = inject ( b ) ;
inv . addItem ( items ) ;
for ( int slot : getOutputSlots ( ) ) {
BlockStorage . getInventory ( b ) . replaceExistingItem ( slot , inv . getItem ( slot ) ) ;
}
}
@Override
public void register ( boolean slimefun ) {
addItemHandler ( new BlockTicker ( ) {
@Override
public void tick ( Block b , SlimefunItem sf , Config data ) {
AutomatedCraftingChamber . this . tick ( b ) ;
}
@Override
public void uniqueTick ( ) {
}
@Override
public boolean isSynchronized ( ) {
return false ;
}
} ) ;
super . register ( slimefun ) ;
}
protected void tick ( Block b ) {
2018-06-06 09:41:56 +00:00
if ( BlockStorage . getLocationInfo ( b . getLocation ( ) , " enabled " ) . equals ( " false " ) ) return ;
2016-04-14 16:24:03 +00:00
if ( ChargableBlock . getCharge ( b ) < getEnergyConsumption ( ) ) return ;
BlockMenu menu = BlockStorage . getInventory ( b ) ;
StringBuilder builder = new StringBuilder ( ) ;
int i = 0 ;
for ( int j = 0 ; j < 9 ; j + + ) {
if ( i > 0 ) {
builder . append ( " </slot> " ) ;
}
ItemStack item = menu . getItemInSlot ( getInputSlots ( ) [ j ] ) ;
if ( item ! = null & & item . getAmount ( ) = = 1 ) return ;
builder . append ( CustomItemSerializer . serialize ( item , ItemFlag . DATA , ItemFlag . ITEMMETA_DISPLAY_NAME , ItemFlag . ITEMMETA_LORE , ItemFlag . MATERIAL ) ) ;
i + + ;
}
String input = builder . toString ( ) ;
if ( recipes . containsKey ( input ) ) {
2017-11-25 21:05:34 +00:00
ItemStack output = recipes . get ( input ) . clone ( ) ;
2016-04-14 16:24:03 +00:00
if ( fits ( b , new ItemStack [ ] { output } ) ) {
pushItems ( b , new ItemStack [ ] { output } ) ;
ChargableBlock . addCharge ( b , - getEnergyConsumption ( ) ) ;
for ( int j = 0 ; j < 9 ; j + + ) {
if ( menu . getItemInSlot ( getInputSlots ( ) [ j ] ) ! = null ) menu . replaceExistingItem ( getInputSlots ( ) [ j ] , InvUtils . decreaseItem ( menu . getItemInSlot ( getInputSlots ( ) [ j ] ) , 1 ) ) ;
}
}
}
}
}