mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 13:42:59 +00:00 
			
		
		
		
	Merge master into fd-limit
This commit is contained in:
		| @@ -15,7 +15,7 @@ The code in this repository will always represent the "bleeding edge" of the Com | ||||
| Contributing | ||||
| ============ | ||||
|  | ||||
| While ComputerCraft will no longer be actively developed by Daniel Ratcliffe, you may still contribute pull requests which will be reviewed and incorporated into releases periodically. A pull requests is more likely to be accepted if it meets the following criteria: | ||||
| While ComputerCraft will no longer be actively developed by Daniel Ratcliffe, you may still contribute pull requests which will be reviewed and incorporated into releases periodically. A pull request is more likely to be accepted if it meets the following criteria: | ||||
|  | ||||
| * It does not add any new dependencies for compiling, running or using the mod. | ||||
| * It does not break compatibility with world saves or programs created with previous versions of the mod. | ||||
|   | ||||
| @@ -3,9 +3,10 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2016. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|   | ||||
|  | ||||
| package dan200.computercraft; | ||||
|  | ||||
| import com.google.common.base.CaseFormat; | ||||
| import dan200.computercraft.api.filesystem.IMount; | ||||
| import dan200.computercraft.api.filesystem.IWritableMount; | ||||
| import dan200.computercraft.api.media.IMedia; | ||||
| @@ -82,7 +83,10 @@ import java.util.List; | ||||
| // UNIVERSAL // | ||||
| /////////////// | ||||
|  | ||||
| @Mod( modid = "ComputerCraft", name = "ComputerCraft", version = "${version}" ) | ||||
| @Mod( | ||||
|     modid = "ComputerCraft", name = "ComputerCraft", version = "${version}", | ||||
|     guiFactory = "dan200.computercraft.client.gui.GuiConfigCC$Factory" | ||||
| ) | ||||
| public class ComputerCraft | ||||
| { | ||||
|     // GUI IDs | ||||
| @@ -159,6 +163,32 @@ public class ComputerCraft | ||||
|         public static TurtleModem advancedModem; | ||||
|     } | ||||
|  | ||||
|     public static class Config { | ||||
|         public static Configuration config; | ||||
|  | ||||
|         public static Property http_enable; | ||||
|         public static Property http_whitelist; | ||||
|         public static Property disable_lua51_features; | ||||
|         public static Property default_computer_settings; | ||||
|  | ||||
|         public static Property enableCommandBlock; | ||||
|         public static Property turtlesNeedFuel; | ||||
|         public static Property turtleFuelLimit; | ||||
|         public static Property advancedTurtleFuelLimit; | ||||
|         public static Property turtlesObeyBlockProtection; | ||||
|         public static Property turtlesCanPush; | ||||
|  | ||||
|         public static Property modem_range; | ||||
|         public static Property modem_highAltitudeRange; | ||||
|         public static Property modem_rangeDuringStorm; | ||||
|         public static Property modem_highAltitudeRangeDuringStorm; | ||||
|  | ||||
|         public static Property computerSpaceLimit; | ||||
|         public static Property floppySpaceLimit; | ||||
|         public static Property maximumFilesOpen; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // Registries | ||||
|     public static ClientComputerRegistry clientComputerRegistry = new ClientComputerRegistry(); | ||||
|     public static ServerComputerRegistry serverComputerRegistry = new ServerComputerRegistry(); | ||||
| @@ -193,80 +223,66 @@ public class ComputerCraft | ||||
|     public void preInit( FMLPreInitializationEvent event ) | ||||
|     { | ||||
|         // Load config | ||||
|         Configuration config = new Configuration( event.getSuggestedConfigurationFile() ); | ||||
|         config.load(); | ||||
|         Config.config = new Configuration( event.getSuggestedConfigurationFile() ); | ||||
|         Config.config.load(); | ||||
|  | ||||
|         // Setup general | ||||
|         Config.http_enable = Config.config.get( Configuration.CATEGORY_GENERAL, "http_enable", http_enable ); | ||||
|         Config.http_enable.setComment( "Enable the \"http\" API on Computers (see \"http_whitelist\" for more fine grained control than this)" ); | ||||
|  | ||||
|         Property prop = config.get(Configuration.CATEGORY_GENERAL, "http_enable", http_enable); | ||||
|         prop.setComment( "Enable the \"http\" API on Computers (see \"http_whitelist\" for more fine grained control than this)" ); | ||||
|         http_enable = prop.getBoolean(http_enable); | ||||
|         Config.http_whitelist = Config.config.get( Configuration.CATEGORY_GENERAL, "http_whitelist", http_whitelist ); | ||||
|         Config.http_whitelist.setComment( "A semicolon limited list of wildcards for domains that can be accessed through the \"http\" API on Computers. Set this to \"*\" to access to the entire internet. Example: \"*.pastebin.com;*.github.com;*.computercraft.info\" will restrict access to just those 3 domains." ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "http_whitelist", http_whitelist ); | ||||
|         prop.setComment( "A semicolon limited list of wildcards for domains that can be accessed through the \"http\" API on Computers. Set this to \"*\" to access to the entire internet. Example: \"*.pastebin.com;*.github.com;*.computercraft.info\" will restrict access to just those 3 domains." ); | ||||
|         http_whitelist = prop.getString(); | ||||
|         Config.disable_lua51_features = Config.config.get( Configuration.CATEGORY_GENERAL, "disable_lua51_features", disable_lua51_features ); | ||||
|         Config.disable_lua51_features.setComment( "Set this to true to disable Lua 5.1 functions that will be removed in a future update. Useful for ensuring forward compatibility of your programs now." ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "disable_lua51_features", disable_lua51_features ); | ||||
|         prop.setComment( "Set this to true to disable Lua 5.1 functions that will be removed in a future update. Useful for ensuring forward compatibility of your programs now." ); | ||||
|         disable_lua51_features = prop.getBoolean( disable_lua51_features ); | ||||
|         Config.default_computer_settings = Config.config.get( Configuration.CATEGORY_GENERAL, "default_computer_settings", default_computer_settings ); | ||||
|         Config.default_computer_settings.setComment( "A comma seperated list of default system settings to set on new computers. Example: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\" will disable all autocompletion" ); | ||||
|  | ||||
|         prop = config.get( Configuration.CATEGORY_GENERAL, "default_computer_settings", default_computer_settings ); | ||||
|         prop.setComment( "A comma seperated list of default system settings to set on new computers. Example: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\" will disable all autocompletion" ); | ||||
|         default_computer_settings = prop.getString(); | ||||
|         Config.enableCommandBlock = Config.config.get( Configuration.CATEGORY_GENERAL, "enableCommandBlock", enableCommandBlock ); | ||||
|         Config.enableCommandBlock.setComment( "Enable Command Block peripheral support" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "enableCommandBlock", enableCommandBlock); | ||||
|         prop.setComment( "Enable Command Block peripheral support" ); | ||||
|         enableCommandBlock = prop.getBoolean(enableCommandBlock); | ||||
|         Config.modem_range = Config.config.get( Configuration.CATEGORY_GENERAL, "modem_range", modem_range ); | ||||
|         Config.modem_range.setComment( "The range of Wireless Modems at low altitude in clear weather, in meters" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "modem_range", modem_range); | ||||
|         prop.setComment( "The range of Wireless Modems at low altitude in clear weather, in meters" ); | ||||
|         modem_range = Math.min( prop.getInt(), 100000 ); | ||||
|         Config.modem_highAltitudeRange = Config.config.get( Configuration.CATEGORY_GENERAL, "modem_highAltitudeRange", modem_highAltitudeRange ); | ||||
|         Config.modem_highAltitudeRange.setComment( "The range of Wireless Modems at maximum altitude in clear weather, in meters" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "modem_highAltitudeRange", modem_highAltitudeRange); | ||||
|         prop.setComment( "The range of Wireless Modems at maximum altitude in clear weather, in meters" ); | ||||
|         modem_highAltitudeRange = Math.min( prop.getInt(), 100000 ); | ||||
|         Config.modem_rangeDuringStorm = Config.config.get( Configuration.CATEGORY_GENERAL, "modem_rangeDuringStorm", modem_rangeDuringStorm ); | ||||
|         Config.modem_rangeDuringStorm.setComment( "The range of Wireless Modems at low altitude in stormy weather, in meters" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "modem_rangeDuringStorm", modem_rangeDuringStorm); | ||||
|         prop.setComment( "The range of Wireless Modems at low altitude in stormy weather, in meters" ); | ||||
|         modem_rangeDuringStorm = Math.min( prop.getInt(), 100000 ); | ||||
|         Config.modem_highAltitudeRangeDuringStorm = Config.config.get( Configuration.CATEGORY_GENERAL, "modem_highAltitudeRangeDuringStorm", modem_highAltitudeRangeDuringStorm ); | ||||
|         Config.modem_highAltitudeRangeDuringStorm.setComment( "The range of Wireless Modems at maximum altitude in stormy weather, in meters" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "modem_highAltitudeRangeDuringStorm", modem_highAltitudeRangeDuringStorm); | ||||
|         prop.setComment( "The range of Wireless Modems at maximum altitude in stormy weather, in meters" ); | ||||
|         modem_highAltitudeRangeDuringStorm = Math.min( prop.getInt(), 100000 ); | ||||
|         Config.computerSpaceLimit = Config.config.get( Configuration.CATEGORY_GENERAL, "computerSpaceLimit", computerSpaceLimit ); | ||||
|         Config.computerSpaceLimit.setComment( "The disk space limit for computers and turtles, in bytes" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "computerSpaceLimit", computerSpaceLimit); | ||||
|         prop.setComment( "The disk space limit for computers and turtles, in bytes" ); | ||||
|         computerSpaceLimit = prop.getInt(); | ||||
|         Config.floppySpaceLimit = Config.config.get( Configuration.CATEGORY_GENERAL, "floppySpaceLimit", floppySpaceLimit ); | ||||
|         Config.floppySpaceLimit.setComment( "The disk space limit for floppy disks, in bytes" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "floppySpaceLimit", floppySpaceLimit); | ||||
|         prop.setComment( "The disk space limit for floppy disks, in bytes" ); | ||||
|         floppySpaceLimit = prop.getInt(); | ||||
|         Config.turtlesNeedFuel = Config.config.get( Configuration.CATEGORY_GENERAL, "turtlesNeedFuel", turtlesNeedFuel ); | ||||
|         Config.turtlesNeedFuel.setComment( "Set whether Turtles require fuel to move" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "maximumFilesOpen", maximumFilesOpen); | ||||
|         prop.setComment( "How many files a computer can have open at the same time" ); | ||||
|         maximumFilesOpen = prop.getInt(); | ||||
|         Config.maximumFilesOpen = Config.config.get(Configuration.CATEGORY_GENERAL, "maximumFilesOpen", maximumFilesOpen); | ||||
|         Config.maximumFilesOpen.setComment( "How many files a computer can have open at the same time" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "turtlesNeedFuel", turtlesNeedFuel); | ||||
|         prop.setComment( "Set whether Turtles require fuel to move" ); | ||||
|         turtlesNeedFuel = prop.getBoolean( turtlesNeedFuel ); | ||||
|         Config.turtleFuelLimit = Config.config.get( Configuration.CATEGORY_GENERAL, "turtleFuelLimit", turtleFuelLimit ); | ||||
|         Config.turtleFuelLimit.setComment( "The fuel limit for Turtles" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "turtleFuelLimit", turtleFuelLimit); | ||||
|         prop.setComment( "The fuel limit for Turtles" ); | ||||
|         turtleFuelLimit = prop.getInt( turtleFuelLimit ); | ||||
|         Config.advancedTurtleFuelLimit = Config.config.get( Configuration.CATEGORY_GENERAL, "advancedTurtleFuelLimit", advancedTurtleFuelLimit ); | ||||
|         Config.advancedTurtleFuelLimit.setComment( "The fuel limit for Advanced Turtles" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "advancedTurtleFuelLimit", advancedTurtleFuelLimit); | ||||
|         prop.setComment( "The fuel limit for Advanced Turtles" ); | ||||
|         advancedTurtleFuelLimit = prop.getInt(advancedTurtleFuelLimit); | ||||
|         Config.turtlesObeyBlockProtection = Config.config.get( Configuration.CATEGORY_GENERAL, "turtlesObeyBlockProtection", turtlesObeyBlockProtection ); | ||||
|         Config.turtlesObeyBlockProtection.setComment( "If set to true, Turtles will be unable to build, dig, or enter protected areas (such as near the server spawn point)" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "turtlesObeyBlockProtection", turtlesObeyBlockProtection); | ||||
|         prop.setComment(  "If set to true, Turtles will be unable to build, dig, or enter protected areas (such as near the server spawn point)" ); | ||||
|         turtlesObeyBlockProtection = prop.getBoolean( turtlesObeyBlockProtection ); | ||||
|         Config.turtlesCanPush = Config.config.get( Configuration.CATEGORY_GENERAL, "turtlesCanPush", turtlesCanPush ); | ||||
|         Config.turtlesCanPush.setComment( "If set to true, Turtles will push entities out of the way instead of stopping if there is space to do so" ); | ||||
|  | ||||
|         prop = config.get(Configuration.CATEGORY_GENERAL, "turtlesCanPush", turtlesCanPush); | ||||
|         prop.setComment( "If set to true, Turtles will push entities out of the way instead of stopping if there is space to do so" ); | ||||
|         turtlesCanPush = prop.getBoolean(turtlesCanPush); | ||||
|         for (Property property : Config.config.getCategory( Configuration.CATEGORY_GENERAL ).getOrderedValues()) | ||||
|         { | ||||
|             property.setLanguageKey( "gui.computercraft:config." + CaseFormat.LOWER_CAMEL.to( CaseFormat.LOWER_UNDERSCORE, property.getName() ) ); | ||||
|         } | ||||
|  | ||||
|         config.save(); | ||||
|         syncConfig(); | ||||
|  | ||||
|         // Setup network | ||||
|         networkEventChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel( "CC" ); | ||||
| @@ -276,6 +292,33 @@ public class ComputerCraft | ||||
|         turtleProxy.preInit(); | ||||
|     } | ||||
|  | ||||
|     public static void syncConfig() { | ||||
|  | ||||
|         http_enable = Config.http_enable.getBoolean(); | ||||
|         http_whitelist = Config.http_whitelist.getString(); | ||||
|         disable_lua51_features = Config.disable_lua51_features.getBoolean(); | ||||
|         default_computer_settings = Config.default_computer_settings.getString(); | ||||
|  | ||||
|         enableCommandBlock = Config.enableCommandBlock.getBoolean(); | ||||
|  | ||||
|         modem_range = Math.min( Config.modem_range.getInt(), 100000 ); | ||||
|         modem_highAltitudeRange = Math.min( Config.modem_highAltitudeRange.getInt(), 100000 ); | ||||
|         modem_rangeDuringStorm = Math.min( Config.modem_rangeDuringStorm.getInt(), 100000 ); | ||||
|         modem_highAltitudeRangeDuringStorm = Math.min( Config.modem_highAltitudeRangeDuringStorm.getInt(), 100000 ); | ||||
|  | ||||
|         computerSpaceLimit = Config.computerSpaceLimit.getInt(); | ||||
|         floppySpaceLimit = Config.floppySpaceLimit.getInt(); | ||||
|         maximumFilesOpen = Math.max( 0, Config.maximumFilesOpen.getInt() ); | ||||
|  | ||||
|         turtlesNeedFuel = Config.turtlesNeedFuel.getBoolean(); | ||||
|         turtleFuelLimit = Config.turtleFuelLimit.getInt(); | ||||
|         advancedTurtleFuelLimit = Config.advancedTurtleFuelLimit.getInt(); | ||||
|         turtlesObeyBlockProtection = Config.turtlesObeyBlockProtection.getBoolean(); | ||||
|         turtlesCanPush = Config.turtlesCanPush.getBoolean(); | ||||
|  | ||||
|         Config.config.save(); | ||||
|     } | ||||
|  | ||||
|     @Mod.EventHandler | ||||
|     public void init( FMLInitializationEvent event ) | ||||
|     { | ||||
|   | ||||
| @@ -0,0 +1,61 @@ | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import net.minecraft.client.Minecraft; | ||||
| import net.minecraft.client.gui.GuiScreen; | ||||
| import net.minecraftforge.common.config.ConfigElement; | ||||
| import net.minecraftforge.common.config.Configuration; | ||||
| import net.minecraftforge.common.config.Property; | ||||
| import net.minecraftforge.fml.client.IModGuiFactory; | ||||
| import net.minecraftforge.fml.client.config.GuiConfig; | ||||
| import net.minecraftforge.fml.client.config.IConfigElement; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
|  | ||||
| public class GuiConfigCC extends GuiConfig | ||||
| { | ||||
|     public GuiConfigCC( GuiScreen parentScreen ) | ||||
|     { | ||||
|         super( parentScreen, getConfigElements(), "ComputerCraft", false, false, "ComputerCraft" ); | ||||
|     } | ||||
|  | ||||
|     private static List<IConfigElement> getConfigElements() | ||||
|     { | ||||
|         ArrayList<IConfigElement> elements = new ArrayList<IConfigElement>(); | ||||
|         for (Property property : ComputerCraft.Config.config.getCategory( Configuration.CATEGORY_GENERAL ).getOrderedValues()) | ||||
|         { | ||||
|             elements.add( new ConfigElement( property ) ); | ||||
|         } | ||||
|         return elements; | ||||
|     } | ||||
|  | ||||
|     public static class Factory | ||||
|         implements IModGuiFactory | ||||
|     { | ||||
|  | ||||
|         @Override | ||||
|         public void initialize( Minecraft minecraft ) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public Class<? extends GuiScreen> mainConfigGuiClass() | ||||
|         { | ||||
|             return GuiConfigCC.class; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() | ||||
|         { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public RuntimeOptionGuiHandler getHandlerFor( RuntimeOptionCategoryElement runtimeOptionCategoryElement ) | ||||
|         { | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -231,7 +231,7 @@ public class HTTPRequest | ||||
|                 } | ||||
|             } | ||||
|         } ); | ||||
|          | ||||
|         thread.setDaemon(true); | ||||
|         thread.start(); | ||||
|     } | ||||
|      | ||||
|   | ||||
| @@ -8,6 +8,7 @@ package dan200.computercraft.core.apis; | ||||
|  | ||||
| import dan200.computercraft.api.lua.ILuaContext; | ||||
| import dan200.computercraft.api.lua.LuaException; | ||||
| import dan200.computercraft.shared.util.StringUtil; | ||||
|  | ||||
| import java.util.Arrays; | ||||
| import java.util.HashMap; | ||||
| @@ -266,11 +267,7 @@ public class OSAPI implements ILuaAPI | ||||
|                     { | ||||
|                         throw new LuaException( "Expected string or nil" ); | ||||
|                     } | ||||
|                     label = (String)args[0]; | ||||
|                     if( label.length() > 32 ) | ||||
|                     { | ||||
|                         label = label.substring( 0, 32 ); | ||||
|                     } | ||||
|                     label = StringUtil.normaliseLabel( (String) args[0] ); | ||||
|                 } | ||||
|                 m_apiEnvironment.setLabel( label ); | ||||
|                 return null; | ||||
|   | ||||
| @@ -113,6 +113,7 @@ public class ComputerThread | ||||
|                                 } ); | ||||
|                                  | ||||
|                                 // Run the task | ||||
|                                 worker.setDaemon(true); | ||||
|                                 worker.start(); | ||||
|                                 worker.join( 7000 ); | ||||
|                                  | ||||
| @@ -173,7 +174,8 @@ public class ComputerThread | ||||
|                     } | ||||
|                 } | ||||
|             }, "Computer Dispatch Thread" ); | ||||
|                  | ||||
|  | ||||
|             m_thread.setDaemon(true); | ||||
|             m_thread.start(); | ||||
|             m_running = true; | ||||
|         } | ||||
|   | ||||
| @@ -12,6 +12,7 @@ import dan200.computercraft.api.media.IMedia; | ||||
| import dan200.computercraft.api.peripheral.IComputerAccess; | ||||
| import dan200.computercraft.api.peripheral.IPeripheral; | ||||
| import dan200.computercraft.shared.media.items.ItemDiskLegacy; | ||||
| import dan200.computercraft.shared.util.StringUtil; | ||||
| import net.minecraft.item.Item; | ||||
| import net.minecraft.item.ItemStack; | ||||
|  | ||||
| @@ -87,6 +88,7 @@ public class DiskDrivePeripheral implements IPeripheral | ||||
|                 if( media != null ) | ||||
|                 { | ||||
|                     ItemStack disk = m_diskDrive.getDiskStack(); | ||||
|                     label = StringUtil.normaliseLabel( label ); | ||||
|                     if( media.setLabel( disk, label ) ) | ||||
|                     { | ||||
|                         m_diskDrive.setDiskStack( disk ); | ||||
|   | ||||
| @@ -71,6 +71,7 @@ import net.minecraft.util.text.translation.I18n; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.common.MinecraftForge; | ||||
| import net.minecraftforge.event.world.WorldEvent; | ||||
| import net.minecraftforge.fml.client.event.ConfigChangedEvent; | ||||
| import net.minecraftforge.fml.common.ObfuscationReflectionHelper; | ||||
| import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | ||||
| import net.minecraftforge.fml.common.gameevent.TickEvent; | ||||
| @@ -656,5 +657,13 @@ public abstract class ComputerCraftProxyCommon implements IComputerCraftProxy | ||||
|         public void onWorldUnload( WorldEvent.Unload event ) | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         @SubscribeEvent | ||||
|         public void onConfigChanged( ConfigChangedEvent.OnConfigChangedEvent event) { | ||||
|             if( event.getModID().equals( "ComputerCraft" ) ) | ||||
|             { | ||||
|                 ComputerCraft.syncConfig(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,26 @@ | ||||
| package dan200.computercraft.shared.util; | ||||
|  | ||||
| public class StringUtil | ||||
| { | ||||
|     public static String normaliseLabel( String label ) | ||||
|     { | ||||
|         if( label == null ) return null; | ||||
|  | ||||
|         int length = Math.min( 32, label.length() ); | ||||
|         StringBuilder builder = new StringBuilder( length ); | ||||
|         for (int i = 0; i < length; i++) | ||||
|         { | ||||
|             char c = label.charAt( i ); | ||||
|             if( (c >= ' ' && c <= '~') || (c >= 161 && c <= 172) || (c >= 174 && c <= 255) ) | ||||
|             { | ||||
|                 builder.append( c ); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 builder.append( '?' ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return builder.toString(); | ||||
|     } | ||||
| } | ||||
| @@ -39,3 +39,20 @@ upgrade.computercraft:advanced_modem.adjective=Ender | ||||
|  | ||||
| gui.computercraft:wired_modem.peripheral_connected=Peripheral "%s" connected to network | ||||
| gui.computercraft:wired_modem.peripheral_disconnected=Peripheral "%s" disconnected from network | ||||
|  | ||||
| gui.computercraft:config.http_enable=Enable HTTP API | ||||
| gui.computercraft:config.http_whitelist=HTTP whitelist | ||||
| gui.computercraft:config.disable_lua51_features=Disable Lua 5.1 features | ||||
| gui.computercraft:config.default_computer_settings=Default Computer settings | ||||
| gui.computercraft:config.enable_command_block=Enable command block peripheral | ||||
| gui.computercraft:config.modem_range=Modem range (default) | ||||
| gui.computercraft:config.modem_high_altitude_range=Modem range (high-altitude) | ||||
| gui.computercraft:config.modem_range_during_storm=Modem range (bad weather) | ||||
| gui.computercraft:config.modem_high_altitude_range_during_storm=Modem range (high-altitude, bad weather) | ||||
| gui.computercraft:config.computer_space_limit=Computer space limit (bytes) | ||||
| gui.computercraft:config.floppy_space_limit=Floppy Disk space limit (bytes) | ||||
| gui.computercraft:config.turtles_need_fuel=Enable fuel | ||||
| gui.computercraft:config.turtle_fuel_limit=Turtle fuel limit | ||||
| gui.computercraft:config.advanced_turtle_fuel_limit=Advanced Turtle fuel limit | ||||
| gui.computercraft:config.turtles_obey_block_protection=Turtles obey block protection | ||||
| gui.computercraft:config.turtles_can_push=Turtles can push entities | ||||
|   | ||||
| @@ -2,6 +2,7 @@ New Features in ComputerCraft 1.80: | ||||
|  | ||||
| * Added .getResponseHeaders() to HTTP responses. | ||||
| * Return a HTTP response when a HTTP error occurs. | ||||
| * Added a GUI to change ComputerCraft config options | ||||
|  | ||||
| New Features in ComputerCraft 1.79: | ||||
|  | ||||
|   | ||||
| @@ -2,5 +2,6 @@ New Features in ComputerCraft 1.80: | ||||
|  | ||||
| * Added .getResponseHeaders() to HTTP responses. | ||||
| * Return a HTTP response when a HTTP error occurs. | ||||
| * Added a GUI to change ComputerCraft config options | ||||
|  | ||||
| Type "help changelog" to see the full version history. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Lignum
					Lignum