mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-03 23:22:59 +00:00 
			
		
		
		
	Compare commits
	
		
			33 Commits
		
	
	
		
			v1.15.2-1.
			...
			v1.16.4-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1edb7288b9 | ||
| 
						 | 
					4af5bcc0b0 | ||
| 
						 | 
					96c577482d | ||
| 
						 | 
					61f8e97f6b | ||
| 
						 | 
					c92f06cfd9 | ||
| 
						 | 
					c9f3d315c0 | ||
| 
						 | 
					83df64e520 | ||
| 
						 | 
					ab232bd689 | ||
| 
						 | 
					5bf367af9f | ||
| 
						 | 
					4766833cf2 | ||
| 
						 | 
					71563a52ff | ||
| 
						 | 
					0c6e7b5db5 | ||
| 
						 | 
					72c1d451fe | ||
| 
						 | 
					8b4a01df27 | ||
| 
						 | 
					d0a973fa46 | ||
| 
						 | 
					26c12ac1a9 | ||
| 
						 | 
					2c67849b35 | ||
| 
						 | 
					7809a2eddd | ||
| 
						 | 
					e8e9294fdf | ||
| 
						 | 
					99581e1f40 | ||
| 
						 | 
					29646a7f61 | ||
| 
						 | 
					50d2712581 | ||
| 
						 | 
					3093f882d8 | ||
| 
						 | 
					e5cf0d1c61 | ||
| 
						 | 
					6b102a8142 | ||
| 
						 | 
					c8a6888a2f | ||
| 
						 | 
					9ce33f8a3f | ||
| 
						 | 
					a1dcd59d95 | ||
| 
						 | 
					2a17585702 | ||
| 
						 | 
					087c305b0d | ||
| 
						 | 
					31764f6d65 | ||
| 
						 | 
					4efde2b294 | ||
| 
						 | 
					46595e73df | 
@@ -106,10 +106,10 @@ dependencies {
 | 
			
		||||
 | 
			
		||||
    minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}"
 | 
			
		||||
 | 
			
		||||
    compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3:api")
 | 
			
		||||
    compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.15.2:6.0.0.9")
 | 
			
		||||
    compileOnly fg.deobf("mezz.jei:jei-1.16.4:7.6.0.58:api")
 | 
			
		||||
    compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.16.4:7.0.0.63")
 | 
			
		||||
 | 
			
		||||
    runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3")
 | 
			
		||||
    runtimeOnly fg.deobf("mezz.jei:jei-1.16.4:7.6.0.58")
 | 
			
		||||
 | 
			
		||||
    compileOnly 'com.google.auto.service:auto-service:1.0-rc7'
 | 
			
		||||
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,6 @@
 | 
			
		||||
mod_version=1.95.1
 | 
			
		||||
 | 
			
		||||
# Minecraft properties (update mods.toml when changing)
 | 
			
		||||
mc_version=1.15.2
 | 
			
		||||
forge_version=31.1.41
 | 
			
		||||
mappings_version=20200429-1.15.1
 | 
			
		||||
mc_version=1.16.4
 | 
			
		||||
forge_version=35.0.1
 | 
			
		||||
mappings_version=20201028-1.16.3
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								src/generated/resources/data/minecraft/tags/items/piglin_loved.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/generated/resources/data/minecraft/tags/items/piglin_loved.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
{
 | 
			
		||||
  "replace": false,
 | 
			
		||||
  "values": [
 | 
			
		||||
    "computercraft:computer_advanced",
 | 
			
		||||
    "computercraft:turtle_advanced",
 | 
			
		||||
    "computercraft:wireless_modem_advanced",
 | 
			
		||||
    "computercraft:pocket_computer_advanced",
 | 
			
		||||
    "computercraft:monitor_advanced"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -54,7 +54,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
 | 
			
		||||
    public static InputStream getResourceFile( String domain, String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
        IReloadableResourceManager manager = (IReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().getResourceManager();
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
 | 
			
		||||
@@ -97,7 +97,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
 | 
			
		||||
    @Override
 | 
			
		||||
    public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
 | 
			
		||||
    {
 | 
			
		||||
        IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager();
 | 
			
		||||
        IReloadableResourceManager manager = (IReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().getResourceManager();
 | 
			
		||||
        ResourceMount mount = ResourceMount.get( domain, subPath, manager );
 | 
			
		||||
        return mount.exists( "" ) ? mount : null;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,11 +6,11 @@
 | 
			
		||||
package dan200.computercraft.api.client;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelManager;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.math.vector.TransformationMatrix;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -29,7 +29,7 @@ public interface IPacketReceiver
 | 
			
		||||
     * @return The receiver's position.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Vec3d getPosition();
 | 
			
		||||
    Vector3d getPosition();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the maximum distance this receiver can send and receive messages.
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.api.network;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -29,7 +29,7 @@ public interface IPacketSender
 | 
			
		||||
     * @return The sender's position.
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Vec3d getPosition();
 | 
			
		||||
    Vector3d getPosition();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get some sort of identification string for this sender. This does not strictly need to be unique, but you
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import net.minecraft.inventory.IInventory;
 | 
			
		||||
import net.minecraft.nbt.CompoundNBT;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.items.IItemHandlerModifiable;
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +67,7 @@ public interface ITurtleAccess
 | 
			
		||||
     * @see #getVisualYaw(float)
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    Vec3d getVisualPosition( float f );
 | 
			
		||||
    Vector3d getVisualPosition( float f );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the yaw the turtle is facing when it is rendered.
 | 
			
		||||
 
 | 
			
		||||
@@ -12,20 +12,18 @@ import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.gui.FontRenderer;
 | 
			
		||||
import net.minecraft.client.gui.NewChatGui;
 | 
			
		||||
import net.minecraft.client.gui.RenderComponentsUtil;
 | 
			
		||||
import net.minecraft.util.math.MathHelper;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.TextFormatting;
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class ClientTableFormatter implements TableFormatter
 | 
			
		||||
{
 | 
			
		||||
    public static final ClientTableFormatter INSTANCE = new ClientTableFormatter();
 | 
			
		||||
 | 
			
		||||
    private static Int2IntOpenHashMap lastHeights = new Int2IntOpenHashMap();
 | 
			
		||||
    private static final Int2IntOpenHashMap lastHeights = new Int2IntOpenHashMap();
 | 
			
		||||
 | 
			
		||||
    private static FontRenderer renderer()
 | 
			
		||||
    {
 | 
			
		||||
@@ -57,7 +55,7 @@ public class ClientTableFormatter implements TableFormatter
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getWidth( ITextComponent component )
 | 
			
		||||
    {
 | 
			
		||||
        return renderer().getStringWidth( component.getFormattedText() );
 | 
			
		||||
        return renderer().getStringPropertyWidth( component );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -66,10 +64,11 @@ public class ClientTableFormatter implements TableFormatter
 | 
			
		||||
        Minecraft mc = Minecraft.getInstance();
 | 
			
		||||
        NewChatGui chat = mc.ingameGUI.getChatGUI();
 | 
			
		||||
 | 
			
		||||
        // Trim the text if it goes over the allowed length
 | 
			
		||||
        int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() );
 | 
			
		||||
        List<ITextComponent> list = RenderComponentsUtil.splitText( component, maxWidth, mc.fontRenderer, false, false );
 | 
			
		||||
        if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id );
 | 
			
		||||
        // TODO: Trim the text if it goes over the allowed length
 | 
			
		||||
        // int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() );
 | 
			
		||||
        // List<ITextProperties> list = RenderComponentsUtil.func_238505_a_( component, maxWidth, mc.fontRenderer );
 | 
			
		||||
        // if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id );
 | 
			
		||||
        chat.printChatMessageWithOptionalDeletion( component, id );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -13,10 +13,14 @@ import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.*;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.RenderState;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexFormat;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.TransformationMatrix;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.gui.widgets.WidgetTerminal;
 | 
			
		||||
@@ -21,6 +22,8 @@ import net.minecraft.entity.player.PlayerInventory;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import org.lwjgl.glfw.GLFW;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER;
 | 
			
		||||
import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN;
 | 
			
		||||
 | 
			
		||||
@@ -88,13 +91,13 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
 | 
			
		||||
        terminalWrapper = new WidgetWrapper( terminal, MARGIN + BORDER + guiLeft, MARGIN + BORDER + guiTop, termPxWidth, termPxHeight );
 | 
			
		||||
 | 
			
		||||
        children.add( terminalWrapper );
 | 
			
		||||
        setFocused( terminalWrapper );
 | 
			
		||||
        setListener( terminalWrapper );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removed()
 | 
			
		||||
    public void onClose()
 | 
			
		||||
    {
 | 
			
		||||
        super.removed();
 | 
			
		||||
        super.onClose();
 | 
			
		||||
        children.remove( terminal );
 | 
			
		||||
        terminal = null;
 | 
			
		||||
        minecraft.keyboardListener.enableRepeatEvents( false );
 | 
			
		||||
@@ -111,16 +114,16 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
 | 
			
		||||
    public boolean keyPressed( int key, int scancode, int modifiers )
 | 
			
		||||
    {
 | 
			
		||||
        // Forward the tab key to the terminal, rather than moving between controls.
 | 
			
		||||
        if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminalWrapper )
 | 
			
		||||
        if( key == GLFW.GLFW_KEY_TAB && getListener() != null && getListener() == terminalWrapper )
 | 
			
		||||
        {
 | 
			
		||||
            return getFocused().keyPressed( key, scancode, modifiers );
 | 
			
		||||
            return getListener().keyPressed( key, scancode, modifiers );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return super.keyPressed( key, scancode, modifiers );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    public void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack stack, float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw terminal
 | 
			
		||||
        terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
 | 
			
		||||
@@ -135,17 +138,22 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    {
 | 
			
		||||
        renderBackground();
 | 
			
		||||
        super.render( mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredToolTip( mouseX, mouseY );
 | 
			
		||||
        super.render( stack, mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredTooltip( stack, mouseX, mouseY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY )
 | 
			
		||||
    {
 | 
			
		||||
        return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY ))
 | 
			
		||||
        return (getListener() != null && getListener().mouseDragged( x, y, button, deltaX, deltaY ))
 | 
			
		||||
            || super.mouseDragged( x, y, button, deltaX, deltaY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerForegroundLayer( @Nonnull MatrixStack transform, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Skip rendering labels.
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive;
 | 
			
		||||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
 | 
			
		||||
@@ -12,6 +13,8 @@ import net.minecraft.entity.player.PlayerInventory;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
 | 
			
		||||
{
 | 
			
		||||
    private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/disk_drive.png" );
 | 
			
		||||
@@ -22,26 +25,18 @@ public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        String title = this.title.getFormattedText();
 | 
			
		||||
        font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 );
 | 
			
		||||
        font.drawString( title, 8, ySize - 96 + 2, 0x404040 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( BACKGROUND );
 | 
			
		||||
        blit( guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
        blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    {
 | 
			
		||||
        renderBackground();
 | 
			
		||||
        super.render( mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredToolTip( mouseX, mouseY );
 | 
			
		||||
        renderBackground( transform );
 | 
			
		||||
        super.render( transform, mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredTooltip( transform, mouseX, mouseY );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,14 +5,16 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.printer.ContainerPrinter;
 | 
			
		||||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
 | 
			
		||||
import net.minecraft.client.resources.I18n;
 | 
			
		||||
import net.minecraft.entity.player.PlayerInventory;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
public class GuiPrinter extends ContainerScreen<ContainerPrinter>
 | 
			
		||||
{
 | 
			
		||||
    private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/printer.png" );
 | 
			
		||||
@@ -22,29 +24,29 @@ public class GuiPrinter extends ContainerScreen<ContainerPrinter>
 | 
			
		||||
        super( container, player, title );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    /*@Override
 | 
			
		||||
    protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        String title = getTitle().getFormattedText();
 | 
			
		||||
        font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 );
 | 
			
		||||
        font.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 );
 | 
			
		||||
    }
 | 
			
		||||
    }*/
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( BACKGROUND );
 | 
			
		||||
        blit( guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
        blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
 | 
			
		||||
        if( getContainer().isPrinting() ) blit( guiLeft + 34, guiTop + 21, 176, 0, 25, 45 );
 | 
			
		||||
        if( getContainer().isPrinting() ) blit( transform, guiLeft + 34, guiTop + 21, 176, 0, 25, 45 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    {
 | 
			
		||||
        renderBackground();
 | 
			
		||||
        super.render( mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredToolTip( mouseX, mouseY );
 | 
			
		||||
        renderBackground( stack );
 | 
			
		||||
        super.render( stack, mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredTooltip( stack, mouseX, mouseY );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.common.ContainerHeldItem;
 | 
			
		||||
@@ -12,18 +13,17 @@ import dan200.computercraft.shared.media.items.ItemPrintout;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.entity.player.PlayerInventory;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import org.lwjgl.glfw.GLFW;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.client.render.PrintoutRenderer.*;
 | 
			
		||||
 | 
			
		||||
public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
 | 
			
		||||
{
 | 
			
		||||
    private static final Matrix4f IDENTITY = TransformationMatrix.identity().getMatrix();
 | 
			
		||||
 | 
			
		||||
    private final boolean m_book;
 | 
			
		||||
    private final int m_pages;
 | 
			
		||||
    private final TextBuffer[] m_text;
 | 
			
		||||
@@ -91,27 +91,33 @@ public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw the printout
 | 
			
		||||
        RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
 | 
			
		||||
        RenderSystem.enableDepthTest();
 | 
			
		||||
 | 
			
		||||
        IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
 | 
			
		||||
        drawBorder( IDENTITY, renderer, guiLeft, guiTop, getBlitOffset(), m_page, m_pages, m_book );
 | 
			
		||||
        drawText( IDENTITY, renderer, guiLeft + X_TEXT_MARGIN, guiTop + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours );
 | 
			
		||||
        Matrix4f matrix = transform.getLast().getMatrix();
 | 
			
		||||
        drawBorder( matrix, renderer, guiLeft, guiTop, getBlitOffset(), m_page, m_pages, m_book );
 | 
			
		||||
        drawText( matrix, renderer, guiLeft + X_TEXT_MARGIN, guiTop + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours );
 | 
			
		||||
        renderer.finish();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    {
 | 
			
		||||
        // We must take the background further back in order to not overlap with our printed pages.
 | 
			
		||||
        setBlitOffset( getBlitOffset() - 1 );
 | 
			
		||||
        renderBackground();
 | 
			
		||||
        renderBackground( stack );
 | 
			
		||||
        setBlitOffset( getBlitOffset() + 1 );
 | 
			
		||||
 | 
			
		||||
        super.render( mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredToolTip( mouseX, mouseY );
 | 
			
		||||
        super.render( stack, mouseX, mouseY, partialTicks );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerForegroundLayer( @Nonnull MatrixStack transform, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Skip rendering labels.
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.gui.widgets.WidgetTerminal;
 | 
			
		||||
@@ -18,6 +19,8 @@ import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import org.lwjgl.glfw.GLFW;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
public class GuiTurtle extends ContainerScreen<ContainerTurtle>
 | 
			
		||||
{
 | 
			
		||||
    private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( "computercraft", "textures/gui/turtle_normal.png" );
 | 
			
		||||
@@ -61,13 +64,13 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
 | 
			
		||||
        terminalWrapper = new WidgetWrapper( terminal, 2 + 8 + guiLeft, 2 + 8 + guiTop, termPxWidth, termPxHeight );
 | 
			
		||||
 | 
			
		||||
        children.add( terminalWrapper );
 | 
			
		||||
        setFocused( terminalWrapper );
 | 
			
		||||
        setListener( terminalWrapper );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removed()
 | 
			
		||||
    public void onClose()
 | 
			
		||||
    {
 | 
			
		||||
        super.removed();
 | 
			
		||||
        super.onClose();
 | 
			
		||||
        children.remove( terminal );
 | 
			
		||||
        terminal = null;
 | 
			
		||||
        minecraft.keyboardListener.enableRepeatEvents( false );
 | 
			
		||||
@@ -84,55 +87,58 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
 | 
			
		||||
    public boolean keyPressed( int key, int scancode, int modifiers )
 | 
			
		||||
    {
 | 
			
		||||
        // Forward the tab key to the terminal, rather than moving between controls.
 | 
			
		||||
        if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminalWrapper )
 | 
			
		||||
        if( key == GLFW.GLFW_KEY_TAB && getListener() != null && getListener() == terminalWrapper )
 | 
			
		||||
        {
 | 
			
		||||
            return getFocused().keyPressed( key, scancode, modifiers );
 | 
			
		||||
            return getListener().keyPressed( key, scancode, modifiers );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return super.keyPressed( key, scancode, modifiers );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void drawSelectionSlot( boolean advanced )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw selection slot
 | 
			
		||||
        int slot = m_container.getSelectedSlot();
 | 
			
		||||
        if( slot >= 0 )
 | 
			
		||||
        {
 | 
			
		||||
            RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
            int slotX = slot % 4;
 | 
			
		||||
            int slotY = slot / 4;
 | 
			
		||||
            minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
 | 
			
		||||
            blit( guiLeft + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, guiTop + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, 0, 217, 24, 24 );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    protected void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Draw term
 | 
			
		||||
        boolean advanced = m_family == ComputerFamily.ADVANCED;
 | 
			
		||||
        ResourceLocation texture = m_family == ComputerFamily.ADVANCED ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL;
 | 
			
		||||
        terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
 | 
			
		||||
 | 
			
		||||
        // Draw border/inventory
 | 
			
		||||
        RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
 | 
			
		||||
        blit( guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
        minecraft.getTextureManager().bindTexture( texture );
 | 
			
		||||
        blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
 | 
			
		||||
 | 
			
		||||
        drawSelectionSlot( advanced );
 | 
			
		||||
        // Draw selection slot
 | 
			
		||||
        int slot = m_container.getSelectedSlot();
 | 
			
		||||
        if( slot >= 0 )
 | 
			
		||||
        {
 | 
			
		||||
            int slotX = slot % 4;
 | 
			
		||||
            int slotY = slot / 4;
 | 
			
		||||
            blit( transform,
 | 
			
		||||
                guiLeft + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18,
 | 
			
		||||
                guiTop + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18,
 | 
			
		||||
                0, 217, 24, 24
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void render( int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
 | 
			
		||||
    {
 | 
			
		||||
        renderBackground();
 | 
			
		||||
        super.render( mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredToolTip( mouseX, mouseY );
 | 
			
		||||
        renderBackground( stack );
 | 
			
		||||
        super.render( stack, mouseX, mouseY, partialTicks );
 | 
			
		||||
        renderHoveredTooltip( stack, mouseX, mouseY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY )
 | 
			
		||||
    {
 | 
			
		||||
        return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY ))
 | 
			
		||||
        return (getListener() != null && getListener().mouseDragged( x, y, button, deltaX, deltaY ))
 | 
			
		||||
            || super.mouseDragged( x, y, button, deltaX, deltaY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void drawGuiContainerForegroundLayer( @Nonnull MatrixStack transform, int mouseX, int mouseY )
 | 
			
		||||
    {
 | 
			
		||||
        // Skip rendering labels.
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,13 +11,19 @@ import dan200.computercraft.client.render.TileEntityMonitorRenderer;
 | 
			
		||||
import dan200.computercraft.client.render.TileEntityTurtleRenderer;
 | 
			
		||||
import dan200.computercraft.client.render.TurtlePlayerRenderer;
 | 
			
		||||
import dan200.computercraft.shared.Registry;
 | 
			
		||||
import dan200.computercraft.shared.common.IColouredItem;
 | 
			
		||||
import dan200.computercraft.shared.computer.inventory.ContainerComputer;
 | 
			
		||||
import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.ClientMonitor;
 | 
			
		||||
import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 | 
			
		||||
import net.minecraft.client.gui.ScreenManager;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.client.renderer.RenderTypeLookup;
 | 
			
		||||
import net.minecraft.item.IItemPropertyGetter;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.ItemModelsProperties;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.event.world.WorldEvent;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
@@ -26,6 +32,8 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
 | 
			
		||||
 | 
			
		||||
import java.util.function.Supplier;
 | 
			
		||||
 | 
			
		||||
@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD )
 | 
			
		||||
public final class ComputerCraftProxyClient
 | 
			
		||||
{
 | 
			
		||||
@@ -49,6 +57,25 @@ public final class ComputerCraftProxyClient
 | 
			
		||||
        ClientRegistry.bindTileEntityRenderer( Registry.ModTiles.TURTLE_ADVANCED.get(), TileEntityTurtleRenderer::new );
 | 
			
		||||
 | 
			
		||||
        RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new );
 | 
			
		||||
 | 
			
		||||
        registerItemProperty( "state",
 | 
			
		||||
            ( stack, world, player ) -> ItemPocketComputer.getState( stack ).ordinal(),
 | 
			
		||||
            Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
 | 
			
		||||
        );
 | 
			
		||||
        registerItemProperty( "state",
 | 
			
		||||
            ( stack, world, player ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0,
 | 
			
		||||
            Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SafeVarargs
 | 
			
		||||
    private static void registerItemProperty( String name, IItemPropertyGetter getter, Supplier<? extends Item>... items )
 | 
			
		||||
    {
 | 
			
		||||
        ResourceLocation id = new ResourceLocation( ComputerCraft.MOD_ID, name );
 | 
			
		||||
        for( Supplier<? extends Item> item : items )
 | 
			
		||||
        {
 | 
			
		||||
            ItemModelsProperties.registerProperty( item.get(), id, getter );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void registerContainers()
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,14 @@ import dan200.computercraft.shared.peripheral.modem.wired.CableShapes;
 | 
			
		||||
import dan200.computercraft.shared.util.WorldUtil;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.client.renderer.ActiveRenderInfo;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.client.renderer.WorldRenderer;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.shapes.VoxelShape;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.DrawHighlightEvent;
 | 
			
		||||
@@ -63,7 +63,7 @@ public final class CableHighlightRenderer
 | 
			
		||||
            ? CableShapes.getModemShape( state )
 | 
			
		||||
            : CableShapes.getCableShape( state );
 | 
			
		||||
 | 
			
		||||
        Vec3d cameraPos = info.getProjectedView();
 | 
			
		||||
        Vector3d cameraPos = info.getProjectedView();
 | 
			
		||||
        double xOffset = pos.getX() - cameraPos.getX();
 | 
			
		||||
        double yOffset = pos.getY() - cameraPos.getY();
 | 
			
		||||
        double zOffset = pos.getZ() - cameraPos.getZ();
 | 
			
		||||
 
 | 
			
		||||
@@ -10,10 +10,10 @@ import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ComputerFamily;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,12 +10,12 @@ import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
 | 
			
		||||
import net.minecraft.client.renderer.FirstPersonRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Vector3f;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.HandSide;
 | 
			
		||||
import net.minecraft.util.math.MathHelper;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3f;
 | 
			
		||||
 | 
			
		||||
public abstract class ItemMapLikeRenderer
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,13 @@ import dan200.computercraft.shared.computer.core.ComputerFamily;
 | 
			
		||||
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 | 
			
		||||
import dan200.computercraft.shared.util.Colour;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.*;
 | 
			
		||||
import net.minecraft.client.renderer.BufferBuilder;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Tessellator;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3f;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.RenderHandEvent;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@ import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.media.items.ItemPrintout;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.Vector3f;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3f;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.RenderHandEvent;
 | 
			
		||||
import net.minecraftforge.client.event.RenderItemInFrameEvent;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,12 @@ import com.mojang.blaze3d.matrix.MatrixStack;
 | 
			
		||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.client.event.DrawHighlightEvent;
 | 
			
		||||
@@ -61,7 +61,7 @@ public final class MonitorHighlightRenderer
 | 
			
		||||
        if( monitor.getYIndex() != monitor.getHeight() - 1 ) faces.remove( monitor.getDown() );
 | 
			
		||||
 | 
			
		||||
        MatrixStack transformStack = event.getMatrix();
 | 
			
		||||
        Vec3d cameraPos = event.getInfo().getProjectedView();
 | 
			
		||||
        Vector3d cameraPos = event.getInfo().getProjectedView();
 | 
			
		||||
        transformStack.push();
 | 
			
		||||
        transformStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,8 @@ import com.mojang.blaze3d.systems.RenderSystem;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.client.gui.FixedWidthFontRenderer;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureUtil;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import org.lwjgl.BufferUtils;
 | 
			
		||||
import org.lwjgl.opengl.GL13;
 | 
			
		||||
import org.lwjgl.opengl.GL20;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,11 +10,11 @@ import dan200.computercraft.client.gui.FixedWidthFontRenderer;
 | 
			
		||||
import dan200.computercraft.core.terminal.TextBuffer;
 | 
			
		||||
import dan200.computercraft.shared.util.Palette;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.RenderState;
 | 
			
		||||
import net.minecraft.client.renderer.RenderType;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,9 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
 | 
			
		||||
import net.minecraft.client.renderer.vertex.VertexBuffer;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.TransformationMatrix;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3f;
 | 
			
		||||
import org.lwjgl.opengl.GL11;
 | 
			
		||||
import org.lwjgl.opengl.GL13;
 | 
			
		||||
import org.lwjgl.opengl.GL20;
 | 
			
		||||
@@ -141,6 +144,10 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
 | 
			
		||||
            (float) (xSize + 2 * TileMonitor.RENDER_MARGIN), (float) -(ySize + TileMonitor.RENDER_MARGIN * 2)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Force a flush of the blocker. WorldRenderer.updateCameraAndRender will "finish" all the built-in
 | 
			
		||||
        // buffers before calling renderer.finish, which means the blocker isn't actually rendered at that point!
 | 
			
		||||
        renderer.getBuffer( RenderType.getSolid() );
 | 
			
		||||
 | 
			
		||||
        transform.pop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,8 +19,6 @@ import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.gui.FontRenderer;
 | 
			
		||||
import net.minecraft.client.renderer.Atlases;
 | 
			
		||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.Vector3f;
 | 
			
		||||
import net.minecraft.client.renderer.model.BakedQuad;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelManager;
 | 
			
		||||
@@ -31,7 +29,9 @@ import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.RayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3f;
 | 
			
		||||
import net.minecraftforge.client.model.data.EmptyModelData;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -99,7 +99,7 @@ public class TileEntityTurtleRenderer extends TileEntityRenderer<TileTurtle>
 | 
			
		||||
        transform.push();
 | 
			
		||||
 | 
			
		||||
        // Setup the transform.
 | 
			
		||||
        Vec3d offset = turtle.getRenderOffset( partialTicks );
 | 
			
		||||
        Vector3d offset = turtle.getRenderOffset( partialTicks );
 | 
			
		||||
        float yaw = turtle.getRenderYaw( partialTicks );
 | 
			
		||||
        transform.translate( offset.x, offset.y, offset.z );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,16 +57,16 @@ public final class TurtleModelLoader implements IModelLoader<TurtleModelLoader.T
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public Collection<Material> getTextures( IModelConfiguration owner, Function<ResourceLocation, IUnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors )
 | 
			
		||||
        public Collection<RenderMaterial> getTextures( IModelConfiguration owner, Function<ResourceLocation, IUnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors )
 | 
			
		||||
        {
 | 
			
		||||
            Set<Material> materials = new HashSet<>();
 | 
			
		||||
            Set<RenderMaterial> materials = new HashSet<>();
 | 
			
		||||
            materials.addAll( modelGetter.apply( family ).getTextures( modelGetter, missingTextureErrors ) );
 | 
			
		||||
            materials.addAll( modelGetter.apply( COLOUR_TURTLE_MODEL ).getTextures( modelGetter, missingTextureErrors ) );
 | 
			
		||||
            return materials;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public IBakedModel bake( IModelConfiguration owner, ModelBakery bakery, Function<Material, TextureAtlasSprite> spriteGetter, IModelTransform transform, ItemOverrideList overrides, ResourceLocation modelLocation )
 | 
			
		||||
        public IBakedModel bake( IModelConfiguration owner, ModelBakery bakery, Function<RenderMaterial, TextureAtlasSprite> spriteGetter, IModelTransform transform, ItemOverrideList overrides, ResourceLocation modelLocation )
 | 
			
		||||
        {
 | 
			
		||||
            return new TurtleSmartItemModel(
 | 
			
		||||
                bakery.getBakedModel( family, transform, spriteGetter ),
 | 
			
		||||
 
 | 
			
		||||
@@ -7,12 +7,12 @@ package dan200.computercraft.client.render;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.client.TransformedModel;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.client.renderer.model.BakedQuad;
 | 
			
		||||
import net.minecraft.client.renderer.model.IBakedModel;
 | 
			
		||||
import net.minecraft.client.renderer.model.ItemOverrideList;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.vector.TransformationMatrix;
 | 
			
		||||
import net.minecraftforge.client.model.data.EmptyModelData;
 | 
			
		||||
import net.minecraftforge.client.model.data.IModelData;
 | 
			
		||||
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
 | 
			
		||||
@@ -108,9 +108,9 @@ public class TurtleMultiModel implements IBakedModel
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean func_230044_c_()
 | 
			
		||||
    public boolean isSideLit()
 | 
			
		||||
    {
 | 
			
		||||
        return m_baseModel.func_230044_c_();
 | 
			
		||||
        return m_baseModel.isSideLit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
 
 | 
			
		||||
@@ -15,14 +15,14 @@ import dan200.computercraft.shared.util.Holiday;
 | 
			
		||||
import dan200.computercraft.shared.util.HolidayUtil;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.client.renderer.model.*;
 | 
			
		||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | 
			
		||||
import net.minecraft.client.world.ClientWorld;
 | 
			
		||||
import net.minecraft.entity.LivingEntity;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraft.util.math.vector.TransformationMatrix;
 | 
			
		||||
import net.minecraftforge.client.model.data.IModelData;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -109,7 +109,7 @@ public class TurtleSmartItemModel implements IBakedModel
 | 
			
		||||
        {
 | 
			
		||||
            @Nonnull
 | 
			
		||||
            @Override
 | 
			
		||||
            public IBakedModel getModelWithOverrides( @Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable World world, @Nullable LivingEntity entity )
 | 
			
		||||
            public IBakedModel getOverrideModel( @Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity entity )
 | 
			
		||||
            {
 | 
			
		||||
                ItemTurtle turtle = (ItemTurtle) stack.getItem();
 | 
			
		||||
                int colour = turtle.getColour( stack );
 | 
			
		||||
@@ -184,9 +184,9 @@ public class TurtleSmartItemModel implements IBakedModel
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean func_230044_c_()
 | 
			
		||||
    public boolean isSideLit()
 | 
			
		||||
    {
 | 
			
		||||
        return familyModel.func_230044_c_();
 | 
			
		||||
        return familyModel.isSideLit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
 
 | 
			
		||||
@@ -312,10 +312,10 @@ public class OSAPI implements ILuaAPI
 | 
			
		||||
     * always be in the range [0.0, 24.0).
 | 
			
		||||
     *
 | 
			
		||||
     * * If called with {@code ingame}, the current world time will be returned.
 | 
			
		||||
     *   This is the default if nothing is passed.
 | 
			
		||||
     * This is the default if nothing is passed.
 | 
			
		||||
     * * If called with {@code utc}, returns the hour of the day in UTC time.
 | 
			
		||||
     * * If called with {@code local}, returns the hour of the day in the
 | 
			
		||||
     *   timezone the server is located in.
 | 
			
		||||
     * timezone the server is located in.
 | 
			
		||||
     *
 | 
			
		||||
     * This function can also be called with a table returned from {@link #date},
 | 
			
		||||
     * which will convert the date fields into a UNIX timestamp (number of
 | 
			
		||||
@@ -323,9 +323,9 @@ public class OSAPI implements ILuaAPI
 | 
			
		||||
     *
 | 
			
		||||
     * @param args The locale of the time, or a table filled by {@code os.date("*t")} to decode. Defaults to {@code ingame} locale if not specified.
 | 
			
		||||
     * @return The hour of the selected locale, or a UNIX timestamp from the table, depending on the argument passed in.
 | 
			
		||||
     * @throws LuaException If an invalid locale is passed.
 | 
			
		||||
     * @cc.tparam [opt] string|table locale The locale of the time, or a table filled by {@code os.date("*t")} to decode. Defaults to {@code ingame} locale if not specified.
 | 
			
		||||
     * @see #date To get a date table that can be converted with this function.
 | 
			
		||||
     * @throws LuaException If an invalid locale is passed.
 | 
			
		||||
     */
 | 
			
		||||
    @LuaFunction
 | 
			
		||||
    public final Object time( IArguments args ) throws LuaException
 | 
			
		||||
@@ -351,11 +351,11 @@ public class OSAPI implements ILuaAPI
 | 
			
		||||
     * Returns the day depending on the locale specified.
 | 
			
		||||
     *
 | 
			
		||||
     * * If called with {@code ingame}, returns the number of days since the
 | 
			
		||||
     *   world was created. This is the default.
 | 
			
		||||
     * world was created. This is the default.
 | 
			
		||||
     * * If called with {@code utc}, returns the number of days since 1 January
 | 
			
		||||
     *   1970 in the UTC timezone.
 | 
			
		||||
     * 1970 in the UTC timezone.
 | 
			
		||||
     * * If called with {@code local}, returns the number of days since 1
 | 
			
		||||
     *   January 1970 in the server's local timezone.
 | 
			
		||||
     * January 1970 in the server's local timezone.
 | 
			
		||||
     *
 | 
			
		||||
     * @param args The locale to get the day for. Defaults to {@code ingame} if not set.
 | 
			
		||||
     * @return The day depending on the selected locale.
 | 
			
		||||
@@ -435,7 +435,7 @@ public class OSAPI implements ILuaAPI
 | 
			
		||||
     * timestamp (days since 1 January 1970) with {@link #date}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param formatA The format of the string to return. This defaults to {@code %c}, which expands to a string similar to "Sat Dec 24 16:58:00 2011".
 | 
			
		||||
     * @param timeA The time to convert to a string. This defaults to the current time.
 | 
			
		||||
     * @param timeA   The time to convert to a string. This defaults to the current time.
 | 
			
		||||
     * @return The resulting format string.
 | 
			
		||||
     * @throws LuaException If an invalid format is passed.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ import net.minecraft.data.DataGenerator;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.client.model.generators.*;
 | 
			
		||||
import net.minecraftforge.common.data.ExistingFileHelper;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
@@ -94,7 +95,7 @@ public class BlockModelProvider extends BlockStateProvider
 | 
			
		||||
        VariantBlockStateBuilder builder = getVariantBuilder( block );
 | 
			
		||||
        for( MonitorEdgeState edge : BlockMonitor.STATE.getAllowedValues() )
 | 
			
		||||
        {
 | 
			
		||||
            String suffix = edge == MonitorEdgeState.NONE ? "" : "_" + edge.getName();
 | 
			
		||||
            String suffix = edge == MonitorEdgeState.NONE ? "" : "_" + edge.getString();
 | 
			
		||||
            ModelFile model = models().getBuilder( suffix( block, suffix ) );
 | 
			
		||||
 | 
			
		||||
            for( Direction facing : BlockMonitor.FACING.getAllowedValues() )
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ public class Generators
 | 
			
		||||
        DataGenerator generator = event.getGenerator();
 | 
			
		||||
        generator.addProvider( new Recipes( generator ) );
 | 
			
		||||
        generator.addProvider( new LootTables( generator ) );
 | 
			
		||||
        generator.addProvider( new Tags( generator ) );
 | 
			
		||||
        generator.addProvider( new Tags( generator, event.getExistingFileHelper() ) );
 | 
			
		||||
        generator.addProvider( new BlockModelProvider( generator, event.getExistingFileHelper() ) );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,11 @@ import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import net.minecraft.data.DataGenerator;
 | 
			
		||||
import net.minecraft.data.DirectoryCache;
 | 
			
		||||
import net.minecraft.data.IDataProvider;
 | 
			
		||||
import net.minecraft.loot.LootParameterSets;
 | 
			
		||||
import net.minecraft.loot.LootTable;
 | 
			
		||||
import net.minecraft.loot.LootTableManager;
 | 
			
		||||
import net.minecraft.loot.ValidationTracker;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameterSets;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootTable;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootTableManager;
 | 
			
		||||
import net.minecraft.world.storage.loot.ValidationTracker;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -50,7 +50,7 @@ public abstract class LootTableProvider implements IDataProvider
 | 
			
		||||
            tables.put( id, table );
 | 
			
		||||
        } );
 | 
			
		||||
 | 
			
		||||
        tables.forEach( ( key, value ) -> LootTableManager.func_227508_a_( validation, key, value ) );
 | 
			
		||||
        tables.forEach( ( key, value ) -> LootTableManager.validateLootTable( validation, key, value ) );
 | 
			
		||||
 | 
			
		||||
        Multimap<String, String> problems = validation.getProblems();
 | 
			
		||||
        if( !problems.isEmpty() )
 | 
			
		||||
 
 | 
			
		||||
@@ -13,10 +13,10 @@ import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
 | 
			
		||||
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
 | 
			
		||||
import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.data.DataGenerator;
 | 
			
		||||
import net.minecraft.loot.*;
 | 
			
		||||
import net.minecraft.loot.conditions.Alternative;
 | 
			
		||||
import net.minecraft.loot.conditions.SurvivesExplosion;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.storage.loot.*;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.Alternative;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.SurvivesExplosion;
 | 
			
		||||
import net.minecraftforge.fml.RegistryObject;
 | 
			
		||||
 | 
			
		||||
import java.util.function.BiConsumer;
 | 
			
		||||
@@ -77,9 +77,9 @@ public class LootTables extends LootTableProvider
 | 
			
		||||
                .rolls( ConstantRange.of( 1 ) )
 | 
			
		||||
                .addEntry( DynamicLootEntry.func_216162_a( new ResourceLocation( ComputerCraft.MOD_ID, "computer" ) ) )
 | 
			
		||||
                .acceptCondition( Alternative.builder(
 | 
			
		||||
                    BlockNamedEntityLootCondition.builder(),
 | 
			
		||||
                    HasComputerIdLootCondition.builder(),
 | 
			
		||||
                    PlayerCreativeLootCondition.builder().inverted()
 | 
			
		||||
                    BlockNamedEntityLootCondition.BUILDER,
 | 
			
		||||
                    HasComputerIdLootCondition.BUILDER,
 | 
			
		||||
                    PlayerCreativeLootCondition.BUILDER.inverted()
 | 
			
		||||
                ) )
 | 
			
		||||
            ).build() );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ import net.minecraft.advancements.criterion.ItemPredicate;
 | 
			
		||||
import net.minecraft.block.Blocks;
 | 
			
		||||
import net.minecraft.data.*;
 | 
			
		||||
import net.minecraft.item.*;
 | 
			
		||||
import net.minecraft.tags.Tag;
 | 
			
		||||
import net.minecraft.tags.ITag;
 | 
			
		||||
import net.minecraft.util.IItemProvider;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.common.Tags;
 | 
			
		||||
@@ -309,7 +309,7 @@ public class Recipes extends RecipeProvider
 | 
			
		||||
        return DyeColor.byId( 15 - colour.ordinal() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static InventoryChangeTrigger.Instance inventoryChange( Tag<Item> stack )
 | 
			
		||||
    private static InventoryChangeTrigger.Instance inventoryChange( ITag<Item> stack )
 | 
			
		||||
    {
 | 
			
		||||
        return InventoryChangeTrigger.Instance.forItems( ItemPredicate.Builder.create().tag( stack ).build() );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,46 +7,55 @@ package dan200.computercraft.data;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.shared.Registry;
 | 
			
		||||
import net.minecraft.data.BlockTagsProvider;
 | 
			
		||||
import net.minecraft.data.DataGenerator;
 | 
			
		||||
import net.minecraft.data.ItemTagsProvider;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.tags.ITag;
 | 
			
		||||
import net.minecraft.tags.ItemTags;
 | 
			
		||||
import net.minecraft.tags.Tag;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraftforge.common.data.ExistingFileHelper;
 | 
			
		||||
 | 
			
		||||
import static dan200.computercraft.data.Tags.CCTags.*;
 | 
			
		||||
 | 
			
		||||
public class Tags extends ItemTagsProvider
 | 
			
		||||
{
 | 
			
		||||
    private static final ITag.INamedTag<Item> PIGLIN_LOVED = ItemTags.PIGLIN_LOVED;
 | 
			
		||||
 | 
			
		||||
    public static class CCTags
 | 
			
		||||
    {
 | 
			
		||||
        public static final Tag<Item> COMPUTER = item( "computer" );
 | 
			
		||||
        public static final Tag<Item> TURTLE = item( "turtle" );
 | 
			
		||||
        public static final Tag<Item> WIRED_MODEM = item( "wired_modem" );
 | 
			
		||||
        public static final Tag<Item> MONITOR = item( "monitor" );
 | 
			
		||||
        public static final ITag.INamedTag<Item> COMPUTER = item( "computer" );
 | 
			
		||||
        public static final ITag.INamedTag<Item> TURTLE = item( "turtle" );
 | 
			
		||||
        public static final ITag.INamedTag<Item> WIRED_MODEM = item( "wired_modem" );
 | 
			
		||||
        public static final ITag.INamedTag<Item> MONITOR = item( "monitor" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Tags( DataGenerator generator )
 | 
			
		||||
    public Tags( DataGenerator generator, ExistingFileHelper helper )
 | 
			
		||||
    {
 | 
			
		||||
        super( generator );
 | 
			
		||||
        super( generator, new BlockTagsProvider( generator, ComputerCraft.MOD_ID, helper ), ComputerCraft.MOD_ID, helper );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void registerTags()
 | 
			
		||||
    {
 | 
			
		||||
        getBuilder( COMPUTER )
 | 
			
		||||
            .add( Registry.ModItems.COMPUTER_NORMAL.get() )
 | 
			
		||||
            .add( Registry.ModItems.COMPUTER_ADVANCED.get() )
 | 
			
		||||
            .add( Registry.ModItems.COMPUTER_COMMAND.get() );
 | 
			
		||||
        getBuilder( TURTLE ).add( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() );
 | 
			
		||||
        getBuilder( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() );
 | 
			
		||||
        getBuilder( MONITOR )
 | 
			
		||||
            .add( Registry.ModItems.MONITOR_NORMAL.get() )
 | 
			
		||||
            .add( Registry.ModItems.MONITOR_ADVANCED.get() );
 | 
			
		||||
        getOrCreateBuilder( COMPUTER ).add(
 | 
			
		||||
            Registry.ModItems.COMPUTER_NORMAL.get(),
 | 
			
		||||
            Registry.ModItems.COMPUTER_ADVANCED.get(),
 | 
			
		||||
            Registry.ModItems.COMPUTER_COMMAND.get()
 | 
			
		||||
        );
 | 
			
		||||
        getOrCreateBuilder( TURTLE ).add( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() );
 | 
			
		||||
        getOrCreateBuilder( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() );
 | 
			
		||||
        getOrCreateBuilder( MONITOR ).add( Registry.ModItems.MONITOR_NORMAL.get(), Registry.ModItems.MONITOR_ADVANCED.get() );
 | 
			
		||||
 | 
			
		||||
        getOrCreateBuilder( PIGLIN_LOVED ).add(
 | 
			
		||||
            Registry.ModItems.COMPUTER_ADVANCED.get(), Registry.ModItems.TURTLE_ADVANCED.get(),
 | 
			
		||||
            Registry.ModItems.WIRELESS_MODEM_ADVANCED.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(),
 | 
			
		||||
            Registry.ModItems.MONITOR_ADVANCED.get()
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static Tag<Item> item( String name )
 | 
			
		||||
    private static ITag.INamedTag<Item> item( String name )
 | 
			
		||||
    {
 | 
			
		||||
        return new ItemTags.Wrapper( new ResourceLocation( ComputerCraft.MOD_ID, name ) );
 | 
			
		||||
        return ItemTags.makeWrapperTag( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,7 @@ public final class Registry
 | 
			
		||||
 | 
			
		||||
    public static final class ModBlocks
 | 
			
		||||
    {
 | 
			
		||||
        static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>( ForgeRegistries.BLOCKS, ComputerCraft.MOD_ID );
 | 
			
		||||
        static final DeferredRegister<Block> BLOCKS = DeferredRegister.create( ForgeRegistries.BLOCKS, ComputerCraft.MOD_ID );
 | 
			
		||||
 | 
			
		||||
        private static Block.Properties properties()
 | 
			
		||||
        {
 | 
			
		||||
@@ -145,7 +145,7 @@ public final class Registry
 | 
			
		||||
 | 
			
		||||
    public static class ModTiles
 | 
			
		||||
    {
 | 
			
		||||
        static final DeferredRegister<TileEntityType<?>> TILES = new DeferredRegister<>( ForgeRegistries.TILE_ENTITIES, ComputerCraft.MOD_ID );
 | 
			
		||||
        static final DeferredRegister<TileEntityType<?>> TILES = DeferredRegister.create( ForgeRegistries.TILE_ENTITIES, ComputerCraft.MOD_ID );
 | 
			
		||||
 | 
			
		||||
        private static <T extends TileEntity> RegistryObject<TileEntityType<T>> ofBlock( RegistryObject<? extends Block> block, Function<TileEntityType<T>, T> factory )
 | 
			
		||||
        {
 | 
			
		||||
@@ -183,7 +183,7 @@ public final class Registry
 | 
			
		||||
 | 
			
		||||
    public static final class ModItems
 | 
			
		||||
    {
 | 
			
		||||
        static final DeferredRegister<Item> ITEMS = new DeferredRegister<>( ForgeRegistries.ITEMS, ComputerCraft.MOD_ID );
 | 
			
		||||
        static final DeferredRegister<Item> ITEMS = DeferredRegister.create( ForgeRegistries.ITEMS, ComputerCraft.MOD_ID );
 | 
			
		||||
 | 
			
		||||
        private static Item.Properties properties()
 | 
			
		||||
        {
 | 
			
		||||
@@ -281,7 +281,7 @@ public final class Registry
 | 
			
		||||
 | 
			
		||||
    public static class ModEntities
 | 
			
		||||
    {
 | 
			
		||||
        static final DeferredRegister<EntityType<?>> ENTITIES = new DeferredRegister<>( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID );
 | 
			
		||||
        static final DeferredRegister<EntityType<?>> ENTITIES = DeferredRegister.create( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID );
 | 
			
		||||
 | 
			
		||||
        public static final RegistryObject<EntityType<TurtlePlayer>> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () ->
 | 
			
		||||
            EntityType.Builder.<TurtlePlayer>create( EntityClassification.MISC )
 | 
			
		||||
@@ -293,7 +293,7 @@ public final class Registry
 | 
			
		||||
 | 
			
		||||
    public static class ModContainers
 | 
			
		||||
    {
 | 
			
		||||
        static final DeferredRegister<ContainerType<?>> CONTAINERS = new DeferredRegister<>( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
 | 
			
		||||
        static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
 | 
			
		||||
 | 
			
		||||
        public static final RegistryObject<ContainerType<ContainerComputer>> COMPUTER = CONTAINERS.register( "computer",
 | 
			
		||||
            () -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) );
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.server.MinecraftServer;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraft.world.server.ServerWorld;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
 | 
			
		||||
@@ -20,13 +21,12 @@ public final class TurtlePermissions
 | 
			
		||||
    public static boolean isBlockEnterable( World world, BlockPos pos, PlayerEntity player )
 | 
			
		||||
    {
 | 
			
		||||
        MinecraftServer server = world.getServer();
 | 
			
		||||
        return server == null || world.isRemote || !server.isBlockProtected( world, pos, player );
 | 
			
		||||
        return server == null || world.isRemote || (world instanceof ServerWorld && !server.isBlockProtected( (ServerWorld) world, pos, player ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isBlockEditable( World world, BlockPos pos, PlayerEntity player )
 | 
			
		||||
    {
 | 
			
		||||
        MinecraftServer server = world.getServer();
 | 
			
		||||
        return server == null || world.isRemote || !server.isBlockProtected( world, pos, player );
 | 
			
		||||
        return isBlockEnterable( world, pos, player );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SubscribeEvent
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@ import net.minecraft.inventory.container.Container;
 | 
			
		||||
import net.minecraft.inventory.container.INamedContainerProvider;
 | 
			
		||||
import net.minecraft.network.play.server.SPlayerPositionLookPacket;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.text.IFormattableTextComponent;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.util.text.TranslationTextComponent;
 | 
			
		||||
@@ -283,16 +284,16 @@ public final class CommandComputerCraft
 | 
			
		||||
 | 
			
		||||
    private static ITextComponent linkComputer( CommandSource source, ServerComputer serverComputer, int computerId )
 | 
			
		||||
    {
 | 
			
		||||
        ITextComponent out = new StringTextComponent( "" );
 | 
			
		||||
        IFormattableTextComponent out = new StringTextComponent( "" );
 | 
			
		||||
 | 
			
		||||
        // Append the computer instance
 | 
			
		||||
        if( serverComputer == null )
 | 
			
		||||
        {
 | 
			
		||||
            out.appendSibling( text( "?" ) );
 | 
			
		||||
            out.append( text( "?" ) );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            out.appendSibling( link(
 | 
			
		||||
            out.append( link(
 | 
			
		||||
                text( Integer.toString( serverComputer.getInstanceID() ) ),
 | 
			
		||||
                "/computercraft dump " + serverComputer.getInstanceID(),
 | 
			
		||||
                translate( "commands.computercraft.dump.action" )
 | 
			
		||||
@@ -300,20 +301,20 @@ public final class CommandComputerCraft
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // And ID
 | 
			
		||||
        out.appendText( " (id " + computerId + ")" );
 | 
			
		||||
        out.appendString( " (id " + computerId + ")" );
 | 
			
		||||
 | 
			
		||||
        // And, if we're a player, some useful links
 | 
			
		||||
        if( serverComputer != null && UserLevel.OP.test( source ) && isPlayer( source ) )
 | 
			
		||||
        {
 | 
			
		||||
            out
 | 
			
		||||
                .appendText( " " )
 | 
			
		||||
                .appendSibling( link(
 | 
			
		||||
                .appendString( " " )
 | 
			
		||||
                .append( link(
 | 
			
		||||
                    text( "\u261b" ),
 | 
			
		||||
                    "/computercraft tp " + serverComputer.getInstanceID(),
 | 
			
		||||
                    translate( "commands.computercraft.tp.action" )
 | 
			
		||||
                ) )
 | 
			
		||||
                .appendText( " " )
 | 
			
		||||
                .appendSibling( link(
 | 
			
		||||
                .appendString( " " )
 | 
			
		||||
                .append( link(
 | 
			
		||||
                    text( "\u20e2" ),
 | 
			
		||||
                    "/computercraft view " + serverComputer.getInstanceID(),
 | 
			
		||||
                    translate( "commands.computercraft.view.action" )
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.command.CommandSource;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.util.text.Style;
 | 
			
		||||
import net.minecraft.util.text.TranslationTextComponent;
 | 
			
		||||
import net.minecraft.util.text.event.ClickEvent;
 | 
			
		||||
import net.minecraft.util.text.event.HoverEvent;
 | 
			
		||||
@@ -57,10 +58,8 @@ public final class CommandCopy
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent createCopyText( String text )
 | 
			
		||||
    {
 | 
			
		||||
        StringTextComponent name = new StringTextComponent( text );
 | 
			
		||||
        name.getStyle()
 | 
			
		||||
        return new StringTextComponent( text ).mergeStyle( Style.EMPTY
 | 
			
		||||
            .setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, PREFIX + text ) )
 | 
			
		||||
            .setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new TranslationTextComponent( "gui.computercraft.tooltip.copy" ) ) );
 | 
			
		||||
        return name;
 | 
			
		||||
            .setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new TranslationTextComponent( "gui.computercraft.tooltip.copy" ) ) ) );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import com.mojang.brigadier.context.CommandContext;
 | 
			
		||||
import com.mojang.brigadier.tree.CommandNode;
 | 
			
		||||
import com.mojang.brigadier.tree.LiteralCommandNode;
 | 
			
		||||
import net.minecraft.command.CommandSource;
 | 
			
		||||
import net.minecraft.util.text.IFormattableTextComponent;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.util.text.TextFormatting;
 | 
			
		||||
@@ -173,12 +174,12 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder<Command
 | 
			
		||||
        temp.addChild( node );
 | 
			
		||||
        String usage = dispatcher.getSmartUsage( temp, context.getSource() ).get( node ).substring( node.getName().length() );
 | 
			
		||||
 | 
			
		||||
        ITextComponent output = new StringTextComponent( "" )
 | 
			
		||||
            .appendSibling( coloured( "/" + command + usage, HEADER ) )
 | 
			
		||||
            .appendText( " " )
 | 
			
		||||
            .appendSibling( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) )
 | 
			
		||||
            .appendText( "\n" )
 | 
			
		||||
            .appendSibling( translate( "commands." + id + ".desc" ) );
 | 
			
		||||
        IFormattableTextComponent output = new StringTextComponent( "" )
 | 
			
		||||
            .append( coloured( "/" + command + usage, HEADER ) )
 | 
			
		||||
            .appendString( " " )
 | 
			
		||||
            .append( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) )
 | 
			
		||||
            .appendString( "\n" )
 | 
			
		||||
            .append( translate( "commands." + id + ".desc" ) );
 | 
			
		||||
 | 
			
		||||
        for( CommandNode<CommandSource> child : node.getChildren() )
 | 
			
		||||
        {
 | 
			
		||||
@@ -187,16 +188,16 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder<Command
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            output.appendText( "\n" );
 | 
			
		||||
            output.appendString( "\n" );
 | 
			
		||||
 | 
			
		||||
            ITextComponent component = coloured( child.getName(), NAME );
 | 
			
		||||
            IFormattableTextComponent component = coloured( child.getName(), NAME );
 | 
			
		||||
            component.getStyle().setClickEvent( new ClickEvent(
 | 
			
		||||
                ClickEvent.Action.SUGGEST_COMMAND,
 | 
			
		||||
                "/" + command + " " + child.getName()
 | 
			
		||||
            ) );
 | 
			
		||||
            output.appendSibling( component );
 | 
			
		||||
            output.append( component );
 | 
			
		||||
 | 
			
		||||
            output.appendText( " - " ).appendSibling( translate( "commands." + id + "." + child.getName() + ".synopsis" ) );
 | 
			
		||||
            output.appendString( " - " ).append( translate( "commands." + id + "." + child.getName() + ".synopsis" ) );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return output;
 | 
			
		||||
 
 | 
			
		||||
@@ -19,69 +19,67 @@ public final class ChatHelpers
 | 
			
		||||
 | 
			
		||||
    private ChatHelpers() {}
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent coloured( String text, TextFormatting colour )
 | 
			
		||||
    public static IFormattableTextComponent coloured( String text, TextFormatting colour )
 | 
			
		||||
    {
 | 
			
		||||
        ITextComponent component = new StringTextComponent( text == null ? "" : text );
 | 
			
		||||
        component.getStyle().setColor( colour );
 | 
			
		||||
        return new StringTextComponent( text == null ? "" : text ).mergeStyle( colour );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static <T extends IFormattableTextComponent> T coloured( T component, TextFormatting colour )
 | 
			
		||||
    {
 | 
			
		||||
        component.mergeStyle( colour );
 | 
			
		||||
        return component;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static <T extends ITextComponent> T coloured( T component, TextFormatting colour )
 | 
			
		||||
    {
 | 
			
		||||
        component.getStyle().setColor( colour );
 | 
			
		||||
        return component;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent text( String text )
 | 
			
		||||
    public static IFormattableTextComponent text( String text )
 | 
			
		||||
    {
 | 
			
		||||
        return new StringTextComponent( text == null ? "" : text );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent translate( String text )
 | 
			
		||||
    public static IFormattableTextComponent translate( String text )
 | 
			
		||||
    {
 | 
			
		||||
        return new TranslationTextComponent( text == null ? "" : text );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent translate( String text, Object... args )
 | 
			
		||||
    public static IFormattableTextComponent translate( String text, Object... args )
 | 
			
		||||
    {
 | 
			
		||||
        return new TranslationTextComponent( text == null ? "" : text, args );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent list( ITextComponent... children )
 | 
			
		||||
    public static IFormattableTextComponent list( ITextComponent... children )
 | 
			
		||||
    {
 | 
			
		||||
        ITextComponent component = new StringTextComponent( "" );
 | 
			
		||||
        IFormattableTextComponent component = new StringTextComponent( "" );
 | 
			
		||||
        for( ITextComponent child : children )
 | 
			
		||||
        {
 | 
			
		||||
            component.appendSibling( child );
 | 
			
		||||
            component.append( child );
 | 
			
		||||
        }
 | 
			
		||||
        return component;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent position( BlockPos pos )
 | 
			
		||||
    public static IFormattableTextComponent position( BlockPos pos )
 | 
			
		||||
    {
 | 
			
		||||
        if( pos == null ) return translate( "commands.computercraft.generic.no_position" );
 | 
			
		||||
        return translate( "commands.computercraft.generic.position", pos.getX(), pos.getY(), pos.getZ() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent bool( boolean value )
 | 
			
		||||
    public static IFormattableTextComponent bool( boolean value )
 | 
			
		||||
    {
 | 
			
		||||
        return value
 | 
			
		||||
            ? coloured( translate( "commands.computercraft.generic.yes" ), TextFormatting.GREEN )
 | 
			
		||||
            : coloured( translate( "commands.computercraft.generic.no" ), TextFormatting.RED );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent link( ITextComponent component, String command, ITextComponent toolTip )
 | 
			
		||||
    public static IFormattableTextComponent link( IFormattableTextComponent component, String command, ITextComponent toolTip )
 | 
			
		||||
    {
 | 
			
		||||
        Style style = component.getStyle();
 | 
			
		||||
 | 
			
		||||
        if( style.getColor() == null ) style.setColor( TextFormatting.YELLOW );
 | 
			
		||||
        style.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ) );
 | 
			
		||||
        style.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, toolTip ) );
 | 
			
		||||
        if( style.getColor() == null ) style = style.setFormatting( TextFormatting.YELLOW );
 | 
			
		||||
        style = style.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ) );
 | 
			
		||||
        style = style.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, toolTip ) );
 | 
			
		||||
 | 
			
		||||
        return component;
 | 
			
		||||
        return component.setStyle( style );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ITextComponent header( String text )
 | 
			
		||||
    public static IFormattableTextComponent header( String text )
 | 
			
		||||
    {
 | 
			
		||||
        return coloured( text, HEADER );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -79,12 +79,12 @@ public interface TableFormatter
 | 
			
		||||
            StringTextComponent line = new StringTextComponent( "" );
 | 
			
		||||
            for( int i = 0; i < columns - 1; i++ )
 | 
			
		||||
            {
 | 
			
		||||
                line.appendSibling( headers[i] );
 | 
			
		||||
                line.append( headers[i] );
 | 
			
		||||
                ITextComponent padding = getPadding( headers[i], maxWidths[i] );
 | 
			
		||||
                if( padding != null ) line.appendSibling( padding );
 | 
			
		||||
                line.appendSibling( SEPARATOR );
 | 
			
		||||
                if( padding != null ) line.append( padding );
 | 
			
		||||
                line.append( SEPARATOR );
 | 
			
		||||
            }
 | 
			
		||||
            line.appendSibling( headers[columns - 1] );
 | 
			
		||||
            line.append( headers[columns - 1] );
 | 
			
		||||
 | 
			
		||||
            writeLine( rowId++, line );
 | 
			
		||||
 | 
			
		||||
@@ -100,12 +100,12 @@ public interface TableFormatter
 | 
			
		||||
            StringTextComponent line = new StringTextComponent( "" );
 | 
			
		||||
            for( int i = 0; i < columns - 1; i++ )
 | 
			
		||||
            {
 | 
			
		||||
                line.appendSibling( row[i] );
 | 
			
		||||
                line.append( row[i] );
 | 
			
		||||
                ITextComponent padding = getPadding( row[i], maxWidths[i] );
 | 
			
		||||
                if( padding != null ) line.appendSibling( padding );
 | 
			
		||||
                line.appendSibling( SEPARATOR );
 | 
			
		||||
                if( padding != null ) line.append( padding );
 | 
			
		||||
                line.append( SEPARATOR );
 | 
			
		||||
            }
 | 
			
		||||
            line.appendSibling( row[columns - 1] );
 | 
			
		||||
            line.append( row[columns - 1] );
 | 
			
		||||
            writeLine( rowId++, line );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -105,9 +105,9 @@ public abstract class TileGeneric extends TileEntity
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void handleUpdateTag( @Nonnull CompoundNBT tag )
 | 
			
		||||
    public void handleUpdateTag( @Nonnull BlockState state, @Nonnull CompoundNBT tag )
 | 
			
		||||
    {
 | 
			
		||||
        super.handleUpdateTag( tag );
 | 
			
		||||
        super.handleUpdateTag( state, tag );
 | 
			
		||||
        readDescription( tag );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,8 @@ import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.entity.LivingEntity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.loot.LootContext;
 | 
			
		||||
import net.minecraft.loot.LootParameters;
 | 
			
		||||
import net.minecraft.stats.Stats;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
@@ -23,12 +25,11 @@ import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.RayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.IBlockReader;
 | 
			
		||||
import net.minecraft.world.IWorldReader;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraft.world.server.ServerWorld;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootContext;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameters;
 | 
			
		||||
import net.minecraftforge.fml.RegistryObject;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -139,6 +140,7 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
 | 
			
		||||
    public void onBlockHarvested( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull PlayerEntity player )
 | 
			
		||||
    {
 | 
			
		||||
        if( !(world instanceof ServerWorld) ) return;
 | 
			
		||||
        ServerWorld serverWorld = (ServerWorld) world;
 | 
			
		||||
 | 
			
		||||
        // We drop the item here instead of doing it in the harvest method, as we should
 | 
			
		||||
        // drop computers for creative players too.
 | 
			
		||||
@@ -147,19 +149,19 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
 | 
			
		||||
        if( tile instanceof TileComputerBase )
 | 
			
		||||
        {
 | 
			
		||||
            TileComputerBase computer = (TileComputerBase) tile;
 | 
			
		||||
            LootContext.Builder context = new LootContext.Builder( (ServerWorld) world )
 | 
			
		||||
            LootContext.Builder context = new LootContext.Builder( serverWorld )
 | 
			
		||||
                .withRandom( world.rand )
 | 
			
		||||
                .withParameter( LootParameters.POSITION, pos )
 | 
			
		||||
                .withParameter( LootParameters.field_237457_g_, Vector3d.copyCentered( pos ) )
 | 
			
		||||
                .withParameter( LootParameters.TOOL, player.getHeldItemMainhand() )
 | 
			
		||||
                .withParameter( LootParameters.THIS_ENTITY, player )
 | 
			
		||||
                .withNullableParameter( LootParameters.BLOCK_ENTITY, tile )
 | 
			
		||||
                .withParameter( LootParameters.BLOCK_ENTITY, tile )
 | 
			
		||||
                .withDynamicDrop( DROP, ( ctx, out ) -> out.accept( getItem( computer ) ) );
 | 
			
		||||
            for( ItemStack item : state.getDrops( context ) )
 | 
			
		||||
            {
 | 
			
		||||
                spawnAsEntity( world, pos, item );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            state.spawnAdditionalDrops( world, pos, player.getHeldItemMainhand() );
 | 
			
		||||
            state.spawnAdditionalDrops( serverWorld, pos, player.getHeldItemMainhand() );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,8 @@ import net.minecraft.command.ICommandSource;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.server.MinecraftServer;
 | 
			
		||||
import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
import net.minecraft.util.math.Vec2f;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector2f;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.util.text.TranslationTextComponent;
 | 
			
		||||
@@ -25,6 +25,7 @@ import net.minecraft.world.server.ServerWorld;
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public class TileCommandComputer extends TileComputer
 | 
			
		||||
{
 | 
			
		||||
@@ -48,7 +49,7 @@ public class TileCommandComputer extends TileComputer
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void sendMessage( @Nonnull ITextComponent textComponent )
 | 
			
		||||
        public void sendMessage( @Nonnull ITextComponent textComponent, @Nonnull UUID id )
 | 
			
		||||
        {
 | 
			
		||||
            output.put( output.size() + 1, textComponent.getString() );
 | 
			
		||||
        }
 | 
			
		||||
@@ -96,7 +97,7 @@ public class TileCommandComputer extends TileComputer
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return new CommandSource( receiver,
 | 
			
		||||
            new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ), Vec2f.ZERO,
 | 
			
		||||
            new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ), Vector2f.ZERO,
 | 
			
		||||
            (ServerWorld) getWorld(), 2,
 | 
			
		||||
            name, new StringTextComponent( name ),
 | 
			
		||||
            getWorld().getServer(), null
 | 
			
		||||
 
 | 
			
		||||
@@ -200,9 +200,9 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT nbt )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( nbt );
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
 | 
			
		||||
        // Load ID, label and power state
 | 
			
		||||
        m_computerID = nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ public enum ComputerState implements IStringSerializable
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName()
 | 
			
		||||
    public String getString()
 | 
			
		||||
    {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ public abstract class ItemComputerBase extends BlockItem implements IComputerIte
 | 
			
		||||
            if( id >= 0 )
 | 
			
		||||
            {
 | 
			
		||||
                list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id )
 | 
			
		||||
                    .applyTextStyle( TextFormatting.GRAY ) );
 | 
			
		||||
                    .mergeStyle( TextFormatting.GRAY ) );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -5,12 +5,13 @@
 | 
			
		||||
 */
 | 
			
		||||
package dan200.computercraft.shared.data;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.loot.LootConditionType;
 | 
			
		||||
import net.minecraft.loot.LootContext;
 | 
			
		||||
import net.minecraft.loot.LootParameter;
 | 
			
		||||
import net.minecraft.loot.LootParameters;
 | 
			
		||||
import net.minecraft.loot.conditions.ILootCondition;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.INameable;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootContext;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameter;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameters;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.ILootCondition;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -22,6 +23,8 @@ import java.util.Set;
 | 
			
		||||
public final class BlockNamedEntityLootCondition implements ILootCondition
 | 
			
		||||
{
 | 
			
		||||
    public static final BlockNamedEntityLootCondition INSTANCE = new BlockNamedEntityLootCondition();
 | 
			
		||||
    public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
 | 
			
		||||
    public static final IBuilder BUILDER = () -> INSTANCE;
 | 
			
		||||
 | 
			
		||||
    private BlockNamedEntityLootCondition()
 | 
			
		||||
    {
 | 
			
		||||
@@ -41,8 +44,10 @@ public final class BlockNamedEntityLootCondition implements ILootCondition
 | 
			
		||||
        return Collections.singleton( LootParameters.BLOCK_ENTITY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IBuilder builder()
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public LootConditionType func_230419_b_()
 | 
			
		||||
    {
 | 
			
		||||
        return () -> INSTANCE;
 | 
			
		||||
        return TYPE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,24 +8,24 @@ package dan200.computercraft.shared.data;
 | 
			
		||||
import com.google.gson.JsonDeserializationContext;
 | 
			
		||||
import com.google.gson.JsonObject;
 | 
			
		||||
import com.google.gson.JsonSerializationContext;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.ILootCondition;
 | 
			
		||||
import net.minecraft.loot.ILootSerializer;
 | 
			
		||||
import net.minecraft.loot.LootConditionType;
 | 
			
		||||
import net.minecraft.loot.conditions.ILootCondition;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
public final class ConstantLootConditionSerializer<T extends ILootCondition> extends ILootCondition.AbstractSerializer<T>
 | 
			
		||||
public final class ConstantLootConditionSerializer<T extends ILootCondition> implements ILootSerializer<T>
 | 
			
		||||
{
 | 
			
		||||
    private final T instance;
 | 
			
		||||
 | 
			
		||||
    private ConstantLootConditionSerializer( ResourceLocation id, Class<T> klass, T instance )
 | 
			
		||||
    public ConstantLootConditionSerializer( T instance )
 | 
			
		||||
    {
 | 
			
		||||
        super( id, klass );
 | 
			
		||||
        this.instance = instance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static <T extends ILootCondition> ILootCondition.AbstractSerializer<T> of( ResourceLocation id, Class<T> klass, T instance )
 | 
			
		||||
    public static <T extends ILootCondition> LootConditionType type( T condition )
 | 
			
		||||
    {
 | 
			
		||||
        return new ConstantLootConditionSerializer<>( id, klass, instance );
 | 
			
		||||
        return new LootConditionType( new ConstantLootConditionSerializer<>( condition ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -6,11 +6,12 @@
 | 
			
		||||
package dan200.computercraft.shared.data;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.shared.computer.blocks.IComputerTile;
 | 
			
		||||
import net.minecraft.loot.LootConditionType;
 | 
			
		||||
import net.minecraft.loot.LootContext;
 | 
			
		||||
import net.minecraft.loot.LootParameter;
 | 
			
		||||
import net.minecraft.loot.LootParameters;
 | 
			
		||||
import net.minecraft.loot.conditions.ILootCondition;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootContext;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameter;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameters;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.ILootCondition;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -22,6 +23,8 @@ import java.util.Set;
 | 
			
		||||
public final class HasComputerIdLootCondition implements ILootCondition
 | 
			
		||||
{
 | 
			
		||||
    public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition();
 | 
			
		||||
    public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
 | 
			
		||||
    public static final IBuilder BUILDER = () -> INSTANCE;
 | 
			
		||||
 | 
			
		||||
    private HasComputerIdLootCondition()
 | 
			
		||||
    {
 | 
			
		||||
@@ -41,8 +44,10 @@ public final class HasComputerIdLootCondition implements ILootCondition
 | 
			
		||||
        return Collections.singleton( LootParameters.BLOCK_ENTITY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IBuilder builder()
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public LootConditionType func_230419_b_()
 | 
			
		||||
    {
 | 
			
		||||
        return () -> INSTANCE;
 | 
			
		||||
        return TYPE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,11 @@ package dan200.computercraft.shared.data;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootContext;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameter;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootParameters;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.ILootCondition;
 | 
			
		||||
import net.minecraft.loot.LootConditionType;
 | 
			
		||||
import net.minecraft.loot.LootContext;
 | 
			
		||||
import net.minecraft.loot.LootParameter;
 | 
			
		||||
import net.minecraft.loot.LootParameters;
 | 
			
		||||
import net.minecraft.loot.conditions.ILootCondition;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@@ -22,6 +23,8 @@ import java.util.Set;
 | 
			
		||||
public final class PlayerCreativeLootCondition implements ILootCondition
 | 
			
		||||
{
 | 
			
		||||
    public static final PlayerCreativeLootCondition INSTANCE = new PlayerCreativeLootCondition();
 | 
			
		||||
    public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
 | 
			
		||||
    public static final IBuilder BUILDER = () -> INSTANCE;
 | 
			
		||||
 | 
			
		||||
    private PlayerCreativeLootCondition()
 | 
			
		||||
    {
 | 
			
		||||
@@ -41,8 +44,10 @@ public final class PlayerCreativeLootCondition implements ILootCondition
 | 
			
		||||
        return Collections.singleton( LootParameters.THIS_ENTITY );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IBuilder builder()
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public LootConditionType func_230419_b_()
 | 
			
		||||
    {
 | 
			
		||||
        return () -> INSTANCE;
 | 
			
		||||
        return TYPE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,7 @@ public class ItemDisk extends Item implements IMedia, IColouredItem
 | 
			
		||||
            if( id >= 0 )
 | 
			
		||||
            {
 | 
			
		||||
                list.add( new TranslationTextComponent( "gui.computercraft.tooltip.disk_id", id )
 | 
			
		||||
                    .applyTextStyle( TextFormatting.GRAY ) );
 | 
			
		||||
                    .mergeStyle( TextFormatting.GRAY ) );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -19,14 +19,14 @@ import net.minecraft.item.crafting.SpecialRecipe;
 | 
			
		||||
import net.minecraft.item.crafting.SpecialRecipeSerializer;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.Tags;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
 | 
			
		||||
public class DiskRecipe extends SpecialRecipe
 | 
			
		||||
{
 | 
			
		||||
    private final Ingredient paper = Ingredient.fromItems( Items.PAPER );
 | 
			
		||||
    private final Ingredient redstone = Ingredient.fromTag( Tags.Items.DUSTS_REDSTONE );
 | 
			
		||||
    private final Ingredient redstone = Ingredient.fromItems( Items.REDSTONE );
 | 
			
		||||
    // TODO: Ingredient.fromTag( Tags.Items.DUSTS_REDSTONE );
 | 
			
		||||
 | 
			
		||||
    public DiskRecipe( ResourceLocation id )
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.entity.player.ServerPlayerEntity;
 | 
			
		||||
import net.minecraft.network.PacketBuffer;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraft.world.chunk.Chunk;
 | 
			
		||||
import net.minecraftforge.fml.network.NetworkDirection;
 | 
			
		||||
@@ -76,9 +76,9 @@ public final class NetworkHandler
 | 
			
		||||
        network.sendToServer( packet );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void sendToAllAround( NetworkMessage packet, World world, Vec3d pos, double range )
 | 
			
		||||
    public static void sendToAllAround( NetworkMessage packet, World world, Vector3d pos, double range )
 | 
			
		||||
    {
 | 
			
		||||
        PacketDistributor.TargetPoint target = new PacketDistributor.TargetPoint( pos.x, pos.y, pos.z, range, world.getDimension().getType() );
 | 
			
		||||
        PacketDistributor.TargetPoint target = new PacketDistributor.TargetPoint( pos.x, pos.y, pos.z, range, world.getDimensionKey() );
 | 
			
		||||
        network.send( PacketDistributor.NEAR.with( () -> target ), packet );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import net.minecraft.client.Minecraft;
 | 
			
		||||
import net.minecraft.network.PacketBuffer;
 | 
			
		||||
import net.minecraft.util.SoundEvent;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.api.distmarker.OnlyIn;
 | 
			
		||||
import net.minecraftforge.fml.network.NetworkEvent;
 | 
			
		||||
@@ -79,7 +80,7 @@ public class PlayRecordClientMessage implements NetworkMessage
 | 
			
		||||
    public void handle( NetworkEvent.Context context )
 | 
			
		||||
    {
 | 
			
		||||
        Minecraft mc = Minecraft.getInstance();
 | 
			
		||||
        mc.worldRenderer.playRecord( soundEvent, pos );
 | 
			
		||||
        if( name != null ) mc.ingameGUI.setRecordPlayingMessage( name );
 | 
			
		||||
        mc.worldRenderer.playRecord( soundEvent, pos, null );
 | 
			
		||||
        if( name != null ) mc.ingameGUI.func_238451_a_( new StringTextComponent( name ) );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ public enum DiskDriveState implements IStringSerializable
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public String getName()
 | 
			
		||||
    public String getString()
 | 
			
		||||
    {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -122,10 +122,10 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT nbt )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( nbt );
 | 
			
		||||
        customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null;
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
        customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.getComponentFromJson( nbt.getString( NBT_NAME ) ) : null;
 | 
			
		||||
        if( nbt.contains( NBT_ITEM ) )
 | 
			
		||||
        {
 | 
			
		||||
            CompoundNBT item = nbt.getCompound( NBT_ITEM );
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ package dan200.computercraft.shared.peripheral.generic.data;
 | 
			
		||||
 | 
			
		||||
import com.google.common.collect.ImmutableMap;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.state.IProperty;
 | 
			
		||||
import net.minecraft.state.Property;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
@@ -21,9 +21,9 @@ public class BlockData
 | 
			
		||||
        data.put( "name", DataHelpers.getId( state.getBlock() ) );
 | 
			
		||||
 | 
			
		||||
        Map<Object, Object> stateTable = new HashMap<>();
 | 
			
		||||
        for( ImmutableMap.Entry<IProperty<?>, ? extends Comparable<?>> entry : state.getValues().entrySet() )
 | 
			
		||||
        for( ImmutableMap.Entry<Property<?>, ? extends Comparable<?>> entry : state.getValues().entrySet() )
 | 
			
		||||
        {
 | 
			
		||||
            IProperty<?> property = entry.getKey();
 | 
			
		||||
            Property<?> property = entry.getKey();
 | 
			
		||||
            stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) );
 | 
			
		||||
        }
 | 
			
		||||
        data.put( "state", stateTable );
 | 
			
		||||
@@ -33,7 +33,7 @@ public class BlockData
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SuppressWarnings( { "unchecked", "rawtypes" } )
 | 
			
		||||
    private static Object getPropertyValue( IProperty property, Comparable value )
 | 
			
		||||
    private static Object getPropertyValue( Property property, Comparable value )
 | 
			
		||||
    {
 | 
			
		||||
        if( value instanceof String || value instanceof Number || value instanceof Boolean ) return value;
 | 
			
		||||
        return property.getName( value );
 | 
			
		||||
 
 | 
			
		||||
@@ -106,7 +106,7 @@ public class ItemData
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            return ITextComponent.Serializer.fromJson( x.getString() );
 | 
			
		||||
            return ITextComponent.Serializer.getComponentFromJson( x.getString() );
 | 
			
		||||
        }
 | 
			
		||||
        catch( JsonParseException e )
 | 
			
		||||
        {
 | 
			
		||||
@@ -157,7 +157,7 @@ public class ItemData
 | 
			
		||||
 | 
			
		||||
        enchants.ensureCapacity( enchants.size() + rawEnchants.size() );
 | 
			
		||||
 | 
			
		||||
        for( Map.Entry<Enchantment, Integer> entry : EnchantmentHelper.func_226652_a_( rawEnchants ).entrySet() )
 | 
			
		||||
        for( Map.Entry<Enchantment, Integer> entry : EnchantmentHelper.deserializeEnchantments( rawEnchants ).entrySet() )
 | 
			
		||||
        {
 | 
			
		||||
            Enchantment enchantment = entry.getKey();
 | 
			
		||||
            Integer level = entry.getValue();
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import dan200.computercraft.api.network.IPacketSender;
 | 
			
		||||
import dan200.computercraft.api.network.Packet;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IComputerAccess;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -171,7 +171,7 @@ public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPa
 | 
			
		||||
        parseChannel( replyChannel );
 | 
			
		||||
 | 
			
		||||
        World world = getWorld();
 | 
			
		||||
        Vec3d position = getPosition();
 | 
			
		||||
        Vector3d position = getPosition();
 | 
			
		||||
        IPacketNetwork network = m_network;
 | 
			
		||||
 | 
			
		||||
        if( world == null || position == null || network == null ) return;
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.block.IWaterLoggable;
 | 
			
		||||
import net.minecraft.entity.LivingEntity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.fluid.IFluidState;
 | 
			
		||||
import net.minecraft.fluid.FluidState;
 | 
			
		||||
import net.minecraft.item.BlockItemUseContext;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.state.BooleanProperty;
 | 
			
		||||
@@ -100,7 +100,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean removedByPlayer( BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest, IFluidState fluid )
 | 
			
		||||
    public boolean removedByPlayer( BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest, FluidState fluid )
 | 
			
		||||
    {
 | 
			
		||||
        if( state.get( CABLE ) && state.get( MODEM ).getFacing() != null )
 | 
			
		||||
        {
 | 
			
		||||
@@ -180,7 +180,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public IFluidState getFluidState( @Nonnull BlockState state )
 | 
			
		||||
    public FluidState getFluidState( @Nonnull BlockState state )
 | 
			
		||||
    {
 | 
			
		||||
        return getWaterloggedFluidState( state );
 | 
			
		||||
    }
 | 
			
		||||
@@ -207,9 +207,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
 | 
			
		||||
        Direction facing = state.get( MODEM ).getFacing();
 | 
			
		||||
        if( facing == null ) return true;
 | 
			
		||||
 | 
			
		||||
        BlockPos offsetPos = pos.offset( facing );
 | 
			
		||||
        BlockState offsetState = world.getBlockState( offsetPos );
 | 
			
		||||
        return hasSolidSide( offsetState, world, offsetPos, facing.getOpposite() );
 | 
			
		||||
        return hasEnoughSolidSide( world, pos.offset( facing ), facing.getOpposite() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,7 @@ public enum CableModemVariant implements IStringSerializable
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName()
 | 
			
		||||
    public String getString()
 | 
			
		||||
    {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.util.text.TranslationTextComponent;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
@@ -58,10 +58,10 @@ public class TileCable extends TileGeneric
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos pos = getPos();
 | 
			
		||||
            return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
            return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
@@ -103,10 +103,10 @@ public class TileCable extends TileGeneric
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos pos = getPos().offset( modemDirection );
 | 
			
		||||
            return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
            return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
@@ -281,9 +281,9 @@ public class TileCable extends TileGeneric
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT nbt )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( nbt );
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
        m_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED );
 | 
			
		||||
        m_peripheral.read( nbt, "" );
 | 
			
		||||
    }
 | 
			
		||||
@@ -422,12 +422,6 @@ public class TileCable extends TileGeneric
 | 
			
		||||
        m_node.updatePeripherals( peripherals );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean canRenderBreaking()
 | 
			
		||||
    {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> LazyOptional<T> getCapability( @Nonnull Capability<T> capability, @Nullable Direction side )
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.util.text.TranslationTextComponent;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
@@ -85,10 +85,10 @@ public class TileWiredModemFull extends TileGeneric
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos pos = m_entity.getPos();
 | 
			
		||||
            return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
            return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -217,17 +217,17 @@ public class TileWiredModemFull extends TileGeneric
 | 
			
		||||
        StringTextComponent base = new StringTextComponent( "" );
 | 
			
		||||
        for( int i = 0; i < names.size(); i++ )
 | 
			
		||||
        {
 | 
			
		||||
            if( i > 0 ) base.appendText( ", " );
 | 
			
		||||
            base.appendSibling( CommandCopy.createCopyText( names.get( i ) ) );
 | 
			
		||||
            if( i > 0 ) base.appendString( ", " );
 | 
			
		||||
            base.append( CommandCopy.createCopyText( names.get( i ) ) );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        player.sendStatusMessage( new TranslationTextComponent( kind, base ), false );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT nbt )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( nbt );
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
        m_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED );
 | 
			
		||||
        for( int i = 0; i < m_peripherals.length; i++ ) m_peripherals[i].read( nbt, Integer.toString( i ) );
 | 
			
		||||
    }
 | 
			
		||||
@@ -399,10 +399,10 @@ public class TileWiredModemFull extends TileGeneric
 | 
			
		||||
 | 
			
		||||
            @Nonnull
 | 
			
		||||
            @Override
 | 
			
		||||
            public Vec3d getPosition()
 | 
			
		||||
            public Vector3d getPosition()
 | 
			
		||||
            {
 | 
			
		||||
                BlockPos pos = getPos().offset( side );
 | 
			
		||||
                return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
                return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Nonnull
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import dan200.computercraft.shared.peripheral.modem.ModemShapes;
 | 
			
		||||
import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.block.IWaterLoggable;
 | 
			
		||||
import net.minecraft.fluid.IFluidState;
 | 
			
		||||
import net.minecraft.fluid.FluidState;
 | 
			
		||||
import net.minecraft.item.BlockItemUseContext;
 | 
			
		||||
import net.minecraft.state.BooleanProperty;
 | 
			
		||||
import net.minecraft.state.DirectionProperty;
 | 
			
		||||
@@ -62,7 +62,7 @@ public class BlockWirelessModem extends BlockGeneric implements IWaterLoggable
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public IFluidState getFluidState( @Nonnull BlockState state )
 | 
			
		||||
    public FluidState getFluidState( @Nonnull BlockState state )
 | 
			
		||||
    {
 | 
			
		||||
        return getWaterloggedFluidState( state );
 | 
			
		||||
    }
 | 
			
		||||
@@ -80,12 +80,10 @@ public class BlockWirelessModem extends BlockGeneric implements IWaterLoggable
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public boolean isValidPosition( BlockState state, IWorldReader world, BlockPos pos )
 | 
			
		||||
    public boolean isValidPosition( BlockState state, @Nonnull IWorldReader world, BlockPos pos )
 | 
			
		||||
    {
 | 
			
		||||
        Direction facing = state.get( FACING );
 | 
			
		||||
        BlockPos offsetPos = pos.offset( facing );
 | 
			
		||||
        BlockState offsetState = world.getBlockState( offsetPos );
 | 
			
		||||
        return hasSolidSide( offsetState, world, offsetPos, facing.getOpposite() );
 | 
			
		||||
        return hasEnoughSolidSide( world, pos.offset( facing ), facing.getOpposite() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
@@ -46,10 +46,10 @@ public class TileWirelessModem extends TileGeneric
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos pos = entity.getPos().offset( entity.modemDirection );
 | 
			
		||||
            return new Vec3d( pos.getX(), pos.getY(), pos.getZ() );
 | 
			
		||||
            return new Vector3d( pos.getX(), pos.getY(), pos.getZ() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import dan200.computercraft.api.network.IPacketNetwork;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.ModemPeripheral;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.ModemState;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
public abstract class WirelessModemPeripheral extends ModemPeripheral
 | 
			
		||||
@@ -40,7 +40,7 @@ public abstract class WirelessModemPeripheral extends ModemPeripheral
 | 
			
		||||
            World world = getWorld();
 | 
			
		||||
            if( world != null )
 | 
			
		||||
            {
 | 
			
		||||
                Vec3d position = getPosition();
 | 
			
		||||
                Vector3d position = getPosition();
 | 
			
		||||
                double minRange = ComputerCraft.modemRange;
 | 
			
		||||
                double maxRange = ComputerCraft.modemHighAltitudeRange;
 | 
			
		||||
                if( world.isRaining() && world.isThundering() )
 | 
			
		||||
 
 | 
			
		||||
@@ -60,12 +60,12 @@ public enum MonitorEdgeState implements IStringSerializable
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString()
 | 
			
		||||
    {
 | 
			
		||||
        return getName();
 | 
			
		||||
        return getString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName()
 | 
			
		||||
    public String getString()
 | 
			
		||||
    {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -135,13 +135,14 @@ public class TileMonitor extends TileGeneric
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT tag )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( tag );
 | 
			
		||||
        m_xIndex = tag.getInt( NBT_X );
 | 
			
		||||
        m_yIndex = tag.getInt( NBT_Y );
 | 
			
		||||
        m_width = tag.getInt( NBT_WIDTH );
 | 
			
		||||
        m_height = tag.getInt( NBT_HEIGHT );
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
 | 
			
		||||
        m_xIndex = nbt.getInt( NBT_X );
 | 
			
		||||
        m_yIndex = nbt.getInt( NBT_Y );
 | 
			
		||||
        m_width = nbt.getInt( NBT_WIDTH );
 | 
			
		||||
        m_height = nbt.getInt( NBT_HEIGHT );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -329,13 +330,13 @@ public class TileMonitor extends TileGeneric
 | 
			
		||||
        // Ensure we're actually a monitor block. This _should_ always be the case, but sometimes there's
 | 
			
		||||
        // fun problems with the block being missing on the client.
 | 
			
		||||
        BlockState state = getBlockState();
 | 
			
		||||
        return state.has( BlockMonitor.FACING ) ? state.get( BlockMonitor.FACING ) : Direction.NORTH;
 | 
			
		||||
        return state.hasProperty( BlockMonitor.FACING ) ? state.get( BlockMonitor.FACING ) : Direction.NORTH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Direction getOrientation()
 | 
			
		||||
    {
 | 
			
		||||
        BlockState state = getBlockState();
 | 
			
		||||
        return state.has( BlockMonitor.ORIENTATION ) ? state.get( BlockMonitor.ORIENTATION ) : Direction.NORTH;
 | 
			
		||||
        return state.hasProperty( BlockMonitor.ORIENTATION ) ? state.get( BlockMonitor.ORIENTATION ) : Direction.NORTH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Direction getFront()
 | 
			
		||||
 
 | 
			
		||||
@@ -46,8 +46,8 @@ public class PrinterPeripheral implements IPeripheral
 | 
			
		||||
     * Writes text to the current page.
 | 
			
		||||
     *
 | 
			
		||||
     * @param arguments The values to write to the page.
 | 
			
		||||
     * @cc.tparam string|number ... The values to write to the page.
 | 
			
		||||
     * @throws LuaException If any values couldn't be converted to a string, or if no page is started.
 | 
			
		||||
     * @cc.tparam string|number ... The values to write to the page.
 | 
			
		||||
     */
 | 
			
		||||
    @LuaFunction
 | 
			
		||||
    public final void write( IArguments arguments ) throws LuaException
 | 
			
		||||
@@ -62,9 +62,9 @@ public class PrinterPeripheral implements IPeripheral
 | 
			
		||||
     * Returns the current position of the cursor on the page.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The position of the cursor.
 | 
			
		||||
     * @throws LuaException If a page isn't being printed.
 | 
			
		||||
     * @cc.treturn number The X position of the cursor.
 | 
			
		||||
     * @cc.treturn number The Y position of the cursor.
 | 
			
		||||
     * @throws LuaException If a page isn't being printed.
 | 
			
		||||
     */
 | 
			
		||||
    @LuaFunction
 | 
			
		||||
    public final Object[] getCursorPos() throws LuaException
 | 
			
		||||
@@ -93,9 +93,9 @@ public class PrinterPeripheral implements IPeripheral
 | 
			
		||||
     * Returns the size of the current page.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The size of the page.
 | 
			
		||||
     * @throws LuaException If a page isn't being printed.
 | 
			
		||||
     * @cc.treturn number The width of the page.
 | 
			
		||||
     * @cc.treturn number The height of the page.
 | 
			
		||||
     * @throws LuaException If a page isn't being printed.
 | 
			
		||||
     */
 | 
			
		||||
    @LuaFunction
 | 
			
		||||
    public final Object[] getPageSize() throws LuaException
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ import net.minecraft.nbt.CompoundNBT;
 | 
			
		||||
import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
import net.minecraft.util.*;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.TranslationTextComponent;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
@@ -91,11 +91,11 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT nbt )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( nbt );
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
 | 
			
		||||
        customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null;
 | 
			
		||||
        customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.getComponentFromJson( nbt.getString( NBT_NAME ) ) : null;
 | 
			
		||||
 | 
			
		||||
        // Read page
 | 
			
		||||
        synchronized( m_page )
 | 
			
		||||
@@ -403,7 +403,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
 | 
			
		||||
                setInventorySlotContents( i, ItemStack.EMPTY );
 | 
			
		||||
 | 
			
		||||
                // Spawn the item in the world
 | 
			
		||||
                WorldUtil.dropItemStack( stack, getWorld(), new Vec3d( getPos() ).add( 0.5, 0.75, 0.5 ) );
 | 
			
		||||
                WorldUtil.dropItemStack( stack, getWorld(), Vector3d.copy( getPos() ).add( 0.5, 0.75, 0.5 ) );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ import net.minecraft.state.properties.NoteBlockInstrument;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.ResourceLocationException;
 | 
			
		||||
import net.minecraft.util.SoundCategory;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -44,7 +44,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
 | 
			
		||||
 | 
			
		||||
    public abstract World getWorld();
 | 
			
		||||
 | 
			
		||||
    public abstract Vec3d getPosition();
 | 
			
		||||
    public abstract Vector3d getPosition();
 | 
			
		||||
 | 
			
		||||
    public boolean madeSound( long ticks )
 | 
			
		||||
    {
 | 
			
		||||
@@ -66,9 +66,9 @@ public abstract class SpeakerPeripheral implements IPeripheral
 | 
			
		||||
     * with an optional volume and speed multiplier, and plays it through the speaker.
 | 
			
		||||
     *
 | 
			
		||||
     * @param context The Lua context
 | 
			
		||||
     * @param name The name of the sound to play.
 | 
			
		||||
     * @param name    The name of the sound to play.
 | 
			
		||||
     * @param volumeA The volume to play the sound at, from 0.0 to 3.0. Defaults to 1.0.
 | 
			
		||||
     * @param pitchA The speed to play the sound at, from 0.5 to 2.0. Defaults to 1.0.
 | 
			
		||||
     * @param pitchA  The speed to play the sound at, from 0.5 to 2.0. Defaults to 1.0.
 | 
			
		||||
     * @return Whether the sound could be played.
 | 
			
		||||
     * @throws LuaException If the sound name couldn't be decoded.
 | 
			
		||||
     */
 | 
			
		||||
@@ -102,9 +102,9 @@ public abstract class SpeakerPeripheral implements IPeripheral
 | 
			
		||||
     * and 6 and 18 map to C.
 | 
			
		||||
     *
 | 
			
		||||
     * @param context The Lua context
 | 
			
		||||
     * @param name The name of the note to play.
 | 
			
		||||
     * @param name    The name of the note to play.
 | 
			
		||||
     * @param volumeA The volume to play the note at, from 0.0 to 3.0. Defaults to 1.0.
 | 
			
		||||
     * @param pitchA The pitch to play the note at in semitones, from 0 to 24. Defaults to 12.
 | 
			
		||||
     * @param pitchA  The pitch to play the note at in semitones, from 0 to 24. Defaults to 12.
 | 
			
		||||
     * @return Whether the note could be played.
 | 
			
		||||
     * @throws LuaException If the instrument doesn't exist.
 | 
			
		||||
     */
 | 
			
		||||
@@ -117,7 +117,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
 | 
			
		||||
        NoteBlockInstrument instrument = null;
 | 
			
		||||
        for( NoteBlockInstrument testInstrument : NoteBlockInstrument.values() )
 | 
			
		||||
        {
 | 
			
		||||
            if( testInstrument.getName().equalsIgnoreCase( name ) )
 | 
			
		||||
            if( testInstrument.getString().equalsIgnoreCase( name ) )
 | 
			
		||||
            {
 | 
			
		||||
                instrument = testInstrument;
 | 
			
		||||
                break;
 | 
			
		||||
@@ -144,7 +144,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        World world = getWorld();
 | 
			
		||||
        Vec3d pos = getPosition();
 | 
			
		||||
        Vector3d pos = getPosition();
 | 
			
		||||
 | 
			
		||||
        context.issueMainThreadTask( () -> {
 | 
			
		||||
            MinecraftServer server = world.getServer();
 | 
			
		||||
@@ -152,7 +152,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
 | 
			
		||||
 | 
			
		||||
            float adjVolume = Math.min( volume, 3.0f );
 | 
			
		||||
            server.getPlayerList().sendToAllNearExcept(
 | 
			
		||||
                null, pos.x, pos.y, pos.z, adjVolume > 1.0f ? 16 * adjVolume : 16.0, world.dimension.getType(),
 | 
			
		||||
                null, pos.x, pos.y, pos.z, adjVolume > 1.0f ? 16 * adjVolume : 16.0, world.getDimensionKey(),
 | 
			
		||||
                new SPlaySoundPacket( name, SoundCategory.RECORDS, pos, adjVolume, pitch )
 | 
			
		||||
            );
 | 
			
		||||
            return null;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ import net.minecraft.tileentity.ITickableTileEntity;
 | 
			
		||||
import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
@@ -77,10 +77,10 @@ public class TileSpeaker extends TileGeneric implements ITickableTileEntity
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos pos = speaker.getPos();
 | 
			
		||||
            return new Vec3d( pos.getX(), pos.getY(), pos.getZ() );
 | 
			
		||||
            return new Vector3d( pos.getX(), pos.getY(), pos.getZ() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -27,12 +27,14 @@ import net.minecraft.client.util.ITooltipFlag;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.inventory.IInventory;
 | 
			
		||||
import net.minecraft.item.IItemPropertyGetter;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.ItemGroup;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.CompoundNBT;
 | 
			
		||||
import net.minecraft.util.*;
 | 
			
		||||
import net.minecraft.util.ActionResult;
 | 
			
		||||
import net.minecraft.util.ActionResultType;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.NonNullList;
 | 
			
		||||
import net.minecraft.util.text.ITextComponent;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.util.text.TextFormatting;
 | 
			
		||||
@@ -60,8 +62,6 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
 | 
			
		||||
    {
 | 
			
		||||
        super( settings );
 | 
			
		||||
        this.family = family;
 | 
			
		||||
        addPropertyOverride( new ResourceLocation( ComputerCraft.MOD_ID, "state" ), COMPUTER_STATE );
 | 
			
		||||
        addPropertyOverride( new ResourceLocation( ComputerCraft.MOD_ID, "coloured" ), COMPUTER_COLOURED );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ItemStack create( int id, String label, int colour, IPocketUpgrade upgrade )
 | 
			
		||||
@@ -190,7 +190,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
 | 
			
		||||
            if( id >= 0 )
 | 
			
		||||
            {
 | 
			
		||||
                list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id )
 | 
			
		||||
                    .applyTextStyle( TextFormatting.GRAY ) );
 | 
			
		||||
                    .mergeStyle( TextFormatting.GRAY ) );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -411,7 +411,4 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
 | 
			
		||||
    {
 | 
			
		||||
        return stack.getOrCreateChildTag( NBT_UPGRADE_INFO );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static final IItemPropertyGetter COMPUTER_STATE = ( stack, world, player ) -> getState( stack ).ordinal();
 | 
			
		||||
    private static final IItemPropertyGetter COMPUTER_COLOURED = ( stack, world, player ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ package dan200.computercraft.shared.pocket.peripherals;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.ModemState;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -16,14 +16,14 @@ import javax.annotation.Nonnull;
 | 
			
		||||
public class PocketModemPeripheral extends WirelessModemPeripheral
 | 
			
		||||
{
 | 
			
		||||
    private World world = null;
 | 
			
		||||
    private Vec3d position = Vec3d.ZERO;
 | 
			
		||||
    private Vector3d position = Vector3d.ZERO;
 | 
			
		||||
 | 
			
		||||
    public PocketModemPeripheral( boolean advanced )
 | 
			
		||||
    {
 | 
			
		||||
        super( new ModemState(), advanced );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void setLocation( World world, Vec3d position )
 | 
			
		||||
    void setLocation( World world, Vector3d position )
 | 
			
		||||
    {
 | 
			
		||||
        this.position = position;
 | 
			
		||||
        this.world = world;
 | 
			
		||||
@@ -38,7 +38,7 @@ public class PocketModemPeripheral extends WirelessModemPeripheral
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public Vec3d getPosition()
 | 
			
		||||
    public Vector3d getPosition()
 | 
			
		||||
    {
 | 
			
		||||
        return position;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,15 +7,15 @@ package dan200.computercraft.shared.pocket.peripherals;
 | 
			
		||||
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
public class PocketSpeakerPeripheral extends SpeakerPeripheral
 | 
			
		||||
{
 | 
			
		||||
    private World world = null;
 | 
			
		||||
    private Vec3d position = Vec3d.ZERO;
 | 
			
		||||
    private Vector3d position = Vector3d.ZERO;
 | 
			
		||||
 | 
			
		||||
    void setLocation( World world, Vec3d position )
 | 
			
		||||
    void setLocation( World world, Vector3d position )
 | 
			
		||||
    {
 | 
			
		||||
        this.position = position;
 | 
			
		||||
        this.world = world;
 | 
			
		||||
@@ -28,7 +28,7 @@ public class PocketSpeakerPeripheral extends SpeakerPeripheral
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Vec3d getPosition()
 | 
			
		||||
    public Vector3d getPosition()
 | 
			
		||||
    {
 | 
			
		||||
        return world != null ? position : null;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ import dan200.computercraft.shared.computer.core.IComputer;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.IContainerComputer;
 | 
			
		||||
import dan200.computercraft.shared.computer.core.ServerComputer;
 | 
			
		||||
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
 | 
			
		||||
import dan200.computercraft.shared.data.ConstantLootConditionSerializer;
 | 
			
		||||
import dan200.computercraft.shared.data.HasComputerIdLootCondition;
 | 
			
		||||
import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
 | 
			
		||||
import dan200.computercraft.shared.media.items.RecordMedia;
 | 
			
		||||
@@ -29,21 +28,18 @@ import dan200.computercraft.shared.util.NullStorage;
 | 
			
		||||
import net.minecraft.inventory.container.Container;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.MusicDiscItem;
 | 
			
		||||
import net.minecraft.loot.*;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.world.storage.loot.ConstantRange;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootPool;
 | 
			
		||||
import net.minecraft.world.storage.loot.LootTables;
 | 
			
		||||
import net.minecraft.world.storage.loot.TableLootEntry;
 | 
			
		||||
import net.minecraft.world.storage.loot.conditions.LootConditionManager;
 | 
			
		||||
import net.minecraft.util.registry.Registry;
 | 
			
		||||
import net.minecraftforge.common.capabilities.CapabilityManager;
 | 
			
		||||
import net.minecraftforge.event.LootTableLoadEvent;
 | 
			
		||||
import net.minecraftforge.event.RegisterCommandsEvent;
 | 
			
		||||
import net.minecraftforge.event.TickEvent;
 | 
			
		||||
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
 | 
			
		||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
			
		||||
import net.minecraftforge.fml.common.Mod;
 | 
			
		||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
 | 
			
		||||
import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
 | 
			
		||||
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
 | 
			
		||||
import net.minecraftforge.fml.event.server.FMLServerStoppedEvent;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
@@ -68,23 +64,14 @@ public final class ComputerCraftProxyCommon
 | 
			
		||||
 | 
			
		||||
    public static void registerLoot()
 | 
			
		||||
    {
 | 
			
		||||
        LootConditionManager.registerCondition( ConstantLootConditionSerializer.of(
 | 
			
		||||
            new ResourceLocation( ComputerCraft.MOD_ID, "block_named" ),
 | 
			
		||||
            BlockNamedEntityLootCondition.class,
 | 
			
		||||
            BlockNamedEntityLootCondition.INSTANCE
 | 
			
		||||
        ) );
 | 
			
		||||
        registerCondition( "block_named", BlockNamedEntityLootCondition.TYPE );
 | 
			
		||||
        registerCondition( "player_creative", PlayerCreativeLootCondition.TYPE );
 | 
			
		||||
        registerCondition( "has_id", HasComputerIdLootCondition.TYPE );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        LootConditionManager.registerCondition( ConstantLootConditionSerializer.of(
 | 
			
		||||
            new ResourceLocation( ComputerCraft.MOD_ID, "player_creative" ),
 | 
			
		||||
            PlayerCreativeLootCondition.class,
 | 
			
		||||
            PlayerCreativeLootCondition.INSTANCE
 | 
			
		||||
        ) );
 | 
			
		||||
 | 
			
		||||
        LootConditionManager.registerCondition( ConstantLootConditionSerializer.of(
 | 
			
		||||
            new ResourceLocation( ComputerCraft.MOD_ID, "has_id" ),
 | 
			
		||||
            HasComputerIdLootCondition.class,
 | 
			
		||||
            HasComputerIdLootCondition.INSTANCE
 | 
			
		||||
        ) );
 | 
			
		||||
    private static void registerCondition( String name, LootConditionType serializer )
 | 
			
		||||
    {
 | 
			
		||||
        Registry.register( Registry.LOOT_CONDITION_TYPE, new ResourceLocation( ComputerCraft.MOD_ID, name ), serializer );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void registerProviders()
 | 
			
		||||
@@ -152,9 +139,9 @@ public final class ComputerCraftProxyCommon
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @SubscribeEvent
 | 
			
		||||
        public static void onServerStarting( FMLServerStartingEvent event )
 | 
			
		||||
        public static void onRegisterCommand( RegisterCommandsEvent event )
 | 
			
		||||
        {
 | 
			
		||||
            CommandComputerCraft.register( event.getCommandDispatcher() );
 | 
			
		||||
            CommandComputerCraft.register( event.getDispatcher() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @SubscribeEvent
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.entity.LivingEntity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.entity.projectile.DamagingProjectileEntity;
 | 
			
		||||
import net.minecraft.fluid.IFluidState;
 | 
			
		||||
import net.minecraft.fluid.FluidState;
 | 
			
		||||
import net.minecraft.item.BlockItemUseContext;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.state.DirectionProperty;
 | 
			
		||||
@@ -31,11 +31,14 @@ import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.shapes.ISelectionContext;
 | 
			
		||||
import net.minecraft.util.math.shapes.VoxelShape;
 | 
			
		||||
import net.minecraft.util.math.shapes.VoxelShapes;
 | 
			
		||||
import net.minecraft.world.*;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.Explosion;
 | 
			
		||||
import net.minecraft.world.IBlockReader;
 | 
			
		||||
import net.minecraft.world.IWorld;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.fml.RegistryObject;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -82,8 +85,8 @@ public class BlockTurtle extends BlockComputerBase<TileTurtle> implements IWater
 | 
			
		||||
    public VoxelShape getShape( @Nonnull BlockState state, IBlockReader world, @Nonnull BlockPos pos, @Nonnull ISelectionContext context )
 | 
			
		||||
    {
 | 
			
		||||
        TileEntity tile = world.getTileEntity( pos );
 | 
			
		||||
        Vec3d offset = tile instanceof TileTurtle ? ((TileTurtle) tile).getRenderOffset( 1.0f ) : Vec3d.ZERO;
 | 
			
		||||
        return offset.equals( Vec3d.ZERO ) ? DEFAULT_SHAPE : DEFAULT_SHAPE.withOffset( offset.x, offset.y, offset.z );
 | 
			
		||||
        Vector3d offset = tile instanceof TileTurtle ? ((TileTurtle) tile).getRenderOffset( 1.0f ) : Vector3d.ZERO;
 | 
			
		||||
        return offset.equals( Vector3d.ZERO ) ? DEFAULT_SHAPE : DEFAULT_SHAPE.withOffset( offset.x, offset.y, offset.z );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
@@ -98,7 +101,7 @@ public class BlockTurtle extends BlockComputerBase<TileTurtle> implements IWater
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public IFluidState getFluidState( @Nonnull BlockState state )
 | 
			
		||||
    public FluidState getFluidState( @Nonnull BlockState state )
 | 
			
		||||
    {
 | 
			
		||||
        return getWaterloggedFluidState( state );
 | 
			
		||||
    }
 | 
			
		||||
@@ -151,14 +154,15 @@ public class BlockTurtle extends BlockComputerBase<TileTurtle> implements IWater
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public float getExplosionResistance( BlockState state, IWorldReader world, BlockPos pos, @Nullable Entity exploder, Explosion explosion )
 | 
			
		||||
    public float getExplosionResistance( BlockState state, IBlockReader world, BlockPos pos, Explosion explosion )
 | 
			
		||||
    {
 | 
			
		||||
        Entity exploder = explosion.getExploder();
 | 
			
		||||
        if( getFamily() == ComputerFamily.ADVANCED || exploder instanceof LivingEntity || exploder instanceof DamagingProjectileEntity )
 | 
			
		||||
        {
 | 
			
		||||
            return 2000;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return super.getExplosionResistance( state, world, pos, exploder, explosion );
 | 
			
		||||
        return super.getExplosionResistance( state, world, pos, explosion );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade;
 | 
			
		||||
import dan200.computercraft.api.turtle.TurtleSide;
 | 
			
		||||
import dan200.computercraft.shared.computer.blocks.IComputerTile;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
 | 
			
		||||
public interface ITurtleTile extends IComputerTile
 | 
			
		||||
{
 | 
			
		||||
@@ -22,7 +22,7 @@ public interface ITurtleTile extends IComputerTile
 | 
			
		||||
 | 
			
		||||
    ITurtleAccess getAccess();
 | 
			
		||||
 | 
			
		||||
    Vec3d getRenderOffset( float f );
 | 
			
		||||
    Vector3d getRenderOffset( float f );
 | 
			
		||||
 | 
			
		||||
    float getRenderYaw( float f );
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import dan200.computercraft.shared.turtle.apis.TurtleAPI;
 | 
			
		||||
import dan200.computercraft.shared.turtle.core.TurtleBrain;
 | 
			
		||||
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
 | 
			
		||||
import dan200.computercraft.shared.util.*;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerInventory;
 | 
			
		||||
import net.minecraft.inventory.container.Container;
 | 
			
		||||
@@ -36,7 +37,7 @@ import net.minecraft.tileentity.TileEntityType;
 | 
			
		||||
import net.minecraft.util.*;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
@@ -256,9 +257,9 @@ public class TileTurtle extends TileComputerBase implements ITurtleTile, Default
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void read( @Nonnull CompoundNBT nbt )
 | 
			
		||||
    public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
 | 
			
		||||
    {
 | 
			
		||||
        super.read( nbt );
 | 
			
		||||
        super.read( state, nbt );
 | 
			
		||||
 | 
			
		||||
        // Read inventory
 | 
			
		||||
        ListNBT nbttaglist = nbt.getList( "Items", Constants.NBT.TAG_COMPOUND );
 | 
			
		||||
@@ -353,7 +354,7 @@ public class TileTurtle extends TileComputerBase implements ITurtleTile, Default
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Vec3d getRenderOffset( float f )
 | 
			
		||||
    public Vector3d getRenderOffset( float f )
 | 
			
		||||
    {
 | 
			
		||||
        return m_brain.getRenderOffset( f );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.entity.MoverType;
 | 
			
		||||
import net.minecraft.fluid.IFluidState;
 | 
			
		||||
import net.minecraft.fluid.FluidState;
 | 
			
		||||
import net.minecraft.inventory.IInventory;
 | 
			
		||||
import net.minecraft.item.DyeColor;
 | 
			
		||||
import net.minecraft.nbt.CompoundNBT;
 | 
			
		||||
@@ -38,7 +38,7 @@ import net.minecraft.util.EntityPredicates;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.AxisAlignedBB;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
import net.minecraftforge.items.IItemHandlerModifiable;
 | 
			
		||||
@@ -309,7 +309,7 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
        // Ensure we're inside the world border
 | 
			
		||||
        if( !world.getWorldBorder().contains( pos ) ) return false;
 | 
			
		||||
 | 
			
		||||
        IFluidState existingFluid = world.getBlockState( pos ).getFluidState();
 | 
			
		||||
        FluidState existingFluid = world.getBlockState( pos ).getFluidState();
 | 
			
		||||
        BlockState newState = oldBlock
 | 
			
		||||
            // We only mark this as waterlogged when travelling into a source block. This prevents us from spreading
 | 
			
		||||
            // fluid by creating a new source when moving into a block, causing the next block to be almost full and
 | 
			
		||||
@@ -362,11 +362,11 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    @Override
 | 
			
		||||
    public Vec3d getVisualPosition( float f )
 | 
			
		||||
    public Vector3d getVisualPosition( float f )
 | 
			
		||||
    {
 | 
			
		||||
        Vec3d offset = getRenderOffset( f );
 | 
			
		||||
        Vector3d offset = getRenderOffset( f );
 | 
			
		||||
        BlockPos pos = m_owner.getPos();
 | 
			
		||||
        return new Vec3d(
 | 
			
		||||
        return new Vector3d(
 | 
			
		||||
            pos.getX() + 0.5 + offset.x,
 | 
			
		||||
            pos.getY() + 0.5 + offset.y,
 | 
			
		||||
            pos.getZ() + 0.5 + offset.z
 | 
			
		||||
@@ -664,7 +664,7 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
        m_owner.updateBlock();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Vec3d getRenderOffset( float f )
 | 
			
		||||
    public Vector3d getRenderOffset( float f )
 | 
			
		||||
    {
 | 
			
		||||
        switch( m_animation )
 | 
			
		||||
        {
 | 
			
		||||
@@ -693,7 +693,7 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                double distance = -1.0 + getAnimationFraction( f );
 | 
			
		||||
                return new Vec3d(
 | 
			
		||||
                return new Vector3d(
 | 
			
		||||
                    distance * dir.getXOffset(),
 | 
			
		||||
                    distance * dir.getYOffset(),
 | 
			
		||||
                    distance * dir.getZOffset()
 | 
			
		||||
@@ -701,7 +701,7 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
            }
 | 
			
		||||
            default:
 | 
			
		||||
            {
 | 
			
		||||
                return Vec3d.ZERO;
 | 
			
		||||
                return Vector3d.ZERO;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -885,7 +885,7 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
                        double pushStepZ = moveDir.getZOffset() * pushStep;
 | 
			
		||||
                        for( Entity entity : list )
 | 
			
		||||
                        {
 | 
			
		||||
                            entity.move( MoverType.PISTON, new Vec3d( pushStepX, pushStepY, pushStepZ ) );
 | 
			
		||||
                            entity.move( MoverType.PISTON, new Vector3d( pushStepX, pushStepY, pushStepZ ) );
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -898,7 +898,7 @@ public class TurtleBrain implements ITurtleAccess
 | 
			
		||||
                Holiday currentHoliday = HolidayUtil.getCurrentHoliday();
 | 
			
		||||
                if( currentHoliday == Holiday.VALENTINES )
 | 
			
		||||
                {
 | 
			
		||||
                    Vec3d position = getVisualPosition( 1.0f );
 | 
			
		||||
                    Vector3d position = getVisualPosition( 1.0f );
 | 
			
		||||
                    if( position != null )
 | 
			
		||||
                    {
 | 
			
		||||
                        double x = position.x + world.rand.nextGaussian() * 0.1;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.BlockRayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.util.text.StringTextComponent;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.ForgeHooks;
 | 
			
		||||
@@ -210,9 +210,9 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
        // See if there is an entity present
 | 
			
		||||
        final World world = turtle.getWorld();
 | 
			
		||||
        final BlockPos position = turtle.getPosition();
 | 
			
		||||
        Vec3d turtlePos = turtlePlayer.getPositionVec();
 | 
			
		||||
        Vec3d rayDir = turtlePlayer.getLook( 1.0f );
 | 
			
		||||
        Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 );
 | 
			
		||||
        Vector3d turtlePos = turtlePlayer.getPositionVec();
 | 
			
		||||
        Vector3d rayDir = turtlePlayer.getLook( 1.0f );
 | 
			
		||||
        Pair<Entity, Vector3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 );
 | 
			
		||||
        if( hit == null )
 | 
			
		||||
        {
 | 
			
		||||
            return stack;
 | 
			
		||||
@@ -224,7 +224,7 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
 | 
			
		||||
        // Start claiming entity drops
 | 
			
		||||
        Entity hitEntity = hit.getKey();
 | 
			
		||||
        Vec3d hitPos = hit.getValue();
 | 
			
		||||
        Vector3d hitPos = hit.getValue();
 | 
			
		||||
        DropConsumer.set(
 | 
			
		||||
            hitEntity,
 | 
			
		||||
            drop -> InventoryUtil.storeItems( drop, turtle.getItemHandler(), turtle.getSelectedSlot() )
 | 
			
		||||
@@ -238,7 +238,7 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
            cancelResult = hitEntity.applyPlayerInteraction( turtlePlayer, hitPos, Hand.MAIN_HAND );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( cancelResult == ActionResultType.SUCCESS )
 | 
			
		||||
        if( cancelResult.isSuccessOrConsume() )
 | 
			
		||||
        {
 | 
			
		||||
            placed = true;
 | 
			
		||||
        }
 | 
			
		||||
@@ -246,19 +246,19 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
        {
 | 
			
		||||
            // See EntityPlayer.interactOn
 | 
			
		||||
            cancelResult = ForgeHooks.onInteractEntity( turtlePlayer, hitEntity, Hand.MAIN_HAND );
 | 
			
		||||
            if( cancelResult == ActionResultType.SUCCESS )
 | 
			
		||||
            if( cancelResult != null && cancelResult.isSuccessOrConsume() )
 | 
			
		||||
            {
 | 
			
		||||
                placed = true;
 | 
			
		||||
            }
 | 
			
		||||
            else if( cancelResult == null )
 | 
			
		||||
            {
 | 
			
		||||
                if( hitEntity.processInitialInteract( turtlePlayer, Hand.MAIN_HAND ) )
 | 
			
		||||
                if( hitEntity.processInitialInteract( turtlePlayer, Hand.MAIN_HAND ) == ActionResultType.CONSUME )
 | 
			
		||||
                {
 | 
			
		||||
                    placed = true;
 | 
			
		||||
                }
 | 
			
		||||
                else if( hitEntity instanceof LivingEntity )
 | 
			
		||||
                {
 | 
			
		||||
                    placed = stackCopy.interactWithEntity( turtlePlayer, (LivingEntity) hitEntity, Hand.MAIN_HAND );
 | 
			
		||||
                    placed = stackCopy.interactWithEntity( turtlePlayer, (LivingEntity) hitEntity, Hand.MAIN_HAND ).isSuccessOrConsume();
 | 
			
		||||
                    if( placed ) turtlePlayer.loadInventory( stackCopy );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -338,7 +338,7 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Check if there's something suitable to place onto
 | 
			
		||||
        BlockRayTraceResult hit = new BlockRayTraceResult( new Vec3d( hitX, hitY, hitZ ), side, position, false );
 | 
			
		||||
        BlockRayTraceResult hit = new BlockRayTraceResult( new Vector3d( hitX, hitY, hitZ ), side, position, false );
 | 
			
		||||
        ItemUseContext context = new ItemUseContext( turtlePlayer, Hand.MAIN_HAND, hit );
 | 
			
		||||
        if( !canDeployOnBlock( new BlockItemUseContext( context ), turtle, turtlePlayer, position, side, allowReplace, outErrorMessage ) )
 | 
			
		||||
        {
 | 
			
		||||
@@ -353,17 +353,15 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
        TileEntity existingTile = turtle.getWorld().getTileEntity( position );
 | 
			
		||||
 | 
			
		||||
        // See PlayerInteractionManager.processRightClickBlock
 | 
			
		||||
        // TODO: ^ Check we're still consistent.
 | 
			
		||||
        PlayerInteractEvent.RightClickBlock event = ForgeHooks.onRightClickBlock( turtlePlayer, Hand.MAIN_HAND, position, side );
 | 
			
		||||
        if( !event.isCanceled() )
 | 
			
		||||
        {
 | 
			
		||||
            if( item.onItemUseFirst( stack, context ) == ActionResultType.SUCCESS )
 | 
			
		||||
            if( item.onItemUseFirst( stack, context ).isSuccessOrConsume() )
 | 
			
		||||
            {
 | 
			
		||||
                placed = true;
 | 
			
		||||
                turtlePlayer.loadInventory( stackCopy );
 | 
			
		||||
            }
 | 
			
		||||
            else if( event.getUseItem() != Event.Result.DENY &&
 | 
			
		||||
                stackCopy.onItemUse( context ) == ActionResultType.SUCCESS )
 | 
			
		||||
            else if( event.getUseItem() != Event.Result.DENY && stackCopy.onItemUse( context ).isSuccessOrConsume() )
 | 
			
		||||
            {
 | 
			
		||||
                placed = true;
 | 
			
		||||
                turtlePlayer.loadInventory( stackCopy );
 | 
			
		||||
@@ -373,14 +371,14 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
        if( !placed && (item instanceof BucketItem || item instanceof BoatItem || item instanceof LilyPadItem || item instanceof GlassBottleItem) )
 | 
			
		||||
        {
 | 
			
		||||
            ActionResultType actionResult = ForgeHooks.onItemRightClick( turtlePlayer, Hand.MAIN_HAND );
 | 
			
		||||
            if( actionResult == ActionResultType.SUCCESS )
 | 
			
		||||
            if( actionResult != null && actionResult.isSuccessOrConsume() )
 | 
			
		||||
            {
 | 
			
		||||
                placed = true;
 | 
			
		||||
            }
 | 
			
		||||
            else if( actionResult == null )
 | 
			
		||||
            {
 | 
			
		||||
                ActionResult<ItemStack> result = stackCopy.useItemRightClick( turtle.getWorld(), turtlePlayer, Hand.MAIN_HAND );
 | 
			
		||||
                if( result.getType() == ActionResultType.SUCCESS && !ItemStack.areItemStacksEqual( stack, result.getResult() ) )
 | 
			
		||||
                if( result.getType().isSuccessOrConsume() && !ItemStack.areItemStacksEqual( stack, result.getResult() ) )
 | 
			
		||||
                {
 | 
			
		||||
                    placed = true;
 | 
			
		||||
                    turtlePlayer.loadInventory( result.getResult() );
 | 
			
		||||
@@ -405,22 +403,22 @@ public class TurtlePlaceCommand implements ITurtleCommand
 | 
			
		||||
                    String s = (String) extraArguments[0];
 | 
			
		||||
                    String[] split = s.split( "\n" );
 | 
			
		||||
                    int firstLine = split.length <= 2 ? 1 : 0;
 | 
			
		||||
                    for( int i = 0; i < signTile.signText.length; i++ )
 | 
			
		||||
                    for( int i = 0; i < 4; i++ )
 | 
			
		||||
                    {
 | 
			
		||||
                        if( i >= firstLine && i < firstLine + split.length )
 | 
			
		||||
                        {
 | 
			
		||||
                            if( split[i - firstLine].length() > 15 )
 | 
			
		||||
                            {
 | 
			
		||||
                                signTile.signText[i] = new StringTextComponent( split[i - firstLine].substring( 0, 15 ) );
 | 
			
		||||
                                signTile.setText( i, new StringTextComponent( split[i - firstLine].substring( 0, 15 ) ) );
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
                            {
 | 
			
		||||
                                signTile.signText[i] = new StringTextComponent( split[i - firstLine] );
 | 
			
		||||
                                signTile.setText( i, new StringTextComponent( split[i - firstLine] ) );
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            signTile.signText[i] = new StringTextComponent( "" );
 | 
			
		||||
                            signTile.setText( i, new StringTextComponent( "" ) );
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    signTile.markDirty();
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ import net.minecraft.tileentity.SignTileEntity;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.Hand;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.server.ServerWorld;
 | 
			
		||||
import net.minecraftforge.common.util.FakePlayer;
 | 
			
		||||
 | 
			
		||||
@@ -150,9 +150,9 @@ public final class TurtlePlayer extends FakePlayer
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Vec3d getPositionVector()
 | 
			
		||||
    public Vector3d getPositionVec()
 | 
			
		||||
    {
 | 
			
		||||
        return getPositionVec();
 | 
			
		||||
        return new Vector3d( getPosX(), getPosY(), getPosZ() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ import net.minecraft.nbt.CompoundNBT;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.api.distmarker.OnlyIn;
 | 
			
		||||
@@ -44,10 +44,10 @@ public class TurtleModem extends AbstractTurtleUpgrade
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos turtlePos = turtle.getPosition();
 | 
			
		||||
            return new Vec3d(
 | 
			
		||||
            return new Vector3d(
 | 
			
		||||
                turtlePos.getX(),
 | 
			
		||||
                turtlePos.getY(),
 | 
			
		||||
                turtlePos.getZ()
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral;
 | 
			
		||||
import net.minecraft.client.renderer.model.ModelResourceLocation;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.api.distmarker.OnlyIn;
 | 
			
		||||
@@ -41,10 +41,10 @@ public class TurtleSpeaker extends AbstractTurtleUpgrade
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public Vec3d getPosition()
 | 
			
		||||
        public Vector3d getPosition()
 | 
			
		||||
        {
 | 
			
		||||
            BlockPos pos = turtle.getPosition();
 | 
			
		||||
            return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
            return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -20,12 +20,10 @@ import dan200.computercraft.shared.util.WorldUtil;
 | 
			
		||||
import net.minecraft.block.Block;
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.block.Blocks;
 | 
			
		||||
import net.minecraft.client.renderer.Matrix4f;
 | 
			
		||||
import net.minecraft.client.renderer.TransformationMatrix;
 | 
			
		||||
import net.minecraft.entity.Entity;
 | 
			
		||||
import net.minecraft.entity.SharedMonsterAttributes;
 | 
			
		||||
import net.minecraft.entity.ai.attributes.Attributes;
 | 
			
		||||
import net.minecraft.entity.item.ArmorStandEntity;
 | 
			
		||||
import net.minecraft.fluid.IFluidState;
 | 
			
		||||
import net.minecraft.fluid.FluidState;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.CompoundNBT;
 | 
			
		||||
@@ -34,7 +32,9 @@ import net.minecraft.util.DamageSource;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.ResourceLocation;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Matrix4f;
 | 
			
		||||
import net.minecraft.util.math.vector.TransformationMatrix;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.api.distmarker.Dist;
 | 
			
		||||
import net.minecraftforge.api.distmarker.OnlyIn;
 | 
			
		||||
@@ -121,7 +121,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
 | 
			
		||||
    protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player )
 | 
			
		||||
    {
 | 
			
		||||
        Block block = state.getBlock();
 | 
			
		||||
        return !state.isAir( world, pos )
 | 
			
		||||
        return !state.isAir()
 | 
			
		||||
            && block != Blocks.BEDROCK
 | 
			
		||||
            && state.getPlayerRelativeBlockHardness( player, world, pos ) > 0
 | 
			
		||||
            && block.canEntityDestroy( state, world, pos, player );
 | 
			
		||||
@@ -143,9 +143,9 @@ public class TurtleTool extends AbstractTurtleUpgrade
 | 
			
		||||
        final TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, position, direction );
 | 
			
		||||
 | 
			
		||||
        // See if there is an entity present
 | 
			
		||||
        Vec3d turtlePos = turtlePlayer.getPositionVec();
 | 
			
		||||
        Vec3d rayDir = turtlePlayer.getLook( 1.0f );
 | 
			
		||||
        Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 );
 | 
			
		||||
        Vector3d turtlePos = turtlePlayer.getPositionVec();
 | 
			
		||||
        Vector3d rayDir = turtlePlayer.getLook( 1.0f );
 | 
			
		||||
        Pair<Entity, Vector3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 );
 | 
			
		||||
        if( hit != null )
 | 
			
		||||
        {
 | 
			
		||||
            // Load up the turtle's inventory
 | 
			
		||||
@@ -173,7 +173,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
 | 
			
		||||
            boolean attacked = false;
 | 
			
		||||
            if( !hitEntity.hitByEntity( turtlePlayer ) )
 | 
			
		||||
            {
 | 
			
		||||
                float damage = (float) turtlePlayer.getAttribute( SharedMonsterAttributes.ATTACK_DAMAGE ).getValue();
 | 
			
		||||
                float damage = (float) turtlePlayer.getAttributeValue( Attributes.ATTACK_DAMAGE );
 | 
			
		||||
                damage *= getDamageMultiplier();
 | 
			
		||||
                if( damage > 0.0f )
 | 
			
		||||
                {
 | 
			
		||||
@@ -227,7 +227,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BlockState state = world.getBlockState( blockPosition );
 | 
			
		||||
        IFluidState fluidState = world.getFluidState( blockPosition );
 | 
			
		||||
        FluidState fluidState = world.getFluidState( blockPosition );
 | 
			
		||||
 | 
			
		||||
        TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, turtlePosition, direction );
 | 
			
		||||
        turtlePlayer.loadInventory( item.copy() );
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ package dan200.computercraft.shared.util;
 | 
			
		||||
import net.minecraft.item.DyeColor;
 | 
			
		||||
import net.minecraft.item.Item;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.tags.Tag;
 | 
			
		||||
import net.minecraft.tags.ITag;
 | 
			
		||||
import net.minecraftforge.common.Tags;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
@@ -16,7 +16,7 @@ import javax.annotation.Nullable;
 | 
			
		||||
public final class ColourUtils
 | 
			
		||||
{
 | 
			
		||||
    @SuppressWarnings( { "unchecked", "rawtypes" } )
 | 
			
		||||
    private static final Tag<Item>[] DYES = new Tag[] {
 | 
			
		||||
    private static final ITag<Item>[] DYES = new ITag[] {
 | 
			
		||||
        Tags.Items.DYES_WHITE,
 | 
			
		||||
        Tags.Items.DYES_ORANGE,
 | 
			
		||||
        Tags.Items.DYES_MAGENTA,
 | 
			
		||||
@@ -44,7 +44,7 @@ public final class ColourUtils
 | 
			
		||||
 | 
			
		||||
        for( int i = 0; i < DYES.length; i++ )
 | 
			
		||||
        {
 | 
			
		||||
            Tag<Item> dye = DYES[i];
 | 
			
		||||
            ITag<Item> dye = DYES[i];
 | 
			
		||||
            if( dye.contains( stack.getItem() ) ) return DyeColor.byId( i );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ public final class DropConsumer
 | 
			
		||||
    {
 | 
			
		||||
        // Capture any nearby item spawns
 | 
			
		||||
        if( dropWorld == event.getWorld() && event.getEntity() instanceof ItemEntity
 | 
			
		||||
            && dropBounds.contains( event.getEntity().getPositionVector() ) )
 | 
			
		||||
            && dropBounds.contains( event.getEntity().getPositionVec() ) )
 | 
			
		||||
        {
 | 
			
		||||
            handleDrops( ((ItemEntity) event.getEntity()).getItem() );
 | 
			
		||||
            event.setCanceled( true );
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,6 @@ import net.minecraftforge.common.util.FakePlayer;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import javax.crypto.SecretKey;
 | 
			
		||||
 | 
			
		||||
public class FakeNetHandler extends ServerPlayNetHandler
 | 
			
		||||
{
 | 
			
		||||
@@ -65,11 +64,6 @@ public class FakeNetHandler extends ServerPlayNetHandler
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void handleRecipeBookUpdate( @Nonnull CRecipeInfoPacket packet )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void handleSeenAdvancements( @Nonnull CSeenAdvancementsPacket packet )
 | 
			
		||||
    {
 | 
			
		||||
@@ -327,11 +321,6 @@ public class FakeNetHandler extends ServerPlayNetHandler
 | 
			
		||||
            this.closeReason = message;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void enableEncryption( @Nonnull SecretKey key )
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nonnull
 | 
			
		||||
        @Override
 | 
			
		||||
        public INetHandler getNetHandler()
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import com.google.gson.GsonBuilder;
 | 
			
		||||
import com.google.gson.reflect.TypeToken;
 | 
			
		||||
import dan200.computercraft.ComputerCraft;
 | 
			
		||||
import net.minecraft.server.MinecraftServer;
 | 
			
		||||
import net.minecraft.world.dimension.DimensionType;
 | 
			
		||||
import net.minecraft.world.storage.FolderName;
 | 
			
		||||
import net.minecraftforge.fml.server.ServerLifecycleHooks;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
@@ -26,6 +26,7 @@ import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public final class IDAssigner
 | 
			
		||||
{
 | 
			
		||||
    private static final FolderName FOLDER = new FolderName( ComputerCraft.MOD_ID );
 | 
			
		||||
    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
 | 
			
		||||
    private static final Type ID_TOKEN = new TypeToken<Map<String, Integer>>()
 | 
			
		||||
    {
 | 
			
		||||
@@ -41,9 +42,7 @@ public final class IDAssigner
 | 
			
		||||
 | 
			
		||||
    public static File getDir()
 | 
			
		||||
    {
 | 
			
		||||
        MinecraftServer server = ServerLifecycleHooks.getCurrentServer();
 | 
			
		||||
        File worldDirectory = server.getWorld( DimensionType.OVERWORLD ).getSaveHandler().getWorldDirectory();
 | 
			
		||||
        return new File( worldDirectory, ComputerCraft.MOD_ID );
 | 
			
		||||
        return ServerLifecycleHooks.getCurrentServer().func_240776_a_( FOLDER ).toFile();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static MinecraftServer getCachedServer()
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.LazyOptional;
 | 
			
		||||
import net.minecraftforge.items.CapabilityItemHandler;
 | 
			
		||||
@@ -63,16 +63,16 @@ public final class InventoryUtil
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Look for entity with inventory
 | 
			
		||||
        Vec3d vecStart = new Vec3d(
 | 
			
		||||
        Vector3d vecStart = new Vector3d(
 | 
			
		||||
            pos.getX() + 0.5 + 0.6 * side.getXOffset(),
 | 
			
		||||
            pos.getY() + 0.5 + 0.6 * side.getYOffset(),
 | 
			
		||||
            pos.getZ() + 0.5 + 0.6 * side.getZOffset()
 | 
			
		||||
        );
 | 
			
		||||
        Direction dir = side.getOpposite();
 | 
			
		||||
        Vec3d vecDir = new Vec3d(
 | 
			
		||||
        Vector3d vecDir = new Vector3d(
 | 
			
		||||
            dir.getXOffset(), dir.getYOffset(), dir.getZOffset()
 | 
			
		||||
        );
 | 
			
		||||
        Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities( world, vecStart, vecDir, 1.1 );
 | 
			
		||||
        Pair<Entity, Vector3d> hit = WorldUtil.rayTraceEntities( world, vecStart, vecDir, 1.1 );
 | 
			
		||||
        if( hit != null )
 | 
			
		||||
        {
 | 
			
		||||
            Entity entity = hit.getKey();
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import dan200.computercraft.shared.network.NetworkMessage;
 | 
			
		||||
import dan200.computercraft.shared.network.client.PlayRecordClientMessage;
 | 
			
		||||
import net.minecraft.util.SoundEvent;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
public final class RecordUtil
 | 
			
		||||
@@ -20,6 +20,6 @@ public final class RecordUtil
 | 
			
		||||
    public static void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos )
 | 
			
		||||
    {
 | 
			
		||||
        NetworkMessage packet = record != null ? new PlayRecordClientMessage( pos, record, recordInfo ) : new PlayRecordClientMessage( pos );
 | 
			
		||||
        NetworkHandler.sendToAllAround( packet, world, new Vec3d( pos ), 64 );
 | 
			
		||||
        NetworkHandler.sendToAllAround( packet, world, Vector3d.copyCentered( pos ), 64 );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@
 | 
			
		||||
package dan200.computercraft.shared.util;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.block.BlockState;
 | 
			
		||||
import net.minecraft.fluid.FluidState;
 | 
			
		||||
import net.minecraft.fluid.Fluids;
 | 
			
		||||
import net.minecraft.fluid.IFluidState;
 | 
			
		||||
import net.minecraft.item.BlockItemUseContext;
 | 
			
		||||
import net.minecraft.state.BooleanProperty;
 | 
			
		||||
import net.minecraft.state.properties.BlockStateProperties;
 | 
			
		||||
@@ -34,7 +34,7 @@ public final class WaterloggableHelpers
 | 
			
		||||
     * @param state The current state
 | 
			
		||||
     * @return This waterlogged block's current fluid
 | 
			
		||||
     */
 | 
			
		||||
    public static IFluidState getWaterloggedFluidState( BlockState state )
 | 
			
		||||
    public static FluidState getWaterloggedFluidState( BlockState state )
 | 
			
		||||
    {
 | 
			
		||||
        return state.get( WATERLOGGED ) ? Fluids.WATER.getStillFluidState( false ) : Fluids.EMPTY.getDefaultState();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,9 +12,14 @@ import net.minecraft.entity.item.ItemEntity;
 | 
			
		||||
import net.minecraft.entity.player.PlayerEntity;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.Direction;
 | 
			
		||||
import net.minecraft.util.math.*;
 | 
			
		||||
import net.minecraft.util.math.AxisAlignedBB;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.math.RayTraceContext;
 | 
			
		||||
import net.minecraft.util.math.RayTraceResult;
 | 
			
		||||
import net.minecraft.util.math.shapes.VoxelShape;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.ForgeMod;
 | 
			
		||||
import org.apache.commons.lang3.tuple.Pair;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -56,7 +61,7 @@ public final class WorldUtil
 | 
			
		||||
        return world.getBlockState( pos ).getMaterial().isLiquid();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isVecInside( VoxelShape shape, Vec3d vec )
 | 
			
		||||
    public static boolean isVecInside( VoxelShape shape, Vector3d vec )
 | 
			
		||||
    {
 | 
			
		||||
        if( shape.isEmpty() ) return false;
 | 
			
		||||
        // AxisAlignedBB.contains, but without strict inequalities.
 | 
			
		||||
@@ -64,9 +69,9 @@ public final class WorldUtil
 | 
			
		||||
        return vec.x >= bb.minX && vec.x <= bb.maxX && vec.y >= bb.minY && vec.y <= bb.maxY && vec.z >= bb.minZ && vec.z <= bb.maxZ;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Pair<Entity, Vec3d> rayTraceEntities( World world, Vec3d vecStart, Vec3d vecDir, double distance )
 | 
			
		||||
    public static Pair<Entity, Vector3d> rayTraceEntities( World world, Vector3d vecStart, Vector3d vecDir, double distance )
 | 
			
		||||
    {
 | 
			
		||||
        Vec3d vecEnd = vecStart.add( vecDir.x * distance, vecDir.y * distance, vecDir.z * distance );
 | 
			
		||||
        Vector3d vecEnd = vecStart.add( vecDir.x * distance, vecDir.y * distance, vecDir.z * distance );
 | 
			
		||||
 | 
			
		||||
        // Raycast for blocks
 | 
			
		||||
        Entity collisionEntity = getEntity( world );
 | 
			
		||||
@@ -105,7 +110,7 @@ public final class WorldUtil
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Vec3d littleBoxResult = littleBox.rayTrace( vecStart, vecEnd ).orElse( null );
 | 
			
		||||
            Vector3d littleBoxResult = littleBox.rayTrace( vecStart, vecEnd ).orElse( null );
 | 
			
		||||
            if( littleBoxResult != null )
 | 
			
		||||
            {
 | 
			
		||||
                double dist = vecStart.distanceTo( littleBoxResult );
 | 
			
		||||
@@ -126,21 +131,21 @@ public final class WorldUtil
 | 
			
		||||
        }
 | 
			
		||||
        if( closest != null && closestDist <= distance )
 | 
			
		||||
        {
 | 
			
		||||
            Vec3d closestPos = vecStart.add( vecDir.x * closestDist, vecDir.y * closestDist, vecDir.z * closestDist );
 | 
			
		||||
            Vector3d closestPos = vecStart.add( vecDir.x * closestDist, vecDir.y * closestDist, vecDir.z * closestDist );
 | 
			
		||||
            return Pair.of( closest, closestPos );
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Vec3d getRayStart( LivingEntity entity )
 | 
			
		||||
    public static Vector3d getRayStart( LivingEntity entity )
 | 
			
		||||
    {
 | 
			
		||||
        return entity.getEyePosition( 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Vec3d getRayEnd( PlayerEntity player )
 | 
			
		||||
    public static Vector3d getRayEnd( PlayerEntity player )
 | 
			
		||||
    {
 | 
			
		||||
        double reach = player.getAttribute( PlayerEntity.REACH_DISTANCE ).getValue();
 | 
			
		||||
        Vec3d look = player.getLookVec();
 | 
			
		||||
        double reach = player.getAttribute( ForgeMod.REACH_DISTANCE.get() ).getValue();
 | 
			
		||||
        Vector3d look = player.getLookVec();
 | 
			
		||||
        return getRayStart( player ).add( look.x * reach, look.y * reach, look.z * reach );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -170,15 +175,15 @@ public final class WorldUtil
 | 
			
		||||
        double xPos = pos.getX() + 0.5 + xDir * 0.4;
 | 
			
		||||
        double yPos = pos.getY() + 0.5 + yDir * 0.4;
 | 
			
		||||
        double zPos = pos.getZ() + 0.5 + zDir * 0.4;
 | 
			
		||||
        dropItemStack( stack, world, new Vec3d( xPos, yPos, zPos ), xDir, yDir, zDir );
 | 
			
		||||
        dropItemStack( stack, world, new Vector3d( xPos, yPos, zPos ), xDir, yDir, zDir );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void dropItemStack( @Nonnull ItemStack stack, World world, Vec3d pos )
 | 
			
		||||
    public static void dropItemStack( @Nonnull ItemStack stack, World world, Vector3d pos )
 | 
			
		||||
    {
 | 
			
		||||
        dropItemStack( stack, world, pos, 0.0, 0.0, 0.0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void dropItemStack( @Nonnull ItemStack stack, World world, Vec3d pos, double xDir, double yDir, double zDir )
 | 
			
		||||
    public static void dropItemStack( @Nonnull ItemStack stack, World world, Vector3d pos, double xDir, double yDir, double zDir )
 | 
			
		||||
    {
 | 
			
		||||
        ItemEntity item = new ItemEntity( world, pos.x, pos.y, pos.z, stack.copy() );
 | 
			
		||||
        item.setMotion(
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import dan200.computercraft.api.network.Packet;
 | 
			
		||||
import dan200.computercraft.api.network.wired.IWiredNetwork;
 | 
			
		||||
import dan200.computercraft.api.network.wired.IWiredNode;
 | 
			
		||||
import dan200.computercraft.api.peripheral.IPeripheral;
 | 
			
		||||
import net.minecraft.util.math.Vec3d;
 | 
			
		||||
import net.minecraft.util.math.vector.Vector3d;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nonnull;
 | 
			
		||||
@@ -337,7 +337,7 @@ public final class WiredNetwork implements IWiredNetwork
 | 
			
		||||
            while( (point = transmitTo.pollFirst()) != null )
 | 
			
		||||
            {
 | 
			
		||||
                World world = point.node.element.getWorld();
 | 
			
		||||
                Vec3d position = point.node.element.getPosition();
 | 
			
		||||
                Vector3d position = point.node.element.getPosition();
 | 
			
		||||
                for( WiredNode neighbour : point.node.neighbours )
 | 
			
		||||
                {
 | 
			
		||||
                    TransmitPoint neighbourPoint = points.get( neighbour );
 | 
			
		||||
 
 | 
			
		||||
@@ -2,3 +2,6 @@
 | 
			
		||||
public net.minecraft.client.renderer.FirstPersonRenderer func_178100_c(F)F # getMapAngleFromPitch
 | 
			
		||||
public net.minecraft.client.renderer.FirstPersonRenderer func_228401_a_(Lcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;IFFLnet/minecraft/util/HandSide;)V # renderArmFirstPerson
 | 
			
		||||
public net.minecraft.client.renderer.FirstPersonRenderer func_228403_a_(Lcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;ILnet/minecraft/util/HandSide;)V # renderArm
 | 
			
		||||
# ClientTableFormatter
 | 
			
		||||
public net.minecraft.client.gui.NewChatGui func_146234_a(Lnet/minecraft/util/text/ITextComponent;I)V # printChatMessageWithOptionalDeletion
 | 
			
		||||
public net.minecraft.client.gui.NewChatGui func_146242_c(I)V # deleteChatLine
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
modLoader="javafml"
 | 
			
		||||
loaderVersion="[31,32)"
 | 
			
		||||
loaderVersion="[35,36)"
 | 
			
		||||
 | 
			
		||||
issueTrackerURL="https://github.com/SquidDev-CC/CC-Tweaked/issues"
 | 
			
		||||
displayURL="https://github.com/SquidDev-CC/CC-Tweaked"
 | 
			
		||||
@@ -7,6 +7,7 @@ logoFile="pack.png"
 | 
			
		||||
 | 
			
		||||
credits="Created by Daniel Ratcliffe (@DanTwoHundred)"
 | 
			
		||||
authors="Daniel Ratcliffe, Aaron Mills, SquidDev"
 | 
			
		||||
license="ComputerCraft Public License (https://raw.githubusercontent.com/dan200/ComputerCraft/master/LICENSE)"
 | 
			
		||||
 | 
			
		||||
[[mods]]
 | 
			
		||||
modId="computercraft"
 | 
			
		||||
@@ -19,6 +20,6 @@ CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles a
 | 
			
		||||
[[dependencies.computercraft]]
 | 
			
		||||
    modId="forge"
 | 
			
		||||
    mandatory=true
 | 
			
		||||
    versionRange="[31.1.41,32)"
 | 
			
		||||
    versionRange="[35.0.1,36)"
 | 
			
		||||
    ordering="NONE"
 | 
			
		||||
    side="BOTH"
 | 
			
		||||
 
 | 
			
		||||
@@ -66,21 +66,38 @@ And several bug fixes:
 | 
			
		||||
* Correctly handle tabs within textutils.unserailizeJSON.
 | 
			
		||||
* Fix sheep not dropping items when sheared by turtles.
 | 
			
		||||
 | 
			
		||||
# New features in CC: Tweaked 1.91.1
 | 
			
		||||
 | 
			
		||||
* Fix crash when turtles interact with an entity.
 | 
			
		||||
 | 
			
		||||
# New features in CC: Tweaked 1.91.0
 | 
			
		||||
 | 
			
		||||
* [Generic peripherals] Expose NBT hashes of items to inventory methods.
 | 
			
		||||
* Bump Cobalt version
 | 
			
		||||
  * Optimise handling of string concatenation.
 | 
			
		||||
  * Add string.{pack,unpack,packsize} (MCJack123)
 | 
			
		||||
* Update to 1.16.2
 | 
			
		||||
 | 
			
		||||
And several bug fixes:
 | 
			
		||||
* Escape non-ASCII characters in JSON strings (neumond)
 | 
			
		||||
* Make field names in fs.attributes more consistent (abby)
 | 
			
		||||
* Fix textutils.formatTime correctly handle 12 AM (R93950X)
 | 
			
		||||
* Fix turtles placing buckets multiple times.
 | 
			
		||||
 | 
			
		||||
# New features in CC: Tweaked 1.90.3
 | 
			
		||||
 | 
			
		||||
* Fix the selected slot indicator missing from the turtle GUI.
 | 
			
		||||
* Ensure we load/save computer data from the world directory, rather than a global one.
 | 
			
		||||
 | 
			
		||||
# New features in CC: Tweaked 1.90.2
 | 
			
		||||
 | 
			
		||||
* Fix generic peripherals not being registered outside a dev environment.
 | 
			
		||||
* Fix `turtle.attack()` failing.
 | 
			
		||||
* Correctly set styles for the output of `/computercraft` commands.
 | 
			
		||||
 | 
			
		||||
# New features in CC: Tweaked 1.90.1
 | 
			
		||||
 | 
			
		||||
* Update to Forge 32.0.69
 | 
			
		||||
 | 
			
		||||
# New features in CC: Tweaked 1.90.0
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user