package li.cil.oc.api.event; import li.cil.oc.api.network.Node; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; /** * Events for handling file system access and representing it on the client. * <p/> * This is used to play file system access sounds and render disk activity * indicators on some containers (e.g. disk drive, computer, server). * <p/> * Use this to implement rendering of disk access indicators on you own * containers / computers / drive bays. * <p/> * Canceling this event is provided to allow registering higher priority * event handlers that override default behavior. */ @Cancelable public class FileSystemAccessEvent extends Event { protected String sound; protected World world; protected double x; protected double y; protected double z; protected TileEntity tileEntity; protected NBTTagCompound data; /** * Constructor for tile entity hosted file systems. * * @param sound the name of the sound effect to play. * @param tileEntity the tile entity hosting the file system. * @param data the additional data. */ protected FileSystemAccessEvent(String sound, TileEntity tileEntity, NBTTagCompound data) { this.sound = sound; this.world = tileEntity.getWorld(); this.x = tileEntity.getPos().getX() + 0.5; this.y = tileEntity.getPos().getY() + 0.5; this.z = tileEntity.getPos().getZ() + 0.5; this.tileEntity = tileEntity; this.data = data; } /** * Constructor for arbitrarily hosted file systems. * * @param sound the name of the sound effect to play. * @param world the world the file system lives in. * @param x the x coordinate of the file system's container. * @param y the y coordinate of the file system's container. * @param z the z coordinate of the file system's container. * @param data the additional data. */ protected FileSystemAccessEvent(String sound, World world, double x, double y, double z, NBTTagCompound data) { this.sound = sound; this.world = world; this.x = x; this.y = y; this.z = z; this.tileEntity = null; this.data = data; } /** * The name of the sound effect to play for the file system. */ public String getSound() { return sound; } /** * The world the file system lives in. */ public World getWorld() { return world; } /** * The x coordinate of the file system's container. */ public double getX() { return x; } /** * The y coordinate of the file system's container. */ public double getY() { return y; } /** * The z coordinate of the file system's container. */ public double getZ() { return z; } /** * The tile entity hosting the file system. * <p/> * <em>Important</em>: this can be <tt>null</tt>, which is usually the * case when the container is an entity or item. */ public TileEntity getTileEntity() { return tileEntity; } /** * Addition custom data, this is used to transmit the number of the server * in a server rack the file system lives in, for example. */ public NBTTagCompound getData() { return data; } public static final class Server extends FileSystemAccessEvent { private Node node; public Server(String sound, TileEntity tileEntity, Node node) { super(sound, tileEntity, new NBTTagCompound()); this.node = node; } public Server(String sound, World world, double x, double y, double z, Node node) { super(sound, world, x, y, z, new NBTTagCompound()); this.node = node; } /** * The node of the file system that signalled activity. */ public Node getNode() { return node; } } public static final class Client extends FileSystemAccessEvent { /** * Constructor for tile entity hosted file systems. * * @param sound the name of the sound effect to play. * @param tileEntity the tile entity hosting the file system. * @param data the additional data. */ public Client(String sound, TileEntity tileEntity, NBTTagCompound data) { super(sound, tileEntity, data); } /** * Constructor for arbitrarily hosted file systems. * * @param sound the name of the sound effect to play. * @param world the world the file system lives in. * @param x the x coordinate of the file system's container. * @param y the y coordinate of the file system's container. * @param z the z coordinate of the file system's container. * @param data the additional data. */ public Client(String sound, World world, double x, double y, double z, NBTTagCompound data) { super(sound, world, x, y, z, data); } } }