mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-30 05:12:58 +00:00 
			
		
		
		
	Adds the ability to load custom bios.lua files from resource packs
Computer now delegates to IComputerEnvironment which, by default, looks in the following locations: - Resouce pack files - The "debug" folder - The original ComputerCraft jar
This commit is contained in:
		| @@ -72,10 +72,10 @@ import net.minecraftforge.fml.common.network.FMLEventChannel; | ||||
| import net.minecraftforge.fml.common.network.NetworkRegistry; | ||||
| import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; | ||||
| import net.minecraftforge.fml.relauncher.Side; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.apache.logging.log4j.Logger; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.*; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URISyntaxException; | ||||
| import java.net.URL; | ||||
| @@ -83,6 +83,8 @@ import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.zip.ZipEntry; | ||||
| import java.util.zip.ZipFile; | ||||
|  | ||||
| /////////////// | ||||
| // UNIVERSAL // | ||||
| @@ -875,6 +877,88 @@ public class ComputerCraft | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static InputStream getResourceFile( Class<?> modClass, String domain, String subPath ) | ||||
|     { | ||||
|         // Start searching in possible locations | ||||
|         subPath = "assets/" + domain + "/" + subPath; | ||||
|  | ||||
|         // Look in resource packs | ||||
|         File resourcePackDir = getResourcePackDir(); | ||||
|         if( resourcePackDir.exists() && resourcePackDir.isDirectory() ) | ||||
|         { | ||||
|             String[] resourcePacks = resourcePackDir.list(); | ||||
|             for( String resourcePackPath : resourcePacks ) | ||||
|             { | ||||
|                 File resourcePack = new File( resourcePackDir, resourcePackPath ); | ||||
|                 if( resourcePack.isDirectory() ) | ||||
|                 { | ||||
|                     // Mount a resource pack from a folder | ||||
|                     File subResource = new File( resourcePack, subPath ); | ||||
|                     if( subResource.exists() && subResource.isFile() ) | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             return new FileInputStream( subResource ); | ||||
|                         } | ||||
|                         catch( FileNotFoundException ignored ) | ||||
|                         { | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     ZipFile zipFile = null; | ||||
|                     try | ||||
|                     { | ||||
|                         final ZipFile zip = zipFile = new ZipFile( resourcePack ); | ||||
|                         ZipEntry entry = zipFile.getEntry( subPath ); | ||||
|                         if( entry != null ) | ||||
|                         { | ||||
|                             // Return a custom InputStream which will close the original zip when finished. | ||||
|                             return new FilterInputStream( zipFile.getInputStream( entry ) ) | ||||
|                             { | ||||
|                                 @Override | ||||
|                                 public void close() throws IOException | ||||
|                                 { | ||||
|                                     super.close(); | ||||
|                                     zip.close(); | ||||
|                                 } | ||||
|                             }; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             IOUtils.closeQuietly( zipFile ); | ||||
|                         } | ||||
|                     } | ||||
|                     catch( IOException e ) | ||||
|                     { | ||||
|                         if( zipFile != null ) IOUtils.closeQuietly( zipFile ); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Look in debug dir | ||||
|         File codeDir = getDebugCodeDir( modClass ); | ||||
|         if( codeDir != null ) | ||||
|         { | ||||
|             File subResource = new File( codeDir, subPath ); | ||||
|             if( subResource.exists() && subResource.isFile() ) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     return new FileInputStream( subResource ); | ||||
|                 } | ||||
|                 catch( FileNotFoundException ignored ) | ||||
|                 { | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Look in class loader | ||||
|         return modClass.getClassLoader().getResourceAsStream( subPath ); | ||||
|     } | ||||
|  | ||||
|     private static File getContainingJar( Class<?> modClass ) | ||||
|     { | ||||
|         String path = modClass.getProtectionDomain().getCodeSource().getLocation().getPath(); | ||||
|   | ||||
| @@ -635,7 +635,7 @@ public class Computer | ||||
|         InputStream biosStream; | ||||
|         try | ||||
|         { | ||||
|             biosStream = Computer.class.getResourceAsStream( "/assets/computercraft/lua/bios.lua" ); | ||||
|             biosStream = m_environment.createResourceFile( "computercraft", "lua/bios.lua" ); | ||||
|         } | ||||
|         catch( Exception e ) | ||||
|         { | ||||
|   | ||||
| @@ -8,6 +8,8 @@ package dan200.computercraft.core.computer; | ||||
| import dan200.computercraft.api.filesystem.IMount; | ||||
| import dan200.computercraft.api.filesystem.IWritableMount; | ||||
|  | ||||
| import java.io.InputStream; | ||||
|  | ||||
| public interface IComputerEnvironment | ||||
| { | ||||
|     int getDay(); | ||||
| @@ -19,4 +21,5 @@ public interface IComputerEnvironment | ||||
|     int assignNewID(); | ||||
|     IWritableMount createSaveDirMount( String subPath, long capacity ); | ||||
|     IMount createResourceMount( String domain, String subPath ); | ||||
|     InputStream createResourceFile( String domain, String subPath ); | ||||
| } | ||||
|   | ||||
| @@ -26,6 +26,8 @@ import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.fml.common.Loader; | ||||
|  | ||||
| import java.io.InputStream; | ||||
|  | ||||
| public class ServerComputer extends ServerTerminal | ||||
|     implements IComputer, IComputerEnvironment, INetworkedThing | ||||
| { | ||||
| @@ -309,6 +311,12 @@ public class ServerComputer extends ServerTerminal | ||||
|         return ComputerCraftAPI.createResourceMount( ComputerCraft.class, domain, subPath ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public InputStream createResourceFile( String domain, String subPath ) | ||||
|     { | ||||
|         return ComputerCraft.getResourceFile( ComputerCraft.class, domain, subPath ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public long getComputerSpaceLimit() | ||||
|     { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 SquidDev
					SquidDev