mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-12-13 03:30:29 +00:00
Turn inspections up to 11
OK, so let's get this out of the way, there's some actual changes mixed in here too. I'm really sorry: - Turtles can now not be renamed with unnamed item tags (previously it would clear the name, this seemed a little unideal). - commands.getBlock(s)Data will also include NBT. Now, onto the horror story which is these inspection changes: - Make a lot of methods static - Typo fixes - Make utility classes final + private constructor - Lots of reformatting (ifs -> ternary, invert control flow, etc...) - ??? - Profit! I'm so going to regret this - can pretty much guarantee this is going to break something.
This commit is contained in:
parent
1230cabcb0
commit
173ea72001
2491
codeInspectionSettings.xml
Normal file
2491
codeInspectionSettings.xml
Normal file
File diff suppressed because it is too large
Load Diff
@ -157,7 +157,7 @@ public class ComputerCraft
|
||||
public static final int terminalHeight_pocketComputer = 20;
|
||||
|
||||
// Blocks and Items
|
||||
public static class Blocks
|
||||
public static final class Blocks
|
||||
{
|
||||
public static BlockComputer computer;
|
||||
public static BlockCommandComputer commandComputer;
|
||||
@ -172,7 +172,7 @@ public class ComputerCraft
|
||||
public static BlockWiredModemFull wiredModemFull;
|
||||
}
|
||||
|
||||
public static class Items
|
||||
public static final class Items
|
||||
{
|
||||
public static ItemComputer computer;
|
||||
public static ItemCommandComputer commandComputer;
|
||||
@ -195,7 +195,7 @@ public class ComputerCraft
|
||||
public static ItemBlock wiredModemFull;
|
||||
}
|
||||
|
||||
public static class TurtleUpgrades
|
||||
public static final class TurtleUpgrades
|
||||
{
|
||||
public static TurtleModem wirelessModem;
|
||||
public static TurtleModem advancedModem;
|
||||
@ -209,7 +209,7 @@ public class ComputerCraft
|
||||
public static TurtleHoe diamondHoe;
|
||||
}
|
||||
|
||||
public static class PocketUpgrades
|
||||
public static final class PocketUpgrades
|
||||
{
|
||||
public static PocketModem wirelessModem;
|
||||
public static PocketModem advancedModem;
|
||||
@ -220,7 +220,7 @@ public class ComputerCraft
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static class Upgrades
|
||||
public static final class Upgrades
|
||||
{
|
||||
public static TurtleModem advancedModem;
|
||||
}
|
||||
@ -239,7 +239,7 @@ public class ComputerCraft
|
||||
public static List<IPeripheralProvider> peripheralProviders = new ArrayList<>();
|
||||
|
||||
// Implementation
|
||||
@Mod.Instance( value = ComputerCraft.MOD_ID )
|
||||
@Mod.Instance( ComputerCraft.MOD_ID )
|
||||
public static ComputerCraft instance;
|
||||
|
||||
@SidedProxy(
|
||||
@ -556,7 +556,7 @@ public class ComputerCraft
|
||||
private static File getContainingJar( Class<?> modClass )
|
||||
{
|
||||
String path = modClass.getProtectionDomain().getCodeSource().getLocation().getPath();
|
||||
int bangIndex = path.indexOf( "!" );
|
||||
int bangIndex = path.indexOf( '!' );
|
||||
if( bangIndex >= 0 )
|
||||
{
|
||||
path = path.substring( 0, bangIndex );
|
||||
@ -587,7 +587,7 @@ public class ComputerCraft
|
||||
private static File getDebugCodeDir( Class<?> modClass )
|
||||
{
|
||||
String path = modClass.getProtectionDomain().getCodeSource().getLocation().getPath();
|
||||
int bangIndex = path.indexOf( "!" );
|
||||
int bangIndex = path.indexOf( '!' );
|
||||
return bangIndex >= 0 ? null : new File( new File( path ).getParentFile(), "../.." );
|
||||
}
|
||||
|
||||
|
@ -173,8 +173,8 @@ public final class ComputerCraftAPI
|
||||
* Registers a peripheral provider to convert blocks into {@link IPeripheral} implementations.
|
||||
*
|
||||
* @param provider The peripheral provider to register.
|
||||
* @see dan200.computercraft.api.peripheral.IPeripheral
|
||||
* @see dan200.computercraft.api.peripheral.IPeripheralProvider
|
||||
* @see IPeripheral
|
||||
* @see IPeripheralProvider
|
||||
*/
|
||||
public static void registerPeripheralProvider( @Nonnull IPeripheralProvider provider )
|
||||
{
|
||||
@ -198,7 +198,7 @@ public final class ComputerCraftAPI
|
||||
* this during the load() method of your mod.
|
||||
*
|
||||
* @param upgrade The turtle upgrade to register.
|
||||
* @see dan200.computercraft.api.turtle.ITurtleUpgrade
|
||||
* @see ITurtleUpgrade
|
||||
*/
|
||||
public static void registerTurtleUpgrade( @Nonnull ITurtleUpgrade upgrade )
|
||||
{
|
||||
@ -223,7 +223,7 @@ public final class ComputerCraftAPI
|
||||
* Registers a bundled redstone provider to provide bundled redstone output for blocks.
|
||||
*
|
||||
* @param provider The bundled redstone provider to register.
|
||||
* @see dan200.computercraft.api.redstone.IBundledRedstoneProvider
|
||||
* @see IBundledRedstoneProvider
|
||||
*/
|
||||
public static void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider )
|
||||
{
|
||||
@ -249,7 +249,7 @@ public final class ComputerCraftAPI
|
||||
* @param side The side to extract the bundled redstone output from.
|
||||
* @return If there is a block capable of emitting bundled redstone at the location, it's signal (0-65535) will be returned.
|
||||
* If there is no block capable of emitting bundled redstone at the location, -1 will be returned.
|
||||
* @see dan200.computercraft.api.redstone.IBundledRedstoneProvider
|
||||
* @see IBundledRedstoneProvider
|
||||
*/
|
||||
public static int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
|
||||
{
|
||||
@ -272,7 +272,7 @@ public final class ComputerCraftAPI
|
||||
* Registers a media provider to provide {@link IMedia} implementations for Items
|
||||
*
|
||||
* @param provider The media provider to register.
|
||||
* @see dan200.computercraft.api.media.IMediaProvider
|
||||
* @see IMediaProvider
|
||||
*/
|
||||
public static void registerMediaProvider( @Nonnull IMediaProvider provider )
|
||||
{
|
||||
@ -294,7 +294,7 @@ public final class ComputerCraftAPI
|
||||
* Registers a permission provider to restrict where turtles can move or build.
|
||||
*
|
||||
* @param provider The turtle permission provider to register.
|
||||
* @see dan200.computercraft.api.permissions.ITurtlePermissionProvider
|
||||
* @see ITurtlePermissionProvider
|
||||
* @deprecated Prefer using {@link dan200.computercraft.api.turtle.event.TurtleBlockEvent} or the standard Forge events.
|
||||
*/
|
||||
@Deprecated
|
||||
@ -481,7 +481,7 @@ public final class ComputerCraftAPI
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
System.out.println( "ComputerCraftAPI: ComputerCraft not found." );
|
||||
System.err.println( "ComputerCraftAPI: ComputerCraft not found." );
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -498,7 +498,7 @@ public final class ComputerCraftAPI
|
||||
}
|
||||
catch( NoSuchMethodException e )
|
||||
{
|
||||
System.out.println( "ComputerCraftAPI: ComputerCraft method " + name + " not found." );
|
||||
System.err.println( "ComputerCraftAPI: ComputerCraft method " + name + " not found." );
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ import javax.annotation.Nullable;
|
||||
* @see ILuaAPI
|
||||
* @see ComputerCraftAPI#registerAPIFactory(ILuaAPIFactory)
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface ILuaAPIFactory
|
||||
{
|
||||
/**
|
||||
|
@ -77,7 +77,7 @@ public interface IMedia
|
||||
* @param world The world in which the item and disk drive reside.
|
||||
* @return The mount, or null if this item does not represent an item with data. If the mount returned also
|
||||
* implements {@link dan200.computercraft.api.filesystem.IWritableMount}, it will mounted using mountWritable()
|
||||
* @see dan200.computercraft.api.filesystem.IMount
|
||||
* @see IMount
|
||||
* @see dan200.computercraft.api.filesystem.IWritableMount
|
||||
* @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String, long)
|
||||
* @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String)
|
||||
|
@ -148,7 +148,7 @@ public interface IComputerAccess
|
||||
*
|
||||
* You may supply {@code null} to indicate that no arguments are to be supplied.
|
||||
* @throws RuntimeException If the peripheral has been detached.
|
||||
* @see dan200.computercraft.api.peripheral.IPeripheral#callMethod
|
||||
* @see IPeripheral#callMethod
|
||||
*/
|
||||
void queueEvent( @Nonnull String event, @Nullable Object[] arguments );
|
||||
|
||||
@ -182,7 +182,7 @@ public interface IComputerAccess
|
||||
|
||||
/**
|
||||
* Get a reachable peripheral with the given attachment name. This is a equivalent to
|
||||
* {@link #getAvailablePeripherals()}{@code .get(name)}, though may be more performant.
|
||||
* {@link #getAvailablePeripherals()}{@code .get(name)}, though may be more efficient.
|
||||
*
|
||||
* @param name The peripheral's attached name
|
||||
* @return The reachable peripheral, or {@code null} if none can be found.
|
||||
|
@ -81,9 +81,9 @@ public interface IPeripheral
|
||||
* peripheral, when a turtle travels into a square next to a peripheral, or when a wired modem adjacent to this
|
||||
* peripheral is does any of the above.
|
||||
*
|
||||
* Between calls to {@link #attach} and {@link #detach}, the attached computer can make method calls on the
|
||||
* peripheral using {@code peripheral.call()}. This method can be used to keep track of which computers are attached
|
||||
* to the peripheral, or to take action when attachment occurs.
|
||||
* Between calls to attach and {@link #detach}, the attached computer can make method calls on the peripheral using
|
||||
* {@code peripheral.call()}. This method can be used to keep track of which computers are attached to the
|
||||
* peripheral, or to take action when attachment occurs.
|
||||
*
|
||||
* Be aware that will be called from both the server thread and ComputerCraft Lua thread, and so must be thread-safe
|
||||
* and reentrant.
|
||||
|
@ -38,8 +38,7 @@ public interface IWorkMonitor
|
||||
* If the owning computer is currently allowed to execute work, and has ample time to do so.
|
||||
*
|
||||
* This is effectively a more restrictive form of {@link #canWork()}. One should use that in order to determine if
|
||||
* you may do an initial piece of work, and {@link #shouldWork()} to determine if any additional task may be
|
||||
* performed.
|
||||
* you may do an initial piece of work, and shouldWork to determine if any additional task may be performed.
|
||||
*
|
||||
* @return If we should execute work right now.
|
||||
*/
|
||||
|
@ -19,7 +19,7 @@ import javax.annotation.Nullable;
|
||||
/**
|
||||
* Additional peripherals for pocket computers.
|
||||
*
|
||||
* This is similar to {@link dan200.computercraft.api.turtle.ITurtleUpgrade}.
|
||||
* This is similar to {@link ITurtleUpgrade}.
|
||||
*/
|
||||
public interface IPocketUpgrade
|
||||
{
|
||||
|
@ -73,6 +73,7 @@ public class TurtleRefuelEvent extends TurtleActionEvent
|
||||
/**
|
||||
* Handles refuelling a turtle from a specific item.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface Handler
|
||||
{
|
||||
/**
|
||||
|
@ -9,6 +9,7 @@ package dan200.computercraft.client;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.client.render.TurtleModelLoader;
|
||||
import dan200.computercraft.shared.media.items.ItemDiskLegacy;
|
||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
|
||||
import dan200.computercraft.shared.turtle.items.ItemTurtleBase;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.ItemMeshDefinition;
|
||||
@ -37,9 +38,9 @@ import javax.annotation.Nonnull;
|
||||
* Registers textures and models for items.
|
||||
*/
|
||||
@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Side.CLIENT )
|
||||
public class ClientRegistry
|
||||
public final class ClientRegistry
|
||||
{
|
||||
private static final String[] EXTRA_MODELS = {
|
||||
private static final String[] EXTRA_MODELS = new String[] {
|
||||
"turtle_modem_off_left",
|
||||
"turtle_modem_on_left",
|
||||
"turtle_modem_off_right",
|
||||
@ -57,6 +58,8 @@ public class ClientRegistry
|
||||
"turtle_elf_overlay",
|
||||
};
|
||||
|
||||
private ClientRegistry() {}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void registerModels( ModelRegistryEvent event )
|
||||
{
|
||||
@ -129,7 +132,7 @@ public class ClientRegistry
|
||||
case 1: // Frame colour
|
||||
return ComputerCraft.Items.pocketComputer.getColour( stack );
|
||||
case 2: // Light colour
|
||||
return ComputerCraft.Items.pocketComputer.getLightState( stack );
|
||||
return ItemPocketComputer.getLightState( stack );
|
||||
}
|
||||
}, ComputerCraft.Items.pocketComputer );
|
||||
|
||||
|
@ -28,7 +28,7 @@ public class ClientTableFormatter implements TableFormatter
|
||||
|
||||
private static Int2IntOpenHashMap lastHeights = new Int2IntOpenHashMap();
|
||||
|
||||
private FontRenderer renderer()
|
||||
private static FontRenderer renderer()
|
||||
{
|
||||
return Minecraft.getMinecraft().fontRenderer;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ import org.lwjgl.opengl.GL11;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class FixedWidthFontRenderer
|
||||
public final class FixedWidthFontRenderer
|
||||
{
|
||||
private static final ResourceLocation FONT = new ResourceLocation( "computercraft", "textures/gui/term_font.png" );
|
||||
public static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/term_background.png" );
|
||||
@ -93,7 +93,7 @@ public class FixedWidthFontRenderer
|
||||
|
||||
private boolean isGreyScale( int colour )
|
||||
{
|
||||
return (colour == 0 || colour == 15 || colour == 7 || colour == 8);
|
||||
return colour == 0 || colour == 15 || colour == 7 || colour == 8;
|
||||
}
|
||||
|
||||
public void drawStringBackgroundPart( int x, int y, TextBuffer backgroundColour, double leftMarginSize, double rightMarginSize, boolean greyScale, Palette p )
|
||||
|
@ -80,12 +80,6 @@ public class GuiComputer extends GuiContainer
|
||||
Keyboard.enableRepeatEvents( false );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doesGuiPauseGame()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateScreen()
|
||||
{
|
||||
|
@ -22,10 +22,8 @@ public class GuiConfigCC extends GuiConfig
|
||||
super( parentScreen, Config.getConfigElements(), ComputerCraft.MOD_ID, false, false, "CC: Tweaked" );
|
||||
}
|
||||
|
||||
public static class Factory
|
||||
implements IModGuiFactory
|
||||
public static class Factory implements IModGuiFactory
|
||||
{
|
||||
|
||||
@Override
|
||||
public void initialize( Minecraft minecraft )
|
||||
{
|
||||
|
@ -29,7 +29,7 @@ public class GuiDiskDrive extends GuiContainer
|
||||
{
|
||||
String title = m_container.getDiskDrive().getDisplayName().getUnformattedText();
|
||||
fontRenderer.drawString( title, (xSize - fontRenderer.getStringWidth( title )) / 2, 6, 0x404040 );
|
||||
fontRenderer.drawString( I18n.format( "container.inventory" ), 8, (ySize - 96) + 2, 0x404040 );
|
||||
fontRenderer.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -8,6 +8,7 @@ package dan200.computercraft.client.gui;
|
||||
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.shared.media.inventory.ContainerHeldItem;
|
||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
|
||||
|
||||
public class GuiPocketComputer extends GuiComputer
|
||||
{
|
||||
@ -16,7 +17,7 @@ public class GuiPocketComputer extends GuiComputer
|
||||
super(
|
||||
container,
|
||||
ComputerCraft.Items.pocketComputer.getFamily( container.getStack() ),
|
||||
ComputerCraft.Items.pocketComputer.createClientComputer( container.getStack() ),
|
||||
ItemPocketComputer.createClientComputer( container.getStack() ),
|
||||
ComputerCraft.terminalWidth_pocketComputer,
|
||||
ComputerCraft.terminalHeight_pocketComputer
|
||||
);
|
||||
|
@ -29,7 +29,7 @@ public class GuiPrinter extends GuiContainer
|
||||
{
|
||||
String title = container.getPrinter().getDisplayName().getUnformattedText();
|
||||
fontRenderer.drawString( title, (xSize - fontRenderer.getStringWidth( title )) / 2, 6, 0x404040 );
|
||||
fontRenderer.drawString( I18n.format( "container.inventory" ), 8, (ySize - 96) + 2, 0x404040 );
|
||||
fontRenderer.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -44,12 +44,6 @@ public class GuiPrintout extends GuiContainer
|
||||
m_book = ItemPrintout.getType( container.getStack() ) == ItemPrintout.Type.Book;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doesGuiPauseGame()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void keyTyped( char c, int k ) throws IOException
|
||||
{
|
||||
@ -80,7 +74,7 @@ public class GuiPrintout extends GuiContainer
|
||||
}
|
||||
else if( mouseWheelChange > 0 )
|
||||
{
|
||||
// Scroll down goes to the next page
|
||||
// Scroll down goes to the previous page
|
||||
if( m_page > 0 ) m_page--;
|
||||
}
|
||||
}
|
||||
@ -99,9 +93,9 @@ public class GuiPrintout extends GuiContainer
|
||||
public void drawScreen( int mouseX, int mouseY, float partialTicks )
|
||||
{
|
||||
// We must take the background further back in order to not overlap with our printed pages.
|
||||
zLevel = zLevel - 1;
|
||||
zLevel--;
|
||||
drawDefaultBackground();
|
||||
zLevel = zLevel + 1;
|
||||
zLevel++;
|
||||
|
||||
super.drawScreen( mouseX, mouseY, partialTicks );
|
||||
renderHoveredToolTip( mouseX, mouseY );
|
||||
|
@ -98,8 +98,8 @@ public class GuiTurtle extends GuiContainer
|
||||
public void handleMouseInput() throws IOException
|
||||
{
|
||||
super.handleMouseInput();
|
||||
int x = Mouse.getEventX() * this.width / mc.displayWidth;
|
||||
int y = this.height - Mouse.getEventY() * this.height / mc.displayHeight - 1;
|
||||
int x = Mouse.getEventX() * width / mc.displayWidth;
|
||||
int y = height - Mouse.getEventY() * height / mc.displayHeight - 1;
|
||||
m_terminalGui.handleMouseInput( x, y );
|
||||
}
|
||||
|
||||
@ -117,8 +117,8 @@ public class GuiTurtle extends GuiContainer
|
||||
if( slot >= 0 )
|
||||
{
|
||||
GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F );
|
||||
int slotX = (slot % 4);
|
||||
int slotY = (slot / 4);
|
||||
int slotX = slot % 4;
|
||||
int slotY = slot / 4;
|
||||
mc.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
|
||||
drawTexturedModalRect( guiLeft + m_container.m_turtleInvStartX - 2 + slotX * 18, guiTop + m_container.m_playerInvStartY - 2 + slotY * 18, 0, 217, 24, 24 );
|
||||
}
|
||||
@ -128,7 +128,7 @@ public class GuiTurtle extends GuiContainer
|
||||
protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
|
||||
{
|
||||
// Draw term
|
||||
boolean advanced = (m_family == ComputerFamily.Advanced);
|
||||
boolean advanced = m_family == ComputerFamily.Advanced;
|
||||
m_terminalGui.draw( Minecraft.getMinecraft(), 0, 0, mouseX, mouseY );
|
||||
|
||||
// Draw border/inventory
|
||||
|
@ -82,9 +82,9 @@ public class WidgetTerminal extends Widget
|
||||
String clipboard = GuiScreen.getClipboardString();
|
||||
if( clipboard != null )
|
||||
{
|
||||
// Clip to the first occurance of \r or \n
|
||||
int newLineIndex1 = clipboard.indexOf( "\r" );
|
||||
int newLineIndex2 = clipboard.indexOf( "\n" );
|
||||
// Clip to the first occurrence of \r or \n
|
||||
int newLineIndex1 = clipboard.indexOf( '\r' );
|
||||
int newLineIndex2 = clipboard.indexOf( '\n' );
|
||||
if( newLineIndex1 >= 0 && newLineIndex2 >= 0 )
|
||||
{
|
||||
clipboard = clipboard.substring( 0, Math.min( newLineIndex1, newLineIndex2 ) );
|
||||
@ -274,11 +274,8 @@ public class WidgetTerminal extends Widget
|
||||
{
|
||||
if( m_terminateTimer < TERMINATE_TIME )
|
||||
{
|
||||
m_terminateTimer = m_terminateTimer + 0.05f;
|
||||
if( m_terminateTimer >= TERMINATE_TIME )
|
||||
{
|
||||
queueEvent( "terminate" );
|
||||
}
|
||||
m_terminateTimer += 0.05f;
|
||||
if( m_terminateTimer >= TERMINATE_TIME ) queueEvent( "terminate" );
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -291,14 +288,11 @@ public class WidgetTerminal extends Widget
|
||||
{
|
||||
if( m_rebootTimer < TERMINATE_TIME )
|
||||
{
|
||||
m_rebootTimer = m_rebootTimer + 0.05f;
|
||||
m_rebootTimer += 0.05f;
|
||||
if( m_rebootTimer >= TERMINATE_TIME )
|
||||
{
|
||||
IComputer computer = m_computer.getComputer();
|
||||
if( computer != null )
|
||||
{
|
||||
computer.reboot();
|
||||
}
|
||||
if( computer != null ) computer.reboot();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -312,14 +306,11 @@ public class WidgetTerminal extends Widget
|
||||
{
|
||||
if( m_shutdownTimer < TERMINATE_TIME )
|
||||
{
|
||||
m_shutdownTimer = m_shutdownTimer + 0.05f;
|
||||
m_shutdownTimer += 0.05f;
|
||||
if( m_shutdownTimer >= TERMINATE_TIME )
|
||||
{
|
||||
IComputer computer = m_computer.getComputer();
|
||||
if( computer != null )
|
||||
{
|
||||
computer.shutdown();
|
||||
}
|
||||
if( computer != null ) computer.shutdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -346,7 +337,7 @@ public class WidgetTerminal extends Widget
|
||||
{
|
||||
// Draw the screen contents
|
||||
IComputer computer = m_computer.getComputer();
|
||||
Terminal terminal = (computer != null) ? computer.getTerminal() : null;
|
||||
Terminal terminal = computer != null ? computer.getTerminal() : null;
|
||||
if( terminal != null )
|
||||
{
|
||||
// Draw the terminal
|
||||
|
@ -46,7 +46,7 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
|
||||
}
|
||||
|
||||
@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Side.CLIENT )
|
||||
public static class ForgeHandlers
|
||||
public static final class ForgeHandlers
|
||||
{
|
||||
@SubscribeEvent
|
||||
public static void onWorldUnload( WorldEvent.Unload event )
|
||||
|
@ -57,7 +57,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
|
||||
@Override
|
||||
protected void renderItem( ItemStack stack )
|
||||
{
|
||||
// Setup various transformations. Note that these are partially adapated from the corresponding method
|
||||
// Setup various transformations. Note that these are partially adapted from the corresponding method
|
||||
// in ItemRenderer
|
||||
GlStateManager.disableLighting();
|
||||
|
||||
@ -65,8 +65,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
|
||||
GlStateManager.rotate( 180f, 0f, 0f, 1f );
|
||||
GlStateManager.scale( 0.5, 0.5, 0.5 );
|
||||
|
||||
ItemPocketComputer pocketComputer = ComputerCraft.Items.pocketComputer;
|
||||
ClientComputer computer = pocketComputer.createClientComputer( stack );
|
||||
ClientComputer computer = ItemPocketComputer.createClientComputer( stack );
|
||||
|
||||
{
|
||||
// First render the background item. We use the item's model rather than a direct texture as this ensures
|
||||
@ -90,9 +89,9 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
|
||||
GlStateManager.blendFunc( GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA );
|
||||
GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F );
|
||||
|
||||
IBakedModel bakedmodel = renderItem.getItemModelWithOverrides( stack, null, null );
|
||||
bakedmodel = ForgeHooksClient.handleCameraTransforms( bakedmodel, ItemCameraTransforms.TransformType.GUI, false );
|
||||
renderItem.renderItem( stack, bakedmodel );
|
||||
IBakedModel baked = renderItem.getItemModelWithOverrides( stack, null, null );
|
||||
baked = ForgeHooksClient.handleCameraTransforms( baked, ItemCameraTransforms.TransformType.GUI, false );
|
||||
renderItem.renderItem( stack, baked );
|
||||
|
||||
GlStateManager.disableAlpha();
|
||||
GlStateManager.disableRescaleNormal();
|
||||
|
@ -23,7 +23,7 @@ import static dan200.computercraft.shared.media.items.ItemPrintout.LINES_PER_PAG
|
||||
import static dan200.computercraft.shared.media.items.ItemPrintout.LINE_MAX_LENGTH;
|
||||
|
||||
/**
|
||||
* Emulates map and item-frame rendering for prinouts
|
||||
* Emulates map and item-frame rendering for printouts
|
||||
*/
|
||||
@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Side.CLIENT )
|
||||
public final class ItemPrintoutRenderer extends ItemMapLikeRenderer
|
||||
|
@ -180,7 +180,7 @@ public final class ModelTransformer
|
||||
*
|
||||
* This also provides the ability to swap vertices through {@link #swap(int, int)} to allow reordering.
|
||||
*/
|
||||
private static class BakedQuadBuilder implements IVertexConsumer
|
||||
private static final class BakedQuadBuilder implements IVertexConsumer
|
||||
{
|
||||
private final VertexFormat format;
|
||||
|
||||
@ -195,7 +195,7 @@ public final class ModelTransformer
|
||||
private BakedQuadBuilder( VertexFormat format )
|
||||
{
|
||||
this.format = format;
|
||||
this.vertexData = new int[format.getSize()];
|
||||
vertexData = new int[format.getSize()];
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@ -208,7 +208,7 @@ public final class ModelTransformer
|
||||
@Override
|
||||
public void setQuadTint( int tint )
|
||||
{
|
||||
this.quadTint = tint;
|
||||
quadTint = tint;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -22,7 +22,7 @@ import org.lwjgl.opengl.GL11;
|
||||
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT;
|
||||
import static dan200.computercraft.shared.media.items.ItemPrintout.LINES_PER_PAGE;
|
||||
|
||||
public class PrintoutRenderer
|
||||
public final class PrintoutRenderer
|
||||
{
|
||||
private static final ResourceLocation BG = new ResourceLocation( "computercraft", "textures/gui/printout.png" );
|
||||
private static final double BG_SIZE = 256.0;
|
||||
@ -60,6 +60,8 @@ public class PrintoutRenderer
|
||||
private static final int COVER_Y = Y_SIZE;
|
||||
private static final int COVER_X = X_SIZE + 4 * X_FOLD_SIZE;
|
||||
|
||||
private PrintoutRenderer() {}
|
||||
|
||||
public static void drawText( int x, int y, int start, TextBuffer[] text, TextBuffer[] colours )
|
||||
{
|
||||
FixedWidthFontRenderer fontRenderer = FixedWidthFontRenderer.instance();
|
||||
|
@ -53,7 +53,7 @@ public final class RenderOverlayCable
|
||||
state = state.getActualState( world, pos );
|
||||
|
||||
event.setCanceled( true );
|
||||
PeripheralType type = ComputerCraft.Blocks.cable.getPeripheralType( state );
|
||||
PeripheralType type = BlockCable.getPeripheralType( state );
|
||||
|
||||
GlStateManager.enableBlend();
|
||||
GlStateManager.tryBlendFuncSeparate( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0 );
|
||||
|
@ -37,7 +37,7 @@ public class TileEntityMonitorRenderer extends TileEntitySpecialRenderer<TileMon
|
||||
}
|
||||
}
|
||||
|
||||
private void renderMonitorAt( TileMonitor monitor, double posX, double posY, double posZ, float f, int i )
|
||||
private static void renderMonitorAt( TileMonitor monitor, double posX, double posY, double posZ, float f, int i )
|
||||
{
|
||||
// Render from the origin monitor
|
||||
ClientMonitor originTerminal = monitor.getClientMonitor();
|
||||
@ -78,7 +78,7 @@ public class TileEntityMonitorRenderer extends TileEntitySpecialRenderer<TileMon
|
||||
GlStateManager.rotate( pitch, 1.0f, 0.0f, 0.0f );
|
||||
GlStateManager.translate(
|
||||
-0.5 + TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN,
|
||||
(origin.getHeight() - 0.5) - (TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN),
|
||||
origin.getHeight() - 0.5 - (TileMonitor.RENDER_BORDER + TileMonitor.RENDER_MARGIN),
|
||||
0.5
|
||||
);
|
||||
double xSize = origin.getWidth() - 2.0 * (TileMonitor.RENDER_MARGIN + TileMonitor.RENDER_BORDER);
|
||||
|
@ -45,9 +45,9 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer<TileTurt
|
||||
private static final ModelResourceLocation ELF_OVERLAY_MODEL = new ModelResourceLocation( "computercraft:turtle_elf_overlay", "inventory" );
|
||||
|
||||
@Override
|
||||
public void render( TileTurtle tileEntity, double posX, double posY, double posZ, float f, int i, float f2 )
|
||||
public void render( TileTurtle tileEntity, double posX, double posY, double posZ, float partialTicks, int breaking, float f2 )
|
||||
{
|
||||
if( tileEntity != null ) renderTurtleAt( tileEntity, posX, posY, posZ, f, i );
|
||||
if( tileEntity != null ) renderTurtleAt( tileEntity, posX, posY, posZ, partialTicks );
|
||||
}
|
||||
|
||||
public static ModelResourceLocation getTurtleModel( ComputerFamily family, boolean coloured )
|
||||
@ -78,7 +78,7 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer<TileTurt
|
||||
}
|
||||
}
|
||||
|
||||
private void renderTurtleAt( TileTurtle turtle, double posX, double posY, double posZ, float partialTicks, int i )
|
||||
private void renderTurtleAt( TileTurtle turtle, double posX, double posY, double posZ, float partialTicks )
|
||||
{
|
||||
// Render the label
|
||||
String label = turtle.createProxy().getLabel();
|
||||
@ -113,12 +113,9 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer<TileTurt
|
||||
}
|
||||
GlStateManager.translate( -0.5f, -0.5f, -0.5f );
|
||||
// Render the turtle
|
||||
int colour;
|
||||
ComputerFamily family;
|
||||
ResourceLocation overlay;
|
||||
colour = turtle.getColour();
|
||||
family = turtle.getFamily();
|
||||
overlay = turtle.getOverlay();
|
||||
int colour = turtle.getColour();
|
||||
ComputerFamily family = turtle.getFamily();
|
||||
ResourceLocation overlay = turtle.getOverlay();
|
||||
|
||||
renderModel( state, getTurtleModel( family, colour != -1 ), colour == -1 ? null : new int[] { colour } );
|
||||
|
||||
@ -154,7 +151,7 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer<TileTurt
|
||||
}
|
||||
}
|
||||
|
||||
private void renderUpgrade( IBlockState state, TileTurtle turtle, TurtleSide side, float f )
|
||||
private static void renderUpgrade( IBlockState state, TileTurtle turtle, TurtleSide side, float f )
|
||||
{
|
||||
ITurtleUpgrade upgrade = turtle.getUpgrade( side );
|
||||
if( upgrade != null )
|
||||
@ -187,14 +184,14 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer<TileTurt
|
||||
}
|
||||
}
|
||||
|
||||
private void renderModel( IBlockState state, ModelResourceLocation modelLocation, int[] tints )
|
||||
private static void renderModel( IBlockState state, ModelResourceLocation modelLocation, int[] tints )
|
||||
{
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
ModelManager modelManager = mc.getRenderItem().getItemModelMesher().getModelManager();
|
||||
renderModel( state, modelManager.getModel( modelLocation ), tints );
|
||||
}
|
||||
|
||||
private void renderModel( IBlockState state, IBakedModel model, int[] tints )
|
||||
private static void renderModel( IBlockState state, IBakedModel model, int[] tints )
|
||||
{
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
@ -206,7 +203,7 @@ public class TileEntityTurtleRenderer extends TileEntitySpecialRenderer<TileTurt
|
||||
}
|
||||
}
|
||||
|
||||
private void renderQuads( Tessellator tessellator, List<BakedQuad> quads, int[] tints )
|
||||
private static void renderQuads( Tessellator tessellator, List<BakedQuad> quads, int[] tints )
|
||||
{
|
||||
BufferBuilder buffer = tessellator.getBuffer();
|
||||
VertexFormat format = DefaultVertexFormats.ITEM;
|
||||
|
@ -21,7 +21,7 @@ import net.minecraftforge.common.model.IModelState;
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class TurtleModelLoader implements ICustomModelLoader
|
||||
public final class TurtleModelLoader implements ICustomModelLoader
|
||||
{
|
||||
private static final ResourceLocation NORMAL_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle" );
|
||||
private static final ResourceLocation ADVANCED_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/advanced_turtle" );
|
||||
@ -64,7 +64,7 @@ public class TurtleModelLoader implements ICustomModelLoader
|
||||
throw new IllegalStateException( "Loader does not accept " + name );
|
||||
}
|
||||
|
||||
private static class TurtleModel implements IModel
|
||||
private static final class TurtleModel implements IModel
|
||||
{
|
||||
private final IModel family;
|
||||
private final IModel colour;
|
||||
|
@ -17,7 +17,7 @@ import net.minecraft.util.EnumFacing;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.vecmath.Matrix4f;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -30,8 +30,8 @@ public class TurtleMultiModel implements IBakedModel
|
||||
private final Matrix4f m_leftUpgradeTransform;
|
||||
private final IBakedModel m_rightUpgradeModel;
|
||||
private final Matrix4f m_rightUpgradeTransform;
|
||||
private List<BakedQuad> m_generalQuads;
|
||||
private Map<EnumFacing, List<BakedQuad>> m_faceQuads;
|
||||
private List<BakedQuad> m_generalQuads = null;
|
||||
private Map<EnumFacing, List<BakedQuad>> m_faceQuads = new EnumMap<>( EnumFacing.class );
|
||||
|
||||
public TurtleMultiModel( IBakedModel baseModel, IBakedModel overlayModel, Matrix4f generalTransform, IBakedModel leftUpgradeModel, Matrix4f leftUpgradeTransform, IBakedModel rightUpgradeModel, Matrix4f rightUpgradeTransform )
|
||||
{
|
||||
@ -43,8 +43,6 @@ public class TurtleMultiModel implements IBakedModel
|
||||
m_rightUpgradeModel = rightUpgradeModel;
|
||||
m_rightUpgradeTransform = rightUpgradeTransform;
|
||||
m_generalTransform = generalTransform;
|
||||
m_generalQuads = null;
|
||||
m_faceQuads = new HashMap<>();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@ -143,10 +143,10 @@ public class TurtleSmartItemModel implements IBakedModel
|
||||
ModelResourceLocation overlayModelLocation = TileEntityTurtleRenderer.getTurtleOverlayModel( combo.m_overlay, combo.m_christmas );
|
||||
|
||||
IBakedModel baseModel = combo.m_colour ? colourModel : familyModel;
|
||||
IBakedModel overlayModel = (overlayModelLocation != null) ? modelManager.getModel( overlayModelLocation ) : null;
|
||||
IBakedModel overlayModel = overlayModelLocation != null ? modelManager.getModel( overlayModelLocation ) : null;
|
||||
Matrix4f transform = combo.m_flip ? s_flip : s_identity;
|
||||
Pair<IBakedModel, Matrix4f> leftModel = (combo.m_leftUpgrade != null) ? combo.m_leftUpgrade.getModel( null, TurtleSide.Left ) : null;
|
||||
Pair<IBakedModel, Matrix4f> rightModel = (combo.m_rightUpgrade != null) ? combo.m_rightUpgrade.getModel( null, TurtleSide.Right ) : null;
|
||||
Pair<IBakedModel, Matrix4f> leftModel = combo.m_leftUpgrade != null ? combo.m_leftUpgrade.getModel( null, TurtleSide.Left ) : null;
|
||||
Pair<IBakedModel, Matrix4f> rightModel = combo.m_rightUpgrade != null ? combo.m_rightUpgrade.getModel( null, TurtleSide.Right ) : null;
|
||||
if( leftModel != null && rightModel != null )
|
||||
{
|
||||
return new TurtleMultiModel( baseModel, overlayModel, transform, leftModel.getLeft(), leftModel.getRight(), rightModel.getLeft(), rightModel.getRight() );
|
||||
|
@ -20,7 +20,7 @@ import java.util.regex.Pattern;
|
||||
*/
|
||||
public class AddressPredicate
|
||||
{
|
||||
private static class HostRange
|
||||
private static final class HostRange
|
||||
{
|
||||
private final byte[] min;
|
||||
private final byte[] max;
|
||||
|
@ -353,10 +353,8 @@ public class FSAPI implements ILuaAPI
|
||||
return new Object[] { FileSystem.getDirectory( path ) };
|
||||
}
|
||||
default:
|
||||
{
|
||||
assert (false);
|
||||
assert false;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -199,9 +199,7 @@ public class HTTPAPI implements ILuaAPI
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -209,14 +207,14 @@ public class HTTPAPI implements ILuaAPI
|
||||
private static HttpHeaders getHeaders( @Nonnull Map<?, ?> headerTable ) throws LuaException
|
||||
{
|
||||
HttpHeaders headers = new DefaultHttpHeaders();
|
||||
for( Object key : headerTable.keySet() )
|
||||
for( Map.Entry<?, ?> entry : headerTable.entrySet() )
|
||||
{
|
||||
Object value = headerTable.get( key );
|
||||
if( key instanceof String && value instanceof String )
|
||||
Object value = entry.getValue();
|
||||
if( entry.getKey() instanceof String && value instanceof String )
|
||||
{
|
||||
try
|
||||
{
|
||||
headers.add( (String) key, value );
|
||||
headers.add( (String) entry.getKey(), value );
|
||||
}
|
||||
catch( IllegalArgumentException e )
|
||||
{
|
||||
|
@ -24,6 +24,7 @@ public interface IAPIEnvironment
|
||||
|
||||
int SIDE_COUNT = 6;
|
||||
|
||||
@FunctionalInterface
|
||||
interface IPeripheralChangeListener
|
||||
{
|
||||
void onPeripheralChanged( int side, @Nullable IPeripheral newPeripheral );
|
||||
|
@ -39,7 +39,7 @@ public class OSAPI implements ILuaAPI
|
||||
}
|
||||
}
|
||||
|
||||
private class Alarm implements Comparable<Alarm>
|
||||
private static class Alarm implements Comparable<Alarm>
|
||||
{
|
||||
public final double m_time;
|
||||
public final int m_day;
|
||||
@ -110,7 +110,7 @@ public class OSAPI implements ILuaAPI
|
||||
{
|
||||
Map.Entry<Integer, Timer> entry = it.next();
|
||||
Timer timer = entry.getValue();
|
||||
timer.m_ticksLeft = timer.m_ticksLeft - 1;
|
||||
timer.m_ticksLeft--;
|
||||
if( timer.m_ticksLeft <= 0 )
|
||||
{
|
||||
// Queue the "timer" event
|
||||
@ -198,7 +198,7 @@ public class OSAPI implements ILuaAPI
|
||||
|
||||
private int getDayForCalendar( Calendar c )
|
||||
{
|
||||
GregorianCalendar g = (c instanceof GregorianCalendar) ? (GregorianCalendar) c : new GregorianCalendar();
|
||||
GregorianCalendar g = c instanceof GregorianCalendar ? (GregorianCalendar) c : new GregorianCalendar();
|
||||
int year = c.get( Calendar.YEAR );
|
||||
int day = 0;
|
||||
for( int y = 1970; y < year; y++ )
|
||||
@ -219,12 +219,9 @@ public class OSAPI implements ILuaAPI
|
||||
{
|
||||
switch( method )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
// queueEvent
|
||||
case 0: // queueEvent
|
||||
queueLuaEvent( getString( args, 0 ), trimArray( args, 1 ) );
|
||||
return null;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
// startTimer
|
||||
@ -245,29 +242,20 @@ public class OSAPI implements ILuaAPI
|
||||
}
|
||||
synchronized( m_alarms )
|
||||
{
|
||||
int day = (time > m_time) ? m_day : (m_day + 1);
|
||||
int day = time > m_time ? m_day : m_day + 1;
|
||||
m_alarms.put( m_nextAlarmToken, new Alarm( time, day ) );
|
||||
return new Object[] { m_nextAlarmToken++ };
|
||||
}
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
// shutdown
|
||||
case 3: // shutdown
|
||||
m_apiEnvironment.shutdown();
|
||||
return null;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
// reboot
|
||||
case 4: // reboot
|
||||
m_apiEnvironment.reboot();
|
||||
return null;
|
||||
}
|
||||
case 5:
|
||||
case 6:
|
||||
{
|
||||
// computerID/getComputerID
|
||||
case 6: // computerID/getComputerID
|
||||
return new Object[] { getComputerID() };
|
||||
}
|
||||
case 7:
|
||||
{
|
||||
// setComputerLabel
|
||||
@ -286,14 +274,11 @@ public class OSAPI implements ILuaAPI
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case 10:
|
||||
{
|
||||
// clock
|
||||
case 10: // clock
|
||||
synchronized( m_timers )
|
||||
{
|
||||
return new Object[] { m_clock * 0.05 };
|
||||
}
|
||||
}
|
||||
case 11:
|
||||
{
|
||||
// time
|
||||
@ -356,10 +341,7 @@ public class OSAPI implements ILuaAPI
|
||||
int token = getInt( args, 0 );
|
||||
synchronized( m_timers )
|
||||
{
|
||||
if( m_timers.containsKey( token ) )
|
||||
{
|
||||
m_timers.remove( token );
|
||||
}
|
||||
m_timers.remove( token );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@ -369,10 +351,7 @@ public class OSAPI implements ILuaAPI
|
||||
int token = getInt( args, 0 );
|
||||
synchronized( m_alarms )
|
||||
{
|
||||
if( m_alarms.containsKey( token ) )
|
||||
{
|
||||
m_alarms.remove( token );
|
||||
}
|
||||
m_alarms.remove( token );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@ -407,9 +386,7 @@ public class OSAPI implements ILuaAPI
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,8 +44,8 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
|
||||
|
||||
m_type = peripheral.getType();
|
||||
m_methods = peripheral.getMethodNames();
|
||||
assert (m_type != null);
|
||||
assert (m_methods != null);
|
||||
assert m_type != null;
|
||||
assert m_methods != null;
|
||||
|
||||
m_methodMap = new HashMap<>();
|
||||
for( int i = 0; i < m_methods.length; i++ )
|
||||
@ -422,9 +422,7 @@ public class PeripheralAPI implements ILuaAPI, IAPIEnvironment.IPeripheralChange
|
||||
throw new LuaException( "No peripheral attached" );
|
||||
}
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,7 +116,7 @@ public class RedstoneAPI implements ILuaAPI
|
||||
int side = parseSide( args );
|
||||
int mask = getInt( args, 1 );
|
||||
int input = m_environment.getBundledInput( side );
|
||||
return new Object[] { ((input & mask) == mask) };
|
||||
return new Object[] { (input & mask) == mask };
|
||||
}
|
||||
case 8:
|
||||
case 9:
|
||||
@ -146,13 +146,11 @@ public class RedstoneAPI implements ILuaAPI
|
||||
return new Object[] { m_environment.getInput( side ) };
|
||||
}
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int parseSide( Object[] args ) throws LuaException
|
||||
private static int parseSide( Object[] args ) throws LuaException
|
||||
{
|
||||
String side = getString( args, 0 );
|
||||
for( int n = 0; n < IAPIEnvironment.SIDE_NAMES.length; n++ )
|
||||
|
@ -111,16 +111,7 @@ public class TermAPI implements ILuaAPI
|
||||
case 0:
|
||||
{
|
||||
// write
|
||||
String text;
|
||||
if( args.length > 0 && args[0] != null )
|
||||
{
|
||||
text = args[0].toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
text = "";
|
||||
}
|
||||
|
||||
String text = args.length > 0 && args[0] != null ? args[0].toString() : "";
|
||||
synchronized( m_terminal )
|
||||
{
|
||||
m_terminal.write( text );
|
||||
@ -181,24 +172,18 @@ public class TermAPI implements ILuaAPI
|
||||
}
|
||||
return new Object[] { width, height };
|
||||
}
|
||||
case 6:
|
||||
{
|
||||
// clear
|
||||
case 6: // clear
|
||||
synchronized( m_terminal )
|
||||
{
|
||||
m_terminal.clear();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case 7:
|
||||
{
|
||||
// clearLine
|
||||
case 7: // clearLine
|
||||
synchronized( m_terminal )
|
||||
{
|
||||
m_terminal.clearLine();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
case 8:
|
||||
case 9:
|
||||
{
|
||||
@ -222,23 +207,14 @@ public class TermAPI implements ILuaAPI
|
||||
return null;
|
||||
}
|
||||
case 12:
|
||||
case 13:
|
||||
{
|
||||
// isColour/isColor
|
||||
case 13: // isColour/isColor
|
||||
return new Object[] { m_environment.isColour() };
|
||||
}
|
||||
case 14:
|
||||
case 15:
|
||||
{
|
||||
// getTextColour/getTextColor
|
||||
case 15: // getTextColour/getTextColor
|
||||
return encodeColour( m_terminal.getTextColour() );
|
||||
}
|
||||
case 16:
|
||||
case 17:
|
||||
{
|
||||
// getBackgroundColour/getBackgroundColor
|
||||
case 17: // getBackgroundColour/getBackgroundColor
|
||||
return encodeColour( m_terminal.getBackgroundColour() );
|
||||
}
|
||||
case 18:
|
||||
{
|
||||
// blit
|
||||
@ -308,9 +284,7 @@ public class TermAPI implements ILuaAPI
|
||||
// getCursorBlink
|
||||
return new Object[] { m_terminal.getCursorBlink() };
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,13 +6,11 @@
|
||||
|
||||
package dan200.computercraft.core.apis.handles;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.ClosedChannelException;
|
||||
import java.nio.channels.NonWritableChannelException;
|
||||
import java.nio.channels.SeekableByteChannel;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A seekable, readable byte channel which is backed by a simple byte array.
|
||||
@ -30,10 +28,10 @@ public class ArrayByteChannel implements SeekableByteChannel
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read( ByteBuffer destination ) throws IOException
|
||||
public int read( ByteBuffer destination ) throws ClosedChannelException
|
||||
{
|
||||
if( closed ) throw new ClosedChannelException();
|
||||
Preconditions.checkNotNull( destination, "destination" );
|
||||
Objects.requireNonNull( destination, "destination" );
|
||||
|
||||
if( position >= backing.length ) return -1;
|
||||
|
||||
@ -44,21 +42,21 @@ public class ArrayByteChannel implements SeekableByteChannel
|
||||
}
|
||||
|
||||
@Override
|
||||
public int write( ByteBuffer src ) throws IOException
|
||||
public int write( ByteBuffer src ) throws ClosedChannelException
|
||||
{
|
||||
if( closed ) throw new ClosedChannelException();
|
||||
throw new NonWritableChannelException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long position() throws IOException
|
||||
public long position() throws ClosedChannelException
|
||||
{
|
||||
if( closed ) throw new ClosedChannelException();
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeekableByteChannel position( long newPosition ) throws IOException
|
||||
public SeekableByteChannel position( long newPosition ) throws ClosedChannelException
|
||||
{
|
||||
if( closed ) throw new ClosedChannelException();
|
||||
if( newPosition < 0 || newPosition > Integer.MAX_VALUE )
|
||||
@ -70,14 +68,14 @@ public class ArrayByteChannel implements SeekableByteChannel
|
||||
}
|
||||
|
||||
@Override
|
||||
public long size() throws IOException
|
||||
public long size() throws ClosedChannelException
|
||||
{
|
||||
if( closed ) throw new ClosedChannelException();
|
||||
return backing.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeekableByteChannel truncate( long size ) throws IOException
|
||||
public SeekableByteChannel truncate( long size ) throws ClosedChannelException
|
||||
{
|
||||
if( closed ) throw new ClosedChannelException();
|
||||
throw new NonWritableChannelException();
|
||||
|
@ -38,8 +38,8 @@ public class BinaryReadableHandle extends HandleGeneric
|
||||
public BinaryReadableHandle( ReadableByteChannel channel, Closeable closeable )
|
||||
{
|
||||
super( closeable );
|
||||
this.m_reader = channel;
|
||||
this.m_seekable = asSeekable( channel );
|
||||
m_reader = channel;
|
||||
m_seekable = asSeekable( channel );
|
||||
}
|
||||
|
||||
public BinaryReadableHandle( ReadableByteChannel channel )
|
||||
|
@ -32,8 +32,8 @@ public class BinaryWritableHandle extends HandleGeneric
|
||||
public BinaryWritableHandle( WritableByteChannel channel, Closeable closeable )
|
||||
{
|
||||
super( closeable );
|
||||
this.m_writer = channel;
|
||||
this.m_seekable = asSeekable( channel );
|
||||
m_writer = channel;
|
||||
m_seekable = asSeekable( channel );
|
||||
}
|
||||
|
||||
public BinaryWritableHandle( WritableByteChannel channel )
|
||||
|
@ -32,7 +32,7 @@ public class EncodedReadableHandle extends HandleGeneric
|
||||
public EncodedReadableHandle( @Nonnull BufferedReader reader, @Nonnull Closeable closable )
|
||||
{
|
||||
super( closable );
|
||||
this.m_reader = reader;
|
||||
m_reader = reader;
|
||||
}
|
||||
|
||||
public EncodedReadableHandle( @Nonnull BufferedReader reader )
|
||||
@ -84,7 +84,7 @@ public class EncodedReadableHandle extends HandleGeneric
|
||||
checkOpen();
|
||||
try
|
||||
{
|
||||
StringBuilder result = new StringBuilder( "" );
|
||||
StringBuilder result = new StringBuilder();
|
||||
String line = m_reader.readLine();
|
||||
while( line != null )
|
||||
{
|
||||
|
@ -27,7 +27,7 @@ public class EncodedWritableHandle extends HandleGeneric
|
||||
public EncodedWritableHandle( @Nonnull BufferedWriter writer, @Nonnull Closeable closable )
|
||||
{
|
||||
super( closable );
|
||||
this.m_writer = writer;
|
||||
m_writer = writer;
|
||||
}
|
||||
|
||||
public EncodedWritableHandle( @Nonnull BufferedWriter writer )
|
||||
|
@ -26,7 +26,7 @@ public abstract class HandleGeneric implements ILuaObject
|
||||
|
||||
protected HandleGeneric( @Nonnull Closeable closable )
|
||||
{
|
||||
this.m_closable = closable;
|
||||
m_closable = closable;
|
||||
}
|
||||
|
||||
protected void checkOpen() throws LuaException
|
||||
@ -46,7 +46,7 @@ public abstract class HandleGeneric implements ILuaObject
|
||||
*
|
||||
* @param channel The channel to seek in
|
||||
* @param args The Lua arguments to process, like Lua's {@code file:seek}.
|
||||
* @return The new position of the file, or null if some error occured.
|
||||
* @return The new position of the file, or null if some error occurred.
|
||||
* @throws LuaException If the arguments were invalid
|
||||
* @see <a href="https://www.lua.org/manual/5.1/manual.html#pdf-file:seek">{@code file:seek} in the Lua manual.</a>
|
||||
*/
|
||||
|
@ -31,7 +31,7 @@ public class CheckUrl extends Resource<CheckUrl>
|
||||
super( limiter );
|
||||
this.environment = environment;
|
||||
this.address = address;
|
||||
this.host = uri.getHost();
|
||||
host = uri.getHost();
|
||||
}
|
||||
|
||||
public void run()
|
||||
|
@ -140,6 +140,6 @@ public abstract class Resource<T extends Resource<T>> implements Closeable
|
||||
public static void cleanup()
|
||||
{
|
||||
Reference<?> reference;
|
||||
while( (reference = QUEUE.poll()) != null ) ((CloseReference) reference).resource.close();
|
||||
while( (reference = QUEUE.poll()) != null ) ((CloseReference<?>) reference).resource.close();
|
||||
}
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ public class ResourceGroup<T extends Resource<T>>
|
||||
|
||||
public ResourceGroup()
|
||||
{
|
||||
this.limit = ZERO;
|
||||
limit = ZERO;
|
||||
}
|
||||
|
||||
public void startup()
|
||||
|
@ -67,12 +67,12 @@ public class HttpRequest extends Resource<HttpRequest>
|
||||
super( limiter );
|
||||
this.environment = environment;
|
||||
this.address = address;
|
||||
this.postBuffer = postText != null
|
||||
postBuffer = postText != null
|
||||
? Unpooled.wrappedBuffer( postText.getBytes( StandardCharsets.UTF_8 ) )
|
||||
: Unpooled.buffer( 0 );
|
||||
this.headers = headers;
|
||||
this.binary = binary;
|
||||
this.redirects = new AtomicInteger( followRedirects ? MAX_REDIRECTS : 0 );
|
||||
redirects = new AtomicInteger( followRedirects ? MAX_REDIRECTS : 0 );
|
||||
|
||||
if( postText != null )
|
||||
{
|
||||
|
@ -37,7 +37,7 @@ public final class HttpRequestHandler extends SimpleChannelInboundHandler<HttpOb
|
||||
/**
|
||||
* Same as {@link io.netty.handler.codec.MessageAggregator}.
|
||||
*/
|
||||
private static final int DEFAULT_MAX_COMPOSITEBUFFER_COMPONENTS = 1024;
|
||||
private static final int DEFAULT_MAX_COMPOSITE_BUFFER_COMPONENTS = 1024;
|
||||
|
||||
private static final byte[] EMPTY_BYTES = new byte[0];
|
||||
|
||||
@ -147,7 +147,7 @@ public final class HttpRequestHandler extends SimpleChannelInboundHandler<HttpOb
|
||||
|
||||
if( responseBody == null )
|
||||
{
|
||||
responseBody = ctx.alloc().compositeBuffer( DEFAULT_MAX_COMPOSITEBUFFER_COMPONENTS );
|
||||
responseBody = ctx.alloc().compositeBuffer( DEFAULT_MAX_COMPOSITE_BUFFER_COMPONENTS );
|
||||
}
|
||||
|
||||
ByteBuf partial = content.content();
|
||||
|
@ -95,7 +95,7 @@ public class Websocket extends Resource<Websocket>
|
||||
{
|
||||
try
|
||||
{
|
||||
uri = new URI( "ws://" + uri.toString() );
|
||||
uri = new URI( "ws://" + uri );
|
||||
}
|
||||
catch( URISyntaxException e )
|
||||
{
|
||||
@ -186,7 +186,7 @@ public class Websocket extends Resource<Websocket>
|
||||
|
||||
WebsocketHandle handle = new WebsocketHandle( this, channel );
|
||||
environment().queueEvent( SUCCESS_EVENT, new Object[] { address, handle } );
|
||||
this.websocketHandle = createOwnerReference( handle );
|
||||
websocketHandle = createOwnerReference( handle );
|
||||
|
||||
checkClosed();
|
||||
}
|
||||
@ -216,7 +216,7 @@ public class Websocket extends Resource<Websocket>
|
||||
executorFuture = closeFuture( executorFuture );
|
||||
connectFuture = closeChannel( connectFuture );
|
||||
|
||||
WeakReference<WebsocketHandle> websocketHandleRef = this.websocketHandle;
|
||||
WeakReference<WebsocketHandle> websocketHandleRef = websocketHandle;
|
||||
WebsocketHandle websocketHandle = websocketHandleRef == null ? null : websocketHandleRef.get();
|
||||
if( websocketHandle != null ) IoUtil.closeQuietly( websocketHandle );
|
||||
this.websocketHandle = null;
|
||||
|
@ -233,7 +233,7 @@ final class ComputerExecutor
|
||||
synchronized( queueLock )
|
||||
{
|
||||
if( closed ) return;
|
||||
this.closed = close;
|
||||
closed = close;
|
||||
|
||||
StateCommand newCommand = reboot ? StateCommand.REBOOT : StateCommand.SHUTDOWN;
|
||||
|
||||
@ -425,7 +425,7 @@ final class ComputerExecutor
|
||||
}
|
||||
|
||||
// Init filesystem
|
||||
if( (this.fileSystem = createFileSystem()) == null )
|
||||
if( (fileSystem = createFileSystem()) == null )
|
||||
{
|
||||
shutdown();
|
||||
return;
|
||||
@ -435,7 +435,7 @@ final class ComputerExecutor
|
||||
for( ILuaAPI api : apis ) api.startup();
|
||||
|
||||
// Init lua
|
||||
if( (this.machine = createLuaMachine()) == null )
|
||||
if( (machine = createLuaMachine()) == null )
|
||||
{
|
||||
shutdown();
|
||||
return;
|
||||
@ -650,7 +650,7 @@ final class ComputerExecutor
|
||||
ABORT,
|
||||
}
|
||||
|
||||
private static class Event
|
||||
private static final class Event
|
||||
{
|
||||
final String name;
|
||||
final Object[] args;
|
||||
|
@ -47,7 +47,7 @@ import static dan200.computercraft.core.computer.TimeoutState.TIMEOUT;
|
||||
* @see TimeoutState For how hard timeouts are handled.
|
||||
* @see ComputerExecutor For how computers actually do execution.
|
||||
*/
|
||||
public class ComputerThread
|
||||
public final class ComputerThread
|
||||
{
|
||||
/**
|
||||
* How often the computer thread monitor should run, in milliseconds
|
||||
@ -123,6 +123,8 @@ public class ComputerThread
|
||||
private static final ThreadFactory monitorFactory = ThreadUtils.factory( "Computer-Monitor" );
|
||||
private static final ThreadFactory runnerFactory = ThreadUtils.factory( "Computer-Runner" );
|
||||
|
||||
private ComputerThread() {}
|
||||
|
||||
/**
|
||||
* Start the computer thread
|
||||
*/
|
||||
@ -339,7 +341,7 @@ public class ComputerThread
|
||||
*/
|
||||
static boolean hasPendingWork()
|
||||
{
|
||||
return computerQueue.size() > 0;
|
||||
return !computerQueue.isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -22,7 +22,7 @@ import java.util.Arrays;
|
||||
*
|
||||
* This handles storing and updating of peripherals and redstone.
|
||||
*
|
||||
* <h2>Redstone</h2>
|
||||
* <h1>Redstone</h1>
|
||||
* We holds three kinds of arrays for redstone, in normal and bundled versions:
|
||||
* <ul>
|
||||
* <li>{@link #internalOutput} is the redstone output which the computer has currently set. This is read on both
|
||||
@ -33,7 +33,7 @@ import java.util.Arrays;
|
||||
* thread.</li>
|
||||
* </ul>
|
||||
*
|
||||
* <h2>Peripheral</h2>
|
||||
* <h1>Peripheral</h1>
|
||||
* We also keep track of peripherals. These are read on both threads, and only written on the main thread.
|
||||
*/
|
||||
public final class Environment implements IAPIEnvironment
|
||||
@ -215,7 +215,7 @@ public final class Environment implements IAPIEnvironment
|
||||
*/
|
||||
boolean updateOutput()
|
||||
{
|
||||
// Set outputchanged if the internal redstone has changed
|
||||
// Mark output as changed if the internal redstone has changed
|
||||
synchronized( internalOutput )
|
||||
{
|
||||
if( !internalOutputChanged ) return false;
|
||||
|
@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicLong;
|
||||
* Next tick, we put {@link ComputerCraft#maxMainGlobalTime} into our budget (and clamp it to that value to). If we're
|
||||
* still over budget, then we should not execute <em>any</em> work (either as part of {@link MainThread} or externally).
|
||||
*/
|
||||
public class MainThread
|
||||
public final class MainThread
|
||||
{
|
||||
/**
|
||||
* An internal counter for {@link ILuaTask} ids.
|
||||
@ -47,7 +47,6 @@ public class MainThread
|
||||
if( at == bt ) return Integer.compare( a.hashCode(), b.hashCode() );
|
||||
return at < bt ? -1 : 1;
|
||||
} );
|
||||
;
|
||||
|
||||
/**
|
||||
* The set of executors which went over budget in a previous tick, and are waiting for their time to run down.
|
||||
@ -79,6 +78,8 @@ public class MainThread
|
||||
|
||||
private static long minimumTime = 0;
|
||||
|
||||
private MainThread() {}
|
||||
|
||||
public static long getUniqueTaskID()
|
||||
{
|
||||
return lastTaskId.incrementAndGet();
|
||||
|
@ -93,7 +93,7 @@ public final class TimeoutState
|
||||
// need to handle overflow.
|
||||
long now = System.nanoTime();
|
||||
if( !paused ) paused = currentDeadline - now <= 0 && ComputerThread.hasPendingWork(); // now >= currentDeadline
|
||||
if( !softAbort ) softAbort = (now - cumulativeStart - TIMEOUT) >= 0; // now - cumulativeStart >= TIMEOUT
|
||||
if( !softAbort ) softAbort = now - cumulativeStart - TIMEOUT >= 0; // now - cumulativeStart >= TIMEOUT
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,14 +55,8 @@ public class FileMount implements IWritableMount
|
||||
m_ignoredBytesLeft = 0;
|
||||
|
||||
long bytesLeft = m_capacity - m_usedSpace;
|
||||
if( newBytes > bytesLeft )
|
||||
{
|
||||
throw new IOException( "Out of space" );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_usedSpace += newBytes;
|
||||
}
|
||||
if( newBytes > bytesLeft ) throw new IOException( "Out of space" );
|
||||
m_usedSpace += newBytes;
|
||||
}
|
||||
}
|
||||
|
||||
@ -86,14 +80,17 @@ public class FileMount implements IWritableMount
|
||||
SeekableCountingChannel( SeekableByteChannel inner, long bytesToIgnore )
|
||||
{
|
||||
super( inner, bytesToIgnore );
|
||||
this.m_inner = inner;
|
||||
m_inner = inner;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeekableByteChannel position( long newPosition ) throws IOException
|
||||
{
|
||||
if( !isOpen() ) throw new ClosedChannelException();
|
||||
if( newPosition < 0 ) throw new IllegalArgumentException();
|
||||
if( newPosition < 0 )
|
||||
{
|
||||
throw new IllegalArgumentException( "Cannot seek before the beginning of the stream" );
|
||||
}
|
||||
|
||||
long delta = newPosition - m_inner.position();
|
||||
if( delta < 0 )
|
||||
@ -115,7 +112,7 @@ public class FileMount implements IWritableMount
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read( ByteBuffer dst ) throws IOException
|
||||
public int read( ByteBuffer dst ) throws ClosedChannelException
|
||||
{
|
||||
if( !m_inner.isOpen() ) throw new ClosedChannelException();
|
||||
throw new NonReadableChannelException();
|
||||
@ -150,29 +147,19 @@ public class FileMount implements IWritableMount
|
||||
@Override
|
||||
public boolean exists( @Nonnull String path )
|
||||
{
|
||||
if( !created() )
|
||||
{
|
||||
return path.length() == 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
return file.exists();
|
||||
}
|
||||
if( !created() ) return path.isEmpty();
|
||||
|
||||
File file = getRealPath( path );
|
||||
return file.exists();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirectory( @Nonnull String path )
|
||||
{
|
||||
if( !created() )
|
||||
{
|
||||
return path.length() == 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
return file.exists() && file.isDirectory();
|
||||
}
|
||||
if( !created() ) return path.isEmpty();
|
||||
|
||||
File file = getRealPath( path );
|
||||
return file.exists() && file.isDirectory();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -180,29 +167,17 @@ public class FileMount implements IWritableMount
|
||||
{
|
||||
if( !created() )
|
||||
{
|
||||
if( path.length() != 0 )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Not a directory" );
|
||||
}
|
||||
if( !path.isEmpty() ) throw new IOException( "/" + path + ": Not a directory" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
File file = getRealPath( path );
|
||||
if( !file.exists() || !file.isDirectory() ) throw new IOException( "/" + path + ": Not a directory" );
|
||||
|
||||
String[] paths = file.list();
|
||||
for( String subPath : paths )
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() && file.isDirectory() )
|
||||
{
|
||||
String[] paths = file.list();
|
||||
for( String subPath : paths )
|
||||
{
|
||||
if( new File( file, subPath ).exists() )
|
||||
{
|
||||
contents.add( subPath );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IOException( "/" + path + ": Not a directory" );
|
||||
}
|
||||
if( new File( file, subPath ).exists() ) contents.add( subPath );
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,26 +186,14 @@ public class FileMount implements IWritableMount
|
||||
{
|
||||
if( !created() )
|
||||
{
|
||||
if( path.length() == 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if( path.isEmpty() ) return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() )
|
||||
{
|
||||
if( file.isDirectory() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return file.length();
|
||||
}
|
||||
}
|
||||
if( file.exists() ) return file.isDirectory() ? 0 : file.length();
|
||||
}
|
||||
|
||||
throw new IOException( "/" + path + ": No such file" );
|
||||
}
|
||||
|
||||
@ -242,11 +205,9 @@ public class FileMount implements IWritableMount
|
||||
if( created() )
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() && !file.isDirectory() )
|
||||
{
|
||||
return new FileInputStream( file );
|
||||
}
|
||||
if( file.exists() && !file.isDirectory() ) return new FileInputStream( file );
|
||||
}
|
||||
|
||||
throw new IOException( "/" + path + ": No such file" );
|
||||
}
|
||||
|
||||
@ -257,11 +218,9 @@ public class FileMount implements IWritableMount
|
||||
if( created() )
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() && !file.isDirectory() )
|
||||
{
|
||||
return FileChannel.open( file.toPath(), READ_OPTIONS );
|
||||
}
|
||||
if( file.exists() && !file.isDirectory() ) return FileChannel.open( file.toPath(), READ_OPTIONS );
|
||||
}
|
||||
|
||||
throw new IOException( "/" + path + ": No such file" );
|
||||
}
|
||||
|
||||
@ -274,53 +233,42 @@ public class FileMount implements IWritableMount
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() )
|
||||
{
|
||||
if( !file.isDirectory() )
|
||||
{
|
||||
throw new IOException( "/" + path + ": File exists" );
|
||||
}
|
||||
if( !file.isDirectory() ) throw new IOException( "/" + path + ": File exists" );
|
||||
return;
|
||||
}
|
||||
|
||||
int dirsToCreate = 1;
|
||||
File parent = file.getParentFile();
|
||||
while( !parent.exists() )
|
||||
{
|
||||
++dirsToCreate;
|
||||
parent = parent.getParentFile();
|
||||
}
|
||||
|
||||
if( getRemainingSpace() < dirsToCreate * MINIMUM_FILE_SIZE )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Out of space" );
|
||||
}
|
||||
|
||||
if( file.mkdirs() )
|
||||
{
|
||||
m_usedSpace += dirsToCreate * MINIMUM_FILE_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
int dirsToCreate = 1;
|
||||
File parent = file.getParentFile();
|
||||
while( !parent.exists() )
|
||||
{
|
||||
++dirsToCreate;
|
||||
parent = parent.getParentFile();
|
||||
}
|
||||
|
||||
if( getRemainingSpace() < dirsToCreate * MINIMUM_FILE_SIZE )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Out of space" );
|
||||
}
|
||||
|
||||
boolean success = file.mkdirs();
|
||||
if( success )
|
||||
{
|
||||
m_usedSpace += dirsToCreate * MINIMUM_FILE_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IOException( "/" + path + ": Access denied" );
|
||||
}
|
||||
throw new IOException( "/" + path + ": Access denied" );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete( @Nonnull String path ) throws IOException
|
||||
{
|
||||
if( path.length() == 0 )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Access denied" );
|
||||
}
|
||||
if( path.isEmpty() ) throw new IOException( "/" + path + ": Access denied" );
|
||||
|
||||
if( created() )
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() )
|
||||
{
|
||||
deleteRecursively( file );
|
||||
}
|
||||
if( file.exists() ) deleteRecursively( file );
|
||||
}
|
||||
}
|
||||
|
||||
@ -371,60 +319,39 @@ public class FileMount implements IWritableMount
|
||||
{
|
||||
create();
|
||||
File file = getRealPath( path );
|
||||
if( file.exists() && file.isDirectory() )
|
||||
if( file.exists() && file.isDirectory() ) throw new IOException( "/" + path + ": Cannot write to directory" );
|
||||
|
||||
if( file.exists() )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Cannot write to directory" );
|
||||
m_usedSpace -= Math.max( file.length(), MINIMUM_FILE_SIZE );
|
||||
}
|
||||
else
|
||||
else if( getRemainingSpace() < MINIMUM_FILE_SIZE )
|
||||
{
|
||||
if( !file.exists() )
|
||||
{
|
||||
if( getRemainingSpace() < MINIMUM_FILE_SIZE )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Out of space" );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_usedSpace += MINIMUM_FILE_SIZE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_usedSpace -= Math.max( file.length(), MINIMUM_FILE_SIZE );
|
||||
m_usedSpace += MINIMUM_FILE_SIZE;
|
||||
}
|
||||
return new SeekableCountingChannel( Files.newByteChannel( file.toPath(), WRITE_OPTIONS ), MINIMUM_FILE_SIZE );
|
||||
throw new IOException( "/" + path + ": Out of space" );
|
||||
}
|
||||
m_usedSpace += MINIMUM_FILE_SIZE;
|
||||
|
||||
return new SeekableCountingChannel( Files.newByteChannel( file.toPath(), WRITE_OPTIONS ), MINIMUM_FILE_SIZE );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public WritableByteChannel openChannelForAppend( @Nonnull String path ) throws IOException
|
||||
{
|
||||
if( created() )
|
||||
{
|
||||
File file = getRealPath( path );
|
||||
if( !file.exists() )
|
||||
{
|
||||
throw new IOException( "/" + path + ": No such file" );
|
||||
}
|
||||
else if( file.isDirectory() )
|
||||
{
|
||||
throw new IOException( "/" + path + ": Cannot write to directory" );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Allowing seeking when appending is not recommended, so we use a separate channel.
|
||||
return new WritableCountingChannel(
|
||||
Files.newByteChannel( file.toPath(), APPEND_OPTIONS ),
|
||||
Math.max( MINIMUM_FILE_SIZE - file.length(), 0 )
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
if( !created() )
|
||||
{
|
||||
throw new IOException( "/" + path + ": No such file" );
|
||||
}
|
||||
|
||||
File file = getRealPath( path );
|
||||
if( !file.exists() ) throw new IOException( "/" + path + ": No such file" );
|
||||
if( file.isDirectory() ) throw new IOException( "/" + path + ": Cannot write to directory" );
|
||||
|
||||
// Allowing seeking when appending is not recommended, so we use a separate channel.
|
||||
return new WritableCountingChannel(
|
||||
Files.newByteChannel( file.toPath(), APPEND_OPTIONS ),
|
||||
Math.max( MINIMUM_FILE_SIZE - file.length(), 0 )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -433,7 +360,7 @@ public class FileMount implements IWritableMount
|
||||
return Math.max( m_capacity - m_usedSpace, 0 );
|
||||
}
|
||||
|
||||
public File getRealPath( String path )
|
||||
private File getRealPath( String path )
|
||||
{
|
||||
return new File( m_rootPath, path );
|
||||
}
|
||||
@ -455,12 +382,10 @@ public class FileMount implements IWritableMount
|
||||
}
|
||||
}
|
||||
|
||||
private long measureUsedSpace( File file )
|
||||
private static long measureUsedSpace( File file )
|
||||
{
|
||||
if( !file.exists() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if( !file.exists() ) return 0;
|
||||
|
||||
if( file.isDirectory() )
|
||||
{
|
||||
long size = MINIMUM_FILE_SIZE;
|
||||
|
@ -29,7 +29,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
public class FileSystem
|
||||
{
|
||||
private class MountWrapper
|
||||
private static class MountWrapper
|
||||
{
|
||||
private String m_label;
|
||||
private String m_location;
|
||||
@ -37,7 +37,7 @@ public class FileSystem
|
||||
private IMount m_mount;
|
||||
private IWritableMount m_writableMount;
|
||||
|
||||
public MountWrapper( String label, String location, IMount mount )
|
||||
MountWrapper( String label, String location, IMount mount )
|
||||
{
|
||||
m_label = label;
|
||||
m_location = location;
|
||||
@ -80,7 +80,7 @@ public class FileSystem
|
||||
|
||||
public boolean isReadOnly( String path )
|
||||
{
|
||||
return (m_writableMount == null);
|
||||
return m_writableMount == null;
|
||||
}
|
||||
|
||||
// IMount forwarders:
|
||||
@ -474,7 +474,7 @@ public class FileSystem
|
||||
String[] list = list( dir );
|
||||
for( String entry : list )
|
||||
{
|
||||
String entryPath = dir.isEmpty() ? entry : (dir + "/" + entry);
|
||||
String entryPath = dir.isEmpty() ? entry : dir + "/" + entry;
|
||||
if( wildPattern.matcher( entryPath ).matches() )
|
||||
{
|
||||
matches.add( entryPath );
|
||||
@ -674,7 +674,7 @@ public class FileSystem
|
||||
throw new FileSystemException( "Too many files already open" );
|
||||
}
|
||||
|
||||
ChannelWrapper<T> channelWrapper = new ChannelWrapper<T>( file, channel );
|
||||
ChannelWrapper<T> channelWrapper = new ChannelWrapper<>( file, channel );
|
||||
FileSystemWrapper<T> fsWrapper = new FileSystemWrapper<>( this, channelWrapper, m_openFileQueue );
|
||||
m_openFiles.put( fsWrapper.self, channelWrapper );
|
||||
return fsWrapper;
|
||||
@ -768,7 +768,7 @@ public class FileSystem
|
||||
path = path.replace( '\\', '/' );
|
||||
|
||||
// Clean the path or illegal characters.
|
||||
final char[] specialChars = {
|
||||
final char[] specialChars = new char[] {
|
||||
'"', ':', '<', '>', '?', '|' // Sorted by ascii value (important)
|
||||
};
|
||||
|
||||
@ -788,13 +788,14 @@ public class FileSystem
|
||||
Stack<String> outputParts = new Stack<>();
|
||||
for( String part : parts )
|
||||
{
|
||||
if( part.length() == 0 || part.equals( "." ) || threeDotsPattern.matcher( part ).matches() )
|
||||
if( part.isEmpty() || part.equals( "." ) || threeDotsPattern.matcher( part ).matches() )
|
||||
{
|
||||
// . is redundant
|
||||
// ... and more are treated as .
|
||||
continue;
|
||||
}
|
||||
else if( part.equals( ".." ) )
|
||||
|
||||
if( part.equals( ".." ) )
|
||||
{
|
||||
// .. can cancel out the last folder entered
|
||||
if( !outputParts.empty() )
|
||||
@ -827,7 +828,7 @@ public class FileSystem
|
||||
}
|
||||
|
||||
// Recombine the output parts into a new string
|
||||
StringBuilder result = new StringBuilder( "" );
|
||||
StringBuilder result = new StringBuilder();
|
||||
Iterator<String> it = outputParts.iterator();
|
||||
while( it.hasNext() )
|
||||
{
|
||||
@ -874,7 +875,7 @@ public class FileSystem
|
||||
path = sanitizePath( path );
|
||||
location = sanitizePath( location );
|
||||
|
||||
assert (contains( location, path ));
|
||||
assert contains( location, path );
|
||||
String local = path.substring( location.length() );
|
||||
if( local.startsWith( "/" ) )
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ public class FileSystemWrapper<T extends Closeable> implements Closeable
|
||||
{
|
||||
this.fileSystem = fileSystem;
|
||||
this.closeable = closeable;
|
||||
this.self = new WeakReference<>( this, queue );
|
||||
self = new WeakReference<>( this, queue );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -76,9 +76,9 @@ public class JarMount implements IMount
|
||||
{
|
||||
zip = new ZipFile( jarFile );
|
||||
}
|
||||
catch( Exception e )
|
||||
catch( IOException e )
|
||||
{
|
||||
throw new IOException( "Error loading zip file" );
|
||||
throw new IOException( "Error loading zip file", e );
|
||||
}
|
||||
|
||||
// Ensure the root entry exists.
|
||||
@ -212,7 +212,7 @@ public class JarMount implements IMount
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( Exception e )
|
||||
catch( IOException e )
|
||||
{
|
||||
// Treat errors as non-existence of file
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ public class SubMount implements IMount
|
||||
|
||||
private String getFullPath( String path )
|
||||
{
|
||||
if( path.length() == 0 )
|
||||
if( path.isEmpty() )
|
||||
{
|
||||
return m_subPath;
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
debug = new TimeoutDebugHandler();
|
||||
|
||||
// Create an environment to run in
|
||||
LuaState state = this.m_state = LuaState.builder()
|
||||
LuaState state = m_state = LuaState.builder()
|
||||
.resourceManipulator( new VoidResourceManipulator() )
|
||||
.debug( debug )
|
||||
.coroutineExecutor( command -> {
|
||||
@ -254,7 +254,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
{
|
||||
ComputerCraft.log.error( "Error calling " + methodName + " on " + apiObject, t );
|
||||
}
|
||||
throw new LuaError( "Java Exception Thrown: " + t.toString(), 0 );
|
||||
throw new LuaError( "Java Exception Thrown: " + t, 0 );
|
||||
}
|
||||
return toValues( results );
|
||||
}
|
||||
@ -348,22 +348,14 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
{
|
||||
case Constants.TNIL:
|
||||
case Constants.TNONE:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
case Constants.TINT:
|
||||
case Constants.TNUMBER:
|
||||
{
|
||||
return value.toDouble();
|
||||
}
|
||||
case Constants.TBOOLEAN:
|
||||
{
|
||||
return value.toBoolean();
|
||||
}
|
||||
case Constants.TSTRING:
|
||||
{
|
||||
return value.toString();
|
||||
}
|
||||
case Constants.TTABLE:
|
||||
{
|
||||
// Table:
|
||||
@ -411,9 +403,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
return table;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -445,7 +435,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
|
||||
TimeoutDebugHandler()
|
||||
{
|
||||
this.timeout = CobaltLuaMachine.this.timeout;
|
||||
timeout = CobaltLuaMachine.this.timeout;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -560,7 +550,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
{
|
||||
if( ComputerCraft.logPeripheralErrors ) ComputerCraft.log.error( "Error running task", t );
|
||||
m_computer.queueEvent( "task_complete", new Object[] {
|
||||
taskID, false, "Java Exception Thrown: " + t.toString()
|
||||
taskID, false, "Java Exception Thrown: " + t
|
||||
} );
|
||||
}
|
||||
};
|
||||
@ -614,7 +604,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
||||
}
|
||||
}
|
||||
|
||||
private static class HardAbortError extends Error
|
||||
private static final class HardAbortError extends Error
|
||||
{
|
||||
private static final long serialVersionUID = 7954092008586367501L;
|
||||
|
||||
|
@ -55,7 +55,7 @@ public interface ILuaMachine
|
||||
* @param eventName The name of the event. This is {@code null} when first starting the machine. Note, this may
|
||||
* do nothing if it does not match the event filter.
|
||||
* @param arguments The arguments for this event.
|
||||
* @return The result of loading this machine. Will either be OK, or the error message that occurrred when
|
||||
* @return The result of loading this machine. Will either be OK, or the error message that occurred when
|
||||
* executing.
|
||||
*/
|
||||
MachineResult handleEvent( @Nullable String eventName, @Nullable Object[] arguments );
|
||||
|
@ -22,9 +22,9 @@ public class Terminal
|
||||
private int m_width;
|
||||
private int m_height;
|
||||
|
||||
private TextBuffer m_text[];
|
||||
private TextBuffer m_textColour[];
|
||||
private TextBuffer m_backgroundColour[];
|
||||
private TextBuffer[] m_text;
|
||||
private TextBuffer[] m_textColour;
|
||||
private TextBuffer[] m_backgroundColour;
|
||||
|
||||
private final Palette m_palette;
|
||||
|
||||
@ -40,7 +40,7 @@ public class Terminal
|
||||
{
|
||||
m_width = width;
|
||||
m_height = height;
|
||||
this.onChanged = changedCallback;
|
||||
onChanged = changedCallback;
|
||||
|
||||
m_cursorColour = 0;
|
||||
m_cursorBackgroundColour = 15;
|
||||
|
@ -29,23 +29,23 @@ public class ComputerTracker
|
||||
public ComputerTracker( Computer computer )
|
||||
{
|
||||
this.computer = new WeakReference<>( computer );
|
||||
this.computerId = computer.getID();
|
||||
this.fields = new Object2LongOpenHashMap<>();
|
||||
computerId = computer.getID();
|
||||
fields = new Object2LongOpenHashMap<>();
|
||||
}
|
||||
|
||||
ComputerTracker( ComputerTracker timings )
|
||||
{
|
||||
this.computer = timings.computer;
|
||||
this.computerId = timings.computerId;
|
||||
computer = timings.computer;
|
||||
computerId = timings.computerId;
|
||||
|
||||
this.tasks = timings.tasks;
|
||||
this.totalTime = timings.totalTime;
|
||||
this.maxTime = timings.maxTime;
|
||||
tasks = timings.tasks;
|
||||
totalTime = timings.totalTime;
|
||||
maxTime = timings.maxTime;
|
||||
|
||||
this.serverCount = timings.serverCount;
|
||||
this.serverTime = timings.serverTime;
|
||||
serverCount = timings.serverCount;
|
||||
serverTime = timings.serverTime;
|
||||
|
||||
this.fields = new Object2LongOpenHashMap<>( timings.fields );
|
||||
fields = new Object2LongOpenHashMap<>( timings.fields );
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
@ -14,7 +14,7 @@ import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class Tracking
|
||||
public final class Tracking
|
||||
{
|
||||
static final AtomicInteger tracking = new AtomicInteger( 0 );
|
||||
|
||||
@ -22,6 +22,8 @@ public class Tracking
|
||||
private static final HashMap<UUID, TrackingContext> contexts = new HashMap<>();
|
||||
private static final List<Tracker> trackers = new ArrayList<>();
|
||||
|
||||
private Tracking() {}
|
||||
|
||||
public static TrackingContext getContext( UUID uuid )
|
||||
{
|
||||
synchronized( lock )
|
||||
|
@ -13,7 +13,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.LongFunction;
|
||||
|
||||
public class TrackingField
|
||||
public final class TrackingField
|
||||
{
|
||||
public static final String TRANSLATE_PREFIX = "tracking_field.computercraft.";
|
||||
|
||||
@ -33,7 +33,7 @@ public class TrackingField
|
||||
|
||||
public static final TrackingField HTTP_REQUESTS = TrackingField.of( "http", "HTTP requests", TrackingField::formatDefault );
|
||||
public static final TrackingField HTTP_UPLOAD = TrackingField.of( "http_upload", "HTTP upload", TrackingField::formatBytes );
|
||||
public static final TrackingField HTTP_DOWNLOAD = TrackingField.of( "http_download", "HTTT download", TrackingField::formatBytes );
|
||||
public static final TrackingField HTTP_DOWNLOAD = TrackingField.of( "http_download", "HTTP download", TrackingField::formatBytes );
|
||||
|
||||
public static final TrackingField WEBSOCKET_INCOMING = TrackingField.of( "websocket_incoming", "Websocket incoming", TrackingField::formatBytes );
|
||||
public static final TrackingField WEBSOCKET_OUTGOING = TrackingField.of( "websocket_outgoing", "Websocket outgoing", TrackingField::formatBytes );
|
||||
@ -64,7 +64,7 @@ public class TrackingField
|
||||
private TrackingField( String id, LongFunction<String> format )
|
||||
{
|
||||
this.id = id;
|
||||
this.translationKey = "tracking_field.computercraft." + id + ".name";
|
||||
translationKey = "tracking_field.computercraft." + id + ".name";
|
||||
this.format = format;
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@ import java.util.concurrent.TimeUnit;
|
||||
import static dan200.computercraft.ComputerCraft.DEFAULT_HTTP_BLACKLIST;
|
||||
import static dan200.computercraft.ComputerCraft.DEFAULT_HTTP_WHITELIST;
|
||||
|
||||
public class Config
|
||||
public final class Config
|
||||
{
|
||||
private static final int MODEM_MAX_RANGE = 100000;
|
||||
|
||||
@ -78,6 +78,8 @@ public class Config
|
||||
private static Property turtlesCanPush;
|
||||
private static Property turtleDisabledActions;
|
||||
|
||||
private Config() {}
|
||||
|
||||
public static void load( File configFile )
|
||||
{
|
||||
config = new Configuration( configFile, ComputerCraft.getVersion() );
|
||||
@ -106,7 +108,7 @@ public class Config
|
||||
"update. Useful for ensuring forward compatibility of your programs now." );
|
||||
|
||||
defaultComputerSettings = config.get( CATEGORY_GENERAL, "default_computer_settings", ComputerCraft.default_computer_settings );
|
||||
defaultComputerSettings.setComment( "A comma seperated list of default system settings to set on new computers. Example: " +
|
||||
defaultComputerSettings.setComment( "A comma separated list of default system settings to set on new computers. Example: " +
|
||||
"\"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\" will disable all autocompletion" );
|
||||
|
||||
debugEnabled = config.get( CATEGORY_GENERAL, "debug_enabled", ComputerCraft.debug_enable );
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
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;
|
||||
@ -14,15 +13,18 @@ import net.minecraft.item.ItemStack;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
public final class MediaProviders
|
||||
{
|
||||
private static final Set<IMediaProvider> providers = new LinkedHashSet<>();
|
||||
|
||||
private MediaProviders() {}
|
||||
|
||||
public static void register( @Nonnull IMediaProvider provider )
|
||||
{
|
||||
Preconditions.checkNotNull( provider, "provider cannot be null" );
|
||||
Objects.requireNonNull( provider, "provider cannot be null" );
|
||||
providers.add( provider );
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
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;
|
||||
@ -16,14 +15,17 @@ import net.minecraft.world.World;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
|
||||
public final class Peripherals
|
||||
{
|
||||
private static final Collection<IPeripheralProvider> providers = ComputerCraft.peripheralProviders;
|
||||
|
||||
private Peripherals() {}
|
||||
|
||||
public static void register( @Nonnull IPeripheralProvider provider )
|
||||
{
|
||||
Preconditions.checkNotNull( provider, "provider cannot be null" );
|
||||
Objects.requireNonNull( provider, "provider cannot be null" );
|
||||
if( !providers.contains( provider ) ) providers.add( provider );
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
package dan200.computercraft.shared;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.pocket.IPocketUpgrade;
|
||||
import dan200.computercraft.shared.util.InventoryUtil;
|
||||
@ -23,9 +22,11 @@ public final class PocketUpgrades
|
||||
private static final Map<String, IPocketUpgrade> upgrades = new HashMap<>();
|
||||
private static final IdentityHashMap<IPocketUpgrade, String> upgradeOwners = new IdentityHashMap<>();
|
||||
|
||||
private PocketUpgrades() {}
|
||||
|
||||
public static void register( @Nonnull IPocketUpgrade upgrade )
|
||||
{
|
||||
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
|
||||
Objects.requireNonNull( upgrade, "upgrade cannot be null" );
|
||||
|
||||
String id = upgrade.getUpgradeID().toString();
|
||||
IPocketUpgrade existing = upgrades.get( id );
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
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;
|
||||
@ -27,9 +26,11 @@ public final class TurtleUpgrades
|
||||
private static final Int2ObjectMap<ITurtleUpgrade> legacyUpgrades = new Int2ObjectOpenHashMap<>();
|
||||
private static final IdentityHashMap<ITurtleUpgrade, String> upgradeOwners = new IdentityHashMap<>();
|
||||
|
||||
private TurtleUpgrades() {}
|
||||
|
||||
public static void register( @Nonnull ITurtleUpgrade upgrade )
|
||||
{
|
||||
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
|
||||
Objects.requireNonNull( upgrade, "upgrade cannot be null" );
|
||||
|
||||
int id = upgrade.getLegacyUpgradeID();
|
||||
if( id >= 0 && id < 64 )
|
||||
@ -44,7 +45,7 @@ public final class TurtleUpgrades
|
||||
|
||||
static void registerInternal( ITurtleUpgrade upgrade )
|
||||
{
|
||||
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
|
||||
Objects.requireNonNull( upgrade, "upgrade cannot be null" );
|
||||
|
||||
// Check conditions
|
||||
int legacyId = upgrade.getLegacyUpgradeID();
|
||||
|
@ -60,7 +60,7 @@ public final class CommandComputerCraft extends CommandDelegate
|
||||
@Override
|
||||
public void execute( @Nonnull CommandContext context, @Nonnull List<String> arguments ) throws CommandException
|
||||
{
|
||||
if( arguments.size() == 0 )
|
||||
if( arguments.isEmpty() )
|
||||
{
|
||||
TableBuilder table = new TableBuilder( DUMP_LIST_ID, "Computer", "On", "Position" );
|
||||
|
||||
@ -162,7 +162,7 @@ public final class CommandComputerCraft extends CommandDelegate
|
||||
@Override
|
||||
public List<String> getCompletion( @Nonnull CommandContext context, @Nonnull List<String> arguments )
|
||||
{
|
||||
return arguments.size() == 0
|
||||
return arguments.isEmpty()
|
||||
? Collections.emptyList()
|
||||
: ComputerSelector.completeComputer( arguments.get( arguments.size() - 1 ) );
|
||||
}
|
||||
@ -188,7 +188,7 @@ public final class CommandComputerCraft extends CommandDelegate
|
||||
@Override
|
||||
public List<String> getCompletion( @Nonnull CommandContext context, @Nonnull List<String> arguments )
|
||||
{
|
||||
return arguments.size() == 0
|
||||
return arguments.isEmpty()
|
||||
? Collections.emptyList()
|
||||
: ComputerSelector.completeComputer( arguments.get( arguments.size() - 1 ) );
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
public class CommandCopy extends CommandBase implements IClientCommand
|
||||
public final class CommandCopy extends CommandBase implements IClientCommand
|
||||
{
|
||||
public static final CommandCopy INSTANCE = new CommandCopy();
|
||||
|
||||
|
@ -10,8 +10,10 @@ import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
|
||||
public class CommandUtils
|
||||
public final class CommandUtils
|
||||
{
|
||||
private CommandUtils() {}
|
||||
|
||||
public static boolean isPlayer( ICommandSender sender )
|
||||
{
|
||||
return sender instanceof EntityPlayerMP
|
||||
|
@ -18,6 +18,8 @@ import java.util.function.Predicate;
|
||||
|
||||
final class ComputerSelector
|
||||
{
|
||||
private ComputerSelector() {}
|
||||
|
||||
private static List<ServerComputer> getComputers( Predicate<ServerComputer> predicate )
|
||||
{
|
||||
// We copy it to prevent concurrent modifications.
|
||||
@ -29,7 +31,7 @@ final class ComputerSelector
|
||||
static ServerComputer getComputer( String selector ) throws CommandException
|
||||
{
|
||||
List<ServerComputer> computers = getComputers( selector );
|
||||
if( computers.size() == 0 )
|
||||
if( computers.isEmpty() )
|
||||
{
|
||||
throw new CommandException( "commands.computercraft.argument.no_matching", selector );
|
||||
}
|
||||
@ -53,7 +55,7 @@ final class ComputerSelector
|
||||
|
||||
static List<ServerComputer> getComputers( String selector ) throws CommandException
|
||||
{
|
||||
if( selector.length() > 0 && selector.charAt( 0 ) == '#' )
|
||||
if( !selector.isEmpty() && selector.charAt( 0 ) == '#' )
|
||||
{
|
||||
selector = selector.substring( 1 );
|
||||
|
||||
@ -69,12 +71,12 @@ final class ComputerSelector
|
||||
|
||||
return getComputers( x -> x.getID() == id );
|
||||
}
|
||||
else if( selector.length() > 0 && selector.charAt( 0 ) == '@' )
|
||||
else if( !selector.isEmpty() && selector.charAt( 0 ) == '@' )
|
||||
{
|
||||
String label = selector.substring( 1 );
|
||||
return getComputers( x -> Objects.equals( label, x.getLabel() ) );
|
||||
}
|
||||
else if( selector.length() > 0 && selector.charAt( 0 ) == '~' )
|
||||
else if( !selector.isEmpty() && selector.charAt( 0 ) == '~' )
|
||||
{
|
||||
String familyName = selector.substring( 1 );
|
||||
return getComputers( x -> x.getFamily().name().equalsIgnoreCase( familyName ) );
|
||||
@ -103,7 +105,7 @@ final class ComputerSelector
|
||||
// We copy it to prevent concurrent modifications.
|
||||
List<ServerComputer> computers = Lists.newArrayList( ComputerCraft.serverComputerRegistry.getComputers() );
|
||||
|
||||
if( selector.length() > 0 && selector.charAt( 0 ) == '#' )
|
||||
if( !selector.isEmpty() && selector.charAt( 0 ) == '#' )
|
||||
{
|
||||
selector = selector.substring( 1 );
|
||||
|
||||
@ -113,7 +115,7 @@ final class ComputerSelector
|
||||
if( id.startsWith( selector ) ) options.add( "#" + id );
|
||||
}
|
||||
}
|
||||
else if( selector.length() > 0 && selector.charAt( 0 ) == '@' )
|
||||
else if( !selector.isEmpty() && selector.charAt( 0 ) == '@' )
|
||||
{
|
||||
String label = selector.substring( 1 );
|
||||
for( ServerComputer computer : computers )
|
||||
@ -122,7 +124,7 @@ final class ComputerSelector
|
||||
if( thisLabel != null && thisLabel.startsWith( label ) ) options.add( "@" + thisLabel );
|
||||
}
|
||||
}
|
||||
else if( selector.length() > 0 && selector.charAt( 0 ) == '~' )
|
||||
else if( !selector.isEmpty() && selector.charAt( 0 ) == '~' )
|
||||
{
|
||||
String familyName = selector.substring( 1 ).toLowerCase( Locale.ENGLISH );
|
||||
for( ComputerFamily family : ComputerFamily.values() )
|
||||
|
@ -30,7 +30,7 @@ public final class CommandContext
|
||||
{
|
||||
this.server = server;
|
||||
this.sender = sender;
|
||||
this.path = Collections.singletonList( initial );
|
||||
path = Collections.singletonList( initial );
|
||||
}
|
||||
|
||||
private CommandContext( MinecraftServer server, ICommandSender sender, List<ISubCommand> path )
|
||||
|
@ -20,7 +20,7 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* {@link net.minecraft.command.ICommand} which delegates to a {@link ISubCommand}.
|
||||
* {@link ICommand} which delegates to a {@link ISubCommand}.
|
||||
*/
|
||||
public class CommandDelegate implements ICommand
|
||||
{
|
||||
|
@ -105,7 +105,7 @@ public class CommandRoot implements ISubCommand
|
||||
@Override
|
||||
public void execute( @Nonnull CommandContext context, @Nonnull List<String> arguments ) throws CommandException
|
||||
{
|
||||
if( arguments.size() == 0 )
|
||||
if( arguments.isEmpty() )
|
||||
{
|
||||
context.getSender().sendMessage( ChatHelpers.getHelp( context, this, context.getFullPath() ) );
|
||||
}
|
||||
@ -125,7 +125,7 @@ public class CommandRoot implements ISubCommand
|
||||
@Override
|
||||
public List<String> getCompletion( @Nonnull CommandContext context, @Nonnull List<String> arguments )
|
||||
{
|
||||
if( arguments.size() == 0 )
|
||||
if( arguments.isEmpty() )
|
||||
{
|
||||
return Lists.newArrayList( subCommands.keySet() );
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ public abstract class SubCommandBase implements ISubCommand
|
||||
protected SubCommandBase( String name, UserLevel level )
|
||||
{
|
||||
this.name = name;
|
||||
this.id = name.replace( '-', '_' );
|
||||
id = name.replace( '-', '_' );
|
||||
this.level = level;
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ class SubCommandHelp implements ISubCommand
|
||||
}
|
||||
}
|
||||
|
||||
if( arguments.size() == 0 )
|
||||
if( arguments.isEmpty() )
|
||||
{
|
||||
return Lists.newArrayList( command.getSubCommands().keySet() );
|
||||
}
|
||||
|
@ -23,6 +23,8 @@ public final class ChatHelpers
|
||||
private static final TextFormatting SYNOPSIS = TextFormatting.AQUA;
|
||||
private static final TextFormatting NAME = TextFormatting.GREEN;
|
||||
|
||||
private ChatHelpers() {}
|
||||
|
||||
public static ITextComponent coloured( String text, TextFormatting colour )
|
||||
{
|
||||
ITextComponent component = new TextComponentString( text == null ? "" : text );
|
||||
|
@ -31,14 +31,14 @@ public class TableBuilder
|
||||
if( id < 0 ) throw new IllegalArgumentException( "ID must be positive" );
|
||||
this.id = id;
|
||||
this.headers = headers;
|
||||
this.columns = headers.length;
|
||||
columns = headers.length;
|
||||
}
|
||||
|
||||
public TableBuilder( int id )
|
||||
{
|
||||
if( id < 0 ) throw new IllegalArgumentException( "ID must be positive" );
|
||||
this.id = id;
|
||||
this.headers = null;
|
||||
headers = null;
|
||||
}
|
||||
|
||||
public TableBuilder( int id, @Nonnull String... headers )
|
||||
@ -46,7 +46,7 @@ public class TableBuilder
|
||||
if( id < 0 ) throw new IllegalArgumentException( "ID must be positive" );
|
||||
this.id = id;
|
||||
this.headers = new ITextComponent[headers.length];
|
||||
this.columns = headers.length;
|
||||
columns = headers.length;
|
||||
|
||||
for( int i = 0; i < headers.length; i++ ) this.headers[i] = ChatHelpers.header( headers[i] );
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ public interface TableFormatter
|
||||
for( int i = 0; i < maxWidths.length - 1; i++ ) maxWidths[i] += padding;
|
||||
}
|
||||
|
||||
// And comput the total width
|
||||
// And compute the total width
|
||||
int totalWidth = (columns - 1) * getWidth( SEPARATOR );
|
||||
for( int x : maxWidths ) totalWidth += x;
|
||||
|
||||
|
@ -26,7 +26,7 @@ public abstract class BlockGeneric extends Block implements ITileEntityProvider
|
||||
protected BlockGeneric( Material material )
|
||||
{
|
||||
super( material );
|
||||
this.hasTileEntity = true;
|
||||
hasTileEntity = true;
|
||||
}
|
||||
|
||||
protected abstract TileGeneric createTile( IBlockState state );
|
||||
@ -108,11 +108,7 @@ public abstract class BlockGeneric extends Block implements ITileEntityProvider
|
||||
public boolean getBundledRedstoneConnectivity( World world, BlockPos pos, EnumFacing side )
|
||||
{
|
||||
TileEntity tile = world.getTileEntity( pos );
|
||||
if( tile instanceof TileGeneric )
|
||||
{
|
||||
return ((TileGeneric) tile).getBundledRedstoneConnectivity( side );
|
||||
}
|
||||
return false;
|
||||
return tile instanceof TileGeneric && ((TileGeneric) tile).getBundledRedstoneConnectivity( side );
|
||||
}
|
||||
|
||||
public int getBundledRedstoneOutput( World world, BlockPos pos, EnumFacing side )
|
||||
|
@ -7,10 +7,41 @@
|
||||
package dan200.computercraft.shared.common;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
public interface IColouredItem
|
||||
{
|
||||
int getColour( ItemStack stack );
|
||||
String NBT_COLOUR = "colour";
|
||||
|
||||
ItemStack withColour( ItemStack stack, int colour );
|
||||
default int getColour( ItemStack stack )
|
||||
{
|
||||
return getColourBasic( stack );
|
||||
}
|
||||
|
||||
default ItemStack withColour( ItemStack stack, int colour )
|
||||
{
|
||||
ItemStack copy = stack.copy();
|
||||
setColourBasic( copy, colour );
|
||||
return copy;
|
||||
}
|
||||
|
||||
static int getColourBasic( ItemStack stack )
|
||||
{
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
return tag != null && tag.hasKey( NBT_COLOUR ) ? tag.getInteger( NBT_COLOUR ) : -1;
|
||||
}
|
||||
|
||||
static void setColourBasic( ItemStack stack, int colour )
|
||||
{
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
if( colour == -1 )
|
||||
{
|
||||
if( tag != null ) tag.removeTag( NBT_COLOUR );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( tag == null ) stack.setTagCompound( tag = new NBTTagCompound() );
|
||||
tag.setInteger( NBT_COLOUR, colour );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ public abstract class TileGeneric extends TileEntity
|
||||
@Nullable
|
||||
public BlockGeneric getBlock()
|
||||
{
|
||||
Block block = getWorld().getBlockState( getPos() ).getBlock();
|
||||
Block block = getBlockType();
|
||||
return block instanceof BlockGeneric ? (BlockGeneric) block : null;
|
||||
}
|
||||
|
||||
@ -110,7 +110,7 @@ public abstract class TileGeneric extends TileEntity
|
||||
double range = getInteractRange( player );
|
||||
BlockPos pos = getPos();
|
||||
return player.getEntityWorld() == getWorld() &&
|
||||
player.getDistanceSq( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ) <= (range * range);
|
||||
player.getDistanceSq( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ) <= range * range;
|
||||
}
|
||||
|
||||
protected void writeDescription( @Nonnull NBTTagCompound nbt )
|
||||
|
@ -12,13 +12,16 @@ import dan200.computercraft.api.lua.ILuaAPI;
|
||||
import dan200.computercraft.api.lua.ILuaContext;
|
||||
import dan200.computercraft.api.lua.LuaException;
|
||||
import dan200.computercraft.shared.computer.blocks.TileCommandComputer;
|
||||
import dan200.computercraft.shared.util.NBTUtil;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.properties.IProperty;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.command.ICommand;
|
||||
import net.minecraft.command.ICommandManager;
|
||||
import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@ -62,7 +65,7 @@ public class CommandAPI implements ILuaAPI
|
||||
};
|
||||
}
|
||||
|
||||
private Map<Object, Object> createOutput( String output )
|
||||
private static Map<Object, Object> createOutput( String output )
|
||||
{
|
||||
Map<Object, Object> result = new HashMap<>( 1 );
|
||||
result.put( 1, output );
|
||||
@ -81,7 +84,7 @@ public class CommandAPI implements ILuaAPI
|
||||
sender.clearOutput();
|
||||
|
||||
int result = commandManager.executeCommand( sender, command );
|
||||
return new Object[] { (result > 0), sender.copyOutput() };
|
||||
return new Object[] { result > 0, sender.copyOutput() };
|
||||
}
|
||||
catch( Throwable t )
|
||||
{
|
||||
@ -89,7 +92,7 @@ public class CommandAPI implements ILuaAPI
|
||||
{
|
||||
ComputerCraft.log.error( "Error running command.", t );
|
||||
}
|
||||
return new Object[] { false, createOutput( "Java Exception Thrown: " + t.toString() ) };
|
||||
return new Object[] { false, createOutput( "Java Exception Thrown: " + t ) };
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -98,58 +101,54 @@ public class CommandAPI implements ILuaAPI
|
||||
}
|
||||
}
|
||||
|
||||
private Object getBlockInfo( World world, BlockPos pos )
|
||||
private static Object getBlockInfo( World world, BlockPos pos )
|
||||
{
|
||||
// Get the details of the block
|
||||
IBlockState state = world.getBlockState( pos );
|
||||
Block block = state.getBlock();
|
||||
String name = Block.REGISTRY.getNameForObject( block ).toString();
|
||||
int metadata = block.getMetaFromState( state );
|
||||
|
||||
Map<Object, Object> table = new HashMap<>();
|
||||
table.put( "name", name );
|
||||
table.put( "metadata", metadata );
|
||||
Map<Object, Object> table = new HashMap<>( 3 );
|
||||
table.put( "name", Block.REGISTRY.getNameForObject( block ).toString() );
|
||||
table.put( "metadata", block.getMetaFromState( state ) );
|
||||
|
||||
Map<Object, Object> stateTable = new HashMap<>();
|
||||
for( ImmutableMap.Entry<IProperty<?>, Comparable<?>> entry : state.getActualState( world, pos ).getProperties().entrySet() )
|
||||
{
|
||||
String propertyName = entry.getKey().getName();
|
||||
Object value = entry.getValue();
|
||||
if( value instanceof String || value instanceof Number || value instanceof Boolean )
|
||||
{
|
||||
stateTable.put( propertyName, value );
|
||||
}
|
||||
else
|
||||
{
|
||||
stateTable.put( propertyName, value.toString() );
|
||||
}
|
||||
IProperty<?> property = entry.getKey();
|
||||
stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) );
|
||||
}
|
||||
table.put( "state", stateTable );
|
||||
// TODO: NBT data?
|
||||
|
||||
TileEntity tile = world.getTileEntity( pos );
|
||||
if( tile != null ) table.put( "nbt", NBTUtil.toLua( tile.writeToNBT( new NBTTagCompound() ).copy() ) );
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
@SuppressWarnings( { "unchecked", "rawtypes" } )
|
||||
private static Object getPropertyValue( IProperty property, Comparable value )
|
||||
{
|
||||
if( value instanceof String || value instanceof Number || value instanceof Boolean ) return value;
|
||||
return property.getName( value );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] callMethod( @Nonnull ILuaContext context, int method, @Nonnull Object[] arguments ) throws LuaException, InterruptedException
|
||||
{
|
||||
switch( method )
|
||||
{
|
||||
case 0:
|
||||
case 0: // exec
|
||||
{
|
||||
// exec
|
||||
final String command = getString( arguments, 0 );
|
||||
return context.executeMainThreadTask( () -> doCommand( command ) );
|
||||
}
|
||||
case 1:
|
||||
case 1: // execAsync
|
||||
{
|
||||
// execAsync
|
||||
final String command = getString( arguments, 0 );
|
||||
long taskID = context.issueMainThreadTask( () -> doCommand( command ) );
|
||||
return new Object[] { taskID };
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
// list
|
||||
case 2: // list
|
||||
return context.executeMainThreadTask( () ->
|
||||
{
|
||||
int i = 1;
|
||||
@ -158,7 +157,7 @@ public class CommandAPI implements ILuaAPI
|
||||
if( server != null )
|
||||
{
|
||||
ICommandManager commandManager = server.getCommandManager();
|
||||
ICommandSender commmandSender = m_computer.getCommandSender();
|
||||
ICommandSender commandSender = m_computer.getCommandSender();
|
||||
Map<String, ICommand> commands = commandManager.getCommands();
|
||||
for( Map.Entry<String, ICommand> entry : commands.entrySet() )
|
||||
{
|
||||
@ -166,7 +165,7 @@ public class CommandAPI implements ILuaAPI
|
||||
ICommand command = entry.getValue();
|
||||
try
|
||||
{
|
||||
if( command.checkPermission( server, commmandSender ) )
|
||||
if( command.checkPermission( server, commandSender ) )
|
||||
{
|
||||
result.put( i++, name );
|
||||
}
|
||||
@ -183,10 +182,8 @@ public class CommandAPI implements ILuaAPI
|
||||
}
|
||||
return new Object[] { result };
|
||||
} );
|
||||
}
|
||||
case 3:
|
||||
case 3: // getBlockPosition
|
||||
{
|
||||
// getBlockPosition
|
||||
// This is probably safe to do on the Lua thread. Probably.
|
||||
BlockPos pos = m_computer.getPos();
|
||||
return new Object[] { pos.getX(), pos.getY(), pos.getZ() };
|
||||
@ -194,25 +191,25 @@ public class CommandAPI implements ILuaAPI
|
||||
case 4:
|
||||
{
|
||||
// getBlockInfos
|
||||
final int minx = getInt( arguments, 0 );
|
||||
final int miny = getInt( arguments, 1 );
|
||||
final int minz = getInt( arguments, 2 );
|
||||
final int maxx = getInt( arguments, 3 );
|
||||
final int maxy = getInt( arguments, 4 );
|
||||
final int maxz = getInt( arguments, 5 );
|
||||
final int minX = getInt( arguments, 0 );
|
||||
final int minY = getInt( arguments, 1 );
|
||||
final int minZ = getInt( arguments, 2 );
|
||||
final int maxX = getInt( arguments, 3 );
|
||||
final int maxY = getInt( arguments, 4 );
|
||||
final int maxZ = getInt( arguments, 5 );
|
||||
return context.executeMainThreadTask( () ->
|
||||
{
|
||||
// Get the details of the block
|
||||
World world = m_computer.getWorld();
|
||||
BlockPos min = new BlockPos(
|
||||
Math.min( minx, maxx ),
|
||||
Math.min( miny, maxy ),
|
||||
Math.min( minz, maxz )
|
||||
Math.min( minX, maxX ),
|
||||
Math.min( minY, maxY ),
|
||||
Math.min( minZ, maxZ )
|
||||
);
|
||||
BlockPos max = new BlockPos(
|
||||
Math.max( minx, maxx ),
|
||||
Math.max( miny, maxy ),
|
||||
Math.max( minz, maxz )
|
||||
Math.max( minX, maxX ),
|
||||
Math.max( minY, maxY ),
|
||||
Math.max( minZ, maxZ )
|
||||
);
|
||||
if( !world.isValid( min ) || !world.isValid( max ) )
|
||||
{
|
||||
|
@ -26,7 +26,7 @@ public class BlockCommandComputer extends BlockComputerBase
|
||||
{
|
||||
// Statics
|
||||
|
||||
public static class Properties
|
||||
public static final class Properties
|
||||
{
|
||||
public static final PropertyDirection FACING = PropertyDirection.create( "facing", EnumFacing.Plane.HORIZONTAL );
|
||||
public static final PropertyEnum<ComputerState> STATE = PropertyEnum.create( "state", ComputerState.class );
|
||||
@ -41,7 +41,7 @@ public class BlockCommandComputer extends BlockComputerBase
|
||||
setResistance( 6000000.0F );
|
||||
setTranslationKey( "computercraft:command_computer" );
|
||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||
setDefaultState( this.blockState.getBaseState()
|
||||
setDefaultState( blockState.getBaseState()
|
||||
.withProperty( Properties.FACING, EnumFacing.NORTH )
|
||||
.withProperty( Properties.STATE, ComputerState.Off )
|
||||
);
|
||||
|
@ -26,7 +26,7 @@ import javax.annotation.Nonnull;
|
||||
public class BlockComputer extends BlockComputerBase
|
||||
{
|
||||
// Statics
|
||||
public static class Properties
|
||||
public static final class Properties
|
||||
{
|
||||
public static final PropertyDirection FACING = PropertyDirection.create( "facing", EnumFacing.Plane.HORIZONTAL );
|
||||
public static final PropertyBool ADVANCED = PropertyBool.create( "advanced" );
|
||||
@ -41,7 +41,7 @@ public class BlockComputer extends BlockComputerBase
|
||||
setHardness( 2.0f );
|
||||
setTranslationKey( "computercraft:computer" );
|
||||
setCreativeTab( ComputerCraft.mainCreativeTab );
|
||||
setDefaultState( this.blockState.getBaseState()
|
||||
setDefaultState( blockState.getBaseState()
|
||||
.withProperty( Properties.FACING, EnumFacing.NORTH )
|
||||
.withProperty( Properties.ADVANCED, false )
|
||||
.withProperty( Properties.STATE, ComputerState.Off )
|
||||
|
@ -12,8 +12,7 @@ import dan200.computercraft.api.peripheral.IPeripheral;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
public class ComputerPeripheral
|
||||
implements IPeripheral
|
||||
public class ComputerPeripheral implements IPeripheral
|
||||
{
|
||||
private final String m_type;
|
||||
private final ComputerProxy m_computer;
|
||||
@ -52,50 +51,30 @@ public class ComputerPeripheral
|
||||
{
|
||||
switch( method )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
// turnOn
|
||||
case 0: // turnOn
|
||||
m_computer.turnOn();
|
||||
return null;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
// shutdown
|
||||
case 1: // shutdown
|
||||
m_computer.shutdown();
|
||||
return null;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
// reboot
|
||||
case 2: // reboot
|
||||
m_computer.reboot();
|
||||
return null;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
// getID
|
||||
return new Object[] {
|
||||
m_computer.assignID()
|
||||
};
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
// isOn
|
||||
case 3: // getID
|
||||
return new Object[] { m_computer.assignID() };
|
||||
case 4: // isOn
|
||||
return new Object[] { m_computer.isOn() };
|
||||
}
|
||||
case 5:
|
||||
// getLabel
|
||||
case 5: // getLabel
|
||||
return new Object[] { m_computer.getLabel() };
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals( IPeripheral other )
|
||||
{
|
||||
return (other != null && other.getClass() == this.getClass());
|
||||
return other != null && other.getClass() == getClass();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@ -21,24 +21,24 @@ public enum ComputerState implements IStringSerializable
|
||||
// TODO: Move to dan200.computercraft.shared.computer.core in the future. We can't do it now
|
||||
// as Plethora depends on it.
|
||||
|
||||
private String m_name;
|
||||
private final String name;
|
||||
|
||||
ComputerState( String name )
|
||||
{
|
||||
m_name = name;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getName()
|
||||
{
|
||||
return m_name;
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getName();
|
||||
return name;
|
||||
}
|
||||
|
||||
public static ComputerState valueOf( int ordinal )
|
||||
|
@ -78,7 +78,7 @@ public class TileCommandComputer extends TileComputer
|
||||
@Override
|
||||
public BlockPos getPosition()
|
||||
{
|
||||
return TileCommandComputer.this.getPos();
|
||||
return getPos();
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@ -93,13 +93,13 @@ public class TileCommandComputer extends TileComputer
|
||||
@Override
|
||||
public World getEntityWorld()
|
||||
{
|
||||
return TileCommandComputer.this.getWorld();
|
||||
return getWorld();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MinecraftServer getServer()
|
||||
{
|
||||
return TileCommandComputer.this.getWorld().getMinecraftServer();
|
||||
return getWorld().getMinecraftServer();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -113,7 +113,7 @@ public class TileComputer extends TileComputerBase
|
||||
}
|
||||
|
||||
// For legacy reasons, computers invert the meaning of "left" and "right"
|
||||
private static final int[] s_remapSide = { 0, 1, 2, 3, 5, 4 };
|
||||
private static final int[] s_remapSide = new int[] { 0, 1, 2, 3, 5, 4 };
|
||||
|
||||
@Override
|
||||
protected int remapLocalSide( int localSide )
|
||||
|
@ -28,12 +28,16 @@ import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.ITickable;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
import net.minecraft.util.text.TextComponentTranslation;
|
||||
import net.minecraft.world.IWorldNameable;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class TileComputerBase extends TileGeneric implements IComputerTile, IDirectionalTile, ITickable, IPeripheralTile
|
||||
public abstract class TileComputerBase extends TileGeneric implements IComputerTile, IDirectionalTile, ITickable, IPeripheralTile, IWorldNameable
|
||||
{
|
||||
private int m_instanceID = -1;
|
||||
private int m_computerID = -1;
|
||||
@ -46,11 +50,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
public BlockComputerBase getBlock()
|
||||
{
|
||||
Block block = super.getBlock();
|
||||
if( block instanceof BlockComputerBase )
|
||||
{
|
||||
return (BlockComputerBase) block;
|
||||
}
|
||||
return null;
|
||||
return block instanceof BlockComputerBase ? (BlockComputerBase) block : null;
|
||||
}
|
||||
|
||||
protected void unload()
|
||||
@ -95,29 +95,16 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean onDefaultComputerInteract( EntityPlayer player )
|
||||
{
|
||||
if( !getWorld().isRemote )
|
||||
{
|
||||
if( isUsable( player, false ) )
|
||||
{
|
||||
createServerComputer().turnOn();
|
||||
openGUI( player );
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActivate( EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ )
|
||||
{
|
||||
ItemStack currentItem = player.getHeldItem( hand );
|
||||
if( !currentItem.isEmpty() && currentItem.getItem() == Items.NAME_TAG && canNameWithTag( player ) )
|
||||
if( !currentItem.isEmpty() && currentItem.getItem() == Items.NAME_TAG && canNameWithTag( player ) && currentItem.hasDisplayName() )
|
||||
{
|
||||
// Label to rename computer
|
||||
if( !getWorld().isRemote )
|
||||
{
|
||||
setLabel( currentItem.hasDisplayName() ? currentItem.getDisplayName() : null );
|
||||
setLabel( currentItem.getDisplayName() );
|
||||
currentItem.shrink( 1 );
|
||||
}
|
||||
return true;
|
||||
@ -125,7 +112,12 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
else if( !player.isSneaking() )
|
||||
{
|
||||
// Regular right click to activate computer
|
||||
return onDefaultComputerInteract( player );
|
||||
if( !getWorld().isRemote && isUsable( player, false ) )
|
||||
{
|
||||
createServerComputer().turnOn();
|
||||
openGUI( player );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -201,10 +193,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
m_startOn = false;
|
||||
}
|
||||
computer.keepAlive();
|
||||
if( computer.hasOutputChanged() )
|
||||
{
|
||||
updateOutput();
|
||||
}
|
||||
if( computer.hasOutputChanged() ) updateOutput();
|
||||
m_fresh = false;
|
||||
m_computerID = computer.getID();
|
||||
m_label = computer.getLabel();
|
||||
@ -214,13 +203,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
else
|
||||
{
|
||||
ClientComputer computer = createClientComputer();
|
||||
if( computer != null )
|
||||
{
|
||||
if( computer.hasOutputChanged() )
|
||||
{
|
||||
updateBlock();
|
||||
}
|
||||
}
|
||||
if( computer != null && computer.hasOutputChanged() ) updateBlock();
|
||||
}
|
||||
}
|
||||
|
||||
@ -310,10 +293,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
|
||||
public void updateInput()
|
||||
{
|
||||
if( getWorld() == null || getWorld().isRemote )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if( getWorld() == null || getWorld().isRemote ) return;
|
||||
|
||||
// Update redstone and peripherals
|
||||
ServerComputer computer = getServerComputer();
|
||||
@ -329,10 +309,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
|
||||
public void updateInput( BlockPos neighbour )
|
||||
{
|
||||
if( getWorld() == null || getWorld().isRemote )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if( getWorld() == null || getWorld().isRemote ) return;
|
||||
|
||||
ServerComputer computer = getServerComputer();
|
||||
if( computer != null )
|
||||
@ -505,4 +482,25 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
|
||||
{
|
||||
return new ComputerPeripheral( "computer", createProxy() );
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getName()
|
||||
{
|
||||
String label = getLabel();
|
||||
return label != null && !label.isEmpty() ? label : getBlockType().getTranslationKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomName()
|
||||
{
|
||||
return getLabel() != null;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public ITextComponent getDisplayName()
|
||||
{
|
||||
return hasCustomName() ? new TextComponentString( getName() ) : new TextComponentTranslation( getName() );
|
||||
}
|
||||
}
|
||||
|
@ -74,6 +74,6 @@ public class ComputerRegistry<TComputer extends IComputer>
|
||||
{
|
||||
m_computers.clear();
|
||||
m_nextUnusedInstanceID = 0;
|
||||
m_sessionID = (new Random().nextInt());
|
||||
m_sessionID = new Random().nextInt();
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
package dan200.computercraft.shared.computer.core;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface IComputerContainer
|
||||
{
|
||||
IComputer getComputer();
|
||||
|
@ -13,6 +13,7 @@ import javax.annotation.Nullable;
|
||||
* An instance of {@link net.minecraft.inventory.Container} which provides a computer. You should implement this
|
||||
* if you provide custom computers/GUIs to interact with them.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface IContainerComputer
|
||||
{
|
||||
/**
|
||||
|
@ -376,7 +376,8 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput
|
||||
Container container = player.openContainer;
|
||||
if( !(container instanceof IContainerComputer) ) return null;
|
||||
|
||||
return (IContainerComputer) container;
|
||||
IContainerComputer computerContainer = (IContainerComputer) container;
|
||||
return computerContainer.getComputer() != this ? null : computerContainer;
|
||||
}
|
||||
|
||||
protected boolean isInteracting( EntityPlayer player )
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user