mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-12-14 04:00:30 +00:00
Add the concept of "available peripherals" to IComputerAccess
This provides a mechanism for peripherals to see what else a computer is connected to - and then interact with those peripherals. We also add the ability to query what block or tile a peripheral targets. This allows one to interact with the original block of adjacent peripherals instead.
This commit is contained in:
parent
15a3882016
commit
a2e2a5cb37
@ -13,6 +13,8 @@ import net.minecraft.world.World;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The interface passed to peripherals by computers or turtles, providing methods
|
* The interface passed to peripherals by computers or turtles, providing methods
|
||||||
@ -154,4 +156,33 @@ public interface IComputerAccess
|
|||||||
*/
|
*/
|
||||||
@Nonnull
|
@Nonnull
|
||||||
String getAttachmentName();
|
String getAttachmentName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a set of peripherals that this computer access can "see", along with their attachment name.
|
||||||
|
*
|
||||||
|
* This may include other peripherals on the wired network or peripherals on other sides of the computer.
|
||||||
|
*
|
||||||
|
* @return All reachable peripherals
|
||||||
|
* @see #getAttachmentName()
|
||||||
|
* @see #getAvailablePeripheral(String)
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
default Map<String, IPeripheral> getAvailablePeripherals()
|
||||||
|
{
|
||||||
|
return Collections.emptyMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a reachable peripheral with the given attachement name. This is a equivalent to
|
||||||
|
* {@link #getAvailablePeripherals()}{@code .get(name)}, though may be more performant.
|
||||||
|
*
|
||||||
|
* @param name The peripheral's attached name
|
||||||
|
* @return The reachable peripheral, or {@code null} if none can be found.
|
||||||
|
* @see #getAvailablePeripherals()
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
default IPeripheral getAvailablePeripheral( @Nonnull String name )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,18 @@ public interface IPeripheral
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the object that this peripheral provides methods for. This will generally be the tile entity
|
||||||
|
* or block, but may be an inventory, entity, etc...
|
||||||
|
*
|
||||||
|
* @return The object this peripheral targets
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
default Object getTarget()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether this peripheral is equivalent to another one.
|
* Determine whether this peripheral is equivalent to another one.
|
||||||
*
|
*
|
||||||
|
@ -15,10 +15,11 @@ import dan200.computercraft.api.peripheral.IPeripheral;
|
|||||||
import dan200.computercraft.core.computer.Computer;
|
import dan200.computercraft.core.computer.Computer;
|
||||||
import dan200.computercraft.core.computer.ComputerThread;
|
import dan200.computercraft.core.computer.ComputerThread;
|
||||||
import dan200.computercraft.core.computer.ITask;
|
import dan200.computercraft.core.computer.ITask;
|
||||||
import dan200.computercraft.core.filesystem.FileSystem;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -180,10 +181,49 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
|
|||||||
}
|
}
|
||||||
return m_side;
|
return m_side;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public Map<String, IPeripheral> getAvailablePeripherals()
|
||||||
|
{
|
||||||
|
if( !m_attached )
|
||||||
|
{
|
||||||
|
throw new RuntimeException( "You are not attached to this Computer" );
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, IPeripheral> peripherals = new HashMap<>();
|
||||||
|
for( PeripheralWrapper wrapper : m_peripherals )
|
||||||
|
{
|
||||||
|
if( wrapper != null && wrapper.isAttached() )
|
||||||
|
{
|
||||||
|
peripherals.put( wrapper.getAttachmentName(), wrapper.getPeripheral() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.unmodifiableMap( peripherals );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public IPeripheral getAvailablePeripheral( @Nonnull String name )
|
||||||
|
{
|
||||||
|
if( !m_attached )
|
||||||
|
{
|
||||||
|
throw new RuntimeException( "You are not attached to this Computer" );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( PeripheralWrapper wrapper : m_peripherals )
|
||||||
|
{
|
||||||
|
if( wrapper != null && wrapper.isAttached() && wrapper.getAttachmentName().equals( name ) )
|
||||||
|
{
|
||||||
|
return wrapper.getPeripheral();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final IAPIEnvironment m_environment;
|
private final IAPIEnvironment m_environment;
|
||||||
private FileSystem m_fileSystem;
|
|
||||||
private final PeripheralWrapper[] m_peripherals;
|
private final PeripheralWrapper[] m_peripherals;
|
||||||
private boolean m_running;
|
private boolean m_running;
|
||||||
|
|
||||||
@ -285,7 +325,6 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
|
|||||||
{
|
{
|
||||||
synchronized( m_peripherals )
|
synchronized( m_peripherals )
|
||||||
{
|
{
|
||||||
m_fileSystem = m_environment.getFileSystem();
|
|
||||||
m_running = true;
|
m_running = true;
|
||||||
for( int i=0; i<6; ++i )
|
for( int i=0; i<6; ++i )
|
||||||
{
|
{
|
||||||
@ -312,7 +351,6 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
|
|||||||
wrapper.detach();
|
wrapper.detach();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_fileSystem = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,4 +97,11 @@ public class ComputerPeripheral
|
|||||||
{
|
{
|
||||||
return (other != null && other.getClass() == this.getClass());
|
return (other != null && other.getClass() == this.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public Object getTarget()
|
||||||
|
{
|
||||||
|
return m_computer.getTile();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,4 +196,11 @@ public class DiskDrivePeripheral implements IPeripheral
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public Object getTarget()
|
||||||
|
{
|
||||||
|
return m_diskDrive;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,6 +145,13 @@ public class PrinterPeripheral implements IPeripheral
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public Object getTarget()
|
||||||
|
{
|
||||||
|
return m_printer;
|
||||||
|
}
|
||||||
|
|
||||||
private Terminal getCurrentPage() throws LuaException
|
private Terminal getCurrentPage() throws LuaException
|
||||||
{
|
{
|
||||||
Terminal currentPage = m_printer.getCurrentPage();
|
Terminal currentPage = m_printer.getCurrentPage();
|
||||||
|
Loading…
Reference in New Issue
Block a user