Skip to content

Commit

Permalink
Convert wired elements to capabilities
Browse files Browse the repository at this point in the history
See #18
  • Loading branch information
SquidDev committed Mar 24, 2018
1 parent 36878e7 commit 043d5f0
Show file tree
Hide file tree
Showing 11 changed files with 123 additions and 144 deletions.
27 changes: 6 additions & 21 deletions src/main/java/dan200/computercraft/ComputerCraft.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import dan200.computercraft.api.network.IPacketNetwork;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.network.wired.IWiredProvider;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.permissions.ITurtlePermissionProvider;
Expand Down Expand Up @@ -61,6 +60,7 @@
import dan200.computercraft.shared.turtle.blocks.TileTurtle;
import dan200.computercraft.shared.turtle.upgrades.*;
import dan200.computercraft.shared.util.*;
import dan200.computercraft.shared.wired.CapabilityWiredElement;
import dan200.computercraft.shared.wired.WiredNode;
import io.netty.buffer.Unpooled;
import net.minecraft.entity.Entity;
Expand All @@ -69,6 +69,7 @@
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
Expand Down Expand Up @@ -266,7 +267,6 @@ public static class Config {
private static List<ITurtlePermissionProvider> permissionProviders = new ArrayList<>();
private static final Map<String, IPocketUpgrade> pocketUpgrades = new HashMap<>();
private static final Set<ILuaAPIFactory> apiFactories = new LinkedHashSet<>();
private static final Set<IWiredProvider> wiredProviders = new LinkedHashSet<>();

// Implementation
@Mod.Instance( value = ComputerCraft.MOD_ID )
Expand Down Expand Up @@ -733,11 +733,6 @@ public static void registerAPIFactory( ILuaAPIFactory provider )
}
}

public static void registerWiredProvider( IWiredProvider provider )
{
if( provider != null ) wiredProviders.add( provider );
}

public static IWiredNode createWiredNodeForElement( IWiredElement element )
{
return new WiredNode( element );
Expand Down Expand Up @@ -766,20 +761,10 @@ public static IPeripheral getPeripheralAt( World world, BlockPos pos, EnumFacing

public static IWiredElement getWiredElementAt( IBlockAccess world, BlockPos pos, EnumFacing side )
{
// Try the handlers in order:
for( IWiredProvider provider : wiredProviders )
{
try
{
IWiredElement element = provider.getElement( world, pos, side );
if( element != null ) return element;
}
catch( Exception e )
{
ComputerCraft.log.error( "Wired element provider " + provider + " errored.", e );
}
}
return null;
TileEntity tile = world.getTileEntity( pos );
return tile != null && tile.hasCapability( CapabilityWiredElement.CAPABILITY, side )
? tile.getCapability( CapabilityWiredElement.CAPABILITY, side )
: null;
}

public static int getDefaultBundledRedstoneOutput( World world, BlockPos pos, EnumFacing side )
Expand Down
25 changes: 0 additions & 25 deletions src/main/java/dan200/computercraft/api/ComputerCraftAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import dan200.computercraft.api.network.IPacketNetwork;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.network.wired.IWiredProvider;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
Expand Down Expand Up @@ -332,26 +331,6 @@ public static void registerAPIFactory( @Nonnull ILuaAPIFactory upgrade )
}
}

/**
* Registers a peripheral handler to convert blocks into {@link IPeripheral} implementations.
*
* @param handler The peripheral provider to register.
* @see dan200.computercraft.api.peripheral.IPeripheral
* @see dan200.computercraft.api.peripheral.IPeripheralProvider
*/
public static void registerWiredProvider( @Nonnull IWiredProvider handler )
{
findCC();
if ( computerCraft_registerWiredProvider != null)
{
try {
computerCraft_registerWiredProvider.invoke( null, handler );
} catch (Exception e){
// It failed
}
}
}

/**
* Construct a new wired node for a given wired element
*
Expand Down Expand Up @@ -453,9 +432,6 @@ private static void findCC()
computerCraft_registerAPIFactory = findCCMethod( "registerAPIFactory", new Class<?>[] {
ILuaAPIFactory.class
} );
computerCraft_registerWiredProvider = findCCMethod( "registerWiredProvider", new Class<?>[] {
IWiredProvider.class
} );
computerCraft_createWiredNodeForElement = findCCMethod( "createWiredNodeForElement", new Class<?>[] {
IWiredElement.class
} );
Expand Down Expand Up @@ -499,7 +475,6 @@ private static Method findCCMethod( String name, Class<?>[] args )
private static Method computerCraft_registerPocketUpgrade = null;
private static Method computerCraft_getWirelessNetwork = null;
private static Method computerCraft_registerAPIFactory = null;
private static Method computerCraft_registerWiredProvider = null;
private static Method computerCraft_createWiredNodeForElement = null;
private static Method computerCraft_getWiredElementAt = null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,8 @@
* as a proxy for all network objects. Whilst the node may change networks, an element's node should remain constant
* for its lifespan.
*
* Elements are generally tied to a block or tile entity in world. One should either register an {@link IWiredProvider}
* or implement {@link IWiredElementTile} on your tile entity.
*
* @see IWiredProvider
* @see ComputerCraftAPI#registerWiredProvider(IWiredProvider)
* @see IWiredElementTile
* Elements are generally tied to a block or tile entity in world. In such as case, one should provide the
* {@link IWiredElement} capability for the appropriate sides.
*/
public interface IWiredElement extends IWiredSender
{
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import dan200.computercraft.shared.peripheral.common.PeripheralItemFactory;
import dan200.computercraft.shared.util.IDAssigner;
import dan200.computercraft.shared.util.PeripheralUtil;
import dan200.computercraft.api.network.wired.IWiredElementTile;
import dan200.computercraft.shared.wired.CapabilityWiredElement;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
Expand All @@ -31,6 +31,7 @@
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand All @@ -39,7 +40,7 @@
import java.util.List;
import java.util.Map;

public class TileCable extends TileModemBase implements IWiredElementTile
public class TileCable extends TileModemBase
{
public static final double MIN = 0.375;
public static final double MAX = 1 - MIN;
Expand Down Expand Up @@ -488,9 +489,10 @@ public void networkChanged()
BlockPos current = getPos();
for( EnumFacing facing : EnumFacing.VALUES )
{
if( !world.isBlockLoaded( pos ) ) continue;

IWiredElement element = ComputerCraft.getWiredElementAt( world, current.offset( facing ), facing.getOpposite() );
BlockPos offset = current.offset( facing );
if( !world.isBlockLoaded( offset ) ) continue;

IWiredElement element = ComputerCraft.getWiredElementAt( world, offset, facing.getOpposite() );
if( element == null ) continue;

if( BlockCable.canConnectIn( state, facing ) )
Expand Down Expand Up @@ -597,13 +599,25 @@ public boolean canRenderBreaking()
return true;
}

// IWiredElement tile
// IWiredElement capability

@Override
public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing )
{
if( capability == CapabilityWiredElement.CAPABILITY ) return BlockCable.canConnectIn( getBlockState(), facing );
return super.hasCapability( capability, facing );
}

@Nullable
@Override
public IWiredElement getWiredElement( @Nonnull EnumFacing side )
public <T> T getCapability( @Nonnull Capability<T> capability, @Nullable EnumFacing facing )
{
return BlockCable.canConnectIn( getBlockState(), side ) ? m_cable : null;
if( capability == CapabilityWiredElement.CAPABILITY )
{
return BlockCable.canConnectIn( getBlockState(), facing ) ? CapabilityWiredElement.CAPABILITY.cast( m_cable ) : null;
}

return super.getCapability( capability, facing );
}

// IPeripheralTile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
import com.google.common.base.Objects;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredElementTile;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.peripheral.common.BlockCable;
import dan200.computercraft.shared.peripheral.common.TilePeripheralBase;
import dan200.computercraft.shared.util.IDAssigner;
import dan200.computercraft.shared.wired.CapabilityWiredElement;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
Expand All @@ -23,13 +23,15 @@
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.File;
import java.util.*;

public class TileWiredModemFull extends TilePeripheralBase implements IWiredElementTile
public class TileWiredModemFull extends TilePeripheralBase
{
private static class FullElement extends WiredModemElement
{
Expand Down Expand Up @@ -310,9 +312,10 @@ private void networkChanged()
BlockPos current = getPos();
for( EnumFacing facing : EnumFacing.VALUES )
{
if( !world.isBlockLoaded( pos ) ) continue;
BlockPos offset = current.offset( facing );
if( !world.isBlockLoaded( offset ) ) continue;

IWiredElement element = ComputerCraft.getWiredElementAt( world, current.offset( facing ), facing.getOpposite() );
IWiredElement element = ComputerCraft.getWiredElementAt( world, offset, facing.getOpposite() );
if( element == null ) continue;

// If we can connect to it then do so
Expand Down Expand Up @@ -385,11 +388,22 @@ private String getCachedPeripheralName( EnumFacing facing )

// IWiredElementTile

@Nonnull
@Override
public IWiredElement getWiredElement( @Nonnull EnumFacing side )
public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing )
{
return capability == CapabilityWiredElement.CAPABILITY || super.hasCapability( capability, facing );
}

@Nullable
@Override
public <T> T getCapability( @Nonnull Capability<T> capability, @Nullable EnumFacing facing )
{
return m_element;
if( capability == CapabilityWiredElement.CAPABILITY )
{
return CapabilityWiredElement.CAPABILITY.cast( m_element );
}

return super.getCapability( capability, facing );
}

// IPeripheralTile
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dan200.computercraft.shared.peripheral.modem;

import dan200.computercraft.api.network.wired.IWiredNetworkChange;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNetworkChange;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.wired.WiredNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
import dan200.computercraft.shared.turtle.blocks.TileTurtle;
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
import dan200.computercraft.shared.util.*;
import dan200.computercraft.shared.wired.DefaultWiredProvider;
import dan200.computercraft.shared.wired.CapabilityWiredElement;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
Expand Down Expand Up @@ -485,7 +485,7 @@ private void registerTileEntities()
ComputerCraftAPI.registerMediaProvider( new DefaultMediaProvider() );

// Register network providers
ComputerCraftAPI.registerWiredProvider( new DefaultWiredProvider() );
CapabilityWiredElement.register();
}

private void registerForgeHandlers()
Expand Down
Loading

0 comments on commit 043d5f0

Please sign in to comment.