/** * This file is part of the public ComputerCraft API - http://www.computercraft.info * Copyright Daniel Ratcliffe, 2011-2013. This API may be redistributed unmodified and in full only. * For help using the API, and posting your mods, visit the forums at computercraft.info. */ package dan200.computer.api; import java.lang.reflect.Method; import net.minecraft.world.World; /** * The static entry point to the ComputerCraft API. * Members in this class must be called after mod_ComputerCraft has been initialised, * but may be called before it is fully loaded. */ public class ComputerCraftAPI { /** * Creates a numbered directory in a subfolder of the save directory for a given world, and returns that number.
* Use in conjuction with createSaveDirMount() to create a unique place for your peripherals or media items to store files.
* @param world The world for which the save dir should be created. This should be the serverside world object. * @param parentSubPath The folder path within the save directory where the new directory should be created. eg: "computer/disk" * @return The numerical value of the name of the new folder, or -1 if the folder could not be created for some reason.
* eg: if createUniqueNumberedSaveDir( world, "computer/disk" ) was called returns 42, then "computer/disk/42" is now available for writing. * @see #createSaveDirMount(World, String) */ public static int createUniqueNumberedSaveDir( World world, String parentSubPath ) { findCC(); if( computerCraft_createUniqueNumberedSaveDir != null ) { try { return ((Integer)computerCraft_createUniqueNumberedSaveDir.invoke( null, world, parentSubPath )).intValue(); } catch (Exception e){ // It failed } } return -1; } /** * Creates a file system mount that maps to a subfolder of the save directory for a given world, and returns it.
* Use in conjuction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a folder from the * users save directory onto a computers file system.
* @param world The world for which the save dir can be found. This should be the serverside world object. * @param subPath The folder path within the save directory that the mount should map to. eg: "computer/disk/42".
* Use createUniqueNumberedSaveDir() to create a new numbered folder to use. * @param capacity The ammount of data that can be stored in the directory before it fills up, in bytes. * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() * to mount this on a Computers' file system. * @see #createUniqueNumberedSaveDir(World, String) * @see IComputerAccess#mount(String, IMount) * @see IComputerAccess#mountWritable(String, IWritableMount) * @see IMount * @see IMountWritable */ public static IWritableMount createSaveDirMount( World world, String subPath, long capacity ) { findCC(); if( computerCraft_createSaveDirMount != null ) { try { return (IWritableMount)computerCraft_createSaveDirMount.invoke( null, world, subPath, capacity ); } catch (Exception e){ // It failed } } return null; } /** * Creates a file system mount to a resource folder, and returns it.
* Use in conjuction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a resource folder onto a computers file system.
* The files in this mount will be a combination of files in the specified mod jar, and resource packs that contain resources with the same domain and path.
* @param class A class in whose jar to look first for the resources to mount. Using your main mod class is recommended. eg: MyMod.class * @param domain The domain under which to look for resources. eg: "mymod" * @param subPath The domain under which to look for resources. eg: "mymod/lua/myfiles" * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() * to mount this on a Computers' file system. * @see IComputerAccess#mount(String, IMount) * @see IComputerAccess#mountWritable(String, IMountWritable) * @see IMount */ public static IMount createResourceMount( Class modClass, String domain, String subPath ) { findCC(); if( computerCraft_createResourceMount != null ) { try { return (IMount)computerCraft_createResourceMount.invoke( null, modClass, domain, subPath ); } catch (Exception e){ // It failed } } return null; } /** * Registers a peripheral handler for a TileEntity that you do not have access to. Only * use this if you want to expose IPeripheral on a TileEntity from another mod. For your own * mod, just implement IPeripheral on the TileEntity directly. * @see IPeripheral * @see IPeripheralHandler */ public static void registerExternalPeripheral( Class clazz, IPeripheralHandler handler ) { findCC(); if (computerCraft_registerExternalPeripheral != null) { try { computerCraft_registerExternalPeripheral.invoke(null, clazz, handler); } catch (Exception e){ // It failed } } } // The functions below here are private, and are used to interface with the non-API ComputerCraft classes. // Reflection is used here so you can develop your mod in MCP without decompiling ComputerCraft and including // it in your solution. private static void findCC() { if( !ccSearched ) { try { computerCraft = Class.forName( "dan200.ComputerCraft" ); computerCraft_createUniqueNumberedSaveDir = findCCMethod( "createUniqueNumberedSaveDir", new Class[] { World.class, String.class } ); computerCraft_createSaveDirMount = findCCMethod( "createSaveDirMount", new Class[] { World.class, String.class, Long.TYPE } ); computerCraft_createResourceMount = findCCMethod( "createResourceMount", new Class[] { Class.class, String.class, String.class } ); computerCraft_registerExternalPeripheral = findCCMethod( "registerExternalPeripheral", new Class[] { Class.class, IPeripheralHandler.class } ); } catch( Exception e ) { net.minecraft.server.MinecraftServer.getServer().logInfo( "ComputerCraftAPI: ComputerCraft not found." ); } finally { ccSearched = true; } } } private static Method findCCMethod( String name, Class[] args ) { try { return computerCraft.getMethod( name, args ); } catch( NoSuchMethodException e ) { net.minecraft.server.MinecraftServer.getServer().logInfo( "ComputerCraftAPI: ComputerCraft method " + name + " not found." ); return null; } } private static boolean ccSearched = false; private static Class computerCraft = null; private static Method computerCraft_createUniqueNumberedSaveDir = null; private static Method computerCraft_createSaveDirMount = null; private static Method computerCraft_createResourceMount = null; private static Method computerCraft_registerExternalPeripheral = null; }