mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-30 21:23:00 +00:00 
			
		
		
		
	| @@ -16,7 +16,6 @@ import dan200.computercraft.api.media.IMediaProvider; | ||||
| 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; | ||||
| @@ -61,6 +60,7 @@ import dan200.computercraft.shared.turtle.blocks.BlockTurtle; | ||||
| 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; | ||||
| @@ -69,6 +69,7 @@ import net.minecraft.entity.player.EntityPlayerMP; | ||||
| 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; | ||||
| @@ -266,7 +267,6 @@ public class ComputerCraft | ||||
|     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 ) | ||||
| @@ -733,11 +733,6 @@ public class ComputerCraft | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void registerWiredProvider( IWiredProvider provider ) | ||||
|     { | ||||
|         if( provider != null ) wiredProviders.add( provider ); | ||||
|     } | ||||
|  | ||||
|     public static IWiredNode createWiredNodeForElement( IWiredElement element ) | ||||
|     { | ||||
|         return new WiredNode( element ); | ||||
| @@ -766,20 +761,10 @@ public class ComputerCraft | ||||
|  | ||||
|     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 ) | ||||
|   | ||||
| @@ -14,7 +14,6 @@ import dan200.computercraft.api.media.IMediaProvider; | ||||
| 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; | ||||
| @@ -332,26 +331,6 @@ public final class ComputerCraftAPI | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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 | ||||
|      * | ||||
| @@ -453,9 +432,6 @@ public final class ComputerCraftAPI | ||||
|                 computerCraft_registerAPIFactory = findCCMethod( "registerAPIFactory", new Class<?>[] { | ||||
|                     ILuaAPIFactory.class | ||||
|                 } ); | ||||
|                 computerCraft_registerWiredProvider = findCCMethod( "registerWiredProvider", new Class<?>[] { | ||||
|                     IWiredProvider.class | ||||
|                 } ); | ||||
|                 computerCraft_createWiredNodeForElement = findCCMethod( "createWiredNodeForElement", new Class<?>[] { | ||||
|                     IWiredElement.class | ||||
|                 } ); | ||||
| @@ -499,7 +475,6 @@ public final class ComputerCraftAPI | ||||
|     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; | ||||
| } | ||||
|   | ||||
| @@ -14,12 +14,8 @@ import java.util.Map; | ||||
|  * 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 | ||||
| { | ||||
|   | ||||
| @@ -1,22 +0,0 @@ | ||||
| package dan200.computercraft.api.network.wired; | ||||
|  | ||||
| import net.minecraft.util.EnumFacing; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| /** | ||||
|  * A {@link net.minecraft.tileentity.TileEntity} which provides a {@link IWiredElement}. This acts | ||||
|  * as a simpler alternative to a full-blown {@link IWiredProvider}. | ||||
|  */ | ||||
| public interface IWiredElementTile | ||||
| { | ||||
|     /** | ||||
|      * Get the wired element of this tile for a given side. | ||||
|      * | ||||
|      * @param side The side to get the network element from. | ||||
|      * @return A network element, or {@code null} if there is no element here. | ||||
|      */ | ||||
|     @Nullable | ||||
|     IWiredElement getWiredElement( @Nonnull EnumFacing side ); | ||||
| } | ||||
| @@ -1,29 +0,0 @@ | ||||
| package dan200.computercraft.api.network.wired; | ||||
|  | ||||
| import net.minecraft.util.EnumFacing; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.IBlockAccess; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| /** | ||||
|  * Fetch or create an {@link IWiredElement} for a block at a given position. | ||||
|  * | ||||
|  * @see dan200.computercraft.api.ComputerCraftAPI#registerWiredProvider(IWiredProvider) | ||||
|  * @see IWiredElementTile | ||||
|  */ | ||||
| @FunctionalInterface | ||||
| public interface IWiredProvider | ||||
| { | ||||
|     /** | ||||
|      * Extract a wired network element from a block location. | ||||
|      * | ||||
|      * @param world The world the block is in. | ||||
|      * @param pos   The position the block is at. | ||||
|      * @param side  The side to get the network element from. | ||||
|      * @return A network element, or {@code null} if there is not an element here you'd like to handle. | ||||
|      */ | ||||
|     @Nullable | ||||
|     IWiredElement getElement( @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side ); | ||||
| } | ||||
| @@ -18,7 +18,7 @@ import dan200.computercraft.shared.peripheral.common.BlockCableModemVariant; | ||||
| 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; | ||||
| @@ -31,6 +31,7 @@ import net.minecraft.util.math.BlockPos; | ||||
| 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; | ||||
| @@ -39,7 +40,7 @@ import java.util.Collections; | ||||
| 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; | ||||
| @@ -488,9 +489,10 @@ public class TileCable extends TileModemBase implements IWiredElementTile | ||||
|         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 ) ) | ||||
| @@ -597,13 +599,25 @@ public class TileCable extends TileModemBase implements IWiredElementTile | ||||
|         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 | ||||
|   | ||||
| @@ -9,12 +9,12 @@ package dan200.computercraft.shared.peripheral.modem; | ||||
| 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; | ||||
| @@ -23,13 +23,15 @@ import net.minecraft.util.math.BlockPos; | ||||
| 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 | ||||
|     { | ||||
| @@ -310,9 +312,10 @@ public class TileWiredModemFull extends TilePeripheralBase implements IWiredElem | ||||
|         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 | ||||
| @@ -385,11 +388,22 @@ public class TileWiredModemFull extends TilePeripheralBase implements IWiredElem | ||||
|  | ||||
|     // IWiredElementTile | ||||
|  | ||||
|     @Nonnull | ||||
|     @Override | ||||
|     public IWiredElement getWiredElement( @Nonnull EnumFacing side ) | ||||
|     public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing ) | ||||
|     { | ||||
|         return m_element; | ||||
|         return capability == CapabilityWiredElement.CAPABILITY || super.hasCapability( capability, facing ); | ||||
|     } | ||||
|  | ||||
|     @Nullable | ||||
|     @Override | ||||
|     public <T> T getCapability( @Nonnull Capability<T> capability, @Nullable EnumFacing facing ) | ||||
|     { | ||||
|         if( capability == CapabilityWiredElement.CAPABILITY ) | ||||
|         { | ||||
|             return CapabilityWiredElement.CAPABILITY.cast( m_element ); | ||||
|         } | ||||
|  | ||||
|         return super.getCapability( capability, facing ); | ||||
|     } | ||||
|  | ||||
|     // IPeripheralTile | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -49,7 +49,7 @@ import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe; | ||||
| 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; | ||||
| @@ -485,7 +485,7 @@ public abstract class ComputerCraftProxyCommon implements IComputerCraftProxy | ||||
|         ComputerCraftAPI.registerMediaProvider( new DefaultMediaProvider() ); | ||||
|  | ||||
|         // Register network providers | ||||
|         ComputerCraftAPI.registerWiredProvider( new DefaultWiredProvider() ); | ||||
|         CapabilityWiredElement.register(); | ||||
|     } | ||||
|  | ||||
|     private void registerForgeHandlers() | ||||
|   | ||||
| @@ -0,0 +1,69 @@ | ||||
| package dan200.computercraft.shared.wired; | ||||
|  | ||||
| import dan200.computercraft.api.network.wired.IWiredElement; | ||||
| import dan200.computercraft.api.network.wired.IWiredNode; | ||||
| import net.minecraft.nbt.NBTBase; | ||||
| import net.minecraft.util.EnumFacing; | ||||
| import net.minecraft.util.math.Vec3d; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.common.capabilities.Capability; | ||||
| import net.minecraftforge.common.capabilities.CapabilityInject; | ||||
| import net.minecraftforge.common.capabilities.CapabilityManager; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| public class CapabilityWiredElement | ||||
| { | ||||
|     @CapabilityInject( IWiredElement.class ) | ||||
|     public static Capability<IWiredElement> CAPABILITY = null; | ||||
|  | ||||
|     public static void register() | ||||
|     { | ||||
|         CapabilityManager.INSTANCE.register( IWiredElement.class, new NullStorage(), NullElement::new ); | ||||
|     } | ||||
|  | ||||
|     private static class NullElement implements IWiredElement | ||||
|     { | ||||
|         @Nonnull | ||||
|         @Override | ||||
|         public IWiredNode getNode() | ||||
|         { | ||||
|             throw new IllegalStateException( "Should not use the default element implementation" ); | ||||
|         } | ||||
|  | ||||
|         @Nonnull | ||||
|         @Override | ||||
|         public World getWorld() | ||||
|         { | ||||
|             throw new IllegalStateException( "Should not use the default element implementation" ); | ||||
|         } | ||||
|  | ||||
|         @Nonnull | ||||
|         @Override | ||||
|         public Vec3d getPosition() | ||||
|         { | ||||
|             throw new IllegalStateException( "Should not use the default element implementation" ); | ||||
|         } | ||||
|  | ||||
|         @Nonnull | ||||
|         @Override | ||||
|         public String getSenderID() | ||||
|         { | ||||
|             throw new IllegalStateException( "Should not use the default element implementation" ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static class NullStorage implements Capability.IStorage<IWiredElement> | ||||
|     { | ||||
|         @Override | ||||
|         public NBTBase writeNBT( Capability<IWiredElement> capability, IWiredElement instance, EnumFacing side ) | ||||
|         { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void readNBT( Capability<IWiredElement> capability, IWiredElement instance, EnumFacing side, NBTBase base ) | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,23 +0,0 @@ | ||||
| package dan200.computercraft.shared.wired; | ||||
|  | ||||
| import dan200.computercraft.api.network.wired.IWiredElement; | ||||
| import dan200.computercraft.api.network.wired.IWiredElementTile; | ||||
| import dan200.computercraft.api.network.wired.IWiredProvider; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.util.EnumFacing; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.IBlockAccess; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| public class DefaultWiredProvider implements IWiredProvider | ||||
| { | ||||
|     @Nullable | ||||
|     @Override | ||||
|     public IWiredElement getElement( @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side ) | ||||
|     { | ||||
|         TileEntity te = world.getTileEntity( pos ); | ||||
|         return te instanceof IWiredElementTile ? ((IWiredElementTile) te).getWiredElement( side ) : null; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 SquidDev
					SquidDev