2016-04-14 16:24:03 +00:00
package me.mrCookieSlime.Slimefun ;
import java.util.ArrayList ;
2017-01-15 18:17:02 +00:00
import java.util.Arrays ;
2016-04-14 16:24:03 +00:00
import java.util.HashMap ;
import java.util.Iterator ;
import java.util.List ;
import java.util.Map ;
import java.util.UUID ;
2017-01-15 18:17:02 +00:00
import org.bukkit.Bukkit ;
import org.bukkit.ChatColor ;
import org.bukkit.GameMode ;
import org.bukkit.Material ;
import org.bukkit.Sound ;
import org.bukkit.entity.Player ;
import org.bukkit.inventory.FurnaceRecipe ;
import org.bukkit.inventory.ItemStack ;
import org.bukkit.inventory.Recipe ;
import org.bukkit.inventory.ShapedRecipe ;
import org.bukkit.inventory.ShapelessRecipe ;
import org.bukkit.inventory.meta.ItemMeta ;
import org.bukkit.material.MaterialData ;
2016-04-14 16:24:03 +00:00
import me.mrCookieSlime.CSCoreLibPlugin.PlayerRunnable ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage.HoverAction ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHandler ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuOpeningHandler ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.CustomBookOverlay ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem ;
import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler ;
import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils ;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull ;
2017-01-15 18:17:02 +00:00
import me.mrCookieSlime.Slimefun.GitHub.Contributor ;
2017-01-18 11:14:01 +00:00
import me.mrCookieSlime.Slimefun.GitHub.IntegerFormat ;
2016-04-14 16:24:03 +00:00
import me.mrCookieSlime.Slimefun.Lists.RecipeType ;
import me.mrCookieSlime.Slimefun.Objects.Category ;
import me.mrCookieSlime.Slimefun.Objects.LockedCategory ;
import me.mrCookieSlime.Slimefun.Objects.Research ;
import me.mrCookieSlime.Slimefun.Objects.SeasonCategory ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine ;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator ;
2016-11-20 16:50:20 +00:00
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor ;
2017-01-15 18:17:02 +00:00
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel ;
2016-04-14 16:24:03 +00:00
import me.mrCookieSlime.Slimefun.Setup.Messages ;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager ;
import me.mrCookieSlime.Slimefun.URID.URID ;
import me.mrCookieSlime.Slimefun.api.GuideHandler ;
import me.mrCookieSlime.Slimefun.api.Slimefun ;
public class SlimefunGuide {
public static Map < UUID , List < URID > > history = new HashMap < UUID , List < URID > > ( ) ;
public static int month = 0 ;
2017-01-15 18:17:02 +00:00
public static List < Contributor > contributors = new ArrayList < Contributor > ( ) ;
2017-01-16 15:28:41 +00:00
public static int issues = 0 ;
public static int forks = 0 ;
2017-01-18 11:14:01 +00:00
public static int code_lines = 0 ;
2017-01-15 18:17:02 +00:00
2016-04-14 16:24:03 +00:00
static boolean all_recipes = true ;
private static final int category_size = 36 ;
public static ItemStack getItem ( ) {
return getItem ( true ) ;
}
public static ItemStack getItem ( boolean book ) {
2016-11-23 15:51:57 +00:00
return new CustomItem ( new MaterialData ( Material . ENCHANTED_BOOK ) , " &eSlimefun Guide &7(Right Click) " , ( book ? " " : " &2 " ) , " &rThis is your basic Guide for Slimefun " , " &rYou can see all Items added by this Plugin " , " &ror its Addons including their Recipes " , " &ra bit of information and more " ) ;
2016-04-14 16:24:03 +00:00
}
2017-01-16 19:31:57 +00:00
private static final int [ ] slots = new int [ ] { 0 , 1 , 9 , 10 , 19 , 27 , 28 , 36 , 37 , 7 , 8 , 16 , 25 , 34 , 43 , 44 } ;
2017-01-14 21:40:06 +00:00
@SuppressWarnings ( " deprecation " )
public static void openSettings ( Player p , final ItemStack guide ) {
final ChestMenu menu = new ChestMenu ( " Settings / Info " ) ;
menu . addMenuOpeningHandler ( new MenuOpeningHandler ( ) {
@Override
public void onOpen ( Player p ) {
p . playSound ( p . getLocation ( ) , Sound . BLOCK_NOTE_HARP , 0 . 7F , 0 . 7F ) ;
}
} ) ;
2017-01-16 15:30:26 +00:00
2017-01-16 19:31:57 +00:00
menu . addItem ( 18 , new CustomItem ( new MaterialData ( Material . EMERALD ) , " &7 \ u21E6 Back to normal view " ) ) ;
menu . addMenuClickHandler ( 18 , new MenuClickHandler ( ) {
2017-01-16 15:30:26 +00:00
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
if ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( true ) , true ) ) {
SlimefunGuide . openGuide ( p , true ) ;
}
else if ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( false ) , true ) ) {
SlimefunGuide . openGuide ( p , false ) ;
}
return false ;
}
} ) ;
2017-01-16 19:31:57 +00:00
for ( int i : slots ) {
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
2017-01-14 21:40:06 +00:00
}
2017-01-16 19:31:57 +00:00
menu . addItem ( 2 , new CustomItem ( new MaterialData ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( true ) , true ) ? Material . BOOK_AND_QUILL : Material . CHEST ) , " &7Guide Layout: &e " + ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( true ) , true ) ? " Book " : " Chest " ) , " " , " &7 \ u21E8 Click to change to: &b " + ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( true ) , true ) ? " Chest " : " Book " ) ) ) ;
menu . addMenuClickHandler ( 2 , new MenuClickHandler ( ) {
2017-01-14 21:40:06 +00:00
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
if ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( true ) , true ) ) {
2016-04-14 16:24:03 +00:00
p . getInventory ( ) . setItemInMainHand ( getItem ( false ) ) ;
openSettings ( p , p . getInventory ( ) . getItemInMainHand ( ) ) ;
}
2017-01-14 21:40:06 +00:00
else if ( SlimefunManager . isItemSimiliar ( guide , SlimefunGuide . getItem ( false ) , true ) ) {
p . getInventory ( ) . setItemInMainHand ( getItem ( true ) ) ;
openSettings ( p , p . getInventory ( ) . getItemInMainHand ( ) ) ;
}
return false ;
}
} ) ;
2017-01-18 11:16:25 +00:00
menu . addItem ( 17 , new CustomItem ( new MaterialData ( Material . BOOK_AND_QUILL ) , " &aCredits " , " " , " &7Contributors: &e " + contributors . size ( ) , " " , " &7 \ u21E8 Click to see the people behind this Plugin " ) ) ;
2017-01-16 19:31:57 +00:00
menu . addMenuClickHandler ( 17 , new MenuClickHandler ( ) {
2017-01-14 21:40:06 +00:00
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
openCredits ( p , guide ) ;
return false ;
}
} ) ;
2017-01-16 15:28:41 +00:00
try {
2017-01-18 11:16:25 +00:00
menu . addItem ( 26 , new CustomItem ( new MaterialData ( Material . REDSTONE_COMPARATOR ) , " &eSource Code " , " " , " &7Lines of Code: &6 " + IntegerFormat . formatBigNumber ( code_lines ) , " &7Contributors: &e " + contributors . size ( ) , " &7Forks: &e " + forks , " " , " &7&oSlimefun 4 is a community project, " , " &7&othe source code is available on GitHub " , " &7&oand if you want to keep this Plugin alive, " , " &7&othen please consider contributing to it " , " " , " &7 \ u21E8 Click to go to GitHub " ) ) ;
2017-01-16 19:31:57 +00:00
menu . addMenuClickHandler ( 26 , new MenuClickHandler ( ) {
2017-01-16 15:28:41 +00:00
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
p . closeInventory ( ) ;
p . sendMessage ( " " ) ;
p . sendMessage ( ChatColor . translateAlternateColorCodes ( '&' , " &7&ohttps://github.com/TheBusyBiscuit/Slimefun4 " ) ) ;
p . sendMessage ( " " ) ;
return false ;
}
} ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
2017-01-16 19:31:57 +00:00
menu . addItem ( 35 , new CustomItem ( new MaterialData ( Material . REDSTONE ) , " &4Bug Tracker " , " " , " &7Unsolved Issues: &a " + issues , " " , " &7 \ u21E8 Click to go to the Slimefun Bug Tracker " ) ) ;
menu . addMenuClickHandler ( 35 , new MenuClickHandler ( ) {
2017-01-16 15:28:41 +00:00
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
p . closeInventory ( ) ;
p . sendMessage ( " " ) ;
p . sendMessage ( ChatColor . translateAlternateColorCodes ( '&' , " &7&ohttps://github.com/TheBusyBiscuit/Slimefun4/issues " ) ) ;
p . sendMessage ( " " ) ;
return false ;
}
} ) ;
2017-01-14 21:40:06 +00:00
menu . open ( p ) ;
}
@SuppressWarnings ( " deprecation " )
public static void openCredits ( Player p , final ItemStack guide ) {
final ChestMenu menu = new ChestMenu ( " Credits " ) ;
menu . addMenuOpeningHandler ( new MenuOpeningHandler ( ) {
@Override
public void onOpen ( Player p ) {
p . playSound ( p . getLocation ( ) , Sound . BLOCK_NOTE_HARP , 0 . 7F , 0 . 7F ) ;
}
} ) ;
for ( int i = 0 ; i < 9 ; i + + ) {
if ( i ! = 4 ) {
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
else {
menu . addItem ( 4 , new CustomItem ( new MaterialData ( Material . EMERALD ) , " &7 \ u21E6 Back to Settings " ) ) ;
menu . addMenuClickHandler ( 4 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
openSettings ( p , guide ) ;
return false ;
}
} ) ;
}
}
2017-01-15 18:17:02 +00:00
int index = 9 ;
double total = 0 ;
for ( Contributor contributor : contributors ) {
total + = contributor . commits ;
}
2017-01-16 19:31:57 +00:00
for ( final Contributor contributor : contributors ) {
2017-01-15 18:17:02 +00:00
ItemStack skull = new ItemStack ( Material . SKULL_ITEM , 1 , ( short ) 3 ) ;
2017-01-16 15:28:41 +00:00
ItemMeta meta = skull . getItemMeta ( ) ;
2017-01-15 18:17:02 +00:00
meta . setDisplayName ( ChatColor . translateAlternateColorCodes ( '&' , " &a " + contributor . name ) ) ;
if ( contributor . commits > 0 ) {
double percentage = DoubleHandler . fixDouble ( ( contributor . commits * 100 . 0 ) / total , 2 ) ;
2017-01-16 19:31:57 +00:00
meta . setLore ( Arrays . asList ( " " , ChatColor . translateAlternateColorCodes ( '&' , " &7Role: &r " + contributor . job ) , ChatColor . translateAlternateColorCodes ( '&' , " &7Contribution: &r " + percentage + " % " ) , " " , ChatColor . translateAlternateColorCodes ( '&' , " &7 \ u21E8 Click to view my GitHub profile " ) ) ) ;
2017-01-15 18:17:02 +00:00
}
else {
meta . setLore ( Arrays . asList ( " " , ChatColor . translateAlternateColorCodes ( '&' , " &7Role: &r " + contributor . job ) ) ) ;
}
2017-01-15 19:01:20 +00:00
2017-01-15 18:17:02 +00:00
skull . setItemMeta ( meta ) ;
menu . addItem ( index , skull ) ;
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
2017-01-16 19:31:57 +00:00
if ( contributor . commits > 0 ) {
p . closeInventory ( ) ;
p . sendMessage ( " " ) ;
p . sendMessage ( ChatColor . translateAlternateColorCodes ( '&' , " &7&o " + contributor . profile ) ) ;
p . sendMessage ( " " ) ;
}
2017-01-15 18:17:02 +00:00
return false ;
}
} ) ;
index + + ;
}
2017-01-14 21:45:06 +00:00
2017-01-14 21:40:06 +00:00
for ( int i = 0 ; i < 9 ; i + + ) {
menu . addItem ( 36 + i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( 36 + i , new MenuClickHandler ( ) {
2016-04-14 16:24:03 +00:00
@Override
2017-01-14 21:40:06 +00:00
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
2016-04-14 16:24:03 +00:00
}
} ) ;
}
2017-01-14 21:40:06 +00:00
menu . open ( p ) ;
2016-04-14 16:24:03 +00:00
}
public static void openCheatMenu ( Player p ) {
openMainMenu ( p , false , false , 1 ) ;
}
public static void openGuide ( Player p , boolean experimental ) {
if ( ! SlimefunStartup . getWhitelist ( ) . getBoolean ( p . getWorld ( ) . getName ( ) + " .enabled " ) ) return ;
if ( ! SlimefunStartup . getWhitelist ( ) . getBoolean ( p . getWorld ( ) . getName ( ) + " .enabled-items.SLIMEFUN_GUIDE " ) ) return ;
if ( ! history . containsKey ( p . getUniqueId ( ) ) ) openMainMenu ( p , true , experimental , 1 ) ;
else {
URID last = getLastEntry ( p , false ) ;
if ( URID . decode ( last ) instanceof Category ) openCategory ( p , ( Category ) URID . decode ( last ) , true , 1 , experimental ) ;
else if ( URID . decode ( last ) instanceof SlimefunItem ) displayItem ( p , ( ( SlimefunItem ) URID . decode ( last ) ) . getItem ( ) , false , experimental , 0 ) ;
else if ( URID . decode ( last ) instanceof GuideHandler ) ( ( GuideHandler ) URID . decode ( last ) ) . run ( p , true ) ;
else displayItem ( p , ( ItemStack ) URID . decode ( last ) , false , experimental , 0 ) ;
}
}
@SuppressWarnings ( " deprecation " )
public static void openMainMenu ( final Player p , final boolean survival , final boolean experimental , final int selected_page ) {
clearHistory ( p . getUniqueId ( ) ) ;
if ( experimental ) {
List < TellRawMessage > pages = new ArrayList < TellRawMessage > ( ) ;
List < String > texts = new ArrayList < String > ( ) ;
List < String > tooltips = new ArrayList < String > ( ) ;
List < PlayerRunnable > actions = new ArrayList < PlayerRunnable > ( ) ;
int tier = 0 ;
for ( final Category category : Category . list ( ) ) {
2016-04-17 18:39:40 +00:00
boolean locked = true ;
for ( SlimefunItem item : category . getItems ( ) ) {
if ( Slimefun . isEnabled ( p , item , false ) ) {
locked = false ;
break ;
}
}
if ( locked ) {
// Dont display that Category...
}
else {
if ( tier < category . getTier ( ) ) {
if ( survival ) {
for ( final GuideHandler handler : Slimefun . getGuideHandlers ( tier ) ) {
handler . addEntry ( texts , tooltips ) ;
actions . add ( new PlayerRunnable ( 2 ) {
@Override
public void run ( Player p ) {
handler . run ( p , survival ) ;
}
} ) ;
}
}
tier = category . getTier ( ) ;
if ( tier > 1 ) {
for ( int i = 0 ; i < 10 ; i + + ) {
if ( texts . size ( ) % 10 = = 0 ) break ;
texts . add ( " " ) ;
tooltips . add ( null ) ;
actions . add ( null ) ;
}
}
2016-12-18 13:49:50 +00:00
texts . add ( " &8 \ u21E8 &6Tier " + tier ) ;
2016-04-17 18:39:40 +00:00
tooltips . add ( null ) ;
actions . add ( null ) ;
}
if ( category instanceof LockedCategory & & ! ( ( LockedCategory ) category ) . hasUnlocked ( p ) ) {
2016-12-18 13:49:50 +00:00
StringBuilder parents = new StringBuilder ( " &4&lLOCKED \ n \ n&7In order to unlock this Category, \ n&7you need to unlock all Items from \ n&7the following Categories first: \ n " ) ;
2016-04-17 18:39:40 +00:00
for ( Category parent : ( ( LockedCategory ) category ) . getParents ( ) ) {
2016-12-18 13:49:50 +00:00
parents . append ( " \ n&c " + StringUtils . formatItemName ( parent . getItem ( ) , false ) ) ;
2016-04-17 18:39:40 +00:00
}
2016-12-18 13:49:50 +00:00
texts . add ( shorten ( " &c " , StringUtils . formatItemName ( category . getItem ( ) , false ) ) ) ;
2016-04-17 18:39:40 +00:00
tooltips . add ( parents . toString ( ) ) ;
actions . add ( null ) ;
}
else if ( category instanceof SeasonCategory ) {
if ( ( ( SeasonCategory ) category ) . isUnlocked ( ) ) {
2016-11-23 15:51:57 +00:00
texts . add ( shorten ( " &a " , StringUtils . formatItemName ( category . getItem ( ) , false ) ) ) ;
2016-12-18 13:49:50 +00:00
tooltips . add ( " &eClick to open the following Category: \ n " + StringUtils . formatItemName ( category . getItem ( ) , false ) ) ;
2016-04-17 18:39:40 +00:00
actions . add ( new PlayerRunnable ( 1 ) {
2016-04-14 16:24:03 +00:00
@Override
2016-04-17 18:39:40 +00:00
public void run ( final Player p ) {
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SlimefunStartup . instance , new Runnable ( ) {
@Override
public void run ( ) {
openCategory ( p , category , survival , 1 , experimental ) ;
}
} , 1L ) ;
2016-04-14 16:24:03 +00:00
}
} ) ;
}
}
2016-04-17 18:39:40 +00:00
else {
2016-11-23 15:51:57 +00:00
texts . add ( shorten ( " &a " , StringUtils . formatItemName ( category . getItem ( ) , false ) ) ) ;
2016-12-18 13:49:50 +00:00
tooltips . add ( " &eClick to open the following Category: \ n " + StringUtils . formatItemName ( category . getItem ( ) , false ) ) ;
2016-04-14 16:24:03 +00:00
actions . add ( new PlayerRunnable ( 1 ) {
@Override
public void run ( final Player p ) {
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SlimefunStartup . instance , new Runnable ( ) {
@Override
public void run ( ) {
openCategory ( p , category , survival , 1 , experimental ) ;
}
} , 1L ) ;
}
} ) ;
}
}
}
if ( survival ) {
for ( final GuideHandler handler : Slimefun . getGuideHandlers ( tier ) ) {
handler . addEntry ( texts , tooltips ) ;
actions . add ( new PlayerRunnable ( 2 ) {
@Override
public void run ( Player p ) {
handler . run ( p , survival ) ;
}
} ) ;
}
}
for ( int i = 0 ; i < texts . size ( ) ; i = i + 10 ) {
TellRawMessage page = new TellRawMessage ( ) ;
2016-12-18 13:49:50 +00:00
page . addText ( " &b&l- Slimefun Guide - \ n \ n " ) ;
2016-04-14 16:24:03 +00:00
for ( int j = i ; j < texts . size ( ) & & j < i + 10 ; j + + ) {
2016-12-18 13:49:50 +00:00
page . addText ( texts . get ( j ) + " \ n " ) ;
if ( tooltips . get ( j ) ! = null ) page . addHoverEvent ( HoverAction . SHOW_TEXT , tooltips . get ( j ) ) ;
2016-04-14 16:24:03 +00:00
if ( actions . get ( j ) ! = null ) page . addClickEvent ( actions . get ( j ) ) ;
}
// page.addText("\n");
// if (i > 0) {
2016-11-23 15:51:57 +00:00
// page.addText("&c<- Prev");
// page.addHoverEvent(HoverAction.SHOW_TEXT, "&eGo to Page " + (i));
2016-04-14 16:24:03 +00:00
// page.addClickEvent(me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage.ClickAction.CHANGE_PAGE, String.valueOf(i));
// page.addText(" ");
// }
// if (texts.size() > i * 10) {
// page.addText(" ");
2016-11-23 15:51:57 +00:00
// page.addText("&cNext ->");
// page.addHoverEvent(HoverAction.SHOW_TEXT, "&eGo to Page " + (i + 2));
2016-04-14 16:24:03 +00:00
// page.addClickEvent(me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage.ClickAction.CHANGE_PAGE, String.valueOf(i + 2));
// }
pages . add ( page ) ;
}
new CustomBookOverlay ( " Slimefun Guide " , " mrCookieSlime " , pages . toArray ( new TellRawMessage [ pages . size ( ) ] ) ) . open ( p ) ;
}
else {
final ChestMenu menu = new ChestMenu ( " Slimefun Guide " ) ;
menu . addMenuOpeningHandler ( new MenuOpeningHandler ( ) {
@Override
public void onOpen ( Player p ) {
p . playSound ( p . getLocation ( ) , Sound . ENTITY_BAT_TAKEOFF , 0 . 7F , 0 . 7F ) ;
}
} ) ;
List < Category > categories = Slimefun . current_categories ;
List < GuideHandler > handlers = Slimefun . guide_handlers2 ;
int index = 9 ;
2016-05-17 19:38:18 +00:00
int pages = 1 ;
2016-04-14 16:24:03 +00:00
for ( int i = 0 ; i < 9 ; i + + ) {
2017-01-15 19:01:20 +00:00
if ( ! ( i = = 4 & & survival ) ) {
2017-01-14 21:40:06 +00:00
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
else {
menu . addItem ( 4 , new CustomItem ( new MaterialData ( Material . EMERALD ) , " &aSettings / Info " , " " , " &7 \ u21E8 Click to open " ) ) ;
menu . addMenuClickHandler ( 4 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
openSettings ( p , p . getInventory ( ) . getItemInMainHand ( ) ) ;
return false ;
}
} ) ;
}
2016-04-14 16:24:03 +00:00
}
for ( int i = 45 ; i < 54 ; i + + ) {
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
2016-05-17 19:38:18 +00:00
int target = ( category_size * ( selected_page - 1 ) ) - 1 ;
2016-04-14 16:24:03 +00:00
2016-05-17 19:38:18 +00:00
while ( target < ( categories . size ( ) + handlers . size ( ) - 1 ) ) {
if ( index > = category_size + 9 ) {
pages + + ;
break ;
2016-04-14 16:24:03 +00:00
}
2016-05-17 19:38:18 +00:00
2016-05-16 11:18:56 +00:00
target + + ;
2016-05-17 19:38:18 +00:00
2016-05-16 11:18:56 +00:00
if ( target > = categories . size ( ) ) {
2016-04-14 16:24:03 +00:00
if ( ! survival ) break ;
index = handlers . get ( target - categories . size ( ) ) . next ( p , index , menu ) ;
}
else {
final Category category = categories . get ( target ) ;
2016-04-17 18:39:40 +00:00
boolean locked = true ;
for ( SlimefunItem item : category . getItems ( ) ) {
if ( Slimefun . isEnabled ( p , item , false ) ) {
locked = false ;
break ;
}
}
if ( locked ) {
// Dont display that Category...
}
else if ( ! ( category instanceof LockedCategory ) ) {
2016-04-14 16:24:03 +00:00
if ( ! ( category instanceof SeasonCategory ) ) {
menu . addItem ( index , category . getItem ( ) ) ;
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
openCategory ( p , category , survival , 1 , experimental ) ;
return false ;
}
} ) ;
index + + ;
}
else {
if ( ( ( SeasonCategory ) category ) . isUnlocked ( ) ) {
menu . addItem ( index , category . getItem ( ) ) ;
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
openCategory ( p , category , survival , 1 , experimental ) ;
return false ;
}
} ) ;
index + + ;
}
}
}
else if ( ( ( LockedCategory ) category ) . hasUnlocked ( p ) ) {
menu . addItem ( index , category . getItem ( ) ) ;
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
openCategory ( p , category , survival , 1 , experimental ) ;
return false ;
}
} ) ;
index + + ;
}
else {
List < String > parents = new ArrayList < String > ( ) ;
parents . add ( " " ) ;
parents . add ( " &rYou need to unlock all Items " ) ;
parents . add ( " &rfrom the following Categories first: " ) ;
parents . add ( " " ) ;
for ( Category parent : ( ( LockedCategory ) category ) . getParents ( ) ) {
parents . add ( parent . getItem ( ) . getItemMeta ( ) . getDisplayName ( ) ) ;
}
2016-05-16 11:03:26 +00:00
menu . addItem ( index , new CustomItem ( Material . BARRIER , " &4LOCKED &7- &r " + category . getItem ( ) . getItemMeta ( ) . getDisplayName ( ) , 0 , parents . toArray ( new String [ parents . size ( ) ] ) ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
index + + ;
}
}
}
2016-05-17 19:38:18 +00:00
final int finalPages = pages ;
menu . addItem ( 46 , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 5 ) , " &r \ u21E6 Previous Page " , " " , " &7( " + selected_page + " / " + pages + " ) " ) ) ;
menu . addMenuClickHandler ( 46 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
int next = selected_page - 1 ;
if ( next < 1 ) next = finalPages ;
if ( next ! = selected_page ) openMainMenu ( p , survival , experimental , next ) ;
return false ;
}
} ) ;
menu . addItem ( 52 , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 5 ) , " &rNext Page \ u21E8 " , " " , " &7( " + selected_page + " / " + pages + " ) " ) ) ;
menu . addMenuClickHandler ( 52 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
int next = selected_page + 1 ;
if ( next > finalPages ) next = 1 ;
if ( next ! = selected_page ) openMainMenu ( p , survival , experimental , next ) ;
return false ;
}
} ) ;
2016-04-14 16:24:03 +00:00
menu . open ( p ) ;
}
}
public static String shorten ( String string , String string2 ) {
if ( ChatColor . stripColor ( string + string2 ) . length ( ) > 19 ) return ( string + ChatColor . stripColor ( string2 ) ) . substring ( 0 , 18 ) + " ... " ;
else return ( string + ChatColor . stripColor ( string2 ) ) ;
}
@SuppressWarnings ( " deprecation " )
public static void openCategory ( final Player p , final Category category , final boolean survival , final int selected_page , final boolean experimental ) {
if ( category = = null ) return ;
if ( experimental & & category . getItems ( ) . size ( ) < 250 ) {
List < TellRawMessage > pages = new ArrayList < TellRawMessage > ( ) ;
List < String > texts = new ArrayList < String > ( ) ;
List < String > tooltips = new ArrayList < String > ( ) ;
List < PlayerRunnable > actions = new ArrayList < PlayerRunnable > ( ) ;
for ( final SlimefunItem item : category . getItems ( ) ) {
if ( Slimefun . hasPermission ( p , item , false ) ) {
2016-04-17 18:39:40 +00:00
if ( Slimefun . isEnabled ( p , item , false ) ) {
if ( survival & & ! Slimefun . hasUnlocked ( p , item , false ) & & item . getResearch ( ) ! = null ) {
2016-11-23 15:51:57 +00:00
texts . add ( shorten ( " &7 " , StringUtils . formatItemName ( item . getItem ( ) , false ) ) ) ;
2016-04-17 18:39:40 +00:00
final int cost = SlimefunStartup . getResearchCfg ( ) . getInt ( item . getResearch ( ) . getID ( ) + " .cost " ) ;
2016-11-23 15:51:57 +00:00
tooltips . add ( StringUtils . formatItemName ( item . getItem ( ) , false ) + " \ n&c&lLOCKED \ n \ n&7Cost: " + ( p . getLevel ( ) > = cost ? " &b " : " &4 " ) + cost + " Levels \ n \ n&a> Click to unlock " ) ;
2016-04-17 18:39:40 +00:00
actions . add ( new PlayerRunnable ( 2 ) {
@Override
public void run ( final Player p ) {
boolean canBuy = false ;
if ( p . getGameMode ( ) = = GameMode . CREATIVE ) canBuy = true ;
else if ( p . getLevel ( ) > = cost ) {
p . setLevel ( p . getLevel ( ) - cost ) ;
canBuy = true ;
}
if ( canBuy ) {
Research research = item . getResearch ( ) ;
boolean researched = research = = null ? true : research . hasUnlocked ( p ) ;
if ( researched ) openCategory ( p , category , true , selected_page , experimental ) ;
else if ( ! Research . isResearching ( p ) ) {
if ( p . getGameMode ( ) = = GameMode . CREATIVE ) {
research . unlock ( p , true ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SlimefunStartup . instance , new Runnable ( ) {
@Override
public void run ( ) {
openCategory ( p , category , survival , selected_page , experimental ) ;
}
} , 1L ) ;
}
else {
research . unlock ( p , false ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SlimefunStartup . instance , new Runnable ( ) {
@Override
public void run ( ) {
openCategory ( p , category , survival , selected_page , experimental ) ;
}
} , 103L ) ;
}
2016-04-14 16:24:03 +00:00
}
}
2016-04-17 18:39:40 +00:00
else Messages . local . sendTranslation ( p , " messages.not-enough-xp " , true ) ;
2016-04-14 16:24:03 +00:00
}
2016-04-17 18:39:40 +00:00
} ) ;
2016-04-14 16:24:03 +00:00
}
2016-04-17 18:39:40 +00:00
else {
2016-11-23 15:51:57 +00:00
texts . add ( shorten ( " &a " , StringUtils . formatItemName ( item . getItem ( ) , false ) ) ) ;
2016-04-14 16:24:03 +00:00
2016-04-17 18:39:40 +00:00
StringBuilder tooltip = new StringBuilder ( ) ;
tooltip . append ( StringUtils . formatItemName ( item . getItem ( ) , false ) ) ;
if ( item . getItem ( ) . hasItemMeta ( ) & & item . getItem ( ) . getItemMeta ( ) . hasLore ( ) ) {
for ( String line : item . getItem ( ) . getItemMeta ( ) . getLore ( ) ) {
tooltip . append ( " \ n " + line ) ;
}
2016-04-14 16:24:03 +00:00
}
2016-04-17 18:39:40 +00:00
2016-11-23 15:51:57 +00:00
tooltip . append ( " \ n \ n&e&oClick for more Info " ) ;
2016-04-17 18:39:40 +00:00
tooltips . add ( tooltip . toString ( ) ) ;
actions . add ( new PlayerRunnable ( 2 ) {
@Override
public void run ( Player p ) {
displayItem ( p , item . getItem ( ) , true , experimental , 0 ) ;
}
} ) ;
}
2016-04-14 16:24:03 +00:00
}
}
else {
2016-11-23 15:51:57 +00:00
texts . add ( shorten ( " &4 " , StringUtils . formatItemName ( item . getItem ( ) , false ) ) ) ;
tooltips . add ( " &cNo Permission! " ) ;
2016-04-14 16:24:03 +00:00
actions . add ( null ) ;
}
}
for ( int i = 0 ; i < texts . size ( ) ; i = i + 10 ) {
TellRawMessage page = new TellRawMessage ( ) ;
2016-11-23 15:51:57 +00:00
page . addText ( " &b&l- Slimefun Guide - \ n \ n " ) ;
2016-04-14 16:24:03 +00:00
for ( int j = i ; j < texts . size ( ) & & j < i + 10 ; j + + ) {
page . addText ( texts . get ( j ) + " \ n " ) ;
if ( tooltips . get ( j ) ! = null ) page . addHoverEvent ( HoverAction . SHOW_TEXT , tooltips . get ( j ) ) ;
if ( actions . get ( j ) ! = null ) page . addClickEvent ( actions . get ( j ) ) ;
}
page . addText ( " \ n " ) ;
2016-11-23 15:51:57 +00:00
page . addText ( " &6 \ u21E6 &lBack " ) ;
page . addHoverEvent ( HoverAction . SHOW_TEXT , " &eClick to go back to the Category Overview " ) ;
2016-04-14 16:24:03 +00:00
page . addClickEvent ( new PlayerRunnable ( 2 ) {
@Override
public void run ( final Player p ) {
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SlimefunStartup . instance , new Runnable ( ) {
@Override
public void run ( ) {
openMainMenu ( p , survival , true , 1 ) ;
}
} , 1L ) ;
}
} ) ;
pages . add ( page ) ;
}
new CustomBookOverlay ( " Slimefun Guide " , " mrCookieSlime " , pages . toArray ( new TellRawMessage [ pages . size ( ) ] ) ) . open ( p ) ;
}
else {
final ChestMenu menu = new ChestMenu ( " Slimefun Guide " ) ;
menu . addMenuOpeningHandler ( new MenuOpeningHandler ( ) {
@Override
public void onOpen ( Player p ) {
p . playSound ( p . getLocation ( ) , Sound . ENTITY_BAT_TAKEOFF , 0 . 7F , 0 . 7F ) ;
}
} ) ;
int index = 9 ;
final int pages = category . getItems ( ) . size ( ) / category_size + 1 ;
for ( int i = 0 ; i < 4 ; i + + ) {
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
menu . addItem ( 4 , new CustomItem ( new MaterialData ( Material . ENCHANTED_BOOK ) , " &7 \ u21E6 Back " ) ) ;
menu . addMenuClickHandler ( 4 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
openMainMenu ( p , survival , experimental , 1 ) ;
return false ;
}
} ) ;
for ( int i = 5 ; i < 9 ; i + + ) {
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
for ( int i = 45 ; i < 54 ; i + + ) {
menu . addItem ( i , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 7 ) , " " ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
menu . addItem ( 46 , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 5 ) , " &r \ u21E6 Previous Page " , " " , " &7( " + selected_page + " / " + pages + " ) " ) ) ;
menu . addMenuClickHandler ( 46 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
int next = selected_page - 1 ;
if ( next < 1 ) next = pages ;
if ( next ! = selected_page ) openCategory ( p , category , survival , next , experimental ) ;
return false ;
}
} ) ;
menu . addItem ( 52 , new CustomItem ( new MaterialData ( Material . STAINED_GLASS_PANE , ( byte ) 5 ) , " &rNext Page \ u21E8 " , " " , " &7( " + selected_page + " / " + pages + " ) " ) ) ;
menu . addMenuClickHandler ( 52 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
int next = selected_page + 1 ;
if ( next > pages ) next = 1 ;
if ( next ! = selected_page ) openCategory ( p , category , survival , next , experimental ) ;
return false ;
}
} ) ;
int category_index = category_size * ( selected_page - 1 ) ;
for ( int i = 0 ; i < category_size ; i + + ) {
int target = category_index + i ;
if ( target > = category . getItems ( ) . size ( ) ) break ;
final SlimefunItem sfitem = category . getItems ( ) . get ( target ) ;
2016-05-16 11:12:28 +00:00
if ( Slimefun . isEnabled ( p , sfitem , false ) ) {
if ( survival & & ! Slimefun . hasUnlocked ( p , sfitem . getItem ( ) , false ) & & sfitem . getResearch ( ) ! = null ) {
if ( Slimefun . hasPermission ( p , sfitem , false ) ) {
2016-04-17 18:39:40 +00:00
final int cost = SlimefunStartup . getResearchCfg ( ) . getInt ( sfitem . getResearch ( ) . getID ( ) + " .cost " ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( index , new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( sfitem . getItem ( ) , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , " &a> Click to unlock " , " " , " &7Cost: &b " + cost + " Level " } ) ) ;
2016-04-17 18:39:40 +00:00
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( final Player p , int slot , ItemStack item , ClickAction action ) {
boolean canBuy = false ;
if ( p . getGameMode ( ) = = GameMode . CREATIVE ) canBuy = true ;
else if ( p . getLevel ( ) > = cost ) {
p . setLevel ( p . getLevel ( ) - cost ) ;
canBuy = true ;
}
if ( canBuy ) {
Research research = sfitem . getResearch ( ) ;
boolean researched = research = = null ? true : research . hasUnlocked ( p ) ;
if ( researched ) openCategory ( p , category , true , selected_page , experimental ) ;
else if ( ! Research . isResearching ( p ) ) {
if ( p . getGameMode ( ) = = GameMode . CREATIVE ) {
research . unlock ( p , true ) ;
openCategory ( p , category , survival , selected_page , experimental ) ;
}
else {
research . unlock ( p , false ) ;
Bukkit . getScheduler ( ) . scheduleSyncDelayedTask ( SlimefunStartup . instance , new Runnable ( ) {
@Override
public void run ( ) {
openCategory ( p , category , survival , selected_page , experimental ) ;
}
} , 103L ) ;
}
2016-04-14 16:24:03 +00:00
}
}
2016-04-17 18:39:40 +00:00
else Messages . local . sendTranslation ( p , " messages.not-enough-xp " , true ) ;
return false ;
2016-04-14 16:24:03 +00:00
}
2016-04-17 18:39:40 +00:00
} ) ;
2016-04-17 18:48:28 +00:00
index + + ;
2016-04-17 18:39:40 +00:00
}
2016-05-16 11:12:28 +00:00
else {
menu . addItem ( index , new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( sfitem . getItem ( ) , false ) , 0 , new String [ ] { " " , " &rYou do not have Permission " , " &rto access this Item " } ) ) ;
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
index + + ;
}
2016-04-14 16:24:03 +00:00
}
else {
2016-05-16 11:12:28 +00:00
menu . addItem ( index , sfitem . getItem ( ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( index , new MenuClickHandler ( ) {
@Override
2016-05-16 11:12:28 +00:00
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
if ( survival ) displayItem ( p , item , true , experimental , 0 ) ;
else p . getInventory ( ) . addItem ( item ) ;
2016-04-14 16:24:03 +00:00
return false ;
}
} ) ;
2016-04-17 18:48:28 +00:00
index + + ;
2016-04-14 16:24:03 +00:00
}
}
}
menu . open ( p ) ;
}
if ( survival ) {
addToHistory ( p , category . getURID ( ) ) ;
}
}
public static void addToHistory ( Player p , URID urid ) {
List < URID > list = new ArrayList < URID > ( ) ;
if ( history . containsKey ( p . getUniqueId ( ) ) ) list = history . get ( p . getUniqueId ( ) ) ;
list . add ( urid ) ;
history . put ( p . getUniqueId ( ) , list ) ;
}
private static URID getLastEntry ( Player p , boolean remove ) {
List < URID > list = new ArrayList < URID > ( ) ;
if ( history . containsKey ( p . getUniqueId ( ) ) ) list = history . get ( p . getUniqueId ( ) ) ;
if ( remove & & list . size ( ) > = 1 ) {
URID urid = list . get ( list . size ( ) - 1 ) ;
urid . markDirty ( ) ;
list . remove ( urid ) ;
}
if ( list . isEmpty ( ) ) history . remove ( p . getUniqueId ( ) ) ;
else history . put ( p . getUniqueId ( ) , list ) ;
return list . isEmpty ( ) ? null : list . get ( list . size ( ) - 1 ) ;
}
@SuppressWarnings ( " deprecation " )
public static void displayItem ( Player p , final ItemStack item , boolean addToHistory , final boolean experimental , final int page ) {
2016-11-27 18:34:45 +00:00
if ( item = = null | | item . getType ( ) = = Material . AIR ) return ;
2016-04-14 16:24:03 +00:00
final SlimefunItem sfItem = SlimefunItem . getByItem ( item ) ;
if ( sfItem = = null ) {
if ( ! all_recipes ) return ;
}
ItemStack [ ] recipe = new ItemStack [ 9 ] ;
ItemStack recipeType = null ;
ItemStack recipeOutput = item ;
ChestMenu menu = new ChestMenu ( " Slimefun Guide " ) ;
menu . addMenuOpeningHandler ( new MenuOpeningHandler ( ) {
@Override
public void onOpen ( Player p ) {
p . playSound ( p . getLocation ( ) , Sound . ENTITY_BAT_TAKEOFF , 0 . 7F , 0 . 7F ) ;
}
} ) ;
2016-11-27 18:34:45 +00:00
2016-04-14 16:24:03 +00:00
if ( sfItem ! = null ) {
recipe = sfItem . getRecipe ( ) ;
recipeType = sfItem . getRecipeType ( ) . toItem ( ) ;
recipeOutput = sfItem . getCustomOutput ( ) ! = null ? sfItem . getCustomOutput ( ) : sfItem . getItem ( ) ;
}
else {
List < Recipe > recipes = new ArrayList < Recipe > ( ) ;
Iterator < Recipe > iterator = Bukkit . recipeIterator ( ) ;
while ( iterator . hasNext ( ) ) {
Recipe r = iterator . next ( ) ;
if ( SlimefunManager . isItemSimiliar ( new CustomItem ( r . getResult ( ) , 1 ) , item , true ) & & r . getResult ( ) . getData ( ) . getData ( ) = = item . getData ( ) . getData ( ) ) recipes . add ( r ) ;
}
if ( recipes . isEmpty ( ) ) return ;
Recipe r = recipes . get ( page ) ;
if ( recipes . size ( ) > page + 1 ) {
2016-11-23 15:51:57 +00:00
menu . addItem ( 1 , new CustomItem ( new MaterialData ( Material . ENCHANTED_BOOK ) , " &7Next \ u21E8 " , " " , " &e&l! &rThere are multiple recipes for this Item " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 1 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack stack , ClickAction action ) {
displayItem ( p , item , false , experimental , page + 1 ) ;
return false ;
}
} ) ;
}
if ( r instanceof ShapedRecipe ) {
String [ ] shape = ( ( ShapedRecipe ) r ) . getShape ( ) ;
for ( int i = 0 ; i < shape . length ; i + + ) {
for ( int j = 0 ; j < shape [ i ] . length ( ) ; j + + ) {
ItemStack ingredient = ( ( ShapedRecipe ) r ) . getIngredientMap ( ) . get ( shape [ i ] . charAt ( j ) ) ;
if ( ingredient ! = null ) {
MaterialData data = ingredient . getData ( ) ;
if ( ingredient . getData ( ) . getData ( ) < 0 ) data . setData ( ( byte ) 0 ) ;
ingredient = data . toItemStack ( ingredient . getAmount ( ) ) ;
}
recipe [ i * 3 + j ] = ingredient ;
}
}
recipeType = RecipeType . SHAPED_RECIPE . toItem ( ) ;
recipeOutput = r . getResult ( ) ;
}
else if ( r instanceof ShapelessRecipe ) {
List < ItemStack > ingredients = ( ( ShapelessRecipe ) r ) . getIngredientList ( ) ;
for ( int i = 0 ; i < ingredients . size ( ) ; i + + ) {
ItemStack ingredient = ingredients . get ( i ) ;
if ( ingredient ! = null ) {
MaterialData data = ingredient . getData ( ) ;
if ( ingredient . getData ( ) . getData ( ) < 0 ) data . setData ( ( byte ) 0 ) ;
ingredient = data . toItemStack ( ingredient . getAmount ( ) ) ;
}
recipe [ i ] = ingredient ;
}
recipeType = RecipeType . SHAPELESS_RECIPE . toItem ( ) ;
recipeOutput = r . getResult ( ) ;
}
else if ( r instanceof FurnaceRecipe ) {
ItemStack ingredient = ( ( FurnaceRecipe ) r ) . getInput ( ) ;
if ( ingredient ! = null ) {
MaterialData data = ingredient . getData ( ) ;
if ( ingredient . getData ( ) . getData ( ) < 0 ) data . setData ( ( byte ) 0 ) ;
ingredient = data . toItemStack ( ingredient . getAmount ( ) ) ;
}
recipe [ 4 ] = ingredient ;
recipeType = RecipeType . FURNACE . toItem ( ) ;
recipeOutput = r . getResult ( ) ;
}
}
if ( addToHistory ) addToHistory ( p , sfItem ! = null ? sfItem . getURID ( ) : URID . nextURID ( item , true ) ) ;
if ( history . containsKey ( p . getUniqueId ( ) ) & & history . get ( p . getUniqueId ( ) ) . size ( ) > 1 ) {
2016-11-23 15:51:57 +00:00
menu . addItem ( 0 , new CustomItem ( new MaterialData ( Material . ENCHANTED_BOOK ) , " &7 \ u21E6 Back " , " " , " &rLeft Click: &7Go back to previous Page " , " &rShift + left Click: &7Go back to Main Menu " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 0 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
if ( action . isShiftClicked ( ) ) openMainMenu ( p , true , experimental , 1 ) ;
else {
URID last = getLastEntry ( p , true ) ;
if ( URID . decode ( last ) instanceof Category ) openCategory ( p , ( Category ) URID . decode ( last ) , true , 1 , experimental ) ;
else if ( URID . decode ( last ) instanceof SlimefunItem ) displayItem ( p , ( ( SlimefunItem ) URID . decode ( last ) ) . getItem ( ) , false , experimental , 0 ) ;
else if ( URID . decode ( last ) instanceof GuideHandler ) ( ( GuideHandler ) URID . decode ( last ) ) . run ( p , true ) ;
else displayItem ( p , ( ItemStack ) URID . decode ( last ) , false , experimental , 0 ) ;
}
return false ;
}
} ) ;
}
else {
2016-11-23 15:51:57 +00:00
menu . addItem ( 0 , new CustomItem ( new MaterialData ( Material . ENCHANTED_BOOK ) , " &7 \ u21E6 Back " , " " , " &rLeft Click: &7Go back to Main Menu " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 0 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
openMainMenu ( p , true , experimental , 1 ) ;
return false ;
}
} ) ;
}
2016-05-16 11:03:26 +00:00
menu . addItem ( 3 , Slimefun . hasUnlocked ( p , recipe [ 0 ] , false ) ? recipe [ 0 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 0 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 0 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 3 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 4 , Slimefun . hasUnlocked ( p , recipe [ 1 ] , false ) ? recipe [ 1 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 1 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 1 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 4 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 5 , Slimefun . hasUnlocked ( p , recipe [ 2 ] , false ) ? recipe [ 2 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 2 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 2 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 5 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
if ( sfItem ! = null ) {
if ( Slimefun . getItemConfig ( ) . contains ( sfItem . getName ( ) + " .wiki " ) ) {
try {
2016-11-23 15:51:57 +00:00
menu . addItem ( 8 , new CustomItem ( CustomSkull . getItem ( " eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzY2OTJmOTljYzZkNzgyNDIzMDQxMTA1NTM1ODk0ODQyOThiMmU0YTAyMzNiNzY3NTNmODg4ZTIwN2VmNSJ9fX0= " ) , " &rView this Item in our Wiki &7(Slimefun Wiki) " , " " , " &7 \ u21E8 Click to open " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 8 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
p . closeInventory ( ) ;
p . sendMessage ( " " ) ;
2016-11-28 18:18:19 +00:00
p . sendMessage ( ChatColor . translateAlternateColorCodes ( '&' , " &7&o " + Slimefun . getItemConfig ( ) . getString ( sfItem . getName ( ) + " .wiki " ) ) ) ;
2016-04-14 16:24:03 +00:00
p . sendMessage ( " " ) ;
return false ;
}
} ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
if ( Slimefun . getItemConfig ( ) . contains ( sfItem . getName ( ) + " .youtube " ) ) {
try {
2016-11-23 15:51:57 +00:00
menu . addItem ( 7 , new CustomItem ( CustomSkull . getItem ( " eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzNTNmZDBmODYzMTQzNTM4NzY1ODYwNzViOWJkZjBjNDg0YWFiMDMzMWI4NzJkZjExYmQ1NjRmY2IwMjllZCJ9fX0= " ) , " &rDemonstration Video &7(Youtube) " , " " , " &7 \ u21E8 Click to watch " ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 7 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
p . closeInventory ( ) ;
p . sendMessage ( " " ) ;
2016-11-28 18:18:19 +00:00
p . sendMessage ( ChatColor . translateAlternateColorCodes ( '&' , " &7&o " + Slimefun . getItemConfig ( ) . getString ( sfItem . getName ( ) + " .youtube " ) ) ) ;
2016-04-14 16:24:03 +00:00
p . sendMessage ( " " ) ;
return false ;
}
} ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
}
menu . addItem ( 10 , recipeType ) ;
menu . addMenuClickHandler ( 10 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 12 , Slimefun . hasUnlocked ( p , recipe [ 3 ] , false ) ? recipe [ 3 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 3 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 3 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 12 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 13 , Slimefun . hasUnlocked ( p , recipe [ 4 ] , false ) ? recipe [ 4 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 4 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 4 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 13 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 14 , Slimefun . hasUnlocked ( p , recipe [ 5 ] , false ) ? recipe [ 5 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 5 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 5 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 14 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
menu . addItem ( 16 , recipeOutput ) ;
menu . addMenuClickHandler ( 16 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 21 , Slimefun . hasUnlocked ( p , recipe [ 6 ] , false ) ? recipe [ 6 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 6 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 6 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 21 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 22 , Slimefun . hasUnlocked ( p , recipe [ 7 ] , false ) ? recipe [ 7 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 7 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 7 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 22 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
2016-05-16 11:03:26 +00:00
menu . addItem ( 23 , Slimefun . hasUnlocked ( p , recipe [ 8 ] , false ) ? recipe [ 8 ] : new CustomItem ( Material . BARRIER , StringUtils . formatItemName ( recipe [ 8 ] , false ) , 0 , new String [ ] { " &4&lLOCKED " , " " , Slimefun . hasPermission ( p , SlimefunItem . getByItem ( recipe [ 8 ] ) , false ) ? " &rNeeds to be unlocked elsewhere " : " &rNo Permission " } ) ) ;
2016-04-14 16:24:03 +00:00
menu . addMenuClickHandler ( 23 , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
displayItem ( p , item , true , experimental , 0 ) ;
return false ;
}
} ) ;
if ( sfItem ! = null ) {
if ( ( sfItem instanceof SlimefunMachine & & ( ( SlimefunMachine ) sfItem ) . getDisplayRecipes ( ) . size ( ) > 0 ) | | ( sfItem instanceof SlimefunGadget & & ( ( SlimefunGadget ) sfItem ) . getRecipes ( ) . size ( ) > 0 ) ) {
for ( int i = 27 ; i < 36 ; i + + ) {
menu . addItem ( i , new CustomItem ( Material . STAINED_GLASS_PANE , SlimefunItem . getByItem ( item ) instanceof SlimefunMachine ? " &7 \ u21E9 Recipes made in this Machine \ u21E9 " : " " , 7 ) ) ;
menu . addMenuClickHandler ( i , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player arg0 , int arg1 , ItemStack arg2 , ClickAction arg3 ) {
return false ;
}
} ) ;
}
List < ItemStack > recipes = SlimefunItem . getByItem ( item ) instanceof SlimefunMachine ? ( ( SlimefunMachine ) SlimefunItem . getByItem ( item ) ) . getDisplayRecipes ( ) : ( ( SlimefunGadget ) SlimefunItem . getByItem ( item ) ) . getDisplayRecipes ( ) ;
int recipe_size = recipes . size ( ) ;
if ( recipe_size > 18 ) recipe_size = 18 ;
int inputs = - 1 , outputs = - 1 ;
for ( int i = 0 ; i < recipe_size ; i + + ) {
int slot = 36 ;
if ( i % 2 = = 1 ) {
slot = slot + 9 ;
outputs + + ;
}
else inputs + + ;
int addition = ( i % 2 = = 0 ? inputs : outputs ) ;
menu . addItem ( slot + addition , recipes . get ( i ) ) ;
menu . addMenuClickHandler ( slot + addition , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
return false ;
}
} ) ;
}
}
else if ( sfItem instanceof AGenerator ) {
int slot = 27 ;
for ( MachineFuel fuel : ( ( AGenerator ) sfItem ) . getFuelTypes ( ) ) {
if ( slot > 54 ) break ;
ItemStack fItem = fuel . getInput ( ) . clone ( ) ;
ItemMeta im = fItem . getItemMeta ( ) ;
List < String > lore = new ArrayList < String > ( ) ;
2016-11-27 18:57:36 +00:00
lore . add ( ChatColor . translateAlternateColorCodes ( '&' , " &8 \ u21E8 &7Lasts " + getTimeLeft ( fuel . getTicks ( ) / 2 ) ) ) ;
lore . add ( ChatColor . translateAlternateColorCodes ( '&' , " &8 \ u21E8 &e \ u26A1 &7 " + ( ( ( AGenerator ) sfItem ) . getEnergyProduction ( ) * 2 ) + " J/s " ) ) ;
lore . add ( ChatColor . translateAlternateColorCodes ( '&' , " &8 \ u21E8 &e \ u26A1 &7 " + DoubleHandler . getFancyDouble ( fuel . getTicks ( ) * ( ( AGenerator ) sfItem ) . getEnergyProduction ( ) ) + " J in total " ) ) ;
2016-04-14 16:24:03 +00:00
im . setLore ( lore ) ;
fItem . setItemMeta ( im ) ;
menu . addItem ( slot , fItem ) ;
menu . addMenuClickHandler ( slot , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
return false ;
}
} ) ;
slot + + ;
}
}
2016-11-20 16:50:20 +00:00
else if ( sfItem instanceof AReactor ) {
2016-04-14 16:24:03 +00:00
int slot = 27 ;
2016-11-20 16:50:20 +00:00
for ( MachineFuel fuel : ( ( AReactor ) sfItem ) . getFuelTypes ( ) ) {
2016-04-14 16:24:03 +00:00
if ( slot > 54 ) break ;
ItemStack fItem = fuel . getInput ( ) . clone ( ) ;
ItemMeta im = fItem . getItemMeta ( ) ;
List < String > lore = new ArrayList < String > ( ) ;
2016-11-27 18:57:36 +00:00
lore . add ( ChatColor . translateAlternateColorCodes ( '&' , " &8 \ u21E8 &7Lasts " + getTimeLeft ( fuel . getTicks ( ) / 2 ) ) ) ;
lore . add ( ChatColor . translateAlternateColorCodes ( '&' , " &8 \ u21E8 &e \ u26A1 &7 " + ( ( ( AReactor ) sfItem ) . getEnergyProduction ( ) * 2 ) + " J/s " ) ) ;
lore . add ( ChatColor . translateAlternateColorCodes ( '&' , " &8 \ u21E8 &e \ u26A1 &7 " + DoubleHandler . getFancyDouble ( fuel . getTicks ( ) * ( ( AReactor ) sfItem ) . getEnergyProduction ( ) ) + " J in total " ) ) ;
2016-04-14 16:24:03 +00:00
im . setLore ( lore ) ;
fItem . setItemMeta ( im ) ;
menu . addItem ( slot , fItem ) ;
menu . addMenuClickHandler ( slot , new MenuClickHandler ( ) {
@Override
public boolean onClick ( Player p , int slot , ItemStack item , ClickAction action ) {
return false ;
}
} ) ;
slot + + ;
}
}
}
menu . build ( ) . open ( p ) ;
}
public static void clearHistory ( UUID uuid ) {
if ( ! history . containsKey ( uuid ) ) return ;
for ( URID urid : history . get ( uuid ) ) {
urid . markDirty ( ) ;
}
history . remove ( uuid ) ;
}
private static String getTimeLeft ( int l ) {
String timeleft = " " ;
final int minutes = ( int ) ( l / 60L ) ;
if ( minutes > 0 ) {
timeleft = String . valueOf ( timeleft ) + minutes + " m " ;
}
l - = minutes * 60 ;
final int seconds = ( int ) l ;
timeleft = String . valueOf ( timeleft ) + seconds + " s " ;
2016-11-23 15:51:57 +00:00
return " &7 " + timeleft ;
2016-04-14 16:24:03 +00:00
}
}