2014-04-29 10:54:20 +10:00
package codechicken.nei ;
2019-12-24 13:37:41 -08:00
import codechicken.core.CCUpdateChecker ;
import codechicken.core.ClassDiscoverer ;
import codechicken.core.ClientUtils ;
import codechicken.core.CommonUtils ;
2014-04-29 10:54:20 +10:00
import codechicken.lib.config.ConfigFile ;
import codechicken.lib.config.ConfigTag ;
import codechicken.lib.config.ConfigTagParent ;
2019-12-24 13:37:41 -08:00
import codechicken.nei.api.API ;
import codechicken.nei.api.GuiInfo ;
import codechicken.nei.api.IConfigureNEI ;
import codechicken.nei.api.ItemInfo ;
import codechicken.nei.api.NEIInfo ;
import codechicken.nei.config.ConfigSet ;
import codechicken.nei.config.GuiHighlightTips ;
import codechicken.nei.config.GuiNEIOptionList ;
import codechicken.nei.config.GuiOptionList ;
import codechicken.nei.config.OptionCycled ;
import codechicken.nei.config.OptionGamemodes ;
import codechicken.nei.config.OptionList ;
import codechicken.nei.config.OptionOpenGui ;
import codechicken.nei.config.OptionTextField ;
import codechicken.nei.config.OptionToggleButton ;
2021-03-20 22:38:46 -07:00
import codechicken.nei.config.OptionToggleButtonBoubs ;
2019-12-24 13:37:41 -08:00
import codechicken.nei.config.OptionUtilities ;
2021-08-13 22:49:00 +03:00
import codechicken.nei.event.NEIConfigsLoadedEvent ;
2021-03-28 00:12:17 -07:00
import codechicken.nei.recipe.GuiRecipeTab ;
2021-10-16 11:31:43 -06:00
import codechicken.nei.recipe.IRecipeHandler ;
2014-04-29 10:54:20 +10:00
import codechicken.nei.recipe.RecipeInfo ;
2021-10-16 11:31:43 -06:00
import codechicken.nei.recipe.TemplateRecipeHandler ;
2014-04-29 10:54:20 +10:00
import codechicken.obfuscator.ObfuscationRun ;
2021-10-16 11:31:43 -06:00
import com.google.common.base.Objects ;
2014-04-29 10:54:20 +10:00
import net.minecraft.client.Minecraft ;
2014-07-25 14:45:45 +10:00
import net.minecraft.client.gui.GuiScreen ;
2014-04-29 10:54:20 +10:00
import net.minecraft.item.ItemStack ;
import net.minecraft.nbt.NBTTagCompound ;
import net.minecraft.world.World ;
import net.minecraft.world.storage.SaveFormatComparator ;
2021-08-13 22:49:00 +03:00
import net.minecraftforge.common.MinecraftForge ;
2014-04-29 10:54:20 +10:00
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
import org.lwjgl.input.Keyboard ;
import java.io.File ;
2021-10-16 11:31:43 -06:00
import java.util.Comparator ;
import java.util.HashMap ;
2014-04-29 10:54:20 +10:00
import java.util.HashSet ;
import java.util.List ;
2021-10-16 11:31:43 -06:00
import java.util.function.Function ;
2021-11-28 15:25:48 -07:00
import java.util.regex.Pattern ;
2014-04-29 10:54:20 +10:00
2021-04-13 20:16:56 -07:00
public class NEIClientConfig {
2014-04-29 10:54:20 +10:00
private static boolean configLoaded ;
private static boolean enabledOverride ;
public static Logger logger = LogManager . getLogger ( "NotEnoughItems" );
public static File configDir = new File ( CommonUtils . getMinecraftDir (), "config/NEI/" );
public static ConfigSet global = new ConfigSet (
new File ( "saves/NEI/client.dat" ),
new ConfigFile ( new File ( configDir , "client.cfg" )));
public static ConfigSet world ;
2019-12-30 20:19:16 -08:00
public static final File bookmarkFile = new File ( configDir , "bookmarks.ini" );
2021-03-28 00:12:17 -07:00
public static final File handlerFile = new File ( configDir , "handlers.csv" );
2021-04-13 20:16:56 -07:00
public static final File serialHandlersFile = new File ( configDir , "serialhandlers.cfg" );
2021-10-16 11:31:43 -06:00
public static final File heightHackHandlersFile = new File ( configDir , "heighthackhandlers.cfg" );
public static final File handlerOrderingFile = new File ( configDir , "handlerordering.csv" );
2021-04-13 20:16:56 -07:00
// Set of handlers that need to be run in serial
2021-10-16 11:31:43 -06:00
public static HashSet < String > serialHandlers = new HashSet <> ();
2021-11-28 15:25:48 -07:00
// Set of regexes matching handler ID of handlers that need the hack in GuiRecipe.startHeightHack().
// We use regex here so that we can apply the height hack to entire mods with one entry.
public static HashSet < Pattern > heightHackHandlerRegex = new HashSet <> ();
2021-10-16 11:31:43 -06:00
// Map of handler ID to sort order.
// Handlers will be sorted in ascending order, so smaller numbers show up earlier.
// Any handler not in the map will be assigned to 0, and negative numbers are fine.
public static HashMap < String , Integer > handlerOrdering = new HashMap <> ();
// Function that extracts the handler ID from a handler, with special logic for
// TemplateRecipeHandler: prefer using the overlay ID if it exists.
public static final Function < IRecipeHandler , String > HANDLER_ID_FUNCTION =
handler -> handler instanceof TemplateRecipeHandler
? Objects . firstNonNull (
(( TemplateRecipeHandler ) handler ). getOverlayIdentifier (),
handler . getHandlerId ())
: handler . getHandlerId ();
// Comparator that compares handlers using the handlerOrdering map.
public static final Comparator < IRecipeHandler > HANDLER_COMPARATOR =
Comparator . comparingInt (
handler -> handlerOrdering . getOrDefault (
HANDLER_ID_FUNCTION . apply ( handler ), 0 ));
2014-04-29 10:54:20 +10:00
2019-12-24 13:37:41 -08:00
public static ItemStack [] creativeInv ;
2014-04-29 10:54:20 +10:00
public static boolean hasSMPCounterpart ;
2019-12-30 20:19:16 -08:00
public static HashSet < String > permissableActions = new HashSet <> ();
public static HashSet < String > disabledActions = new HashSet <> ();
public static HashSet < String > enabledActions = new HashSet <> ();
2014-04-29 10:54:20 +10:00
public static ItemStackSet bannedBlocks = new ItemStackSet ();
static {
if ( global . config . getTag ( "checkUpdates" ). getBooleanValue ( true ))
CCUpdateChecker . updateCheck ( "NotEnoughItems" );
linkOptionList ();
setDefaults ();
}
private static void setDefaults () {
ConfigTagParent tag = global . config ;
tag . setComment ( "Main configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value" );
tag . getTag ( "command" ). useBraces (). setComment ( "Change these options if you have a different mod installed on the server that handles the commands differently, Eg. Bukkit Essentials" );
tag . setNewLineMode ( 1 );
tag . getTag ( "inventory.widgetsenabled" ). getBooleanValue ( true );
API . addOption ( new OptionToggleButton ( "inventory.widgetsenabled" ));
2021-11-22 05:31:02 +02:00
2014-04-29 10:54:20 +10:00
tag . getTag ( "inventory.hidden" ). getBooleanValue ( false );
tag . getTag ( "inventory.cheatmode" ). getIntValue ( 2 );
tag . getTag ( "inventory.lockmode" ). setComment ( "For those who can't help themselves.\nSet this to a mode and you will be unable to change it ingame" ). getIntValue ( - 1 );
API . addOption ( new OptionCycled ( "inventory.cheatmode" , 3 )
{
@Override
public boolean optionValid ( int index ) {
return getLockedMode () == - 1 || getLockedMode () == index && NEIInfo . isValidMode ( index );
}
});
checkCheatMode ();
tag . getTag ( "inventory.utilities" ). setDefaultValue ( "delete, magnet" );
API . addOption ( new OptionUtilities ( "inventory.utilities" ));
tag . getTag ( "inventory.gamemodes" ). setDefaultValue ( "creative, creative+, adventure" );
API . addOption ( new OptionGamemodes ( "inventory.gamemodes" ));
2014-06-29 20:31:37 +10:00
ItemSorter . initConfig ( tag );
2014-04-29 10:54:20 +10:00
tag . getTag ( "inventory.itemIDs" ). getIntValue ( 1 );
API . addOption ( new OptionCycled ( "inventory.itemIDs" , 3 , true ));
2014-06-29 20:31:37 +10:00
tag . getTag ( "inventory.searchmode" ). getIntValue ( 1 );
API . addOption ( new OptionCycled ( "inventory.searchmode" , 3 , true ));
2014-04-29 10:54:20 +10:00
tag . getTag ( "world.highlight_tips" ). getBooleanValue ( false );
tag . getTag ( "world.highlight_tips.x" ). getIntValue ( 5000 );
tag . getTag ( "world.highlight_tips.y" ). getIntValue ( 100 );
2014-06-29 20:31:37 +10:00
API . addOption ( new OptionOpenGui ( "world.highlight_tips" , GuiHighlightTips . class ));
2014-04-29 10:54:20 +10:00
tag . getTag ( "inventory.profileRecipes" ). getBooleanValue ( false );
API . addOption ( new OptionToggleButton ( "inventory.profileRecipes" , true ));
2021-04-10 22:42:09 -07:00
tag . getTag ( "inventory.disableMouseScrollTransfer" ). getBooleanValue ( false );
API . addOption ( new OptionToggleButton ( "inventory.disableMouseScrollTransfer" , true ));
tag . getTag ( "inventory.invertMouseScrollTransfer" ). getBooleanValue ( false );
API . addOption ( new OptionToggleButton ( "inventory.invertMouseScrollTransfer" , true ) {
@Override
public boolean isEnabled () {
return isMouseScrollTransferEnabled ();
}
});
2014-04-29 10:54:20 +10:00
tag . getTag ( "command.creative" ). setDefaultValue ( "/gamemode {0} {1}" );
API . addOption ( new OptionTextField ( "command.creative" ));
2014-06-29 20:31:37 +10:00
tag . getTag ( "command.item" ). setDefaultValue ( "/give {0} {1} {2} {3} {4}" );
2014-04-29 10:54:20 +10:00
API . addOption ( new OptionTextField ( "command.item" ));
tag . getTag ( "command.time" ). setDefaultValue ( "/time set {0}" );
API . addOption ( new OptionTextField ( "command.time" ));
tag . getTag ( "command.rain" ). setDefaultValue ( "/toggledownfall" );
API . addOption ( new OptionTextField ( "command.rain" ));
tag . getTag ( "command.heal" ). setDefaultValue ( "" );
API . addOption ( new OptionTextField ( "command.heal" ));
2021-11-22 05:31:02 +02:00
2021-03-20 22:38:46 -07:00
tag . getTag ( "inventory.bookmarksEnabled" ). setComment ( "Enable/disable bookmarks" ). getBooleanValue ( true );
API . addOption ( new OptionToggleButton ( "inventory.bookmarksEnabled" , true ));
2021-11-22 05:31:02 +02:00
tag . getTag ( "inventory.saveCurrentRecipeInBookmarksEnabled" ). setComment ( "Save Current Recipe in Bookmarks" ). getBooleanValue ( true );
API . addOption ( new OptionToggleButton ( "inventory.saveCurrentRecipeInBookmarksEnabled" , true ));
tag . getTag ( "inventory.useNBTInBookmarks" ). setComment ( "Use NBT in Bookmarks" ). getBooleanValue ( true );
API . addOption ( new OptionToggleButton ( "inventory.useNBTInBookmarks" , true ));
2021-03-20 22:38:46 -07:00
tag . getTag ( "inventory.jei_style_tabs" ). setComment ( "Enable/disable JEI Style Tabs" ). getBooleanValue ( true );
API . addOption ( new OptionToggleButtonBoubs ( "inventory.jei_style_tabs" , true ));
2021-05-22 18:31:40 +01:00
tag . getTag ( "inventory.jei_style_item_presence_overlay" ). setComment ( "Enable/disable JEI Style item presence overlay on ?-hover" ). getBooleanValue ( true );
API . addOption ( new OptionToggleButton ( "inventory.jei_style_item_presence_overlay" , true ));
2021-11-22 05:31:02 +02:00
2021-03-22 20:22:00 -07:00
tag . getTag ( "inventory.creative_tab_style" ). setComment ( "Creative or JEI style tabs" ). getBooleanValue ( false );
API . addOption ( new OptionToggleButton ( "inventory.creative_tab_style" , true ));
2021-03-28 00:12:17 -07:00
tag . getTag ( "tools.handler_load_from_config" ). setComment ( "ADVANCED: Load handlers from config" ). getBooleanValue ( false );
API . addOption ( new OptionToggleButton ( "tools.handler_load_from_config" , true ) {
@Override
public boolean onClick ( int button ) {
super . onClick ( button );
GuiRecipeTab . loadHandlerInfo ();
return true ;
}
});
2014-04-29 10:54:20 +10:00
setDefaultKeyBindings ();
}
private static void linkOptionList () {
2014-07-25 14:45:45 +10:00
OptionList . setOptionList ( new OptionList ( "nei.options" )
2014-04-29 10:54:20 +10:00
{
2014-07-25 14:45:45 +10:00
@Override
public ConfigSet globalConfigSet () {
return global ;
}
2014-04-29 10:54:20 +10:00
@Override
public ConfigSet worldConfigSet () {
return world ;
}
@Override
2014-07-25 14:45:45 +10:00
public OptionList configBase () {
return this ;
}
@Override
public GuiOptionList getGui ( GuiScreen parent , OptionList list , boolean world ) {
return new GuiNEIOptionList ( parent , list , world );
2014-04-29 10:54:20 +10:00
}
});
}
private static void setDefaultKeyBindings () {
API . addKeyBind ( "gui.recipe" , Keyboard . KEY_R );
API . addKeyBind ( "gui.usage" , Keyboard . KEY_U );
API . addKeyBind ( "gui.back" , Keyboard . KEY_BACK );
API . addKeyBind ( "gui.enchant" , Keyboard . KEY_X );
API . addKeyBind ( "gui.potion" , Keyboard . KEY_P );
API . addKeyBind ( "gui.prev" , Keyboard . KEY_PRIOR );
API . addKeyBind ( "gui.next" , Keyboard . KEY_NEXT );
2020-01-02 21:00:34 -08:00
API . addKeyBind ( "gui.prev_machine" , Keyboard . KEY_UP );
API . addKeyBind ( "gui.next_machine" , Keyboard . KEY_DOWN );
API . addKeyBind ( "gui.prev_recipe" , Keyboard . KEY_LEFT );
API . addKeyBind ( "gui.next_recipe" , Keyboard . KEY_RIGHT );
2014-04-29 10:54:20 +10:00
API . addKeyBind ( "gui.hide" , Keyboard . KEY_O );
API . addKeyBind ( "gui.search" , Keyboard . KEY_F );
2019-12-24 13:37:41 -08:00
API . addKeyBind ( "gui.bookmark" , Keyboard . KEY_A );
2021-03-14 12:22:27 -07:00
API . addKeyBind ( "gui.hide_bookmarks" , Keyboard . KEY_B );
2014-04-29 10:54:20 +10:00
API . addKeyBind ( "world.chunkoverlay" , Keyboard . KEY_F9 );
API . addKeyBind ( "world.moboverlay" , Keyboard . KEY_F7 );
API . addKeyBind ( "world.highlight_tips" , Keyboard . KEY_NUMPAD0 );
API . addKeyBind ( "world.dawn" , 0 );
API . addKeyBind ( "world.noon" , 0 );
API . addKeyBind ( "world.dusk" , 0 );
API . addKeyBind ( "world.midnight" , 0 );
API . addKeyBind ( "world.rain" , 0 );
API . addKeyBind ( "world.heal" , 0 );
API . addKeyBind ( "world.creative" , 0 );
}
public static OptionList getOptionList () {
return OptionList . getOptionList ( "nei.options" );
}
public static void loadWorld ( String saveName ) {
setInternalEnabled ( true );
logger . debug ( "Loading " + ( Minecraft . getMinecraft (). isSingleplayer () ? "Local" : "Remote" ) + " World" );
bootNEI ( ClientUtils . getWorld ());
File saveDir = new File ( CommonUtils . getMinecraftDir (), "saves/NEI/" + saveName );
boolean newWorld = ! saveDir . exists ();
if ( newWorld )
saveDir . mkdirs ();
world = new ConfigSet ( new File ( saveDir , "NEI.dat" ), new ConfigFile ( new File ( saveDir , "NEI.cfg" )));
onWorldLoad ( newWorld );
}
private static void onWorldLoad ( boolean newWorld ) {
world . config . setComment ( "World based configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value" );
setWorldDefaults ();
creativeInv = new ItemStack [ 54 ] ;
LayoutManager . searchField . setText ( getSearchExpression ());
LayoutManager . quantity . setText ( Integer . toString ( getItemQuantity ()));
2014-07-03 19:28:59 +10:00
SubsetWidget . loadHidden ();
2014-04-29 10:54:20 +10:00
if ( newWorld && Minecraft . getMinecraft (). isSingleplayer ())
2014-05-02 11:16:20 +10:00
world . config . getTag ( "inventory.cheatmode" ). setIntValue ( NEIClientUtils . mc (). playerController . isInCreativeMode () ? 2 : 0 );
2014-04-29 10:54:20 +10:00
NEIInfo . load ( ClientUtils . getWorld ());
}
private static void setWorldDefaults () {
NBTTagCompound nbt = world . nbt ;
if ( ! nbt . hasKey ( "search" )) nbt . setString ( "search" , "" );
if ( ! nbt . hasKey ( "quantity" )) nbt . setInteger ( "quantity" , 0 );
if ( ! nbt . hasKey ( "validateenchantments" )) nbt . setBoolean ( "validateenchantments" , false );
world . saveNBT ();
}
public static int getKeyBinding ( String string ) {
return getSetting ( "keys." + string ). getIntValue ();
}
public static void setDefaultKeyBinding ( String string , int key ) {
getSetting ( "keys." + string ). getIntValue ( key );
}
public static void bootNEI ( World world ) {
if ( configLoaded )
return ;
ItemInfo . load ( world );
GuiInfo . load ();
RecipeInfo . load ();
LayoutManager . load ();
NEIController . load ();
configLoaded = true ;
2020-07-29 08:03:43 +00:00
new Thread ( "NEI Plugin Loader" ) {
@Override
public void run () {
ClassDiscoverer classDiscoverer = new ClassDiscoverer ( test -> test . startsWith ( "NEI" ) && test . endsWith ( "Config.class" ), IConfigureNEI . class );
classDiscoverer . findClasses ();
for ( Class <?> clazz : classDiscoverer . classes ) {
try {
IConfigureNEI config = ( IConfigureNEI ) clazz . newInstance ();
config . loadConfig ();
NEIModContainer . plugins . add ( config );
logger . debug ( "Loaded " + clazz . getName ());
} catch ( Exception e ) {
logger . error ( "Failed to Load " + clazz . getName (), e );
}
}
2021-08-13 22:49:00 +03:00
MinecraftForge . EVENT_BUS . post ( new NEIConfigsLoadedEvent ());
2014-04-29 10:54:20 +10:00
}
2020-07-29 08:03:43 +00:00
}. start ();
2014-06-29 20:31:37 +10:00
ItemSorter . loadConfig ();
2014-04-29 10:54:20 +10:00
}
public static boolean isWorldSpecific ( String setting ) {
2014-12-14 14:32:30 +10:00
if ( world == null ) return false ;
ConfigTag tag = world . config . getTag ( setting , false );
return tag != null && tag . value != null ;
2014-04-29 10:54:20 +10:00
}
public static ConfigTag getSetting ( String s ) {
return isWorldSpecific ( s ) ? world . config . getTag ( s ) : global . config . getTag ( s );
}
public static boolean getBooleanSetting ( String s ) {
return getSetting ( s ). getBooleanValue ();
}
public static boolean isHidden () {
return ! enabledOverride || getBooleanSetting ( "inventory.hidden" );
}
2021-03-14 12:22:27 -07:00
public static boolean isBookmarkPanelHidden () {
2021-03-20 22:38:46 -07:00
return ! getBooleanSetting ( "inventory.bookmarksEnabled" );
}
2021-11-22 05:31:02 +02:00
public static boolean saveCurrentRecipeInBookmarksEnabled () {
return getBooleanSetting ( "inventory.saveCurrentRecipeInBookmarksEnabled" );
}
public static boolean useNBTInBookmarks () {
return getBooleanSetting ( "inventory.useNBTInBookmarks" );
}
2021-03-20 22:38:46 -07:00
public static boolean areJEIStyleTabsVisible () {
return getBooleanSetting ( "inventory.jei_style_tabs" );
2021-03-14 12:22:27 -07:00
}
2021-05-22 18:31:40 +01:00
public static boolean isJEIStyleItemPresenceOverlayVisible () {
return getBooleanSetting ( "inventory.jei_style_item_presence_overlay" );
}
2021-03-22 20:22:00 -07:00
public static boolean useCreativeTabStyle () {
return getBooleanSetting ( "inventory.creative_tab_style" );
}
2014-04-29 10:54:20 +10:00
public static boolean isEnabled () {
return enabledOverride && getBooleanSetting ( "inventory.widgetsenabled" );
}
2021-03-28 00:12:17 -07:00
public static boolean loadHandlersFromJar () {
2021-11-22 05:31:02 +02:00
return ! getBooleanSetting ( "tools.handler_load_from_config" );
2021-03-28 00:12:17 -07:00
}
2014-04-29 10:54:20 +10:00
public static void setEnabled ( boolean flag ) {
getSetting ( "inventory.widgetsenabled" ). setBooleanValue ( flag );
}
public static int getItemQuantity () {
return world . nbt . getInteger ( "quantity" );
}
public static int getCheatMode () {
return getIntSetting ( "inventory.cheatmode" );
}
private static void checkCheatMode () {
if ( getLockedMode () != - 1 )
setIntSetting ( "inventory.cheatmode" , getLockedMode ());
}
public static int getLockedMode () {
return getIntSetting ( "inventory.lockmode" );
}
public static int getLayoutStyle () {
return getIntSetting ( "inventory.layoutstyle" );
}
public static String getStringSetting ( String s ) {
return getSetting ( s ). getValue ();
}
public static boolean showIDs () {
int i = getIntSetting ( "inventory.itemIDs" );
return i == 2 || ( i == 1 && isEnabled () && ! isHidden ());
}
public static void toggleBooleanSetting ( String setting ) {
ConfigTag tag = getSetting ( setting );
tag . setBooleanValue ( ! tag . getBooleanValue ());
}
public static void cycleSetting ( String setting , int max ) {
ConfigTag tag = getSetting ( setting );
tag . setIntValue (( tag . getIntValue () + 1 ) % max );
}
public static int getIntSetting ( String setting ) {
return getSetting ( setting ). getIntValue ();
}
public static void setIntSetting ( String setting , int val ) {
getSetting ( setting ). setIntValue ( val );
}
public static String getSearchExpression () {
return world . nbt . getString ( "search" );
}
public static void setSearchExpression ( String expression ) {
world . nbt . setString ( "search" , expression );
world . saveNBT ();
}
2021-04-10 22:42:09 -07:00
public static boolean isMouseScrollTransferEnabled () {
return ! getBooleanSetting ( "inventory.disableMouseScrollTransfer" );
}
public static boolean shouldInvertMouseScrollTransfer () {
return ! getBooleanSetting ( "inventory.invertMouseScrollTransfer" );
}
2021-11-22 05:31:02 +02:00
2014-04-29 10:54:20 +10:00
public static boolean getMagnetMode () {
return enabledActions . contains ( "magnet" );
}
public static boolean invCreativeMode () {
return enabledActions . contains ( "creative+" ) && canPerformAction ( "creative+" );
}
public static boolean areDamageVariantsShown () {
return hasSMPCounterPart () || getSetting ( "command.item" ). getValue (). contains ( "{3}" );
}
public static boolean hasSMPCounterPart () {
return hasSMPCounterpart ;
}
public static void setHasSMPCounterPart ( boolean flag ) {
hasSMPCounterpart = flag ;
permissableActions . clear ();
bannedBlocks . clear ();
disabledActions . clear ();
enabledActions . clear ();
}
2014-06-29 20:31:37 +10:00
public static boolean canCheatItem ( ItemStack stack ) {
return canPerformAction ( "item" ) && ! bannedBlocks . contains ( stack );
}
2014-04-29 10:54:20 +10:00
public static boolean canPerformAction ( String name ) {
if ( ! isEnabled ())
return false ;
if ( ! modePermitsAction ( name ))
return false ;
String base = NEIActions . base ( name );
if ( hasSMPCounterpart )
return permissableActions . contains ( base );
if ( NEIActions . smpRequired ( name ))
return false ;
String cmd = getStringSetting ( "command." + base );
2019-12-24 13:37:41 -08:00
return cmd != null && cmd . startsWith ( "/" );
2014-04-29 10:54:20 +10:00
}
private static boolean modePermitsAction ( String name ) {
if ( getCheatMode () == 0 ) return false ;
if ( getCheatMode () == 2 ) return true ;
String [] actions = getStringArrSetting ( "inventory.utilities" );
for ( String action : actions )
if ( action . equalsIgnoreCase ( name ))
return true ;
return false ;
}
public static String [] getStringArrSetting ( String s ) {
return getStringSetting ( s ). replace ( " " , "" ). split ( "," );
}
public static void setInternalEnabled ( boolean b ) {
enabledOverride = b ;
}
public static void reloadSaves () {
File saveDir = new File ( CommonUtils . getMinecraftDir (), "saves/NEI/local" );
if ( ! saveDir . exists ())
return ;
List < SaveFormatComparator > saves ;
try {
saves = Minecraft . getMinecraft (). getSaveLoader (). getSaveList ();
} catch ( Exception e ) {
2014-06-29 20:31:37 +10:00
logger . error ( "Error loading saves" , e );
2014-04-29 10:54:20 +10:00
return ;
}
2019-12-30 20:19:16 -08:00
HashSet < String > saveFileNames = new HashSet <> ();
2014-04-29 10:54:20 +10:00
for ( SaveFormatComparator save : saves )
saveFileNames . add ( save . getFileName ());
2014-06-29 20:31:37 +10:00
for ( File file : saveDir . listFiles ())
2014-04-29 10:54:20 +10:00
if ( file . isDirectory () && ! saveFileNames . contains ( file . getName ()))
ObfuscationRun . deleteDir ( file , true );
}
2021-11-22 05:31:02 +02:00
2014-04-29 10:54:20 +10:00
}