1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-06-24 06:03:28 +00:00

Move API registration into separate classes

There's several reasons for this change:
 - Try to make ComputerCraft.java less monolithic by moving
   functionality into separate module-specific classes.
 - Hopefully make the core class less Minecraft dependent, meaning
   emulators are a little less dependent on anything outside of /core.

Note we still need /some/ methods in the main ComputerCraft class in
order to maintain backwards compatibility with Plethora and
Computronics.
This commit is contained in:
SquidDev 2018-12-10 23:46:50 +00:00
parent 57fb77d7fe
commit 41a320e9a4
41 changed files with 662 additions and 548 deletions

View File

@ -16,21 +16,20 @@
import dan200.computercraft.api.network.IPacketNetwork;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import dan200.computercraft.api.permissions.ITurtlePermissionProvider;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.event.TurtleAction;
import dan200.computercraft.client.FrameInfo;
import dan200.computercraft.core.apis.AddressPredicate;
import dan200.computercraft.core.apis.ApiFactories;
import dan200.computercraft.core.filesystem.ComboMount;
import dan200.computercraft.core.filesystem.FileMount;
import dan200.computercraft.core.filesystem.FileSystemMount;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.core.tracking.Tracking;
import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider;
import dan200.computercraft.shared.*;
import dan200.computercraft.shared.computer.blocks.BlockCommandComputer;
import dan200.computercraft.shared.computer.blocks.BlockComputer;
import dan200.computercraft.shared.computer.blocks.TileComputer;
@ -61,8 +60,6 @@
import dan200.computercraft.shared.turtle.upgrades.*;
import dan200.computercraft.shared.util.CreativeTabMain;
import dan200.computercraft.shared.util.IDAssigner;
import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.RecordUtil;
import dan200.computercraft.shared.wired.CapabilityWiredElement;
import dan200.computercraft.shared.wired.WiredNode;
import io.netty.buffer.Unpooled;
@ -75,8 +72,6 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
@ -94,7 +89,6 @@
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.Logger;
import javax.annotation.Nonnull;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
@ -102,15 +96,14 @@
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.*;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.ServiceConfigurationError;
import java.util.function.Function;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
///////////////
// UNIVERSAL //
///////////////
@Mod(
modid = ComputerCraft.MOD_ID, name = "CC: Tweaked", version = "${version}",
guiFactory = "dan200.computercraft.client.gui.GuiConfigCC$Factory",
@ -268,13 +261,8 @@ public static class Config
// Logging
public static Logger log;
// API users
private static List<IPeripheralProvider> peripheralProviders = new ArrayList<>();
private static List<IBundledRedstoneProvider> bundledRedstoneProviders = new ArrayList<>();
private static List<IMediaProvider> mediaProviders = new ArrayList<>();
private static List<ITurtlePermissionProvider> permissionProviders = new ArrayList<>();
private static final Map<String, IPocketUpgrade> pocketUpgrades = new HashMap<>();
private static final Set<ILuaAPIFactory> apiFactories = new LinkedHashSet<>();
// Peripheral providers. This is still here to ensure compatibility with Plethora and Computronics
public static List<IPeripheralProvider> peripheralProviders = new ArrayList<>();
// Implementation
@Mod.Instance( value = ComputerCraft.MOD_ID )
@ -552,12 +540,12 @@ public static void openComputerGUI( EntityPlayer player, ServerComputer computer
);
}
public static File getBaseDir()
private static File getBaseDir()
{
return FMLCommonHandler.instance().getMinecraftServerInstance().getFile( "." );
return FMLCommonHandler.instance().getMinecraftServerInstance().getDataDirectory();
}
public static File getResourcePackDir()
private static File getResourcePackDir()
{
return new File( getBaseDir(), "resourcepacks" );
}
@ -609,136 +597,49 @@ public static boolean canPlayerUseCommands( EntityPlayer player )
return false;
}
public static boolean isPlayerOpped( EntityPlayer player )
{
MinecraftServer server = player.getServer();
if( server != null )
{
return server.getPlayerList().getOppedPlayers().getEntry( player.getGameProfile() ) != null;
}
return false;
}
@Deprecated
public static void registerPermissionProvider( ITurtlePermissionProvider provider )
{
if( provider != null && !permissionProviders.contains( provider ) )
{
permissionProviders.add( provider );
}
}
public static boolean isBlockEnterable( World world, BlockPos pos, EntityPlayer player )
{
MinecraftServer server = player.getServer();
if( server != null && !world.isRemote )
{
if( server.isBlockProtected( world, pos, player ) )
{
return false;
}
}
for( ITurtlePermissionProvider provider : permissionProviders )
{
if( !provider.isBlockEnterable( world, pos ) )
{
return false;
}
}
return true;
}
public static boolean isBlockEditable( World world, BlockPos pos, EntityPlayer player )
{
MinecraftServer server = player.getServer();
if( server != null && !world.isRemote )
{
if( server.isBlockProtected( world, pos, player ) )
{
return false;
}
}
for( ITurtlePermissionProvider provider : permissionProviders )
{
if( !provider.isBlockEditable( world, pos ) )
{
return false;
}
}
return true;
TurtlePermissions.register( provider );
}
@Deprecated
public static void registerPocketUpgrade( IPocketUpgrade upgrade )
{
String id = upgrade.getUpgradeID().toString();
IPocketUpgrade existing = pocketUpgrades.get( id );
if( existing != null )
{
throw new RuntimeException( "Error registering '" + upgrade.getUnlocalisedAdjective() + " pocket computer'. UpgradeID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " pocket computer'" );
}
pocketUpgrades.put( id, upgrade );
dan200.computercraft.shared.PocketUpgrades.register( upgrade );
}
@Deprecated
public static void registerPeripheralProvider( IPeripheralProvider provider )
{
if( provider != null && !peripheralProviders.contains( provider ) )
{
peripheralProviders.add( provider );
}
Peripherals.register( provider );
}
@Deprecated
public static void registerBundledRedstoneProvider( IBundledRedstoneProvider provider )
{
if( provider != null && !bundledRedstoneProviders.contains( provider ) )
{
bundledRedstoneProviders.add( provider );
}
BundledRedstone.register( provider );
}
@Deprecated
public static void registerMediaProvider( IMediaProvider provider )
{
if( provider != null && !mediaProviders.contains( provider ) )
{
mediaProviders.add( provider );
}
MediaProviders.register( provider );
}
public static void registerAPIFactory( ILuaAPIFactory provider )
@Deprecated
public static void registerAPIFactory( ILuaAPIFactory factory )
{
if( provider != null )
{
apiFactories.add( provider );
}
ApiFactories.register( factory );
}
@Deprecated
public static IWiredNode createWiredNodeForElement( IWiredElement element )
{
return new WiredNode( element );
}
public static IPeripheral getPeripheralAt( World world, BlockPos pos, EnumFacing side )
{
// Try the handlers in order:
for( IPeripheralProvider peripheralProvider : peripheralProviders )
{
try
{
IPeripheral peripheral = peripheralProvider.getPeripheral( world, pos, side );
if( peripheral != null )
{
return peripheral;
}
}
catch( Exception e )
{
ComputerCraft.log.error( "Peripheral provider " + peripheralProvider + " errored.", e );
}
}
return null;
}
@Deprecated
public static IWiredElement getWiredElementAt( IBlockAccess world, BlockPos pos, EnumFacing side )
{
TileEntity tile = world.getTileEntity( pos );
@ -747,118 +648,25 @@ public static IWiredElement getWiredElementAt( IBlockAccess world, BlockPos pos,
: null;
}
@Deprecated
public static int getDefaultBundledRedstoneOutput( World world, BlockPos pos, EnumFacing side )
{
return world.isValid( pos ) ? DefaultBundledRedstoneProvider.getDefaultBundledRedstoneOutput( world, pos, side ) : -1;
}
public static int getBundledRedstoneOutput( World world, BlockPos pos, EnumFacing side )
{
if( !world.isValid( pos ) ) return -1;
// Try the handlers in order:
int combinedSignal = -1;
for( IBundledRedstoneProvider bundledRedstoneProvider : bundledRedstoneProviders )
{
try
{
int signal = bundledRedstoneProvider.getBundledRedstoneOutput( world, pos, side );
if( signal >= 0 )
{
if( combinedSignal < 0 )
{
combinedSignal = (signal & 0xffff);
}
else
{
combinedSignal = combinedSignal | (signal & 0xffff);
}
}
}
catch( Exception e )
{
ComputerCraft.log.error( "Bundled redstone provider " + bundledRedstoneProvider + " errored.", e );
}
}
return combinedSignal;
}
public static IMedia getMedia( @Nonnull ItemStack stack )
{
if( !stack.isEmpty() )
{
// Try the handlers in order:
for( IMediaProvider mediaProvider : mediaProviders )
{
try
{
IMedia media = mediaProvider.getMedia( stack );
if( media != null )
{
return media;
}
}
catch( Exception e )
{
// mod misbehaved, ignore it
ComputerCraft.log.error( "Media provider " + mediaProvider + " errored.", e );
}
}
return null;
}
return null;
}
public static IPocketUpgrade getPocketUpgrade( String id )
{
return pocketUpgrades.get( id );
}
public static IPocketUpgrade getPocketUpgrade( @Nonnull ItemStack stack )
{
if( stack.isEmpty() ) return null;
for( IPocketUpgrade upgrade : pocketUpgrades.values() )
{
ItemStack craftingStack = upgrade.getCraftingItem();
if( !craftingStack.isEmpty() && InventoryUtil.areItemsStackable( stack, craftingStack ) )
{
return upgrade;
}
}
return null;
}
public static Iterable<IPocketUpgrade> getVanillaPocketUpgrades()
{
List<IPocketUpgrade> upgrades = new ArrayList<>();
for( IPocketUpgrade upgrade : pocketUpgrades.values() )
{
if( upgrade instanceof PocketModem || upgrade instanceof PocketSpeaker )
{
upgrades.add( upgrade );
}
}
return upgrades;
return BundledRedstone.getDefaultOutput( world, pos, side );
}
@Deprecated
public static IPacketNetwork getWirelessNetwork()
{
return WirelessNetwork.getUniversal();
}
public static Iterable<ILuaAPIFactory> getAPIFactories()
{
return apiFactories;
}
@Deprecated
public static int createUniqueNumberedSaveDir( World world, String parentSubPath )
{
return IDAssigner.getNextIDFromDirectory( new File( getWorldDir( world ), parentSubPath ) );
}
@Deprecated
public static IWritableMount createSaveDirMount( World world, String subPath, long capacity )
{
try
@ -871,6 +679,7 @@ public static IWritableMount createSaveDirMount( World world, String subPath, lo
}
}
@Deprecated
public static IMount createResourceMount( Class<?> modClass, String domain, String subPath )
{
// Start building list of mounts
@ -1073,36 +882,13 @@ private static File getDebugCodeDir( Class<?> modClass )
{
String path = modClass.getProtectionDomain().getCodeSource().getLocation().getPath();
int bangIndex = path.indexOf( "!" );
if( bangIndex >= 0 )
{
return null;
}
return new File( new File( path ).getParentFile(), "../.." );
return bangIndex >= 0 ? null : new File( new File( path ).getParentFile(), "../.." );
}
@Deprecated
public static void registerTurtleUpgrade( ITurtleUpgrade upgrade )
{
turtleProxy.registerTurtleUpgrade( upgrade );
}
public static ITurtleUpgrade getTurtleUpgrade( String id )
{
return turtleProxy.getTurtleUpgrade( id );
}
public static ITurtleUpgrade getTurtleUpgrade( int legacyID )
{
return turtleProxy.getTurtleUpgrade( legacyID );
}
public static ITurtleUpgrade getTurtleUpgrade( @Nonnull ItemStack item )
{
return turtleProxy.getTurtleUpgrade( item );
}
public static void addAllUpgradedTurtles( NonNullList<ItemStack> list )
{
turtleProxy.addAllUpgradedTurtles( list );
TurtleUpgrades.register( upgrade );
}
public static void setDropConsumer( Entity entity, Function<ItemStack, ItemStack> consumer )
@ -1119,4 +905,24 @@ public static List<ItemStack> clearDropConsumer()
{
return turtleProxy.clearDropConsumer();
}
//region Compatibility
@Deprecated
public static IMedia getMedia( ItemStack stack )
{
return MediaProviders.get( stack );
}
@Deprecated
public static IPocketUpgrade getPocketUpgrade( ItemStack stack )
{
return dan200.computercraft.shared.PocketUpgrades.get( stack );
}
@Deprecated
public static ITurtleUpgrade getTurtleUpgrade( ItemStack stack )
{
return TurtleUpgrades.get( stack );
}
//endregion
}

View File

@ -494,11 +494,7 @@ private static Method findCCMethod( String name, Class<?>[] args )
{
try
{
if( computerCraft != null )
{
return computerCraft.getMethod( name, args );
}
return null;
return computerCraft != null ? computerCraft.getMethod( name, args ) : null;
}
catch( NoSuchMethodException e )
{

View File

@ -0,0 +1,36 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.core.apis;
import com.google.common.base.Preconditions;
import dan200.computercraft.api.lua.ILuaAPIFactory;
import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
public final class ApiFactories
{
private ApiFactories()
{
}
private static final Collection<ILuaAPIFactory> factories = new LinkedHashSet<>();
private static final Collection<ILuaAPIFactory> factoriesView = Collections.unmodifiableCollection( factories );
public static void register( @Nonnull ILuaAPIFactory factory )
{
Preconditions.checkNotNull( factory, "provider cannot be null" );
factories.add( factory );
}
public static Iterable<ILuaAPIFactory> getAll()
{
return factoriesView;
}
}

View File

@ -719,14 +719,11 @@ private void createAPIs()
m_apis.add( new HTTPAPI( m_apiEnvironment ) );
}
for( ILuaAPIFactory factory : ComputerCraft.getAPIFactories() )
for( ILuaAPIFactory factory : ApiFactories.getAll() )
{
ComputerSystem system = new ComputerSystem( m_apiEnvironment );
ILuaAPI api = factory.create( system );
if( api != null )
{
m_apis.add( api );
}
if( api != null ) m_apis.add( api );
}
}

View File

@ -0,0 +1,66 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.LinkedHashSet;
import java.util.Set;
public final class BundledRedstone
{
private static final Set<IBundledRedstoneProvider> providers = new LinkedHashSet<>();
public static void register( @Nonnull IBundledRedstoneProvider provider )
{
Preconditions.checkNotNull( provider, "provider cannot be null" );
providers.add( provider );
}
public static int getDefaultOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
{
return world.isValid( pos ) ? DefaultBundledRedstoneProvider.getDefaultBundledRedstoneOutput( world, pos, side ) : -1;
}
private static int getUnmaskedOutput( World world, BlockPos pos, EnumFacing side )
{
if( !world.isValid( pos ) ) return -1;
// Try the providers in order:
int combinedSignal = -1;
for( IBundledRedstoneProvider bundledRedstoneProvider : providers )
{
try
{
int signal = bundledRedstoneProvider.getBundledRedstoneOutput( world, pos, side );
if( signal >= 0 )
{
combinedSignal = combinedSignal < 0 ? signal & 0xffff : combinedSignal | (signal & 0xffff);
}
}
catch( Exception e )
{
ComputerCraft.log.error( "Bundled redstone provider " + bundledRedstoneProvider + " errored.", e );
}
}
return combinedSignal;
}
public static int getOutput( World world, BlockPos pos, EnumFacing side )
{
int signal = getUnmaskedOutput( world, pos, side );
return signal >= 0 ? signal : 0;
}
}

View File

@ -0,0 +1,49 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.media.IMediaProvider;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import java.util.LinkedHashSet;
import java.util.Set;
public final class MediaProviders
{
private static final Set<IMediaProvider> providers = new LinkedHashSet<>();
public static void register( @Nonnull IMediaProvider provider )
{
Preconditions.checkNotNull( provider, "provider cannot be null" );
providers.add( provider );
}
public static IMedia get( @Nonnull ItemStack stack )
{
if( stack.isEmpty() ) return null;
// Try the handlers in order:
for( IMediaProvider mediaProvider : providers )
{
try
{
IMedia media = mediaProvider.getMedia( stack );
if( media != null ) return media;
}
catch( Exception e )
{
// mod misbehaved, ignore it
ComputerCraft.log.error( "Media provider " + mediaProvider + " errored.", e );
}
}
return null;
}
}

View File

@ -0,0 +1,54 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.Collection;
public final class Peripherals
{
private static final Collection<IPeripheralProvider> providers = ComputerCraft.peripheralProviders;
public static void register( @Nonnull IPeripheralProvider provider )
{
Preconditions.checkNotNull( provider, "provider cannot be null" );
if( !providers.contains( provider ) ) providers.add( provider );
}
public static IPeripheral getPeripheral( World world, BlockPos pos, EnumFacing side )
{
return world.isValid( pos ) && !world.isRemote ? getPeripheralAt( world, pos, side ) : null;
}
private static IPeripheral getPeripheralAt( World world, BlockPos pos, EnumFacing side )
{
// Try the handlers in order:
for( IPeripheralProvider peripheralProvider : providers )
{
try
{
IPeripheral peripheral = peripheralProvider.getPeripheral( world, pos, side );
if( peripheral != null ) return peripheral;
}
catch( Exception e )
{
ComputerCraft.log.error( "Peripheral provider " + peripheralProvider + " errored.", e );
}
}
return null;
}
}

View File

@ -0,0 +1,71 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.util.InventoryUtil;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class PocketUpgrades
{
private static final Map<String, IPocketUpgrade> upgrades = new HashMap<>();
public static void register( @Nonnull IPocketUpgrade upgrade )
{
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
String id = upgrade.getUpgradeID().toString();
IPocketUpgrade existing = upgrades.get( id );
if( existing != null )
{
throw new IllegalStateException( "Error registering '" + upgrade.getUnlocalisedAdjective() + " pocket computer'. UpgradeID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " pocket computer'" );
}
upgrades.put( id, upgrade );
}
public static IPocketUpgrade get( String id )
{
return upgrades.get( id );
}
public static IPocketUpgrade get( @Nonnull ItemStack stack )
{
if( stack.isEmpty() ) return null;
for( IPocketUpgrade upgrade : upgrades.values() )
{
ItemStack craftingStack = upgrade.getCraftingItem();
if( !craftingStack.isEmpty() && InventoryUtil.areItemsStackable( stack, craftingStack ) )
{
return upgrade;
}
}
return null;
}
public static Iterable<IPocketUpgrade> getVanillaUpgrades()
{
List<IPocketUpgrade> vanilla = new ArrayList<>();
vanilla.add( ComputerCraft.PocketUpgrades.wirelessModem );
vanilla.add( ComputerCraft.PocketUpgrades.advancedModem );
vanilla.add( ComputerCraft.PocketUpgrades.pocketSpeaker );
return vanilla;
}
}

View File

@ -0,0 +1,60 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.api.permissions.ITurtlePermissionProvider;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.LinkedHashSet;
public final class TurtlePermissions
{
private static final Collection<ITurtlePermissionProvider> providers = new LinkedHashSet<>();
public static void register( @Nonnull ITurtlePermissionProvider upgrade )
{
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
providers.add( upgrade );
}
public static boolean isBlockEnterable( World world, BlockPos pos, EntityPlayer player )
{
MinecraftServer server = player.getServer();
if( server != null && !world.isRemote && server.isBlockProtected( world, pos, player ) )
{
return false;
}
for( ITurtlePermissionProvider provider : providers )
{
if( !provider.isBlockEnterable( world, pos ) ) return false;
}
return true;
}
public static boolean isBlockEditable( World world, BlockPos pos, EntityPlayer player )
{
MinecraftServer server = player.getServer();
if( server != null && !world.isRemote && server.isBlockProtected( world, pos, player ) )
{
return false;
}
for( ITurtlePermissionProvider provider : providers )
{
if( !provider.isBlockEditable( world, pos ) ) return false;
}
return true;
}
}

View File

@ -0,0 +1,132 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared;
import com.google.common.base.Preconditions;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.util.InventoryUtil;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class TurtleUpgrades
{
private static final Map<String, ITurtleUpgrade> upgrades = new HashMap<>();
private static final Int2ObjectMap<ITurtleUpgrade> legacyUpgrades = new Int2ObjectOpenHashMap<>();
public static void register( @Nonnull ITurtleUpgrade upgrade )
{
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
int id = upgrade.getLegacyUpgradeID();
if( id >= 0 && id < 64 )
{
String message = getMessage( upgrade, "Legacy UpgradeID '" + id + "' is reserved by ComputerCraft" );
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
registerInternal( upgrade );
}
public static void registerInternal( ITurtleUpgrade upgrade )
{
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
// Check conditions
int legacyId = upgrade.getLegacyUpgradeID();
if( legacyId >= 0 )
{
if( legacyId >= Short.MAX_VALUE )
{
String message = getMessage( upgrade, "UpgradeID '" + legacyId + "' is out of range" );
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
ITurtleUpgrade existing = legacyUpgrades.get( legacyId );
if( existing != null )
{
String message = getMessage( upgrade, "UpgradeID '" + legacyId + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
}
String id = upgrade.getUpgradeID().toString();
ITurtleUpgrade existing = upgrades.get( id );
if( existing != null )
{
String message = getMessage( upgrade, "UpgradeID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
// Register
if( legacyId >= 0 ) legacyUpgrades.put( legacyId, upgrade );
upgrades.put( id, upgrade );
}
private static String getMessage( ITurtleUpgrade upgrade, String rest )
{
return "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. " + rest;
}
public static ITurtleUpgrade get( String id )
{
return upgrades.get( id );
}
public static ITurtleUpgrade get( int id )
{
return legacyUpgrades.get( id );
}
public static ITurtleUpgrade get( @Nonnull ItemStack stack )
{
if( stack.isEmpty() ) return null;
for( ITurtleUpgrade upgrade : upgrades.values() )
{
ItemStack craftingStack = upgrade.getCraftingItem();
if( !craftingStack.isEmpty() && InventoryUtil.areItemsStackable( stack, craftingStack ) )
{
return upgrade;
}
}
return null;
}
public static Iterable<ITurtleUpgrade> getVanillaUpgrades()
{
List<ITurtleUpgrade> vanilla = new ArrayList<>();
vanilla.add( ComputerCraft.Upgrades.diamondPickaxe );
vanilla.add( ComputerCraft.Upgrades.diamondAxe );
vanilla.add( ComputerCraft.Upgrades.diamondSword );
vanilla.add( ComputerCraft.Upgrades.diamondShovel );
vanilla.add( ComputerCraft.Upgrades.diamondHoe );
vanilla.add( ComputerCraft.Upgrades.craftingTable );
vanilla.add( ComputerCraft.Upgrades.wirelessModem );
vanilla.add( ComputerCraft.Upgrades.advancedModem );
vanilla.add( ComputerCraft.Upgrades.turtleSpeaker );
return vanilla;
}
public static boolean suitableForFamily( ComputerFamily family, ITurtleUpgrade upgrade )
{
return true;
}
}

View File

@ -225,6 +225,7 @@ public final TileEntity createNewTileEntity( @Nonnull World world, int damage )
}
@Override
@Deprecated
public boolean isSideSolid( IBlockState state, @Nonnull IBlockAccess world, @Nonnull BlockPos pos, EnumFacing side )
{
// We need to override this as the default implementation uses isNormalCube, which returns false if

View File

@ -7,6 +7,8 @@
package dan200.computercraft.shared.computer.blocks;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.BundledRedstone;
import dan200.computercraft.shared.Peripherals;
import dan200.computercraft.shared.common.IDirectionalTile;
import dan200.computercraft.shared.common.ITerminal;
import dan200.computercraft.shared.common.TileGeneric;
@ -15,7 +17,6 @@
import dan200.computercraft.shared.computer.core.IComputer;
import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.util.DirectionUtil;
import dan200.computercraft.shared.util.PeripheralUtil;
import dan200.computercraft.shared.util.RedstoneUtil;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
@ -320,11 +321,11 @@ private void updateSideInput( ServerComputer computer, EnumFacing dir, BlockPos
if( !isRedstoneBlockedOnSide( localDir ) )
{
computer.setRedstoneInput( localDir, getWorld().getRedstonePower( offset, offsetSide ) );
computer.setBundledRedstoneInput( localDir, RedstoneUtil.getBundledRedstoneOutput( getWorld(), offset, offsetSide ) );
computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getWorld(), offset, offsetSide ) );
}
if( !isPeripheralBlockedOnSide( localDir ) )
{
computer.setPeripheral( localDir, PeripheralUtil.getPeripheral( getWorld(), offset, offsetSide ) );
computer.setPeripheral( localDir, Peripherals.getPeripheral( getWorld(), offset, offsetSide ) );
}
}

View File

@ -388,7 +388,7 @@ public String getHostString()
@Override
public int assignNewID()
{
return ComputerCraft.createUniqueNumberedSaveDir( m_world, "computer" );
return ComputerCraftAPI.createUniqueNumberedSaveDir( m_world, "computer" );
}
// Networking stuff

View File

@ -7,6 +7,7 @@
package dan200.computercraft.shared.computer.items;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.shared.computer.core.ComputerFamily;
@ -95,7 +96,7 @@ public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world )
int id = getComputerID( stack );
if( id >= 0 )
{
return ComputerCraft.createSaveDirMount( world, "computer/" + id, ComputerCraft.computerSpaceLimit );
return ComputerCraftAPI.createSaveDirMount( world, "computer/" + id, ComputerCraft.computerSpaceLimit );
}
}
return null;

View File

@ -123,7 +123,7 @@ public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world )
int diskID = getDiskID( stack );
if( diskID < 0 )
{
diskID = ComputerCraft.createUniqueNumberedSaveDir( world, "computer/disk" );
diskID = ComputerCraftAPI.createUniqueNumberedSaveDir( world, "computer/disk" );
setDiskID( stack, diskID );
}
return ComputerCraftAPI.createSaveDirMount( world, "computer/disk/" + diskID, ComputerCraft.floppySpaceLimit );

View File

@ -12,6 +12,7 @@
import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.MediaProviders;
import dan200.computercraft.shared.peripheral.PeripheralType;
import dan200.computercraft.shared.peripheral.common.BlockPeripheral;
import dan200.computercraft.shared.peripheral.common.TilePeripheralBase;
@ -97,7 +98,7 @@ public boolean onActivate( EntityPlayer player, EnumHand hand, EnumFacing side,
ItemStack disk = player.getHeldItem( hand );
if( !disk.isEmpty() && getStackInSlot( 0 ).isEmpty() )
{
if( ComputerCraft.getMedia( disk ) != null )
if( MediaProviders.get( disk ) != null )
{
setInventorySlotContents( 0, disk );
player.setHeldItem( hand, ItemStack.EMPTY );
@ -387,7 +388,7 @@ public void setDiskStack( @Nonnull ItemStack stack )
public IMedia getDiskMedia()
{
return ComputerCraft.getMedia( getDiskStack() );
return MediaProviders.get( getDiskStack() );
}
public String getDiskMountPath( IComputerAccess computer )

View File

@ -0,0 +1,19 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.peripheral.modem;
/**
* This only exists for backwards compatiblity
*/
public abstract class WirelessModemPeripheral extends dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral
{
@Deprecated
public WirelessModemPeripheral( boolean advanced )
{
super( new ModemState(), advanced );
}
}

View File

@ -8,6 +8,7 @@
import com.google.common.collect.ImmutableMap;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.shared.peripheral.PeripheralType;
import dan200.computercraft.shared.peripheral.common.BlockPeripheralBase;
import dan200.computercraft.shared.peripheral.common.PeripheralItemFactory;
@ -172,7 +173,7 @@ public static boolean doesConnectVisually( IBlockState state, IBlockAccess world
{
if( !state.getValue( Properties.CABLE ) ) return false;
if( state.getValue( Properties.MODEM ).getFacing() == direction ) return true;
return ComputerCraft.getWiredElementAt( world, pos.offset( direction ), direction.getOpposite() ) != null;
return ComputerCraftAPI.getWiredElementAt( world, pos.offset( direction ), direction.getOpposite() ) != null;
}
@Nonnull

View File

@ -8,6 +8,7 @@
import com.google.common.base.Objects;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral;
@ -369,7 +370,7 @@ public void connectionsChanged()
BlockPos offset = current.offset( facing );
if( !world.isBlockLoaded( offset ) ) continue;
IWiredElement element = ComputerCraft.getWiredElementAt( world, offset, facing.getOpposite() );
IWiredElement element = ComputerCraftAPI.getWiredElementAt( world, offset, facing.getOpposite() );
if( element == null ) continue;
if( BlockCable.canConnectIn( state, facing ) )

View File

@ -7,7 +7,7 @@
package dan200.computercraft.shared.peripheral.modem.wired;
import com.google.common.base.Objects;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.network.wired.IWiredElement;
import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral;
@ -283,7 +283,7 @@ private void connectionsChanged()
BlockPos offset = current.offset( facing );
if( !world.isBlockLoaded( offset ) ) continue;
IWiredElement element = ComputerCraft.getWiredElementAt( world, offset, facing.getOpposite() );
IWiredElement element = ComputerCraftAPI.getWiredElementAt( world, offset, facing.getOpposite() );
if( element == null ) continue;
// If we can connect to it then do so

View File

@ -8,8 +8,8 @@
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.Peripherals;
import dan200.computercraft.shared.util.IDAssigner;
import dan200.computercraft.shared.util.PeripheralUtil;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
@ -139,7 +139,7 @@ private static IPeripheral getPeripheralFrom( World world, BlockPos pos, EnumFac
Block block = world.getBlockState( offset ).getBlock();
if( block == ComputerCraft.Blocks.wiredModemFull || block == ComputerCraft.Blocks.cable ) return null;
IPeripheral peripheral = PeripheralUtil.getPeripheral( world, offset, direction.getOpposite() );
IPeripheral peripheral = Peripherals.getPeripheral( world, offset, direction.getOpposite() );
return peripheral instanceof WiredModemPeripheral ? null : peripheral;
}
}

View File

@ -141,6 +141,7 @@ public BlockFaceShape getBlockFaceShape( IBlockAccess world, IBlockState state,
}
@Override
@Deprecated
public AxisAlignedBB getBoundingBox( IBlockState state, IBlockAccess source, BlockPos pos )
{
return ModemBounds.getBounds( state.getValue( Properties.FACING ) );

View File

@ -23,13 +23,6 @@ public WirelessModemPeripheral( ModemState state, boolean advanced )
m_advanced = advanced;
}
@Deprecated
public WirelessModemPeripheral( boolean advanced )
{
// Only for backwards compatibiliy
this( new ModemState(), advanced );
}
@Override
public boolean isInterdimensional()
{

View File

@ -11,6 +11,7 @@
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.shared.PocketUpgrades;
import dan200.computercraft.shared.pocket.core.PocketServerComputer;
import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.WorldUtil;
@ -139,7 +140,7 @@ private static IPocketUpgrade findUpgrade( NonNullList<ItemStack> inv, int start
ItemStack invStack = inv.get( (i + start) % inv.size() );
if( !invStack.isEmpty() )
{
IPocketUpgrade newUpgrade = ComputerCraft.getPocketUpgrade( invStack );
IPocketUpgrade newUpgrade = PocketUpgrades.get( invStack );
if( newUpgrade != null && newUpgrade != previous )
{

View File

@ -8,9 +8,11 @@
import com.google.common.base.Objects;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.filesystem.IMount;
import dan200.computercraft.api.media.IMedia;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.shared.PocketUpgrades;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.blocks.ComputerState;
import dan200.computercraft.shared.computer.core.ClientComputer;
@ -100,7 +102,7 @@ public void getSubItems( @Nonnull CreativeTabs tabs, @Nonnull NonNullList<ItemSt
private void getSubItems( NonNullList<ItemStack> list, ComputerFamily family )
{
list.add( PocketComputerItemFactory.create( -1, null, -1, family, null ) );
for( IPocketUpgrade upgrade : ComputerCraft.getVanillaPocketUpgrades() )
for( IPocketUpgrade upgrade : PocketUpgrades.getVanillaUpgrades() )
{
list.add( PocketComputerItemFactory.create( -1, null, -1, family, upgrade ) );
}
@ -268,7 +270,7 @@ private PocketServerComputer createServerComputer( final World world, IInventory
int computerID = getComputerID( stack );
if( computerID < 0 )
{
computerID = ComputerCraft.createUniqueNumberedSaveDir( world, "computer" );
computerID = ComputerCraftAPI.createUniqueNumberedSaveDir( world, "computer" );
setComputerID( stack, computerID );
}
computer = new PocketServerComputer(
@ -405,7 +407,7 @@ public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world )
int id = getComputerID( stack );
if( id >= 0 )
{
return ComputerCraft.createSaveDirMount( world, "computer/" + id, ComputerCraft.computerSpaceLimit );
return ComputerCraftAPI.createSaveDirMount( world, "computer/" + id, ComputerCraft.computerSpaceLimit );
}
return null;
}
@ -482,15 +484,12 @@ public IPocketUpgrade getUpgrade( @Nonnull ItemStack stack )
if( compound.hasKey( "upgrade", Constants.NBT.TAG_STRING ) )
{
String name = compound.getString( "upgrade" );
return ComputerCraft.getPocketUpgrade( name );
return PocketUpgrades.get( name );
}
else if( compound.hasKey( "upgrade", Constants.NBT.TAG_ANY_NUMERIC ) )
{
int id = compound.getInteger( "upgrade" );
if( id == 1 )
{
return ComputerCraft.getPocketUpgrade( "computercraft:wireless_modem" );
}
if( id == 1 ) return ComputerCraft.PocketUpgrades.wirelessModem;
}
}

View File

@ -9,6 +9,7 @@
import com.google.gson.JsonObject;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.shared.PocketUpgrades;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
@ -104,7 +105,7 @@ public ItemStack getCraftingResult( @Nonnull InventoryCrafting inventory )
}
else if( x == computerX && y == computerY - 1 )
{
upgrade = ComputerCraft.getPocketUpgrade( item );
upgrade = PocketUpgrades.get( item );
if( upgrade == null ) return ItemStack.EMPTY;
}
else if( !item.isEmpty() )

View File

@ -9,6 +9,7 @@
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.event.TurtleActionEvent;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.turtle.blocks.BlockTurtle;
import dan200.computercraft.shared.turtle.blocks.TileTurtle;
@ -19,10 +20,8 @@
import dan200.computercraft.shared.turtle.items.ItemTurtleLegacy;
import dan200.computercraft.shared.turtle.items.ItemTurtleNormal;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe;
import dan200.computercraft.shared.turtle.upgrades.*;
import dan200.computercraft.shared.util.ImpostorRecipe;
import dan200.computercraft.shared.util.InventoryUtil;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
@ -30,7 +29,6 @@
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
@ -46,19 +44,13 @@
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.registries.IForgeRegistry;
import javax.annotation.Nonnull;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public abstract class CCTurtleProxyCommon implements ICCTurtleProxy
{
private Map<Integer, ITurtleUpgrade> m_legacyTurtleUpgrades;
private Map<String, ITurtleUpgrade> m_turtleUpgrades;
private Function<ItemStack, ItemStack> dropConsumer;
private List<ItemStack> remainingDrops;
private WeakReference<World> dropWorld;
@ -66,14 +58,6 @@ public abstract class CCTurtleProxyCommon implements ICCTurtleProxy
private AxisAlignedBB dropBounds;
private WeakReference<Entity> dropEntity;
public CCTurtleProxyCommon()
{
m_legacyTurtleUpgrades = new HashMap<>();
m_turtleUpgrades = new HashMap<>();
}
// ICCTurtleProxy implementation
@Override
public void preInit()
{
@ -92,102 +76,6 @@ public void init()
registerTileEntities();
}
@Override
public void registerTurtleUpgrade( ITurtleUpgrade upgrade )
{
// Check conditions
int id = upgrade.getLegacyUpgradeID();
if( id >= 0 && id < 64 )
{
String message = "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. Legacy UpgradeID '" + id + "' is reserved by ComputerCraft";
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
// Register
registerTurtleUpgradeInternal( upgrade );
}
@Override
public ITurtleUpgrade getTurtleUpgrade( String id )
{
return m_turtleUpgrades.get( id );
}
@Override
public ITurtleUpgrade getTurtleUpgrade( int legacyId )
{
return m_legacyTurtleUpgrades.get( legacyId );
}
@Override
public ITurtleUpgrade getTurtleUpgrade( @Nonnull ItemStack stack )
{
for( ITurtleUpgrade upgrade : m_turtleUpgrades.values() )
{
try
{
ItemStack upgradeStack = upgrade.getCraftingItem();
if( InventoryUtil.areItemsStackable( upgradeStack, stack ) )
{
return upgrade;
}
}
catch( Exception e )
{
ComputerCraft.log.error( "Error getting computer upgrade item", e );
}
}
return null;
}
public static boolean isUpgradeVanilla( ITurtleUpgrade upgrade )
{
return upgrade instanceof TurtleTool || upgrade instanceof TurtleModem || upgrade instanceof TurtleCraftingTable || upgrade instanceof TurtleSpeaker;
}
public static boolean isUpgradeSuitableForFamily( ComputerFamily family, ITurtleUpgrade upgrade )
{
return true;
}
private void addAllUpgradedTurtles( ComputerFamily family, NonNullList<ItemStack> list )
{
ItemStack basicStack = TurtleItemFactory.create( -1, null, -1, family, null, null, 0, null );
if( !basicStack.isEmpty() )
{
list.add( basicStack );
}
addUpgradedTurtle( family, ComputerCraft.Upgrades.diamondPickaxe, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.diamondAxe, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.diamondSword, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.diamondShovel, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.diamondHoe, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.craftingTable, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.wirelessModem, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.advancedModem, list );
addUpgradedTurtle( family, ComputerCraft.Upgrades.turtleSpeaker, list );
}
private void addUpgradedTurtle( ComputerFamily family, ITurtleUpgrade upgrade, List<ItemStack> list )
{
if( isUpgradeSuitableForFamily( family, upgrade ) )
{
ItemStack stack = TurtleItemFactory.create( -1, null, -1, family, upgrade, null, 0, null );
if( !stack.isEmpty() )
{
list.add( stack );
}
}
}
@Override
public void addAllUpgradedTurtles( NonNullList<ItemStack> list )
{
addAllUpgradedTurtles( ComputerFamily.Normal, list );
addAllUpgradedTurtles( ComputerFamily.Advanced, list );
}
@Override
public void setDropConsumer( Entity entity, Function<ItemStack, ItemStack> consumer )
{
@ -241,45 +129,6 @@ public List<ItemStack> clearDropConsumer()
return remainingStacks;
}
private void registerTurtleUpgradeInternal( ITurtleUpgrade upgrade )
{
// Check conditions
int legacyID = upgrade.getLegacyUpgradeID();
if( legacyID >= 0 )
{
if( legacyID >= Short.MAX_VALUE )
{
String message = "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. UpgradeID '" + legacyID + "' is out of range";
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
ITurtleUpgrade existing = m_legacyTurtleUpgrades.get( legacyID );
if( existing != null )
{
String message = "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. UpgradeID '" + legacyID + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'";
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
}
String id = upgrade.getUpgradeID().toString();
ITurtleUpgrade existing = m_turtleUpgrades.get( id );
if( existing != null )
{
String message = "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. UpgradeID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'";
ComputerCraft.log.error( message );
throw new RuntimeException( message );
}
// Register
if( legacyID >= 0 )
{
m_legacyTurtleUpgrades.put( legacyID, upgrade );
}
m_turtleUpgrades.put( id, upgrade );
}
@SubscribeEvent
public void registerBlocks( RegistryEvent.Register<Block> event )
{
@ -316,20 +165,15 @@ public void registerRecipes( RegistryEvent.Register<IRecipe> event )
// Add a bunch of impostor recipes
// TODO: Figure out a way to do this in a "nice" way.
for( ITurtleUpgrade upgrade : m_turtleUpgrades.values() )
for( ITurtleUpgrade upgrade : TurtleUpgrades.getVanillaUpgrades() )
{
if( !isUpgradeVanilla( upgrade ) ) continue;
// Add fake recipes to fool NEI
ItemStack craftingItem = upgrade.getCraftingItem();
// A turtle just containing this upgrade
for( ComputerFamily family : ComputerFamily.values() )
{
if( !isUpgradeSuitableForFamily( family, upgrade ) )
{
continue;
}
if( !TurtleUpgrades.suitableForFamily( family, upgrade ) ) continue;
ItemStack baseTurtle = TurtleItemFactory.create( -1, null, -1, family, null, null, 0, null );
if( !baseTurtle.isEmpty() )
@ -377,31 +221,31 @@ private void registerUpgrades()
{
// Upgrades
ComputerCraft.Upgrades.wirelessModem = new TurtleModem( false, new ResourceLocation( "computercraft", "wireless_modem" ), 1 );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.wirelessModem );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.wirelessModem );
ComputerCraft.Upgrades.craftingTable = new TurtleCraftingTable( 2 );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.craftingTable );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.craftingTable );
ComputerCraft.Upgrades.diamondSword = new TurtleSword( new ResourceLocation( "minecraft", "diamond_sword" ), 3, "upgrade.minecraft:diamond_sword.adjective", Items.DIAMOND_SWORD );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.diamondSword );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.diamondSword );
ComputerCraft.Upgrades.diamondShovel = new TurtleShovel( new ResourceLocation( "minecraft", "diamond_shovel" ), 4, "upgrade.minecraft:diamond_shovel.adjective", Items.DIAMOND_SHOVEL );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.diamondShovel );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.diamondShovel );
ComputerCraft.Upgrades.diamondPickaxe = new TurtleTool( new ResourceLocation( "minecraft", "diamond_pickaxe" ), 5, "upgrade.minecraft:diamond_pickaxe.adjective", Items.DIAMOND_PICKAXE );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.diamondPickaxe );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.diamondPickaxe );
ComputerCraft.Upgrades.diamondAxe = new TurtleAxe( new ResourceLocation( "minecraft", "diamond_axe" ), 6, "upgrade.minecraft:diamond_axe.adjective", Items.DIAMOND_AXE );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.diamondAxe );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.diamondAxe );
ComputerCraft.Upgrades.diamondHoe = new TurtleHoe( new ResourceLocation( "minecraft", "diamond_hoe" ), 7, "upgrade.minecraft:diamond_hoe.adjective", Items.DIAMOND_HOE );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.diamondHoe );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.diamondHoe );
ComputerCraft.Upgrades.advancedModem = new TurtleModem( true, new ResourceLocation( "computercraft", "advanced_modem" ), -1 );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.advancedModem );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.advancedModem );
ComputerCraft.Upgrades.turtleSpeaker = new TurtleSpeaker( new ResourceLocation( "computercraft", "speaker" ), 8 );
registerTurtleUpgradeInternal( ComputerCraft.Upgrades.turtleSpeaker );
TurtleUpgrades.registerInternal( ComputerCraft.Upgrades.turtleSpeaker );
}
@SubscribeEvent

View File

@ -10,6 +10,7 @@
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.core.computer.MainThread;
import dan200.computercraft.shared.PocketUpgrades;
import dan200.computercraft.shared.command.CommandComputerCraft;
import dan200.computercraft.shared.command.ContainerViewComputer;
import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider;
@ -30,7 +31,6 @@
import dan200.computercraft.shared.media.items.ItemDiskLegacy;
import dan200.computercraft.shared.media.items.ItemPrintout;
import dan200.computercraft.shared.media.items.ItemTreasureDisk;
import dan200.computercraft.shared.media.recipes.PrintoutRecipe;
import dan200.computercraft.shared.network.ComputerCraftPacket;
import dan200.computercraft.shared.peripheral.commandblock.CommandBlockPeripheralProvider;
import dan200.computercraft.shared.peripheral.common.BlockPeripheral;
@ -52,7 +52,6 @@
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import dan200.computercraft.shared.pocket.peripherals.PocketModem;
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
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.Colour;
@ -300,7 +299,7 @@ public void registerRecipes( RegistryEvent.Register<IRecipe> event )
// Impostor Pocket Computer recipes (to fool NEI)
ItemStack pocketComputer = PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.Normal, null );
ItemStack advancedPocketComputer = PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.Advanced, null );
for( IPocketUpgrade upgrade : ComputerCraft.getVanillaPocketUpgrades() )
for( IPocketUpgrade upgrade : PocketUpgrades.getVanillaUpgrades() )
{
registry.register( new ImpostorRecipe(
"computercraft:normal_pocket_upgrade",

View File

@ -6,14 +6,11 @@
package dan200.computercraft.shared.proxy;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.List;
import java.util.function.Function;
@ -23,16 +20,6 @@ public interface ICCTurtleProxy
void init();
void registerTurtleUpgrade( ITurtleUpgrade upgrade );
ITurtleUpgrade getTurtleUpgrade( String id );
ITurtleUpgrade getTurtleUpgrade( int legacyId );
ITurtleUpgrade getTurtleUpgrade( @Nonnull ItemStack item );
void addAllUpgradedTurtles( NonNullList<ItemStack> list );
void setDropConsumer( Entity entity, Function<ItemStack, ItemStack> consumer );
void setDropConsumer( World world, BlockPos pos, Function<ItemStack, ItemStack> consumer );

View File

@ -13,6 +13,7 @@
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.turtle.*;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.computer.blocks.ComputerProxy;
import dan200.computercraft.shared.computer.blocks.TileComputerBase;
import dan200.computercraft.shared.computer.core.ComputerFamily;
@ -132,14 +133,14 @@ public void update()
}
}
public void readFromNBT( NBTTagCompound nbttagcompound )
public void readFromNBT( NBTTagCompound tag )
{
// Read state
m_direction = EnumFacing.byIndex( nbttagcompound.getInteger( "dir" ) );
m_selectedSlot = nbttagcompound.getInteger( "selectedSlot" );
if( nbttagcompound.hasKey( "fuelLevel" ) )
m_direction = EnumFacing.byIndex( tag.getInteger( "dir" ) );
m_selectedSlot = tag.getInteger( "selectedSlot" );
if( tag.hasKey( "fuelLevel" ) )
{
m_fuelLevel = nbttagcompound.getInteger( "fuelLevel" );
m_fuelLevel = tag.getInteger( "fuelLevel" );
}
else
{
@ -147,9 +148,9 @@ public void readFromNBT( NBTTagCompound nbttagcompound )
}
// Read owner
if( nbttagcompound.hasKey( "owner", Constants.NBT.TAG_COMPOUND ) )
if( tag.hasKey( "owner", Constants.NBT.TAG_COMPOUND ) )
{
NBTTagCompound owner = nbttagcompound.getCompoundTag( "owner" );
NBTTagCompound owner = tag.getCompoundTag( "owner" );
m_owningPlayer = new GameProfile(
new UUID( owner.getLong( "upper_id" ), owner.getLong( "lower_id" ) ),
owner.getString( "name" )
@ -161,15 +162,15 @@ public void readFromNBT( NBTTagCompound nbttagcompound )
}
// Read colour
m_colourHex = ColourUtils.getHexColour( nbttagcompound );
m_colourHex = ColourUtils.getHexColour( tag );
// Read overlay
if( nbttagcompound.hasKey( "overlay_mod" ) )
if( tag.hasKey( "overlay_mod" ) )
{
String overlay_mod = nbttagcompound.getString( "overlay_mod" );
if( nbttagcompound.hasKey( "overlay_path" ) )
String overlay_mod = tag.getString( "overlay_mod" );
if( tag.hasKey( "overlay_path" ) )
{
String overlay_path = nbttagcompound.getString( "overlay_path" );
String overlay_path = tag.getString( "overlay_path" );
m_overlay = new ResourceLocation( overlay_mod, overlay_path );
}
else
@ -186,10 +187,10 @@ public void readFromNBT( NBTTagCompound nbttagcompound )
// (pre-1.4 turtles will have a "subType" variable, newer things will have "leftUpgrade" and "rightUpgrade")
ITurtleUpgrade leftUpgrade = null;
ITurtleUpgrade rightUpgrade = null;
if( nbttagcompound.hasKey( "subType" ) )
if( tag.hasKey( "subType" ) )
{
// Loading a pre-1.4 world
int subType = nbttagcompound.getInteger( "subType" );
int subType = tag.getInteger( "subType" );
if( (subType & 0x1) > 0 )
{
leftUpgrade = ComputerCraft.Upgrades.diamondPickaxe;
@ -202,26 +203,26 @@ public void readFromNBT( NBTTagCompound nbttagcompound )
else
{
// Loading a post-1.4 world
if( nbttagcompound.hasKey( "leftUpgrade" ) )
if( tag.hasKey( "leftUpgrade" ) )
{
if( nbttagcompound.getTagId( "leftUpgrade" ) == Constants.NBT.TAG_STRING )
if( tag.getTagId( "leftUpgrade" ) == Constants.NBT.TAG_STRING )
{
leftUpgrade = ComputerCraft.getTurtleUpgrade( nbttagcompound.getString( "leftUpgrade" ) );
leftUpgrade = TurtleUpgrades.get( tag.getString( "leftUpgrade" ) );
}
else
{
leftUpgrade = ComputerCraft.getTurtleUpgrade( nbttagcompound.getShort( "leftUpgrade" ) );
leftUpgrade = TurtleUpgrades.get( tag.getShort( "leftUpgrade" ) );
}
}
if( nbttagcompound.hasKey( "rightUpgrade" ) )
if( tag.hasKey( "rightUpgrade" ) )
{
if( nbttagcompound.getTagId( "rightUpgrade" ) == Constants.NBT.TAG_STRING )
if( tag.getTagId( "rightUpgrade" ) == Constants.NBT.TAG_STRING )
{
rightUpgrade = ComputerCraft.getTurtleUpgrade( nbttagcompound.getString( "rightUpgrade" ) );
rightUpgrade = TurtleUpgrades.get( tag.getString( "rightUpgrade" ) );
}
else
{
rightUpgrade = ComputerCraft.getTurtleUpgrade( nbttagcompound.getShort( "rightUpgrade" ) );
rightUpgrade = TurtleUpgrades.get( tag.getShort( "rightUpgrade" ) );
}
}
}
@ -230,13 +231,13 @@ public void readFromNBT( NBTTagCompound nbttagcompound )
// NBT
m_upgradeNBTData.clear();
if( nbttagcompound.hasKey( "leftUpgradeNBT" ) )
if( tag.hasKey( "leftUpgradeNBT" ) )
{
m_upgradeNBTData.put( TurtleSide.Left, nbttagcompound.getCompoundTag( "leftUpgradeNBT" ).copy() );
m_upgradeNBTData.put( TurtleSide.Left, tag.getCompoundTag( "leftUpgradeNBT" ).copy() );
}
if( nbttagcompound.hasKey( "rightUpgradeNBT" ) )
if( tag.hasKey( "rightUpgradeNBT" ) )
{
m_upgradeNBTData.put( TurtleSide.Right, nbttagcompound.getCompoundTag( "rightUpgradeNBT" ).copy() );
m_upgradeNBTData.put( TurtleSide.Right, tag.getCompoundTag( "rightUpgradeNBT" ).copy() );
}
}
@ -353,7 +354,7 @@ public void readDescription( NBTTagCompound nbttagcompound )
// Upgrades
if( nbttagcompound.hasKey( "leftUpgrade" ) )
{
setUpgrade( TurtleSide.Left, ComputerCraft.getTurtleUpgrade( nbttagcompound.getString( "leftUpgrade" ) ) );
setUpgrade( TurtleSide.Left, TurtleUpgrades.get( nbttagcompound.getString( "leftUpgrade" ) ) );
}
else
{
@ -361,7 +362,7 @@ public void readDescription( NBTTagCompound nbttagcompound )
}
if( nbttagcompound.hasKey( "rightUpgrade" ) )
{
setUpgrade( TurtleSide.Right, ComputerCraft.getTurtleUpgrade( nbttagcompound.getString( "rightUpgrade" ) ) );
setUpgrade( TurtleSide.Right, TurtleUpgrades.get( nbttagcompound.getString( "rightUpgrade" ) ) );
}
else
{

View File

@ -6,11 +6,10 @@
package dan200.computercraft.shared.turtle.core;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.*;
import dan200.computercraft.api.turtle.event.TurtleAction;
import dan200.computercraft.api.turtle.event.TurtleActionEvent;
import dan200.computercraft.shared.proxy.CCTurtleProxyCommon;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.item.ItemStack;
@ -41,8 +40,8 @@ public TurtleCommandResult execute( @Nonnull ITurtleAccess turtle )
if( !selectedStack.isEmpty() )
{
newUpgradeStack = selectedStack.copy();
newUpgrade = ComputerCraft.getTurtleUpgrade( newUpgradeStack );
if( newUpgrade == null || !CCTurtleProxyCommon.isUpgradeSuitableForFamily( ((TurtleBrain) turtle).getFamily(), newUpgrade ) )
newUpgrade = TurtleUpgrades.get( newUpgradeStack );
if( newUpgrade == null || !TurtleUpgrades.suitableForFamily( ((TurtleBrain) turtle).getFamily(), newUpgrade ) )
{
return TurtleCommandResult.failure( "Not a valid upgrade" );
}

View File

@ -12,6 +12,7 @@
import dan200.computercraft.api.turtle.TurtleAnimation;
import dan200.computercraft.api.turtle.TurtleCommandResult;
import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
import dan200.computercraft.shared.TurtlePermissions;
import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
@ -172,7 +173,7 @@ else if( !world.isValid( position ) )
if( ComputerCraft.turtlesObeyBlockProtection )
{
// Check spawn protection
if( !ComputerCraft.isBlockEnterable( world, position, turtlePlayer ) )
if( !TurtlePermissions.isBlockEnterable( world, position, turtlePlayer ) )
{
return TurtleCommandResult.failure( "Cannot enter protected area" );
}

View File

@ -12,6 +12,8 @@
import dan200.computercraft.api.turtle.TurtleAnimation;
import dan200.computercraft.api.turtle.TurtleCommandResult;
import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
import dan200.computercraft.shared.TurtlePermissions;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.util.DirectionUtil;
import dan200.computercraft.shared.util.InventoryUtil;
import dan200.computercraft.shared.util.WorldUtil;
@ -303,8 +305,8 @@ private static boolean canDeployOnBlock( @Nonnull ItemStack stack, ITurtleAccess
{
// Check spawn protection
boolean editable = replaceable
? ComputerCraft.isBlockEditable( world, position, player )
: ComputerCraft.isBlockEditable( world, position.offset( side ), player );
? TurtlePermissions.isBlockEditable( world, position, player )
: TurtlePermissions.isBlockEditable( world, position.offset( side ), player );
if( !editable )
{
if( o_errorMessage != null )

View File

@ -22,7 +22,7 @@ public ItemTurtleAdvanced( Block block )
// IComputerItem implementation
@Override
public ComputerFamily getFamily( int damage )
public ComputerFamily getFamily()
{
return ComputerFamily.Advanced;
}

View File

@ -6,9 +6,9 @@
package dan200.computercraft.shared.turtle.items;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.items.ItemComputerBase;
import dan200.computercraft.shared.turtle.blocks.ITurtleTile;
@ -40,18 +40,26 @@ protected ItemTurtleBase( Block block )
public abstract ItemStack create( int id, String label, int colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, int fuelLevel, ResourceLocation overlay );
public abstract ComputerFamily getFamily();
@Override
public ComputerFamily getFamily( int damage )
{
return getFamily();
}
@Override
public void getSubItems( @Nullable CreativeTabs tabs, @Nonnull NonNullList<ItemStack> list )
{
if( !isInCreativeTab( tabs ) ) return;
NonNullList<ItemStack> all = NonNullList.create();
ComputerCraft.addAllUpgradedTurtles( all );
for( ItemStack stack : all )
ComputerFamily family = getFamily();
for( ITurtleUpgrade upgrade : TurtleUpgrades.getVanillaUpgrades() )
{
if( stack.getItem() == this )
{
list.add( stack );
}
if( !TurtleUpgrades.suitableForFamily( family, upgrade ) ) continue;
ItemStack stack = TurtleItemFactory.create( -1, null, -1, family, upgrade, null, 0, null );
if( !stack.isEmpty() && stack.getItem() == this ) list.add( stack );
}
}
@ -61,7 +69,7 @@ public boolean placeBlockAt( @Nonnull ItemStack stack, @Nonnull EntityPlayer pla
if( super.placeBlockAt( stack, player, world, pos, side, hitX, hitY, hitZ, newState ) )
{
TileEntity tile = world.getTileEntity( pos );
if( tile != null && tile instanceof ITurtleTile )
if( tile instanceof ITurtleTile )
{
ITurtleTile turtle = (ITurtleTile) tile;
setupTurtleAfterPlacement( stack, turtle );

View File

@ -97,7 +97,7 @@ public int getComputerID( @Nonnull ItemStack stack )
}
@Override
public ComputerFamily getFamily( int damage )
public ComputerFamily getFamily()
{
return ComputerFamily.Normal;
}

View File

@ -9,6 +9,7 @@
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.util.ColourUtils;
import net.minecraft.block.Block;
@ -102,7 +103,7 @@ public int getComputerID( @Nonnull ItemStack stack )
}
@Override
public ComputerFamily getFamily( int damage )
public ComputerFamily getFamily()
{
return ComputerFamily.Normal;
}
@ -123,11 +124,11 @@ public ITurtleUpgrade getUpgrade( @Nonnull ItemStack stack, TurtleSide side )
{
if( nbt.getTagId( "leftUpgrade" ) == Constants.NBT.TAG_STRING )
{
return ComputerCraft.getTurtleUpgrade( nbt.getString( "leftUpgrade" ) );
return TurtleUpgrades.get( nbt.getString( "leftUpgrade" ) );
}
else
{
return ComputerCraft.getTurtleUpgrade( nbt.getShort( "leftUpgrade" ) );
return TurtleUpgrades.get( nbt.getShort( "leftUpgrade" ) );
}
}
break;
@ -138,11 +139,11 @@ public ITurtleUpgrade getUpgrade( @Nonnull ItemStack stack, TurtleSide side )
{
if( nbt.getTagId( "rightUpgrade" ) == Constants.NBT.TAG_STRING )
{
return ComputerCraft.getTurtleUpgrade( nbt.getString( "rightUpgrade" ) );
return TurtleUpgrades.get( nbt.getString( "rightUpgrade" ) );
}
else
{
return ComputerCraft.getTurtleUpgrade( nbt.getShort( "rightUpgrade" ) );
return TurtleUpgrades.get( nbt.getShort( "rightUpgrade" ) );
}
}
break;

View File

@ -7,11 +7,10 @@
package dan200.computercraft.shared.turtle.recipes;
import com.google.gson.JsonObject;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.TurtleUpgrades;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.proxy.CCTurtleProxyCommon;
import dan200.computercraft.shared.turtle.items.ITurtleItem;
import dan200.computercraft.shared.turtle.items.TurtleItemFactory;
import net.minecraft.inventory.InventoryCrafting;
@ -157,7 +156,7 @@ else if( !turtle.isEmpty() && rightItem.isEmpty() )
{
if( !items[i].isEmpty() )
{
ITurtleUpgrade itemUpgrade = ComputerCraft.getTurtleUpgrade( items[i] );
ITurtleUpgrade itemUpgrade = TurtleUpgrades.get( items[i] );
if( itemUpgrade == null )
{
return ItemStack.EMPTY;
@ -166,7 +165,7 @@ else if( !turtle.isEmpty() && rightItem.isEmpty() )
{
return ItemStack.EMPTY;
}
if( !CCTurtleProxyCommon.isUpgradeSuitableForFamily( family, itemUpgrade ) )
if( !TurtleUpgrades.suitableForFamily( family, itemUpgrade ) )
{
return ItemStack.EMPTY;
}

View File

@ -10,6 +10,7 @@
import dan200.computercraft.api.turtle.*;
import dan200.computercraft.api.turtle.event.TurtleAttackEvent;
import dan200.computercraft.api.turtle.event.TurtleBlockEvent;
import dan200.computercraft.shared.TurtlePermissions;
import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand;
import dan200.computercraft.shared.turtle.core.TurtlePlayer;
import dan200.computercraft.shared.util.InventoryUtil;
@ -203,7 +204,7 @@ private TurtleCommandResult dig( ITurtleAccess turtle, EnumFacing direction, Tur
return TurtleCommandResult.failure( "Cannot break protected block" );
}
if( !ComputerCraft.isBlockEditable( world, blockPosition, turtlePlayer ) )
if( !TurtlePermissions.isBlockEditable( world, blockPosition, turtlePlayer ) )
{
return TurtleCommandResult.failure( "Cannot break protected block" );
}

View File

@ -1,15 +0,0 @@
package dan200.computercraft.shared.util;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class PeripheralUtil
{
public static IPeripheral getPeripheral( World world, BlockPos pos, EnumFacing side )
{
return world.isValid( pos ) && !world.isRemote ? ComputerCraft.getPeripheralAt( world, pos, side ) : null;
}
}

View File

@ -6,7 +6,7 @@
package dan200.computercraft.shared.util;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.BundledRedstone;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumFacing;
@ -15,10 +15,10 @@
public class RedstoneUtil
{
@Deprecated
public static int getBundledRedstoneOutput( World world, BlockPos pos, EnumFacing side )
{
int signal = ComputerCraft.getBundledRedstoneOutput( world, pos, side );
return signal >= 0 ? signal : 0;
return BundledRedstone.getOutput( world, pos, side );
}
public static void propagateRedstoneOutput( World world, BlockPos pos, EnumFacing side )