CC-Tweaked/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorPeripheral.java

129 lines
3.7 KiB
Java

/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.peripheral.monitor;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.api.lua.LuaValues;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.apis.TermMethods;
import dan200.computercraft.core.terminal.Terminal;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* Monitors are a block which act as a terminal, displaying information on one side. This allows them to be read and
* interacted with in-world without opening a GUI.
*
* Monitors act as @{term.Redirect|terminal redirects} and so expose the same methods, as well as several additional
* ones, which are documented below.
*
* Like computers, monitors come in both normal (no colour) and advanced (colour) varieties.
*
* @cc.module monitor
* @cc.usage Write "Hello, world!" to an adjacent monitor:
*
* <pre>
* local monitor = peripheral.find("monitor")
* monitor.setCursorPos(1, 1)
* monitor.write("Hello, world!")
* </pre>
*/
public class MonitorPeripheral extends TermMethods implements IPeripheral
{
private final TileMonitor monitor;
public MonitorPeripheral( TileMonitor monitor )
{
this.monitor = monitor;
}
@Nonnull
@Override
public String getType()
{
return "monitor";
}
/**
* Set the scale of this monitor. A larger scale will result in the monitor having a lower resolution, but display
* text much larger.
*
* @param scaleArg The monitor's scale. This must be a multiple of 0.5 between 0.5 and 5.
* @throws LuaException If the scale is out of range.
* @see #getTextScale()
*/
@LuaFunction
public final void setTextScale( double scaleArg ) throws LuaException
{
int scale = (int) (LuaValues.checkFinite( 0, scaleArg ) * 2.0);
if( scale < 1 || scale > 10 ) throw new LuaException( "Expected number in range 0.5-5" );
getMonitor().setTextScale( scale );
}
/**
* Get the monitor's current text scale.
*
* @return The monitor's current scale.
* @throws LuaException If the monitor cannot be found.
*/
@LuaFunction
public final double getTextScale() throws LuaException
{
return getMonitor().getTextScale() / 2.0;
}
@Override
public void attach( @Nonnull IComputerAccess computer )
{
monitor.addComputer( computer );
}
@Override
public void detach( @Nonnull IComputerAccess computer )
{
monitor.removeComputer( computer );
}
@Override
public boolean equals( IPeripheral other )
{
return other instanceof MonitorPeripheral && monitor == ((MonitorPeripheral) other).monitor;
}
@Nonnull
private ServerMonitor getMonitor() throws LuaException
{
ServerMonitor monitor = this.monitor.getCachedServerMonitor();
if( monitor == null ) throw new LuaException( "Monitor has been detached" );
return monitor;
}
@Nonnull
@Override
public Terminal getTerminal() throws LuaException
{
Terminal terminal = getMonitor().getTerminal();
if( terminal == null ) throw new LuaException( "Monitor has been detached" );
return terminal;
}
@Override
public boolean isColour() throws LuaException
{
return getMonitor().isColour();
}
@Nullable
@Override
public Object getTarget()
{
return monitor;
}
}