1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-10-16 14:37:39 +00:00

Compare commits

...

25 Commits

Author SHA1 Message Date
SquidDev
5bf367af9f Merge branch 'mc-1.15.x' into mc-1.16.x 2020-10-23 17:45:11 +01:00
SquidDev
4766833cf2 Bump JEI/crafttweaker versions
In my defence, they weren't out when I started the 1.15 update.
2020-10-20 17:38:59 +01:00
SquidDev
71563a52ff Let's make this a proper release 2020-10-04 11:31:06 +01:00
SquidDev
0c6e7b5db5 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-10-04 11:24:42 +01:00
SquidDev
72c1d451fe Mark the release as beta-quality 2020-09-12 10:47:19 +01:00
SquidDev
8b4a01df27 Update to Minecraft 1.16.3
I hope the Fabric folks now realise this is gonna be a race of who can
update first :p. Either way, this was a very easy update - only changes
were due to unrelated Forge changes.
2020-09-12 10:45:59 +01:00
SquidDev
d0a973fa46 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-09-12 09:29:21 +01:00
SquidDev
26c12ac1a9 Bump version to 1.91.1 2020-09-04 17:29:35 +01:00
SquidDev
2c67849b35 Fix NPE when turtles interact with an entity
Closes #531
2020-08-27 17:17:03 +01:00
SquidDev
7809a2eddd Merge branch 'mc-1.15.x' into mc-1.16.x 2020-08-23 15:46:17 +01:00
SquidDev
e8e9294fdf Correctly check for success or consume
No, I don't really know what the difference is either :). Closes #518.
2020-08-22 19:28:02 +01:00
SquidDev
99581e1f40 Initial update to 1.16.2
Seems to load fine, but not done any proper testing.
2020-08-14 22:00:03 +01:00
SquidDev
29646a7f61 Bump version to 1.90.3 2020-07-27 19:07:06 +01:00
SquidDev
50d2712581 Resolve CC's save location to the world dir
Fixes #509
2020-07-27 19:04:57 +01:00
SquidDev
3093f882d8 Fix selected slot now showing in the turtle GUI 2020-07-27 18:37:07 +01:00
SquidDev
e5cf0d1c61 Update mappings 2020-07-27 18:26:42 +01:00
SquidDev
6b102a8142 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-07-25 12:08:33 +01:00
SquidDev
c8a6888a2f Fix styles not being saved
Styles have been changed to be immutable, meaning that we were never
updating them! Fixes #499.
2020-07-25 11:19:04 +01:00
SquidDev
9ce33f8a3f Add back missing override of getPositionVec
This was removed in the initial update (46595e73df)
because I got terribly confused over mappings and I forgot to add it
back.

Fixes #505
2020-07-25 10:56:50 +01:00
SquidDev
a1dcd59d95 Update to latest Forge
Fixes #498
2020-07-18 15:11:57 +01:00
SquidDev
2a17585702 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-07-18 12:24:49 +01:00
SquidDev
087c305b0d Fix non-inventory GUIs rendering labels 2020-07-18 12:17:02 +01:00
SquidDev
31764f6d65 Register various gold items as piglin_loved 2020-07-18 11:14:55 +01:00
SquidDev
4efde2b294 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-07-18 10:34:29 +01:00
SquidDev
46595e73df Initial update to Minecraft 1.16.1
A lot is broken, but at least we can get in game:
 - GUIs render a whole bunch of additional "inventory" text, which we
   really don't want.
 - Computers load from the wrong location.
 - There's some issues with using Forge's tags from outside of JSON
   recipes. We need to work out why.
2020-07-11 20:36:10 +01:00
104 changed files with 602 additions and 509 deletions

View File

@@ -9,7 +9,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.google.code.gson:gson:2.8.1' classpath 'com.google.code.gson:gson:2.8.1'
classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.179' classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.181'
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2' classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0' classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
} }
@@ -106,10 +106,10 @@ dependencies {
minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" 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("mezz.jei:jei-1.16.3:7.6.0.49:api")
compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.15.2:6.0.0.9") compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.16.3:7.0.0.48")
runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3") runtimeOnly fg.deobf("mezz.jei:jei-1.16.3:7.6.0.49")
compileOnly 'com.google.auto.service:auto-service:1.0-rc7' compileOnly 'com.google.auto.service:auto-service:1.0-rc7'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7' annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'

View File

@@ -2,6 +2,6 @@
mod_version=1.93.1 mod_version=1.93.1
# Minecraft properties (update mods.toml when changing) # Minecraft properties (update mods.toml when changing)
mc_version=1.15.2 mc_version=1.16.3
forge_version=31.1.41 forge_version=34.0.1
mappings_version=20200429-1.15.1 mappings_version=20200723-1.16.1

View 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"
]
}

View File

@@ -54,7 +54,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
public static InputStream getResourceFile( String domain, String subPath ) public static InputStream getResourceFile( String domain, String subPath )
{ {
IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager(); IReloadableResourceManager manager = (IReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().getResourceManager();
try try
{ {
return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream(); return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
@@ -97,7 +97,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
@Override @Override
public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath ) 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 ); ResourceMount mount = ResourceMount.get( domain, subPath, manager );
return mount.exists( "" ) ? mount : null; return mount.exists( "" ) ? mount : null;
} }

View File

@@ -6,11 +6,11 @@
package dan200.computercraft.api.client; package dan200.computercraft.api.client;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ModelManager; import net.minecraft.client.renderer.model.ModelManager;
import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.model.ModelResourceLocation;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.vector.TransformationMatrix;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Objects; import java.util.Objects;

View File

@@ -5,7 +5,7 @@
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -29,7 +29,7 @@ public interface IPacketReceiver
* @return The receiver's position. * @return The receiver's position.
*/ */
@Nonnull @Nonnull
Vec3d getPosition(); Vector3d getPosition();
/** /**
* Get the maximum distance this receiver can send and receive messages. * Get the maximum distance this receiver can send and receive messages.

View File

@@ -5,7 +5,7 @@
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -29,7 +29,7 @@ public interface IPacketSender
* @return The sender's position. * @return The sender's position.
*/ */
@Nonnull @Nonnull
Vec3d getPosition(); Vector3d getPosition();
/** /**
* Get some sort of identification string for this sender. This does not strictly need to be unique, but you * Get some sort of identification string for this sender. This does not strictly need to be unique, but you

View File

@@ -13,7 +13,7 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@@ -67,7 +67,7 @@ public interface ITurtleAccess
* @see #getVisualYaw(float) * @see #getVisualYaw(float)
*/ */
@Nonnull @Nonnull
Vec3d getVisualPosition( float f ); Vector3d getVisualPosition( float f );
/** /**
* Returns the yaw the turtle is facing when it is rendered. * Returns the yaw the turtle is facing when it is rendered.

View File

@@ -12,14 +12,12 @@ import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.NewChatGui; import net.minecraft.client.gui.NewChatGui;
import net.minecraft.client.gui.RenderComponentsUtil;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List;
public class ClientTableFormatter implements TableFormatter public class ClientTableFormatter implements TableFormatter
{ {
@@ -57,7 +55,7 @@ public class ClientTableFormatter implements TableFormatter
@Override @Override
public int getWidth( ITextComponent component ) public int getWidth( ITextComponent component )
{ {
return renderer().getStringWidth( component.getFormattedText() ); return renderer().func_238414_a_( component );
} }
@Override @Override
@@ -66,10 +64,11 @@ public class ClientTableFormatter implements TableFormatter
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
NewChatGui chat = mc.ingameGUI.getChatGUI(); NewChatGui chat = mc.ingameGUI.getChatGUI();
// Trim the text if it goes over the allowed length // TODO: Trim the text if it goes over the allowed length
int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() ); // int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() );
List<ITextComponent> list = RenderComponentsUtil.splitText( component, maxWidth, mc.fontRenderer, false, false ); // List<ITextProperties> list = RenderComponentsUtil.func_238505_a_( component, maxWidth, mc.fontRenderer );
if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id ); // if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id );
chat.printChatMessageWithOptionalDeletion( component, id );
} }
@Override @Override

View File

@@ -13,10 +13,14 @@ import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import net.minecraft.client.Minecraft; 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.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.ResourceLocation; 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 org.lwjgl.opengl.GL11;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.gui.widgets.WidgetTerminal;
@@ -21,6 +22,8 @@ import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER; import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER;
import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN; 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 ); terminalWrapper = new WidgetWrapper( terminal, MARGIN + BORDER + guiLeft, MARGIN + BORDER + guiTop, termPxWidth, termPxHeight );
children.add( terminalWrapper ); children.add( terminalWrapper );
setFocused( terminalWrapper ); setListener( terminalWrapper );
} }
@Override @Override
public void removed() public void onClose()
{ {
super.removed(); super.onClose();
children.remove( terminal ); children.remove( terminal );
terminal = null; terminal = null;
minecraft.keyboardListener.enableRepeatEvents( false ); 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 ) public boolean keyPressed( int key, int scancode, int modifiers )
{ {
// Forward the tab key to the terminal, rather than moving between controls. // 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 ); return super.keyPressed( key, scancode, modifiers );
} }
@Override @Override
public void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY ) public void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack stack, float partialTicks, int mouseX, int mouseY )
{ {
// Draw terminal // Draw terminal
terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() ); terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
@@ -135,17 +138,22 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
} }
@Override @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( stack, mouseX, mouseY, partialTicks );
super.render( mouseX, mouseY, partialTicks ); func_230459_a_( stack, mouseX, mouseY );
renderHoveredToolTip( mouseX, mouseY );
} }
@Override @Override
public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY ) 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 ); || super.mouseDragged( x, y, button, deltaX, deltaY );
} }
@Override
protected void drawGuiContainerForegroundLayer( @Nonnull MatrixStack transform, int mouseX, int mouseY )
{
// Skip rendering labels.
}
} }

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; 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.ResourceLocation;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import javax.annotation.Nonnull;
public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive> public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
{ {
private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/disk_drive.png" ); private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/disk_drive.png" );
@@ -22,26 +25,18 @@ public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
} }
@Override @Override
protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY ) protected void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack transform, float partialTicks, 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 )
{ {
RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
minecraft.getTextureManager().bindTexture( BACKGROUND ); minecraft.getTextureManager().bindTexture( BACKGROUND );
blit( guiLeft, guiTop, 0, 0, xSize, ySize ); blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
} }
@Override @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); renderBackground( transform );
super.render( mouseX, mouseY, partialTicks ); super.render( transform, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( transform, mouseX, mouseY );
} }
} }

View File

@@ -5,14 +5,16 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.shared.peripheral.printer.ContainerPrinter; import dan200.computercraft.shared.peripheral.printer.ContainerPrinter;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import javax.annotation.Nonnull;
public class GuiPrinter extends ContainerScreen<ContainerPrinter> public class GuiPrinter extends ContainerScreen<ContainerPrinter>
{ {
private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/printer.png" ); 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 ); super( container, player, title );
} }
@Override /*@Override
protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY ) protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY )
{ {
String title = getTitle().getFormattedText(); String title = getTitle().getFormattedText();
font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 ); font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 );
font.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 ); font.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 );
} }*/
@Override @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 ); RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
minecraft.getTextureManager().bindTexture( BACKGROUND ); 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 @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); renderBackground( stack );
super.render( mouseX, mouseY, partialTicks ); super.render( stack, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( stack, mouseX, mouseY );
} }
} }

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.common.ContainerHeldItem; 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.Minecraft;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.renderer.IRenderTypeBuffer; 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.entity.player.PlayerInventory;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
import static dan200.computercraft.client.render.PrintoutRenderer.*; import static dan200.computercraft.client.render.PrintoutRenderer.*;
public class GuiPrintout extends ContainerScreen<ContainerHeldItem> public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
{ {
private static final Matrix4f IDENTITY = TransformationMatrix.identity().getMatrix();
private final boolean m_book; private final boolean m_book;
private final int m_pages; private final int m_pages;
private final TextBuffer[] m_text; private final TextBuffer[] m_text;
@@ -91,27 +91,33 @@ public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
} }
@Override @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 // Draw the printout
RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f ); RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource(); IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
drawBorder( IDENTITY, renderer, guiLeft, guiTop, getBlitOffset(), m_page, m_pages, m_book ); Matrix4f matrix = transform.getLast().getMatrix();
drawText( IDENTITY, renderer, guiLeft + X_TEXT_MARGIN, guiTop + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours ); 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(); renderer.finish();
} }
@Override @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. // We must take the background further back in order to not overlap with our printed pages.
setBlitOffset( getBlitOffset() - 1 ); setBlitOffset( getBlitOffset() - 1 );
renderBackground(); renderBackground( stack );
setBlitOffset( getBlitOffset() + 1 ); setBlitOffset( getBlitOffset() + 1 );
super.render( mouseX, mouseY, partialTicks ); super.render( stack, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); }
@Override
protected void drawGuiContainerForegroundLayer( @Nonnull MatrixStack transform, int mouseX, int mouseY )
{
// Skip rendering labels.
} }
} }

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.gui.widgets.WidgetTerminal;
@@ -18,6 +19,8 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
public class GuiTurtle extends ContainerScreen<ContainerTurtle> public class GuiTurtle extends ContainerScreen<ContainerTurtle>
{ {
private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( "computercraft", "textures/gui/turtle_normal.png" ); 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 ); terminalWrapper = new WidgetWrapper( terminal, 2 + 8 + guiLeft, 2 + 8 + guiTop, termPxWidth, termPxHeight );
children.add( terminalWrapper ); children.add( terminalWrapper );
setFocused( terminalWrapper ); setListener( terminalWrapper );
} }
@Override @Override
public void removed() public void onClose()
{ {
super.removed(); super.onClose();
children.remove( terminal ); children.remove( terminal );
terminal = null; terminal = null;
minecraft.keyboardListener.enableRepeatEvents( false ); minecraft.keyboardListener.enableRepeatEvents( false );
@@ -84,55 +87,58 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
public boolean keyPressed( int key, int scancode, int modifiers ) public boolean keyPressed( int key, int scancode, int modifiers )
{ {
// Forward the tab key to the terminal, rather than moving between controls. // 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 ); 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 @Override
protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY ) protected void drawGuiContainerBackgroundLayer( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
{ {
// Draw term // Draw term
boolean advanced = m_family == ComputerFamily.ADVANCED; ResourceLocation texture = m_family == ComputerFamily.ADVANCED ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL;
terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() ); terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
// Draw border/inventory // Draw border/inventory
RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL ); minecraft.getTextureManager().bindTexture( texture );
blit( guiLeft, guiTop, 0, 0, xSize, ySize ); 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 @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); renderBackground( stack );
super.render( mouseX, mouseY, partialTicks ); super.render( stack, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( stack, mouseX, mouseY );
} }
@Override @Override
public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY ) 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 ); || super.mouseDragged( x, y, button, deltaX, deltaY );
} }
@Override
protected void drawGuiContainerForegroundLayer( @Nonnull MatrixStack transform, int mouseX, int mouseY )
{
// Skip rendering labels.
}
} }

View File

@@ -11,13 +11,19 @@ import dan200.computercraft.client.render.TileEntityMonitorRenderer;
import dan200.computercraft.client.render.TileEntityTurtleRenderer; import dan200.computercraft.client.render.TileEntityTurtleRenderer;
import dan200.computercraft.client.render.TurtlePlayerRenderer; import dan200.computercraft.client.render.TurtlePlayerRenderer;
import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.inventory.ContainerComputer; import dan200.computercraft.shared.computer.inventory.ContainerComputer;
import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
import dan200.computercraft.shared.peripheral.monitor.ClientMonitor; import dan200.computercraft.shared.peripheral.monitor.ClientMonitor;
import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import net.minecraft.client.gui.ScreenManager; import net.minecraft.client.gui.ScreenManager;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup; 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.api.distmarker.Dist;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; 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.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; 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 ) @Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD )
public final class ComputerCraftProxyClient public final class ComputerCraftProxyClient
{ {
@@ -50,6 +58,25 @@ public final class ComputerCraftProxyClient
// TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() ); // TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() );
RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::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.func_239418_a_( item.get(), id, getter );
}
} }
private static void registerContainers() private static void registerContainers()

View File

@@ -14,14 +14,14 @@ import dan200.computercraft.shared.peripheral.modem.wired.CableShapes;
import dan200.computercraft.shared.util.WorldUtil; import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.VoxelShape; 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.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.DrawHighlightEvent; import net.minecraftforge.client.event.DrawHighlightEvent;
@@ -63,7 +63,7 @@ public final class CableHighlightRenderer
? CableShapes.getModemShape( state ) ? CableShapes.getModemShape( state )
: CableShapes.getCableShape( state ); : CableShapes.getCableShape( state );
Vec3d cameraPos = info.getProjectedView(); Vector3d cameraPos = info.getProjectedView();
double xOffset = pos.getX() - cameraPos.getX(); double xOffset = pos.getX() - cameraPos.getX();
double yOffset = pos.getY() - cameraPos.getY(); double yOffset = pos.getY() - cameraPos.getY();
double zOffset = pos.getZ() - cameraPos.getZ(); double zOffset = pos.getZ() - cameraPos.getZ();

View File

@@ -11,10 +11,10 @@ import com.mojang.blaze3d.vertex.IVertexBuilder;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerFamily;
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Matrix4f;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;

View File

@@ -10,12 +10,12 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity; import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.FirstPersonRenderer; import net.minecraft.client.renderer.FirstPersonRenderer;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.HandSide; import net.minecraft.util.HandSide;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3f;
public abstract class ItemMapLikeRenderer public abstract class ItemMapLikeRenderer
{ {

View File

@@ -15,9 +15,13 @@ import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import net.minecraft.client.Minecraft; 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.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.item.ItemStack; 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.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;

View File

@@ -9,9 +9,9 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.media.items.ItemPrintout;
import net.minecraft.client.renderer.IRenderTypeBuffer; 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.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.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderItemInFrameEvent; import net.minecraftforge.client.event.RenderItemInFrameEvent;

View File

@@ -9,12 +9,12 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder; import com.mojang.blaze3d.vertex.IVertexBuilder;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.DrawHighlightEvent; import net.minecraftforge.client.event.DrawHighlightEvent;
@@ -61,7 +61,7 @@ public final class MonitorHighlightRenderer
if( monitor.getYIndex() != monitor.getHeight() - 1 ) faces.remove( monitor.getDown() ); if( monitor.getYIndex() != monitor.getHeight() - 1 ) faces.remove( monitor.getDown() );
MatrixStack transformStack = event.getMatrix(); MatrixStack transformStack = event.getMatrix();
Vec3d cameraPos = event.getInfo().getProjectedView(); Vector3d cameraPos = event.getInfo().getProjectedView();
transformStack.push(); transformStack.push();
transformStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() ); transformStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() );

View File

@@ -12,8 +12,8 @@ import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.client.gui.FixedWidthFontRenderer;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.util.math.vector.Matrix4f;
import org.lwjgl.BufferUtils; import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;

View File

@@ -10,11 +10,11 @@ import dan200.computercraft.client.gui.FixedWidthFontRenderer;
import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderState; import net.minecraft.client.renderer.RenderState;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Matrix4f;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT;

View File

@@ -17,13 +17,19 @@ import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.DirectionUtil;
import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexBuffer; import net.minecraft.client.renderer.vertex.VertexBuffer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; 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.GL11;
import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;

View File

@@ -19,8 +19,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.Atlases; import net.minecraft.client.renderer.Atlases;
import net.minecraft.client.renderer.IRenderTypeBuffer; 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.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ModelManager; 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.ResourceLocation;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceResult; 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 net.minecraftforge.client.model.data.EmptyModelData;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -99,7 +99,7 @@ public class TileEntityTurtleRenderer extends TileEntityRenderer<TileTurtle>
transform.push(); transform.push();
// Setup the transform. // Setup the transform.
Vec3d offset = turtle.getRenderOffset( partialTicks ); Vector3d offset = turtle.getRenderOffset( partialTicks );
float yaw = turtle.getRenderYaw( partialTicks ); float yaw = turtle.getRenderYaw( partialTicks );
transform.translate( offset.x, offset.y, offset.z ); transform.translate( offset.x, offset.y, offset.z );

View File

@@ -57,16 +57,16 @@ public final class TurtleModelLoader implements IModelLoader<TurtleModelLoader.T
} }
@Override @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( family ).getTextures( modelGetter, missingTextureErrors ) );
materials.addAll( modelGetter.apply( COLOUR_TURTLE_MODEL ).getTextures( modelGetter, missingTextureErrors ) ); materials.addAll( modelGetter.apply( COLOUR_TURTLE_MODEL ).getTextures( modelGetter, missingTextureErrors ) );
return materials; return materials;
} }
@Override @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( return new TurtleSmartItemModel(
bakery.getBakedModel( family, transform, spriteGetter ), bakery.getBakedModel( family, transform, spriteGetter ),

View File

@@ -7,12 +7,12 @@ package dan200.computercraft.client.render;
import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.client.TransformedModel;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.Direction; 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.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;

View File

@@ -15,14 +15,14 @@ import dan200.computercraft.shared.util.Holiday;
import dan200.computercraft.shared.util.HolidayUtil; import dan200.computercraft.shared.util.HolidayUtil;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.model.*;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; 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 net.minecraftforge.client.model.data.IModelData;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -109,7 +109,7 @@ public class TurtleSmartItemModel implements IBakedModel
{ {
@Nonnull @Nonnull
@Override @Override
public IBakedModel getModelWithOverrides( @Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable World world, @Nullable LivingEntity entity ) public IBakedModel func_239290_a_( @Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity entity )
{ {
ItemTurtle turtle = (ItemTurtle) stack.getItem(); ItemTurtle turtle = (ItemTurtle) stack.getItem();
int colour = turtle.getColour( stack ); int colour = turtle.getColour( stack );

View File

@@ -385,8 +385,8 @@ public class FSAPI implements ILuaAPI
* *
* @param path The path to check the free space for. * @param path The path to check the free space for.
* @return The amount of free space available, in bytes. * @return The amount of free space available, in bytes.
* @cc.treturn number|"unlimited" The amount of free space available, in bytes, or "unlimited".
* @throws LuaException If the path doesn't exist. * @throws LuaException If the path doesn't exist.
* @cc.treturn number|"unlimited" The amount of free space available, in bytes, or "unlimited".
*/ */
@LuaFunction @LuaFunction
public final Object getFreeSpace( String path ) throws LuaException public final Object getFreeSpace( String path ) throws LuaException

View File

@@ -312,10 +312,10 @@ public class OSAPI implements ILuaAPI
* always be in the range [0.0, 24.0). * always be in the range [0.0, 24.0).
* *
* * If called with {@code ingame}, the current world time will be returned. * * 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 utc}, returns the hour of the day in UTC time.
* * If called with {@code local}, returns the hour of the day in the * * 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}, * 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 * 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. * @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. * @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. * @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. * @see #date To get a date table that can be converted with this function.
* @throws LuaException If an invalid locale is passed.
*/ */
@LuaFunction @LuaFunction
public final Object time( IArguments args ) throws LuaException 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. * Returns the day depending on the locale specified.
* *
* * If called with {@code ingame}, returns the number of days since the * * 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 * * 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 * * 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. * @param args The locale to get the day for. Defaults to {@code ingame} if not set.
* @return The day depending on the selected locale. * @return The day depending on the selected locale.
@@ -381,11 +381,11 @@ public class OSAPI implements ILuaAPI
* Returns the number of seconds since an epoch depending on the locale. * Returns the number of seconds since an epoch depending on the locale.
* *
* * If called with {@code ingame}, returns the number of seconds since the * * If called with {@code ingame}, returns the number of seconds 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 seconds since 1 * * If called with {@code utc}, returns the number of seconds since 1
* January 1970 in the UTC timezone. * January 1970 in the UTC timezone.
* * If called with {@code local}, returns the number of seconds since 1 * * If called with {@code local}, returns the number of seconds 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 seconds for. Defaults to {@code ingame} if not set. * @param args The locale to get the seconds for. Defaults to {@code ingame} if not set.
* @return The seconds since the epoch depending on the selected locale. * @return The seconds since the epoch depending on the selected locale.
@@ -435,7 +435,7 @@ public class OSAPI implements ILuaAPI
* timestamp (days since 1 January 1970) with {@link #date}. * 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 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. * @return The resulting format string.
* @throws LuaException If an invalid format is passed. * @throws LuaException If an invalid format is passed.
*/ */

View File

@@ -23,6 +23,6 @@ public class Generators
DataGenerator generator = event.getGenerator(); DataGenerator generator = event.getGenerator();
generator.addProvider( new Recipes( generator ) ); generator.addProvider( new Recipes( generator ) );
generator.addProvider( new LootTables( generator ) ); generator.addProvider( new LootTables( generator ) );
generator.addProvider( new Tags( generator ) ); generator.addProvider( new Tags( generator, event.getExistingFileHelper() ) );
} }
} }

View File

@@ -13,11 +13,11 @@ import dan200.computercraft.ComputerCraft;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
import net.minecraft.data.DirectoryCache; import net.minecraft.data.DirectoryCache;
import net.minecraft.data.IDataProvider; 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.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 javax.annotation.Nonnull;
import java.io.IOException; import java.io.IOException;

View File

@@ -14,10 +14,10 @@ import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon; import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.data.DataGenerator; 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.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 net.minecraftforge.fml.RegistryObject;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@@ -77,9 +77,9 @@ public class LootTables extends LootTableProvider
.rolls( ConstantRange.of( 1 ) ) .rolls( ConstantRange.of( 1 ) )
.addEntry( DynamicLootEntry.func_216162_a( new ResourceLocation( ComputerCraft.MOD_ID, "computer" ) ) ) .addEntry( DynamicLootEntry.func_216162_a( new ResourceLocation( ComputerCraft.MOD_ID, "computer" ) ) )
.acceptCondition( Alternative.builder( .acceptCondition( Alternative.builder(
BlockNamedEntityLootCondition.builder(), BlockNamedEntityLootCondition.BUILDER,
HasComputerIdLootCondition.builder(), HasComputerIdLootCondition.BUILDER,
PlayerCreativeLootCondition.builder().inverted() PlayerCreativeLootCondition.BUILDER.inverted()
) ) ) )
).build() ); ).build() );
} }

View File

@@ -21,7 +21,7 @@ import net.minecraft.advancements.criterion.ItemPredicate;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.data.*; import net.minecraft.data.*;
import net.minecraft.item.*; import net.minecraft.item.*;
import net.minecraft.tags.Tag; import net.minecraft.tags.ITag;
import net.minecraft.util.IItemProvider; import net.minecraft.util.IItemProvider;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
@@ -309,7 +309,7 @@ public class Recipes extends RecipeProvider
return DyeColor.byId( 15 - colour.ordinal() ); 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() ); return InventoryChangeTrigger.Instance.forItems( ItemPredicate.Builder.create().tag( stack ).build() );
} }

View File

@@ -8,46 +8,55 @@ package dan200.computercraft.data;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.Registry;
import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
import net.minecraft.data.ItemTagsProvider; import net.minecraft.data.ItemTagsProvider;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.tags.ITag;
import net.minecraft.tags.ItemTags; import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.data.ExistingFileHelper;
import static dan200.computercraft.data.Tags.CCTags.*; import static dan200.computercraft.data.Tags.CCTags.*;
public class Tags extends ItemTagsProvider public class Tags extends ItemTagsProvider
{ {
private static final ITag.INamedTag<Item> PIGLIN_LOVED = ItemTags.field_232903_N_;
public static class CCTags public static class CCTags
{ {
public static final Tag<Item> COMPUTER = item( "computer" ); public static final ITag.INamedTag<Item> COMPUTER = item( "computer" );
public static final Tag<Item> TURTLE = item( "turtle" ); public static final ITag.INamedTag<Item> TURTLE = item( "turtle" );
public static final Tag<Item> WIRED_MODEM = item( "wired_modem" ); public static final ITag.INamedTag<Item> WIRED_MODEM = item( "wired_modem" );
public static final Tag<Item> MONITOR = item( "monitor" ); 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 @Override
protected void registerTags() protected void registerTags()
{ {
getBuilder( COMPUTER ) getOrCreateBuilder( COMPUTER ).add(
.add( Registry.ModItems.COMPUTER_NORMAL.get() ) Registry.ModItems.COMPUTER_NORMAL.get(),
.add( Registry.ModItems.COMPUTER_ADVANCED.get() ) Registry.ModItems.COMPUTER_ADVANCED.get(),
.add( Registry.ModItems.COMPUTER_COMMAND.get() ); 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() ); getOrCreateBuilder( TURTLE ).add( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() );
getBuilder( MONITOR ) getOrCreateBuilder( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() );
.add( Registry.ModItems.MONITOR_NORMAL.get() ) getOrCreateBuilder( MONITOR ).add( Registry.ModItems.MONITOR_NORMAL.get(), Registry.ModItems.MONITOR_ADVANCED.get() );
.add( 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() );
} }
} }

View File

@@ -92,7 +92,7 @@ public final class Registry
public static final class ModBlocks 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() private static Block.Properties properties()
{ {
@@ -145,7 +145,7 @@ public final class Registry
public static class ModTiles 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 ) 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 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() private static Item.Properties properties()
{ {
@@ -281,7 +281,7 @@ public final class Registry
public static class ModEntities 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", () -> public static final RegistryObject<EntityType<TurtlePlayer>> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () ->
EntityType.Builder.<TurtlePlayer>create( EntityClassification.MISC ) EntityType.Builder.<TurtlePlayer>create( EntityClassification.MISC )
@@ -293,7 +293,7 @@ public final class Registry
public static class ModContainers 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", public static final RegistryObject<ContainerType<ContainerComputer>> COMPUTER = CONTAINERS.register( "computer",
() -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) ); () -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) );

View File

@@ -11,6 +11,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@@ -20,13 +21,12 @@ public final class TurtlePermissions
public static boolean isBlockEnterable( World world, BlockPos pos, PlayerEntity player ) public static boolean isBlockEnterable( World world, BlockPos pos, PlayerEntity player )
{ {
MinecraftServer server = world.getServer(); 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 ) public static boolean isBlockEditable( World world, BlockPos pos, PlayerEntity player )
{ {
MinecraftServer server = world.getServer(); return isBlockEnterable( world, pos, player );
return server == null || world.isRemote || !server.isBlockProtected( world, pos, player );
} }
@SubscribeEvent @SubscribeEvent

View File

@@ -30,6 +30,7 @@ import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.network.play.server.SPlayerPositionLookPacket; import net.minecraft.network.play.server.SPlayerPositionLookPacket;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
@@ -283,16 +284,16 @@ public final class CommandComputerCraft
private static ITextComponent linkComputer( CommandSource source, ServerComputer serverComputer, int computerId ) private static ITextComponent linkComputer( CommandSource source, ServerComputer serverComputer, int computerId )
{ {
ITextComponent out = new StringTextComponent( "" ); IFormattableTextComponent out = new StringTextComponent( "" );
// Append the computer instance // Append the computer instance
if( serverComputer == null ) if( serverComputer == null )
{ {
out.appendSibling( text( "?" ) ); out.append( text( "?" ) );
} }
else else
{ {
out.appendSibling( link( out.append( link(
text( Integer.toString( serverComputer.getInstanceID() ) ), text( Integer.toString( serverComputer.getInstanceID() ) ),
"/computercraft dump " + serverComputer.getInstanceID(), "/computercraft dump " + serverComputer.getInstanceID(),
translate( "commands.computercraft.dump.action" ) translate( "commands.computercraft.dump.action" )
@@ -300,20 +301,20 @@ public final class CommandComputerCraft
} }
// And ID // And ID
out.appendText( " (id " + computerId + ")" ); out.appendString( " (id " + computerId + ")" );
// And, if we're a player, some useful links // And, if we're a player, some useful links
if( serverComputer != null && UserLevel.OP.test( source ) && isPlayer( source ) ) if( serverComputer != null && UserLevel.OP.test( source ) && isPlayer( source ) )
{ {
out out
.appendText( " " ) .appendString( " " )
.appendSibling( link( .append( link(
text( "\u261b" ), text( "\u261b" ),
"/computercraft tp " + serverComputer.getInstanceID(), "/computercraft tp " + serverComputer.getInstanceID(),
translate( "commands.computercraft.tp.action" ) translate( "commands.computercraft.tp.action" )
) ) ) )
.appendText( " " ) .appendString( " " )
.appendSibling( link( .append( link(
text( "\u20e2" ), text( "\u20e2" ),
"/computercraft view " + serverComputer.getInstanceID(), "/computercraft view " + serverComputer.getInstanceID(),
translate( "commands.computercraft.view.action" ) translate( "commands.computercraft.view.action" )

View File

@@ -12,6 +12,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.Style;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.util.text.event.ClickEvent; import net.minecraft.util.text.event.ClickEvent;
import net.minecraft.util.text.event.HoverEvent; import net.minecraft.util.text.event.HoverEvent;
@@ -57,10 +58,8 @@ public final class CommandCopy
public static ITextComponent createCopyText( String text ) public static ITextComponent createCopyText( String text )
{ {
StringTextComponent name = new StringTextComponent( text ); return new StringTextComponent( text ).mergeStyle( Style.EMPTY
name.getStyle()
.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, PREFIX + text ) ) .setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, PREFIX + text ) )
.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new TranslationTextComponent( "gui.computercraft.tooltip.copy" ) ) ); .setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new TranslationTextComponent( "gui.computercraft.tooltip.copy" ) ) ) );
return name;
} }
} }

View File

@@ -13,6 +13,7 @@ import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode; import com.mojang.brigadier.tree.LiteralCommandNode;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
@@ -173,12 +174,12 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder<Command
temp.addChild( node ); temp.addChild( node );
String usage = dispatcher.getSmartUsage( temp, context.getSource() ).get( node ).substring( node.getName().length() ); String usage = dispatcher.getSmartUsage( temp, context.getSource() ).get( node ).substring( node.getName().length() );
ITextComponent output = new StringTextComponent( "" ) IFormattableTextComponent output = new StringTextComponent( "" )
.appendSibling( coloured( "/" + command + usage, HEADER ) ) .append( coloured( "/" + command + usage, HEADER ) )
.appendText( " " ) .appendString( " " )
.appendSibling( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) ) .append( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) )
.appendText( "\n" ) .appendString( "\n" )
.appendSibling( translate( "commands." + id + ".desc" ) ); .append( translate( "commands." + id + ".desc" ) );
for( CommandNode<CommandSource> child : node.getChildren() ) for( CommandNode<CommandSource> child : node.getChildren() )
{ {
@@ -187,16 +188,16 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder<Command
continue; continue;
} }
output.appendText( "\n" ); output.appendString( "\n" );
ITextComponent component = coloured( child.getName(), NAME ); IFormattableTextComponent component = coloured( child.getName(), NAME );
component.getStyle().setClickEvent( new ClickEvent( component.getStyle().setClickEvent( new ClickEvent(
ClickEvent.Action.SUGGEST_COMMAND, ClickEvent.Action.SUGGEST_COMMAND,
"/" + command + " " + child.getName() "/" + 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; return output;

View File

@@ -19,69 +19,67 @@ public final class ChatHelpers
private 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 ); return new StringTextComponent( text == null ? "" : text ).mergeStyle( colour );
component.getStyle().setColor( colour ); }
public static <T extends IFormattableTextComponent> T coloured( T component, TextFormatting colour )
{
component.mergeStyle( colour );
return component; return component;
} }
public static <T extends ITextComponent> T coloured( T component, TextFormatting colour ) public static IFormattableTextComponent text( String text )
{
component.getStyle().setColor( colour );
return component;
}
public static ITextComponent text( String text )
{ {
return new StringTextComponent( text == null ? "" : 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 ); 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 ); 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 ) for( ITextComponent child : children )
{ {
component.appendSibling( child ); component.append( child );
} }
return component; return component;
} }
public static ITextComponent position( BlockPos pos ) public static IFormattableTextComponent position( BlockPos pos )
{ {
if( pos == null ) return translate( "commands.computercraft.generic.no_position" ); if( pos == null ) return translate( "commands.computercraft.generic.no_position" );
return translate( "commands.computercraft.generic.position", pos.getX(), pos.getY(), pos.getZ() ); 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 return value
? coloured( translate( "commands.computercraft.generic.yes" ), TextFormatting.GREEN ) ? coloured( translate( "commands.computercraft.generic.yes" ), TextFormatting.GREEN )
: coloured( translate( "commands.computercraft.generic.no" ), TextFormatting.RED ); : 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(); Style style = component.getStyle();
if( style.getColor() == null ) style.setColor( TextFormatting.YELLOW ); if( style.getColor() == null ) style = style.setFormatting( TextFormatting.YELLOW );
style.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ) ); style = style.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ) );
style.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, toolTip ) ); 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 ); return coloured( text, HEADER );
} }

View File

@@ -79,12 +79,12 @@ public interface TableFormatter
StringTextComponent line = new StringTextComponent( "" ); StringTextComponent line = new StringTextComponent( "" );
for( int i = 0; i < columns - 1; i++ ) for( int i = 0; i < columns - 1; i++ )
{ {
line.appendSibling( headers[i] ); line.append( headers[i] );
ITextComponent padding = getPadding( headers[i], maxWidths[i] ); ITextComponent padding = getPadding( headers[i], maxWidths[i] );
if( padding != null ) line.appendSibling( padding ); if( padding != null ) line.append( padding );
line.appendSibling( SEPARATOR ); line.append( SEPARATOR );
} }
line.appendSibling( headers[columns - 1] ); line.append( headers[columns - 1] );
writeLine( rowId++, line ); writeLine( rowId++, line );
@@ -100,12 +100,12 @@ public interface TableFormatter
StringTextComponent line = new StringTextComponent( "" ); StringTextComponent line = new StringTextComponent( "" );
for( int i = 0; i < columns - 1; i++ ) for( int i = 0; i < columns - 1; i++ )
{ {
line.appendSibling( row[i] ); line.append( row[i] );
ITextComponent padding = getPadding( row[i], maxWidths[i] ); ITextComponent padding = getPadding( row[i], maxWidths[i] );
if( padding != null ) line.appendSibling( padding ); if( padding != null ) line.append( padding );
line.appendSibling( SEPARATOR ); line.append( SEPARATOR );
} }
line.appendSibling( row[columns - 1] ); line.append( row[columns - 1] );
writeLine( rowId++, line ); writeLine( rowId++, line );
} }

View File

@@ -105,9 +105,9 @@ public abstract class TileGeneric extends TileEntity
} }
@Override @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 ); readDescription( tag );
} }
} }

View File

@@ -16,6 +16,8 @@ import net.minecraft.block.BlockState;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.loot.LootContext;
import net.minecraft.loot.LootParameters;
import net.minecraft.stats.Stats; import net.minecraft.stats.Stats;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
@@ -23,12 +25,11 @@ import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; 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 net.minecraftforge.fml.RegistryObject;
import javax.annotation.Nonnull; 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 ) public void onBlockHarvested( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull PlayerEntity player )
{ {
if( !(world instanceof ServerWorld) ) return; 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 // We drop the item here instead of doing it in the harvest method, as we should
// drop computers for creative players too. // drop computers for creative players too.
@@ -147,19 +149,19 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
if( tile instanceof TileComputerBase ) if( tile instanceof TileComputerBase )
{ {
TileComputerBase computer = (TileComputerBase) tile; TileComputerBase computer = (TileComputerBase) tile;
LootContext.Builder context = new LootContext.Builder( (ServerWorld) world ) LootContext.Builder context = new LootContext.Builder( serverWorld )
.withRandom( world.rand ) .withRandom( world.rand )
.withParameter( LootParameters.POSITION, pos ) .withParameter( LootParameters.field_237457_g_, Vector3d.copyCentered( pos ) )
.withParameter( LootParameters.TOOL, player.getHeldItemMainhand() ) .withParameter( LootParameters.TOOL, player.getHeldItemMainhand() )
.withParameter( LootParameters.THIS_ENTITY, player ) .withParameter( LootParameters.THIS_ENTITY, player )
.withNullableParameter( LootParameters.BLOCK_ENTITY, tile ) .withParameter( LootParameters.BLOCK_ENTITY, tile )
.withDynamicDrop( DROP, ( ctx, out ) -> out.accept( getItem( computer ) ) ); .withDynamicDrop( DROP, ( ctx, out ) -> out.accept( getItem( computer ) ) );
for( ItemStack item : state.getDrops( context ) ) for( ItemStack item : state.getDrops( context ) )
{ {
spawnAsEntity( world, pos, item ); spawnAsEntity( world, pos, item );
} }
state.spawnAdditionalDrops( world, pos, player.getHeldItemMainhand() ); state.spawnAdditionalDrops( serverWorld, pos, player.getHeldItemMainhand() );
} }
} }

View File

@@ -14,8 +14,8 @@ import net.minecraft.command.ICommandSource;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
@@ -25,6 +25,7 @@ import net.minecraft.world.server.ServerWorld;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
public class TileCommandComputer extends TileComputer public class TileCommandComputer extends TileComputer
{ {
@@ -48,7 +49,7 @@ public class TileCommandComputer extends TileComputer
} }
@Override @Override
public void sendMessage( @Nonnull ITextComponent textComponent ) public void sendMessage( @Nonnull ITextComponent textComponent, @Nonnull UUID id )
{ {
output.put( output.size() + 1, textComponent.getString() ); output.put( output.size() + 1, textComponent.getString() );
} }
@@ -96,7 +97,7 @@ public class TileCommandComputer extends TileComputer
} }
return new CommandSource( receiver, 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, (ServerWorld) getWorld(), 2,
name, new StringTextComponent( name ), name, new StringTextComponent( name ),
getWorld().getServer(), null getWorld().getServer(), null

View File

@@ -189,9 +189,9 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
} }
@Override @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 // Load ID, label and power state
m_computerID = nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1; m_computerID = nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1;

View File

@@ -24,7 +24,7 @@ public enum ComputerState implements IStringSerializable
@Nonnull @Nonnull
@Override @Override
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -43,7 +43,7 @@ public abstract class ItemComputerBase extends BlockItem implements IComputerIte
if( id >= 0 ) if( id >= 0 )
{ {
list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id ) list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id )
.applyTextStyle( TextFormatting.GRAY ) ); .mergeStyle( TextFormatting.GRAY ) );
} }
} }
} }

View File

@@ -5,12 +5,13 @@
*/ */
package dan200.computercraft.shared.data; 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.tileentity.TileEntity;
import net.minecraft.util.INameable; 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 javax.annotation.Nonnull;
import java.util.Collections; import java.util.Collections;
@@ -22,6 +23,8 @@ import java.util.Set;
public final class BlockNamedEntityLootCondition implements ILootCondition public final class BlockNamedEntityLootCondition implements ILootCondition
{ {
public static final BlockNamedEntityLootCondition INSTANCE = new BlockNamedEntityLootCondition(); public static final BlockNamedEntityLootCondition INSTANCE = new BlockNamedEntityLootCondition();
public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
public static final IBuilder BUILDER = () -> INSTANCE;
private BlockNamedEntityLootCondition() private BlockNamedEntityLootCondition()
{ {
@@ -41,8 +44,10 @@ public final class BlockNamedEntityLootCondition implements ILootCondition
return Collections.singleton( LootParameters.BLOCK_ENTITY ); return Collections.singleton( LootParameters.BLOCK_ENTITY );
} }
public static IBuilder builder() @Override
@Nonnull
public LootConditionType func_230419_b_()
{ {
return () -> INSTANCE; return TYPE;
} }
} }

View File

@@ -8,34 +8,34 @@ package dan200.computercraft.shared.data;
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializationContext;
import net.minecraft.util.ResourceLocation; import net.minecraft.loot.ILootSerializer;
import net.minecraft.world.storage.loot.conditions.ILootCondition; import net.minecraft.loot.LootConditionType;
import net.minecraft.loot.conditions.ILootCondition;
import javax.annotation.Nonnull; 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 final T instance;
private ConstantLootConditionSerializer( ResourceLocation id, Class<T> klass, T instance ) public ConstantLootConditionSerializer( T instance )
{ {
super( id, klass );
this.instance = instance; 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 @Override
public void serialize( @Nonnull JsonObject json, @Nonnull T object, @Nonnull JsonSerializationContext context ) public void func_230424_a_( @Nonnull JsonObject json, @Nonnull T object, @Nonnull JsonSerializationContext context )
{ {
} }
@Nonnull @Nonnull
@Override @Override
public T deserialize( @Nonnull JsonObject json, @Nonnull JsonDeserializationContext context ) public T func_230423_a_( @Nonnull JsonObject json, @Nonnull JsonDeserializationContext context )
{ {
return instance; return instance;
} }

View File

@@ -6,11 +6,12 @@
package dan200.computercraft.shared.data; package dan200.computercraft.shared.data;
import dan200.computercraft.shared.computer.blocks.IComputerTile; 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.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 javax.annotation.Nonnull;
import java.util.Collections; import java.util.Collections;
@@ -22,6 +23,8 @@ import java.util.Set;
public final class HasComputerIdLootCondition implements ILootCondition public final class HasComputerIdLootCondition implements ILootCondition
{ {
public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition(); public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition();
public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
public static final IBuilder BUILDER = () -> INSTANCE;
private HasComputerIdLootCondition() private HasComputerIdLootCondition()
{ {
@@ -41,8 +44,10 @@ public final class HasComputerIdLootCondition implements ILootCondition
return Collections.singleton( LootParameters.BLOCK_ENTITY ); return Collections.singleton( LootParameters.BLOCK_ENTITY );
} }
public static IBuilder builder() @Override
@Nonnull
public LootConditionType func_230419_b_()
{ {
return () -> INSTANCE; return TYPE;
} }
} }

View File

@@ -7,10 +7,11 @@ package dan200.computercraft.shared.data;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.storage.loot.LootContext; import net.minecraft.loot.LootConditionType;
import net.minecraft.world.storage.loot.LootParameter; import net.minecraft.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameters; import net.minecraft.loot.LootParameter;
import net.minecraft.world.storage.loot.conditions.ILootCondition; import net.minecraft.loot.LootParameters;
import net.minecraft.loot.conditions.ILootCondition;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Collections; import java.util.Collections;
@@ -22,6 +23,8 @@ import java.util.Set;
public final class PlayerCreativeLootCondition implements ILootCondition public final class PlayerCreativeLootCondition implements ILootCondition
{ {
public static final PlayerCreativeLootCondition INSTANCE = new PlayerCreativeLootCondition(); public static final PlayerCreativeLootCondition INSTANCE = new PlayerCreativeLootCondition();
public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
public static final IBuilder BUILDER = () -> INSTANCE;
private PlayerCreativeLootCondition() private PlayerCreativeLootCondition()
{ {
@@ -41,8 +44,10 @@ public final class PlayerCreativeLootCondition implements ILootCondition
return Collections.singleton( LootParameters.THIS_ENTITY ); return Collections.singleton( LootParameters.THIS_ENTITY );
} }
public static IBuilder builder() @Override
@Nonnull
public LootConditionType func_230419_b_()
{ {
return () -> INSTANCE; return TYPE;
} }
} }

View File

@@ -69,7 +69,7 @@ public class ItemDisk extends Item implements IMedia, IColouredItem
if( id >= 0 ) if( id >= 0 )
{ {
list.add( new TranslationTextComponent( "gui.computercraft.tooltip.disk_id", id ) list.add( new TranslationTextComponent( "gui.computercraft.tooltip.disk_id", id )
.applyTextStyle( TextFormatting.GRAY ) ); .mergeStyle( TextFormatting.GRAY ) );
} }
} }
} }

View File

@@ -19,14 +19,14 @@ import net.minecraft.item.crafting.SpecialRecipe;
import net.minecraft.item.crafting.SpecialRecipeSerializer; import net.minecraft.item.crafting.SpecialRecipeSerializer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.Tags;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
public class DiskRecipe extends SpecialRecipe public class DiskRecipe extends SpecialRecipe
{ {
private final Ingredient paper = Ingredient.fromItems( Items.PAPER ); 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 ) public DiskRecipe( ResourceLocation id )
{ {

View File

@@ -13,7 +13,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation; 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.World;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.fml.network.NetworkDirection; import net.minecraftforge.fml.network.NetworkDirection;
@@ -76,9 +76,9 @@ public final class NetworkHandler
network.sendToServer( packet ); 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.func_234923_W_() );
network.send( PacketDistributor.NEAR.with( () -> target ), packet ); network.send( PacketDistributor.NEAR.with( () -> target ), packet );
} }

View File

@@ -10,6 +10,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
@@ -79,7 +80,7 @@ public class PlayRecordClientMessage implements NetworkMessage
public void handle( NetworkEvent.Context context ) public void handle( NetworkEvent.Context context )
{ {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
mc.worldRenderer.playRecord( soundEvent, pos ); mc.worldRenderer.playRecord( soundEvent, pos, null );
if( name != null ) mc.ingameGUI.setRecordPlayingMessage( name ); if( name != null ) mc.ingameGUI.func_238451_a_( new StringTextComponent( name ) );
} }
} }

View File

@@ -24,7 +24,7 @@ public enum DiskDriveState implements IStringSerializable
@Override @Override
@Nonnull @Nonnull
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -122,10 +122,10 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory
} }
@Override @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.func_240643_a_( nbt.getString( NBT_NAME ) ) : null;
if( nbt.contains( NBT_ITEM ) ) if( nbt.contains( NBT_ITEM ) )
{ {
CompoundNBT item = nbt.getCompound( NBT_ITEM ); CompoundNBT item = nbt.getCompound( NBT_ITEM );

View File

@@ -8,7 +8,7 @@ package dan200.computercraft.shared.peripheral.generic.data;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.state.IProperty; import net.minecraft.state.Property;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.HashMap; import java.util.HashMap;
@@ -22,9 +22,9 @@ public class BlockData
data.put( "name", DataHelpers.getId( state.getBlock() ) ); data.put( "name", DataHelpers.getId( state.getBlock() ) );
Map<Object, Object> stateTable = new HashMap<>(); 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() ) ); stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) );
} }
data.put( "state", stateTable ); data.put( "state", stateTable );
@@ -34,7 +34,7 @@ public class BlockData
} }
@SuppressWarnings( { "unchecked", "rawtypes" } ) @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; if( value instanceof String || value instanceof Number || value instanceof Boolean ) return value;
return property.getName( value ); return property.getName( value );

View File

@@ -113,7 +113,7 @@ public class ItemData
{ {
try try
{ {
return ITextComponent.Serializer.fromJson( x.getString() ); return ITextComponent.Serializer.func_240643_a_( x.getString() );
} }
catch( JsonParseException e ) catch( JsonParseException e )
{ {
@@ -164,7 +164,7 @@ public class ItemData
enchants.ensureCapacity( enchants.size() + rawEnchants.size() ); 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(); Enchantment enchantment = entry.getKey();
Integer level = entry.getValue(); Integer level = entry.getValue();

View File

@@ -13,7 +13,7 @@ import dan200.computercraft.api.network.IPacketSender;
import dan200.computercraft.api.network.Packet; import dan200.computercraft.api.network.Packet;
import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral; 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 net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -171,7 +171,7 @@ public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPa
parseChannel( replyChannel ); parseChannel( replyChannel );
World world = getWorld(); World world = getWorld();
Vec3d position = getPosition(); Vector3d position = getPosition();
IPacketNetwork network = m_network; IPacketNetwork network = m_network;
if( world == null || position == null || network == null ) return; if( world == null || position == null || network == null ) return;

View File

@@ -15,7 +15,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.IWaterLoggable; import net.minecraft.block.IWaterLoggable;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; 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.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
@@ -100,7 +100,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
} }
@Override @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 ) if( state.get( CABLE ) && state.get( MODEM ).getFacing() != null )
{ {
@@ -180,7 +180,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
@Nonnull @Nonnull
@Override @Override
@Deprecated @Deprecated
public IFluidState getFluidState( @Nonnull BlockState state ) public FluidState getFluidState( @Nonnull BlockState state )
{ {
return getWaterloggedFluidState( state ); return getWaterloggedFluidState( state );
} }
@@ -207,9 +207,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
Direction facing = state.get( MODEM ).getFacing(); Direction facing = state.get( MODEM ).getFacing();
if( facing == null ) return true; if( facing == null ) return true;
BlockPos offsetPos = pos.offset( facing ); return hasEnoughSolidSide( world, pos.offset( facing ), facing.getOpposite() );
BlockState offsetState = world.getBlockState( offsetPos );
return hasSolidSide( offsetState, world, offsetPos, facing.getOpposite() );
} }
@Nullable @Nullable

View File

@@ -65,7 +65,7 @@ public enum CableModemVariant implements IStringSerializable
@Nonnull @Nonnull
@Override @Override
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -28,7 +28,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; 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.util.text.TranslationTextComponent;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@@ -58,10 +58,10 @@ public class TileCable extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = getPos(); 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 @Override
@@ -103,10 +103,10 @@ public class TileCable extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = getPos().offset( modemDirection ); 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 @Nonnull
@@ -281,9 +281,9 @@ public class TileCable extends TileGeneric
} }
@Override @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_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED );
m_peripheral.read( nbt, "" ); m_peripheral.read( nbt, "" );
} }
@@ -422,12 +422,6 @@ public class TileCable extends TileGeneric
m_node.updatePeripherals( peripherals ); m_node.updatePeripherals( peripherals );
} }
@Override
public boolean canRenderBreaking()
{
return true;
}
@Nonnull @Nonnull
@Override @Override
public <T> LazyOptional<T> getCapability( @Nonnull Capability<T> capability, @Nullable Direction side ) public <T> LazyOptional<T> getCapability( @Nonnull Capability<T> capability, @Nullable Direction side )

View File

@@ -26,7 +26,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; 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.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World; import net.minecraft.world.World;
@@ -85,10 +85,10 @@ public class TileWiredModemFull extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = m_entity.getPos(); 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( "" ); StringTextComponent base = new StringTextComponent( "" );
for( int i = 0; i < names.size(); i++ ) for( int i = 0; i < names.size(); i++ )
{ {
if( i > 0 ) base.appendText( ", " ); if( i > 0 ) base.appendString( ", " );
base.appendSibling( CommandCopy.createCopyText( names.get( i ) ) ); base.append( CommandCopy.createCopyText( names.get( i ) ) );
} }
player.sendStatusMessage( new TranslationTextComponent( kind, base ), false ); player.sendStatusMessage( new TranslationTextComponent( kind, base ), false );
} }
@Override @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_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED );
for( int i = 0; i < m_peripherals.length; i++ ) m_peripherals[i].read( nbt, Integer.toString( i ) ); 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 @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = getPos().offset( side ); 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 @Nonnull

View File

@@ -10,7 +10,7 @@ import dan200.computercraft.shared.peripheral.modem.ModemShapes;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.IWaterLoggable; import net.minecraft.block.IWaterLoggable;
import net.minecraft.fluid.IFluidState; import net.minecraft.fluid.FluidState;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.DirectionProperty; import net.minecraft.state.DirectionProperty;
@@ -62,7 +62,7 @@ public class BlockWirelessModem extends BlockGeneric implements IWaterLoggable
@Nonnull @Nonnull
@Override @Override
@Deprecated @Deprecated
public IFluidState getFluidState( @Nonnull BlockState state ) public FluidState getFluidState( @Nonnull BlockState state )
{ {
return getWaterloggedFluidState( state ); return getWaterloggedFluidState( state );
} }
@@ -80,12 +80,10 @@ public class BlockWirelessModem extends BlockGeneric implements IWaterLoggable
@Override @Override
@Deprecated @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 ); Direction facing = state.get( FACING );
BlockPos offsetPos = pos.offset( facing ); return hasEnoughSolidSide( world, pos.offset( facing ), facing.getOpposite() );
BlockState offsetState = world.getBlockState( offsetPos );
return hasSolidSide( offsetState, world, offsetPos, facing.getOpposite() );
} }
@Nullable @Nullable

View File

@@ -15,7 +15,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
@@ -46,10 +46,10 @@ public class TileWirelessModem extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = entity.getPos().offset( entity.modemDirection ); 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 @Override

View File

@@ -9,7 +9,7 @@ import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.network.IPacketNetwork; import dan200.computercraft.api.network.IPacketNetwork;
import dan200.computercraft.shared.peripheral.modem.ModemPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemPeripheral;
import dan200.computercraft.shared.peripheral.modem.ModemState; 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; import net.minecraft.world.World;
public abstract class WirelessModemPeripheral extends ModemPeripheral public abstract class WirelessModemPeripheral extends ModemPeripheral
@@ -40,7 +40,7 @@ public abstract class WirelessModemPeripheral extends ModemPeripheral
World world = getWorld(); World world = getWorld();
if( world != null ) if( world != null )
{ {
Vec3d position = getPosition(); Vector3d position = getPosition();
double minRange = ComputerCraft.modemRange; double minRange = ComputerCraft.modemRange;
double maxRange = ComputerCraft.modemHighAltitudeRange; double maxRange = ComputerCraft.modemHighAltitudeRange;
if( world.isRaining() && world.isThundering() ) if( world.isRaining() && world.isThundering() )

View File

@@ -59,7 +59,7 @@ public enum MonitorEdgeState implements IStringSerializable
@Nonnull @Nonnull
@Override @Override
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -14,6 +14,7 @@ import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.network.client.TerminalState; import dan200.computercraft.shared.network.client.TerminalState;
import dan200.computercraft.shared.util.CapabilityUtil; import dan200.computercraft.shared.util.CapabilityUtil;
import dan200.computercraft.shared.util.TickScheduler; import dan200.computercraft.shared.util.TickScheduler;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@@ -134,13 +135,14 @@ public class TileMonitor extends TileGeneric
} }
@Override @Override
public void read( @Nonnull CompoundNBT tag ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( tag ); super.read( state, nbt );
m_xIndex = tag.getInt( NBT_X );
m_yIndex = tag.getInt( NBT_Y ); m_xIndex = nbt.getInt( NBT_X );
m_width = tag.getInt( NBT_WIDTH ); m_yIndex = nbt.getInt( NBT_Y );
m_height = tag.getInt( NBT_HEIGHT ); m_width = nbt.getInt( NBT_WIDTH );
m_height = nbt.getInt( NBT_HEIGHT );
} }
@Override @Override

View File

@@ -46,8 +46,8 @@ public class PrinterPeripheral implements IPeripheral
* Writes text to the current page. * Writes text to the current page.
* *
* @param arguments The values to write to the 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. * @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 @LuaFunction
public final void write( IArguments arguments ) throws LuaException 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. * Returns the current position of the cursor on the page.
* *
* @return The position of the cursor. * @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 X position of the cursor.
* @cc.treturn number The Y position of the cursor. * @cc.treturn number The Y position of the cursor.
* @throws LuaException If a page isn't being printed.
*/ */
@LuaFunction @LuaFunction
public final Object[] getCursorPos() throws LuaException public final Object[] getCursorPos() throws LuaException
@@ -93,9 +93,9 @@ public class PrinterPeripheral implements IPeripheral
* Returns the size of the current page. * Returns the size of the current page.
* *
* @return The size of the 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 width of the page.
* @cc.treturn number The height of the page. * @cc.treturn number The height of the page.
* @throws LuaException If a page isn't being printed.
*/ */
@LuaFunction @LuaFunction
public final Object[] getPageSize() throws LuaException public final Object[] getPageSize() throws LuaException

View File

@@ -22,7 +22,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.math.BlockRayTraceResult; 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.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@@ -91,11 +91,11 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
} }
@Override @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.func_240643_a_( nbt.getString( NBT_NAME ) ) : null;
// Read page // Read page
synchronized( m_page ) synchronized( m_page )
@@ -403,7 +403,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
setInventorySlotContents( i, ItemStack.EMPTY ); setInventorySlotContents( i, ItemStack.EMPTY );
// Spawn the item in the world // 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 ) );
} }
} }
} }

View File

@@ -16,7 +16,7 @@ import net.minecraft.state.properties.NoteBlockInstrument;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.ResourceLocationException; import net.minecraft.util.ResourceLocationException;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -44,7 +44,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
public abstract World getWorld(); public abstract World getWorld();
public abstract Vec3d getPosition(); public abstract Vector3d getPosition();
public boolean madeSound( long ticks ) 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. * with an optional volume and speed multiplier, and plays it through the speaker.
* *
* @param context The Lua context * @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 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. * @return Whether the sound could be played.
* @throws LuaException If the sound name couldn't be decoded. * @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. * and 6 and 18 map to C.
* *
* @param context The Lua context * @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 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. * @return Whether the note could be played.
* @throws LuaException If the instrument doesn't exist. * @throws LuaException If the instrument doesn't exist.
*/ */
@@ -117,7 +117,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
NoteBlockInstrument instrument = null; NoteBlockInstrument instrument = null;
for( NoteBlockInstrument testInstrument : NoteBlockInstrument.values() ) for( NoteBlockInstrument testInstrument : NoteBlockInstrument.values() )
{ {
if( testInstrument.getName().equalsIgnoreCase( name ) ) if( testInstrument.getString().equalsIgnoreCase( name ) )
{ {
instrument = testInstrument; instrument = testInstrument;
break; break;
@@ -144,7 +144,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
} }
World world = getWorld(); World world = getWorld();
Vec3d pos = getPosition(); Vector3d pos = getPosition();
context.issueMainThreadTask( () -> { context.issueMainThreadTask( () -> {
MinecraftServer server = world.getServer(); MinecraftServer server = world.getServer();
@@ -152,7 +152,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
float adjVolume = Math.min( volume, 3.0f ); float adjVolume = Math.min( volume, 3.0f );
server.getPlayerList().sendToAllNearExcept( 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.func_234923_W_(),
new SPlaySoundPacket( name, SoundCategory.RECORDS, pos, adjVolume, pitch ) new SPlaySoundPacket( name, SoundCategory.RECORDS, pos, adjVolume, pitch )
); );
return null; return null;

View File

@@ -12,7 +12,7 @@ import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
@@ -77,10 +77,10 @@ public class TileSpeaker extends TileGeneric implements ITickableTileEntity
} }
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = speaker.getPos(); BlockPos pos = speaker.getPos();
return new Vec3d( pos.getX(), pos.getY(), pos.getZ() ); return new Vector3d( pos.getX(), pos.getY(), pos.getZ() );
} }
@Override @Override

View File

@@ -27,12 +27,14 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.IItemPropertyGetter;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; 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.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
@@ -60,8 +62,6 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
{ {
super( settings ); super( settings );
this.family = family; 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 ) 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 ) if( id >= 0 )
{ {
list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id ) list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id )
.applyTextStyle( TextFormatting.GRAY ) ); .mergeStyle( TextFormatting.GRAY ) );
} }
} }
} }
@@ -408,7 +408,4 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
{ {
return stack.getOrCreateChildTag( NBT_UPGRADE_INFO ); 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;
} }

View File

@@ -8,7 +8,7 @@ package dan200.computercraft.shared.pocket.peripherals;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.ModemState;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral; 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 net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -16,14 +16,14 @@ import javax.annotation.Nonnull;
public class PocketModemPeripheral extends WirelessModemPeripheral public class PocketModemPeripheral extends WirelessModemPeripheral
{ {
private World world = null; private World world = null;
private Vec3d position = Vec3d.ZERO; private Vector3d position = Vector3d.ZERO;
public PocketModemPeripheral( boolean advanced ) public PocketModemPeripheral( boolean advanced )
{ {
super( new ModemState(), advanced ); super( new ModemState(), advanced );
} }
void setLocation( World world, Vec3d position ) void setLocation( World world, Vector3d position )
{ {
this.position = position; this.position = position;
this.world = world; this.world = world;
@@ -38,7 +38,7 @@ public class PocketModemPeripheral extends WirelessModemPeripheral
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
return position; return position;
} }

View File

@@ -7,15 +7,15 @@ package dan200.computercraft.shared.pocket.peripherals;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral; 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; import net.minecraft.world.World;
public class PocketSpeakerPeripheral extends SpeakerPeripheral public class PocketSpeakerPeripheral extends SpeakerPeripheral
{ {
private World world = null; 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.position = position;
this.world = world; this.world = world;
@@ -28,7 +28,7 @@ public class PocketSpeakerPeripheral extends SpeakerPeripheral
} }
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
return world != null ? position : null; return world != null ? position : null;
} }

View File

@@ -19,7 +19,6 @@ import dan200.computercraft.shared.computer.core.IComputer;
import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.IContainerComputer;
import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition; import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
import dan200.computercraft.shared.data.ConstantLootConditionSerializer;
import dan200.computercraft.shared.data.HasComputerIdLootCondition; import dan200.computercraft.shared.data.HasComputerIdLootCondition;
import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
import dan200.computercraft.shared.media.items.RecordMedia; 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.inventory.container.Container;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.MusicDiscItem; import net.minecraft.item.MusicDiscItem;
import net.minecraft.loot.*;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.ConstantRange; import net.minecraft.util.registry.Registry;
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.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.event.LootTableLoadEvent; import net.minecraftforge.event.LootTableLoadEvent;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.player.PlayerContainerEvent; import net.minecraftforge.event.entity.player.PlayerContainerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.server.FMLServerStartedEvent; import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; import net.minecraftforge.fml.event.server.FMLServerStoppedEvent;
import java.util.Arrays; import java.util.Arrays;
@@ -68,23 +64,14 @@ public final class ComputerCraftProxyCommon
public static void registerLoot() public static void registerLoot()
{ {
LootConditionManager.registerCondition( ConstantLootConditionSerializer.of( registerCondition( "block_named", BlockNamedEntityLootCondition.TYPE );
new ResourceLocation( ComputerCraft.MOD_ID, "block_named" ), registerCondition( "player_creative", PlayerCreativeLootCondition.TYPE );
BlockNamedEntityLootCondition.class, registerCondition( "has_id", HasComputerIdLootCondition.TYPE );
BlockNamedEntityLootCondition.INSTANCE }
) );
LootConditionManager.registerCondition( ConstantLootConditionSerializer.of( private static void registerCondition( String name, LootConditionType serializer )
new ResourceLocation( ComputerCraft.MOD_ID, "player_creative" ), {
PlayerCreativeLootCondition.class, Registry.register( Registry.LOOT_CONDITION_TYPE, new ResourceLocation( ComputerCraft.MOD_ID, name ), serializer );
PlayerCreativeLootCondition.INSTANCE
) );
LootConditionManager.registerCondition( ConstantLootConditionSerializer.of(
new ResourceLocation( ComputerCraft.MOD_ID, "has_id" ),
HasComputerIdLootCondition.class,
HasComputerIdLootCondition.INSTANCE
) );
} }
private static void registerProviders() private static void registerProviders()
@@ -152,9 +139,9 @@ public final class ComputerCraftProxyCommon
} }
@SubscribeEvent @SubscribeEvent
public static void onServerStarting( FMLServerStartingEvent event ) public static void onRegisterCommand( RegisterCommandsEvent event )
{ {
CommandComputerCraft.register( event.getCommandDispatcher() ); CommandComputerCraft.register( event.getDispatcher() );
} }
@SubscribeEvent @SubscribeEvent

View File

@@ -20,7 +20,7 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.DamagingProjectileEntity; 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.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.state.DirectionProperty; import net.minecraft.state.DirectionProperty;
@@ -31,11 +31,14 @@ import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; 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.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes; 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 net.minecraftforge.fml.RegistryObject;
import javax.annotation.Nonnull; 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 ) public VoxelShape getShape( @Nonnull BlockState state, IBlockReader world, @Nonnull BlockPos pos, @Nonnull ISelectionContext context )
{ {
TileEntity tile = world.getTileEntity( pos ); TileEntity tile = world.getTileEntity( pos );
Vec3d offset = tile instanceof TileTurtle ? ((TileTurtle) tile).getRenderOffset( 1.0f ) : Vec3d.ZERO; Vector3d offset = tile instanceof TileTurtle ? ((TileTurtle) tile).getRenderOffset( 1.0f ) : Vector3d.ZERO;
return offset.equals( Vec3d.ZERO ) ? DEFAULT_SHAPE : DEFAULT_SHAPE.withOffset( offset.x, offset.y, offset.z ); return offset.equals( Vector3d.ZERO ) ? DEFAULT_SHAPE : DEFAULT_SHAPE.withOffset( offset.x, offset.y, offset.z );
} }
@Nullable @Nullable
@@ -98,7 +101,7 @@ public class BlockTurtle extends BlockComputerBase<TileTurtle> implements IWater
@Nonnull @Nonnull
@Override @Override
@Deprecated @Deprecated
public IFluidState getFluidState( @Nonnull BlockState state ) public FluidState getFluidState( @Nonnull BlockState state )
{ {
return getWaterloggedFluidState( state ); return getWaterloggedFluidState( state );
} }
@@ -151,14 +154,15 @@ public class BlockTurtle extends BlockComputerBase<TileTurtle> implements IWater
} }
@Override @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 ) if( getFamily() == ComputerFamily.ADVANCED || exploder instanceof LivingEntity || exploder instanceof DamagingProjectileEntity )
{ {
return 2000; return 2000;
} }
return super.getExplosionResistance( state, world, pos, exploder, explosion ); return super.getExplosionResistance( state, world, pos, explosion );
} }
@Nonnull @Nonnull

View File

@@ -10,7 +10,7 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade;
import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleSide;
import dan200.computercraft.shared.computer.blocks.IComputerTile; import dan200.computercraft.shared.computer.blocks.IComputerTile;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
public interface ITurtleTile extends IComputerTile public interface ITurtleTile extends IComputerTile
{ {
@@ -22,7 +22,7 @@ public interface ITurtleTile extends IComputerTile
ITurtleAccess getAccess(); ITurtleAccess getAccess();
Vec3d getRenderOffset( float f ); Vector3d getRenderOffset( float f );
float getRenderYaw( float f ); float getRenderYaw( float f );

View File

@@ -23,6 +23,7 @@ import dan200.computercraft.shared.turtle.apis.TurtleAPI;
import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.core.TurtleBrain;
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
import dan200.computercraft.shared.util.*; import dan200.computercraft.shared.util.*;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Container;
@@ -36,7 +37,7 @@ import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; 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.capabilities.Capability;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
@@ -256,9 +257,9 @@ public class TileTurtle extends TileComputerBase implements ITurtleTile, Default
} }
@Override @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 // Read inventory
ListNBT nbttaglist = nbt.getList( "Items", Constants.NBT.TAG_COMPOUND ); ListNBT nbttaglist = nbt.getList( "Items", Constants.NBT.TAG_COMPOUND );
@@ -353,7 +354,7 @@ public class TileTurtle extends TileComputerBase implements ITurtleTile, Default
} }
@Override @Override
public Vec3d getRenderOffset( float f ) public Vector3d getRenderOffset( float f )
{ {
return m_brain.getRenderOffset( f ); return m_brain.getRenderOffset( f );
} }

View File

@@ -26,7 +26,7 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.MoverType; import net.minecraft.entity.MoverType;
import net.minecraft.fluid.IFluidState; import net.minecraft.fluid.FluidState;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.DyeColor; import net.minecraft.item.DyeColor;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
@@ -38,7 +38,7 @@ import net.minecraft.util.EntityPredicates;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@@ -304,7 +304,7 @@ public class TurtleBrain implements ITurtleAccess
// Ensure we're inside the world border // Ensure we're inside the world border
if( !world.getWorldBorder().contains( pos ) ) return false; if( !world.getWorldBorder().contains( pos ) ) return false;
IFluidState existingFluid = world.getBlockState( pos ).getFluidState(); FluidState existingFluid = world.getBlockState( pos ).getFluidState();
BlockState newState = oldBlock BlockState newState = oldBlock
// We only mark this as waterlogged when travelling into a source block. This prevents us from spreading // 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 // fluid by creating a new source when moving into a block, causing the next block to be almost full and
@@ -357,11 +357,11 @@ public class TurtleBrain implements ITurtleAccess
@Nonnull @Nonnull
@Override @Override
public Vec3d getVisualPosition( float f ) public Vector3d getVisualPosition( float f )
{ {
Vec3d offset = getRenderOffset( f ); Vector3d offset = getRenderOffset( f );
BlockPos pos = m_owner.getPos(); BlockPos pos = m_owner.getPos();
return new Vec3d( return new Vector3d(
pos.getX() + 0.5 + offset.x, pos.getX() + 0.5 + offset.x,
pos.getY() + 0.5 + offset.y, pos.getY() + 0.5 + offset.y,
pos.getZ() + 0.5 + offset.z pos.getZ() + 0.5 + offset.z
@@ -659,7 +659,7 @@ public class TurtleBrain implements ITurtleAccess
m_owner.updateBlock(); m_owner.updateBlock();
} }
public Vec3d getRenderOffset( float f ) public Vector3d getRenderOffset( float f )
{ {
switch( m_animation ) switch( m_animation )
{ {
@@ -688,7 +688,7 @@ public class TurtleBrain implements ITurtleAccess
} }
double distance = -1.0 + getAnimationFraction( f ); double distance = -1.0 + getAnimationFraction( f );
return new Vec3d( return new Vector3d(
distance * dir.getXOffset(), distance * dir.getXOffset(),
distance * dir.getYOffset(), distance * dir.getYOffset(),
distance * dir.getZOffset() distance * dir.getZOffset()
@@ -696,7 +696,7 @@ public class TurtleBrain implements ITurtleAccess
} }
default: default:
{ {
return Vec3d.ZERO; return Vector3d.ZERO;
} }
} }
} }
@@ -880,7 +880,7 @@ public class TurtleBrain implements ITurtleAccess
double pushStepZ = moveDir.getZOffset() * pushStep; double pushStepZ = moveDir.getZOffset() * pushStep;
for( Entity entity : list ) for( Entity entity : list )
{ {
entity.move( MoverType.PISTON, new Vec3d( pushStepX, pushStepY, pushStepZ ) ); entity.move( MoverType.PISTON, new Vector3d( pushStepX, pushStepY, pushStepZ ) );
} }
} }
} }
@@ -893,7 +893,7 @@ public class TurtleBrain implements ITurtleAccess
Holiday currentHoliday = HolidayUtil.getCurrentHoliday(); Holiday currentHoliday = HolidayUtil.getCurrentHoliday();
if( currentHoliday == Holiday.VALENTINES ) if( currentHoliday == Holiday.VALENTINES )
{ {
Vec3d position = getVisualPosition( 1.0f ); Vector3d position = getVisualPosition( 1.0f );
if( position != null ) if( position != null )
{ {
double x = position.x + world.rand.nextGaussian() * 0.1; double x = position.x + world.rand.nextGaussian() * 0.1;

View File

@@ -28,7 +28,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; 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.StringTextComponent;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.ForgeHooks;
@@ -210,9 +210,9 @@ public class TurtlePlaceCommand implements ITurtleCommand
// See if there is an entity present // See if there is an entity present
final World world = turtle.getWorld(); final World world = turtle.getWorld();
final BlockPos position = turtle.getPosition(); final BlockPos position = turtle.getPosition();
Vec3d turtlePos = turtlePlayer.getPositionVec(); Vector3d turtlePos = turtlePlayer.getPositionVec();
Vec3d rayDir = turtlePlayer.getLook( 1.0f ); Vector3d rayDir = turtlePlayer.getLook( 1.0f );
Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 ); Pair<Entity, Vector3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 );
if( hit == null ) if( hit == null )
{ {
return stack; return stack;
@@ -224,7 +224,7 @@ public class TurtlePlaceCommand implements ITurtleCommand
// Start claiming entity drops // Start claiming entity drops
Entity hitEntity = hit.getKey(); Entity hitEntity = hit.getKey();
Vec3d hitPos = hit.getValue(); Vector3d hitPos = hit.getValue();
DropConsumer.set( DropConsumer.set(
hitEntity, hitEntity,
drop -> InventoryUtil.storeItems( drop, turtle.getItemHandler(), turtle.getSelectedSlot() ) 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 ); cancelResult = hitEntity.applyPlayerInteraction( turtlePlayer, hitPos, Hand.MAIN_HAND );
} }
if( cancelResult == ActionResultType.SUCCESS ) if( cancelResult.isSuccessOrConsume() )
{ {
placed = true; placed = true;
} }
@@ -246,19 +246,19 @@ public class TurtlePlaceCommand implements ITurtleCommand
{ {
// See EntityPlayer.interactOn // See EntityPlayer.interactOn
cancelResult = ForgeHooks.onInteractEntity( turtlePlayer, hitEntity, Hand.MAIN_HAND ); cancelResult = ForgeHooks.onInteractEntity( turtlePlayer, hitEntity, Hand.MAIN_HAND );
if( cancelResult == ActionResultType.SUCCESS ) if( cancelResult != null && cancelResult.isSuccessOrConsume() )
{ {
placed = true; placed = true;
} }
else if( cancelResult == null ) else if( cancelResult == null )
{ {
if( hitEntity.processInitialInteract( turtlePlayer, Hand.MAIN_HAND ) ) if( hitEntity.processInitialInteract( turtlePlayer, Hand.MAIN_HAND ) == ActionResultType.CONSUME )
{ {
placed = true; placed = true;
} }
else if( hitEntity instanceof LivingEntity ) 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 ); if( placed ) turtlePlayer.loadInventory( stackCopy );
} }
} }
@@ -338,7 +338,7 @@ public class TurtlePlaceCommand implements ITurtleCommand
} }
// Check if there's something suitable to place onto // 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 ); ItemUseContext context = new ItemUseContext( turtlePlayer, Hand.MAIN_HAND, hit );
if( !canDeployOnBlock( new BlockItemUseContext( context ), turtle, turtlePlayer, position, side, allowReplace, outErrorMessage ) ) 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 ); TileEntity existingTile = turtle.getWorld().getTileEntity( position );
// See PlayerInteractionManager.processRightClickBlock // See PlayerInteractionManager.processRightClickBlock
// TODO: ^ Check we're still consistent.
PlayerInteractEvent.RightClickBlock event = ForgeHooks.onRightClickBlock( turtlePlayer, Hand.MAIN_HAND, position, side ); PlayerInteractEvent.RightClickBlock event = ForgeHooks.onRightClickBlock( turtlePlayer, Hand.MAIN_HAND, position, side );
if( !event.isCanceled() ) if( !event.isCanceled() )
{ {
if( item.onItemUseFirst( stack, context ) == ActionResultType.SUCCESS ) if( item.onItemUseFirst( stack, context ).isSuccessOrConsume() )
{ {
placed = true; placed = true;
turtlePlayer.loadInventory( stackCopy ); turtlePlayer.loadInventory( stackCopy );
} }
else if( event.getUseItem() != Event.Result.DENY && else if( event.getUseItem() != Event.Result.DENY && stackCopy.onItemUse( context ).isSuccessOrConsume() )
stackCopy.onItemUse( context ) == ActionResultType.SUCCESS )
{ {
placed = true; placed = true;
turtlePlayer.loadInventory( stackCopy ); 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) ) if( !placed && (item instanceof BucketItem || item instanceof BoatItem || item instanceof LilyPadItem || item instanceof GlassBottleItem) )
{ {
ActionResultType actionResult = ForgeHooks.onItemRightClick( turtlePlayer, Hand.MAIN_HAND ); ActionResultType actionResult = ForgeHooks.onItemRightClick( turtlePlayer, Hand.MAIN_HAND );
if( actionResult == ActionResultType.SUCCESS ) if( actionResult != null && actionResult.isSuccessOrConsume() )
{ {
placed = true; placed = true;
} }
else if( actionResult == null ) else if( actionResult == null )
{ {
ActionResult<ItemStack> result = stackCopy.useItemRightClick( turtle.getWorld(), turtlePlayer, Hand.MAIN_HAND ); 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; placed = true;
turtlePlayer.loadInventory( result.getResult() ); turtlePlayer.loadInventory( result.getResult() );
@@ -405,22 +403,22 @@ public class TurtlePlaceCommand implements ITurtleCommand
String s = (String) extraArguments[0]; String s = (String) extraArguments[0];
String[] split = s.split( "\n" ); String[] split = s.split( "\n" );
int firstLine = split.length <= 2 ? 1 : 0; 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( i >= firstLine && i < firstLine + split.length )
{ {
if( split[i - firstLine].length() > 15 ) 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 else
{ {
signTile.signText[i] = new StringTextComponent( split[i - firstLine] ); signTile.setText( i, new StringTextComponent( split[i - firstLine] ) );
} }
} }
else else
{ {
signTile.signText[i] = new StringTextComponent( "" ); signTile.setText( i, new StringTextComponent( "" ) );
} }
} }
signTile.markDirty(); signTile.markDirty();

View File

@@ -25,7 +25,7 @@ import net.minecraft.tileentity.SignTileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.server.ServerWorld;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
@@ -130,9 +130,9 @@ public final class TurtlePlayer extends FakePlayer
} }
@Override @Override
public Vec3d getPositionVector() public Vector3d getPositionVec()
{ {
return getPositionVec(); return new Vector3d( getPosX(), getPosY(), getPosZ() );
} }
@Override @Override

View File

@@ -16,7 +16,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@@ -44,10 +44,10 @@ public class TurtleModem extends AbstractTurtleUpgrade
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos turtlePos = turtle.getPosition(); BlockPos turtlePos = turtle.getPosition();
return new Vec3d( return new Vector3d(
turtlePos.getX(), turtlePos.getX(),
turtlePos.getY(), turtlePos.getY(),
turtlePos.getZ() turtlePos.getZ()

View File

@@ -17,7 +17,7 @@ import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral;
import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.model.ModelResourceLocation;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@@ -42,10 +42,10 @@ public class TurtleSpeaker extends AbstractTurtleUpgrade
} }
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = turtle.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 @Override

View File

@@ -19,12 +19,10 @@ import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; 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.Entity;
import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.Attributes;
import net.minecraft.entity.item.ArmorStandEntity; 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.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@@ -32,7 +30,9 @@ import net.minecraft.util.DamageSource;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@@ -119,9 +119,9 @@ public class TurtleTool extends AbstractTurtleUpgrade
final TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, position, direction ); final TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, position, direction );
// See if there is an entity present // See if there is an entity present
Vec3d turtlePos = turtlePlayer.getPositionVec(); Vector3d turtlePos = turtlePlayer.getPositionVec();
Vec3d rayDir = turtlePlayer.getLook( 1.0f ); Vector3d rayDir = turtlePlayer.getLook( 1.0f );
Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 ); Pair<Entity, Vector3d> hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 );
if( hit != null ) if( hit != null )
{ {
// Load up the turtle's inventory // Load up the turtle's inventory
@@ -149,7 +149,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
boolean attacked = false; boolean attacked = false;
if( !hitEntity.hitByEntity( turtlePlayer ) ) if( !hitEntity.hitByEntity( turtlePlayer ) )
{ {
float damage = (float) turtlePlayer.getAttribute( SharedMonsterAttributes.ATTACK_DAMAGE ).getValue(); float damage = (float) turtlePlayer.getAttributeValue( Attributes.ATTACK_DAMAGE );
damage *= getDamageMultiplier(); damage *= getDamageMultiplier();
if( damage > 0.0f ) if( damage > 0.0f )
{ {
@@ -201,7 +201,7 @@ public class TurtleTool extends AbstractTurtleUpgrade
} }
BlockState state = world.getBlockState( blockPosition ); BlockState state = world.getBlockState( blockPosition );
IFluidState fluidState = world.getFluidState( blockPosition ); FluidState fluidState = world.getFluidState( blockPosition );
TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, turtlePosition, direction ); TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, turtlePosition, direction );
turtlePlayer.loadInventory( item.copy() ); turtlePlayer.loadInventory( item.copy() );

View File

@@ -8,7 +8,7 @@ package dan200.computercraft.shared.util;
import net.minecraft.item.DyeColor; import net.minecraft.item.DyeColor;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tags.Tag; import net.minecraft.tags.ITag;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -16,7 +16,7 @@ import javax.annotation.Nullable;
public final class ColourUtils public final class ColourUtils
{ {
@SuppressWarnings( { "unchecked", "rawtypes" } ) @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_WHITE,
Tags.Items.DYES_ORANGE, Tags.Items.DYES_ORANGE,
Tags.Items.DYES_MAGENTA, Tags.Items.DYES_MAGENTA,
@@ -44,7 +44,7 @@ public final class ColourUtils
for( int i = 0; i < DYES.length; i++ ) 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 ); if( dye.contains( stack.getItem() ) ) return DyeColor.byId( i );
} }

View File

@@ -77,7 +77,7 @@ public final class DropConsumer
{ {
// Capture any nearby item spawns // Capture any nearby item spawns
if( dropWorld == event.getWorld() && event.getEntity() instanceof ItemEntity if( dropWorld == event.getWorld() && event.getEntity() instanceof ItemEntity
&& dropBounds.contains( event.getEntity().getPositionVector() ) ) && dropBounds.contains( event.getEntity().getPositionVec() ) )
{ {
handleDrops( ((ItemEntity) event.getEntity()).getItem() ); handleDrops( ((ItemEntity) event.getEntity()).getItem() );
event.setCanceled( true ); event.setCanceled( true );

View File

@@ -65,11 +65,6 @@ public class FakeNetHandler extends ServerPlayNetHandler
{ {
} }
@Override
public void handleRecipeBookUpdate( @Nonnull CRecipeInfoPacket packet )
{
}
@Override @Override
public void handleSeenAdvancements( @Nonnull CSeenAdvancementsPacket packet ) public void handleSeenAdvancements( @Nonnull CSeenAdvancementsPacket packet )
{ {

View File

@@ -10,7 +10,7 @@ import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.storage.FolderName;
import net.minecraftforge.fml.server.ServerLifecycleHooks; import net.minecraftforge.fml.server.ServerLifecycleHooks;
import java.io.File; import java.io.File;
@@ -26,6 +26,7 @@ import java.util.Map;
public final class IDAssigner 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 Gson GSON = new GsonBuilder().setPrettyPrinting().create();
private static final Type ID_TOKEN = new TypeToken<Map<String, Integer>>() private static final Type ID_TOKEN = new TypeToken<Map<String, Integer>>()
{ {
@@ -41,9 +42,7 @@ public final class IDAssigner
public static File getDir() public static File getDir()
{ {
MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); return ServerLifecycleHooks.getCurrentServer().func_240776_a_( FOLDER ).toFile();
File worldDirectory = server.getWorld( DimensionType.OVERWORLD ).getSaveHandler().getWorldDirectory();
return new File( worldDirectory, ComputerCraft.MOD_ID );
} }
private static MinecraftServer getCachedServer() private static MinecraftServer getCachedServer()

View File

@@ -13,7 +13,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
@@ -93,16 +93,16 @@ public final class InventoryUtil
} }
// Look for entity with inventory // Look for entity with inventory
Vec3d vecStart = new Vec3d( Vector3d vecStart = new Vector3d(
pos.getX() + 0.5 + 0.6 * side.getXOffset(), pos.getX() + 0.5 + 0.6 * side.getXOffset(),
pos.getY() + 0.5 + 0.6 * side.getYOffset(), pos.getY() + 0.5 + 0.6 * side.getYOffset(),
pos.getZ() + 0.5 + 0.6 * side.getZOffset() pos.getZ() + 0.5 + 0.6 * side.getZOffset()
); );
Direction dir = side.getOpposite(); Direction dir = side.getOpposite();
Vec3d vecDir = new Vec3d( Vector3d vecDir = new Vector3d(
dir.getXOffset(), dir.getYOffset(), dir.getZOffset() 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 ) if( hit != null )
{ {
Entity entity = hit.getKey(); Entity entity = hit.getKey();

View File

@@ -10,7 +10,7 @@ import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.client.PlayRecordClientMessage; import dan200.computercraft.shared.network.client.PlayRecordClientMessage;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos; 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.minecraft.world.World;
public final class RecordUtil public final class RecordUtil
@@ -20,6 +20,6 @@ public final class RecordUtil
public static void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos ) public static void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos )
{ {
NetworkMessage packet = record != null ? new PlayRecordClientMessage( pos, record, recordInfo ) : new PlayRecordClientMessage( 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 );
} }
} }

View File

@@ -6,8 +6,8 @@
package dan200.computercraft.shared.util; package dan200.computercraft.shared.util;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids; import net.minecraft.fluid.Fluids;
import net.minecraft.fluid.IFluidState;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
@@ -34,7 +34,7 @@ public final class WaterloggableHelpers
* @param state The current state * @param state The current state
* @return This waterlogged block's current fluid * @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(); return state.get( WATERLOGGED ) ? Fluids.WATER.getStillFluidState( false ) : Fluids.EMPTY.getDefaultState();
} }

View File

@@ -12,9 +12,14 @@ import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction; 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.shapes.VoxelShape;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.ForgeMod;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -56,7 +61,7 @@ public final class WorldUtil
return world.getBlockState( pos ).getMaterial().isLiquid(); 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; if( shape.isEmpty() ) return false;
// AxisAlignedBB.contains, but without strict inequalities. // 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; 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 // Raycast for blocks
Entity collisionEntity = getEntity( world ); Entity collisionEntity = getEntity( world );
@@ -105,7 +110,7 @@ public final class WorldUtil
continue; continue;
} }
Vec3d littleBoxResult = littleBox.rayTrace( vecStart, vecEnd ).orElse( null ); Vector3d littleBoxResult = littleBox.rayTrace( vecStart, vecEnd ).orElse( null );
if( littleBoxResult != null ) if( littleBoxResult != null )
{ {
double dist = vecStart.distanceTo( littleBoxResult ); double dist = vecStart.distanceTo( littleBoxResult );
@@ -126,21 +131,21 @@ public final class WorldUtil
} }
if( closest != null && closestDist <= distance ) 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 Pair.of( closest, closestPos );
} }
return null; return null;
} }
public static Vec3d getRayStart( LivingEntity entity ) public static Vector3d getRayStart( LivingEntity entity )
{ {
return entity.getEyePosition( 1 ); return entity.getEyePosition( 1 );
} }
public static Vec3d getRayEnd( PlayerEntity player ) public static Vector3d getRayEnd( PlayerEntity player )
{ {
double reach = player.getAttribute( PlayerEntity.REACH_DISTANCE ).getValue(); double reach = player.getAttribute( ForgeMod.REACH_DISTANCE.get() ).getValue();
Vec3d look = player.getLookVec(); Vector3d look = player.getLookVec();
return getRayStart( player ).add( look.x * reach, look.y * reach, look.z * reach ); 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 xPos = pos.getX() + 0.5 + xDir * 0.4;
double yPos = pos.getY() + 0.5 + yDir * 0.4; double yPos = pos.getY() + 0.5 + yDir * 0.4;
double zPos = pos.getZ() + 0.5 + zDir * 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 ); 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() ); ItemEntity item = new ItemEntity( world, pos.x, pos.y, pos.z, stack.copy() );
item.setMotion( item.setMotion(

View File

@@ -10,7 +10,7 @@ import dan200.computercraft.api.network.Packet;
import dan200.computercraft.api.network.wired.IWiredNetwork; import dan200.computercraft.api.network.wired.IWiredNetwork;
import dan200.computercraft.api.network.wired.IWiredNode; import dan200.computercraft.api.network.wired.IWiredNode;
import dan200.computercraft.api.peripheral.IPeripheral; 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 net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -337,7 +337,7 @@ public final class WiredNetwork implements IWiredNetwork
while( (point = transmitTo.pollFirst()) != null ) while( (point = transmitTo.pollFirst()) != null )
{ {
World world = point.node.element.getWorld(); World world = point.node.element.getWorld();
Vec3d position = point.node.element.getPosition(); Vector3d position = point.node.element.getPosition();
for( WiredNode neighbour : point.node.neighbours ) for( WiredNode neighbour : point.node.neighbours )
{ {
TransmitPoint neighbourPoint = points.get( neighbour ); TransmitPoint neighbourPoint = points.get( neighbour );

View File

@@ -2,3 +2,6 @@
public net.minecraft.client.renderer.FirstPersonRenderer func_178100_c(F)F # getMapAngleFromPitch 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_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 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

View File

@@ -1,5 +1,5 @@
modLoader="javafml" modLoader="javafml"
loaderVersion="[31,32)" loaderVersion="[34,35)"
issueTrackerURL="https://github.com/SquidDev-CC/CC-Tweaked/issues" issueTrackerURL="https://github.com/SquidDev-CC/CC-Tweaked/issues"
displayURL="https://github.com/SquidDev-CC/CC-Tweaked" displayURL="https://github.com/SquidDev-CC/CC-Tweaked"
@@ -7,6 +7,7 @@ logoFile="pack.png"
credits="Created by Daniel Ratcliffe (@DanTwoHundred)" credits="Created by Daniel Ratcliffe (@DanTwoHundred)"
authors="Daniel Ratcliffe, Aaron Mills, SquidDev" authors="Daniel Ratcliffe, Aaron Mills, SquidDev"
license="ComputerCraft Public License (https://raw.githubusercontent.com/dan200/ComputerCraft/master/LICENSE)"
[[mods]] [[mods]]
modId="computercraft" modId="computercraft"
@@ -19,6 +20,6 @@ CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles a
[[dependencies.computercraft]] [[dependencies.computercraft]]
modId="forge" modId="forge"
mandatory=true mandatory=true
versionRange="[31.1.41,32)" versionRange="[34.0.1,35)"
ordering="NONE" ordering="NONE"
side="BOTH" side="BOTH"

View File

@@ -24,21 +24,38 @@ And several bug fixes:
* Correctly handle tabs within textutils.unserailizeJSON. * Correctly handle tabs within textutils.unserailizeJSON.
* Fix sheep not dropping items when sheared by turtles. * 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 # New features in CC: Tweaked 1.91.0
* [Generic peripherals] Expose NBT hashes of items to inventory methods. * [Generic peripherals] Expose NBT hashes of items to inventory methods.
* Bump Cobalt version * Bump Cobalt version
* Optimise handling of string concatenation. * Optimise handling of string concatenation.
* Add string.{pack,unpack,packsize} (MCJack123) * Add string.{pack,unpack,packsize} (MCJack123)
* Update to 1.16.2
And several bug fixes: And several bug fixes:
* Escape non-ASCII characters in JSON strings (neumond) * Escape non-ASCII characters in JSON strings (neumond)
* Make field names in fs.attributes more consistent (abby) * Make field names in fs.attributes more consistent (abby)
* Fix textutils.formatTime correctly handle 12 AM (R93950X) * 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 # New features in CC: Tweaked 1.90.2
* Fix generic peripherals not being registered outside a dev environment. * 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 # New features in CC: Tweaked 1.90.0

Some files were not shown because too many files have changed in this diff Show More