blob: c234d8e04b79db96db06f9f645a2dbf0a44bb78d [file] [log] [blame] [raw]
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);
}