package li.cil.oc.api.machine; import li.cil.oc.api.driver.EnvironmentHost; import li.cil.oc.api.network.Environment; import li.cil.oc.api.network.Node; /** * This interface has to be implemented by 'hosts' of machine instances. * <p/> * It provides some context for the machine, in particular which world it is * running in, to allow querying the time of day, for example. */ public interface MachineHost extends EnvironmentHost { /** * Get the architecture to use in the hosted machine. * <p/> * This can be a static architecture type, but will usually be based on the * CPU installed in the host (for example, this is true for computer cases, * servers, robots and tablets). * * @return the architecture of the installed CPU, or <tt>null</tt>. */ Class<? extends Architecture> cpuArchitecture(); /** * This determines how many direct calls the machine can make per tick. * <p/> * A call to a direct method with a limit will consume <tt>1 / limit</tt> * of the available call budget. When the budget reaches zero, the machine * is forced into a synchronized call to make it wait for the next tick. * <p/> * The default values used by OC are 0.5, 1.0 and 1.5 for a tier one, two * and three CPU, respectively. * <p/> * The call budget is reset to this value each tick. * * @return the direct call budget, per tick. */ double callBudget(); /** * The amount of memory (RAM) made available to the machine, in bytes. * <p/> * This is usually determined by the components installed in the owner, for * example the memory sticks in a computer case. * * @return the amount of memory that can be used by the machine, in bytes. */ int installedMemory(); /** * The number of components the machine can address without crashing. * <p/> * This is usually determined by the components installed in the owner, for * example the CPUs in a server. * <p/> * Note that the component count does <em>not</em> include file systems. * * @return the number of supported components. */ int maxComponents(); /** * Get the slot a component with the specified address is in. * <p/> * This is intended to allow determining the slot of <em>item</em> * components sitting in computers. For other components this returns * negative values. * * @param address the address of the component to get the slot for. * @return the index of the slot the component is in. */ int componentSlot(String address); /** * This is called by the machine when its state changed (which can be * multiple times per actual game tick), to notify the owner that it should * save its state on the next world save. * <p/> * This method is called from executor threads, so it must be thread-safe. */ // TODO Merge with {@link EnvironmentHost#markChanged} in 1.5 void markForSaving(); /** * This is called on the owner when the machine's {@link Environment#onConnect(Node)} * method gets called. This can be useful for reacting to network events * when the owner does not have its own node (for example, computer cases * expose their machine's node as their own node). This callback allows it * to connect its components (graphics cards and the like) when it is * connected to a node network (when added to the world, for example). * * @param node the node that was connected to the network. */ void onMachineConnect(Node node); /** * Like {@link #onMachineConnect(Node)}, except that this is called whenever * the machine's {@link Environment#onDisconnect(Node)} method is called. * * @param node the node that was disconnected from the network. */ void onMachineDisconnect(Node node); }