1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-08-28 08:12:18 +00:00

fix peripherals

This commit is contained in:
Jacob Farley 2020-09-01 11:44:08 -05:00
parent b95083c77e
commit dcf5d59109
13 changed files with 165 additions and 38 deletions

View File

@ -0,0 +1,31 @@
/*
* This file is part of the public ComputerCraft API - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2019. This API may be redistributed unmodified and in full only.
* For help using the API, and posting your mods, visit the forums at computercraft.info.
*/
package dan200.computercraft.api.peripheral;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
/**
* A {@link net.minecraft.block.entity.BlockEntity} which may act as a peripheral.
*
* If you need more complex capabilities (such as handling TEs not belonging to your mod), you should use {@link IPeripheralProvider}.
*/
public interface IPeripheralTile {
/**
* Get the peripheral on the given {@code side}.
*
* @param side The side to get the peripheral from.
* @return A peripheral, or {@code null} if there is not a peripheral here.
* @see IPeripheralProvider#getPeripheral(World, BlockPos, Direction)
*/
@Nullable
IPeripheral getPeripheral(@Nonnull Direction side);
}

View File

@ -6,6 +6,7 @@
package dan200.computercraft.client.render; package dan200.computercraft.client.render;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.FrameInfo; import dan200.computercraft.client.FrameInfo;
import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.client.gui.FixedWidthFontRenderer;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
@ -60,6 +61,7 @@ public class TileEntityMonitorRenderer extends BlockEntityRenderer<TileMonitor>
public void render( @Nonnull TileMonitor monitor, float partialTicks, @Nonnull MatrixStack transform, @Nonnull VertexConsumerProvider renderer, int lightmapCoord, int overlayLight ) public void render( @Nonnull TileMonitor monitor, float partialTicks, @Nonnull MatrixStack transform, @Nonnull VertexConsumerProvider renderer, int lightmapCoord, int overlayLight )
{ {
// Render from the origin monitor // Render from the origin monitor
// TODO Figure out why this is null.
ClientMonitor originTerminal = monitor.getClientMonitor(); ClientMonitor originTerminal = monitor.getClientMonitor();
if( originTerminal == null ) return; if( originTerminal == null ) return;

View File

@ -13,7 +13,7 @@ import java.util.function.Supplier;
/** /**
* A proxy object for computer objects, delegating to {@link IComputer} or {@link TileComputer} where appropriate. * A proxy object for computer objects, delegating to {@link IComputer} or {@link TileComputer} where appropriate.
*/ */
public final class ComputerProxy public class ComputerProxy
{ {
private final Supplier<TileComputerBase> get; private final Supplier<TileComputerBase> get;

View File

@ -81,4 +81,18 @@ public class TileComputer extends TileComputerBase
{ {
return new ContainerComputer( id, this ); return new ContainerComputer( id, this );
} }
@Override
public ComputerProxy createProxy() {
if (this.proxy == null) {
this.proxy = new ComputerProxy(() -> this) {
@Override
protected TileComputerBase getTile() {
return TileComputer.this;
}
};
}
return this.proxy;
}
} }

View File

@ -7,6 +7,8 @@ package dan200.computercraft.shared.computer.blocks;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.core.computer.ComputerSide;
import dan200.computercraft.shared.BundledRedstone; import dan200.computercraft.shared.BundledRedstone;
import dan200.computercraft.shared.Peripherals; import dan200.computercraft.shared.Peripherals;
@ -46,7 +48,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Objects; import java.util.Objects;
public abstract class TileComputerBase extends TileGeneric implements IComputerTile, Tickable, Nameable, NamedScreenHandlerFactory, ExtendedScreenHandlerFactory public abstract class TileComputerBase extends TileGeneric implements IComputerTile, Tickable, IPeripheralTile, Nameable, NamedScreenHandlerFactory, ExtendedScreenHandlerFactory
{ {
private static final String NBT_ID = "ComputerId"; private static final String NBT_ID = "ComputerId";
private static final String NBT_LABEL = "Label"; private static final String NBT_LABEL = "Label";
@ -406,6 +408,14 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
copy.m_instanceID = -1; copy.m_instanceID = -1;
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
return new ComputerPeripheral("computer", this.createProxy());
}
public abstract ComputerProxy createProxy();
@Nonnull @Nonnull
@Override @Override
public Text getName() public Text getName()

View File

@ -10,6 +10,8 @@ import dan200.computercraft.api.filesystem.IWritableMount;
import dan200.computercraft.api.media.IMedia; import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.shared.MediaProviders; import dan200.computercraft.shared.MediaProviders;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.util.DefaultInventory; import dan200.computercraft.shared.util.DefaultInventory;
@ -32,6 +34,7 @@ import net.minecraft.util.*;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -39,7 +42,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
public final class TileDiskDrive extends TileGeneric implements DefaultInventory, Tickable, Nameable, NamedScreenHandlerFactory public final class TileDiskDrive extends TileGeneric implements DefaultInventory, Tickable, IPeripheralTile, Nameable, NamedScreenHandlerFactory
{ {
private static final String NBT_NAME = "CustomName"; private static final String NBT_NAME = "CustomName";
private static final String NBT_ITEM = "Item"; private static final String NBT_ITEM = "Item";
@ -288,6 +291,12 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory
setStack( 0, ItemStack.EMPTY ); setStack( 0, ItemStack.EMPTY );
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
return new DiskDrivePeripheral(this);
}
@Nonnull @Nonnull
ItemStack getDiskStack() ItemStack getDiskStack()
{ {

View File

@ -10,6 +10,8 @@ import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.network.wired.IWiredElement; import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode; import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.ComputerCraftRegistry;
import dan200.computercraft.shared.command.CommandCopy; import dan200.computercraft.shared.command.CommandCopy;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
@ -36,7 +38,7 @@ import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
public class TileCable extends TileGeneric public class TileCable extends TileGeneric implements IPeripheralTile
{ {
private static final String NBT_PERIPHERAL_ENABLED = "PeirpheralAccess"; private static final String NBT_PERIPHERAL_ENABLED = "PeirpheralAccess";
@ -313,24 +315,23 @@ public class TileCable extends TileGeneric
BlockState state = getCachedState(); BlockState state = getCachedState();
World world = getWorld(); World world = getWorld();
BlockPos current = getPos(); BlockPos current = getPos();
for( Direction facing : DirectionUtil.FACINGS ) for( Direction facing : DirectionUtil.FACINGS ) {
{ BlockPos offset = current.offset(facing);
BlockPos offset = current.offset( facing ); if (!world.isChunkLoaded(offset)) continue;
if( !world.isChunkLoaded( offset ) ) continue;
IWiredElement element = ComputerCraftAPI.getWiredElementAt( world, offset, facing.getOpposite() ); IWiredElement element = ComputerCraftAPI.getWiredElementAt(world, offset, facing.getOpposite());
if( element != null ) continue; if (element != null) continue;
// TODO Figure out why this crashes.
IWiredNode node = element.getNode(); IWiredNode node = element.getNode();
if( BlockCable.canConnectIn( state, facing ) ) if (node != null && m_node != null) {
{ if (BlockCable.canConnectIn(state, facing)) {
// If we can connect to it then do so // If we can connect to it then do so
m_node.connectTo( node ); m_node.connectTo(node);
} } else if (m_node.getNetwork() == node.getNetwork()) {
else if( m_node.getNetwork() == node.getNetwork() )
{
// Otherwise if we're on the same network then attempt to void it. // Otherwise if we're on the same network then attempt to void it.
m_node.disconnectFrom( node ); m_node.disconnectFrom(node);
}
} }
} }
} }
@ -356,6 +357,12 @@ public class TileCable extends TileGeneric
return BlockCable.canConnectIn(this.getCachedState(), facing) ? this.m_cable : null; return BlockCable.canConnectIn(this.getCachedState(), facing) ? this.m_cable : null;
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
return !this.m_destroyed && this.hasModem() && side == this.getDirection() ? this.m_modem : null;
}
private void togglePeripheralAccess() private void togglePeripheralAccess()
{ {
if( !m_peripheralAccessAllowed ) if( !m_peripheralAccessAllowed )

View File

@ -11,6 +11,8 @@ import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.network.wired.IWiredElement; import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode; import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.shared.command.CommandCopy; import dan200.computercraft.shared.command.CommandCopy;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.ModemState;
@ -37,7 +39,7 @@ import java.util.*;
import static dan200.computercraft.shared.peripheral.modem.wired.BlockWiredModemFull.MODEM_ON; import static dan200.computercraft.shared.peripheral.modem.wired.BlockWiredModemFull.MODEM_ON;
import static dan200.computercraft.shared.peripheral.modem.wired.BlockWiredModemFull.PERIPHERAL_ON; import static dan200.computercraft.shared.peripheral.modem.wired.BlockWiredModemFull.PERIPHERAL_ON;
public class TileWiredModemFull extends TileGeneric public class TileWiredModemFull extends TileGeneric implements IPeripheralTile
{ {
private static final String NBT_PERIPHERAL_ENABLED = "PeripheralAccess"; private static final String NBT_PERIPHERAL_ENABLED = "PeripheralAccess";
@ -341,33 +343,30 @@ public class TileWiredModemFull extends TileGeneric
return m_element; return m_element;
} }
private WiredModemPeripheral getPeripheral( @Nonnull Direction side )
{
WiredModemPeripheral peripheral = modems[side.ordinal()];
if( peripheral != null ) return peripheral;
WiredModemLocalPeripheral localPeripheral = m_peripherals[side.ordinal()];
return modems[side.ordinal()] = new WiredModemPeripheral( m_modemState, m_element )
{
@Nonnull @Nonnull
@Override @Override
protected WiredModemLocalPeripheral getLocalPeripheral() public IPeripheral getPeripheral(Direction side) {
{ WiredModemPeripheral peripheral = modems[side.ordinal()];
if (peripheral != null) return peripheral;
WiredModemLocalPeripheral localPeripheral = m_peripherals[side.ordinal()];
return modems[side.ordinal()] = new WiredModemPeripheral(m_modemState, m_element) {
@Nonnull
@Override
protected WiredModemLocalPeripheral getLocalPeripheral() {
return localPeripheral; return localPeripheral;
} }
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vec3d getPosition() {
{ BlockPos pos = getPos().offset(side);
BlockPos pos = getPos().offset( side ); return new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
} }
@Nonnull @Nonnull
@Override @Override
public Object getTarget() public Object getTarget() {
{
return TileWiredModemFull.this; return TileWiredModemFull.this;
} }
}; };

View File

@ -6,6 +6,8 @@
package dan200.computercraft.shared.peripheral.modem.wireless; package dan200.computercraft.shared.peripheral.modem.wireless;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.peripheral.modem.ModemPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemPeripheral;
import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.ModemState;
@ -20,7 +22,7 @@ import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class TileWirelessModem extends TileGeneric public class TileWirelessModem extends TileGeneric implements IPeripheralTile
{ {
private static class Peripheral extends WirelessModemPeripheral private static class Peripheral extends WirelessModemPeripheral
{ {
@ -119,6 +121,13 @@ public class TileWirelessModem extends TileGeneric
modemDirection = getCachedState().get( BlockWirelessModem.FACING ); modemDirection = getCachedState().get( BlockWirelessModem.FACING );
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
this.refreshDirection();
return side == this.modemDirection ? this.modem : null;
}
private void updateBlockState() private void updateBlockState()
{ {
boolean on = modem.getModemState().isOpen(); boolean on = modem.getModemState().isOpen();

View File

@ -7,6 +7,9 @@ package dan200.computercraft.shared.peripheral.monitor;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.common.ServerTerminal; import dan200.computercraft.shared.common.ServerTerminal;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
@ -32,7 +35,7 @@ import javax.annotation.Nullable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
public class TileMonitor extends TileGeneric public class TileMonitor extends TileGeneric implements IPeripheralTile
{ {
public static final double RENDER_BORDER = 2.0 / 16.0; public static final double RENDER_BORDER = 2.0 / 16.0;
public static final double RENDER_MARGIN = 0.5 / 16.0; public static final double RENDER_MARGIN = 0.5 / 16.0;
@ -134,6 +137,16 @@ public class TileMonitor extends TileGeneric
m_height = nbt.getInt( NBT_HEIGHT ); m_height = nbt.getInt( NBT_HEIGHT );
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
this.createServerMonitor(); // Ensure the monitor is created before doing anything else.
if (this.peripheral == null) {
this.peripheral = new MonitorPeripheral(this);
}
return this.peripheral;
}
@Override @Override
public void blockTick() public void blockTick()
{ {
@ -252,7 +265,7 @@ public class TileMonitor extends TileGeneric
{ {
// If our index has changed then it's possible the origin monitor has changed. Thus // If our index has changed then it's possible the origin monitor has changed. Thus
// we'll clear our cache. If we're the origin then we'll need to remove the glList as well. // we'll clear our cache. If we're the origin then we'll need to remove the glList as well.
if(world.isClient() && oldXIndex == 0 && oldYIndex == 0 && m_clientMonitor != null) m_clientMonitor.destroy(); if(oldXIndex == 0 && oldYIndex == 0 && m_clientMonitor != null) m_clientMonitor.destroy();
m_clientMonitor = null; m_clientMonitor = null;
} }

View File

@ -6,6 +6,8 @@
package dan200.computercraft.shared.peripheral.printer; package dan200.computercraft.shared.peripheral.printer;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.media.items.ItemPrintout;
@ -25,13 +27,15 @@ import net.minecraft.text.TranslatableText;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public final class TilePrinter extends TileGeneric implements DefaultSidedInventory, Nameable, NamedScreenHandlerFactory public final class TilePrinter extends TileGeneric implements DefaultSidedInventory, IPeripheralTile, Nameable, NamedScreenHandlerFactory
{ {
private static final String NBT_NAME = "CustomName"; private static final String NBT_NAME = "CustomName";
private static final String NBT_PRINTING = "Printing"; private static final String NBT_PRINTING = "Printing";
@ -231,6 +235,12 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
} }
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
return new PrinterPeripheral(this);
}
@Nullable @Nullable
Terminal getCurrentPage() Terminal getCurrentPage()
{ {

View File

@ -6,6 +6,8 @@
package dan200.computercraft.shared.peripheral.speaker; package dan200.computercraft.shared.peripheral.speaker;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.common.TileGeneric;
import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.util.Tickable; import net.minecraft.util.Tickable;
@ -17,7 +19,7 @@ import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class TileSpeaker extends TileGeneric implements Tickable public class TileSpeaker extends TileGeneric implements Tickable, IPeripheralTile
{ {
public static final int MIN_TICKS_BETWEEN_SOUNDS = 1; public static final int MIN_TICKS_BETWEEN_SOUNDS = 1;
@ -35,6 +37,12 @@ public class TileSpeaker extends TileGeneric implements Tickable
peripheral.update(); peripheral.update();
} }
@Nonnull
@Override
public IPeripheral getPeripheral(Direction side) {
return this.peripheral;
}
private static final class Peripheral extends SpeakerPeripheral private static final class Peripheral extends SpeakerPeripheral
{ {
private final TileSpeaker speaker; private final TileSpeaker speaker;

View File

@ -8,6 +8,7 @@ package dan200.computercraft.shared.proxy;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.media.IMedia; import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.api.turtle.event.TurtleEvent; import dan200.computercraft.api.turtle.event.TurtleEvent;
import dan200.computercraft.core.computer.MainThread; import dan200.computercraft.core.computer.MainThread;
import dan200.computercraft.core.tracking.Tracking; import dan200.computercraft.core.tracking.Tracking;
@ -20,12 +21,15 @@ import dan200.computercraft.shared.data.HasComputerIdLootCondition;
import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
import dan200.computercraft.shared.media.items.RecordMedia; import dan200.computercraft.shared.media.items.RecordMedia;
import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.NetworkHandler;
import dan200.computercraft.shared.peripheral.commandblock.CommandBlockPeripheral;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork;
import dan200.computercraft.shared.turtle.FurnaceRefuelHandler; import dan200.computercraft.shared.turtle.FurnaceRefuelHandler;
import dan200.computercraft.shared.util.TickScheduler; import dan200.computercraft.shared.util.TickScheduler;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.CommandBlockBlockEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.MusicDiscItem; import net.minecraft.item.MusicDiscItem;
import net.minecraft.loot.condition.LootConditionType; import net.minecraft.loot.condition.LootConditionType;
@ -60,6 +64,17 @@ public final class ComputerCraftProxyCommon
private static void registerProviders() private static void registerProviders()
{ {
ComputerCraftAPI.registerPeripheralProvider((world, pos, side) -> {
BlockEntity tile = world.getBlockEntity(pos);
return tile instanceof IPeripheralTile ? ((IPeripheralTile) tile).getPeripheral(side) : null;
});
ComputerCraftAPI.registerPeripheralProvider((world, pos, side) -> {
BlockEntity tile = world.getBlockEntity(pos);
return ComputerCraft.enableCommandBlock && tile instanceof CommandBlockBlockEntity ?
new CommandBlockPeripheral((CommandBlockBlockEntity) tile) : null;
});
// Register bundled power providers // Register bundled power providers
ComputerCraftAPI.registerBundledRedstoneProvider( new DefaultBundledRedstoneProvider() ); ComputerCraftAPI.registerBundledRedstoneProvider( new DefaultBundledRedstoneProvider() );