blob: fdc142c80ccd60468bf11762658645f445c270db [file] [log] [blame] [raw]
package li.cil.oc.api
import li.cil.oc.server.components.IComponent
import net.minecraft.item.ItemStack
/**
* Interface for item component drivers.
*
* This driver type is used for components that are items, i.e. that can be
* inserted into computers. An example for this are internal drives, memory
* and power supply units.
*
* When trying to add an item to a computer the list of registered drivers is
* queried using the drivers' {@see #worksWith} functions. The first driver
* that replies positively and whose check against the slot type is successful,
* i.e. for which the {@see #componentType} matches the slot, will be used as
* the component's driver and the component will be installed. If no driver is
* found the item will be rejected and cannot be installed.
*
* The computer will store a list of installed components, the values of which
* are based on what the driver returns from its {@see #component} function
* at the point of time the component is installed.
* If a driver's API function queries a component via the context using
* {@see IComputerContext#component()} the returned value will be exactly that.
*
* Note that it is possible to write one driver that supports as many different
* items as you wish. I'd recommend writing one per device (type), though, to
* keep things modular and the {@see IDriver#componentName} more meaningful.
*/
trait IItemDriver extends IDriver {
/**
* Used to determine the item types this driver handles.
*
* This is used to determine which driver to use for an item when installed
* in a computer. Note that the return value should not change over time; if
* it does, though, an already installed component will not be ejected, since
* this value is only checked when adding components.
*
* @param item the item to check.
* @return true if the item is supported; false otherwise.
*/
def worksWith(item: ItemStack): Boolean
/**
* The component type of the specified item this driver supports.
*
* This is used to determine into which slot of a computer the components
* this driver supports may go. This will only be called if a previous call
* to {@see #worksWith} with the same item type returned true.
*
* @return the component type of the specified item.
*/
def componentType(item: ItemStack): ComponentType.Value
/**
* Gets a reference to the actual component.
*
* It is called once when a component is installed in a computer. At that
* time, the component will be assigned a unique ID by which it is referred
* to by from the Lua side. The computer keeps track of the mapping from ID
* to the actual component, which will be the value returned from this.
*
* This is used to provide context to the driver's API methods. The driver
* may get a reference to a component via the ID passed from a Lua program,
* and act accordingly (for that it must also have a context parameter, see
* the general interface documentation).
*
* This value also passed to the driver's {@link IDriver#close} method.
*
* @param item the item instance for which to get the component.
* @return the item component for that item, controlled by this driver.
*/
def component(item: ItemStack): Any
}