diff --git a/build.gradle b/build.gradle index 44ca32f99..de076b89b 100644 --- a/build.gradle +++ b/build.gradle @@ -29,9 +29,9 @@ repositories { } } -loom { - accessWidenerPath = file("src/main/resources/cc.accesswidener") -} +//loom { +// accessWidenerPath = file("src/main/resources/cc.accesswidener") +//} configurations { implementation.extendsFrom shade @@ -41,7 +41,8 @@ dependencies { checkstyle 'com.puppycrawl.tools:checkstyle:8.45.1' minecraft "com.mojang:minecraft:${mc_version}" - mappings "net.fabricmc:yarn:${mc_version}+build.${mappings_version}:v2" + //mappings "net.fabricmc:yarn:${mc_version}+build.${mappings_version}:v2" + mappings(minecraft.officialMojangMappings()) modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" diff --git a/gradle.properties b/gradle.properties index efe800f9d..92c1f2c1f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ mod_version=1.97.2 # Minecraft properties mc_version=1.17.1 -mappings_version=61 +#mappings_version=61 # Dependencies cloth_config_version=5.0.34 diff --git a/src/main/java/dan200/computercraft/ComputerCraft.java b/src/main/java/dan200/computercraft/ComputerCraft.java index c79489d7d..317bfd0ef 100644 --- a/src/main/java/dan200/computercraft/ComputerCraft.java +++ b/src/main/java/dan200/computercraft/ComputerCraft.java @@ -31,10 +31,10 @@ import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourcePackActivationType; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -111,30 +111,30 @@ public final class ComputerCraft implements ModInitializer // Logging public static final Logger log = LogManager.getLogger( MOD_ID ); - public static ItemGroup MAIN_GROUP = FabricItemGroupBuilder.build( new Identifier( MOD_ID, "main" ), () -> new ItemStack( ModBlocks.COMPUTER_NORMAL ) ); + public static CreativeModeTab MAIN_GROUP = FabricItemGroupBuilder.build( new ResourceLocation( MOD_ID, "main" ), () -> new ItemStack( ModBlocks.COMPUTER_NORMAL ) ); @Override public void onInitialize() { ComputerCraftProxyCommon.init(); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "colour" ), ColourableRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "computer_upgrade" ), ComputerUpgradeRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "colour" ), ColourableRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "computer_upgrade" ), ComputerUpgradeRecipe.SERIALIZER ); Registry.register( Registry.RECIPE_SERIALIZER, - new Identifier( ComputerCraft.MOD_ID, "pocket_computer_upgrade" ), + new ResourceLocation( ComputerCraft.MOD_ID, "pocket_computer_upgrade" ), PocketComputerUpgradeRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "disk" ), DiskRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "printout" ), PrintoutRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "turtle" ), TurtleRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "turtle_upgrade" ), TurtleUpgradeRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "impostor_shaped" ), ImpostorRecipe.SERIALIZER ); - Registry.register( Registry.RECIPE_SERIALIZER, new Identifier( ComputerCraft.MOD_ID, "impostor_shapeless" ), ImpostorShapelessRecipe.SERIALIZER ); - Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "block_named" ), BlockNamedEntityLootCondition.TYPE ); - Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "player_creative" ), PlayerCreativeLootCondition.TYPE ); - Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, "has_id" ), HasComputerIdLootCondition.TYPE ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "disk" ), DiskRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "printout" ), PrintoutRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "turtle" ), TurtleRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "turtle_upgrade" ), TurtleUpgradeRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "impostor_shaped" ), ImpostorRecipe.SERIALIZER ); + Registry.register( Registry.RECIPE_SERIALIZER, new ResourceLocation( ComputerCraft.MOD_ID, "impostor_shapeless" ), ImpostorShapelessRecipe.SERIALIZER ); + Registry.register( Registry.LOOT_CONDITION_TYPE, new ResourceLocation( ComputerCraft.MOD_ID, "block_named" ), BlockNamedEntityLootCondition.TYPE ); + Registry.register( Registry.LOOT_CONDITION_TYPE, new ResourceLocation( ComputerCraft.MOD_ID, "player_creative" ), PlayerCreativeLootCondition.TYPE ); + Registry.register( Registry.LOOT_CONDITION_TYPE, new ResourceLocation( ComputerCraft.MOD_ID, "has_id" ), HasComputerIdLootCondition.TYPE ); init(); FabricLoader.getInstance().getModContainer( MOD_ID ).ifPresent( modContainer -> { - ResourceManagerHelper.registerBuiltinResourcePack( new Identifier( MOD_ID, "classic" ), modContainer, ResourcePackActivationType.NORMAL ); - ResourceManagerHelper.registerBuiltinResourcePack( new Identifier( MOD_ID, "overhaul" ), modContainer, ResourcePackActivationType.NORMAL ); + ResourceManagerHelper.registerBuiltinResourcePack( new ResourceLocation( MOD_ID, "classic" ), modContainer, ResourcePackActivationType.NORMAL ); + ResourceManagerHelper.registerBuiltinResourcePack( new ResourceLocation( MOD_ID, "overhaul" ), modContainer, ResourcePackActivationType.NORMAL ); } ); } } diff --git a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java index 5e8128645..5b6d83f23 100644 --- a/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java +++ b/src/main/java/dan200/computercraft/ComputerCraftAPIImpl.java @@ -32,15 +32,14 @@ import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.wired.WiredNode; import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.resource.ReloadableResourceManager; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; - +import net.minecraft.server.packs.resources.ReloadableResourceManager; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.File; @@ -65,7 +64,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI ReloadableResourceManager manager = (ReloadableResourceManager) ((MinecraftServerAccess) server).getServerResourceManager().getResourceManager(); try { - return manager.getResource( new Identifier( domain, subPath ) ) + return manager.getResource( new ResourceLocation( domain, subPath ) ) .getInputStream(); } catch( IOException ignored ) @@ -93,13 +92,13 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI } @Override - public int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath ) + public int createUniqueNumberedSaveDir( @Nonnull Level world, @Nonnull String parentSubPath ) { return IDAssigner.getNextId( parentSubPath ); } @Override - public IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity ) + public IWritableMount createSaveDirMount( @Nonnull Level world, @Nonnull String subPath, long capacity ) { try { @@ -143,7 +142,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI } @Override - public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public int getBundledRedstoneOutput( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ) { return BundledRedstone.getDefaultOutput( world, pos, side ); } @@ -188,7 +187,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI @Nullable @Override - public IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public IWiredElement getWiredElementAt( @Nonnull BlockGetter world, @Nonnull BlockPos pos, @Nonnull Direction side ) { BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileCable ) diff --git a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java index c1f8ed540..141ebfc6d 100644 --- a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java +++ b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -21,13 +21,12 @@ import dan200.computercraft.api.peripheral.IPeripheralProvider; import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.redstone.IBundledRedstoneProvider; import dan200.computercraft.api.turtle.ITurtleUpgrade; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; /** * The static entry point to the ComputerCraft API. @@ -81,9 +80,9 @@ public final class ComputerCraftAPI * @return The numerical value of the name of the new folder, or -1 if the folder could not be created for some reason. * * eg: if createUniqueNumberedSaveDir( world, "computer/disk" ) was called returns 42, then "computer/disk/42" is now available for writing. - * @see #createSaveDirMount(World, String, long) + * @see #createSaveDirMount(Level, String, long) */ - public static int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath ) + public static int createUniqueNumberedSaveDir( @Nonnull Level world, @Nonnull String parentSubPath ) { return getInstance().createUniqueNumberedSaveDir( world, parentSubPath ); } @@ -100,14 +99,14 @@ public final class ComputerCraftAPI * @param capacity The amount of data that can be stored in the directory before it fills up, in bytes. * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() to mount this on a * Computers' file system. - * @see #createUniqueNumberedSaveDir(World, String) + * @see #createUniqueNumberedSaveDir(Level, String) * @see IComputerAccess#mount(String, IMount) * @see IComputerAccess#mountWritable(String, IWritableMount) * @see IMount * @see IWritableMount */ @Nullable - public static IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity ) + public static IWritableMount createSaveDirMount( @Nonnull Level world, @Nonnull String subPath, long capacity ) { return getInstance().createSaveDirMount( world, subPath, capacity ); } @@ -192,7 +191,7 @@ public final class ComputerCraftAPI * capable of emitting bundled redstone at the location, -1 will be returned. * @see IBundledRedstoneProvider */ - public static int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public static int getBundledRedstoneOutput( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ) { return getInstance().getBundledRedstoneOutput( world, pos, side ); } @@ -251,7 +250,7 @@ public final class ComputerCraftAPI * @see IWiredElement#getNode() */ @Nullable - public static IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public static IWiredElement getWiredElementAt( @Nonnull BlockGetter world, @Nonnull BlockPos pos, @Nonnull Direction side ) { return getInstance().getWiredElementAt( world, pos, side ); } @@ -261,10 +260,10 @@ public final class ComputerCraftAPI @Nonnull String getInstalledVersion(); - int createUniqueNumberedSaveDir( @Nonnull World world, @Nonnull String parentSubPath ); + int createUniqueNumberedSaveDir( @Nonnull Level world, @Nonnull String parentSubPath ); @Nullable - IWritableMount createSaveDirMount( @Nonnull World world, @Nonnull String subPath, long capacity ); + IWritableMount createSaveDirMount( @Nonnull Level world, @Nonnull String subPath, long capacity ); @Nullable IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath ); @@ -277,7 +276,7 @@ public final class ComputerCraftAPI void registerBundledRedstoneProvider( @Nonnull IBundledRedstoneProvider provider ); - int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ); + int getBundledRedstoneOutput( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ); void registerMediaProvider( @Nonnull IMediaProvider provider ); @@ -292,6 +291,6 @@ public final class ComputerCraftAPI IWiredNode createWiredNodeForElement( @Nonnull IWiredElement element ); @Nullable - IWiredElement getWiredElementAt( @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction side ); + IWiredElement getWiredElementAt( @Nonnull BlockGetter world, @Nonnull BlockPos pos, @Nonnull Direction side ); } } diff --git a/src/main/java/dan200/computercraft/api/IUpgradeBase.java b/src/main/java/dan200/computercraft/api/IUpgradeBase.java index ee9b6e500..58b4a8b1b 100644 --- a/src/main/java/dan200/computercraft/api/IUpgradeBase.java +++ b/src/main/java/dan200/computercraft/api/IUpgradeBase.java @@ -7,11 +7,10 @@ package dan200.computercraft.api; import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; /** * Common functionality between {@link ITurtleUpgrade} and {@link IPocketUpgrade}. @@ -28,7 +27,7 @@ public interface IUpgradeBase * @return The unique ID for this upgrade. */ @Nonnull - Identifier getUpgradeID(); + ResourceLocation getUpgradeID(); /** * Return an unlocalised string to describe this type of computer in item names. @@ -76,8 +75,8 @@ public interface IUpgradeBase // A more expanded form of ItemStack.areShareTagsEqual, but allowing an empty tag to be equal to a // null one. - NbtCompound shareTag = stack.getNbt(); - NbtCompound craftingShareTag = crafting.getNbt(); + CompoundTag shareTag = stack.getTag(); + CompoundTag craftingShareTag = crafting.getTag(); if( shareTag == craftingShareTag ) return true; if( shareTag == null ) return craftingShareTag.isEmpty(); if( craftingShareTag == null ) return shareTag.isEmpty(); diff --git a/src/main/java/dan200/computercraft/api/client/TransformedModel.java b/src/main/java/dan200/computercraft/api/client/TransformedModel.java index 201d53333..5afe637ec 100644 --- a/src/main/java/dan200/computercraft/api/client/TransformedModel.java +++ b/src/main/java/dan200/computercraft/api/client/TransformedModel.java @@ -8,16 +8,15 @@ package dan200.computercraft.api.client; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedModelManager; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.util.math.AffineTransformation; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Vec3f; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.world.item.ItemStack; import javax.annotation.Nonnull; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Transformation; +import com.mojang.math.Vector3f; import java.util.Objects; /** @@ -27,9 +26,9 @@ import java.util.Objects; public final class TransformedModel { private final BakedModel model; - private final AffineTransformation matrix; + private final Transformation matrix; - public TransformedModel( @Nonnull BakedModel model, @Nonnull AffineTransformation matrix ) + public TransformedModel( @Nonnull BakedModel model, @Nonnull Transformation matrix ) { this.model = Objects.requireNonNull( model ); this.matrix = Objects.requireNonNull( matrix ); @@ -38,22 +37,22 @@ public final class TransformedModel public TransformedModel( @Nonnull BakedModel model ) { this.model = Objects.requireNonNull( model ); - matrix = AffineTransformation.identity(); + matrix = Transformation.identity(); } - public static TransformedModel of( @Nonnull ModelIdentifier location ) + public static TransformedModel of( @Nonnull ModelResourceLocation location ) { - BakedModelManager modelManager = MinecraftClient.getInstance() - .getBakedModelManager(); + ModelManager modelManager = Minecraft.getInstance() + .getModelManager(); return new TransformedModel( modelManager.getModel( location ) ); } - public static TransformedModel of( @Nonnull ItemStack item, @Nonnull AffineTransformation transform ) + public static TransformedModel of( @Nonnull ItemStack item, @Nonnull Transformation transform ) { - BakedModel model = MinecraftClient.getInstance() + BakedModel model = Minecraft.getInstance() .getItemRenderer() - .getModels() - .getModel( item ); + .getItemModelShaper() + .getItemModel( item ); return new TransformedModel( model, transform ); } @@ -64,23 +63,23 @@ public final class TransformedModel } @Nonnull - public AffineTransformation getMatrix() + public Transformation getMatrix() { return matrix; } - public void push( MatrixStack matrixStack ) + public void push( PoseStack matrixStack ) { - matrixStack.push(); + matrixStack.pushPose(); - Vec3f translation = matrix.getTranslation(); - matrixStack.translate( translation.getX(), translation.getY(), translation.getZ() ); + Vector3f translation = matrix.getTranslation(); + matrixStack.translate( translation.x(), translation.y(), translation.z() ); - matrixStack.multiply( matrix.getRotation2() ); + matrixStack.mulPose( matrix.getLeftRotation() ); - Vec3f scale = matrix.getScale(); - matrixStack.scale( scale.getX(), scale.getY(), scale.getZ() ); + Vector3f scale = matrix.getScale(); + matrixStack.scale( scale.x(), scale.y(), scale.z() ); - matrixStack.multiply( matrix.getRotation1() ); + matrixStack.mulPose( matrix.getRightRotation() ); } } diff --git a/src/main/java/dan200/computercraft/api/filesystem/IMount.java b/src/main/java/dan200/computercraft/api/filesystem/IMount.java index 9634cbb57..b8a6c8f43 100644 --- a/src/main/java/dan200/computercraft/api/filesystem/IMount.java +++ b/src/main/java/dan200/computercraft/api/filesystem/IMount.java @@ -8,9 +8,8 @@ package dan200.computercraft.api.filesystem; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.peripheral.IComputerAccess; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; import java.io.IOException; import java.nio.channels.ReadableByteChannel; import java.nio.file.attribute.BasicFileAttributes; @@ -19,10 +18,10 @@ import java.util.List; /** * Represents a read only part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)}. * - * Ready made implementations of this interface can be created using {@link ComputerCraftAPI#createSaveDirMount(World, String, long)} or {@link + * Ready made implementations of this interface can be created using {@link ComputerCraftAPI#createSaveDirMount(Level, String, long)} or {@link * ComputerCraftAPI#createResourceMount(String, String)}, or you're free to implement it yourselves! * - * @see ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see ComputerCraftAPI#createResourceMount(String, String) * @see IComputerAccess#mount(String, IMount) * @see IWritableMount diff --git a/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java b/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java index d39eec86c..b6cd8f688 100644 --- a/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java +++ b/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java @@ -8,9 +8,8 @@ package dan200.computercraft.api.filesystem; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.peripheral.IComputerAccess; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; import java.io.IOException; import java.io.OutputStream; import java.nio.channels.WritableByteChannel; @@ -20,10 +19,10 @@ import java.util.OptionalLong; * Represents a part of a virtual filesystem that can be mounted onto a computer using {@link IComputerAccess#mount(String, IMount)} or {@link * IComputerAccess#mountWritable(String, IWritableMount)}, that can also be written to. * - * Ready made implementations of this interface can be created using {@link ComputerCraftAPI#createSaveDirMount(World, String, long)}, or you're free to + * Ready made implementations of this interface can be created using {@link ComputerCraftAPI#createSaveDirMount(Level, String, long)}, or you're free to * implement it yourselves! * - * @see ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see IComputerAccess#mount(String, IMount) * @see IComputerAccess#mountWritable(String, IWritableMount) * @see IMount diff --git a/src/main/java/dan200/computercraft/api/lua/GenericSource.java b/src/main/java/dan200/computercraft/api/lua/GenericSource.java index f109f9d37..b04c11ce9 100644 --- a/src/main/java/dan200/computercraft/api/lua/GenericSource.java +++ b/src/main/java/dan200/computercraft/api/lua/GenericSource.java @@ -9,9 +9,8 @@ import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheralProvider; import dan200.computercraft.core.asm.LuaMethod; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; /** * A generic source of {@link LuaMethod} functions. @@ -54,5 +53,5 @@ public interface GenericSource * @return This source's identifier. */ @Nonnull - Identifier id(); + ResourceLocation id(); } diff --git a/src/main/java/dan200/computercraft/api/media/IMedia.java b/src/main/java/dan200/computercraft/api/media/IMedia.java index 986da717e..e7f7bb7d6 100644 --- a/src/main/java/dan200/computercraft/api/media/IMedia.java +++ b/src/main/java/dan200/computercraft/api/media/IMedia.java @@ -7,13 +7,12 @@ package dan200.computercraft.api.media; import dan200.computercraft.api.filesystem.IMount; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.sound.SoundEvent; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; /** * Represents an item that can be placed in a disk drive and used by a Computer. @@ -77,11 +76,11 @@ public interface IMedia * dan200.computercraft.api.filesystem.IWritableMount}, it will mounted using mountWritable() * @see IMount * @see dan200.computercraft.api.filesystem.IWritableMount - * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(String, String) */ @Nullable - default IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world ) + default IMount createDataMount( @Nonnull ItemStack stack, @Nonnull Level world ) { return null; } diff --git a/src/main/java/dan200/computercraft/api/media/IMediaProvider.java b/src/main/java/dan200/computercraft/api/media/IMediaProvider.java index 7afa1e632..46c586ec8 100644 --- a/src/main/java/dan200/computercraft/api/media/IMediaProvider.java +++ b/src/main/java/dan200/computercraft/api/media/IMediaProvider.java @@ -6,10 +6,9 @@ package dan200.computercraft.api.media; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.item.ItemStack; /** * This interface is used to provide {@link IMedia} implementations for {@link ItemStack}. diff --git a/src/main/java/dan200/computercraft/api/network/IPacketReceiver.java b/src/main/java/dan200/computercraft/api/network/IPacketReceiver.java index 660344a2b..e146c23e7 100644 --- a/src/main/java/dan200/computercraft/api/network/IPacketReceiver.java +++ b/src/main/java/dan200/computercraft/api/network/IPacketReceiver.java @@ -6,10 +6,9 @@ package dan200.computercraft.api.network; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; /** * An object on an {@link IPacketNetwork}, capable of receiving packets. @@ -22,7 +21,7 @@ public interface IPacketReceiver * @return The receivers's world. */ @Nonnull - World getWorld(); + Level getWorld(); /** * Get the position in the world at which this receiver exists. @@ -30,7 +29,7 @@ public interface IPacketReceiver * @return The receiver's position. */ @Nonnull - Vec3d getPosition(); + Vec3 getPosition(); /** * Get the maximum distance this receiver can send and receive messages. diff --git a/src/main/java/dan200/computercraft/api/network/IPacketSender.java b/src/main/java/dan200/computercraft/api/network/IPacketSender.java index f3c06a397..bf9adcead 100644 --- a/src/main/java/dan200/computercraft/api/network/IPacketSender.java +++ b/src/main/java/dan200/computercraft/api/network/IPacketSender.java @@ -6,10 +6,9 @@ package dan200.computercraft.api.network; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; /** * An object on a {@link IPacketNetwork}, capable of sending packets. @@ -22,7 +21,7 @@ public interface IPacketSender * @return The sender's world. */ @Nonnull - World getWorld(); + Level getWorld(); /** * Get the position in the world at which this sender exists. @@ -30,7 +29,7 @@ public interface IPacketSender * @return The sender's position. */ @Nonnull - Vec3d getPosition(); + Vec3 getPosition(); /** * Get some sort of identification string for this sender. This does not strictly need to be unique, but you should be able to extract some identifiable diff --git a/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java b/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java index 0514ea509..cd558f849 100644 --- a/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java +++ b/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java @@ -13,10 +13,9 @@ import dan200.computercraft.api.lua.ILuaCallback; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.ILuaTask; import dan200.computercraft.api.lua.MethodResult; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.level.Level; import java.util.Map; /** @@ -33,7 +32,7 @@ public interface IComputerAccess * @return The location on the computer's file system where you the mount mounted, or {@code null} if there was already a file in the desired location. * Store this value if you wish to unmount the mount later. * @throws NotAttachedException If the peripheral has been detached. - * @see ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see ComputerCraftAPI#createResourceMount(String, String) * @see #mount(String, IMount, String) * @see #mountWritable(String, IWritableMount) @@ -55,7 +54,7 @@ public interface IComputerAccess * @return The location on the computer's file system where you the mount mounted, or {@code null} if there was already a file in the desired location. * Store this value if you wish to unmount the mount later. * @throws NotAttachedException If the peripheral has been detached. - * @see ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see ComputerCraftAPI#createResourceMount(String, String) * @see #mount(String, IMount) * @see #mountWritable(String, IWritableMount) @@ -84,7 +83,7 @@ public interface IComputerAccess * @return The location on the computer's file system where you the mount mounted, or null if there was already a file in the desired location. Store * this value if you wish to unmount the mount later. * @throws NotAttachedException If the peripheral has been detached. - * @see ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see ComputerCraftAPI#createResourceMount(String, String) * @see #mount(String, IMount) * @see #unmount(String) @@ -105,7 +104,7 @@ public interface IComputerAccess * @return The location on the computer's file system where you the mount mounted, or null if there was already a file in the desired location. Store * this value if you wish to unmount the mount later. * @throws NotAttachedException If the peripheral has been detached. - * @see ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see ComputerCraftAPI#createSaveDirMount(Level, String, long) * @see ComputerCraftAPI#createResourceMount(String, String) * @see #mount(String, IMount) * @see #unmount(String) diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java index ae704dfc7..c2b5c7af4 100644 --- a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java @@ -6,12 +6,11 @@ package dan200.computercraft.api.peripheral; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import java.util.Optional; /** @@ -34,5 +33,5 @@ public interface IPeripheralProvider * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) */ @Nonnull - IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ); + IPeripheral getPeripheral( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ); } diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralTile.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralTile.java index b12d7f5c0..9cc83c5fa 100644 --- a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralTile.java +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralTile.java @@ -5,15 +5,14 @@ */ package dan200.computercraft.api.peripheral; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; /** - * A {@link net.minecraft.block.entity.BlockEntity} which may act as a peripheral. + * A {@link net.minecraft.world.level.block.entity.BlockEntity} which may act as a peripheral. * * If you need more complex capabilities (such as handling TEs not belonging to your mod), you should use {@link IPeripheralProvider}. */ @@ -24,7 +23,7 @@ public interface IPeripheralTile * * @param side The side to get the peripheral from. * @return A peripheral, or {@code null} if there is not a peripheral here. - * @see IPeripheralProvider#getPeripheral(World, BlockPos, Direction) + * @see IPeripheralProvider#getPeripheral(Level, BlockPos, Direction) */ @Nullable IPeripheral getPeripheral( @Nonnull Direction side ); diff --git a/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java b/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java index 6599d7e90..dc7f2fc9e 100644 --- a/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java +++ b/src/main/java/dan200/computercraft/api/pocket/AbstractPocketUpgrade.java @@ -7,13 +7,12 @@ package dan200.computercraft.api.pocket; import dan200.computercraft.shared.util.NonNullSupplier; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; - import javax.annotation.Nonnull; +import net.minecraft.Util; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; import java.util.function.Supplier; /** @@ -23,55 +22,55 @@ import java.util.function.Supplier; */ public abstract class AbstractPocketUpgrade implements IPocketUpgrade { - private final Identifier id; + private final ResourceLocation id; private final String adjective; private final NonNullSupplier stack; - protected AbstractPocketUpgrade( Identifier id, String adjective, NonNullSupplier stack ) + protected AbstractPocketUpgrade( ResourceLocation id, String adjective, NonNullSupplier stack ) { this.id = id; this.adjective = adjective; this.stack = stack; } - protected AbstractPocketUpgrade( Identifier id, NonNullSupplier item ) + protected AbstractPocketUpgrade( ResourceLocation id, NonNullSupplier item ) { - this( id, Util.createTranslationKey( "upgrade", id ) + ".adjective", item ); + this( id, Util.makeDescriptionId( "upgrade", id ) + ".adjective", item ); } - protected AbstractPocketUpgrade( Identifier id, String adjective, ItemStack stack ) + protected AbstractPocketUpgrade( ResourceLocation id, String adjective, ItemStack stack ) { this( id, adjective, () -> stack ); } - protected AbstractPocketUpgrade( Identifier id, ItemStack stack ) + protected AbstractPocketUpgrade( ResourceLocation id, ItemStack stack ) { this( id, () -> stack ); } - protected AbstractPocketUpgrade( Identifier id, String adjective, ItemConvertible item ) + protected AbstractPocketUpgrade( ResourceLocation id, String adjective, ItemLike item ) { this( id, adjective, new CachedStack( () -> item ) ); } - protected AbstractPocketUpgrade( Identifier id, ItemConvertible item ) + protected AbstractPocketUpgrade( ResourceLocation id, ItemLike item ) { this( id, new CachedStack( () -> item ) ); } - protected AbstractPocketUpgrade( Identifier id, String adjective, Supplier item ) + protected AbstractPocketUpgrade( ResourceLocation id, String adjective, Supplier item ) { this( id, adjective, new CachedStack( item ) ); } - protected AbstractPocketUpgrade( Identifier id, Supplier item ) + protected AbstractPocketUpgrade( ResourceLocation id, Supplier item ) { this( id, new CachedStack( item ) ); } @Nonnull @Override - public final Identifier getUpgradeID() + public final ResourceLocation getUpgradeID() { return id; } @@ -97,11 +96,11 @@ public abstract class AbstractPocketUpgrade implements IPocketUpgrade */ private static final class CachedStack implements NonNullSupplier { - private final Supplier provider; + private final Supplier provider; private Item item; private ItemStack stack; - CachedStack( Supplier provider ) + CachedStack( Supplier provider ) { this.provider = provider; } diff --git a/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java b/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java index 0638f6c5c..f8adb22a6 100644 --- a/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java +++ b/src/main/java/dan200/computercraft/api/pocket/IPocketAccess.java @@ -7,12 +7,11 @@ package dan200.computercraft.api.pocket; import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import java.util.Map; /** @@ -73,7 +72,7 @@ public interface IPocketAccess * @see #updateUpgradeNBTData() */ @Nonnull - NbtCompound getUpgradeNBTData(); + CompoundTag getUpgradeNBTData(); /** * Mark the upgrade-specific NBT as dirty. @@ -93,5 +92,5 @@ public interface IPocketAccess * @return A collection of all upgrade names. */ @Nonnull - Map getUpgrades(); + Map getUpgrades(); } diff --git a/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java b/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java index d8b9d0c13..4bd5ee1de 100644 --- a/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java +++ b/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java @@ -9,10 +9,9 @@ package dan200.computercraft.api.pocket; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.IUpgradeBase; import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.level.Level; /** * Additional peripherals for pocket computers. @@ -55,7 +54,7 @@ public interface IPocketUpgrade extends IUpgradeBase * requiring the player to be sneaking - otherwise they will be unable to access the GUI. * @see #createPeripheral(IPocketAccess) */ - default boolean onRightClick( @Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral ) + default boolean onRightClick( @Nonnull Level world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral ) { return false; } diff --git a/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java b/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java index ad92f3903..2fc121e60 100644 --- a/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java +++ b/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java @@ -6,11 +6,10 @@ package dan200.computercraft.api.redstone; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; /** * This interface is used to provide bundled redstone output for blocks. @@ -29,5 +28,5 @@ public interface IBundledRedstoneProvider * @return A number in the range 0-65535 to indicate this block is providing output, or -1 if you do not wish to handle this block. * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider) */ - int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ); + int getBundledRedstoneOutput( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ); } diff --git a/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java b/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java index 7046cc808..d73dd641c 100644 --- a/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java +++ b/src/main/java/dan200/computercraft/api/turtle/AbstractTurtleUpgrade.java @@ -7,13 +7,12 @@ package dan200.computercraft.api.turtle; import dan200.computercraft.shared.util.NonNullSupplier; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; - import javax.annotation.Nonnull; +import net.minecraft.Util; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; import java.util.function.Supplier; /** @@ -23,12 +22,12 @@ import java.util.function.Supplier; */ public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade { - private final Identifier id; + private final ResourceLocation id; private final TurtleUpgradeType type; private final String adjective; private final NonNullSupplier stack; - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, NonNullSupplier stack ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, String adjective, NonNullSupplier stack ) { this.id = id; this.type = type; @@ -36,44 +35,44 @@ public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade this.stack = stack; } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, NonNullSupplier stack ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, NonNullSupplier stack ) { - this( id, type, Util.createTranslationKey( "upgrade", id ) + ".adjective", stack ); + this( id, type, Util.makeDescriptionId( "upgrade", id ) + ".adjective", stack ); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemStack stack ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, String adjective, ItemStack stack ) { this( id, type, adjective, () -> stack ); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemStack stack ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, ItemStack stack ) { this( id, type, () -> stack ); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, ItemConvertible item ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, String adjective, ItemLike item ) { this( id, type, adjective, new CachedStack( () -> item ) ); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, ItemConvertible item ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, ItemLike item ) { this( id, type, new CachedStack( () -> item ) ); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, String adjective, Supplier item ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, String adjective, Supplier item ) { this( id, type, adjective, new CachedStack( item ) ); } - protected AbstractTurtleUpgrade( Identifier id, TurtleUpgradeType type, Supplier item ) + protected AbstractTurtleUpgrade( ResourceLocation id, TurtleUpgradeType type, Supplier item ) { this( id, type, new CachedStack( item ) ); } @Nonnull @Override - public final Identifier getUpgradeID() + public final ResourceLocation getUpgradeID() { return id; } @@ -106,11 +105,11 @@ public abstract class AbstractTurtleUpgrade implements ITurtleUpgrade */ private static final class CachedStack implements NonNullSupplier { - private final Supplier provider; + private final Supplier provider; private Item item; private ItemStack stack; - CachedStack( Supplier provider ) + CachedStack( Supplier provider ) { this.provider = provider; } diff --git a/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java b/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java index e534e648e..994b83648 100644 --- a/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java +++ b/src/main/java/dan200/computercraft/api/turtle/FakePlayer.java @@ -9,31 +9,33 @@ import com.mojang.authlib.GameProfile; import io.netty.channel.ChannelHandlerContext; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.block.entity.CommandBlockBlockEntity; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.command.argument.EntityAnchorArgumentType; -import net.minecraft.entity.Entity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.passive.HorseBaseEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; +import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.network.*; -import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; -import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; -import net.minecraft.recipe.Recipe; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.village.TradeOfferList; - +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.game.ServerboundCommandSuggestionPacket; +import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.Container; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.animal.horse.AbstractHorse; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.trading.MerchantOffers; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.entity.CommandBlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nullable; import javax.crypto.Cipher; import java.util.Collection; @@ -41,26 +43,26 @@ import java.util.OptionalInt; import java.util.UUID; /** - * A wrapper for {@link ServerPlayerEntity} which denotes a "fake" player. + * A wrapper for {@link ServerPlayer} which denotes a "fake" player. * * Please note that this does not implement any of the traditional fake player behaviour. It simply exists to prevent me passing in normal players. */ -public class FakePlayer extends ServerPlayerEntity +public class FakePlayer extends ServerPlayer { - public FakePlayer( ServerWorld world, GameProfile gameProfile ) + public FakePlayer( ServerLevel world, GameProfile gameProfile ) { super( world.getServer(), world, gameProfile ); - networkHandler = new FakeNetHandler( this ); + connection = new FakeNetHandler( this ); } // region Direct networkHandler access @Override - public void enterCombat() + public void onEnterCombat() { } @Override - public void endCombat() + public void onLeaveCombat() { } @@ -70,23 +72,23 @@ public class FakePlayer extends ServerPlayerEntity } @Override - public void playerTick() + public void doTick() { } @Override - public void onDeath( DamageSource damage ) + public void die( DamageSource damage ) { } @Override - public Entity moveToWorld( ServerWorld destination ) + public Entity changeDimension( ServerLevel destination ) { return this; } @Override - public void wakeUp( boolean bl, boolean updateSleepingPlayers ) + public void stopSleepInBed( boolean bl, boolean updateSleepingPlayers ) { } @@ -103,33 +105,33 @@ public class FakePlayer extends ServerPlayerEntity } @Override - public void openEditSignScreen( SignBlockEntity tile ) + public void openTextEdit( SignBlockEntity tile ) { } @Override - public OptionalInt openHandledScreen( @Nullable NamedScreenHandlerFactory container ) + public OptionalInt openMenu( @Nullable MenuProvider container ) { return OptionalInt.empty(); } @Override - public void sendTradeOffers( int id, TradeOfferList list, int level, int experience, boolean levelled, boolean refreshable ) + public void sendMerchantOffers( int id, MerchantOffers list, int level, int experience, boolean levelled, boolean refreshable ) { } @Override - public void openHorseInventory( HorseBaseEntity horse, Inventory inventory ) + public void openHorseInventory( AbstractHorse horse, Container inventory ) { } @Override - public void useBook( ItemStack stack, Hand hand ) + public void openItemGui( ItemStack stack, InteractionHand hand ) { } @Override - public void openCommandBlockScreen( CommandBlockBlockEntity block ) + public void openCommandBlock( CommandBlockEntity block ) { } @@ -149,7 +151,7 @@ public class FakePlayer extends ServerPlayerEntity // } @Override - public void closeHandledScreen() + public void closeContainer() { } @@ -159,55 +161,55 @@ public class FakePlayer extends ServerPlayerEntity // } @Override - public int unlockRecipes( Collection> recipes ) + public int awardRecipes( Collection> recipes ) { return 0; } // Indirect @Override - public int lockRecipes( Collection> recipes ) + public int resetRecipes( Collection> recipes ) { return 0; } @Override - public void sendMessage( Text textComponent, boolean status ) + public void displayClientMessage( Component textComponent, boolean status ) { } @Override - protected void consumeItem() + protected void completeUsingItem() { } @Override - public void lookAt( EntityAnchorArgumentType.EntityAnchor anchor, Vec3d vec3d ) + public void lookAt( EntityAnchorArgument.Anchor anchor, Vec3 vec3d ) { } @Override - public void lookAtEntity( EntityAnchorArgumentType.EntityAnchor self, Entity entity, EntityAnchorArgumentType.EntityAnchor target ) + public void lookAt( EntityAnchorArgument.Anchor self, Entity entity, EntityAnchorArgument.Anchor target ) { } @Override - protected void onStatusEffectApplied( StatusEffectInstance statusEffectInstance, @Nullable Entity source ) + protected void onEffectAdded( MobEffectInstance statusEffectInstance, @Nullable Entity source ) { } @Override - protected void onStatusEffectUpgraded( StatusEffectInstance statusEffectInstance, boolean particles, @Nullable Entity source ) + protected void onEffectUpdated( MobEffectInstance statusEffectInstance, boolean particles, @Nullable Entity source ) { } @Override - protected void onStatusEffectRemoved( StatusEffectInstance statusEffectInstance ) + protected void onEffectRemoved( MobEffectInstance statusEffectInstance ) { } @Override - public void requestTeleport( double x, double y, double z ) + public void teleportTo( double x, double y, double z ) { } @@ -217,13 +219,13 @@ public class FakePlayer extends ServerPlayerEntity // } @Override - public void sendMessage( Text message, MessageType type, UUID senderUuid ) + public void sendMessage( Component message, ChatType type, UUID senderUuid ) { } @Override - public String getIp() + public String getIpAddress() { return "[Fake Player]"; } @@ -239,63 +241,63 @@ public class FakePlayer extends ServerPlayerEntity // } @Override - public void setCameraEntity( Entity entity ) + public void setCamera( Entity entity ) { } @Override - public void teleport( ServerWorld serverWorld, double x, double y, double z, float pitch, float yaw ) + public void teleportTo( ServerLevel serverWorld, double x, double y, double z, float pitch, float yaw ) { } @Override - public void sendInitialChunkPackets( ChunkPos chunkPos, Packet packet, Packet packet2 ) + public void trackChunk( ChunkPos chunkPos, Packet packet, Packet packet2 ) { } @Override - public void sendUnloadChunkPacket( ChunkPos chunkPos ) + public void untrackChunk( ChunkPos chunkPos ) { } @Override - public void playSound( SoundEvent soundEvent, SoundCategory soundCategory, float volume, float pitch ) + public void playNotifySound( SoundEvent soundEvent, SoundSource soundCategory, float volume, float pitch ) { } - private static class FakeNetHandler extends ServerPlayNetworkHandler + private static class FakeNetHandler extends ServerGamePacketListenerImpl { - FakeNetHandler( ServerPlayerEntity player ) + FakeNetHandler( ServerPlayer player ) { super( player.server, new FakeConnection(), player ); } @Override - public void disconnect( Text message ) + public void disconnect( Component message ) { } @Override - public void onVehicleMove( VehicleMoveC2SPacket move ) + public void handleMoveVehicle( ServerboundMoveVehiclePacket move ) { } @Override - public void onRequestCommandCompletions( RequestCommandCompletionsC2SPacket packet ) + public void handleCustomCommandSuggestions( ServerboundCommandSuggestionPacket packet ) { } @Override - public void sendPacket( Packet packet, @Nullable GenericFutureListener> listener ) + public void send( Packet packet, @Nullable GenericFutureListener> listener ) { } } - private static class FakeConnection extends ClientConnection + private static class FakeConnection extends Connection { FakeConnection() { - super( NetworkSide.CLIENTBOUND ); + super( PacketFlow.CLIENTBOUND ); } @Override @@ -304,7 +306,7 @@ public class FakePlayer extends ServerPlayerEntity } @Override - public void setState( NetworkState state ) + public void setProtocol( ConnectionProtocol state ) { } @@ -329,18 +331,18 @@ public class FakePlayer extends ServerPlayerEntity } @Override - public void disconnect( Text message ) + public void disconnect( Component message ) { } @Override - public void setupEncryption( Cipher cipher, Cipher cipher2 ) + public void setEncryptionKey( Cipher cipher, Cipher cipher2 ) { - super.setupEncryption( cipher, cipher2 ); + super.setEncryptionKey( cipher, cipher2 ); } @Override - public void disableAutoRead() + public void setReadOnly() { } } diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java index c50b83eb3..0932709f0 100644 --- a/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java @@ -11,15 +11,14 @@ import dan200.computercraft.api.lua.ILuaCallback; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.util.ItemStorage; -import net.minecraft.inventory.Inventory; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.Container; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; /** * The interface passed to turtle by turtles, providing methods that they can call. @@ -34,7 +33,7 @@ public interface ITurtleAccess * @return the world in which the turtle resides. */ @Nonnull - World getWorld(); + Level getWorld(); /** * Returns a vector containing the integer co-ordinates at which the turtle resides. @@ -55,7 +54,7 @@ public interface ITurtleAccess * @return Whether the movement was successful. It may fail if the block was not loaded or the block placement was cancelled. * @throws UnsupportedOperationException When attempting to teleport on the client side. */ - boolean teleportTo( @Nonnull World world, @Nonnull BlockPos pos ); + boolean teleportTo( @Nonnull Level world, @Nonnull BlockPos pos ); /** * Returns a vector containing the floating point co-ordinates at which the turtle is rendered. This will shift when the turtle is moving. @@ -65,7 +64,7 @@ public interface ITurtleAccess * @see #getVisualYaw(float) */ @Nonnull - Vec3d getVisualPosition( float f ); + Vec3 getVisualPosition( float f ); /** * Returns the yaw the turtle is facing when it is rendered. @@ -255,7 +254,7 @@ public interface ITurtleAccess * @see #updateUpgradeNBTData(TurtleSide) */ @Nonnull - NbtCompound getUpgradeNBTData( @Nullable TurtleSide side ); + CompoundTag getUpgradeNBTData( @Nullable TurtleSide side ); /** * Mark the upgrade-specific data as dirty on a specific side. This is required for the data to be synced to the client and persisted. @@ -278,5 +277,5 @@ public interface ITurtleAccess * @return This turtle's inventory */ @Nonnull - Inventory getInventory(); + Container getInventory(); } diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java index bc9d9e018..da1938e1d 100644 --- a/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java @@ -12,8 +12,7 @@ import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.peripheral.IPeripheral; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.util.math.Direction; - +import net.minecraft.core.Direction; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java index fa8c492cc..0517bdf51 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleAttackEvent.java @@ -10,9 +10,8 @@ import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; -import net.minecraft.entity.Entity; - import javax.annotation.Nonnull; +import net.minecraft.world.entity.Entity; import java.util.Objects; /** diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java index 2a195e62a..28ffd9b7d 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleBlockEvent.java @@ -11,12 +11,11 @@ import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import java.util.Map; import java.util.Objects; @@ -31,10 +30,10 @@ import java.util.Objects; */ public abstract class TurtleBlockEvent extends TurtlePlayerEvent { - private final World world; + private final Level world; private final BlockPos pos; - protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, + protected TurtleBlockEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos ) { super( turtle, action, player ); @@ -50,7 +49,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent * * @return The world the turtle is interacting in. */ - public World getWorld() + public Level getWorld() { return world; } @@ -76,7 +75,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent private final ITurtleUpgrade upgrade; private final TurtleSide side; - public Dig( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState block, + public Dig( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState block, @Nonnull ITurtleUpgrade upgrade, @Nonnull TurtleSide side ) { super( turtle, TurtleAction.DIG, player, world, pos ); @@ -130,7 +129,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent */ public static class Move extends TurtleBlockEvent { - public Move( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos ) + public Move( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos ) { super( turtle, TurtleAction.MOVE, player, world, pos ); } @@ -145,7 +144,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent { private final ItemStack stack; - public Place( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull ItemStack stack ) + public Place( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull ItemStack stack ) { super( turtle, TurtleAction.PLACE, player, world, pos ); @@ -177,7 +176,7 @@ public abstract class TurtleBlockEvent extends TurtlePlayerEvent private final BlockState state; private final Map data; - public Inspect( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, + public Inspect( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull Map data ) { super( turtle, TurtleAction.INSPECT, player, world, pos ); diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleInspectItemEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleInspectItemEvent.java index d22b6673d..0aef37ca4 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleInspectItemEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleInspectItemEvent.java @@ -8,9 +8,8 @@ package dan200.computercraft.api.turtle.event; import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java index 37b01ecb5..5cc15f9f0 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleInventoryEvent.java @@ -8,13 +8,12 @@ package dan200.computercraft.api.turtle.event; import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import java.util.Objects; /** @@ -22,10 +21,10 @@ import java.util.Objects; */ public abstract class TurtleInventoryEvent extends TurtleBlockEvent { - private final Inventory handler; + private final Container handler; - protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull World world, - @Nonnull BlockPos pos, @Nullable Inventory handler ) + protected TurtleInventoryEvent( @Nonnull ITurtleAccess turtle, @Nonnull TurtleAction action, @Nonnull FakePlayer player, @Nonnull Level world, + @Nonnull BlockPos pos, @Nullable Container handler ) { super( turtle, action, player, world, pos ); this.handler = handler; @@ -37,7 +36,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent * @return The inventory being interacted with, {@code null} if the item will be dropped to/sucked from the world. */ @Nullable - public Inventory getItemHandler() + public Container getItemHandler() { return handler; } @@ -49,7 +48,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent */ public static class Suck extends TurtleInventoryEvent { - public Suck( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler ) + public Suck( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos, @Nullable Container handler ) { super( turtle, TurtleAction.SUCK, player, world, pos, handler ); } @@ -64,7 +63,7 @@ public abstract class TurtleInventoryEvent extends TurtleBlockEvent { private final ItemStack stack; - public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nullable Inventory handler, + public Drop( @Nonnull ITurtleAccess turtle, @Nonnull FakePlayer player, @Nonnull Level world, @Nonnull BlockPos pos, @Nullable Container handler, @Nonnull ItemStack stack ) { super( turtle, TurtleAction.DROP, player, world, pos, handler ); diff --git a/src/main/java/dan200/computercraft/api/turtle/event/TurtleRefuelEvent.java b/src/main/java/dan200/computercraft/api/turtle/event/TurtleRefuelEvent.java index a5374d684..6a3e64960 100644 --- a/src/main/java/dan200/computercraft/api/turtle/event/TurtleRefuelEvent.java +++ b/src/main/java/dan200/computercraft/api/turtle/event/TurtleRefuelEvent.java @@ -7,10 +7,9 @@ package dan200.computercraft.api.turtle.event; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.item.ItemStack; import java.util.Objects; /** diff --git a/src/main/java/dan200/computercraft/client/ClientRegistry.java b/src/main/java/dan200/computercraft/client/ClientRegistry.java index 25ac05541..c84ff64c6 100644 --- a/src/main/java/dan200/computercraft/client/ClientRegistry.java +++ b/src/main/java/dan200/computercraft/client/ClientRegistry.java @@ -15,16 +15,15 @@ import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.util.Colour; import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.ModelRotation; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; import java.util.HashSet; import java.util.function.Consumer; @@ -68,20 +67,20 @@ public final class ClientRegistry private ClientRegistry() {} - public static void onTextureStitchEvent( SpriteAtlasTexture atlasTexture, ClientSpriteRegistryCallback.Registry registry ) + public static void onTextureStitchEvent( TextureAtlas atlasTexture, ClientSpriteRegistryCallback.Registry registry ) { for( String extra : EXTRA_TEXTURES ) { - registry.register( new Identifier( ComputerCraft.MOD_ID, extra ) ); + registry.register( new ResourceLocation( ComputerCraft.MOD_ID, extra ) ); } } @SuppressWarnings( "NewExpressionSideOnly" ) - public static void onModelBakeEvent( ResourceManager manager, Consumer out ) + public static void onModelBakeEvent( ResourceManager manager, Consumer out ) { for( String model : EXTRA_MODELS ) { - out.accept( new ModelIdentifier( new Identifier( ComputerCraft.MOD_ID, model ), "inventory" ) ); + out.accept( new ModelResourceLocation( new ResourceLocation( ComputerCraft.MOD_ID, model ), "inventory" ) ); } } @@ -114,14 +113,14 @@ public final class ClientRegistry ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED ); } - private static BakedModel bake( ModelLoader loader, UnbakedModel model, Identifier identifier ) + private static BakedModel bake( ModelBakery loader, UnbakedModel model, ResourceLocation identifier ) { - model.getTextureDependencies( loader::getOrLoadModel, new HashSet<>() ); + model.getMaterials( loader::getModel, new HashSet<>() ); return model.bake( loader, - spriteIdentifier -> MinecraftClient.getInstance() - .getSpriteAtlas( spriteIdentifier.getAtlasId() ) - .apply( spriteIdentifier.getTextureId() ), - ModelRotation.X0_Y0, + spriteIdentifier -> Minecraft.getInstance() + .getTextureAtlas( spriteIdentifier.atlasLocation() ) + .apply( spriteIdentifier.texture() ), + BlockModelRotation.X0_Y0, identifier ); } } diff --git a/src/main/java/dan200/computercraft/client/ClientTableFormatter.java b/src/main/java/dan200/computercraft/client/ClientTableFormatter.java index 194c23689..0d076d5ce 100644 --- a/src/main/java/dan200/computercraft/client/ClientTableFormatter.java +++ b/src/main/java/dan200/computercraft/client/ClientTableFormatter.java @@ -11,15 +11,15 @@ import dan200.computercraft.shared.command.text.ChatHelpers; import dan200.computercraft.shared.command.text.TableBuilder; import dan200.computercraft.shared.command.text.TableFormatter; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.hud.ChatHud; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.MathHelper; import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.ChatComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; public class ClientTableFormatter implements TableFormatter { @@ -29,7 +29,7 @@ public class ClientTableFormatter implements TableFormatter @Override @Nullable - public Text getPadding( Text component, int width ) + public Component getPadding( Component component, int width ) { int extraWidth = width - getWidth( component ); if( extraWidth <= 0 ) @@ -37,18 +37,18 @@ public class ClientTableFormatter implements TableFormatter return null; } - TextRenderer renderer = renderer(); + Font renderer = renderer(); - float spaceWidth = renderer.getWidth( " " ); - int spaces = MathHelper.floor( extraWidth / spaceWidth ); + float spaceWidth = renderer.width( " " ); + int spaces = Mth.floor( extraWidth / spaceWidth ); int extra = extraWidth - (int) (spaces * spaceWidth); - return ChatHelpers.coloured( StringUtils.repeat( ' ', spaces ) + StringUtils.repeat( (char) 712, extra ), Formatting.GRAY ); + return ChatHelpers.coloured( StringUtils.repeat( ' ', spaces ) + StringUtils.repeat( (char) 712, extra ), ChatFormatting.GRAY ); } - private static TextRenderer renderer() + private static Font renderer() { - return MinecraftClient.getInstance().textRenderer; + return Minecraft.getInstance().font; } @Override @@ -58,16 +58,16 @@ public class ClientTableFormatter implements TableFormatter } @Override - public int getWidth( Text component ) + public int getWidth( Component component ) { - return renderer().getWidth( component ); + return renderer().width( component ); } @Override - public void writeLine( int id, Text component ) + public void writeLine( int id, Component component ) { - MinecraftClient mc = MinecraftClient.getInstance(); - ChatHud chat = mc.inGameHud.getChatHud(); + Minecraft mc = Minecraft.getInstance(); + ChatComponent chat = mc.gui.getChat(); // TODO: Trim the text if it goes over the allowed length // int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() ); @@ -79,7 +79,7 @@ public class ClientTableFormatter implements TableFormatter @Override public int display( TableBuilder table ) { - ChatHud chat = MinecraftClient.getInstance().inGameHud.getChatHud(); + ChatComponent chat = Minecraft.getInstance().gui.getChat(); int lastHeight = lastHeights.get( table.getId() ); diff --git a/src/main/java/dan200/computercraft/client/SoundManager.java b/src/main/java/dan200/computercraft/client/SoundManager.java index fe452eb7d..67827a498 100644 --- a/src/main/java/dan200/computercraft/client/SoundManager.java +++ b/src/main/java/dan200/computercraft/client/SoundManager.java @@ -5,25 +5,24 @@ */ package dan200.computercraft.client; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.sound.AbstractSoundInstance; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.client.sound.TickableSoundInstance; -import net.minecraft.sound.SoundCategory; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Vec3d; - import java.util.HashMap; import java.util.Map; import java.util.UUID; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.resources.sounds.TickableSoundInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.phys.Vec3; public class SoundManager { private static final Map sounds = new HashMap<>(); - public static void playSound( UUID source, Vec3d position, Identifier event, float volume, float pitch ) + public static void playSound( UUID source, Vec3 position, ResourceLocation event, float volume, float pitch ) { - var soundManager = MinecraftClient.getInstance().getSoundManager(); + var soundManager = Minecraft.getInstance().getSoundManager(); MoveableSound oldSound = sounds.get( source ); if( oldSound != null ) soundManager.stop( oldSound ); @@ -38,10 +37,10 @@ public class SoundManager SoundInstance sound = sounds.remove( source ); if( sound == null ) return; - MinecraftClient.getInstance().getSoundManager().stop( sound ); + Minecraft.getInstance().getSoundManager().stop( sound ); } - public static void moveSound( UUID source, Vec3d position ) + public static void moveSound( UUID source, Vec3 position ) { MoveableSound sound = sounds.get( source ); if( sound != null ) sound.setPosition( position ); @@ -54,24 +53,24 @@ public class SoundManager private static class MoveableSound extends AbstractSoundInstance implements TickableSoundInstance { - protected MoveableSound( Identifier sound, Vec3d position, float volume, float pitch ) + protected MoveableSound( ResourceLocation sound, Vec3 position, float volume, float pitch ) { - super( sound, SoundCategory.RECORDS ); + super( sound, SoundSource.RECORDS ); setPosition( position ); this.volume = volume; this.pitch = pitch; - attenuationType = SoundInstance.AttenuationType.LINEAR; + attenuation = SoundInstance.Attenuation.LINEAR; } - void setPosition( Vec3d position ) + void setPosition( Vec3 position ) { - x = (float) position.getX(); - y = (float) position.getY(); - z = (float) position.getZ(); + x = (float) position.x(); + y = (float) position.y(); + z = (float) position.z(); } @Override - public boolean isDone() + public boolean isStopped() { return false; } diff --git a/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java b/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java index fdab4ce8e..42557de5c 100644 --- a/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java +++ b/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java @@ -5,6 +5,7 @@ */ package dan200.computercraft.client.gui; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.gui.widgets.ComputerSidebar; import dan200.computercraft.client.gui.widgets.WidgetTerminal; @@ -16,14 +17,13 @@ import dan200.computercraft.shared.computer.upload.UploadResult; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.server.ContinueUploadMessage; import dan200.computercraft.shared.network.server.UploadFileMessage; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Inventory; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.SeekableByteChannel; @@ -34,12 +34,12 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -public abstract class ComputerScreenBase extends HandledScreen +public abstract class ComputerScreenBase extends AbstractContainerScreen { - private static final Text OK = new TranslatableText( "gui.ok" ); - private static final Text CANCEL = new TranslatableText( "gui.cancel" ); - private static final Text OVERWRITE = new TranslatableText( "gui.computercraft.upload.overwrite_button" ); + private static final Component OK = new TranslatableComponent( "gui.ok" ); + private static final Component CANCEL = new TranslatableComponent( "gui.cancel" ); + private static final Component OVERWRITE = new TranslatableComponent( "gui.computercraft.upload.overwrite_button" ); protected WidgetTerminal terminal; protected final ClientComputer computer; @@ -47,7 +47,7 @@ public abstract class ComputerScreenBase extend protected final int sidebarYOffset; - public ComputerScreenBase( T container, PlayerInventory player, Text title, int sidebarYOffset ) + public ComputerScreenBase( T container, Inventory player, Component title, int sidebarYOffset ) { super( container, player, title ); computer = (ClientComputer) container.getComputer(); @@ -61,10 +61,10 @@ public abstract class ComputerScreenBase extend protected final void init() { super.init(); - client.keyboard.setRepeatEvents( true ); + minecraft.keyboardHandler.setSendRepeatsToGui( true ); - terminal = addDrawableChild( createTerminal() ); - ComputerSidebar.addButtons( this, computer, this::addDrawableChild, x, y + sidebarYOffset ); + terminal = addRenderableWidget( createTerminal() ); + ComputerSidebar.addButtons( this, computer, this::addRenderableWidget, leftPos, topPos + sidebarYOffset ); setFocused( terminal ); } @@ -72,13 +72,13 @@ public abstract class ComputerScreenBase extend public final void removed() { super.removed(); - client.keyboard.setRepeatEvents( false ); + minecraft.keyboardHandler.setSendRepeatsToGui( false ); } @Override - public final void handledScreenTick() + public final void containerTick() { - super.handledScreenTick(); + super.containerTick(); terminal.update(); } @@ -95,11 +95,11 @@ public abstract class ComputerScreenBase extend } @Override - public final void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) + public final void render( @Nonnull PoseStack stack, int mouseX, int mouseY, float partialTicks ) { renderBackground( stack ); super.render( stack, mouseX, mouseY, partialTicks ); - drawMouseoverTooltip( stack, mouseX, mouseY ); + renderTooltip( stack, mouseX, mouseY ); } @Override @@ -109,13 +109,13 @@ public abstract class ComputerScreenBase extend } @Override - protected void drawForeground( @Nonnull MatrixStack transform, int mouseX, int mouseY ) + protected void renderLabels( @Nonnull PoseStack transform, int mouseX, int mouseY ) { // Skip rendering labels. } @Override - public void filesDragged( @Nonnull List files ) + public void onFilesDrop( @Nonnull List files ) { if( files.isEmpty() ) return; @@ -145,7 +145,7 @@ public abstract class ComputerScreenBase extend String name = file.getFileName().toString(); if( name.length() > UploadFileMessage.MAX_FILE_NAME ) { - alert( UploadResult.FAILED_TITLE, new TranslatableText( "gui.computercraft.upload.failed.name_too_long" ) ); + alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.name_too_long" ) ); return; } @@ -156,7 +156,7 @@ public abstract class ComputerScreenBase extend byte[] digest = FileUpload.getDigest( buffer ); if( digest == null ) { - alert( UploadResult.FAILED_TITLE, new TranslatableText( "gui.computercraft.upload.failed.corrupted" ) ); + alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.corrupted" ) ); return; } @@ -166,13 +166,13 @@ public abstract class ComputerScreenBase extend catch( IOException e ) { ComputerCraft.log.error( "Failed uploading files", e ); - alert( UploadResult.FAILED_TITLE, new TranslatableText( "gui.computercraft.upload.failed.generic", "Cannot compute checksum" ) ); + alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.generic", "Cannot compute checksum" ) ); } } if( toUpload.size() > UploadFileMessage.MAX_FILES ) { - alert( UploadResult.FAILED_TITLE, new TranslatableText( "gui.computercraft.upload.failed.too_many_files" ) ); + alert( UploadResult.FAILED_TITLE, new TranslatableComponent( "gui.computercraft.upload.failed.too_many_files" ) ); return; } @@ -182,7 +182,7 @@ public abstract class ComputerScreenBase extend } } - public void uploadResult( UploadResult result, Text message ) + public void uploadResult( UploadResult result, Component message ) { switch( result ) { @@ -194,7 +194,7 @@ public abstract class ComputerScreenBase extend break; case CONFIRM_OVERWRITE: OptionScreen.show( - client, UploadResult.UPLOAD_OVERWRITE, message, + minecraft, UploadResult.UPLOAD_OVERWRITE, message, Arrays.asList( OptionScreen.newButton( CANCEL, b -> cancelUpload() ), OptionScreen.newButton( OVERWRITE, b -> continueUpload() ) @@ -207,21 +207,21 @@ public abstract class ComputerScreenBase extend private void continueUpload() { - if( client.currentScreen instanceof OptionScreen ) ((OptionScreen) client.currentScreen).disable(); + if( minecraft.screen instanceof OptionScreen ) ((OptionScreen) minecraft.screen).disable(); NetworkHandler.sendToServer( new ContinueUploadMessage( computer.getInstanceID(), true ) ); } private void cancelUpload() { - client.setScreen( this ); + minecraft.setScreen( this ); NetworkHandler.sendToServer( new ContinueUploadMessage( computer.getInstanceID(), false ) ); } - private void alert( Text title, Text message ) + private void alert( Component title, Component message ) { - OptionScreen.show( client, title, message, - Collections.singletonList( OptionScreen.newButton( OK, b -> client.setScreen( this ) ) ), - () -> client.setScreen( this ) + OptionScreen.show( minecraft, title, message, + Collections.singletonList( OptionScreen.newButton( OK, b -> minecraft.setScreen( this ) ) ), + () -> minecraft.setScreen( this ) ); } diff --git a/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java b/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java index b0456bd69..bb405b39b 100644 --- a/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java +++ b/src/main/java/dan200/computercraft/client/gui/FixedWidthFontRenderer.java @@ -12,18 +12,18 @@ import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Palette; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.AffineTransformation; -import net.minecraft.util.math.Matrix4f; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.resources.ResourceLocation; import static dan200.computercraft.client.render.RenderTypes.FULL_BRIGHT_LIGHTMAP; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; +import com.mojang.math.Transformation; + public final class FixedWidthFontRenderer { public static final int FONT_HEIGHT = 9; @@ -31,9 +31,9 @@ public final class FixedWidthFontRenderer public static final float WIDTH = 256.0f; public static final float BACKGROUND_START = (WIDTH - 6.0f) / WIDTH; public static final float BACKGROUND_END = (WIDTH - 4.0f) / WIDTH; - private static final Matrix4f IDENTITY = AffineTransformation.identity() + private static final Matrix4f IDENTITY = Transformation.identity() .getMatrix(); - public static final Identifier FONT = new Identifier( "computercraft", "textures/gui/term_font.png" ); + public static final ResourceLocation FONT = new ResourceLocation( "computercraft", "textures/gui/term_font.png" ); private FixedWidthFontRenderer() @@ -157,34 +157,34 @@ public final class FixedWidthFontRenderer buffer.vertex( transform, x, y, 0f ) .color( r, g, b, 1.0f ) - .texture( xStart / WIDTH, yStart / WIDTH ) - .light( light ) - .next(); + .uv( xStart / WIDTH, yStart / WIDTH ) + .uv2( light ) + .endVertex(); buffer.vertex( transform, x, y + FONT_HEIGHT, 0f ) .color( r, g, b, 1.0f ) - .texture( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ) - .light( light ) - .next(); + .uv( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ) + .uv2( light ) + .endVertex(); buffer.vertex( transform, x + FONT_WIDTH, y, 0f ) .color( r, g, b, 1.0f ) - .texture( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ) - .light( light ) - .next(); + .uv( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ) + .uv2( light ) + .endVertex(); buffer.vertex( transform, x + FONT_WIDTH, y, 0f ) .color( r, g, b, 1.0f ) - .texture( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ) - .light( light ) - .next(); + .uv( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ) + .uv2( light ) + .endVertex(); buffer.vertex( transform, x, y + FONT_HEIGHT, 0f ) .color( r, g, b, 1.0f ) - .texture( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ) - .light( light ) - .next(); + .uv( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ) + .uv2( light ) + .endVertex(); buffer.vertex( transform, x + FONT_WIDTH, y + FONT_HEIGHT, 0f ) .color( r, g, b, 1.0f ) - .texture( (xStart + FONT_WIDTH) / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ) - .light( light ) - .next(); + .uv( (xStart + FONT_WIDTH) / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ) + .uv2( light ) + .endVertex(); } private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, Palette palette, @@ -210,28 +210,28 @@ public final class FixedWidthFontRenderer { buffer.vertex( transform, x, y, 0 ) .color( r, g, b, 1.0f ) - .texture( BACKGROUND_START, BACKGROUND_START ) - .next(); + .uv( BACKGROUND_START, BACKGROUND_START ) + .endVertex(); buffer.vertex( transform, x, y + height, 0 ) .color( r, g, b, 1.0f ) - .texture( BACKGROUND_START, BACKGROUND_END ) - .next(); + .uv( BACKGROUND_START, BACKGROUND_END ) + .endVertex(); buffer.vertex( transform, x + width, y, 0 ) .color( r, g, b, 1.0f ) - .texture( BACKGROUND_END, BACKGROUND_START ) - .next(); + .uv( BACKGROUND_END, BACKGROUND_START ) + .endVertex(); buffer.vertex( transform, x + width, y, 0 ) .color( r, g, b, 1.0f ) - .texture( BACKGROUND_END, BACKGROUND_START ) - .next(); + .uv( BACKGROUND_END, BACKGROUND_START ) + .endVertex(); buffer.vertex( transform, x, y + height, 0 ) .color( r, g, b, 1.0f ) - .texture( BACKGROUND_START, BACKGROUND_END ) - .next(); + .uv( BACKGROUND_START, BACKGROUND_END ) + .endVertex(); buffer.vertex( transform, x + width, y + height, 0 ) .color( r, g, b, 1.0f ) - .texture( BACKGROUND_END, BACKGROUND_END ) - .next(); + .uv( BACKGROUND_END, BACKGROUND_END ) + .endVertex(); } public static void drawTerminalWithoutCursor( @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @@ -319,12 +319,12 @@ public final class FixedWidthFontRenderer public static void drawTerminal( @Nonnull Matrix4f transform, float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize ) { - VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() - .getBufferBuilders() - .getEntityVertexConsumers(); + MultiBufferSource.BufferSource renderer = Minecraft.getInstance() + .renderBuffers() + .bufferSource(); VertexConsumer buffer = renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH ); drawTerminal( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); - renderer.draw(); + renderer.endBatch(); } public static void drawTerminal( float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize, @@ -341,21 +341,21 @@ public final class FixedWidthFontRenderer public static void drawEmptyTerminal( @Nonnull Matrix4f transform, float x, float y, float width, float height ) { - VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() - .getBufferBuilders() - .getEntityVertexConsumers(); + MultiBufferSource.BufferSource renderer = Minecraft.getInstance() + .renderBuffers() + .bufferSource(); drawEmptyTerminal( transform, renderer, x, y, width, height ); - renderer.draw(); + renderer.endBatch(); } - public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, + public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull MultiBufferSource renderer, float x, float y, float width, float height ) { Colour colour = Colour.BLACK; drawQuad( transform, renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() ); } - public static void drawBlocker( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, float height ) + public static void drawBlocker( @Nonnull Matrix4f transform, @Nonnull MultiBufferSource renderer, float x, float y, float width, float height ) { Colour colour = Colour.BLACK; drawQuad( transform, renderer.getBuffer( RenderTypes.TERMINAL_BLOCKER ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() ); diff --git a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java index 8d3eba876..52772c7ea 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java @@ -13,41 +13,41 @@ import dan200.computercraft.client.render.ComputerBorderRenderer; import dan200.computercraft.client.render.RenderTypes; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; - import javax.annotation.Nonnull; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER; import static dan200.computercraft.client.render.ComputerBorderRenderer.getTexture; +import com.mojang.blaze3d.vertex.PoseStack; + public final class GuiComputer extends ComputerScreenBase { private final int termWidth; private final int termHeight; - private GuiComputer( T container, PlayerInventory player, Text title, int termWidth, int termHeight ) + private GuiComputer( T container, Inventory player, Component title, int termWidth, int termHeight ) { super( container, player, title, BORDER ); this.termWidth = termWidth; this.termHeight = termHeight; - backgroundWidth = WidgetTerminal.getWidth( termWidth ) + BORDER * 2 + ComputerSidebar.WIDTH; - backgroundHeight = WidgetTerminal.getHeight( termHeight ) + BORDER * 2; + imageWidth = WidgetTerminal.getWidth( termWidth ) + BORDER * 2 + ComputerSidebar.WIDTH; + imageHeight = WidgetTerminal.getHeight( termHeight ) + BORDER * 2; } - public static GuiComputer create( ContainerComputerBase container, PlayerInventory inventory, Text component ) + public static GuiComputer create( ContainerComputerBase container, Inventory inventory, Component component ) { return new GuiComputer<>( container, inventory, component, ComputerCraft.computerTermWidth, ComputerCraft.computerTermHeight ); } - public static GuiComputer createPocket( ContainerComputerBase container, PlayerInventory inventory, Text component ) + public static GuiComputer createPocket( ContainerComputerBase container, Inventory inventory, Component component ) { return new GuiComputer<>( container, inventory, component, ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight ); } - public static GuiComputer createView( ContainerViewComputer container, PlayerInventory inventory, Text component ) + public static GuiComputer createView( ContainerViewComputer container, Inventory inventory, Component component ) { return new GuiComputer<>( container, inventory, component, container.getWidth(), container.getHeight() ); } @@ -56,15 +56,15 @@ public final class GuiComputer extends Computer protected WidgetTerminal createTerminal() { return new WidgetTerminal( computer, - x + ComputerSidebar.WIDTH + BORDER, y + BORDER, termWidth, termHeight + leftPos + ComputerSidebar.WIDTH + BORDER, topPos + BORDER, termWidth, termHeight ); } @Override - public void drawBackground( @Nonnull MatrixStack stack, float partialTicks, int mouseX, int mouseY ) + public void renderBg( @Nonnull PoseStack stack, float partialTicks, int mouseX, int mouseY ) { ComputerBorderRenderer.render( - getTexture( family ), terminal.x, terminal.y, getZOffset(), + getTexture( family ), terminal.x, terminal.y, getBlitOffset(), RenderTypes.FULL_BRIGHT_LIGHTMAP, terminal.getWidth(), terminal.getHeight() ); - ComputerSidebar.renderBackground( stack, x, y + sidebarYOffset ); + ComputerSidebar.renderBackground( stack, leftPos, topPos + sidebarYOffset ); } } diff --git a/src/main/java/dan200/computercraft/client/gui/GuiDiskDrive.java b/src/main/java/dan200/computercraft/client/gui/GuiDiskDrive.java index 0cfbc3daa..58e97f3f6 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiDiskDrive.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiDiskDrive.java @@ -7,39 +7,38 @@ package dan200.computercraft.client.gui; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; -public class GuiDiskDrive extends HandledScreen +public class GuiDiskDrive extends AbstractContainerScreen { - private static final Identifier BACKGROUND = new Identifier( "computercraft", "textures/gui/disk_drive.png" ); + private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/disk_drive.png" ); - public GuiDiskDrive( ContainerDiskDrive container, PlayerInventory player, Text title ) + public GuiDiskDrive( ContainerDiskDrive container, Inventory player, Component title ) { super( container, player, title ); } @Override - public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks ) + public void render( @Nonnull PoseStack transform, int mouseX, int mouseY, float partialTicks ) { renderBackground( transform ); super.render( transform, mouseX, mouseY, partialTicks ); - drawMouseoverTooltip( transform, mouseX, mouseY ); + renderTooltip( transform, mouseX, mouseY ); } @Override - protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) + protected void renderBg( @Nonnull PoseStack transform, float partialTicks, int mouseX, int mouseY ) { RenderSystem.setShader( GameRenderer::getPositionTexShader ); RenderSystem.setShaderColor( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.setShaderTexture( 0, BACKGROUND ); - drawTexture( transform, x, y, 0, 0, backgroundWidth, backgroundHeight ); + blit( transform, leftPos, topPos, 0, 0, imageWidth, imageHeight ); } } diff --git a/src/main/java/dan200/computercraft/client/gui/GuiPrinter.java b/src/main/java/dan200/computercraft/client/gui/GuiPrinter.java index 917a6861a..7b3be404e 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiPrinter.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiPrinter.java @@ -7,42 +7,41 @@ package dan200.computercraft.client.gui; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.shared.peripheral.printer.ContainerPrinter; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; -public class GuiPrinter extends HandledScreen +public class GuiPrinter extends AbstractContainerScreen { - private static final Identifier BACKGROUND = new Identifier( "computercraft", "textures/gui/printer.png" ); + private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/printer.png" ); - public GuiPrinter( ContainerPrinter container, PlayerInventory player, Text title ) + public GuiPrinter( ContainerPrinter container, Inventory player, Component title ) { super( container, player, title ); } @Override - public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) + public void render( @Nonnull PoseStack stack, int mouseX, int mouseY, float partialTicks ) { renderBackground( stack ); super.render( stack, mouseX, mouseY, partialTicks ); - drawMouseoverTooltip( stack, mouseX, mouseY ); + renderTooltip( stack, mouseX, mouseY ); } @Override - protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) + protected void renderBg( @Nonnull PoseStack transform, float partialTicks, int mouseX, int mouseY ) { RenderSystem.setShaderColor( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.setShaderTexture( 0, BACKGROUND ); - drawTexture( transform, x, y, 0, 0, backgroundWidth, backgroundHeight ); + blit( transform, leftPos, topPos, 0, 0, imageWidth, imageHeight ); - if( getScreenHandler().isPrinting() ) + if( getMenu().isPrinting() ) { - drawTexture( transform, x + 34, y + 21, 176, 0, 25, 45 ); + blit( transform, leftPos + 34, topPos + 21, 176, 0, 25, 45 ); } } } diff --git a/src/main/java/dan200/computercraft/client/gui/GuiPrintout.java b/src/main/java/dan200/computercraft/client/gui/GuiPrintout.java index 2163ef355..b985cf47a 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiPrintout.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiPrintout.java @@ -7,24 +7,24 @@ package dan200.computercraft.client.gui; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.shared.common.ContainerHeldItem; import dan200.computercraft.shared.media.items.ItemPrintout; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import net.minecraft.util.math.Matrix4f; import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; import static dan200.computercraft.client.render.PrintoutRenderer.*; import static dan200.computercraft.client.render.RenderTypes.FULL_BRIGHT_LIGHTMAP; -public class GuiPrintout extends HandledScreen +public class GuiPrintout extends AbstractContainerScreen { private final boolean book; private final int pages; @@ -32,11 +32,11 @@ public class GuiPrintout extends HandledScreen private final TextBuffer[] colours; private int page; - public GuiPrintout( ContainerHeldItem container, PlayerInventory player, Text title ) + public GuiPrintout( ContainerHeldItem container, Inventory player, Component title ) { super( container, player, title ); - backgroundHeight = Y_SIZE; + imageHeight = Y_SIZE; String[] text = ItemPrintout.getText( container.getStack() ); this.text = new TextBuffer[text.length]; @@ -89,37 +89,37 @@ public class GuiPrintout extends HandledScreen } @Override - public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) + public void render( @Nonnull PoseStack stack, int mouseX, int mouseY, float partialTicks ) { // We must take the background further back in order to not overlap with our printed pages. - setZOffset( getZOffset() - 1 ); + setBlitOffset( getBlitOffset() - 1 ); renderBackground( stack ); - setZOffset( getZOffset() + 1 ); + setBlitOffset( getBlitOffset() + 1 ); super.render( stack, mouseX, mouseY, partialTicks ); } @Override - protected void drawForeground( @Nonnull MatrixStack transform, int mouseX, int mouseY ) + protected void renderLabels( @Nonnull PoseStack transform, int mouseX, int mouseY ) { // Skip rendering labels. } @Override - protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) + protected void renderBg( @Nonnull PoseStack transform, float partialTicks, int mouseX, int mouseY ) { // Draw the printout RenderSystem.setShaderColor( 1.0f, 1.0f, 1.0f, 1.0f ); RenderSystem.enableDepthTest(); - VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() - .getBufferBuilders() - .getEntityVertexConsumers(); - Matrix4f matrix = transform.peek() - .getModel(); - drawBorder( matrix, renderer, x, y, getZOffset(), page, pages, book, FULL_BRIGHT_LIGHTMAP ); - drawText( matrix, renderer, x + X_TEXT_MARGIN, y + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * page, FULL_BRIGHT_LIGHTMAP, text, colours ); - renderer.draw(); + MultiBufferSource.BufferSource renderer = Minecraft.getInstance() + .renderBuffers() + .bufferSource(); + Matrix4f matrix = transform.last() + .pose(); + drawBorder( matrix, renderer, leftPos, topPos, getBlitOffset(), page, pages, book, FULL_BRIGHT_LIGHTMAP ); + drawText( matrix, renderer, leftPos + X_TEXT_MARGIN, topPos + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * page, FULL_BRIGHT_LIGHTMAP, text, colours ); + renderer.endBatch(); } @Override diff --git a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java index 56dd0b1be..4f0434b17 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java @@ -7,38 +7,37 @@ package dan200.computercraft.client.gui; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.gui.widgets.ComputerSidebar; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.render.ComputerBorderRenderer; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; import static dan200.computercraft.shared.turtle.inventory.ContainerTurtle.BORDER; public class GuiTurtle extends ComputerScreenBase { - private static final Identifier BACKGROUND_NORMAL = new Identifier( "computercraft", "textures/gui/turtle_normal.png" ); - private static final Identifier BACKGROUND_ADVANCED = new Identifier( "computercraft", "textures/gui/turtle_advanced.png" ); + private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( "computercraft", "textures/gui/turtle_normal.png" ); + private static final ResourceLocation BACKGROUND_ADVANCED = new ResourceLocation( "computercraft", "textures/gui/turtle_advanced.png" ); private static final int TEX_WIDTH = 254; private static final int TEX_HEIGHT = 217; private final ComputerFamily family; - public GuiTurtle( ContainerTurtle container, PlayerInventory player, Text title ) + public GuiTurtle( ContainerTurtle container, Inventory player, Component title ) { super( container, player, title, BORDER ); family = container.getFamily(); - backgroundWidth = TEX_WIDTH + ComputerSidebar.WIDTH; - backgroundHeight = TEX_HEIGHT; + imageWidth = TEX_WIDTH + ComputerSidebar.WIDTH; + imageHeight = TEX_HEIGHT; } @@ -46,25 +45,25 @@ public class GuiTurtle extends ComputerScreenBase protected WidgetTerminal createTerminal() { return new WidgetTerminal( - computer, x + BORDER + ComputerSidebar.WIDTH, y + BORDER, + computer, leftPos + BORDER + ComputerSidebar.WIDTH, topPos + BORDER, ComputerCraft.turtleTermWidth, ComputerCraft.turtleTermHeight ); } @Override - public void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) + public void renderBg( @Nonnull PoseStack transform, float partialTicks, int mouseX, int mouseY ) { boolean advanced = family == ComputerFamily.ADVANCED; RenderSystem.setShaderTexture( 0, advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL ); - drawTexture( transform, x + ComputerSidebar.WIDTH, y, 0, 0, TEX_WIDTH, TEX_HEIGHT ); + blit( transform, leftPos + ComputerSidebar.WIDTH, topPos, 0, 0, TEX_WIDTH, TEX_HEIGHT ); // Draw selection slot - int slot = getScreenHandler().getSelectedSlot(); + int slot = getMenu().getSelectedSlot(); if( slot >= 0 ) { int slotX = slot % 4; int slotY = slot / 4; - drawTexture( transform, x + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, y + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, + blit( transform, leftPos + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, topPos + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, 0, 217, 24, @@ -72,6 +71,6 @@ public class GuiTurtle extends ComputerScreenBase } RenderSystem.setShaderTexture( 0, advanced ? ComputerBorderRenderer.BACKGROUND_ADVANCED : ComputerBorderRenderer.BACKGROUND_NORMAL ); - ComputerSidebar.renderBackground( transform, x, y + sidebarYOffset ); + ComputerSidebar.renderBackground( transform, leftPos, topPos + sidebarYOffset ); } } diff --git a/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java b/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java index 5ea1642a5..67b720e99 100644 --- a/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java +++ b/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java @@ -5,29 +5,29 @@ */ package dan200.computercraft.client.gui; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.shared.computer.core.ClientComputer; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.entity.player.Inventory; import java.util.List; -public class NoTermComputerScreen extends Screen implements ScreenHandlerProvider +public class NoTermComputerScreen extends Screen implements MenuAccess { private final T menu; private WidgetTerminal terminal; - public NoTermComputerScreen( T menu, PlayerInventory player, Text title ) + public NoTermComputerScreen( T menu, Inventory player, Component title ) { super( title ); this.menu = menu; @@ -35,7 +35,7 @@ public class NoTermComputerScreen extends Scree @Nonnull @Override - public T getScreenHandler() + public T getMenu() { return menu; } @@ -44,12 +44,12 @@ public class NoTermComputerScreen extends Scree protected void init() { this.passEvents = true; - client.mouse.lockCursor(); - client.currentScreen = this; + minecraft.mouseHandler.grabMouse(); + minecraft.screen = this; super.init(); - client.keyboard.setRepeatEvents( true ); + minecraft.keyboardHandler.setSendRepeatsToGui( true ); - terminal = addSelectableChild( new WidgetTerminal( (ClientComputer) menu.getComputer(), 0, 0, ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight ) ); + terminal = addWidget( new WidgetTerminal( (ClientComputer) menu.getComputer(), 0, 0, ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight ) ); terminal.visible = false; terminal.active = false; setFocused( terminal ); @@ -59,7 +59,7 @@ public class NoTermComputerScreen extends Scree public final void removed() { super.removed(); - client.keyboard.setRepeatEvents( false ); + minecraft.keyboardHandler.setSendRepeatsToGui( false ); } @Override @@ -72,14 +72,14 @@ public class NoTermComputerScreen extends Scree @Override public boolean mouseScrolled( double pMouseX, double pMouseY, double pDelta ) { - client.player.getInventory().scrollInHotbar( pDelta ); + minecraft.player.getInventory().swapPaint( pDelta ); return super.mouseScrolled( pMouseX, pMouseY, pDelta ); } @Override public void onClose() { - client.player.closeHandledScreen(); + minecraft.player.closeContainer(); super.onClose(); } @@ -102,16 +102,16 @@ public class NoTermComputerScreen extends Scree } @Override - public void render( MatrixStack transform, int mouseX, int mouseY, float partialTicks ) + public void render( PoseStack transform, int mouseX, int mouseY, float partialTicks ) { super.render( transform, mouseX, mouseY, partialTicks ); - TextRenderer font = client.textRenderer; - List lines = font.wrapLines( new TranslatableText( "gui.computercraft.pocket_computer_overlay" ), (int) (width * 0.8) ); + Font font = minecraft.font; + List lines = font.split( new TranslatableComponent( "gui.computercraft.pocket_computer_overlay" ), (int) (width * 0.8) ); float y = 10.0f; - for( OrderedText line : lines ) + for( FormattedCharSequence line : lines ) { - font.drawWithShadow( transform, line, (float) ((width / 2) - (client.textRenderer.getWidth( line ) / 2)), y, 0xFFFFFF ); + font.drawShadow( transform, line, (float) ((width / 2) - (minecraft.font.width( line ) / 2)), y, 0xFFFFFF ); y += 9.0f; } } diff --git a/src/main/java/dan200/computercraft/client/gui/OptionScreen.java b/src/main/java/dan200/computercraft/client/gui/OptionScreen.java index 23de17f2a..8ecdf2d38 100644 --- a/src/main/java/dan200/computercraft/client/gui/OptionScreen.java +++ b/src/main/java/dan200/computercraft/client/gui/OptionScreen.java @@ -6,21 +6,20 @@ package dan200.computercraft.client.gui; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.MultilineText; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - +import com.mojang.blaze3d.vertex.PoseStack; import javax.annotation.Nonnull; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.MultiLineLabel; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import java.util.List; public final class OptionScreen extends Screen { - private static final Identifier BACKGROUND = new Identifier( "computercraft", "textures/gui/blank_screen.png" ); + private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/blank_screen.png" ); public static final int BUTTON_WIDTH = 100; public static final int BUTTON_HEIGHT = 20; @@ -33,14 +32,14 @@ public final class OptionScreen extends Screen private int innerWidth; private int innerHeight; - private MultilineText messageRenderer; - private final Text message; - private final List buttons; + private MultiLineLabel messageRenderer; + private final Component message; + private final List buttons; private final Runnable exit; private final Screen originalScreen; - private OptionScreen( Text title, Text message, List buttons, Runnable exit, Screen originalScreen ) + private OptionScreen( Component title, Component message, List buttons, Runnable exit, Screen originalScreen ) { super( title ); this.message = message; @@ -49,9 +48,9 @@ public final class OptionScreen extends Screen this.originalScreen = originalScreen; } - public static void show( MinecraftClient client, Text title, Text message, List buttons, Runnable exit ) + public static void show( Minecraft client, Component title, Component message, List buttons, Runnable exit ) { - client.setScreen( new OptionScreen( title, message, buttons, exit, unwrap( client.currentScreen ) ) ); + client.setScreen( new OptionScreen( title, message, buttons, exit, unwrap( client.screen ) ) ); } public static Screen unwrap( Screen screen ) @@ -67,40 +66,40 @@ public final class OptionScreen extends Screen int buttonWidth = BUTTON_WIDTH * buttons.size() + PADDING * (buttons.size() - 1); int innerWidth = this.innerWidth = Math.max( 256, buttonWidth + PADDING * 2 ); - messageRenderer = MultilineText.create( textRenderer, message, innerWidth - PADDING * 2 ); + messageRenderer = MultiLineLabel.create( font, message, innerWidth - PADDING * 2 ); - int textHeight = messageRenderer.count() * FONT_HEIGHT + PADDING * 2; + int textHeight = messageRenderer.getLineCount() * FONT_HEIGHT + PADDING * 2; innerHeight = textHeight + (buttons.isEmpty() ? 0 : buttons.get( 0 ).getHeight()) + PADDING; x = (width - innerWidth) / 2; y = (height - innerHeight) / 2; int x = (width - buttonWidth) / 2; - for( ClickableWidget button : buttons ) + for( AbstractWidget button : buttons ) { button.x = x; button.y = y + textHeight; - addDrawableChild( button ); + addRenderableWidget( button ); x += BUTTON_WIDTH + PADDING; } } @Override - public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks ) + public void render( @Nonnull PoseStack transform, int mouseX, int mouseY, float partialTicks ) { renderBackground( transform ); // Render the actual texture. RenderSystem.setShaderTexture( 0, BACKGROUND ); - drawTexture( transform, x, y, 0, 0, innerWidth, PADDING ); - drawTexture( transform, + blit( transform, x, y, 0, 0, innerWidth, PADDING ); + blit( transform, x, y + PADDING, 0, PADDING, innerWidth, innerHeight - PADDING * 2, innerWidth, PADDING ); - drawTexture( transform, x, y + innerHeight - PADDING, 0, 256 - PADDING, innerWidth, PADDING ); + blit( transform, x, y + innerHeight - PADDING, 0, 256 - PADDING, innerWidth, PADDING ); - messageRenderer.draw( transform, x + PADDING, y + PADDING, FONT_HEIGHT, 0x404040 ); + messageRenderer.renderLeftAlignedNoShadow( transform, x + PADDING, y + PADDING, FONT_HEIGHT, 0x404040 ); super.render( transform, mouseX, mouseY, partialTicks ); } @@ -110,14 +109,14 @@ public final class OptionScreen extends Screen exit.run(); } - public static ClickableWidget newButton( Text component, ButtonWidget.PressAction clicked ) + public static AbstractWidget newButton( Component component, Button.OnPress clicked ) { - return new ButtonWidget( 0, 0, BUTTON_WIDTH, BUTTON_HEIGHT, component, clicked ); + return new Button( 0, 0, BUTTON_WIDTH, BUTTON_HEIGHT, component, clicked ); } public void disable() { - for( ClickableWidget widget : buttons ) widget.active = false; + for( AbstractWidget widget : buttons ) widget.active = false; } @Nonnull diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/ComputerSidebar.java b/src/main/java/dan200/computercraft/client/gui/widgets/ComputerSidebar.java index 25d87c8dc..2faf45680 100644 --- a/src/main/java/dan200/computercraft/client/gui/widgets/ComputerSidebar.java +++ b/src/main/java/dan200/computercraft/client/gui/widgets/ComputerSidebar.java @@ -5,26 +5,25 @@ */ package dan200.computercraft.client.gui.widgets; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.render.ComputerBorderRenderer; import dan200.computercraft.shared.command.text.ChatHelpers; import dan200.computercraft.shared.computer.core.ClientComputer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; - import java.util.Arrays; import java.util.function.Consumer; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; /** * Registers buttons to interact with a computer. */ public final class ComputerSidebar { - private static final Identifier TEXTURE = new Identifier( ComputerCraft.MOD_ID, "textures/gui/buttons.png" ); + private static final ResourceLocation TEXTURE = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/buttons.png" ); private static final int TEX_SIZE = 64; @@ -45,7 +44,7 @@ public final class ComputerSidebar { } - public static void addButtons( Screen screen, ClientComputer computer, Consumer add, int x, int y ) + public static void addButtons( Screen screen, ClientComputer computer, Consumer add, int x, int y ) { x += CORNERS_BORDER + 1; y += CORNERS_BORDER + ICON_MARGIN; @@ -54,11 +53,11 @@ public final class ComputerSidebar screen, x, y, ICON_WIDTH, ICON_HEIGHT, () -> computer.isOn() ? 15 : 1, 1, ICON_TEX_Y_DIFF, TEXTURE, TEX_SIZE, TEX_SIZE, b -> toggleComputer( computer ), () -> computer.isOn() ? Arrays.asList( - new TranslatableText( "gui.computercraft.tooltip.turn_off" ), - ChatHelpers.coloured( new TranslatableText( "gui.computercraft.tooltip.turn_off.key" ), Formatting.GRAY ) + new TranslatableComponent( "gui.computercraft.tooltip.turn_off" ), + ChatHelpers.coloured( new TranslatableComponent( "gui.computercraft.tooltip.turn_off.key" ), ChatFormatting.GRAY ) ) : Arrays.asList( - new TranslatableText( "gui.computercraft.tooltip.turn_on" ), - ChatHelpers.coloured( new TranslatableText( "gui.computercraft.tooltip.turn_off.key" ), Formatting.GRAY ) + new TranslatableComponent( "gui.computercraft.tooltip.turn_on" ), + ChatHelpers.coloured( new TranslatableComponent( "gui.computercraft.tooltip.turn_off.key" ), ChatFormatting.GRAY ) ) ) ); @@ -68,26 +67,26 @@ public final class ComputerSidebar screen, x, y, ICON_WIDTH, ICON_HEIGHT, 29, 1, ICON_TEX_Y_DIFF, TEXTURE, TEX_SIZE, TEX_SIZE, b -> computer.queueEvent( "terminate" ), Arrays.asList( - new TranslatableText( "gui.computercraft.tooltip.terminate" ), - ChatHelpers.coloured( new TranslatableText( "gui.computercraft.tooltip.terminate.key" ), Formatting.GRAY ) + new TranslatableComponent( "gui.computercraft.tooltip.terminate" ), + ChatHelpers.coloured( new TranslatableComponent( "gui.computercraft.tooltip.terminate.key" ), ChatFormatting.GRAY ) ) ) ); } - public static void renderBackground( MatrixStack transform, int x, int y ) + public static void renderBackground( PoseStack transform, int x, int y ) { - Screen.drawTexture( transform, + Screen.blit( transform, x, y, 0, 102, WIDTH, FULL_BORDER, ComputerBorderRenderer.TEX_SIZE, ComputerBorderRenderer.TEX_SIZE ); - Screen.drawTexture( transform, + Screen.blit( transform, x, y + FULL_BORDER, WIDTH, HEIGHT - FULL_BORDER * 2, 0, 107, WIDTH, 4, ComputerBorderRenderer.TEX_SIZE, ComputerBorderRenderer.TEX_SIZE ); - Screen.drawTexture( transform, + Screen.blit( transform, x, y + HEIGHT - FULL_BORDER, 0, 111, WIDTH, FULL_BORDER, ComputerBorderRenderer.TEX_SIZE, ComputerBorderRenderer.TEX_SIZE ); diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java b/src/main/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java index 4e8751883..a2ed56dc6 100644 --- a/src/main/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java +++ b/src/main/java/dan200/computercraft/client/gui/widgets/DynamicImageButton.java @@ -6,37 +6,36 @@ package dan200.computercraft.client.gui.widgets; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - +import com.mojang.blaze3d.vertex.PoseStack; import javax.annotation.Nonnull; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; import java.util.List; import java.util.function.IntSupplier; import java.util.function.Supplier; /** - * Version of {@link net.minecraft.client.gui.widget.TexturedButtonWidget} which allows changing some properties + * Version of {@link net.minecraft.client.gui.components.ImageButton} which allows changing some properties * dynamically. */ -public class DynamicImageButton extends ButtonWidget +public class DynamicImageButton extends Button { private final Screen screen; - private final Identifier texture; + private final ResourceLocation texture; private final IntSupplier xTexStart; private final int yTexStart; private final int yDiffTex; private final int textureWidth; private final int textureHeight; - private final Supplier> tooltip; + private final Supplier> tooltip; public DynamicImageButton( Screen screen, int x, int y, int width, int height, int xTexStart, int yTexStart, int yDiffTex, - Identifier texture, int textureWidth, int textureHeight, - PressAction onPress, List tooltip + ResourceLocation texture, int textureWidth, int textureHeight, + OnPress onPress, List tooltip ) { this( @@ -49,11 +48,11 @@ public class DynamicImageButton extends ButtonWidget public DynamicImageButton( Screen screen, int x, int y, int width, int height, IntSupplier xTexStart, int yTexStart, int yDiffTex, - Identifier texture, int textureWidth, int textureHeight, - PressAction onPress, Supplier> tooltip + ResourceLocation texture, int textureWidth, int textureHeight, + OnPress onPress, Supplier> tooltip ) { - super( x, y, width, height, LiteralText.EMPTY, onPress ); + super( x, y, width, height, TextComponent.EMPTY, onPress ); this.screen = screen; this.textureWidth = textureWidth; this.textureHeight = textureHeight; @@ -65,7 +64,7 @@ public class DynamicImageButton extends ButtonWidget } @Override - public void renderButton( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) + public void renderButton( @Nonnull PoseStack stack, int mouseX, int mouseY, float partialTicks ) { RenderSystem.setShaderTexture( 0, texture ); RenderSystem.disableDepthTest(); @@ -73,7 +72,7 @@ public class DynamicImageButton extends ButtonWidget int yTex = yTexStart; if( isHovered() ) yTex += yDiffTex; - drawTexture( stack, x, y, xTexStart.getAsInt(), yTex, width, height, textureWidth, textureHeight ); + blit( stack, x, y, xTexStart.getAsInt(), yTex, width, height, textureWidth, textureHeight ); RenderSystem.enableDepthTest(); if( isHovered() ) renderToolTip( stack, mouseX, mouseY ); @@ -81,20 +80,20 @@ public class DynamicImageButton extends ButtonWidget @Nonnull @Override - public Text getMessage() + public Component getMessage() { - List tooltip = this.tooltip.get(); - return tooltip.isEmpty() ? LiteralText.EMPTY : tooltip.get( 0 ); + List tooltip = this.tooltip.get(); + return tooltip.isEmpty() ? TextComponent.EMPTY : tooltip.get( 0 ); } // @Override - public void renderToolTip( @Nonnull MatrixStack stack, int mouseX, int mouseY ) + public void renderToolTip( @Nonnull PoseStack stack, int mouseX, int mouseY ) { - List tooltip = this.tooltip.get(); + List tooltip = this.tooltip.get(); if( !tooltip.isEmpty() ) { - screen.renderTooltip( stack, tooltip, mouseX, mouseY ); + screen.renderComponentTooltip( stack, tooltip, mouseX, mouseY ); } } } diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java index 62c3d8404..0a79ad45a 100644 --- a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java +++ b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java @@ -10,12 +10,10 @@ import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.computer.core.ClientComputer; import net.minecraft.SharedConstants; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.LiteralText; -import net.minecraft.util.math.Matrix4f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.TextComponent; import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; @@ -25,7 +23,10 @@ import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_WIDTH; import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN; -public class WidgetTerminal extends ClickableWidget +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; + +public class WidgetTerminal extends AbstractWidget { private static final float TERMINATE_TIME = 0.5f; @@ -49,7 +50,7 @@ public class WidgetTerminal extends ClickableWidget public WidgetTerminal( @Nonnull ClientComputer computer, int x, int y, int termWidth, int termHeight ) { - super( x, y, termWidth * FONT_WIDTH + MARGIN * 2, termHeight * FONT_HEIGHT + MARGIN * 2, LiteralText.EMPTY ); + super( x, y, termWidth * FONT_WIDTH + MARGIN * 2, termHeight * FONT_HEIGHT + MARGIN * 2, TextComponent.EMPTY ); this.computer = computer; @@ -207,7 +208,7 @@ public class WidgetTerminal extends ClickableWidget case GLFW.GLFW_KEY_V: // Ctrl+V for paste - String clipboard = MinecraftClient.getInstance().keyboard.getClipboard(); + String clipboard = Minecraft.getInstance().keyboardHandler.getClipboard(); if( clipboard != null ) { // Clip to the first occurrence of \r or \n @@ -227,7 +228,7 @@ public class WidgetTerminal extends ClickableWidget } // Filter the string - clipboard = SharedConstants.stripInvalidChars( clipboard ); + clipboard = SharedConstants.filterText( clipboard ); if( !clipboard.isEmpty() ) { // Clip to 512 characters and queue the event @@ -346,10 +347,10 @@ public class WidgetTerminal extends ClickableWidget } @Override - public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks ) + public void render( @Nonnull PoseStack transform, int mouseX, int mouseY, float partialTicks ) { if( !visible ) return; - Matrix4f matrix = transform.peek().getModel(); + Matrix4f matrix = transform.last().pose(); Terminal terminal = computer.getTerminal(); if( terminal != null ) { @@ -362,7 +363,7 @@ public class WidgetTerminal extends ClickableWidget } @Override - public void appendNarrations( NarrationMessageBuilder builder ) + public void updateNarration( NarrationElementOutput builder ) { } diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java index 3d22b88ef..b8791841e 100644 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java @@ -39,12 +39,11 @@ import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; -import net.minecraft.client.item.UnclampedModelPredicateProvider; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.item.Item; -import net.minecraft.screen.PlayerScreenHandler; -import net.minecraft.util.Identifier; - +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.Item; import java.util.function.Supplier; @Environment( EnvType.CLIENT ) @@ -73,11 +72,11 @@ public final class ComputerCraftProxyClient implements ClientModInitializer registerContainers(); // While turtles themselves are not transparent, their upgrades may be. - BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_NORMAL, RenderLayer.getTranslucent() ); - BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED, RenderLayer.getTranslucent() ); + BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_NORMAL, RenderType.translucent() ); + BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.TURTLE_ADVANCED, RenderType.translucent() ); // Monitors' textures have transparent fronts and so count as cutouts. - BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_NORMAL, RenderLayer.getCutout() ); - BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_ADVANCED, RenderLayer.getCutout() ); + BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_NORMAL, RenderType.cutout() ); + BlockRenderLayerMap.INSTANCE.putBlock( ComputerCraftRegistry.ModBlocks.MONITOR_ADVANCED, RenderType.cutout() ); // Setup TESRs BlockEntityRendererRegistry.register( ComputerCraftRegistry.ModTiles.MONITOR_NORMAL, TileEntityMonitorRenderer::new ); @@ -85,7 +84,7 @@ public final class ComputerCraftProxyClient implements ClientModInitializer BlockEntityRendererRegistry.register( ComputerCraftRegistry.ModTiles.TURTLE_NORMAL, TileEntityTurtleRenderer::new ); BlockEntityRendererRegistry.register( ComputerCraftRegistry.ModTiles.TURTLE_ADVANCED, TileEntityTurtleRenderer::new ); - ClientSpriteRegistryCallback.event( PlayerScreenHandler.BLOCK_ATLAS_TEXTURE ) + ClientSpriteRegistryCallback.event( InventoryMenu.BLOCK_ATLAS ) .register( ClientRegistry::onTextureStitchEvent ); ModelLoadingRegistry.INSTANCE.registerModelProvider( ClientRegistry::onModelBakeEvent ); ModelLoadingRegistry.INSTANCE.registerResourceProvider( loader -> ( name, context ) -> TurtleModelLoader.INSTANCE.accepts( name ) ? @@ -127,9 +126,9 @@ public final class ComputerCraftProxyClient implements ClientModInitializer } @SafeVarargs - private static void registerItemProperty( String name, UnclampedModelPredicateProvider getter, Supplier... items ) + private static void registerItemProperty( String name, ClampedItemPropertyFunction getter, Supplier... items ) { - Identifier id = new Identifier( ComputerCraft.MOD_ID, name ); + ResourceLocation id = new ResourceLocation( ComputerCraft.MOD_ID, name ); for( Supplier item : items ) { FabricModelPredicateProviderRegistry.register( item.get(), id, getter ); diff --git a/src/main/java/dan200/computercraft/client/render/CableHighlightRenderer.java b/src/main/java/dan200/computercraft/client/render/CableHighlightRenderer.java index ee0a1e93a..a1d2e03df 100644 --- a/src/main/java/dan200/computercraft/client/render/CableHighlightRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/CableHighlightRenderer.java @@ -6,21 +6,26 @@ package dan200.computercraft.client.render; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.peripheral.modem.wired.BlockCable; import dan200.computercraft.shared.peripheral.modem.wired.CableShapes; import dan200.computercraft.shared.util.WorldUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.util.hit.HitResult; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; import net.minecraft.util.math.*; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.VoxelShape; @Environment( EnvType.CLIENT ) public final class CableHighlightRenderer @@ -29,21 +34,21 @@ public final class CableHighlightRenderer { } - public static boolean drawHighlight( MatrixStack stack, VertexConsumer consumer, Entity entity, double d, double e, double f, BlockPos pos, + public static boolean drawHighlight( PoseStack stack, VertexConsumer consumer, Entity entity, double d, double e, double f, BlockPos pos, BlockState state ) { - Camera info = MinecraftClient.getInstance().gameRenderer.getCamera(); + Camera info = Minecraft.getInstance().gameRenderer.getMainCamera(); // We only care about instances with both cable and modem. - if( state.getBlock() != ComputerCraftRegistry.ModBlocks.CABLE || state.get( BlockCable.MODEM ) - .getFacing() == null || !state.get( BlockCable.CABLE ) ) + if( state.getBlock() != ComputerCraftRegistry.ModBlocks.CABLE || state.getValue( BlockCable.MODEM ) + .getFacing() == null || !state.getValue( BlockCable.CABLE ) ) { return false; } - HitResult hitResult = MinecraftClient.getInstance().crosshairTarget; + HitResult hitResult = Minecraft.getInstance().hitResult; - Vec3d hitPos = hitResult != null ? hitResult.getPos() : new Vec3d( d, e, f ); + Vec3 hitPos = hitResult != null ? hitResult.getLocation() : new Vec3( d, e, f ); VoxelShape shape = WorldUtil.isVecInside( CableShapes.getModemShape( state ), hitPos.subtract( pos.getX(), @@ -51,19 +56,19 @@ public final class CableHighlightRenderer pos.getZ() ) ) ? CableShapes.getModemShape( state ) : CableShapes.getCableShape( state ); - Vec3d cameraPos = info.getPos(); + Vec3 cameraPos = info.getPosition(); - double xOffset = pos.getX() - cameraPos.getX(); - double yOffset = pos.getY() - cameraPos.getY(); - double zOffset = pos.getZ() - cameraPos.getZ(); - Matrix4f matrix4f = stack.peek() - .getModel(); - Matrix3f normal = stack.peek().getNormal(); - shape.forEachEdge( ( x1, y1, z1, x2, y2, z2 ) -> { + double xOffset = pos.getX() - cameraPos.x(); + double yOffset = pos.getY() - cameraPos.y(); + double zOffset = pos.getZ() - cameraPos.z(); + Matrix4f matrix4f = stack.last() + .pose(); + Matrix3f normal = stack.last().normal(); + shape.forAllEdges( ( x1, y1, z1, x2, y2, z2 ) -> { float xDelta = (float) (x2 - x1); float yDelta = (float) (y2 - y1); float zDelta = (float) (z2 - z1); - float len = MathHelper.sqrt( xDelta * xDelta + yDelta * yDelta + zDelta * zDelta ); + float len = Mth.sqrt( xDelta * xDelta + yDelta * yDelta + zDelta * zDelta ); xDelta = xDelta / len; yDelta = yDelta / len; zDelta = zDelta / len; @@ -71,11 +76,11 @@ public final class CableHighlightRenderer consumer.vertex( matrix4f, (float) (x1 + xOffset), (float) (y1 + yOffset), (float) (z1 + zOffset) ) .color( 0, 0, 0, 0.4f ) .normal( normal, xDelta, yDelta, zDelta ) - .next(); + .endVertex(); consumer.vertex( matrix4f, (float) (x2 + xOffset), (float) (y2 + yOffset), (float) (z2 + zOffset) ) .color( 0, 0, 0, 0.4f ) .normal( normal, xDelta, yDelta, zDelta ) - .next(); + .endVertex(); } ); return true; diff --git a/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java b/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java index c36acd10e..f5d85c67c 100644 --- a/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/ComputerBorderRenderer.java @@ -5,23 +5,22 @@ */ package dan200.computercraft.client.render; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; import dan200.computercraft.ComputerCraft; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Matrix4f; - import javax.annotation.Nonnull; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; public class ComputerBorderRenderer { - public static final Identifier BACKGROUND_NORMAL = new Identifier( ComputerCraft.MOD_ID, "textures/gui/corners_normal.png" ); - public static final Identifier BACKGROUND_ADVANCED = new Identifier( ComputerCraft.MOD_ID, "textures/gui/corners_advanced.png" ); - public static final Identifier BACKGROUND_COMMAND = new Identifier( ComputerCraft.MOD_ID, "textures/gui/corners_command.png" ); - public static final Identifier BACKGROUND_COLOUR = new Identifier( ComputerCraft.MOD_ID, "textures/gui/corners_colour.png" ); + public static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_normal.png" ); + public static final ResourceLocation BACKGROUND_ADVANCED = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_advanced.png" ); + public static final ResourceLocation BACKGROUND_COMMAND = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_command.png" ); + public static final ResourceLocation BACKGROUND_COLOUR = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/corners_colour.png" ); /** * The margin between the terminal and its border. */ @@ -45,7 +44,7 @@ public class ComputerBorderRenderer static { - IDENTITY.loadIdentity(); + IDENTITY.setIdentity(); } private final Matrix4f transform; @@ -68,7 +67,7 @@ public class ComputerBorderRenderer @Nonnull - public static Identifier getTexture( @Nonnull ComputerFamily family ) + public static ResourceLocation getTexture( @Nonnull ComputerFamily family ) { switch( family ) { @@ -82,11 +81,11 @@ public class ComputerBorderRenderer } } - public static void render( Identifier location, int x, int y, int z, int light, int width, int height ) + public static void render( ResourceLocation location, int x, int y, int z, int light, int width, int height ) { - VertexConsumerProvider.Immediate source = VertexConsumerProvider.immediate( Tessellator.getInstance().getBuffer() ); - render( IDENTITY, source.getBuffer( RenderLayer.getText( location ) ), x, y, z, light, width, height, false, 1, 1, 1 ); - source.draw(); + MultiBufferSource.BufferSource source = MultiBufferSource.immediate( Tesselator.getInstance().getBuilder() ); + render( IDENTITY, source.getBuffer( RenderType.text( location ) ), x, y, z, light, width, height, false, 1, 1, 1 ); + source.endBatch(); } @@ -144,23 +143,23 @@ public class ComputerBorderRenderer { builder.vertex( transform, x, y + height, z ) .color( r, g, b, 1.0f ) - .texture( u * TEX_SCALE, (v + textureHeight) * TEX_SCALE ) - .light( light ) - .next(); + .uv( u * TEX_SCALE, (v + textureHeight) * TEX_SCALE ) + .uv2( light ) + .endVertex(); builder.vertex( transform, x + width, y + height, z ) .color( r, g, b, 1.0f ) - .texture( (u + textureWidth) * TEX_SCALE, (v + textureHeight) * TEX_SCALE ) - .light( light ) - .next(); + .uv( (u + textureWidth) * TEX_SCALE, (v + textureHeight) * TEX_SCALE ) + .uv2( light ) + .endVertex(); builder.vertex( transform, x + width, y, z ) .color( r, g, b, 1.0f ) - .texture( (u + textureWidth) * TEX_SCALE, v * TEX_SCALE ) - .light( light ) - .next(); + .uv( (u + textureWidth) * TEX_SCALE, v * TEX_SCALE ) + .uv2( light ) + .endVertex(); builder.vertex( transform, x, y, z ) .color( r, g, b, 1.0f ) - .texture( u * TEX_SCALE, v * TEX_SCALE ) - .light( light ) - .next(); + .uv( u * TEX_SCALE, v * TEX_SCALE ) + .uv2( light ) + .endVertex(); } } diff --git a/src/main/java/dan200/computercraft/client/render/ItemMapLikeRenderer.java b/src/main/java/dan200/computercraft/client/render/ItemMapLikeRenderer.java index f1ef584c5..2e07e7148 100644 --- a/src/main/java/dan200/computercraft/client/render/ItemMapLikeRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/ItemMapLikeRenderer.java @@ -6,32 +6,32 @@ package dan200.computercraft.client.render; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Vector3f; import dan200.computercraft.fabric.mixin.HeldItemRendererAccess; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.HeldItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Arm; -import net.minecraft.util.Hand; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; @Environment( EnvType.CLIENT ) public abstract class ItemMapLikeRenderer { public void renderItemFirstPerson( - MatrixStack transform, VertexConsumerProvider render, int lightTexture, Hand hand, float pitch, float equipProgress, + PoseStack transform, MultiBufferSource render, int lightTexture, InteractionHand hand, float pitch, float equipProgress, float swingProgress, ItemStack stack ) { - PlayerEntity player = MinecraftClient.getInstance().player; + Player player = Minecraft.getInstance().player; - transform.push(); - if( hand == Hand.MAIN_HAND && player.getOffHandStack().isEmpty() ) + transform.pushPose(); + if( hand == InteractionHand.MAIN_HAND && player.getOffhandItem().isEmpty() ) { renderItemFirstPersonCenter( transform, render, lightTexture, pitch, equipProgress, swingProgress, stack ); } @@ -40,12 +40,12 @@ public abstract class ItemMapLikeRenderer renderItemFirstPersonSide( transform, render, lightTexture, - hand == Hand.MAIN_HAND ? player.getMainArm() : player.getMainArm().getOpposite(), + hand == InteractionHand.MAIN_HAND ? player.getMainArm() : player.getMainArm().getOpposite(), equipProgress, swingProgress, stack ); } - transform.pop(); + transform.popPose(); } /** @@ -59,34 +59,34 @@ public abstract class ItemMapLikeRenderer * @param swingProgress The swing progress of this item * @param stack The stack to render */ - private void renderItemFirstPersonCenter( MatrixStack transform, VertexConsumerProvider render, int combinedLight, float pitch, float equipProgress, + private void renderItemFirstPersonCenter( PoseStack transform, MultiBufferSource render, int combinedLight, float pitch, float equipProgress, float swingProgress, ItemStack stack ) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - HeldItemRenderer renderer = minecraft.getHeldItemRenderer(); + Minecraft minecraft = Minecraft.getInstance(); + ItemInHandRenderer renderer = minecraft.getItemInHandRenderer(); // Setup the appropriate transformations. This is just copied from the // corresponding method in ItemRenderer. - float swingRt = MathHelper.sqrt( swingProgress ); - float tX = -0.2f * MathHelper.sin( swingProgress * (float) Math.PI ); - float tZ = -0.4f * MathHelper.sin( swingRt * (float) Math.PI ); + float swingRt = Mth.sqrt( swingProgress ); + float tX = -0.2f * Mth.sin( swingProgress * (float) Math.PI ); + float tZ = -0.4f * Mth.sin( swingRt * (float) Math.PI ); transform.translate( 0, -tX / 2, tZ ); HeldItemRendererAccess access = (HeldItemRendererAccess) renderer; float pitchAngle = access.callGetMapAngle( pitch ); transform.translate( 0, 0.04F + equipProgress * -1.2f + pitchAngle * -0.5f, -0.72f ); - transform.multiply( Vec3f.POSITIVE_X.getDegreesQuaternion( pitchAngle * -85.0f ) ); + transform.mulPose( Vector3f.XP.rotationDegrees( pitchAngle * -85.0f ) ); if( !minecraft.player.isInvisible() ) { - transform.push(); - transform.multiply( Vec3f.POSITIVE_Y.getDegreesQuaternion( 90.0F ) ); - access.callRenderArm( transform, render, combinedLight, Arm.RIGHT ); - access.callRenderArm( transform, render, combinedLight, Arm.LEFT ); - transform.pop(); + transform.pushPose(); + transform.mulPose( Vector3f.YP.rotationDegrees( 90.0F ) ); + access.callRenderArm( transform, render, combinedLight, HumanoidArm.RIGHT ); + access.callRenderArm( transform, render, combinedLight, HumanoidArm.LEFT ); + transform.popPose(); } - float rX = MathHelper.sin( swingRt * (float) Math.PI ); - transform.multiply( Vec3f.POSITIVE_X.getDegreesQuaternion( rX * 20.0F ) ); + float rX = Mth.sin( swingRt * (float) Math.PI ); + transform.mulPose( Vector3f.XP.rotationDegrees( rX * 20.0F ) ); transform.scale( 2.0F, 2.0F, 2.0F ); renderItem( transform, render, stack, combinedLight ); @@ -103,39 +103,39 @@ public abstract class ItemMapLikeRenderer * @param swingProgress The swing progress of this item * @param stack The stack to render */ - private void renderItemFirstPersonSide( MatrixStack transform, VertexConsumerProvider render, int combinedLight, Arm side, float equipProgress, + private void renderItemFirstPersonSide( PoseStack transform, MultiBufferSource render, int combinedLight, HumanoidArm side, float equipProgress, float swingProgress, ItemStack stack ) { - MinecraftClient minecraft = MinecraftClient.getInstance(); - float offset = side == Arm.RIGHT ? 1f : -1f; + Minecraft minecraft = Minecraft.getInstance(); + float offset = side == HumanoidArm.RIGHT ? 1f : -1f; transform.translate( offset * 0.125f, -0.125f, 0f ); // If the player is not invisible then render a single arm if( !minecraft.player.isInvisible() ) { - transform.push(); - transform.multiply( Vec3f.POSITIVE_Z.getDegreesQuaternion( offset * 10f ) ); - ((HeldItemRendererAccess) minecraft.getHeldItemRenderer()) + transform.pushPose(); + transform.mulPose( Vector3f.ZP.rotationDegrees( offset * 10f ) ); + ((HeldItemRendererAccess) minecraft.getItemInHandRenderer()) .callRenderArmHoldingItem( transform, render, combinedLight, equipProgress, swingProgress, side ); - transform.pop(); + transform.popPose(); } // Setup the appropriate transformations. This is just copied from the // corresponding method in ItemRenderer. - transform.push(); + transform.pushPose(); transform.translate( offset * 0.51f, -0.08f + equipProgress * -1.2f, -0.75f ); - float f1 = MathHelper.sqrt( swingProgress ); - float f2 = MathHelper.sin( f1 * (float) Math.PI ); + float f1 = Mth.sqrt( swingProgress ); + float f2 = Mth.sin( f1 * (float) Math.PI ); float f3 = -0.5f * f2; - float f4 = 0.4f * MathHelper.sin( f1 * ((float) Math.PI * 2f) ); - float f5 = -0.3f * MathHelper.sin( swingProgress * (float) Math.PI ); + float f4 = 0.4f * Mth.sin( f1 * ((float) Math.PI * 2f) ); + float f5 = -0.3f * Mth.sin( swingProgress * (float) Math.PI ); transform.translate( offset * f3, f4 - 0.3f * f2, f5 ); - transform.multiply( Vec3f.POSITIVE_X.getDegreesQuaternion( f2 * -45f ) ); - transform.multiply( Vec3f.POSITIVE_Y.getDegreesQuaternion( offset * f2 * -30f ) ); + transform.mulPose( Vector3f.XP.rotationDegrees( f2 * -45f ) ); + transform.mulPose( Vector3f.YP.rotationDegrees( offset * f2 * -30f ) ); renderItem( transform, render, stack, combinedLight ); - transform.pop(); + transform.popPose(); } /** @@ -146,5 +146,5 @@ public abstract class ItemMapLikeRenderer * @param stack The stack to render * @param light TODO rebase */ - protected abstract void renderItem( MatrixStack transform, VertexConsumerProvider render, ItemStack stack, int light ); + protected abstract void renderItem( PoseStack transform, MultiBufferSource render, ItemStack stack, int light ); } diff --git a/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java b/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java index 23982f3a9..e8057cb36 100644 --- a/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/ItemPocketRenderer.java @@ -7,6 +7,13 @@ package dan200.computercraft.client.render; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.core.terminal.Terminal; @@ -14,13 +21,12 @@ import dan200.computercraft.shared.computer.core.ClientComputer; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.util.Colour; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.render.*; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Vec3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_WIDTH; @@ -38,7 +44,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer } @Override - protected void renderItem( MatrixStack transform, VertexConsumerProvider render, ItemStack stack, int light ) + protected void renderItem( PoseStack transform, MultiBufferSource render, ItemStack stack, int light ) { ClientComputer computer = ItemPocketComputer.createClientComputer( stack ); Terminal terminal = computer == null ? null : computer.getTerminal(); @@ -60,9 +66,9 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer // Setup various transformations. Note that these are partially adapted from the corresponding method // in ItemRenderer - transform.push(); - transform.multiply( Vec3f.POSITIVE_Y.getDegreesQuaternion( 180f ) ); - transform.multiply( Vec3f.POSITIVE_Z.getDegreesQuaternion( 180f ) ); + transform.pushPose(); + transform.mulPose( Vector3f.YP.rotationDegrees( 180f ) ); + transform.mulPose( Vector3f.ZP.rotationDegrees( 180f ) ); transform.scale( 0.5f, 0.5f, 0.5f ); float scale = 0.75f / Math.max( width + BORDER * 2, height + BORDER * 2 + LIGHT_HEIGHT ); @@ -74,8 +80,8 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer ComputerFamily family = item.getFamily(); int frameColour = item.getColour( stack ); - Matrix4f matrix = transform.peek() - .getModel(); + Matrix4f matrix = transform.last() + .pose(); renderFrame( matrix, render, family, frameColour, light, width, height ); // Render the light @@ -92,7 +98,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer matrix, render.getBuffer( RenderTypes.TERMINAL_WITHOUT_DEPTH ), MARGIN, MARGIN, terminal, !computer.isColour(), MARGIN, MARGIN, MARGIN, MARGIN ); - FixedWidthFontRenderer.drawBlocker( transform.peek().getModel(), render, 0, 0, width, height ); + FixedWidthFontRenderer.drawBlocker( transform.last().pose(), render, 0, 0, width, height ); } else @@ -100,23 +106,23 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer FixedWidthFontRenderer.drawEmptyTerminal( matrix, 0, 0, width, height ); } - transform.pop(); + transform.popPose(); } - private static void renderFrame( Matrix4f transform, VertexConsumerProvider render, ComputerFamily family, int colour, int light, int width, int height ) + private static void renderFrame( Matrix4f transform, MultiBufferSource render, ComputerFamily family, int colour, int light, int width, int height ) { RenderSystem.enableBlend(); - MinecraftClient.getInstance() + Minecraft.getInstance() .getTextureManager() - .bindTexture( colour != -1 ? ComputerBorderRenderer.BACKGROUND_COLOUR : ComputerBorderRenderer.getTexture( family ) ); + .bindForSetup( colour != -1 ? ComputerBorderRenderer.BACKGROUND_COLOUR : ComputerBorderRenderer.getTexture( family ) ); - Identifier texture = colour != -1 ? ComputerBorderRenderer.BACKGROUND_COLOUR : ComputerBorderRenderer.getTexture( family ); + ResourceLocation texture = colour != -1 ? ComputerBorderRenderer.BACKGROUND_COLOUR : ComputerBorderRenderer.getTexture( family ); float r = ((colour >>> 16) & 0xFF) / 255.0f; float g = ((colour >>> 8) & 0xFF) / 255.0f; float b = (colour & 0xFF) / 255.0f; - ComputerBorderRenderer.render( transform, render.getBuffer( RenderLayer.getText( texture ) ), 0, 0, 0, light, width, height, true, r, g, b ); + ComputerBorderRenderer.render( transform, render.getBuffer( RenderType.text( texture ) ), 0, 0, 0, light, width, height, true, r, g, b ); } private static void renderLight( Matrix4f transform, int colour, int width, int height ) @@ -127,23 +133,23 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer float g = ((colour >>> 8) & 0xFF) / 255.0f; float b = (colour & 0xFF) / 255.0f; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin( VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR ); + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder buffer = tessellator.getBuilder(); + buffer.begin( VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR ); buffer.vertex( transform, width - LIGHT_HEIGHT * 2, height + LIGHT_HEIGHT + BORDER / 2.0f, 0 ) .color( r, g, b, 1.0f ) - .next(); + .endVertex(); buffer.vertex( transform, width, height + LIGHT_HEIGHT + BORDER / 2.0f, 0 ) .color( r, g, b, 1.0f ) - .next(); + .endVertex(); buffer.vertex( transform, width, height + BORDER / 2.0f, 0 ) .color( r, g, b, 1.0f ) - .next(); + .endVertex(); buffer.vertex( transform, width - LIGHT_HEIGHT * 2, height + BORDER / 2.0f, 0 ) .color( r, g, b, 1.0f ) - .next(); + .endVertex(); - tessellator.draw(); + tessellator.end(); RenderSystem.enableTexture(); } } diff --git a/src/main/java/dan200/computercraft/client/render/ItemPrintoutRenderer.java b/src/main/java/dan200/computercraft/client/render/ItemPrintoutRenderer.java index e432af8c3..466d043ea 100644 --- a/src/main/java/dan200/computercraft/client/render/ItemPrintoutRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/ItemPrintoutRenderer.java @@ -7,11 +7,8 @@ package dan200.computercraft.client.render; import dan200.computercraft.shared.media.items.ItemPrintout; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Vec3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.item.ItemStack; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_WIDTH; @@ -19,6 +16,10 @@ import static dan200.computercraft.client.render.PrintoutRenderer.*; import static dan200.computercraft.shared.media.items.ItemPrintout.LINES_PER_PAGE; import static dan200.computercraft.shared.media.items.ItemPrintout.LINE_MAX_LENGTH; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector3f; + /** * Emulates map and item-frame rendering for printouts. */ @@ -31,16 +32,16 @@ public final class ItemPrintoutRenderer extends ItemMapLikeRenderer } @Override - protected void renderItem( MatrixStack transform, VertexConsumerProvider render, ItemStack stack, int light ) + protected void renderItem( PoseStack transform, MultiBufferSource render, ItemStack stack, int light ) { - transform.multiply( Vec3f.POSITIVE_X.getDegreesQuaternion( 180f ) ); + transform.mulPose( Vector3f.XP.rotationDegrees( 180f ) ); transform.scale( 0.42f, 0.42f, -0.42f ); transform.translate( -0.5f, -0.48f, 0.0f ); drawPrintout( transform, render, stack, light ); } - private static void drawPrintout( MatrixStack transform, VertexConsumerProvider render, ItemStack stack, int light ) + private static void drawPrintout( PoseStack transform, MultiBufferSource render, ItemStack stack, int light ) { int pages = ItemPrintout.getPageCount( stack ); boolean book = ((ItemPrintout) stack.getItem()).getType() == ItemPrintout.Type.BOOK; @@ -70,13 +71,13 @@ public final class ItemPrintoutRenderer extends ItemMapLikeRenderer transform.scale( scale, scale, scale ); transform.translate( (max - width) / 2.0, (max - height) / 2.0, 0.0 ); - Matrix4f matrix = transform.peek() - .getModel(); + Matrix4f matrix = transform.last() + .pose(); drawBorder( matrix, render, 0, 0, -0.01f, 0, pages, book, light ); drawText( matrix, render, X_TEXT_MARGIN, Y_TEXT_MARGIN, 0, light, ItemPrintout.getText( stack ), ItemPrintout.getColours( stack ) ); } - public boolean renderInFrame( MatrixStack matrixStack, VertexConsumerProvider consumerProvider, ItemStack stack, int light ) + public boolean renderInFrame( PoseStack matrixStack, MultiBufferSource consumerProvider, ItemStack stack, int light ) { if( !(stack.getItem() instanceof ItemPrintout) ) { @@ -85,7 +86,7 @@ public final class ItemPrintoutRenderer extends ItemMapLikeRenderer // Move a little bit forward to ensure we're not clipping with the frame matrixStack.translate( 0.0f, 0.0f, -0.001f ); - matrixStack.multiply( Vec3f.POSITIVE_Z.getDegreesQuaternion( 180f ) ); + matrixStack.mulPose( Vector3f.ZP.rotationDegrees( 180f ) ); matrixStack.scale( 0.95f, 0.95f, -0.95f ); matrixStack.translate( -0.5f, -0.5f, 0.0f ); diff --git a/src/main/java/dan200/computercraft/client/render/ModelTransformer.java b/src/main/java/dan200/computercraft/client/render/ModelTransformer.java index a14ae9e07..71cb4f673 100644 --- a/src/main/java/dan200/computercraft/client/render/ModelTransformer.java +++ b/src/main/java/dan200/computercraft/client/render/ModelTransformer.java @@ -7,13 +7,12 @@ package dan200.computercraft.client.render; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormatElement; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Vector4f; - +import net.minecraft.client.renderer.block.model.BakedQuad; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; +import com.mojang.math.Matrix4f; +import com.mojang.math.Vector4f; import java.util.List; /** @@ -27,7 +26,7 @@ public final class ModelTransformer static { identity = new Matrix4f(); - identity.loadIdentity(); + identity.setIdentity(); } private ModelTransformer() @@ -36,7 +35,7 @@ public final class ModelTransformer public static void transformQuadsTo( List output, List input, Matrix4f transform ) { - transformQuadsTo( VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL, output, input, transform ); + transformQuadsTo( DefaultVertexFormat.BLOCK, output, input, transform ); } public static void transformQuadsTo( VertexFormat format, List output, List input, Matrix4f transform ) @@ -56,8 +55,8 @@ public final class ModelTransformer private static BakedQuad doTransformQuad( VertexFormat format, BakedQuad quad, Matrix4f transform ) { - int[] vertexData = quad.getVertexData().clone(); - BakedQuad copy = new BakedQuad( vertexData, -1, quad.getFace(), quad.getSprite(), true ); + int[] vertexData = quad.getVertices().clone(); + BakedQuad copy = new BakedQuad( vertexData, -1, quad.getDirection(), quad.getSprite(), true ); int offsetBytes = 0; for( int v = 0; v < 4; ++v ) @@ -65,7 +64,7 @@ public final class ModelTransformer for( VertexFormatElement element : format.getElements() ) // For each vertex element { int start = offsetBytes / Integer.BYTES; - if( element.getType() == VertexFormatElement.Type.POSITION && element.getDataType() == VertexFormatElement.DataType.FLOAT ) // When we find a position element + if( element.getUsage() == VertexFormatElement.Usage.POSITION && element.getType() == VertexFormatElement.Type.FLOAT ) // When we find a position element { Vector4f pos = new Vector4f( Float.intBitsToFloat( vertexData[start] ), Float.intBitsToFloat( vertexData[start + 1] ), @@ -76,11 +75,11 @@ public final class ModelTransformer pos.transform( transform ); // Insert the position - vertexData[start] = Float.floatToRawIntBits( pos.getX() ); - vertexData[start + 1] = Float.floatToRawIntBits( pos.getY() ); - vertexData[start + 2] = Float.floatToRawIntBits( pos.getZ() ); + vertexData[start] = Float.floatToRawIntBits( pos.x() ); + vertexData[start + 1] = Float.floatToRawIntBits( pos.y() ); + vertexData[start + 2] = Float.floatToRawIntBits( pos.z() ); } - offsetBytes += element.getByteLength(); + offsetBytes += element.getByteSize(); } } return copy; diff --git a/src/main/java/dan200/computercraft/client/render/MonitorHighlightRenderer.java b/src/main/java/dan200/computercraft/client/render/MonitorHighlightRenderer.java index d4083c67f..9b5b9fafc 100644 --- a/src/main/java/dan200/computercraft/client/render/MonitorHighlightRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/MonitorHighlightRenderer.java @@ -9,17 +9,22 @@ package dan200.computercraft.client.render; import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.*; -import net.minecraft.world.World; - +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import java.util.EnumSet; -import static net.minecraft.util.math.Direction.*; +import static net.minecraft.core.Direction.*; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix3f; +import com.mojang.math.Matrix4f; /** * Overrides monitor highlighting to only render the outline of the whole monitor, rather than the current block. This means you do not get an @@ -32,15 +37,15 @@ public final class MonitorHighlightRenderer { } - public static boolean drawHighlight( MatrixStack matrixStack, VertexConsumer vertexConsumer, Entity entity, double d, double e, double f, BlockPos pos, BlockState blockState ) + public static boolean drawHighlight( PoseStack matrixStack, VertexConsumer vertexConsumer, Entity entity, double d, double e, double f, BlockPos pos, BlockState blockState ) { // Preserve normal behaviour when crouching. - if( entity.isInSneakingPose() ) + if( entity.isCrouching() ) { return false; } - World world = entity.getEntityWorld(); + Level world = entity.getCommandSenderWorld(); BlockEntity tile = world.getBlockEntity( pos ); if( !(tile instanceof TileMonitor monitor) ) @@ -71,15 +76,15 @@ public final class MonitorHighlightRenderer faces.remove( monitor.getDown() ); } - Vec3d cameraPos = MinecraftClient.getInstance().gameRenderer.getCamera() - .getPos(); - matrixStack.push(); - matrixStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() ); + Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() + .getPosition(); + matrixStack.pushPose(); + matrixStack.translate( pos.getX() - cameraPos.x(), pos.getY() - cameraPos.y(), pos.getZ() - cameraPos.z() ); // I wish I could think of a better way to do this - Matrix4f transform = matrixStack.peek() - .getModel(); - Matrix3f normal = matrixStack.peek().getNormal(); + Matrix4f transform = matrixStack.last() + .pose(); + Matrix3f normal = matrixStack.last().normal(); if( faces.contains( NORTH ) || faces.contains( WEST ) ) { line( vertexConsumer, transform, normal, 0, 0, 0, UP ); @@ -129,7 +134,7 @@ public final class MonitorHighlightRenderer line( vertexConsumer, transform, normal, 1, 1, 0, SOUTH ); } - matrixStack.pop(); + matrixStack.popPose(); return true; } @@ -138,11 +143,11 @@ public final class MonitorHighlightRenderer { buffer.vertex( transform, x, y, z ) .color( 0, 0, 0, 0.4f ) - .normal( normal, direction.getOffsetX(), direction.getOffsetY(), direction.getOffsetZ() ) - .next(); - buffer.vertex( transform, x + direction.getOffsetX(), y + direction.getOffsetY(), z + direction.getOffsetZ() ) + .normal( normal, direction.getStepX(), direction.getStepY(), direction.getStepZ() ) + .endVertex(); + buffer.vertex( transform, x + direction.getStepX(), y + direction.getStepY(), z + direction.getStepZ() ) .color( 0, 0, 0, 0.4f ) - .normal( normal, direction.getOffsetX(), direction.getOffsetY(), direction.getOffsetZ() ) - .next(); + .normal( normal, direction.getStepX(), direction.getStepY(), direction.getStepZ() ) + .endVertex(); } } diff --git a/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java b/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java index bd14234a0..fe6746854 100644 --- a/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java +++ b/src/main/java/dan200/computercraft/client/render/MonitorTextureBufferShader.java @@ -5,40 +5,40 @@ */ package dan200.computercraft.client.render; +import com.mojang.blaze3d.shaders.Uniform; +import com.mojang.blaze3d.vertex.VertexFormat; import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.shared.util.Palette; -import net.minecraft.client.gl.GlUniform; -import net.minecraft.client.render.Shader; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.resource.ResourceFactory; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.GL13; import javax.annotation.Nullable; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.server.packs.resources.ResourceProvider; import java.io.IOException; import java.nio.FloatBuffer; -public class MonitorTextureBufferShader extends Shader +public class MonitorTextureBufferShader extends ShaderInstance { static final int TEXTURE_INDEX = GL13.GL_TEXTURE3; private static final Logger LOGGER = LogManager.getLogger(); - private final GlUniform palette; - private final GlUniform width; - private final GlUniform height; + private final Uniform palette; + private final Uniform width; + private final Uniform height; - public MonitorTextureBufferShader( ResourceFactory factory, String name, VertexFormat format ) throws IOException + public MonitorTextureBufferShader( ResourceProvider factory, String name, VertexFormat format ) throws IOException { super( factory, name, format ); width = getUniformChecked( "Width" ); height = getUniformChecked( "Height" ); - palette = new GlUniform( "Palette", GlUniform.field_32044 /* UT_FLOAT3 */, 16 * 3, this ); + palette = new Uniform( "Palette", Uniform.UT_FLOAT3 /* UT_FLOAT3 */, 16 * 3, this ); updateUniformLocation( palette ); - GlUniform tbo = getUniformChecked( "Tbo" ); + Uniform tbo = getUniformChecked( "Tbo" ); if( tbo != null ) tbo.set( TEXTURE_INDEX - GL13.GL_TEXTURE0 ); } @@ -53,7 +53,7 @@ public class MonitorTextureBufferShader extends Shader { if( this.palette == null ) return; - FloatBuffer paletteBuffer = this.palette.getFloatData(); + FloatBuffer paletteBuffer = this.palette.getFloatBuffer(); paletteBuffer.rewind(); for( int i = 0; i < 16; i++ ) { @@ -71,9 +71,9 @@ public class MonitorTextureBufferShader extends Shader } @Override - public void bind() + public void apply() { - super.bind(); + super.apply(); palette.upload(); } @@ -84,23 +84,23 @@ public class MonitorTextureBufferShader extends Shader super.close(); } - private void updateUniformLocation( GlUniform uniform ) + private void updateUniformLocation( Uniform uniform ) { - int id = GlUniform.getUniformLocation( getProgramRef(), uniform.getName() ); + int id = Uniform.glGetUniformLocation( getId(), uniform.getName() ); if( id == -1 ) { LOGGER.warn( "Shader {} could not find uniform named {} in the specified shader program.", getName(), uniform.getName() ); } else { - uniform.setLoc( id ); + uniform.setLocation( id ); } } @Nullable - private GlUniform getUniformChecked( String name ) + private Uniform getUniformChecked( String name ) { - GlUniform uniform = getUniform( name ); + Uniform uniform = getUniform( name ); if( uniform == null ) { LOGGER.warn( "Monitor shader {} should have uniform {}, but it was not present.", getName(), name ); diff --git a/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java b/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java index 7b8c809a5..405a9f4d2 100644 --- a/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/PrintoutRenderer.java @@ -9,13 +9,14 @@ package dan200.computercraft.client.render; import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.shared.util.Palette; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.util.math.Matrix4f; +import net.minecraft.client.renderer.MultiBufferSource; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; import static dan200.computercraft.shared.media.items.ItemPrintout.LINES_PER_PAGE; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; + public final class PrintoutRenderer { /** @@ -48,7 +49,7 @@ public final class PrintoutRenderer private PrintoutRenderer() {} - public static void drawText( Matrix4f transform, VertexConsumerProvider renderer, int x, int y, int start, int light, TextBuffer[] text, TextBuffer[] colours ) + public static void drawText( Matrix4f transform, MultiBufferSource renderer, int x, int y, int start, int light, TextBuffer[] text, TextBuffer[] colours ) { VertexConsumer buffer = renderer.getBuffer( RenderTypes.PRINTOUT_TEXT ); for( int line = 0; line < LINES_PER_PAGE && line < text.length; line++ ) @@ -68,7 +69,7 @@ public final class PrintoutRenderer } } - public static void drawText( Matrix4f transform, VertexConsumerProvider renderer, int x, int y, int start, int light, String[] text, String[] colours ) + public static void drawText( Matrix4f transform, MultiBufferSource renderer, int x, int y, int start, int light, String[] text, String[] colours ) { VertexConsumer buffer = renderer.getBuffer( RenderTypes.PRINTOUT_TEXT ); for( int line = 0; line < LINES_PER_PAGE && line < text.length; line++ ) @@ -88,7 +89,7 @@ public final class PrintoutRenderer } } - public static void drawBorder( Matrix4f transform, VertexConsumerProvider renderer, float x, float y, float z, int page, int pages, boolean isBook, int light ) + public static void drawBorder( Matrix4f transform, MultiBufferSource renderer, float x, float y, float z, int page, int pages, boolean isBook, int light ) { int leftPages = page; int rightPages = pages - page - 1; @@ -173,6 +174,6 @@ public final class PrintoutRenderer private static void vertex( VertexConsumer buffer, Matrix4f matrix, float x, float y, float z, float u, float v, int light ) { - buffer.vertex( matrix, x, y, z ).color( 255, 255, 255, 255 ).texture( u, v ).light( light ).next(); + buffer.vertex( matrix, x, y, z ).color( 255, 255, 255, 255 ).uv( u, v ).uv2( light ).endVertex(); } } diff --git a/src/main/java/dan200/computercraft/client/render/RenderTypes.java b/src/main/java/dan200/computercraft/client/render/RenderTypes.java index cabc1c870..6be3ae0d6 100644 --- a/src/main/java/dan200/computercraft/client/render/RenderTypes.java +++ b/src/main/java/dan200/computercraft/client/render/RenderTypes.java @@ -5,10 +5,14 @@ */ package dan200.computercraft.client.render; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import dan200.computercraft.client.gui.FixedWidthFontRenderer; import net.minecraft.client.render.*; -import net.minecraft.util.Identifier; - +import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.resources.ResourceLocation; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -21,17 +25,17 @@ public class RenderTypes public static MonitorTextureBufferShader monitorTboShader; @Nullable - public static Shader terminalShader; + public static ShaderInstance terminalShader; - public static final RenderLayer TERMINAL_WITHOUT_DEPTH = Types.TERMINAL_WITHOUT_DEPTH; - public static final RenderLayer MONITOR_TBO = Types.MONITOR_TBO; - public static final RenderLayer TERMINAL_BLOCKER = Types.BLOCKER; - public static final RenderLayer TERMINAL_WITH_DEPTH = Types.TERMINAL_WITH_DEPTH; - public static final RenderLayer PRINTOUT_TEXT = Types.PRINTOUT_TEXT; + public static final RenderType TERMINAL_WITHOUT_DEPTH = Types.TERMINAL_WITHOUT_DEPTH; + public static final RenderType MONITOR_TBO = Types.MONITOR_TBO; + public static final RenderType TERMINAL_BLOCKER = Types.BLOCKER; + public static final RenderType TERMINAL_WITH_DEPTH = Types.TERMINAL_WITH_DEPTH; + public static final RenderType PRINTOUT_TEXT = Types.PRINTOUT_TEXT; - public static final RenderLayer PRINTOUT_BACKGROUND = RenderLayer.getText( new Identifier( "computercraft", "textures/gui/printout.png" ) ); + public static final RenderType PRINTOUT_BACKGROUND = RenderType.text( new ResourceLocation( "computercraft", "textures/gui/printout.png" ) ); - public static final RenderLayer POSITION_COLOR = Types.POSITION_COLOR; + public static final RenderType POSITION_COLOR = Types.POSITION_COLOR; @Nonnull static MonitorTextureBufferShader getMonitorTextureBufferShader() @@ -41,72 +45,72 @@ public class RenderTypes } @Nonnull - static Shader getTerminalShader() + static ShaderInstance getTerminalShader() { if( terminalShader == null ) throw new NullPointerException( "MonitorTboShader has not been registered" ); return terminalShader; } - private static final class Types extends RenderPhase + private static final class Types extends RenderStateShard { - private static final VertexFormat.DrawMode GL_MODE = VertexFormat.DrawMode.TRIANGLES; - private static final VertexFormat FORMAT = VertexFormats.POSITION_COLOR_TEXTURE; - private static final Shader TERM_SHADER = new Shader( RenderTypes::getTerminalShader ); + private static final VertexFormat.Mode GL_MODE = VertexFormat.Mode.TRIANGLES; + private static final VertexFormat FORMAT = DefaultVertexFormat.POSITION_COLOR_TEX; + private static final ShaderStateShard TERM_SHADER = new ShaderStateShard( RenderTypes::getTerminalShader ); - private static final RenderPhase.Texture TERM_FONT_TEXTURE = new RenderPhase.Texture( + private static final RenderStateShard.TextureStateShard TERM_FONT_TEXTURE = new RenderStateShard.TextureStateShard( FixedWidthFontRenderer.FONT, false, false // blur, minimap ); - public static final RenderLayer MONITOR_TBO = RenderLayer.of( "monitor_tbo", VertexFormats.POSITION_TEXTURE, VertexFormat.DrawMode.TRIANGLE_STRIP, 128, false, false, // useDelegate, needsSorting - RenderLayer.MultiPhaseParameters.builder() - .texture( TERM_FONT_TEXTURE ) // blur, minimap - .shader( new RenderPhase.Shader( RenderTypes::getMonitorTextureBufferShader ) ) - .writeMaskState( RenderLayer.ALL_MASK ) - .build( false ) ); + public static final RenderType MONITOR_TBO = RenderType.create( "monitor_tbo", DefaultVertexFormat.POSITION_TEX, VertexFormat.Mode.TRIANGLE_STRIP, 128, false, false, // useDelegate, needsSorting + RenderType.CompositeState.builder() + .setTextureState( TERM_FONT_TEXTURE ) // blur, minimap + .setShaderState( new RenderStateShard.ShaderStateShard( RenderTypes::getMonitorTextureBufferShader ) ) + .setWriteMaskState( RenderType.COLOR_DEPTH_WRITE ) + .createCompositeState( false ) ); - static final RenderLayer TERMINAL_WITHOUT_DEPTH = RenderLayer.of( + static final RenderType TERMINAL_WITHOUT_DEPTH = RenderType.create( "terminal_without_depth", FORMAT, GL_MODE, 1024, false, false, // useDelegate, needsSorting - RenderLayer.MultiPhaseParameters.builder() - .texture( TERM_FONT_TEXTURE ) - .shader( TERM_SHADER ) - .writeMaskState( COLOR_MASK ) - .build( false ) + RenderType.CompositeState.builder() + .setTextureState( TERM_FONT_TEXTURE ) + .setShaderState( TERM_SHADER ) + .setWriteMaskState( COLOR_WRITE ) + .createCompositeState( false ) ); - static final RenderLayer BLOCKER = RenderLayer.of( "terminal_blocker", FORMAT, GL_MODE, 256, false, false, // useDelegate, needsSorting - RenderLayer.MultiPhaseParameters.builder() - .texture( TERM_FONT_TEXTURE ) - .shader( TERM_SHADER ) - .writeMaskState( DEPTH_MASK ) - .build( false ) ); + static final RenderType BLOCKER = RenderType.create( "terminal_blocker", FORMAT, GL_MODE, 256, false, false, // useDelegate, needsSorting + RenderType.CompositeState.builder() + .setTextureState( TERM_FONT_TEXTURE ) + .setShaderState( TERM_SHADER ) + .setWriteMaskState( DEPTH_WRITE ) + .createCompositeState( false ) ); - static final RenderLayer TERMINAL_WITH_DEPTH = RenderLayer.of( + static final RenderType TERMINAL_WITH_DEPTH = RenderType.create( "terminal_with_depth", FORMAT, GL_MODE, 1024, false, false, // useDelegate, needsSorting - RenderLayer.MultiPhaseParameters.builder() - .texture( TERM_FONT_TEXTURE ) - .shader( TERM_SHADER ) - .build( false ) + RenderType.CompositeState.builder() + .setTextureState( TERM_FONT_TEXTURE ) + .setShaderState( TERM_SHADER ) + .createCompositeState( false ) ); - static final RenderLayer PRINTOUT_TEXT = RenderLayer.of( - "printout_text", VertexFormats.POSITION_COLOR_TEXTURE_LIGHT, GL_MODE, 1024, + static final RenderType PRINTOUT_TEXT = RenderType.create( + "printout_text", DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP, GL_MODE, 1024, false, false, // useDelegate, needsSorting - RenderLayer.MultiPhaseParameters.builder() - .texture( TERM_FONT_TEXTURE ) - .shader( RenderPhase.TEXT_SHADER ) - .lightmap( RenderPhase.ENABLE_LIGHTMAP ) - .build( false ) + RenderType.CompositeState.builder() + .setTextureState( TERM_FONT_TEXTURE ) + .setShaderState( RenderStateShard.RENDERTYPE_TEXT_SHADER ) + .setLightmapState( RenderStateShard.LIGHTMAP ) + .createCompositeState( false ) ); - static final RenderLayer POSITION_COLOR = RenderLayer.of( - "position_color", VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.QUADS, 128, + static final RenderType POSITION_COLOR = RenderType.create( + "position_color", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 128, false, false, // useDelegate, needsSorting - RenderLayer.MultiPhaseParameters.builder() - .shader( COLOR_SHADER ) - .build( false ) + RenderType.CompositeState.builder() + .setShaderState( POSITION_COLOR_SHADER ) + .createCompositeState( false ) ); private Types( String name, Runnable setup, Runnable destroy ) diff --git a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java index 6c8c0ab74..b8324055a 100644 --- a/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TileEntityMonitorRenderer.java @@ -8,6 +8,14 @@ package dan200.computercraft.client.render; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexBuffer; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Matrix4f; +import com.mojang.math.Transformation; +import com.mojang.math.Vector3f; import dan200.computercraft.ComputerCraft; import dan200.computercraft.client.FrameInfo; import dan200.computercraft.client.gui.FixedWidthFontRenderer; @@ -18,11 +26,13 @@ import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer; import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.DirectionUtil; -import net.minecraft.client.gl.VertexBuffer; import net.minecraft.client.render.*; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.math.*; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; @@ -32,7 +42,7 @@ import javax.annotation.Nonnull; import java.nio.ByteBuffer; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.*; -import static net.minecraft.client.util.GlAllocationUtils.allocateByteBuffer; +import static com.mojang.blaze3d.platform.MemoryTracker.create; public class TileEntityMonitorRenderer implements BlockEntityRenderer { @@ -40,16 +50,16 @@ public class TileEntityMonitorRenderer implements BlockEntityRenderer { - private static final ModelIdentifier NORMAL_TURTLE_MODEL = new ModelIdentifier( "computercraft:turtle_normal", "inventory" ); - private static final ModelIdentifier ADVANCED_TURTLE_MODEL = new ModelIdentifier( "computercraft:turtle_advanced", "inventory" ); - private static final ModelIdentifier COLOUR_TURTLE_MODEL = new ModelIdentifier( "computercraft:turtle_colour", "inventory" ); - private static final ModelIdentifier ELF_OVERLAY_MODEL = new ModelIdentifier( "computercraft:turtle_elf_overlay", "inventory" ); + private static final ModelResourceLocation NORMAL_TURTLE_MODEL = new ModelResourceLocation( "computercraft:turtle_normal", "inventory" ); + private static final ModelResourceLocation ADVANCED_TURTLE_MODEL = new ModelResourceLocation( "computercraft:turtle_advanced", "inventory" ); + private static final ModelResourceLocation COLOUR_TURTLE_MODEL = new ModelResourceLocation( "computercraft:turtle_colour", "inventory" ); + private static final ModelResourceLocation ELF_OVERLAY_MODEL = new ModelResourceLocation( "computercraft:turtle_elf_overlay", "inventory" ); private final Random random = new Random( 0 ); BlockEntityRenderDispatcher renderer; - public TileEntityTurtleRenderer( BlockEntityRendererFactory.Context context ) + public TileEntityTurtleRenderer( BlockEntityRendererProvider.Context context ) { - renderer = context.getRenderDispatcher(); + renderer = context.getBlockEntityRenderDispatcher(); } - public static ModelIdentifier getTurtleModel( ComputerFamily family, boolean coloured ) + public static ModelResourceLocation getTurtleModel( ComputerFamily family, boolean coloured ) { switch( family ) { @@ -66,11 +65,11 @@ public class TileEntityTurtleRenderer implements BlockEntityRenderer } } - public static ModelIdentifier getTurtleOverlayModel( Identifier overlay, boolean christmas ) + public static ModelResourceLocation getTurtleOverlayModel( ResourceLocation overlay, boolean christmas ) { if( overlay != null ) { - return new ModelIdentifier( overlay, "inventory" ); + return new ModelResourceLocation( overlay, "inventory" ); } if( christmas ) { @@ -80,44 +79,44 @@ public class TileEntityTurtleRenderer implements BlockEntityRenderer } @Override - public void render( @Nonnull TileTurtle turtle, float partialTicks, @Nonnull MatrixStack transform, @Nonnull VertexConsumerProvider buffers, + public void render( @Nonnull TileTurtle turtle, float partialTicks, @Nonnull PoseStack transform, @Nonnull MultiBufferSource buffers, int lightmapCoord, int overlayLight ) { // Render the label String label = turtle.createProxy() .getLabel(); - HitResult hit = renderer.crosshairTarget; - if( label != null && hit.getType() == HitResult.Type.BLOCK && turtle.getPos() + HitResult hit = renderer.cameraHitResult; + if( label != null && hit.getType() == HitResult.Type.BLOCK && turtle.getBlockPos() .equals( ((BlockHitResult) hit).getBlockPos() ) ) { - MinecraftClient mc = MinecraftClient.getInstance(); - TextRenderer font = mc.textRenderer; + Minecraft mc = Minecraft.getInstance(); + Font font = mc.font; - transform.push(); + transform.pushPose(); transform.translate( 0.5, 1.2, 0.5 ); - transform.multiply( mc.getEntityRenderDispatcher() - .getRotation() ); + transform.mulPose( mc.getEntityRenderDispatcher() + .cameraOrientation() ); transform.scale( -0.025f, -0.025f, 0.025f ); - Matrix4f matrix = transform.peek() - .getModel(); - int opacity = (int) (mc.options.getTextBackgroundOpacity( 0.25f ) * 255) << 24; - float width = -font.getWidth( label ) / 2.0f; - font.draw( label, width, (float) 0, 0x20ffffff, false, matrix, buffers, true, opacity, lightmapCoord ); - font.draw( label, width, (float) 0, 0xffffffff, false, matrix, buffers, false, 0, lightmapCoord ); + Matrix4f matrix = transform.last() + .pose(); + int opacity = (int) (mc.options.getBackgroundOpacity( 0.25f ) * 255) << 24; + float width = -font.width( label ) / 2.0f; + font.drawInBatch( label, width, (float) 0, 0x20ffffff, false, matrix, buffers, true, opacity, lightmapCoord ); + font.drawInBatch( label, width, (float) 0, 0xffffffff, false, matrix, buffers, false, 0, lightmapCoord ); - transform.pop(); + transform.popPose(); } - transform.push(); + transform.pushPose(); // Setup the transform. - Vec3d offset = turtle.getRenderOffset( partialTicks ); + Vec3 offset = turtle.getRenderOffset( partialTicks ); float yaw = turtle.getRenderYaw( partialTicks ); transform.translate( offset.x, offset.y, offset.z ); transform.translate( 0.5f, 0.5f, 0.5f ); - transform.multiply( Vec3f.POSITIVE_Y.getDegreesQuaternion( 180.0f - yaw ) ); + transform.mulPose( Vector3f.YP.rotationDegrees( 180.0f - yaw ) ); if( label != null && (label.equals( "Dinnerbone" ) || label.equals( "Grumm" )) ) { // Flip the model @@ -128,13 +127,13 @@ public class TileEntityTurtleRenderer implements BlockEntityRenderer // Render the turtle int colour = turtle.getColour(); ComputerFamily family = turtle.getFamily(); - Identifier overlay = turtle.getOverlay(); + ResourceLocation overlay = turtle.getOverlay(); - VertexConsumer buffer = buffers.getBuffer( TexturedRenderLayers.getEntityTranslucentCull() ); + VertexConsumer buffer = buffers.getBuffer( Sheets.translucentCullBlockSheet() ); renderModel( transform, buffer, lightmapCoord, overlayLight, getTurtleModel( family, colour != -1 ), colour == -1 ? null : new int[] { colour } ); // Render the overlay - ModelIdentifier overlayModel = getTurtleOverlayModel( overlay, HolidayUtil.getCurrentHoliday() == Holiday.CHRISTMAS ); + ModelResourceLocation overlayModel = getTurtleOverlayModel( overlay, HolidayUtil.getCurrentHoliday() == Holiday.CHRISTMAS ); if( overlayModel != null ) { renderModel( transform, buffer, lightmapCoord, overlayLight, overlayModel, null ); @@ -144,10 +143,10 @@ public class TileEntityTurtleRenderer implements BlockEntityRenderer renderUpgrade( transform, buffer, lightmapCoord, overlayLight, turtle, TurtleSide.LEFT, partialTicks ); renderUpgrade( transform, buffer, lightmapCoord, overlayLight, turtle, TurtleSide.RIGHT, partialTicks ); - transform.pop(); + transform.popPose(); } - private void renderUpgrade( @Nonnull MatrixStack transform, @Nonnull VertexConsumer renderer, int lightmapCoord, int overlayLight, TileTurtle turtle, + private void renderUpgrade( @Nonnull PoseStack transform, @Nonnull VertexConsumer renderer, int lightmapCoord, int overlayLight, TileTurtle turtle, TurtleSide side, float f ) { ITurtleUpgrade upgrade = turtle.getUpgrade( side ); @@ -155,32 +154,32 @@ public class TileEntityTurtleRenderer implements BlockEntityRenderer { return; } - transform.push(); + transform.pushPose(); float toolAngle = turtle.getToolRenderAngle( side, f ); transform.translate( 0.0f, 0.5f, 0.5f ); - transform.multiply( Vec3f.NEGATIVE_X.getDegreesQuaternion( toolAngle ) ); + transform.mulPose( Vector3f.XN.rotationDegrees( toolAngle ) ); transform.translate( 0.0f, -0.5f, -0.5f ); TransformedModel model = upgrade.getModel( turtle.getAccess(), side ); model.push( transform ); renderModel( transform, renderer, lightmapCoord, overlayLight, model.getModel(), null ); - transform.pop(); + transform.popPose(); - transform.pop(); + transform.popPose(); } - private void renderModel( @Nonnull MatrixStack transform, @Nonnull VertexConsumer renderer, int lightmapCoord, int overlayLight, - ModelIdentifier modelLocation, int[] tints ) + private void renderModel( @Nonnull PoseStack transform, @Nonnull VertexConsumer renderer, int lightmapCoord, int overlayLight, + ModelResourceLocation modelLocation, int[] tints ) { - BakedModelManager modelManager = MinecraftClient.getInstance() + ModelManager modelManager = Minecraft.getInstance() .getItemRenderer() - .getModels() + .getItemModelShaper() .getModelManager(); renderModel( transform, renderer, lightmapCoord, overlayLight, modelManager.getModel( modelLocation ), tints ); } - private void renderModel( @Nonnull MatrixStack transform, @Nonnull VertexConsumer renderer, int lightmapCoord, int overlayLight, BakedModel model, + private void renderModel( @Nonnull PoseStack transform, @Nonnull VertexConsumer renderer, int lightmapCoord, int overlayLight, BakedModel model, int[] tints ) { random.setSeed( 0 ); @@ -191,27 +190,27 @@ public class TileEntityTurtleRenderer implements BlockEntityRenderer } } - private static void renderQuads( @Nonnull MatrixStack transform, @Nonnull VertexConsumer buffer, int lightmapCoord, int overlayLight, + private static void renderQuads( @Nonnull PoseStack transform, @Nonnull VertexConsumer buffer, int lightmapCoord, int overlayLight, List quads, int[] tints ) { - MatrixStack.Entry matrix = transform.peek(); + PoseStack.Pose matrix = transform.last(); for( BakedQuad bakedquad : quads ) { int tint = -1; - if( tints != null && bakedquad.hasColor() ) + if( tints != null && bakedquad.isTinted() ) { - int idx = bakedquad.getColorIndex(); + int idx = bakedquad.getTintIndex(); if( idx >= 0 && idx < tints.length ) { - tint = tints[bakedquad.getColorIndex()]; + tint = tints[bakedquad.getTintIndex()]; } } float f = (float) (tint >> 16 & 255) / 255.0F; float f1 = (float) (tint >> 8 & 255) / 255.0F; float f2 = (float) (tint & 255) / 255.0F; - buffer.quad( matrix, + buffer.putBulkData( matrix, bakedquad, new float[] { 1.0F, 1.0F, 1.0F, 1.0F }, f, diff --git a/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java b/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java index 1882ac2bd..194f43f66 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java +++ b/src/main/java/dan200/computercraft/client/render/TurtleModelLoader.java @@ -10,14 +10,13 @@ import com.mojang.datafixers.util.Pair; import dan200.computercraft.ComputerCraft; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.ModelBakeSettings; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.util.Identifier; - +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; import javax.annotation.Nonnull; import java.util.Arrays; import java.util.Collection; @@ -29,15 +28,15 @@ import java.util.stream.Collectors; public final class TurtleModelLoader { public static final TurtleModelLoader INSTANCE = new TurtleModelLoader(); - private static final Identifier NORMAL_TURTLE_MODEL = new Identifier( ComputerCraft.MOD_ID, "block/turtle_normal" ); - private static final Identifier ADVANCED_TURTLE_MODEL = new Identifier( ComputerCraft.MOD_ID, "block/turtle_advanced" ); - private static final Identifier COLOUR_TURTLE_MODEL = new Identifier( ComputerCraft.MOD_ID, "block/turtle_colour" ); + private static final ResourceLocation NORMAL_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle_normal" ); + private static final ResourceLocation ADVANCED_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle_advanced" ); + private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation( ComputerCraft.MOD_ID, "block/turtle_colour" ); private TurtleModelLoader() { } - public boolean accepts( @Nonnull Identifier name ) + public boolean accepts( @Nonnull ResourceLocation name ) { return name.getNamespace() .equals( ComputerCraft.MOD_ID ) && (name.getPath() @@ -46,7 +45,7 @@ public final class TurtleModelLoader } @Nonnull - public UnbakedModel loadModel( @Nonnull Identifier name ) + public UnbakedModel loadModel( @Nonnull ResourceLocation name ) { if( name.getNamespace() .equals( ComputerCraft.MOD_ID ) ) @@ -65,39 +64,39 @@ public final class TurtleModelLoader private static final class TurtleModel implements UnbakedModel { - private final Identifier family; + private final ResourceLocation family; - private TurtleModel( Identifier family ) + private TurtleModel( ResourceLocation family ) { this.family = family; } @Override - public Collection getTextureDependencies( Function modelGetter, + public Collection getMaterials( Function modelGetter, Set> missingTextureErrors ) { - return getModelDependencies() + return getDependencies() .stream() .flatMap( x -> modelGetter.apply( x ) - .getTextureDependencies( modelGetter, missingTextureErrors ) + .getMaterials( modelGetter, missingTextureErrors ) .stream() ) .collect( Collectors.toSet() ); } @Nonnull @Override - public Collection getModelDependencies() + public Collection getDependencies() { return Arrays.asList( family, COLOUR_TURTLE_MODEL ); } @Override - public BakedModel bake( @Nonnull ModelLoader loader, @Nonnull Function spriteGetter, @Nonnull ModelBakeSettings state, - Identifier modelId ) + public BakedModel bake( @Nonnull ModelBakery loader, @Nonnull Function spriteGetter, @Nonnull ModelState state, + ResourceLocation modelId ) { - return new TurtleSmartItemModel( loader.getOrLoadModel( family ) + return new TurtleSmartItemModel( loader.getModel( family ) .bake( loader, spriteGetter, state, modelId ), - loader.getOrLoadModel( COLOUR_TURTLE_MODEL ) + loader.getModel( COLOUR_TURTLE_MODEL ) .bake( loader, spriteGetter, state, modelId ) ); } } diff --git a/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java b/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java index bc7a6e46b..9db354a9b 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java +++ b/src/main/java/dan200/computercraft/client/render/TurtleMultiModel.java @@ -6,18 +6,17 @@ package dan200.computercraft.client.render; +import com.mojang.math.Transformation; import dan200.computercraft.api.client.TransformedModel; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.render.model.json.ModelOverrideList; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.texture.Sprite; -import net.minecraft.util.math.AffineTransformation; -import net.minecraft.util.math.Direction; - +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; import javax.annotation.Nonnull; import java.util.*; @@ -26,13 +25,13 @@ public class TurtleMultiModel implements BakedModel { private final BakedModel baseModel; private final BakedModel overlayModel; - private final AffineTransformation generalTransform; + private final Transformation generalTransform; private final TransformedModel leftUpgradeModel; private final TransformedModel rightUpgradeModel; private List generalQuads = null; private final Map> faceQuads = new EnumMap<>( Direction.class ); - public TurtleMultiModel( BakedModel baseModel, BakedModel overlayModel, AffineTransformation generalTransform, TransformedModel leftUpgradeModel, + public TurtleMultiModel( BakedModel baseModel, BakedModel overlayModel, Transformation generalTransform, TransformedModel leftUpgradeModel, TransformedModel rightUpgradeModel ) { // Get the models @@ -77,14 +76,14 @@ public class TurtleMultiModel implements BakedModel } if( leftUpgradeModel != null ) { - AffineTransformation upgradeTransform = generalTransform.multiply( leftUpgradeModel.getMatrix() ); + Transformation upgradeTransform = generalTransform.compose( leftUpgradeModel.getMatrix() ); ModelTransformer.transformQuadsTo( quads, leftUpgradeModel.getModel() .getQuads( state, side, rand ), upgradeTransform.getMatrix() ); } if( rightUpgradeModel != null ) { - AffineTransformation upgradeTransform = generalTransform.multiply( rightUpgradeModel.getMatrix() ); + Transformation upgradeTransform = generalTransform.compose( rightUpgradeModel.getMatrix() ); ModelTransformer.transformQuadsTo( quads, rightUpgradeModel.getModel() .getQuads( state, side, rand ), upgradeTransform.getMatrix() ); @@ -100,43 +99,43 @@ public class TurtleMultiModel implements BakedModel } @Override - public boolean hasDepth() + public boolean isGui3d() { - return baseModel.hasDepth(); + return baseModel.isGui3d(); } @Override - public boolean isSideLit() + public boolean usesBlockLight() { - return baseModel.isSideLit(); + return baseModel.usesBlockLight(); } @Override - public boolean isBuiltin() + public boolean isCustomRenderer() { - return baseModel.isBuiltin(); + return baseModel.isCustomRenderer(); } @Nonnull @Override @Deprecated - public Sprite getParticleSprite() + public TextureAtlasSprite getParticleIcon() { - return baseModel.getParticleSprite(); + return baseModel.getParticleIcon(); } @Nonnull @Override @Deprecated - public ModelTransformation getTransformation() + public ItemTransforms getTransforms() { - return baseModel.getTransformation(); + return baseModel.getTransforms(); } @Nonnull @Override - public ModelOverrideList getOverrides() + public ItemOverrides getOverrides() { - return ModelOverrideList.EMPTY; + return ItemOverrides.EMPTY; } } diff --git a/src/main/java/dan200/computercraft/client/render/TurtlePlayerRenderer.java b/src/main/java/dan200/computercraft/client/render/TurtlePlayerRenderer.java index 5b113f97a..914a5e752 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtlePlayerRenderer.java +++ b/src/main/java/dan200/computercraft/client/render/TurtlePlayerRenderer.java @@ -5,31 +5,30 @@ */ package dan200.computercraft.client.render; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; public class TurtlePlayerRenderer extends EntityRenderer { //FIXME Make sure this isn't an issue. Context was EntityRenderDispatcher. - public TurtlePlayerRenderer( EntityRendererFactory.Context context ) + public TurtlePlayerRenderer( EntityRendererProvider.Context context ) { super( context ); } @Override - public void render( @Nonnull TurtlePlayer entityIn, float entityYaw, float partialTicks, @Nonnull MatrixStack transform, - @Nonnull VertexConsumerProvider buffer, int packedLightIn ) + public void render( @Nonnull TurtlePlayer entityIn, float entityYaw, float partialTicks, @Nonnull PoseStack transform, + @Nonnull MultiBufferSource buffer, int packedLightIn ) { } @Nonnull @Override - public Identifier getTexture( @Nonnull TurtlePlayer entity ) + public ResourceLocation getTexture( @Nonnull TurtlePlayer entity ) { return ComputerBorderRenderer.BACKGROUND_NORMAL; } diff --git a/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java b/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java index 077e78ad7..706d46f2d 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java +++ b/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java @@ -6,6 +6,8 @@ package dan200.computercraft.client.render; import com.google.common.base.Objects; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Transformation; import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; @@ -14,23 +16,20 @@ import dan200.computercraft.shared.util.Holiday; import dan200.computercraft.shared.util.HolidayUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedModelManager; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.render.model.json.ModelOverrideList; -import net.minecraft.client.render.model.json.ModelTransformation; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.AffineTransformation; -import net.minecraft.util.math.Direction; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collections; @@ -41,17 +40,17 @@ import java.util.Random; @Environment( EnvType.CLIENT ) public class TurtleSmartItemModel implements BakedModel { - private static final AffineTransformation identity, flip; + private static final Transformation identity, flip; static { - MatrixStack stack = new MatrixStack(); + PoseStack stack = new PoseStack(); stack.scale( 0, -1, 0 ); stack.translate( 0, 0, 1 ); - identity = AffineTransformation.identity(); - flip = new AffineTransformation( stack.peek() - .getModel() ); + identity = Transformation.identity(); + flip = new Transformation( stack.last() + .pose() ); } private static class TurtleModelCombination @@ -59,11 +58,11 @@ public class TurtleSmartItemModel implements BakedModel final boolean colour; final ITurtleUpgrade leftUpgrade; final ITurtleUpgrade rightUpgrade; - final Identifier overlay; + final ResourceLocation overlay; final boolean christmas; final boolean flip; - TurtleModelCombination( boolean colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, Identifier overlay, boolean christmas, + TurtleModelCombination( boolean colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, ResourceLocation overlay, boolean christmas, boolean flip ) { this.colour = colour; @@ -109,7 +108,7 @@ public class TurtleSmartItemModel implements BakedModel private final BakedModel colourModel; private final HashMap cachedModels = new HashMap<>(); - private final ModelOverrideList overrides; + private final ItemOverrides overrides; public TurtleSmartItemModel( BakedModel familyModel, BakedModel colourModel ) { @@ -117,17 +116,17 @@ public class TurtleSmartItemModel implements BakedModel this.colourModel = colourModel; // this actually works I think, trust me - overrides = new ModelOverrideList( null, null, null, Collections.emptyList() ) + overrides = new ItemOverrides( null, null, null, Collections.emptyList() ) { @Nonnull @Override - public BakedModel apply( BakedModel originalModel, ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity entity, int seed ) + public BakedModel resolve( BakedModel originalModel, ItemStack stack, @Nullable ClientLevel world, @Nullable LivingEntity entity, int seed ) { ItemTurtle turtle = (ItemTurtle) stack.getItem(); int colour = turtle.getColour( stack ); ITurtleUpgrade leftUpgrade = turtle.getUpgrade( stack, TurtleSide.LEFT ); ITurtleUpgrade rightUpgrade = turtle.getUpgrade( stack, TurtleSide.RIGHT ); - Identifier overlay = turtle.getOverlay( stack ); + ResourceLocation overlay = turtle.getOverlay( stack ); boolean christmas = HolidayUtil.getCurrentHoliday() == Holiday.CHRISTMAS; String label = turtle.getLabel( stack ); boolean flip = label != null && (label.equals( "Dinnerbone" ) || label.equals( "Grumm" )); @@ -145,15 +144,15 @@ public class TurtleSmartItemModel implements BakedModel private BakedModel buildModel( TurtleModelCombination combo ) { - MinecraftClient mc = MinecraftClient.getInstance(); - BakedModelManager modelManager = mc.getItemRenderer() - .getModels() + Minecraft mc = Minecraft.getInstance(); + ModelManager modelManager = mc.getItemRenderer() + .getItemModelShaper() .getModelManager(); - ModelIdentifier overlayModelLocation = TileEntityTurtleRenderer.getTurtleOverlayModel( combo.overlay, combo.christmas ); + ModelResourceLocation overlayModelLocation = TileEntityTurtleRenderer.getTurtleOverlayModel( combo.overlay, combo.christmas ); BakedModel baseModel = combo.colour ? colourModel : familyModel; BakedModel overlayModel = overlayModelLocation != null ? modelManager.getModel( overlayModelLocation ) : null; - AffineTransformation transform = combo.flip ? flip : identity; + Transformation transform = combo.flip ? flip : identity; TransformedModel leftModel = combo.leftUpgrade != null ? combo.leftUpgrade.getModel( null, TurtleSide.LEFT ) : null; TransformedModel rightModel = combo.rightUpgrade != null ? combo.rightUpgrade.getModel( null, TurtleSide.RIGHT ) : null; return new TurtleMultiModel( baseModel, overlayModel, transform, leftModel, rightModel ); @@ -174,33 +173,33 @@ public class TurtleSmartItemModel implements BakedModel } @Override - public boolean hasDepth() + public boolean isGui3d() { - return familyModel.hasDepth(); + return familyModel.isGui3d(); } @Override - public boolean isSideLit() + public boolean usesBlockLight() { - return familyModel.isSideLit(); + return familyModel.usesBlockLight(); } @Override - public boolean isBuiltin() + public boolean isCustomRenderer() { - return familyModel.isBuiltin(); + return familyModel.isCustomRenderer(); } @Override @Deprecated - public Sprite getParticleSprite() + public TextureAtlasSprite getParticleIcon() { - return familyModel.getParticleSprite(); + return familyModel.getParticleIcon(); } @Nonnull @Override - public ModelOverrideList getOverrides() + public ItemOverrides getOverrides() { return overrides; } @@ -208,9 +207,9 @@ public class TurtleSmartItemModel implements BakedModel @Nonnull @Override @Deprecated - public ModelTransformation getTransformation() + public ItemTransforms getTransforms() { - return familyModel.getTransformation(); + return familyModel.getTransforms(); } } diff --git a/src/main/java/dan200/computercraft/core/computer/ComputerSide.java b/src/main/java/dan200/computercraft/core/computer/ComputerSide.java index dd925b324..8f8d495af 100644 --- a/src/main/java/dan200/computercraft/core/computer/ComputerSide.java +++ b/src/main/java/dan200/computercraft/core/computer/ComputerSide.java @@ -5,10 +5,9 @@ */ package dan200.computercraft.core.computer; -import net.minecraft.util.math.Direction; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.Direction; /** * A side on a computer. Unlike {@link Direction}, this is relative to the direction the computer is diff --git a/src/main/java/dan200/computercraft/core/computer/MainThreadExecutor.java b/src/main/java/dan200/computercraft/core/computer/MainThreadExecutor.java index 07737c4c2..b0267d5bd 100644 --- a/src/main/java/dan200/computercraft/core/computer/MainThreadExecutor.java +++ b/src/main/java/dan200/computercraft/core/computer/MainThreadExecutor.java @@ -9,9 +9,8 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.peripheral.IWorkMonitor; import dan200.computercraft.core.tracking.Tracking; import dan200.computercraft.shared.turtle.core.TurtleBrain; -import net.minecraft.block.entity.BlockEntity; - import javax.annotation.Nonnull; +import net.minecraft.world.level.block.entity.BlockEntity; import java.util.ArrayDeque; import java.util.Queue; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java b/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java index b46fc0dcd..31c81095e 100644 --- a/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java +++ b/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java @@ -13,15 +13,14 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.core.apis.handles.ArrayByteChannel; import dan200.computercraft.shared.util.IoUtil; -import net.minecraft.resource.ReloadableResourceManager; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resource.SynchronousResourceReloader; -import net.minecraft.util.Identifier; -import net.minecraft.util.InvalidIdentifierException; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.ResourceLocationException; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ReloadableResourceManager; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -61,7 +60,7 @@ public final class ResourceMount implements IMount /** * Maintain a cache of currently loaded resource mounts. This cache is invalidated when currentManager changes. */ - private static final Map> MOUNT_CACHE = new WeakHashMap<>( 2 ); + private static final Map> MOUNT_CACHE = new WeakHashMap<>( 2 ); private final String namespace; private final String subPath; @@ -72,7 +71,7 @@ public final class ResourceMount implements IMount public static ResourceMount get( String namespace, String subPath, ReloadableResourceManager manager ) { - Map cache; + Map cache; synchronized( MOUNT_CACHE ) { @@ -80,7 +79,7 @@ public final class ResourceMount implements IMount if( cache == null ) MOUNT_CACHE.put( manager, cache = CACHE_TEMPLATE.makeMap() ); } - Identifier path = new Identifier( namespace, subPath ); + ResourceLocation path = new ResourceLocation( namespace, subPath ); synchronized( cache ) { ResourceMount mount = cache.get( path ); @@ -104,8 +103,8 @@ public final class ResourceMount implements IMount boolean hasAny = false; String existingNamespace = null; - FileEntry newRoot = new FileEntry( new Identifier( namespace, subPath ) ); - for( Identifier file : manager.findResources( subPath, s -> true ) ) + FileEntry newRoot = new FileEntry( new ResourceLocation( namespace, subPath ) ); + for( ResourceLocation file : manager.listResources( subPath, s -> true ) ) { existingNamespace = file.getNamespace(); @@ -160,12 +159,12 @@ public final class ResourceMount implements IMount FileEntry nextEntry = lastEntry.children.get( part ); if( nextEntry == null ) { - Identifier childPath; + ResourceLocation childPath; try { - childPath = new Identifier( namespace, subPath + "/" + path ); + childPath = new ResourceLocation( namespace, subPath + "/" + path ); } - catch( InvalidIdentifierException e ) + catch( ResourceLocationException e ) { ComputerCraft.log.warn( "Cannot create resource location for {} ({})", part, e.getMessage() ); return; @@ -271,11 +270,11 @@ public final class ResourceMount implements IMount private static class FileEntry { - final Identifier identifier; + final ResourceLocation identifier; Map children; long size = -1; - FileEntry( Identifier identifier ) + FileEntry( ResourceLocation identifier ) { this.identifier = identifier; } @@ -297,7 +296,7 @@ public final class ResourceMount implements IMount * While people should really be keeping a permanent reference to this, some people construct it every * method call, so let's make this as small as possible. */ - static class Listener implements SynchronousResourceReloader + static class Listener implements ResourceManagerReloadListener { private static final Listener INSTANCE = new Listener(); @@ -305,14 +304,14 @@ public final class ResourceMount implements IMount private final Set managers = Collections.newSetFromMap( new WeakHashMap<>() ); @Override - public void reload( @Nonnull ResourceManager manager ) + public void onResourceManagerReload( @Nonnull ResourceManager manager ) { for( ResourceMount mount : mounts ) mount.load(); } synchronized void add( ReloadableResourceManager manager, ResourceMount mount ) { - if( managers.add( manager ) ) manager.registerReloader( this ); + if( managers.add( manager ) ) manager.registerReloadListener( this ); mounts.add( mount ); } } diff --git a/src/main/java/dan200/computercraft/core/terminal/Terminal.java b/src/main/java/dan200/computercraft/core/terminal/Terminal.java index 56a7dc3e2..dc0556235 100644 --- a/src/main/java/dan200/computercraft/core/terminal/Terminal.java +++ b/src/main/java/dan200/computercraft/core/terminal/Terminal.java @@ -7,10 +7,9 @@ package dan200.computercraft.core.terminal; import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Palette; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; - import javax.annotation.Nonnull; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; public class Terminal { @@ -310,7 +309,7 @@ public class Terminal if( onChanged != null ) onChanged.run(); } - public synchronized void write( PacketByteBuf buffer ) + public synchronized void write( FriendlyByteBuf buffer ) { buffer.writeInt( cursorX ); buffer.writeInt( cursorY ); @@ -336,7 +335,7 @@ public class Terminal palette.write( buffer ); } - public synchronized void read( PacketByteBuf buffer ) + public synchronized void read( FriendlyByteBuf buffer ) { cursorX = buffer.readInt(); cursorY = buffer.readInt(); @@ -366,7 +365,7 @@ public class Terminal setChanged(); } - public synchronized NbtCompound writeToNBT( NbtCompound nbt ) + public synchronized CompoundTag writeToNBT( CompoundTag nbt ) { nbt.putInt( "term_cursorX", cursorX ); nbt.putInt( "term_cursorY", cursorY ); @@ -384,7 +383,7 @@ public class Terminal return nbt; } - public synchronized void readFromNBT( NbtCompound nbt ) + public synchronized void readFromNBT( CompoundTag nbt ) { cursorX = nbt.getInt( "term_cursorX" ); cursorY = nbt.getInt( "term_cursorY" ); diff --git a/src/main/java/dan200/computercraft/fabric/mixin/ChatHudAccess.java b/src/main/java/dan200/computercraft/fabric/mixin/ChatHudAccess.java index 9d86ea657..9e5b48868 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/ChatHudAccess.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/ChatHudAccess.java @@ -5,16 +5,16 @@ */ package dan200.computercraft.fabric.mixin; -import net.minecraft.client.gui.hud.ChatHud; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.ChatComponent; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin( ChatHud.class ) +@Mixin( ChatComponent.class ) public interface ChatHudAccess { @Invoker - void callAddMessage( Text text, int messageId ); + void callAddMessage( Component text, int messageId ); @Invoker void callRemoveMessage( int messageId ); diff --git a/src/main/java/dan200/computercraft/fabric/mixin/HeldItemRendererAccess.java b/src/main/java/dan200/computercraft/fabric/mixin/HeldItemRendererAccess.java index a799fdf3a..056214624 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/HeldItemRendererAccess.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/HeldItemRendererAccess.java @@ -5,22 +5,22 @@ */ package dan200.computercraft.fabric.mixin; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.HeldItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Arm; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.entity.HumanoidArm; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin( HeldItemRenderer.class ) +@Mixin( ItemInHandRenderer.class ) public interface HeldItemRendererAccess { @Invoker float callGetMapAngle( float tickDelta ); @Invoker - void callRenderArm( MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, Arm arm ); + void callRenderArm( PoseStack matrices, MultiBufferSource vertexConsumers, int light, HumanoidArm arm ); @Invoker - void callRenderArmHoldingItem( MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, float equipProgress, float swingProgress, Arm arm ); + void callRenderArmHoldingItem( PoseStack matrices, MultiBufferSource vertexConsumers, int light, float equipProgress, float swingProgress, HumanoidArm arm ); } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MinecraftServerAccess.java b/src/main/java/dan200/computercraft/fabric/mixin/MinecraftServerAccess.java index 8ce40b911..ed063d9f3 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MinecraftServerAccess.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MinecraftServerAccess.java @@ -5,8 +5,8 @@ */ package dan200.computercraft.fabric.mixin; -import net.minecraft.resource.ServerResourceManager; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.ServerResources; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -14,5 +14,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; public interface MinecraftServerAccess { @Accessor - ServerResourceManager getServerResourceManager(); + ServerResources getServerResourceManager(); } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinBlock.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinBlock.java index 559c8faf7..3f5937fb2 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinBlock.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinBlock.java @@ -6,14 +6,12 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.shared.util.DropConsumer; -import net.minecraft.block.Block; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import java.util.function.Supplier; - +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -23,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; /** * Captures block drops. * - * @see Block#dropStack(World, BlockPos, ItemStack) + * @see Block#popResource(Level, BlockPos, ItemStack) */ @Mixin( Block.class ) public class MixinBlock @@ -35,9 +33,9 @@ public class MixinBlock ), locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true ) - private static void dropStack( World world, Supplier itemEntitySupplier, ItemStack stack, CallbackInfo callbackInfo, ItemEntity itemEntity ) + private static void dropStack( Level world, Supplier itemEntitySupplier, ItemStack stack, CallbackInfo callbackInfo, ItemEntity itemEntity ) { - if( DropConsumer.onHarvestDrops( world, itemEntity.getBlockPos(), stack ) ) + if( DropConsumer.onHarvestDrops( world, itemEntity.blockPosition(), stack ) ) { callbackInfo.cancel(); } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinEntity.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinEntity.java index 5bb1671b9..c6ea58992 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinEntity.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinEntity.java @@ -6,9 +6,9 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.shared.util.DropConsumer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; /** * Captures entities. * - * @see Entity#dropStack(ItemStack, float) + * @see Entity#spawnAtLocation(ItemStack, float) */ @Mixin( Entity.class ) public class MixinEntity diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinGameRenderer.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinGameRenderer.java index 7bb875fc3..85563c4ac 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinGameRenderer.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinGameRenderer.java @@ -6,13 +6,10 @@ package dan200.computercraft.fabric.mixin; +import com.mojang.blaze3d.shaders.Program; import com.mojang.datafixers.util.Pair; import dan200.computercraft.client.render.MonitorTextureBufferShader; import dan200.computercraft.client.render.RenderTypes; -import net.minecraft.client.gl.Program; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.Shader; -import net.minecraft.resource.ResourceManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -22,22 +19,25 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.io.IOException; import java.util.List; import java.util.function.Consumer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.server.packs.resources.ResourceManager; @Mixin( GameRenderer.class ) public class MixinGameRenderer { @Inject( method = "loadShaders", at = @At( value = "INVOKE_ASSIGN", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 53 ), locals = LocalCapture.CAPTURE_FAILSOFT ) - private void loadShaders( ResourceManager manager, CallbackInfo info, List list, List>> list2 ) throws IOException + private void loadShaders( ResourceManager manager, CallbackInfo info, List list, List>> list2 ) throws IOException { - list2.add( Pair.of( new Shader( + list2.add( Pair.of( new ShaderInstance( manager, "terminal", - RenderTypes.TERMINAL_WITHOUT_DEPTH.getVertexFormat() + RenderTypes.TERMINAL_WITHOUT_DEPTH.format() ), shader -> RenderTypes.terminalShader = shader ) ); list2.add( Pair.of( new MonitorTextureBufferShader( manager, "monitor_tbo", - RenderTypes.MONITOR_TBO.getVertexFormat() + RenderTypes.MONITOR_TBO.format() ), shader -> RenderTypes.monitorTboShader = (MonitorTextureBufferShader) shader ) ); } } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinHandledScreen.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinHandledScreen.java index 34eca48ca..f716eabd2 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinHandledScreen.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinHandledScreen.java @@ -6,20 +6,20 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.client.gui.widgets.WidgetTerminal; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin( HandledScreen.class ) -public class MixinHandledScreen extends Screen +@Mixin( AbstractContainerScreen.class ) +public class MixinHandledScreen extends Screen { - protected MixinHandledScreen( Text title ) + protected MixinHandledScreen( Component title ) { super( title ); } @@ -27,7 +27,7 @@ public class MixinHandledScreen extends Screen @Inject( method = "mouseReleased", at = @At ( "HEAD" ) ) public void mouseReleased( double mouseX, double mouseY, int button, CallbackInfoReturnable cir ) { - for ( Element child : this.children() ) + for ( GuiEventListener child : this.children() ) { if ( child instanceof WidgetTerminal ) { diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinHeldItemRenderer.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinHeldItemRenderer.java index 4573b1bd2..f521182c5 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinHeldItemRenderer.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinHeldItemRenderer.java @@ -5,32 +5,32 @@ */ package dan200.computercraft.fabric.mixin; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.client.render.ItemPocketRenderer; import dan200.computercraft.client.render.ItemPrintoutRenderer; import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.HeldItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Arm; -import net.minecraft.util.Hand; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin( HeldItemRenderer.class ) +@Mixin( ItemInHandRenderer.class ) @Environment( EnvType.CLIENT ) public class MixinHeldItemRenderer { @Shadow - private void renderArmHoldingItem( MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, float equipProgress, float swingProgress, - Arm arm ) + private void renderArmHoldingItem( PoseStack matrices, MultiBufferSource vertexConsumers, int light, float equipProgress, float swingProgress, + HumanoidArm arm ) { } @@ -46,8 +46,8 @@ public class MixinHeldItemRenderer at = @At( "HEAD" ), cancellable = true ) public void renderFirstPersonItem( - AbstractClientPlayerEntity player, float var2, float pitch, Hand hand, float swingProgress, - ItemStack stack, float equipProgress, MatrixStack matrixStack, VertexConsumerProvider provider, int light, + AbstractClientPlayer player, float var2, float pitch, InteractionHand hand, float swingProgress, + ItemStack stack, float equipProgress, PoseStack matrixStack, MultiBufferSource provider, int light, CallbackInfo callback ) { diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinItemFrameEntityRenderer.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinItemFrameEntityRenderer.java index 92ba04c51..5fe83f6a1 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinItemFrameEntityRenderer.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinItemFrameEntityRenderer.java @@ -5,22 +5,22 @@ */ package dan200.computercraft.fabric.mixin; +import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.client.render.ItemPrintoutRenderer; import dan200.computercraft.shared.media.items.ItemPrintout; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.ItemFrameEntityRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ItemFrameRenderer; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin( ItemFrameEntityRenderer.class ) +@Mixin( ItemFrameRenderer.class ) @Environment( EnvType.CLIENT ) public class MixinItemFrameEntityRenderer { @@ -34,17 +34,17 @@ public class MixinItemFrameEntityRenderer ), cancellable = true ) private void renderItem( - ItemFrameEntity itemFrameEntity, float f, float g, MatrixStack matrixStack, - VertexConsumerProvider vertexConsumerProvider, int itemFrameEntityLight, CallbackInfo info + ItemFrame itemFrameEntity, float f, float g, PoseStack matrixStack, + MultiBufferSource vertexConsumerProvider, int itemFrameEntityLight, CallbackInfo info ) { - ItemStack stack = itemFrameEntity.getHeldItemStack(); + ItemStack stack = itemFrameEntity.getItem(); if( stack.getItem() instanceof ItemPrintout ) { int light = itemFrameEntity.getType() == EntityType.GLOW_ITEM_FRAME ? 0xf000d2 : itemFrameEntityLight; // See getLightVal. ItemPrintoutRenderer.INSTANCE.renderInFrame( matrixStack, vertexConsumerProvider, stack, light ); // TODO: need to find how to make if statement instead return, like it doing Forge - matrixStack.pop(); + matrixStack.popPose(); info.cancel(); } } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinLanguage.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinLanguage.java index cd053439c..1e5723e6d 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinLanguage.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinLanguage.java @@ -10,7 +10,7 @@ import com.google.common.collect.ImmutableMap; import com.google.gson.JsonParseException; import dan200.computercraft.shared.peripheral.generic.data.ItemData; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.util.Language; +import net.minecraft.locale.Language; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinMatrix4f.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinMatrix4f.java index 247151863..38b36449c 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinMatrix4f.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinMatrix4f.java @@ -5,8 +5,8 @@ */ package dan200.computercraft.fabric.mixin; +import com.mojang.math.Matrix4f; import dan200.computercraft.fabric.mixininterface.IMatrix4f; -import net.minecraft.util.math.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinMinecraftClient.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinMinecraftClient.java index 8539fc6b9..30a5f2919 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinMinecraftClient.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinMinecraftClient.java @@ -7,15 +7,15 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.client.FrameInfo; import dan200.computercraft.fabric.events.ClientUnloadWorldEvent; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientLevel; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin( MinecraftClient.class ) +@Mixin( Minecraft.class ) public abstract class MixinMinecraftClient { @Inject( method = "render", at = @At( "HEAD" ) ) @@ -31,7 +31,7 @@ public abstract class MixinMinecraftClient } @Inject( method = "joinWorld", at = @At( "RETURN" ) ) - private void joinWorldAfter( ClientWorld world, CallbackInfo info ) + private void joinWorldAfter( ClientLevel world, CallbackInfo info ) { ClientUnloadWorldEvent.EVENT.invoker().onClientUnloadWorld(); } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinScreen.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinScreen.java index d53ba9939..d06ce67dd 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinScreen.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinScreen.java @@ -8,7 +8,7 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.shared.command.ClientCommands; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinServerPlayerInteractionManager.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinServerPlayerInteractionManager.java index c714c2346..227a62e57 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinServerPlayerInteractionManager.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinServerPlayerInteractionManager.java @@ -6,35 +6,35 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.shared.ComputerCraftRegistry; -import net.minecraft.advancement.criterion.Criteria; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.network.ServerPlayerInteractionManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin( ServerPlayerInteractionManager.class ) +@Mixin( ServerPlayerGameMode.class ) public class MixinServerPlayerInteractionManager { @Inject( at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;copy()Lnet/minecraft/item/ItemStack;", ordinal = 0 ), method = "interactBlock(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;Lnet/minecraft/util/Hand;Lnet/minecraft/util/hit/BlockHitResult;)Lnet/minecraft/util/ActionResult;", cancellable = true ) - private void interact( ServerPlayerEntity player, World world, ItemStack stack, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir ) + private void interact( ServerPlayer player, Level world, ItemStack stack, InteractionHand hand, BlockHitResult hitResult, CallbackInfoReturnable cir ) { BlockPos pos = hitResult.getBlockPos(); BlockState state = world.getBlockState( pos ); - if( player.getMainHandStack().getItem() == ComputerCraftRegistry.ModItems.DISK && state.getBlock() == ComputerCraftRegistry.ModBlocks.DISK_DRIVE ) + if( player.getMainHandItem().getItem() == ComputerCraftRegistry.ModItems.DISK && state.getBlock() == ComputerCraftRegistry.ModBlocks.DISK_DRIVE ) { - ActionResult actionResult = state.onUse( world, player, hand, hitResult ); - if( actionResult.isAccepted() ) + InteractionResult actionResult = state.use( world, player, hand, hitResult ); + if( actionResult.consumesAction() ) { - Criteria.ITEM_USED_ON_BLOCK.trigger( player, pos, stack ); + CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger( player, pos, stack ); cir.setReturnValue( actionResult ); } } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinServerWorld.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinServerWorld.java index 8d1d79e37..7a0255f5f 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinServerWorld.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinServerWorld.java @@ -6,8 +6,8 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.shared.util.DropConsumer; -import net.minecraft.entity.Entity; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,9 +16,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; /** * Captures item stacks spawned into the world. * - * @see ServerWorld#spawnEntity(Entity) + * @see ServerLevel#addFreshEntity(Entity) */ -@Mixin( ServerWorld.class ) +@Mixin( ServerLevel.class ) public class MixinServerWorld { @Inject( method = "spawnEntity", at = @At( "HEAD" ), cancellable = true ) diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinWorld.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinWorld.java index be1e1a8ba..b2e72057f 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinWorld.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinWorld.java @@ -6,9 +6,6 @@ package dan200.computercraft.fabric.mixin; import dan200.computercraft.shared.common.TileGeneric; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -16,6 +13,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import java.util.Collection; /** @@ -23,7 +23,7 @@ import java.util.Collection; * * Forge does this, this is just a bodge to get Fabric in line with that behaviour. */ -@Mixin( World.class ) +@Mixin( Level.class ) public class MixinWorld { @Shadow @@ -38,7 +38,7 @@ public class MixinWorld @Inject( method = "addBlockEntity", at = @At( "HEAD" ) ) public void addBlockEntity( @Nullable BlockEntity entity, CallbackInfo info ) { - if( entity != null && !entity.isRemoved() && this.isInBuildLimit( entity.getPos() ) && iteratingTickingBlockEntities ) + if( entity != null && !entity.isRemoved() && this.isInBuildLimit( entity.getBlockPos() ) && iteratingTickingBlockEntities ) { setWorld( entity, this ); } @@ -46,9 +46,9 @@ public class MixinWorld private static void setWorld( BlockEntity entity, Object world ) { - if( entity.getWorld() != world && entity instanceof TileGeneric ) + if( entity.getLevel() != world && entity instanceof TileGeneric ) { - entity.setWorld( (World) world ); + entity.setLevel( (Level) world ); } } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/MixinWorldRenderer.java b/src/main/java/dan200/computercraft/fabric/mixin/MixinWorldRenderer.java index fc16eb218..d88bab4eb 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/MixinWorldRenderer.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/MixinWorldRenderer.java @@ -5,27 +5,27 @@ */ package dan200.computercraft.fabric.mixin; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import dan200.computercraft.client.render.CableHighlightRenderer; import dan200.computercraft.client.render.MonitorHighlightRenderer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin( WorldRenderer.class ) +@Mixin( LevelRenderer.class ) @Environment( EnvType.CLIENT ) public class MixinWorldRenderer { @Inject( method = "drawBlockOutline", cancellable = true, at = @At( "HEAD" ) ) - public void drawBlockOutline( MatrixStack matrixStack, VertexConsumer vertexConsumer, Entity entity, double d, double e, double f, BlockPos blockPos, + public void drawBlockOutline( PoseStack matrixStack, VertexConsumer vertexConsumer, Entity entity, double d, double e, double f, BlockPos blockPos, BlockState blockState, CallbackInfo info ) { if( CableHighlightRenderer.drawHighlight( matrixStack, diff --git a/src/main/java/dan200/computercraft/fabric/mixin/SignBlockEntityAccess.java b/src/main/java/dan200/computercraft/fabric/mixin/SignBlockEntityAccess.java index 10e381803..979211e8b 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/SignBlockEntityAccess.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/SignBlockEntityAccess.java @@ -5,8 +5,8 @@ */ package dan200.computercraft.fabric.mixin; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.entity.SignBlockEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -14,5 +14,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; public interface SignBlockEntityAccess { @Accessor - Text[] getTexts(); + Component[] getTexts(); } diff --git a/src/main/java/dan200/computercraft/fabric/mixin/WorldSavePathAccess.java b/src/main/java/dan200/computercraft/fabric/mixin/WorldSavePathAccess.java index fcaff65cf..d706e3545 100644 --- a/src/main/java/dan200/computercraft/fabric/mixin/WorldSavePathAccess.java +++ b/src/main/java/dan200/computercraft/fabric/mixin/WorldSavePathAccess.java @@ -5,15 +5,15 @@ */ package dan200.computercraft.fabric.mixin; -import net.minecraft.util.WorldSavePath; +import net.minecraft.world.level.storage.LevelResource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin( WorldSavePath.class ) +@Mixin( LevelResource.class ) public interface WorldSavePathAccess { @Invoker( "" ) - static WorldSavePath createWorldSavePath( String relativePath ) + static LevelResource createWorldSavePath( String relativePath ) { throw new UnsupportedOperationException(); } diff --git a/src/main/java/dan200/computercraft/shared/BundledRedstone.java b/src/main/java/dan200/computercraft/shared/BundledRedstone.java index 656ffafab..9e9eebf64 100644 --- a/src/main/java/dan200/computercraft/shared/BundledRedstone.java +++ b/src/main/java/dan200/computercraft/shared/BundledRedstone.java @@ -9,11 +9,10 @@ package dan200.computercraft.shared; import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.redstone.IBundledRedstoneProvider; import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; import java.util.ArrayList; import java.util.Objects; @@ -29,20 +28,20 @@ public final class BundledRedstone if( !providers.contains( provider ) ) providers.add( provider ); } - public static int getDefaultOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public static int getDefaultOutput( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ) { - return world.isInBuildLimit( pos ) ? DefaultBundledRedstoneProvider.getDefaultBundledRedstoneOutput( world, pos, side ) : -1; + return world.isInWorldBounds( pos ) ? DefaultBundledRedstoneProvider.getDefaultBundledRedstoneOutput( world, pos, side ) : -1; } - public static int getOutput( World world, BlockPos pos, Direction side ) + public static int getOutput( Level world, BlockPos pos, Direction side ) { int signal = getUnmaskedOutput( world, pos, side ); return signal >= 0 ? signal : 0; } - private static int getUnmaskedOutput( World world, BlockPos pos, Direction side ) + private static int getUnmaskedOutput( Level world, BlockPos pos, Direction side ) { - if( !world.isInBuildLimit( pos ) ) + if( !world.isInWorldBounds( pos ) ) { return -1; } diff --git a/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java b/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java index f1cda3e78..9aaef9b57 100644 --- a/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java +++ b/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java @@ -51,24 +51,28 @@ import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityT import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.block.*; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Items; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; import java.util.function.BiFunction; -import static net.minecraft.util.registry.Registry.BLOCK_ENTITY_TYPE; +import static net.minecraft.core.Registry.BLOCK_ENTITY_TYPE; public final class ComputerCraftRegistry { @@ -122,10 +126,10 @@ public final class ComputerCraftRegistry { //return FabricBlockSettings.copyOf(Blocks.GLASS) // .strength(2); - return AbstractBlock.Settings.of( Material.GLASS ) + return BlockBehaviour.Properties.of( Material.GLASS ) .strength( 2F ) - .sounds( BlockSoundGroup.STONE ) - .nonOpaque(); + .sound( SoundType.STONE ) + .noOcclusion(); } private static Block.Settings turtleProperties() @@ -144,7 +148,7 @@ public final class ComputerCraftRegistry public static T register( String id, T value ) { - return Registry.register( Registry.BLOCK, new Identifier( MOD_ID, id ), value ); + return Registry.register( Registry.BLOCK, new ResourceLocation( MOD_ID, id ), value ); } } @@ -194,7 +198,7 @@ public final class ComputerCraftRegistry { BlockEntityType blockEntityType = FabricBlockEntityTypeBuilder.create( factory::apply, block ).build(); return Registry.register( BLOCK_ENTITY_TYPE, - new Identifier( MOD_ID, id ), + new ResourceLocation( MOD_ID, id ), blockEntityType ); } @@ -202,22 +206,22 @@ public final class ComputerCraftRegistry public static final class ModItems { - private static final ItemGroup mainItemGroup = ComputerCraft.MAIN_GROUP; + private static final CreativeModeTab mainItemGroup = ComputerCraft.MAIN_GROUP; public static final ItemComputer COMPUTER_NORMAL = ofBlock( ModBlocks.COMPUTER_NORMAL, ItemComputer::new ); public static final ItemComputer COMPUTER_ADVANCED = ofBlock( ModBlocks.COMPUTER_ADVANCED, ItemComputer::new ); public static final ItemComputer COMPUTER_COMMAND = ofBlock( ModBlocks.COMPUTER_COMMAND, ItemComputer::new ); public static final ItemPocketComputer POCKET_COMPUTER_NORMAL = register( "pocket_computer_normal", - new ItemPocketComputer( properties().maxCount( 1 ), ComputerFamily.NORMAL ) ); + new ItemPocketComputer( properties().stacksTo( 1 ), ComputerFamily.NORMAL ) ); public static final ItemPocketComputer POCKET_COMPUTER_ADVANCED = register( "pocket_computer_advanced", - new ItemPocketComputer( properties().maxCount( 1 ), + new ItemPocketComputer( properties().stacksTo( 1 ), ComputerFamily.ADVANCED ) ); public static final ItemTurtle TURTLE_NORMAL = ofBlock( ModBlocks.TURTLE_NORMAL, ItemTurtle::new ); public static final ItemTurtle TURTLE_ADVANCED = ofBlock( ModBlocks.TURTLE_ADVANCED, ItemTurtle::new ); - public static final ItemDisk DISK = register( "disk", new ItemDisk( properties().maxCount( 1 ) ) ); - public static final ItemTreasureDisk TREASURE_DISK = register( "treasure_disk", new ItemTreasureDisk( properties().maxCount( 1 ) ) ); - public static final ItemPrintout PRINTED_PAGE = register( "printed_page", new ItemPrintout( properties().maxCount( 1 ), ItemPrintout.Type.PAGE ) ); - public static final ItemPrintout PRINTED_PAGES = register( "printed_pages", new ItemPrintout( properties().maxCount( 1 ), ItemPrintout.Type.PAGES ) ); - public static final ItemPrintout PRINTED_BOOK = register( "printed_book", new ItemPrintout( properties().maxCount( 1 ), ItemPrintout.Type.BOOK ) ); + public static final ItemDisk DISK = register( "disk", new ItemDisk( properties().stacksTo( 1 ) ) ); + public static final ItemTreasureDisk TREASURE_DISK = register( "treasure_disk", new ItemTreasureDisk( properties().stacksTo( 1 ) ) ); + public static final ItemPrintout PRINTED_PAGE = register( "printed_page", new ItemPrintout( properties().stacksTo( 1 ), ItemPrintout.Type.PAGE ) ); + public static final ItemPrintout PRINTED_PAGES = register( "printed_pages", new ItemPrintout( properties().stacksTo( 1 ), ItemPrintout.Type.PAGES ) ); + public static final ItemPrintout PRINTED_BOOK = register( "printed_book", new ItemPrintout( properties().stacksTo( 1 ), ItemPrintout.Type.BOOK ) ); public static final BlockItem SPEAKER = ofBlock( ModBlocks.SPEAKER, BlockItem::new ); public static final BlockItem DISK_DRIVE = ofBlock( ModBlocks.DISK_DRIVE, BlockItem::new ); public static final BlockItem PRINTER = ofBlock( ModBlocks.PRINTER, BlockItem::new ); @@ -229,29 +233,29 @@ public final class ComputerCraftRegistry public static final ItemBlockCable.Cable CABLE = register( "cable", new ItemBlockCable.Cable( ModBlocks.CABLE, properties() ) ); public static final ItemBlockCable.WiredModem WIRED_MODEM = register( "wired_modem", new ItemBlockCable.WiredModem( ModBlocks.CABLE, properties() ) ); - private static I ofBlock( B parent, BiFunction supplier ) + private static I ofBlock( B parent, BiFunction supplier ) { - return Registry.register( Registry.ITEM, Registry.BLOCK.getId( parent ), supplier.apply( parent, properties() ) ); + return Registry.register( Registry.ITEM, Registry.BLOCK.getKey( parent ), supplier.apply( parent, properties() ) ); } - private static Item.Settings properties() + private static Item.Properties properties() { - return new Item.Settings().group( mainItemGroup ); + return new Item.Properties().tab( mainItemGroup ); } private static T register( String id, T item ) { - return Registry.register( Registry.ITEM, new Identifier( MOD_ID, id ), item ); + return Registry.register( Registry.ITEM, new ResourceLocation( MOD_ID, id ), item ); } } public static class ModEntities { public static final EntityType TURTLE_PLAYER = Registry.register( Registry.ENTITY_TYPE, - new Identifier( MOD_ID, "turtle_player" ), - EntityType.Builder.create( SpawnGroup.MISC ).disableSaving() - .disableSummon() - .setDimensions( + new ResourceLocation( MOD_ID, "turtle_player" ), + EntityType.Builder.createNothing( MobCategory.MISC ).noSave() + .noSummon() + .sized( 0, 0 ) .build( @@ -260,36 +264,36 @@ public final class ComputerCraftRegistry public static class ModContainers { - public static final ScreenHandlerType COMPUTER = ContainerData.toType( new Identifier( MOD_ID, "computer" ), ModContainers.COMPUTER, ComputerContainerData::new, ComputerMenuWithoutInventory::new ); - public static final ScreenHandlerType POCKET_COMPUTER = ContainerData.toType( new Identifier( MOD_ID, "pocket_computer" ), ModContainers.POCKET_COMPUTER, ComputerContainerData::new, ComputerMenuWithoutInventory::new ); - public static final ScreenHandlerType POCKET_COMPUTER_NO_TERM = ContainerData.toType( new Identifier( MOD_ID, "pocket_computer_no_term" ), ModContainers.POCKET_COMPUTER_NO_TERM, ComputerContainerData::new, ComputerMenuWithoutInventory::new ); - public static final ScreenHandlerType TURTLE = ContainerData.toType( new Identifier( MOD_ID, "turtle" ), ComputerContainerData::new, ContainerTurtle::new ); - public static final ScreenHandlerType DISK_DRIVE = registerSimple( "disk_drive", ContainerDiskDrive::new ); - public static final ScreenHandlerType PRINTER = registerSimple( "printer", ContainerPrinter::new ); - public static final ScreenHandlerType PRINTOUT = ContainerData.toType( new Identifier( MOD_ID, "printout" ), HeldItemContainerData::new, ContainerHeldItem::createPrintout ); - public static final ScreenHandlerType VIEW_COMPUTER = ContainerData.toType( new Identifier( MOD_ID, "view_computer" ), ViewComputerContainerData::new, ContainerViewComputer::new ); + public static final MenuType COMPUTER = ContainerData.toType( new ResourceLocation( MOD_ID, "computer" ), ModContainers.COMPUTER, ComputerContainerData::new, ComputerMenuWithoutInventory::new ); + public static final MenuType POCKET_COMPUTER = ContainerData.toType( new ResourceLocation( MOD_ID, "pocket_computer" ), ModContainers.POCKET_COMPUTER, ComputerContainerData::new, ComputerMenuWithoutInventory::new ); + public static final MenuType POCKET_COMPUTER_NO_TERM = ContainerData.toType( new ResourceLocation( MOD_ID, "pocket_computer_no_term" ), ModContainers.POCKET_COMPUTER_NO_TERM, ComputerContainerData::new, ComputerMenuWithoutInventory::new ); + public static final MenuType TURTLE = ContainerData.toType( new ResourceLocation( MOD_ID, "turtle" ), ComputerContainerData::new, ContainerTurtle::new ); + public static final MenuType DISK_DRIVE = registerSimple( "disk_drive", ContainerDiskDrive::new ); + public static final MenuType PRINTER = registerSimple( "printer", ContainerPrinter::new ); + public static final MenuType PRINTOUT = ContainerData.toType( new ResourceLocation( MOD_ID, "printout" ), HeldItemContainerData::new, ContainerHeldItem::createPrintout ); + public static final MenuType VIEW_COMPUTER = ContainerData.toType( new ResourceLocation( MOD_ID, "view_computer" ), ViewComputerContainerData::new, ContainerViewComputer::new ); - private static ScreenHandlerType registerSimple( String id, + private static MenuType registerSimple( String id, ScreenHandlerRegistry.SimpleClientHandlerFactory function ) { - return ScreenHandlerRegistry.registerSimple( new Identifier( MOD_ID, id ), function ); + return ScreenHandlerRegistry.registerSimple( new ResourceLocation( MOD_ID, id ), function ); } } public static final class TurtleUpgrades { - public static TurtleModem wirelessModemNormal = new TurtleModem( false, new Identifier( ComputerCraft.MOD_ID, "wireless_modem_normal" ) ); - public static TurtleModem wirelessModemAdvanced = new TurtleModem( true, new Identifier( ComputerCraft.MOD_ID, "wireless_modem_advanced" ) ); - public static TurtleSpeaker speaker = new TurtleSpeaker( new Identifier( ComputerCraft.MOD_ID, "speaker" ) ); + public static TurtleModem wirelessModemNormal = new TurtleModem( false, new ResourceLocation( ComputerCraft.MOD_ID, "wireless_modem_normal" ) ); + public static TurtleModem wirelessModemAdvanced = new TurtleModem( true, new ResourceLocation( ComputerCraft.MOD_ID, "wireless_modem_advanced" ) ); + public static TurtleSpeaker speaker = new TurtleSpeaker( new ResourceLocation( ComputerCraft.MOD_ID, "speaker" ) ); - public static TurtleCraftingTable craftingTable = new TurtleCraftingTable( new Identifier( "minecraft", "crafting_table" ) ); - public static TurtleSword diamondSword = new TurtleSword( new Identifier( "minecraft", "diamond_sword" ), Items.DIAMOND_SWORD ); - public static TurtleShovel diamondShovel = new TurtleShovel( new Identifier( "minecraft", "diamond_shovel" ), Items.DIAMOND_SHOVEL ); - public static TurtleTool diamondPickaxe = new TurtleTool( new Identifier( "minecraft", "diamond_pickaxe" ), Items.DIAMOND_PICKAXE ); - public static TurtleAxe diamondAxe = new TurtleAxe( new Identifier( "minecraft", "diamond_axe" ), Items.DIAMOND_AXE ); - public static TurtleHoe diamondHoe = new TurtleHoe( new Identifier( "minecraft", "diamond_hoe" ), Items.DIAMOND_HOE ); + public static TurtleCraftingTable craftingTable = new TurtleCraftingTable( new ResourceLocation( "minecraft", "crafting_table" ) ); + public static TurtleSword diamondSword = new TurtleSword( new ResourceLocation( "minecraft", "diamond_sword" ), Items.DIAMOND_SWORD ); + public static TurtleShovel diamondShovel = new TurtleShovel( new ResourceLocation( "minecraft", "diamond_shovel" ), Items.DIAMOND_SHOVEL ); + public static TurtleTool diamondPickaxe = new TurtleTool( new ResourceLocation( "minecraft", "diamond_pickaxe" ), Items.DIAMOND_PICKAXE ); + public static TurtleAxe diamondAxe = new TurtleAxe( new ResourceLocation( "minecraft", "diamond_axe" ), Items.DIAMOND_AXE ); + public static TurtleHoe diamondHoe = new TurtleHoe( new ResourceLocation( "minecraft", "diamond_hoe" ), Items.DIAMOND_HOE ); - public static TurtleTool netheritePickaxe = new TurtleTool( new Identifier( "minecraft", "netherite_pickaxe" ), Items.NETHERITE_PICKAXE ); + public static TurtleTool netheritePickaxe = new TurtleTool( new ResourceLocation( "minecraft", "netherite_pickaxe" ), Items.NETHERITE_PICKAXE ); public static void registerTurtleUpgrades() { diff --git a/src/main/java/dan200/computercraft/shared/MediaProviders.java b/src/main/java/dan200/computercraft/shared/MediaProviders.java index a76eef0be..9ec54354d 100644 --- a/src/main/java/dan200/computercraft/shared/MediaProviders.java +++ b/src/main/java/dan200/computercraft/shared/MediaProviders.java @@ -9,9 +9,8 @@ package dan200.computercraft.shared; import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.media.IMedia; import dan200.computercraft.api.media.IMediaProvider; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; import java.util.LinkedHashSet; import java.util.Objects; import java.util.Set; diff --git a/src/main/java/dan200/computercraft/shared/Peripherals.java b/src/main/java/dan200/computercraft/shared/Peripherals.java index 4cab4a12a..3bc7570b7 100644 --- a/src/main/java/dan200/computercraft/shared/Peripherals.java +++ b/src/main/java/dan200/computercraft/shared/Peripherals.java @@ -10,12 +10,11 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheralProvider; import dan200.computercraft.shared.peripheral.generic.GenericPeripheralProvider; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Objects; @@ -33,13 +32,13 @@ public final class Peripherals } @Nullable - public static IPeripheral getPeripheral( World world, BlockPos pos, Direction side ) + public static IPeripheral getPeripheral( Level world, BlockPos pos, Direction side ) { - return world.isInBuildLimit( pos ) && !world.isClient ? getPeripheralAt( world, pos, side ) : null; + return world.isInWorldBounds( pos ) && !world.isClientSide ? getPeripheralAt( world, pos, side ) : null; } @Nullable - private static IPeripheral getPeripheralAt( World world, BlockPos pos, Direction side ) + private static IPeripheral getPeripheralAt( Level world, BlockPos pos, Direction side ) { // Try the handlers in order: for( IPeripheralProvider peripheralProvider : providers ) diff --git a/src/main/java/dan200/computercraft/shared/PocketUpgrades.java b/src/main/java/dan200/computercraft/shared/PocketUpgrades.java index 0c5820bea..249e493a6 100644 --- a/src/main/java/dan200/computercraft/shared/PocketUpgrades.java +++ b/src/main/java/dan200/computercraft/shared/PocketUpgrades.java @@ -9,9 +9,8 @@ import dan200.computercraft.api.pocket.IPocketUpgrade; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenCustomHashMap; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Util; - +import net.minecraft.Util; +import net.minecraft.world.item.ItemStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; @@ -19,7 +18,7 @@ import java.util.*; public final class PocketUpgrades { private static final Map upgrades = new HashMap<>(); - private static final Map upgradeOwners = new Object2ObjectLinkedOpenCustomHashMap<>( Util.identityHashStrategy() ); + private static final Map upgradeOwners = new Object2ObjectLinkedOpenCustomHashMap<>( Util.identityStrategy() ); private PocketUpgrades() {} diff --git a/src/main/java/dan200/computercraft/shared/TurtlePermissions.java b/src/main/java/dan200/computercraft/shared/TurtlePermissions.java index 19d336d06..38659c400 100644 --- a/src/main/java/dan200/computercraft/shared/TurtlePermissions.java +++ b/src/main/java/dan200/computercraft/shared/TurtlePermissions.java @@ -5,21 +5,21 @@ */ package dan200.computercraft.shared; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; public final class TurtlePermissions { - public static boolean isBlockEnterable( World world, BlockPos pos, PlayerEntity player ) + public static boolean isBlockEnterable( Level world, BlockPos pos, Player player ) { MinecraftServer server = world.getServer(); - return server == null || world.isClient || world instanceof ServerWorld && !server.isSpawnProtected( (ServerWorld) world, pos, player ); + return server == null || world.isClientSide || world instanceof ServerLevel && !server.isUnderSpawnProtection( (ServerLevel) world, pos, player ); } - public static boolean isBlockEditable( World world, BlockPos pos, PlayerEntity player ) + public static boolean isBlockEditable( Level world, BlockPos pos, Player player ) { return isBlockEnterable( world, pos, player ); } diff --git a/src/main/java/dan200/computercraft/shared/TurtleUpgrades.java b/src/main/java/dan200/computercraft/shared/TurtleUpgrades.java index f59b40577..6b3e7ae62 100644 --- a/src/main/java/dan200/computercraft/shared/TurtleUpgrades.java +++ b/src/main/java/dan200/computercraft/shared/TurtleUpgrades.java @@ -8,10 +8,9 @@ package dan200.computercraft.shared; import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.item.ItemStack; import java.util.*; import java.util.stream.Stream; diff --git a/src/main/java/dan200/computercraft/shared/command/ClientCommands.java b/src/main/java/dan200/computercraft/shared/command/ClientCommands.java index 6845f2815..0bfdc4205 100644 --- a/src/main/java/dan200/computercraft/shared/command/ClientCommands.java +++ b/src/main/java/dan200/computercraft/shared/command/ClientCommands.java @@ -6,9 +6,8 @@ package dan200.computercraft.shared.command; import dan200.computercraft.shared.util.IDAssigner; -import net.minecraft.util.Util; - import java.io.File; +import net.minecraft.Util; /** * Basic client-side commands. @@ -42,7 +41,7 @@ public final class ClientCommands File file = new File( IDAssigner.getDir(), "computer/" + id ); if( !file.isDirectory() ) return true; - Util.getOperatingSystem().open( file ); + Util.getPlatform().openFile( file ); return true; } return false; diff --git a/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java b/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java index c225b7c59..9808d6345 100644 --- a/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java +++ b/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java @@ -23,21 +23,20 @@ import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.network.container.ViewComputerContainerData; import dan200.computercraft.shared.util.IDAssigner; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.LiteralText; -import net.minecraft.text.MutableText; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.Level; import javax.annotation.Nonnull; import java.io.File; import java.util.*; @@ -52,7 +51,7 @@ import static dan200.computercraft.shared.command.builder.CommandBuilder.args; import static dan200.computercraft.shared.command.builder.CommandBuilder.command; import static dan200.computercraft.shared.command.builder.HelpingArgumentBuilder.choice; import static dan200.computercraft.shared.command.text.ChatHelpers.*; -import static net.minecraft.server.command.CommandManager.literal; +import static net.minecraft.commands.Commands.literal; public final class CommandComputerCraft { @@ -66,7 +65,7 @@ public final class CommandComputerCraft { } - public static void register( CommandDispatcher dispatcher, Boolean dedicated ) + public static void register( CommandDispatcher dispatcher, Boolean dedicated ) { dispatcher.register( choice( "computercraft" ) .then( literal( "dump" ) @@ -74,17 +73,17 @@ public final class CommandComputerCraft .executes( context -> { TableBuilder table = new TableBuilder( DUMP_LIST_ID, "Computer", "On", "Position" ); - ServerCommandSource source = context.getSource(); + CommandSourceStack source = context.getSource(); List computers = new ArrayList<>( ComputerCraft.serverComputerRegistry.getComputers() ); // Unless we're on a server, limit the number of rows we can send. - World world = source.getWorld(); + Level world = source.getLevel(); BlockPos pos = new BlockPos( source.getPosition() ); computers.sort( ( a, b ) -> { if( a.getWorld() == b.getWorld() && a.getWorld() == world ) { - return Double.compare( a.getPosition().getSquaredDistance( pos ), b.getPosition().getSquaredDistance( pos ) ); + return Double.compare( a.getPosition().distSqr( pos ), b.getPosition().distSqr( pos ) ); } else if( a.getWorld() == world ) { @@ -148,7 +147,7 @@ public final class CommandComputerCraft if( computer.isOn() ) shutdown++; computer.shutdown(); } - context.getSource().sendFeedback( translate( "commands.computercraft.shutdown.done", shutdown, computers.size() ), false ); + context.getSource().sendSuccess( translate( "commands.computercraft.shutdown.done", shutdown, computers.size() ), false ); return shutdown; } ) ) @@ -162,7 +161,7 @@ public final class CommandComputerCraft if( !computer.isOn() ) on++; computer.turnOn(); } - context.getSource().sendFeedback( translate( "commands.computercraft.turn_on.done", on, computers.size() ), false ); + context.getSource().sendSuccess( translate( "commands.computercraft.turn_on.done", on, computers.size() ), false ); return on; } ) ) @@ -171,25 +170,25 @@ public final class CommandComputerCraft .arg( "computer", oneComputer() ) .executes( context -> { ServerComputer computer = getComputerArgument( context, "computer" ); - World world = computer.getWorld(); + Level world = computer.getWorld(); BlockPos pos = computer.getPosition(); if( world == null || pos == null ) throw TP_NOT_THERE.create(); - Entity entity = context.getSource().getEntityOrThrow(); - if( !(entity instanceof ServerPlayerEntity) ) throw TP_NOT_PLAYER.create(); + Entity entity = context.getSource().getEntityOrException(); + if( !(entity instanceof ServerPlayer) ) throw TP_NOT_PLAYER.create(); - ServerPlayerEntity player = (ServerPlayerEntity) entity; - if( player.getEntityWorld() == world ) + ServerPlayer player = (ServerPlayer) entity; + if( player.getCommandSenderWorld() == world ) { - player.networkHandler.requestTeleport( + player.connection.teleport( pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 0, 0, - EnumSet.noneOf( PlayerPositionLookS2CPacket.Flag.class ) + EnumSet.noneOf( ClientboundPlayerPositionPacket.RelativeArgument.class ) ); } else { - player.teleport( (ServerWorld) world, + player.teleportTo( (ServerLevel) world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 0, 0 ); } @@ -222,28 +221,28 @@ public final class CommandComputerCraft .requires( UserLevel.OP ) .arg( "computer", oneComputer() ) .executes( context -> { - ServerPlayerEntity player = context.getSource().getPlayer(); + ServerPlayer player = context.getSource().getPlayerOrException(); ServerComputer computer = getComputerArgument( context, "computer" ); computer.sendTerminalState( player ); ViewComputerContainerData container = new ViewComputerContainerData( computer ); container.open( player, new ExtendedScreenHandlerFactory() { @Override - public void writeScreenOpeningData( ServerPlayerEntity player, PacketByteBuf buf ) + public void writeScreenOpeningData( ServerPlayer player, FriendlyByteBuf buf ) { container.toBytes( buf ); } @Nonnull @Override - public MutableText getDisplayName() + public MutableComponent getDisplayName() { - return new TranslatableText( "gui.computercraft.view_computer" ); + return new TranslatableComponent( "gui.computercraft.view_computer" ); } @Nonnull @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory player, @Nonnull PlayerEntity entity ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory player, @Nonnull Player entity ) { return new ContainerViewComputer( id, player, computer ); } @@ -258,7 +257,7 @@ public final class CommandComputerCraft getTimingContext( context.getSource() ).start(); String stopCommand = "/computercraft track stop"; - context.getSource().sendFeedback( translate( "commands.computercraft.track.start.stop", + context.getSource().sendSuccess( translate( "commands.computercraft.track.start.stop", link( text( stopCommand ), stopCommand, translate( "commands.computercraft.track.stop.action" ) ) ), false ); return 1; } ) ) @@ -292,9 +291,9 @@ public final class CommandComputerCraft ); } - private static MutableText linkComputer( ServerCommandSource source, ServerComputer serverComputer, int computerId ) + private static MutableComponent linkComputer( CommandSourceStack source, ServerComputer serverComputer, int computerId ) { - MutableText out = new LiteralText( "" ); + MutableComponent out = new TextComponent( "" ); // Append the computer instance if( serverComputer == null ) @@ -333,14 +332,14 @@ public final class CommandComputerCraft if( UserLevel.OWNER.test( source ) && isPlayer( source ) ) { - MutableText linkPath = linkStorage( computerId ); + MutableComponent linkPath = linkStorage( computerId ); if( linkPath != null ) out.append( " " ).append( linkPath ); } return out; } - private static MutableText linkPosition( ServerCommandSource context, ServerComputer computer ) + private static MutableComponent linkPosition( CommandSourceStack context, ServerComputer computer ) { if( UserLevel.OP.test( context ) ) { @@ -356,7 +355,7 @@ public final class CommandComputerCraft } } - private static MutableText linkStorage( int id ) + private static MutableComponent linkStorage( int id ) { File file = new File( IDAssigner.getDir(), "computer/" + id ); if( !file.isDirectory() ) return null; @@ -369,20 +368,20 @@ public final class CommandComputerCraft } @Nonnull - private static TrackingContext getTimingContext( ServerCommandSource source ) + private static TrackingContext getTimingContext( CommandSourceStack source ) { Entity entity = source.getEntity(); - return entity instanceof PlayerEntity ? Tracking.getContext( entity.getUuid() ) : Tracking.getContext( SYSTEM_UUID ); + return entity instanceof Player ? Tracking.getContext( entity.getUUID() ) : Tracking.getContext( SYSTEM_UUID ); } private static final List DEFAULT_FIELDS = Arrays.asList( TrackingField.TASKS, TrackingField.TOTAL_TIME, TrackingField.AVERAGE_TIME, TrackingField.MAX_TIME ); - private static int displayTimings( ServerCommandSource source, TrackingField sortField, List fields ) throws CommandSyntaxException + private static int displayTimings( CommandSourceStack source, TrackingField sortField, List fields ) throws CommandSyntaxException { return displayTimings( source, getTimingContext( source ).getTimings(), sortField, fields ); } - private static int displayTimings( ServerCommandSource source, @Nonnull List timings, @Nonnull TrackingField sortField, @Nonnull List fields ) throws CommandSyntaxException + private static int displayTimings( CommandSourceStack source, @Nonnull List timings, @Nonnull TrackingField sortField, @Nonnull List fields ) throws CommandSyntaxException { if( timings.isEmpty() ) throw NO_TIMINGS_EXCEPTION.create(); @@ -398,7 +397,7 @@ public final class CommandComputerCraft timings.sort( Comparator.comparing( x -> x.get( sortField ) ).reversed() ); - MutableText[] headers = new MutableText[1 + fields.size()]; + MutableComponent[] headers = new MutableComponent[1 + fields.size()]; headers[0] = translate( "commands.computercraft.track.dump.computer" ); for( int i = 0; i < fields.size(); i++ ) headers[i + 1] = translate( fields.get( i ).translationKey() ); TableBuilder table = new TableBuilder( TRACK_ID, headers ); @@ -408,9 +407,9 @@ public final class CommandComputerCraft Computer computer = entry.getComputer(); ServerComputer serverComputer = computer == null ? null : lookup.get( computer ); - MutableText computerComponent = linkComputer( source, serverComputer, entry.getComputerId() ); + MutableComponent computerComponent = linkComputer( source, serverComputer, entry.getComputerId() ); - MutableText[] row = new MutableText[1 + fields.size()]; + MutableComponent[] row = new MutableComponent[1 + fields.size()]; row[0] = computerComponent; for( int i = 0; i < fields.size(); i++ ) row[i + 1] = text( entry.getFormatted( fields.get( i ) ) ); table.row( row ); diff --git a/src/main/java/dan200/computercraft/shared/command/CommandUtils.java b/src/main/java/dan200/computercraft/shared/command/CommandUtils.java index d64a7935d..322339ebc 100644 --- a/src/main/java/dan200/computercraft/shared/command/CommandUtils.java +++ b/src/main/java/dan200/computercraft/shared/command/CommandUtils.java @@ -10,42 +10,41 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dan200.computercraft.api.turtle.FakePlayer; -import net.minecraft.command.CommandSource; -import net.minecraft.entity.Entity; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; - import java.util.Arrays; import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.function.Function; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; public final class CommandUtils { private CommandUtils() {} - public static boolean isPlayer( ServerCommandSource output ) + public static boolean isPlayer( CommandSourceStack output ) { Entity sender = output.getEntity(); - return sender instanceof ServerPlayerEntity && !(sender instanceof FakePlayer) && ((ServerPlayerEntity) sender).networkHandler != null; + return sender instanceof ServerPlayer && !(sender instanceof FakePlayer) && ((ServerPlayer) sender).connection != null; } @SuppressWarnings( "unchecked" ) public static CompletableFuture suggestOnServer( CommandContext context, SuggestionsBuilder builder, - Function, CompletableFuture> supplier ) + Function, CompletableFuture> supplier ) { Object source = context.getSource(); - if( !(source instanceof CommandSource) ) + if( !(source instanceof SharedSuggestionProvider) ) { return Suggestions.empty(); } - else if( source instanceof ServerCommandSource ) + else if( source instanceof CommandSourceStack ) { - return supplier.apply( (CommandContext) context ); + return supplier.apply( (CommandContext) context ); } else { - return ((CommandSource) source).getCompletions( (CommandContext) context, builder ); + return ((SharedSuggestionProvider) source).customSuggestion( (CommandContext) context, builder ); } } diff --git a/src/main/java/dan200/computercraft/shared/command/Exceptions.java b/src/main/java/dan200/computercraft/shared/command/Exceptions.java index 88f173093..bf077b239 100644 --- a/src/main/java/dan200/computercraft/shared/command/Exceptions.java +++ b/src/main/java/dan200/computercraft/shared/command/Exceptions.java @@ -9,7 +9,7 @@ package dan200.computercraft.shared.command; import com.mojang.brigadier.exceptions.Dynamic2CommandExceptionType; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import net.minecraft.text.TranslatableText; +import net.minecraft.network.chat.TranslatableComponent; public final class Exceptions { @@ -25,16 +25,16 @@ public final class Exceptions private static SimpleCommandExceptionType translated( String key ) { - return new SimpleCommandExceptionType( new TranslatableText( key ) ); + return new SimpleCommandExceptionType( new TranslatableComponent( key ) ); } private static DynamicCommandExceptionType translated1( String key ) { - return new DynamicCommandExceptionType( x -> new TranslatableText( key, x ) ); + return new DynamicCommandExceptionType( x -> new TranslatableComponent( key, x ) ); } private static Dynamic2CommandExceptionType translated2( String key ) { - return new Dynamic2CommandExceptionType( ( x, y ) -> new TranslatableText( key, x, y ) ); + return new Dynamic2CommandExceptionType( ( x, y ) -> new TranslatableComponent( key, x, y ) ); } } diff --git a/src/main/java/dan200/computercraft/shared/command/UserLevel.java b/src/main/java/dan200/computercraft/shared/command/UserLevel.java index 1f24c7a82..3aa86dc1a 100644 --- a/src/main/java/dan200/computercraft/shared/command/UserLevel.java +++ b/src/main/java/dan200/computercraft/shared/command/UserLevel.java @@ -5,17 +5,16 @@ */ package dan200.computercraft.shared.command; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.command.ServerCommandSource; - +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import java.util.function.Predicate; /** * The level a user must be at in order to execute a command. */ -public enum UserLevel implements Predicate +public enum UserLevel implements Predicate { /** * Only can be used by the owner of the server: namely the server console or the player in SSP. @@ -53,20 +52,20 @@ public enum UserLevel implements Predicate } @Override - public boolean test( ServerCommandSource source ) + public boolean test( CommandSourceStack source ) { if( this == ANYONE ) return true; if( this == OWNER ) return isOwner( source ); if( this == OWNER_OP && isOwner( source ) ) return true; - return source.hasPermissionLevel( toLevel() ); + return source.hasPermission( toLevel() ); } - private static boolean isOwner( ServerCommandSource source ) + private static boolean isOwner( CommandSourceStack source ) { MinecraftServer server = source.getServer(); Entity sender = source.getEntity(); - return server.isDedicated() - ? source.getEntity() == null && source.hasPermissionLevel( 4 ) && source.getName().equals( "Server" ) - : sender instanceof PlayerEntity && ((PlayerEntity) sender).getGameProfile().getName().equalsIgnoreCase( server.getServerModName() ); + return server.isDedicatedServer() + ? source.getEntity() == null && source.hasPermission( 4 ) && source.getTextName().equals( "Server" ) + : sender instanceof Player && ((Player) sender).getGameProfile().getName().equalsIgnoreCase( server.getServerModName() ); } } diff --git a/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentSerializers.java b/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentSerializers.java index a8520734d..afacc524e 100644 --- a/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentSerializers.java +++ b/src/main/java/dan200/computercraft/shared/command/arguments/ArgumentSerializers.java @@ -8,33 +8,33 @@ package dan200.computercraft.shared.command.arguments; import com.mojang.brigadier.arguments.ArgumentType; import dan200.computercraft.ComputerCraft; -import net.minecraft.command.argument.ArgumentTypes; -import net.minecraft.command.argument.serialize.ArgumentSerializer; -import net.minecraft.command.argument.serialize.ConstantArgumentSerializer; -import net.minecraft.util.Identifier; +import net.minecraft.commands.synchronization.ArgumentSerializer; +import net.minecraft.commands.synchronization.ArgumentTypes; +import net.minecraft.commands.synchronization.EmptyArgumentSerializer; +import net.minecraft.resources.ResourceLocation; public final class ArgumentSerializers { public static void register() { - register( new Identifier( ComputerCraft.MOD_ID, "tracking_field" ), TrackingFieldArgumentType.trackingField() ); - register( new Identifier( ComputerCraft.MOD_ID, "computer" ), ComputerArgumentType.oneComputer() ); - register( new Identifier( ComputerCraft.MOD_ID, "computers" ), ComputersArgumentType.class, new ComputersArgumentType.Serializer() ); - registerUnsafe( new Identifier( ComputerCraft.MOD_ID, "repeat" ), RepeatArgumentType.class, new RepeatArgumentType.Serializer() ); + register( new ResourceLocation( ComputerCraft.MOD_ID, "tracking_field" ), TrackingFieldArgumentType.trackingField() ); + register( new ResourceLocation( ComputerCraft.MOD_ID, "computer" ), ComputerArgumentType.oneComputer() ); + register( new ResourceLocation( ComputerCraft.MOD_ID, "computers" ), ComputersArgumentType.class, new ComputersArgumentType.Serializer() ); + registerUnsafe( new ResourceLocation( ComputerCraft.MOD_ID, "repeat" ), RepeatArgumentType.class, new RepeatArgumentType.Serializer() ); } - private static > void register( Identifier id, T instance ) + private static > void register( ResourceLocation id, T instance ) { - registerUnsafe( id, instance.getClass(), new ConstantArgumentSerializer<>( () -> instance ) ); + registerUnsafe( id, instance.getClass(), new EmptyArgumentSerializer<>( () -> instance ) ); } - private static > void register( Identifier id, Class type, ArgumentSerializer serializer ) + private static > void register( ResourceLocation id, Class type, ArgumentSerializer serializer ) { ArgumentTypes.register( id.toString(), type, serializer ); } @SuppressWarnings( "unchecked" ) - private static > void registerUnsafe( Identifier id, Class type, ArgumentSerializer serializer ) + private static > void registerUnsafe( ResourceLocation id, Class type, ArgumentSerializer serializer ) { ArgumentTypes.register( id.toString(), type, (ArgumentSerializer) serializer ); } diff --git a/src/main/java/dan200/computercraft/shared/command/arguments/ComputerArgumentType.java b/src/main/java/dan200/computercraft/shared/command/arguments/ComputerArgumentType.java index 06840b154..c8cd4f668 100644 --- a/src/main/java/dan200/computercraft/shared/command/arguments/ComputerArgumentType.java +++ b/src/main/java/dan200/computercraft/shared/command/arguments/ComputerArgumentType.java @@ -14,10 +14,9 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dan200.computercraft.shared.command.arguments.ComputersArgumentType.ComputersSupplier; import dan200.computercraft.shared.computer.core.ServerComputer; -import net.minecraft.server.command.ServerCommandSource; - import java.util.Collection; import java.util.concurrent.CompletableFuture; +import net.minecraft.commands.CommandSourceStack; import static dan200.computercraft.shared.command.Exceptions.COMPUTER_ARG_MANY; @@ -34,7 +33,7 @@ public final class ComputerArgumentType implements ArgumentType context, String name ) throws CommandSyntaxException + public static ServerComputer getComputerArgument( CommandContext context, String name ) throws CommandSyntaxException { return context.getArgument( name, ComputerSupplier.class ) .unwrap( context.getSource() ); @@ -98,6 +97,6 @@ public final class ComputerArgumentType implements ArgumentType getComputersArgument( CommandContext context, String name ) throws CommandSyntaxException + public static Collection getComputersArgument( CommandContext context, String name ) throws CommandSyntaxException { return context.getArgument( name, ComputersSupplier.class ) .unwrap( context.getSource() ); } - public static Set unwrap( ServerCommandSource source, Collection suppliers ) throws CommandSyntaxException + public static Set unwrap( CommandSourceStack source, Collection suppliers ) throws CommandSyntaxException { Set computers = new HashSet<>(); for( ComputersSupplier supplier : suppliers ) @@ -188,21 +187,21 @@ public final class ComputersArgumentType implements ArgumentType unwrap( ServerCommandSource source ) throws CommandSyntaxException; + Collection unwrap( CommandSourceStack source ) throws CommandSyntaxException; } public static class Serializer implements ArgumentSerializer { @Override - public void toPacket( @Nonnull ComputersArgumentType arg, @Nonnull PacketByteBuf buf ) + public void toPacket( @Nonnull ComputersArgumentType arg, @Nonnull FriendlyByteBuf buf ) { buf.writeBoolean( arg.requireSome ); } @Nonnull @Override - public ComputersArgumentType fromPacket( @Nonnull PacketByteBuf buf ) + public ComputersArgumentType deserializeFromNetwork( @Nonnull FriendlyByteBuf buf ) { return buf.readBoolean() ? SOME : MANY; } diff --git a/src/main/java/dan200/computercraft/shared/command/arguments/RepeatArgumentType.java b/src/main/java/dan200/computercraft/shared/command/arguments/RepeatArgumentType.java index d38c6b51c..2b8d2f7f4 100644 --- a/src/main/java/dan200/computercraft/shared/command/arguments/RepeatArgumentType.java +++ b/src/main/java/dan200/computercraft/shared/command/arguments/RepeatArgumentType.java @@ -15,13 +15,12 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.command.argument.ArgumentTypes; -import net.minecraft.command.argument.serialize.ArgumentSerializer; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; - import javax.annotation.Nonnull; +import net.minecraft.commands.synchronization.ArgumentSerializer; +import net.minecraft.commands.synchronization.ArgumentTypes; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -138,11 +137,11 @@ public final class RepeatArgumentType implements ArgumentType> public static class Serializer implements ArgumentSerializer> { @Override - public void toPacket( @Nonnull RepeatArgumentType arg, @Nonnull PacketByteBuf buf ) + public void toPacket( @Nonnull RepeatArgumentType arg, @Nonnull FriendlyByteBuf buf ) { buf.writeBoolean( arg.flatten ); - ArgumentTypes.toPacket( buf, arg.child ); - buf.writeText( getMessage( arg ) ); + ArgumentTypes.serialize( buf, arg.child ); + buf.writeComponent( getMessage( arg ) ); } @Nonnull @@ -151,11 +150,11 @@ public final class RepeatArgumentType implements ArgumentType> "unchecked", "rawtypes" } ) - public RepeatArgumentType fromPacket( @Nonnull PacketByteBuf buf ) + public RepeatArgumentType deserializeFromNetwork( @Nonnull FriendlyByteBuf buf ) { boolean isList = buf.readBoolean(); - ArgumentType child = ArgumentTypes.fromPacket( buf ); - Text message = buf.readText(); + ArgumentType child = ArgumentTypes.deserialize( buf ); + Component message = buf.readComponent(); BiConsumer, ?> appender = isList ? ( list, x ) -> list.addAll( (Collection) x ) : List::add; return new RepeatArgumentType( child, appender, isList, new SimpleCommandExceptionType( message ) ); } @@ -165,18 +164,18 @@ public final class RepeatArgumentType implements ArgumentType> { json.addProperty( "flatten", arg.flatten ); json.addProperty( "child", "<>" ); // TODO: Potentially serialize this using reflection. - json.addProperty( "error", Text.Serializer.toJson( getMessage( arg ) ) ); + json.addProperty( "error", Component.Serializer.toJson( getMessage( arg ) ) ); } - private static Text getMessage( RepeatArgumentType arg ) + private static Component getMessage( RepeatArgumentType arg ) { Message message = arg.some.create() .getRawMessage(); - if( message instanceof Text ) + if( message instanceof Component ) { - return (Text) message; + return (Component) message; } - return new LiteralText( message.getString() ); + return new TextComponent( message.getString() ); } } } diff --git a/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java b/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java index 72233bd69..d4d779c60 100644 --- a/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java +++ b/src/main/java/dan200/computercraft/shared/command/builder/CommandBuilder.java @@ -13,13 +13,12 @@ import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.tree.CommandNode; import dan200.computercraft.shared.command.arguments.RepeatArgumentType; -import net.minecraft.server.command.ServerCommandSource; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.function.Predicate; import java.util.function.Supplier; +import net.minecraft.commands.CommandSourceStack; import static dan200.computercraft.shared.command.Exceptions.ARGUMENT_EXPECTED; import static dan200.computercraft.shared.command.builder.HelpingArgumentBuilder.literal; @@ -34,14 +33,14 @@ public class CommandBuilder implements CommandNodeBuilder> private List> args = new ArrayList<>(); private Predicate requires; - public static CommandBuilder args() + public static CommandBuilder args() { return new CommandBuilder<>(); } - public static CommandBuilder command( String literal ) + public static CommandBuilder command( String literal ) { - CommandBuilder builder = new CommandBuilder<>(); + CommandBuilder builder = new CommandBuilder<>(); builder.args.add( literal( literal ) ); return builder; } diff --git a/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java b/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java index c7bd1248e..9ec64900b 100644 --- a/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java +++ b/src/main/java/dan200/computercraft/shared/command/builder/HelpingArgumentBuilder.java @@ -13,14 +13,13 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.LiteralText; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - import javax.annotation.Nonnull; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; import java.util.ArrayList; import java.util.Collection; @@ -31,11 +30,11 @@ import static dan200.computercraft.shared.command.text.ChatHelpers.translate; * An alternative to {@link LiteralArgumentBuilder} which also provides a {@code /... help} command, and defaults to that command when no arguments are * given. */ -public final class HelpingArgumentBuilder extends LiteralArgumentBuilder +public final class HelpingArgumentBuilder extends LiteralArgumentBuilder { - private static final Formatting HEADER = Formatting.LIGHT_PURPLE; - private static final Formatting SYNOPSIS = Formatting.AQUA; - private static final Formatting NAME = Formatting.GREEN; + private static final ChatFormatting HEADER = ChatFormatting.LIGHT_PURPLE; + private static final ChatFormatting SYNOPSIS = ChatFormatting.AQUA; + private static final ChatFormatting NAME = ChatFormatting.GREEN; private final Collection children = new ArrayList<>(); private HelpingArgumentBuilder( String literal ) @@ -48,11 +47,11 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder helpForChild( CommandNode node, String id, String command ) + private static Command helpForChild( CommandNode node, String id, String command ) { return context -> { context.getSource() - .sendFeedback( getHelp( context, + .sendSuccess( getHelp( context, node, id + "." + node.getName() .replace( '-', '_' ), @@ -61,28 +60,28 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder context, CommandNode node, String id, String command ) + private static Component getHelp( CommandContext context, CommandNode node, String id, String command ) { // An ugly hack to extract usage information from the dispatcher. We generate a temporary node, generate // the shorthand usage, and emit that. - CommandDispatcher dispatcher = context.getSource() + CommandDispatcher dispatcher = context.getSource() .getServer() - .getCommandManager() + .getCommands() .getDispatcher(); - CommandNode temp = new LiteralCommandNode<>( "_", null, x -> true, null, null, false ); + CommandNode temp = new LiteralCommandNode<>( "_", null, x -> true, null, null, false ); temp.addChild( node ); String usage = dispatcher.getSmartUsage( temp, context.getSource() ) .get( node ) .substring( node.getName() .length() ); - MutableText output = new LiteralText( "" ).append( coloured( "/" + command + usage, HEADER ) ) + MutableComponent output = new TextComponent( "" ).append( coloured( "/" + command + usage, HEADER ) ) .append( " " ) .append( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) ) .append( "\n" ) .append( translate( "commands." + id + ".desc" ) ); - for( CommandNode child : node.getChildren() ) + for( CommandNode child : node.getChildren() ) { if( !child.getRequirement() .test( context.getSource() ) || !(child instanceof LiteralCommandNode) ) @@ -92,7 +91,7 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder then( final ArgumentBuilder argument ) + public LiteralArgumentBuilder then( final ArgumentBuilder argument ) { if( getRedirect() != null ) { @@ -129,7 +128,7 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder then( CommandNode argument ) + public LiteralArgumentBuilder then( CommandNode argument ) { if( !(argument instanceof LiteralCommandNode) ) { @@ -139,33 +138,33 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder executes( final Command command ) + public LiteralArgumentBuilder executes( final Command command ) { throw new IllegalStateException( "Cannot use executes on a HelpingArgumentBuilder" ); } @Override - public LiteralCommandNode build() + public LiteralCommandNode build() { return buildImpl( getLiteral().replace( '-', '_' ), getLiteral() ); } - private LiteralCommandNode build( @Nonnull String id, @Nonnull String command ) + private LiteralCommandNode build( @Nonnull String id, @Nonnull String command ) { return buildImpl( id + "." + getLiteral().replace( '-', '_' ), command + " " + getLiteral() ); } - private LiteralCommandNode buildImpl( String id, String command ) + private LiteralCommandNode buildImpl( String id, String command ) { HelpCommand helpCommand = new HelpCommand( id, command ); - LiteralCommandNode node = new LiteralCommandNode<>( getLiteral(), + LiteralCommandNode node = new LiteralCommandNode<>( getLiteral(), helpCommand, getRequirement(), getRedirect(), getRedirectModifier(), isFork() ); helpCommand.node = node; // Set up a /... help command - LiteralArgumentBuilder helpNode = - LiteralArgumentBuilder.literal( "help" ).requires( x -> getArguments().stream() + LiteralArgumentBuilder helpNode = + LiteralArgumentBuilder.literal( "help" ).requires( x -> getArguments().stream() .anyMatch( y -> y.getRequirement() .test( @@ -173,11 +172,11 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder child : getArguments() ) + for( CommandNode child : getArguments() ) { node.addChild( child ); - helpNode.then( LiteralArgumentBuilder.literal( child.getName() ).requires( child.getRequirement() ) + helpNode.then( LiteralArgumentBuilder.literal( child.getName() ).requires( child.getRequirement() ) .executes( helpForChild( child, id, command ) ) .build() ); } @@ -185,9 +184,9 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder child = childBuilder.build( id, command ); + LiteralCommandNode child = childBuilder.build( id, command ); node.addChild( child ); - helpNode.then( LiteralArgumentBuilder.literal( child.getName() ).requires( child.getRequirement() ) + helpNode.then( LiteralArgumentBuilder.literal( child.getName() ).requires( child.getRequirement() ) .executes( helpForChild( child, id, command ) ) .redirect( child.getChild( "help" ) ) .build() ); @@ -198,11 +197,11 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder + private static final class HelpCommand implements Command { private final String id; private final String command; - LiteralCommandNode node; + LiteralCommandNode node; private HelpCommand( String id, String command ) { @@ -211,10 +210,10 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder context ) + public int run( CommandContext context ) { context.getSource() - .sendFeedback( getHelp( context, node, id, command ), false ); + .sendSuccess( getHelp( context, node, id, command ), false ); return 0; } } diff --git a/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java b/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java index 03a8deae0..470f38618 100644 --- a/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java +++ b/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java @@ -5,80 +5,86 @@ */ package dan200.computercraft.shared.command.text; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.text.*; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; /** * Various helpers for building chat messages. */ public final class ChatHelpers { - private static final Formatting HEADER = Formatting.LIGHT_PURPLE; + private static final ChatFormatting HEADER = ChatFormatting.LIGHT_PURPLE; private ChatHelpers() {} - public static MutableText coloured( String text, Formatting colour ) + public static MutableComponent coloured( String text, ChatFormatting colour ) { - MutableText component = new LiteralText( text == null ? "" : text ); + MutableComponent component = new TextComponent( text == null ? "" : text ); component.setStyle( component.getStyle().withColor( colour ) ); return component; } - public static T coloured( T component, Formatting colour ) + public static T coloured( T component, ChatFormatting colour ) { component.setStyle( component.getStyle().withColor( colour ) ); return component; } - public static MutableText text( String text ) + public static MutableComponent text( String text ) { - return new LiteralText( text == null ? "" : text ); + return new TextComponent( text == null ? "" : text ); } - public static MutableText translate( String text ) + public static MutableComponent translate( String text ) { - return new TranslatableText( text == null ? "" : text ); + return new TranslatableComponent( text == null ? "" : text ); } - public static MutableText translate( String text, Object... args ) + public static MutableComponent translate( String text, Object... args ) { - return new TranslatableText( text == null ? "" : text, args ); + return new TranslatableComponent( text == null ? "" : text, args ); } - public static MutableText list( MutableText... children ) + public static MutableComponent list( MutableComponent... children ) { - MutableText component = new LiteralText( "" ); - for( MutableText child : children ) + MutableComponent component = new TextComponent( "" ); + for( MutableComponent child : children ) { component.append( child ); } return component; } - public static MutableText position( BlockPos pos ) + public static MutableComponent position( BlockPos pos ) { if( pos == null ) return translate( "commands.computercraft.generic.no_position" ); return translate( "commands.computercraft.generic.position", pos.getX(), pos.getY(), pos.getZ() ); } - public static MutableText bool( boolean value ) + public static MutableComponent bool( boolean value ) { return value - ? coloured( translate( "commands.computercraft.generic.yes" ), Formatting.GREEN ) - : coloured( translate( "commands.computercraft.generic.no" ), Formatting.RED ); + ? coloured( translate( "commands.computercraft.generic.yes" ), ChatFormatting.GREEN ) + : coloured( translate( "commands.computercraft.generic.no" ), ChatFormatting.RED ); } - public static MutableText link( MutableText component, String command, MutableText toolTip ) + public static MutableComponent link( MutableComponent component, String command, MutableComponent toolTip ) { return link( component, new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ), toolTip ); } - public static MutableText link( MutableText component, ClickEvent click, MutableText toolTip ) + public static MutableComponent link( MutableComponent component, ClickEvent click, MutableComponent toolTip ) { Style style = component.getStyle(); - if( style.getColor() == null ) style = style.withColor( Formatting.YELLOW ); + if( style.getColor() == null ) style = style.withColor( ChatFormatting.YELLOW ); style = style.withClickEvent( click ); style = style.withHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, toolTip ) ); @@ -87,17 +93,17 @@ public final class ChatHelpers return component; } - public static MutableText header( String text ) + public static MutableComponent header( String text ) { return coloured( text, HEADER ); } - public static MutableText copy( String text ) + public static MutableComponent copy( String text ) { - LiteralText name = new LiteralText( text ); + TextComponent name = new TextComponent( text ); name.setStyle( name.getStyle() .withClickEvent( new ClickEvent( ClickEvent.Action.COPY_TO_CLIPBOARD, text ) ) - .withHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new TranslatableText( "gui.computercraft.tooltip.copy" ) ) ) ); + .withHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, new TranslatableComponent( "gui.computercraft.tooltip.copy" ) ) ) ); return name; } } diff --git a/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java b/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java index fe8ee5b7c..61e9e2b41 100644 --- a/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java +++ b/src/main/java/dan200/computercraft/shared/command/text/ServerTableFormatter.java @@ -6,32 +6,32 @@ package dan200.computercraft.shared.command.text; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; public class ServerTableFormatter implements TableFormatter { - private final ServerCommandSource source; + private final CommandSourceStack source; - public ServerTableFormatter( ServerCommandSource source ) + public ServerTableFormatter( CommandSourceStack source ) { this.source = source; } @Override @Nullable - public Text getPadding( Text component, int width ) + public Component getPadding( Component component, int width ) { int extraWidth = width - getWidth( component ); if( extraWidth <= 0 ) { return null; } - return new LiteralText( StringUtils.repeat( ' ', extraWidth ) ); + return new TextComponent( StringUtils.repeat( ' ', extraWidth ) ); } @Override @@ -41,15 +41,15 @@ public class ServerTableFormatter implements TableFormatter } @Override - public int getWidth( Text component ) + public int getWidth( Component component ) { return component.getString() .length(); } @Override - public void writeLine( int id, Text component ) + public void writeLine( int id, Component component ) { - source.sendFeedback( component, false ); + source.sendSuccess( component, false ); } } diff --git a/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java b/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java index c65c58294..5808311dd 100644 --- a/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java +++ b/src/main/java/dan200/computercraft/shared/command/text/TableBuilder.java @@ -9,24 +9,23 @@ package dan200.computercraft.shared.command.text; import dan200.computercraft.shared.command.CommandUtils; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.client.ChatTableClientMessage; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import java.util.ArrayList; import java.util.List; public class TableBuilder { private final int id; - private final Text[] headers; - private final ArrayList rows = new ArrayList<>(); + private final Component[] headers; + private final ArrayList rows = new ArrayList<>(); private int columns = -1; private int additional; - public TableBuilder( int id, @Nonnull Text... headers ) + public TableBuilder( int id, @Nonnull Component... headers ) { if( id < 0 ) { @@ -54,7 +53,7 @@ public class TableBuilder throw new IllegalArgumentException( "ID must be positive" ); } this.id = id; - this.headers = new Text[headers.length]; + this.headers = new Component[headers.length]; columns = headers.length; for( int i = 0; i < headers.length; i++ ) @@ -63,7 +62,7 @@ public class TableBuilder } } - public void row( @Nonnull Text... row ) + public void row( @Nonnull Component... row ) { if( columns == -1 ) { @@ -101,13 +100,13 @@ public class TableBuilder } @Nullable - public Text[] getHeaders() + public Component[] getHeaders() { return headers; } @Nonnull - public List getRows() + public List getRows() { return rows; } @@ -122,12 +121,12 @@ public class TableBuilder this.additional = additional; } - public void display( ServerCommandSource source ) + public void display( CommandSourceStack source ) { if( CommandUtils.isPlayer( source ) ) { trim( 18 ); - NetworkHandler.sendToPlayer( (ServerPlayerEntity) source.getEntity(), new ChatTableClientMessage( this ) ); + NetworkHandler.sendToPlayer( (ServerPlayer) source.getEntity(), new ChatTableClientMessage( this ) ); } else { diff --git a/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java b/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java index 3c942e2d8..a9b2a2a3e 100644 --- a/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java +++ b/src/main/java/dan200/computercraft/shared/command/text/TableFormatter.java @@ -6,20 +6,20 @@ package dan200.computercraft.shared.command.text; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; import static dan200.computercraft.shared.command.text.ChatHelpers.coloured; import static dan200.computercraft.shared.command.text.ChatHelpers.translate; public interface TableFormatter { - Text SEPARATOR = coloured( "| ", Formatting.GRAY ); - Text HEADER = coloured( "=", Formatting.GRAY ); + Component SEPARATOR = coloured( "| ", ChatFormatting.GRAY ); + Component HEADER = coloured( "=", ChatFormatting.GRAY ); default int display( TableBuilder table ) { @@ -32,7 +32,7 @@ public interface TableFormatter int columns = table.getColumns(); int[] maxWidths = new int[columns]; - Text[] headers = table.getHeaders(); + Component[] headers = table.getHeaders(); if( headers != null ) { for( int i = 0; i < columns; i++ ) @@ -41,7 +41,7 @@ public interface TableFormatter } } - for( Text[] row : table.getRows() ) + for( Component[] row : table.getRows() ) { for( int i = 0; i < row.length; i++ ) { @@ -71,11 +71,11 @@ public interface TableFormatter if( headers != null ) { - LiteralText line = new LiteralText( "" ); + TextComponent line = new TextComponent( "" ); for( int i = 0; i < columns - 1; i++ ) { line.append( headers[i] ); - Text padding = getPadding( headers[i], maxWidths[i] ); + Component padding = getPadding( headers[i], maxWidths[i] ); if( padding != null ) { line.append( padding ); @@ -90,16 +90,16 @@ public interface TableFormatter // it a tad prettier. int rowCharWidth = getWidth( HEADER ); int rowWidth = totalWidth / rowCharWidth + (totalWidth % rowCharWidth == 0 ? 0 : 1); - writeLine( rowId++, coloured( StringUtils.repeat( HEADER.getString(), rowWidth ), Formatting.GRAY ) ); + writeLine( rowId++, coloured( StringUtils.repeat( HEADER.getString(), rowWidth ), ChatFormatting.GRAY ) ); } - for( Text[] row : table.getRows() ) + for( Component[] row : table.getRows() ) { - LiteralText line = new LiteralText( "" ); + TextComponent line = new TextComponent( "" ); for( int i = 0; i < columns - 1; i++ ) { line.append( row[i] ); - Text padding = getPadding( row[i], maxWidths[i] ); + Component padding = getPadding( row[i], maxWidths[i] ); if( padding != null ) { line.append( padding ); @@ -112,13 +112,13 @@ public interface TableFormatter if( table.getAdditional() > 0 ) { - writeLine( rowId++, coloured( translate( "commands.computercraft.generic.additional_rows", table.getAdditional() ), Formatting.AQUA ) ); + writeLine( rowId++, coloured( translate( "commands.computercraft.generic.additional_rows", table.getAdditional() ), ChatFormatting.AQUA ) ); } return rowId - table.getId(); } - int getWidth( Text component ); + int getWidth( Component component ); /** * Get the minimum padding between each column. @@ -135,7 +135,7 @@ public interface TableFormatter * @return The padding for this component, or {@code null} if none is needed. */ @Nullable - Text getPadding( Text component, int width ); + Component getPadding( Component component, int width ); - void writeLine( int id, Text component ); + void writeLine( int id, Component component ); } diff --git a/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java b/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java index 8150b6ec2..29e071d87 100644 --- a/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java +++ b/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java @@ -6,29 +6,28 @@ package dan200.computercraft.shared.common; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.BlockWithEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import java.util.Random; -public abstract class BlockGeneric extends BlockWithEntity +public abstract class BlockGeneric extends BaseEntityBlock { private final BlockEntityType type; - public BlockGeneric( Settings settings, BlockEntityType type ) + public BlockGeneric( Properties settings, BlockEntityType type ) { super( settings ); this.type = type; @@ -40,14 +39,14 @@ public abstract class BlockGeneric extends BlockWithEntity } @Override - public BlockRenderType getRenderType( BlockState state ) + public RenderShape getRenderShape( BlockState state ) { - return BlockRenderType.MODEL; + return RenderShape.MODEL; } @Override @Deprecated - public final void neighborUpdate( @Nonnull BlockState state, World world, @Nonnull BlockPos pos, @Nonnull Block neighbourBlock, + public final void neighborChanged( @Nonnull BlockState state, Level world, @Nonnull BlockPos pos, @Nonnull Block neighbourBlock, @Nonnull BlockPos neighbourPos, boolean isMoving ) { BlockEntity tile = world.getBlockEntity( pos ); @@ -59,7 +58,7 @@ public abstract class BlockGeneric extends BlockWithEntity @Override @Deprecated - public final void onStateReplaced( @Nonnull BlockState block, @Nonnull World world, @Nonnull BlockPos pos, BlockState replace, boolean bool ) + public final void onRemove( @Nonnull BlockState block, @Nonnull Level world, @Nonnull BlockPos pos, BlockState replace, boolean bool ) { if( block.getBlock() == replace.getBlock() ) { @@ -67,7 +66,7 @@ public abstract class BlockGeneric extends BlockWithEntity } BlockEntity tile = world.getBlockEntity( pos ); - super.onStateReplaced( block, world, pos, replace, bool ); + super.onRemove( block, world, pos, replace, bool ); world.removeBlockEntity( pos ); if( tile instanceof TileGeneric ) { @@ -78,16 +77,16 @@ public abstract class BlockGeneric extends BlockWithEntity @Nonnull @Override @Deprecated - public final ActionResult onUse( @Nonnull BlockState state, World world, @Nonnull BlockPos pos, @Nonnull PlayerEntity player, @Nonnull Hand hand, + public final InteractionResult use( @Nonnull BlockState state, Level world, @Nonnull BlockPos pos, @Nonnull Player player, @Nonnull InteractionHand hand, @Nonnull BlockHitResult hit ) { BlockEntity tile = world.getBlockEntity( pos ); - return tile instanceof TileGeneric ? ((TileGeneric) tile).onActivate( player, hand, hit ) : ActionResult.PASS; + return tile instanceof TileGeneric ? ((TileGeneric) tile).onActivate( player, hand, hit ) : InteractionResult.PASS; } @Override @Deprecated - public void scheduledTick( @Nonnull BlockState state, ServerWorld world, @Nonnull BlockPos pos, @Nonnull Random rand ) + public void tick( @Nonnull BlockState state, ServerLevel world, @Nonnull BlockPos pos, @Nonnull Random rand ) { BlockEntity te = world.getBlockEntity( pos ); if( te instanceof TileGeneric ) @@ -98,11 +97,11 @@ public abstract class BlockGeneric extends BlockWithEntity @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { if ( this.type != null ) { - return type.instantiate( pos, state ); + return type.create( pos, state ); } return null; } diff --git a/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java b/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java index 45601a8bc..be189e35e 100644 --- a/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java +++ b/src/main/java/dan200/computercraft/shared/common/ClientTerminal.java @@ -8,7 +8,7 @@ package dan200.computercraft.shared.common; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.network.client.TerminalState; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; public class ClientTerminal implements ITerminal { @@ -80,12 +80,12 @@ public class ClientTerminal implements ITerminal } } - public void readDescription( NbtCompound nbt ) + public void readDescription( CompoundTag nbt ) { colour = nbt.getBoolean( "colour" ); if( nbt.contains( "terminal" ) ) { - NbtCompound terminal = nbt.getCompound( "terminal" ); + CompoundTag terminal = nbt.getCompound( "terminal" ); resizeTerminal( terminal.getInt( "term_width" ), terminal.getInt( "term_height" ) ); this.terminal.readFromNBT( terminal ); } diff --git a/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java b/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java index 251bb104b..5ea821b69 100644 --- a/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java +++ b/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java @@ -8,34 +8,33 @@ package dan200.computercraft.shared.common; import dan200.computercraft.shared.util.ColourTracker; import dan200.computercraft.shared.util.ColourUtils; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.SpecialCraftingRecipe; -import net.minecraft.recipe.SpecialRecipeSerializer; -import net.minecraft.util.DyeColor; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; +import net.minecraft.world.level.Level; -public final class ColourableRecipe extends SpecialCraftingRecipe +public final class ColourableRecipe extends CustomRecipe { - public static final RecipeSerializer SERIALIZER = new SpecialRecipeSerializer<>( ColourableRecipe::new ); + public static final RecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>( ColourableRecipe::new ); - private ColourableRecipe( Identifier id ) + private ColourableRecipe( ResourceLocation id ) { super( id ); } @Override - public boolean matches( @Nonnull CraftingInventory inv, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inv, @Nonnull Level world ) { boolean hasColourable = false; boolean hasDye = false; - for( int i = 0; i < inv.size(); i++ ) + for( int i = 0; i < inv.getContainerSize(); i++ ) { - ItemStack stack = inv.getStack( i ); + ItemStack stack = inv.getItem( i ); if( stack.isEmpty() ) { continue; @@ -64,15 +63,15 @@ public final class ColourableRecipe extends SpecialCraftingRecipe @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inv ) + public ItemStack craft( @Nonnull CraftingContainer inv ) { ItemStack colourable = ItemStack.EMPTY; ColourTracker tracker = new ColourTracker(); - for( int i = 0; i < inv.size(); i++ ) + for( int i = 0; i < inv.getContainerSize(); i++ ) { - ItemStack stack = inv.getStack( i ); + ItemStack stack = inv.getItem( i ); if( stack.isEmpty() ) { @@ -93,7 +92,7 @@ public final class ColourableRecipe extends SpecialCraftingRecipe } @Override - public boolean fits( int x, int y ) + public boolean canCraftInDimensions( int x, int y ) { return x >= 2 && y >= 2; } diff --git a/src/main/java/dan200/computercraft/shared/common/ContainerHeldItem.java b/src/main/java/dan200/computercraft/shared/common/ContainerHeldItem.java index e3150f8e8..56a08e3a8 100644 --- a/src/main/java/dan200/computercraft/shared/common/ContainerHeldItem.java +++ b/src/main/java/dan200/computercraft/shared/common/ContainerHeldItem.java @@ -9,34 +9,33 @@ package dan200.computercraft.shared.common; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.network.container.HeldItemContainerData; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class ContainerHeldItem extends ScreenHandler +public class ContainerHeldItem extends AbstractContainerMenu { private final ItemStack stack; - private final Hand hand; + private final InteractionHand hand; - public ContainerHeldItem( ScreenHandlerType type, int id, PlayerEntity player, Hand hand ) + public ContainerHeldItem( MenuType type, int id, Player player, InteractionHand hand ) { super( type, id ); this.hand = hand; - stack = player.getStackInHand( hand ) + stack = player.getItemInHand( hand ) .copy(); } - public static ContainerHeldItem createPrintout( int id, PlayerInventory inventory, HeldItemContainerData data ) + public static ContainerHeldItem createPrintout( int id, Inventory inventory, HeldItemContainerData data ) { return new ContainerHeldItem( ComputerCraftRegistry.ModContainers.PRINTOUT, id, inventory.player, data.getHand() ); } @@ -48,48 +47,48 @@ public class ContainerHeldItem extends ScreenHandler } @Override - public boolean canUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { if( !player.isAlive() ) { return false; } - ItemStack stack = player.getStackInHand( hand ); + ItemStack stack = player.getItemInHand( hand ); return stack == this.stack || !stack.isEmpty() && !this.stack.isEmpty() && stack.getItem() == this.stack.getItem(); } public static class Factory implements ExtendedScreenHandlerFactory { - private final ScreenHandlerType type; - private final Text name; - private final Hand hand; + private final MenuType type; + private final Component name; + private final InteractionHand hand; - public Factory( ScreenHandlerType type, ItemStack stack, Hand hand ) + public Factory( MenuType type, ItemStack stack, InteractionHand hand ) { this.type = type; - name = stack.getName(); + name = stack.getHoverName(); this.hand = hand; } @Nonnull @Override - public Text getDisplayName() + public Component getDisplayName() { return name; } @Nullable @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory inventory, @Nonnull Player player ) { return new ContainerHeldItem( type, id, player, hand ); } @Override - public void writeScreenOpeningData( ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf ) + public void writeScreenOpeningData( ServerPlayer serverPlayerEntity, FriendlyByteBuf packetByteBuf ) { - packetByteBuf.writeEnumConstant( hand ); + packetByteBuf.writeEnum( hand ); } } } diff --git a/src/main/java/dan200/computercraft/shared/common/DefaultBundledRedstoneProvider.java b/src/main/java/dan200/computercraft/shared/common/DefaultBundledRedstoneProvider.java index b1642f413..97bfd646a 100644 --- a/src/main/java/dan200/computercraft/shared/common/DefaultBundledRedstoneProvider.java +++ b/src/main/java/dan200/computercraft/shared/common/DefaultBundledRedstoneProvider.java @@ -7,22 +7,21 @@ package dan200.computercraft.shared.common; import dan200.computercraft.api.redstone.IBundledRedstoneProvider; -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; public class DefaultBundledRedstoneProvider implements IBundledRedstoneProvider { @Override - public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public int getBundledRedstoneOutput( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ) { return getDefaultBundledRedstoneOutput( world, pos, side ); } - public static int getDefaultBundledRedstoneOutput( World world, BlockPos pos, Direction side ) + public static int getDefaultBundledRedstoneOutput( Level world, BlockPos pos, Direction side ) { Block block = world.getBlockState( pos ) .getBlock(); diff --git a/src/main/java/dan200/computercraft/shared/common/IBundledRedstoneBlock.java b/src/main/java/dan200/computercraft/shared/common/IBundledRedstoneBlock.java index 0be19a1ff..a1dca6e4f 100644 --- a/src/main/java/dan200/computercraft/shared/common/IBundledRedstoneBlock.java +++ b/src/main/java/dan200/computercraft/shared/common/IBundledRedstoneBlock.java @@ -6,13 +6,13 @@ package dan200.computercraft.shared.common; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; public interface IBundledRedstoneBlock { - boolean getBundledRedstoneConnectivity( World world, BlockPos pos, Direction side ); + boolean getBundledRedstoneConnectivity( Level world, BlockPos pos, Direction side ); - int getBundledRedstoneOutput( World world, BlockPos pos, Direction side ); + int getBundledRedstoneOutput( Level world, BlockPos pos, Direction side ); } diff --git a/src/main/java/dan200/computercraft/shared/common/IColouredItem.java b/src/main/java/dan200/computercraft/shared/common/IColouredItem.java index d3e5041ec..50597e449 100644 --- a/src/main/java/dan200/computercraft/shared/common/IColouredItem.java +++ b/src/main/java/dan200/computercraft/shared/common/IColouredItem.java @@ -6,8 +6,8 @@ package dan200.computercraft.shared.common; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; public interface IColouredItem { @@ -20,7 +20,7 @@ public interface IColouredItem static int getColourBasic( ItemStack stack ) { - NbtCompound tag = stack.getNbt(); + CompoundTag tag = stack.getTag(); return tag != null && tag.contains( NBT_COLOUR ) ? tag.getInt( NBT_COLOUR ) : -1; } @@ -35,7 +35,7 @@ public interface IColouredItem { if( colour == -1 ) { - NbtCompound tag = stack.getNbt(); + CompoundTag tag = stack.getTag(); if( tag != null ) { tag.remove( NBT_COLOUR ); @@ -43,7 +43,7 @@ public interface IColouredItem } else { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_COLOUR, colour ); } } diff --git a/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java b/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java index 1adb7207e..87010f4a8 100644 --- a/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java +++ b/src/main/java/dan200/computercraft/shared/common/ServerTerminal.java @@ -8,9 +8,8 @@ package dan200.computercraft.shared.common; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.network.client.TerminalState; -import net.minecraft.nbt.NbtCompound; - import java.util.concurrent.atomic.AtomicBoolean; +import net.minecraft.nbt.CompoundTag; public class ServerTerminal implements ITerminal { @@ -85,12 +84,12 @@ public class ServerTerminal implements ITerminal return new TerminalState( colour, terminal ); } - public void writeDescription( NbtCompound nbt ) + public void writeDescription( CompoundTag nbt ) { nbt.putBoolean( "colour", colour ); if( terminal != null ) { - NbtCompound terminal = new NbtCompound(); + CompoundTag terminal = new CompoundTag(); terminal.putInt( "term_width", this.terminal.getWidth() ); terminal.putInt( "term_height", this.terminal.getHeight() ); this.terminal.writeToNBT( terminal ); diff --git a/src/main/java/dan200/computercraft/shared/common/TileGeneric.java b/src/main/java/dan200/computercraft/shared/common/TileGeneric.java index 787a18442..de99c3dbd 100644 --- a/src/main/java/dan200/computercraft/shared/common/TileGeneric.java +++ b/src/main/java/dan200/computercraft/shared/common/TileGeneric.java @@ -7,16 +7,15 @@ package dan200.computercraft.shared.common; import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; - +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import javax.annotation.Nonnull; public abstract class TileGeneric extends BlockEntity implements BlockEntityClientSerializable @@ -36,16 +35,16 @@ public abstract class TileGeneric extends BlockEntity implements BlockEntityClie public final void updateBlock() { - markDirty(); - BlockPos pos = getPos(); - BlockState state = getCachedState(); - getWorld().updateListeners( pos, state, state, 3 ); + setChanged(); + BlockPos pos = getBlockPos(); + BlockState state = getBlockState(); + getLevel().sendBlockUpdated( pos, state, state, 3 ); } @Nonnull - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - return ActionResult.PASS; + return InteractionResult.PASS; } public void onNeighbourChange( @Nonnull BlockPos neighbour ) @@ -60,9 +59,9 @@ public abstract class TileGeneric extends BlockEntity implements BlockEntityClie { } - public boolean isUsable( PlayerEntity player, boolean ignoreRange ) + public boolean isUsable( Player player, boolean ignoreRange ) { - if( player == null || !player.isAlive() || getWorld().getBlockEntity( getPos() ) != this ) + if( player == null || !player.isAlive() || getLevel().getBlockEntity( getBlockPos() ) != this ) { return false; } @@ -72,33 +71,33 @@ public abstract class TileGeneric extends BlockEntity implements BlockEntityClie } double range = getInteractRange( player ); - BlockPos pos = getPos(); - return player.getEntityWorld() == getWorld() && player.squaredDistanceTo( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ) <= range * range; + BlockPos pos = getBlockPos(); + return player.getCommandSenderWorld() == getLevel() && player.distanceToSqr( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ) <= range * range; } - protected double getInteractRange( PlayerEntity player ) + protected double getInteractRange( Player player ) { return 8.0; } @Override - public void fromClientTag( NbtCompound compoundTag ) + public void fromClientTag( CompoundTag compoundTag ) { readDescription( compoundTag ); } - protected void readDescription( @Nonnull NbtCompound nbt ) + protected void readDescription( @Nonnull CompoundTag nbt ) { } @Override - public NbtCompound toClientTag( NbtCompound compoundTag ) + public CompoundTag toClientTag( CompoundTag compoundTag ) { writeDescription( compoundTag ); return compoundTag; } - protected void writeDescription( @Nonnull NbtCompound nbt ) + protected void writeDescription( @Nonnull CompoundTag nbt ) { } } diff --git a/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java b/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java index a739044e2..b1dbe5778 100644 --- a/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java +++ b/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java @@ -13,18 +13,17 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.lua.*; import dan200.computercraft.shared.computer.blocks.TileCommandComputer; import dan200.computercraft.shared.util.NBTUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.command.CommandManager; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.state.property.Property; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; - +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import java.util.*; /** @@ -66,19 +65,19 @@ public class CommandAPI implements ILuaAPI private Object[] doCommand( String command ) { - MinecraftServer server = computer.getWorld() + MinecraftServer server = computer.getLevel() .getServer(); - if( server == null || !server.areCommandBlocksEnabled() ) + if( server == null || !server.isCommandBlockEnabled() ) { return new Object[] { false, createOutput( "Command blocks disabled by server" ) }; } - CommandManager commandManager = server.getCommandManager(); + Commands commandManager = server.getCommands(); TileCommandComputer.CommandReceiver receiver = computer.getReceiver(); try { receiver.clearOutput(); - int result = commandManager.execute( computer.getSource(), command ); + int result = commandManager.performCommand( computer.getSource(), command ); return new Object[] { result > 0, receiver.copyOutput(), result }; } catch( Throwable t ) @@ -132,14 +131,14 @@ public class CommandAPI implements ILuaAPI @LuaFunction( mainThread = true ) public final List list( IArguments args ) throws LuaException { - MinecraftServer server = computer.getWorld() + MinecraftServer server = computer.getLevel() .getServer(); if( server == null ) { return Collections.emptyList(); } - CommandNode node = server.getCommandManager() + CommandNode node = server.getCommands() .getDispatcher() .getRoot(); for( int j = 0; j < args.count(); j++ ) @@ -176,7 +175,7 @@ public class CommandAPI implements ILuaAPI public final Object[] getBlockPosition() { // This is probably safe to do on the Lua thread. Probably. - BlockPos pos = computer.getPos(); + BlockPos pos = computer.getBlockPos(); return new Object[] { pos.getX(), pos.getY(), pos.getZ() }; } @@ -201,10 +200,10 @@ public class CommandAPI implements ILuaAPI public final List> getBlockInfos( int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) throws LuaException { // Get the details of the block - World world = computer.getWorld(); + Level world = computer.getLevel(); BlockPos min = new BlockPos( Math.min( minX, maxX ), Math.min( minY, maxY ), Math.min( minZ, maxZ ) ); BlockPos max = new BlockPos( Math.max( minX, maxX ), Math.max( minY, maxY ), Math.max( minZ, maxZ ) ); - if( !world.isInBuildLimit( min ) || !world.isInBuildLimit( max ) ) + if( !world.isInWorldBounds( min ) || !world.isInWorldBounds( max ) ) { throw new LuaException( "Co-ordinates out of range" ); } @@ -231,18 +230,18 @@ public class CommandAPI implements ILuaAPI return results; } - private static Map getBlockInfo( World world, BlockPos pos ) + private static Map getBlockInfo( Level world, BlockPos pos ) { // Get the details of the block BlockState state = world.getBlockState( pos ); Block block = state.getBlock(); Map table = new HashMap<>(); - table.put( "name", Registry.BLOCK.getId( block ).toString() ); - table.put( "world", world.getRegistryKey() ); + table.put( "name", Registry.BLOCK.getKey( block ).toString() ); + table.put( "world", world.dimension() ); Map stateTable = new HashMap<>(); - for( ImmutableMap.Entry, Comparable> entry : state.getEntries().entrySet() ) + for( ImmutableMap.Entry, Comparable> entry : state.getValues().entrySet() ) { Property property = entry.getKey(); stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) ); @@ -252,7 +251,7 @@ public class CommandAPI implements ILuaAPI BlockEntity tile = world.getBlockEntity( pos ); if( tile != null ) { - table.put( "nbt", NBTUtil.toLua( tile.writeNbt( new NbtCompound() ) ) ); + table.put( "nbt", NBTUtil.toLua( tile.save( new CompoundTag() ) ) ); } return table; @@ -268,7 +267,7 @@ public class CommandAPI implements ILuaAPI { return value; } - return property.name( value ); + return property.getName( value ); } /** @@ -287,9 +286,9 @@ public class CommandAPI implements ILuaAPI public final Map getBlockInfo( int x, int y, int z ) throws LuaException { // Get the details of the block - World world = computer.getWorld(); + Level world = computer.getLevel(); BlockPos position = new BlockPos( x, y, z ); - if( world.isInBuildLimit( position ) ) + if( world.isInWorldBounds( position ) ) { return getBlockInfo( world, position ); } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java index 39b725791..35e249c34 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java @@ -10,45 +10,44 @@ import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.computer.items.ComputerItemFactory; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; public class BlockComputer extends BlockComputerBase { - public static final EnumProperty STATE = EnumProperty.of( "state", ComputerState.class ); - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final EnumProperty STATE = EnumProperty.create( "state", ComputerState.class ); + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public BlockComputer( Settings settings, ComputerFamily family, BlockEntityType type ) + public BlockComputer( Properties settings, ComputerFamily family, BlockEntityType type ) { super( settings, family, type ); - setDefaultState( getDefaultState().with( FACING, Direction.NORTH ) - .with( STATE, ComputerState.OFF ) ); + registerDefaultState( defaultBlockState().setValue( FACING, Direction.NORTH ) + .setValue( STATE, ComputerState.OFF ) ); } @Nullable @Override - public BlockState getPlacementState( ItemPlacementContext placement ) + public BlockState getStateForPlacement( BlockPlaceContext placement ) { - return getDefaultState().with( FACING, - placement.getPlayerFacing() + return defaultBlockState().setValue( FACING, + placement.getHorizontalDirection() .getOpposite() ); } @Override - protected void appendProperties( StateManager.Builder builder ) + protected void createBlockStateDefinition( StateDefinition.Builder builder ) { builder.add( FACING, STATE ); } @@ -72,7 +71,7 @@ public class BlockComputer extends BlockComputerBase @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileComputer( getFamily(), getTypeByFamily( getFamily() ), pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java index 7a366c74a..f2cc48927 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java @@ -13,34 +13,33 @@ import dan200.computercraft.shared.common.IBundledRedstoneBlock; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.items.IComputerItem; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityTicker; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.stat.Stats; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.stats.Stats; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; public abstract class BlockComputerBase extends BlockGeneric implements IBundledRedstoneBlock { - private static final Identifier DROP = new Identifier( ComputerCraft.MOD_ID, "computer" ); + private static final ResourceLocation DROP = new ResourceLocation( ComputerCraft.MOD_ID, "computer" ); private final ComputerFamily family; - protected BlockComputerBase( Settings settings, ComputerFamily family, BlockEntityType type ) + protected BlockComputerBase( Properties settings, ComputerFamily family, BlockEntityType type ) { super( settings, type ); this.family = family; @@ -48,9 +47,9 @@ public abstract class BlockComputerBase extends Bloc @Override @Deprecated - public void onBlockAdded( @Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState oldState, boolean isMoving ) + public void onPlace( @Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState oldState, boolean isMoving ) { - super.onBlockAdded( state, world, pos, oldState, isMoving ); + super.onPlace( state, world, pos, oldState, isMoving ); BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileComputerBase ) @@ -61,21 +60,21 @@ public abstract class BlockComputerBase extends Bloc @Override @Deprecated - public boolean emitsRedstonePower( @Nonnull BlockState state ) + public boolean isSignalSource( @Nonnull BlockState state ) { return true; } @Override @Deprecated - public int getWeakRedstonePower( @Nonnull BlockState state, @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull Direction incomingSide ) + public int getSignal( @Nonnull BlockState state, @Nonnull BlockGetter world, @Nonnull BlockPos pos, @Nonnull Direction incomingSide ) { - return getStrongRedstonePower( state, world, pos, incomingSide ); + return getDirectSignal( state, world, pos, incomingSide ); } @Override @Deprecated - public int getStrongRedstonePower( @Nonnull BlockState state, BlockView world, @Nonnull BlockPos pos, @Nonnull Direction incomingSide ) + public int getDirectSignal( @Nonnull BlockState state, BlockGetter world, @Nonnull BlockPos pos, @Nonnull Direction incomingSide ) { BlockEntity entity = world.getBlockEntity( pos ); if( !(entity instanceof TileComputerBase) ) @@ -100,13 +99,13 @@ public abstract class BlockComputerBase extends Bloc } @Override - public boolean getBundledRedstoneConnectivity( World world, BlockPos pos, Direction side ) + public boolean getBundledRedstoneConnectivity( Level world, BlockPos pos, Direction side ) { return true; } @Override - public int getBundledRedstoneOutput( World world, BlockPos pos, Direction side ) + public int getBundledRedstoneOutput( Level world, BlockPos pos, Direction side ) { BlockEntity entity = world.getBlockEntity( pos ); if( !(entity instanceof TileComputerBase) ) @@ -126,21 +125,21 @@ public abstract class BlockComputerBase extends Bloc } @Override - public void afterBreak( @Nonnull World world, PlayerEntity player, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable BlockEntity tile, + public void playerDestroy( @Nonnull Level world, Player player, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable BlockEntity tile, @Nonnull ItemStack tool ) { // Don't drop blocks here - see onBlockHarvested. - player.incrementStat( Stats.MINED.getOrCreateStat( this ) ); - player.addExhaustion( 0.005F ); + player.awardStat( Stats.BLOCK_MINED.get( this ) ); + player.causeFoodExhaustion( 0.005F ); } @Override - public void onPlaced( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, @Nonnull ItemStack stack ) + public void setPlacedBy( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, @Nonnull ItemStack stack ) { - super.onPlaced( world, pos, state, placer, stack ); + super.setPlacedBy( world, pos, state, placer, stack ); BlockEntity tile = world.getBlockEntity( pos ); - if( !world.isClient && tile instanceof IComputerTile && stack.getItem() instanceof IComputerItem ) + if( !world.isClientSide && tile instanceof IComputerTile && stack.getItem() instanceof IComputerItem ) { IComputerTile computer = (IComputerTile) tile; IComputerItem item = (IComputerItem) stack.getItem(); @@ -161,7 +160,7 @@ public abstract class BlockComputerBase extends Bloc @Nonnull @Override - public ItemStack getPickStack( BlockView world, BlockPos pos, BlockState state ) + public ItemStack getCloneItemStack( BlockGetter world, BlockPos pos, BlockState state ) { BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileComputerBase ) @@ -173,23 +172,23 @@ public abstract class BlockComputerBase extends Bloc } } - return super.getPickStack( world, pos, state ); + return super.getCloneItemStack( world, pos, state ); } @Nonnull protected abstract ItemStack getItem( TileComputerBase tile ); @Override - public void onBreak( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull PlayerEntity player ) + public void playerWillDestroy( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull Player player ) { // Call super as it is what provides sound and block break particles. Does not do anything else. - super.onBreak( world, pos, state, player ); + super.playerWillDestroy( world, pos, state, player ); - if( !(world instanceof ServerWorld) ) + if( !(world instanceof ServerLevel) ) { return; } - ServerWorld serverWorld = (ServerWorld) world; + ServerLevel serverWorld = (ServerLevel) world; // We drop the item here instead of doing it in the harvest method, as we should // drop computers for creative players too. @@ -198,26 +197,26 @@ public abstract class BlockComputerBase extends Bloc if( tile instanceof TileComputerBase ) { TileComputerBase computer = (TileComputerBase) tile; - LootContext.Builder context = new LootContext.Builder( serverWorld ).random( world.random ) - .parameter( LootContextParameters.ORIGIN, Vec3d.ofCenter( pos ) ) - .parameter( LootContextParameters.TOOL, player.getMainHandStack() ) - .parameter( LootContextParameters.THIS_ENTITY, player ) - .parameter( LootContextParameters.BLOCK_ENTITY, tile ) - .putDrop( DROP, ( ctx, out ) -> out.accept( getItem( computer ) ) ); - for( ItemStack item : state.getDroppedStacks( context ) ) + LootContext.Builder context = new LootContext.Builder( serverWorld ).withRandom( world.random ) + .withParameter( LootContextParams.ORIGIN, Vec3.atCenterOf( pos ) ) + .withParameter( LootContextParams.TOOL, player.getMainHandItem() ) + .withParameter( LootContextParams.THIS_ENTITY, player ) + .withParameter( LootContextParams.BLOCK_ENTITY, tile ) + .withDynamicDrop( DROP, ( ctx, out ) -> out.accept( getItem( computer ) ) ); + for( ItemStack item : state.getDrops( context ) ) { - dropStack( world, pos, item ); + popResource( world, pos, item ); } - state.onStacksDropped( serverWorld, pos, player.getMainHandStack() ); + state.spawnAfterBreak( serverWorld, pos, player.getMainHandItem() ); } } @Nullable @Override - public BlockEntityTicker getTicker( World world, BlockState state, BlockEntityType type ) + public BlockEntityTicker getTicker( Level world, BlockState state, BlockEntityType type ) { - return world.isClient ? null : ( world1, pos, state1, tile ) -> { + return world.isClientSide ? null : ( world1, pos, state1, tile ) -> { if ( tile instanceof TileComputerBase computer ) { computer.serverTick(); diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileCommandComputer.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileCommandComputer.java index c9cc998e1..55d69dc16 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileCommandComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileCommandComputer.java @@ -10,21 +10,20 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.shared.computer.apis.CommandAPI; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.commands.CommandSource; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.command.CommandOutput; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameRules; - +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec2; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; import java.util.HashMap; import java.util.Map; @@ -45,7 +44,7 @@ public class TileCommandComputer extends TileComputer return receiver; } - public ServerCommandSource getSource() + public CommandSourceStack getSource() { ServerComputer computer = getServerComputer(); String name = "@"; @@ -58,14 +57,14 @@ public class TileCommandComputer extends TileComputer } } - return new ServerCommandSource( receiver, - new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ), - Vec2f.ZERO, - (ServerWorld) getWorld(), + return new CommandSourceStack( receiver, + new Vec3( worldPosition.getX() + 0.5, worldPosition.getY() + 0.5, worldPosition.getZ() + 0.5 ), + Vec2.ZERO, + (ServerLevel) getLevel(), 2, name, - new LiteralText( name ), - getWorld().getServer(), + new TextComponent( name ), + getLevel().getServer(), null ); } @@ -78,30 +77,30 @@ public class TileCommandComputer extends TileComputer } @Override - public boolean isUsable( PlayerEntity player, boolean ignoreRange ) + public boolean isUsable( Player player, boolean ignoreRange ) { return isUsable( player ) && super.isUsable( player, ignoreRange ); } - public static boolean isUsable( PlayerEntity player ) + public static boolean isUsable( Player player ) { MinecraftServer server = player.getServer(); - if( server == null || !server.areCommandBlocksEnabled() ) + if( server == null || !server.isCommandBlockEnabled() ) { - player.sendMessage( new TranslatableText( "advMode.notEnabled" ), true ); + player.displayClientMessage( new TranslatableComponent( "advMode.notEnabled" ), true ); return false; } - else if( ComputerCraft.commandRequireCreative ? !player.isCreativeLevelTwoOp() : !server.getPlayerManager() - .isOperator( player.getGameProfile() ) ) + else if( ComputerCraft.commandRequireCreative ? !player.canUseGameMasterBlocks() : !server.getPlayerList() + .isOp( player.getGameProfile() ) ) { - player.sendMessage( new TranslatableText( "advMode.notAllowed" ), true ); + player.displayClientMessage( new TranslatableComponent( "advMode.notAllowed" ), true ); return false; } return true; } - public class CommandReceiver implements CommandOutput + public class CommandReceiver implements CommandSource { private final Map output = new HashMap<>(); @@ -121,29 +120,29 @@ public class TileCommandComputer extends TileComputer } @Override - public void sendSystemMessage( @Nonnull Text textComponent, @Nonnull UUID id ) + public void sendMessage( @Nonnull Component textComponent, @Nonnull UUID id ) { output.put( output.size() + 1, textComponent.getString() ); } @Override - public boolean shouldReceiveFeedback() + public boolean acceptsSuccess() { - return getWorld().getGameRules() - .getBoolean( GameRules.SEND_COMMAND_FEEDBACK ); + return getLevel().getGameRules() + .getBoolean( GameRules.RULE_SENDCOMMANDFEEDBACK ); } @Override - public boolean shouldTrackOutput() + public boolean acceptsFailure() { return true; } @Override - public boolean shouldBroadcastConsoleToOps() + public boolean shouldInformAdmins() { - return getWorld().getGameRules() - .getBoolean( GameRules.COMMAND_BLOCK_OUTPUT ); + return getLevel().getGameRules() + .getBoolean( GameRules.RULE_COMMANDBLOCKOUTPUT ); } } } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java index 280f4c4d5..0af1ae53a 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java @@ -13,16 +13,15 @@ import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; public class TileComputer extends TileComputerBase { @@ -33,7 +32,7 @@ public class TileComputer extends TileComputerBase super( type, family, pos, state ); } - public boolean isUsableByPlayer( PlayerEntity player ) + public boolean isUsableByPlayer( Player player ) { return isUsable( player, false ); } @@ -41,17 +40,17 @@ public class TileComputer extends TileComputerBase @Override protected void updateBlockState( ComputerState newState ) { - BlockState existing = getCachedState(); - if( existing.get( BlockComputer.STATE ) != newState ) + BlockState existing = getBlockState(); + if( existing.getValue( BlockComputer.STATE ) != newState ) { - getWorld().setBlockState( getPos(), existing.with( BlockComputer.STATE, newState ), 3 ); + getLevel().setBlock( getBlockPos(), existing.setValue( BlockComputer.STATE, newState ), 3 ); } } @Override public Direction getDirection() { - return getCachedState().get( BlockComputer.FACING ); + return getBlockState().getValue( BlockComputer.FACING ); } @Override @@ -74,13 +73,13 @@ public class TileComputer extends TileComputerBase protected ServerComputer createComputer( int instanceID, int id ) { ComputerFamily family = getFamily(); - ServerComputer computer = new ServerComputer( getWorld(), + ServerComputer computer = new ServerComputer( getLevel(), id, label, instanceID, family, ComputerCraft.computerTermWidth, ComputerCraft.computerTermHeight ); - computer.setPosition( getPos() ); + computer.setPosition( getBlockPos() ); return computer; } @@ -103,7 +102,7 @@ public class TileComputer extends TileComputerBase @Nullable @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory inventory, @Nonnull Player player ) { return new ComputerMenuWithoutInventory( ComputerCraftRegistry.ModContainers.COMPUTER, id, inventory, this::isUsableByPlayer, createServerComputer(), getFamily() ); } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java index 0e6955f9c..47292b391 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -21,27 +21,26 @@ import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.RedstoneUtil; import joptsimple.internal.Strings; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.RedstoneWireBlock; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Nameable; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.Nameable; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RedStoneWireBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Objects; @@ -72,7 +71,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT unload(); for( Direction dir : DirectionUtil.FACINGS ) { - RedstoneUtil.propagateRedstoneOutput( getWorld(), getPos(), dir ); + RedstoneUtil.propagateRedstoneOutput( getLevel(), getBlockPos(), dir ); } } @@ -86,7 +85,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT { if( instanceID >= 0 ) { - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { ComputerCraft.serverComputerRegistry.remove( instanceID ); } @@ -96,42 +95,42 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - ItemStack currentItem = player.getStackInHand( hand ); - if( !currentItem.isEmpty() && currentItem.getItem() == Items.NAME_TAG && canNameWithTag( player ) && currentItem.hasCustomName() ) + ItemStack currentItem = player.getItemInHand( hand ); + if( !currentItem.isEmpty() && currentItem.getItem() == Items.NAME_TAG && canNameWithTag( player ) && currentItem.hasCustomHoverName() ) { // Label to rename computer - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { - setLabel( currentItem.getName() + setLabel( currentItem.getHoverName() .getString() ); - currentItem.decrement( 1 ); + currentItem.shrink( 1 ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - else if( !player.isInSneakingPose() ) + else if( !player.isCrouching() ) { // Regular right click to activate computer - if( !getWorld().isClient && isUsable( player, false ) ) + if( !getLevel().isClientSide && isUsable( player, false ) ) { createServerComputer().turnOn(); createServerComputer().sendTerminalState( player ); new ComputerContainerData( createServerComputer() ).open( player, this ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.PASS; + return InteractionResult.PASS; } - protected boolean canNameWithTag( PlayerEntity player ) + protected boolean canNameWithTag( Player player ) { return false; } public ServerComputer createServerComputer() { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { return null; } @@ -159,14 +158,14 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT public ServerComputer getServerComputer() { - return getWorld().isClient ? null : ComputerCraft.serverComputerRegistry.get( instanceID ); + return getLevel().isClientSide ? null : ComputerCraft.serverComputerRegistry.get( instanceID ); } protected abstract ServerComputer createComputer( int instanceID, int id ); public void updateInput() { - if( getWorld() == null || getWorld().isClient ) + if( getLevel() == null || getLevel().isClientSide ) { return; } @@ -181,7 +180,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT BlockPos pos = computer.getPosition(); for( Direction dir : DirectionUtil.FACINGS ) { - updateSideInput( computer, dir, pos.offset( dir ) ); + updateSideInput( computer, dir, pos.relative( dir ) ); } } @@ -190,11 +189,11 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT Direction offsetSide = dir.getOpposite(); ComputerSide localDir = remapToLocalSide( dir ); - computer.setRedstoneInput( localDir, getRedstoneInput( world, offset, dir ) ); - computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getWorld(), offset, offsetSide ) ); + computer.setRedstoneInput( localDir, getRedstoneInput( level, offset, dir ) ); + computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getLevel(), offset, offsetSide ) ); if( !isPeripheralBlockedOnSide( localDir ) ) { - IPeripheral peripheral = Peripherals.getPeripheral( getWorld(), offset, offsetSide ); + IPeripheral peripheral = Peripherals.getPeripheral( getLevel(), offset, offsetSide ); computer.setPeripheral( localDir, peripheral ); } } @@ -212,16 +211,16 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT * @param side The side we are reading from * @return The effective redstone power */ - protected static int getRedstoneInput( World world, BlockPos pos, Direction side ) + protected static int getRedstoneInput( Level world, BlockPos pos, Direction side ) { - int power = world.getEmittedRedstonePower( pos, side ); + int power = world.getSignal( pos, side ); if( power >= 15 ) { return power; } BlockState neighbour = world.getBlockState( pos ); - return neighbour.getBlock() == Blocks.REDSTONE_WIRE ? Math.max( power, neighbour.get( RedstoneWireBlock.POWER ) ) : power; + return neighbour.getBlock() == Blocks.REDSTONE_WIRE ? Math.max( power, neighbour.getValue( RedStoneWireBlock.POWER ) ) : power; } protected boolean isPeripheralBlockedOnSide( ComputerSide localSide ) @@ -249,7 +248,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT } @Override - protected void readDescription( @Nonnull NbtCompound nbt ) + protected void readDescription( @Nonnull CompoundTag nbt ) { super.readDescription( nbt ); label = nbt.contains( NBT_LABEL ) ? nbt.getString( NBT_LABEL ) : null; @@ -257,7 +256,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT } @Override - protected void writeDescription( @Nonnull NbtCompound nbt ) + protected void writeDescription( @Nonnull CompoundTag nbt ) { super.writeDescription( nbt ); if( label != null ) @@ -313,16 +312,16 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT updateBlock(); for( Direction dir : DirectionUtil.FACINGS ) { - RedstoneUtil.propagateRedstoneOutput( getWorld(), getPos(), dir ); + RedstoneUtil.propagateRedstoneOutput( getLevel(), getBlockPos(), dir ); } } protected abstract void updateBlockState( ComputerState newState ); @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); + super.load( nbt ); // Load ID, label and power state computerID = nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1; @@ -332,7 +331,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT @Nonnull @Override - public NbtCompound writeNbt( @Nonnull NbtCompound nbt ) + public CompoundTag save( @Nonnull CompoundTag nbt ) { // Save ID, label and power state if( computerID >= 0 ) @@ -344,19 +343,19 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT nbt.putString( NBT_LABEL, label ); } nbt.putBoolean( NBT_ON, on ); - return super.writeNbt( nbt ); + return super.save( nbt ); } @Override - public void markRemoved() + public void setRemoved() { unload(); - super.markRemoved(); + super.setRemoved(); } private void updateInput( BlockPos neighbour ) { - if( getWorld() == null || this.world.isClient ) + if( getLevel() == null || this.level.isClientSide ) { return; } @@ -369,7 +368,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT for( Direction dir : DirectionUtil.FACINGS ) { - BlockPos offset = pos.offset( dir ); + BlockPos offset = worldPosition.relative( dir ); if( offset.equals( neighbour ) ) { updateSideInput( computer, dir, offset ); @@ -383,7 +382,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT private void updateInput( Direction dir ) { - if( getWorld() == null || this.world.isClient ) + if( getLevel() == null || this.level.isClientSide ) { return; } @@ -394,7 +393,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT return; } - updateSideInput( computer, dir, pos.offset( dir ) ); + updateSideInput( computer, dir, worldPosition.relative( dir ) ); } @Override @@ -406,7 +405,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT @Override public final void setComputerID( int id ) { - if( this.world.isClient || computerID == id ) + if( this.level.isClientSide || computerID == id ) { return; } @@ -417,7 +416,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT { computer.setID( computerID ); } - markDirty(); + setChanged(); } @Override @@ -431,7 +430,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT @Override public final void setLabel( String label ) { - if( this.world.isClient || Objects.equals( this.label, label ) ) + if( this.level.isClientSide || Objects.equals( this.label, label ) ) { return; } @@ -442,7 +441,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT { computer.setLabel( label ); } - markDirty(); + setChanged(); } @Override @@ -477,10 +476,10 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT @Nonnull @Override - public Text getName() + public Component getName() { - return hasCustomName() ? new LiteralText( label ) : new TranslatableText( getCachedState().getBlock() - .getTranslationKey() ); + return hasCustomName() ? new TextComponent( label ) : new TranslatableComponent( getBlockState().getBlock() + .getDescriptionId() ); } @Override @@ -491,22 +490,22 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT @Nonnull @Override - public Text getDisplayName() + public Component getDisplayName() { return Nameable.super.getDisplayName(); } @Nullable @Override - public Text getCustomName() + public Component getCustomName() { - return hasCustomName() ? new LiteralText( label ) : null; + return hasCustomName() ? new TextComponent( label ) : null; } @Override - public void writeScreenOpeningData( ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf ) + public void writeScreenOpeningData( ServerPlayer serverPlayerEntity, FriendlyByteBuf packetByteBuf ) { packetByteBuf.writeInt( getServerComputer().getInstanceID() ); - packetByteBuf.writeEnumConstant( getServerComputer().getFamily() ); + packetByteBuf.writeEnum( getServerComputer().getFamily() ); } } diff --git a/src/main/java/dan200/computercraft/shared/computer/core/ClientComputer.java b/src/main/java/dan200/computercraft/shared/computer/core/ClientComputer.java index 615b65eef..df0a18625 100644 --- a/src/main/java/dan200/computercraft/shared/computer/core/ClientComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/core/ClientComputer.java @@ -9,7 +9,7 @@ package dan200.computercraft.shared.computer.core; import dan200.computercraft.shared.common.ClientTerminal; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.server.*; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; public class ClientComputer extends ClientTerminal implements IComputer { @@ -17,7 +17,7 @@ public class ClientComputer extends ClientTerminal implements IComputer private boolean on = false; private boolean blinking = false; - private NbtCompound userData = null; + private CompoundTag userData = null; public ClientComputer( int instanceID ) @@ -26,7 +26,7 @@ public class ClientComputer extends ClientTerminal implements IComputer this.instanceID = instanceID; } - public NbtCompound getUserData() + public CompoundTag getUserData() { return userData; } @@ -123,7 +123,7 @@ public class ClientComputer extends ClientTerminal implements IComputer NetworkHandler.sendToServer( new MouseEventServerMessage( instanceID, MouseEventServerMessage.TYPE_SCROLL, direction, x, y ) ); } - public void setState( ComputerState state, NbtCompound userData ) + public void setState( ComputerState state, CompoundTag userData ) { on = state != ComputerState.OFF; blinking = state == ComputerState.BLINKING; diff --git a/src/main/java/dan200/computercraft/shared/computer/core/ComputerState.java b/src/main/java/dan200/computercraft/shared/computer/core/ComputerState.java index 29e427049..c2a9873c1 100644 --- a/src/main/java/dan200/computercraft/shared/computer/core/ComputerState.java +++ b/src/main/java/dan200/computercraft/shared/computer/core/ComputerState.java @@ -6,11 +6,10 @@ package dan200.computercraft.shared.computer.core; -import net.minecraft.util.StringIdentifiable; - import javax.annotation.Nonnull; +import net.minecraft.util.StringRepresentable; -public enum ComputerState implements StringIdentifiable +public enum ComputerState implements StringRepresentable { OFF( "off", "" ), ON( "on", "_on" ), BLINKING( "blinking", "_blink" ); @@ -25,7 +24,7 @@ public enum ComputerState implements StringIdentifiable @Nonnull @Override - public String asString() + public String getSerializedName() { return name; } diff --git a/src/main/java/dan200/computercraft/shared/computer/core/IContainerComputer.java b/src/main/java/dan200/computercraft/shared/computer/core/IContainerComputer.java index d3ff52edf..442fbd8d8 100644 --- a/src/main/java/dan200/computercraft/shared/computer/core/IContainerComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/core/IContainerComputer.java @@ -8,10 +8,9 @@ package dan200.computercraft.shared.computer.core; import dan200.computercraft.shared.computer.upload.FileSlice; import dan200.computercraft.shared.computer.upload.FileUpload; -import net.minecraft.server.network.ServerPlayerEntity; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.server.level.ServerPlayer; import java.util.List; import java.util.UUID; @@ -61,7 +60,7 @@ public interface IContainerComputer * @param uploader The player uploading files. * @param uploadId The unique ID of this upload. */ - void finishUpload( @Nonnull ServerPlayerEntity uploader, @Nonnull UUID uploadId ); + void finishUpload( @Nonnull ServerPlayer uploader, @Nonnull UUID uploadId ); /** * Continue an upload. @@ -69,5 +68,5 @@ public interface IContainerComputer * @param uploader The player uploading files. * @param overwrite Whether the files should be overwritten or not. */ - void confirmUpload( @Nonnull ServerPlayerEntity uploader, boolean overwrite ); + void confirmUpload( @Nonnull ServerPlayer uploader, boolean overwrite ); } diff --git a/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java b/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java index 8204424c9..11358dd53 100644 --- a/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java @@ -24,13 +24,12 @@ import dan200.computercraft.shared.network.client.ComputerDataClientMessage; import dan200.computercraft.shared.network.client.ComputerDeletedClientMessage; import dan200.computercraft.shared.network.client.ComputerTerminalClientMessage; import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.ScreenHandler; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.Level; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.InputStream; @@ -40,15 +39,15 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput private final int instanceID; private final ComputerFamily family; private final Computer computer; - private World world; + private Level world; private BlockPos position; - private NbtCompound userData; + private CompoundTag userData; private boolean changed; private boolean changedLastFrame; private int ticksSincePing; - public ServerComputer( World world, int computerID, String label, int instanceID, ComputerFamily family, int terminalWidth, int terminalHeight ) + public ServerComputer( Level world, int computerID, String label, int instanceID, ComputerFamily family, int terminalWidth, int terminalHeight ) { super( family != ComputerFamily.NORMAL, terminalWidth, terminalHeight ); this.instanceID = instanceID; @@ -71,12 +70,12 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput return family; } - public World getWorld() + public Level getWorld() { return world; } - public void setWorld( World world ) + public void setWorld( Level world ) { this.world = world; } @@ -128,11 +127,11 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput computer.unload(); } - public NbtCompound getUserData() + public CompoundTag getUserData() { if( userData == null ) { - userData = new NbtCompound(); + userData = new CompoundTag(); } return userData; } @@ -162,8 +161,8 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput // Send terminal state to clients who are currently interacting with the computer. NetworkMessage packet = null; - for( PlayerEntity player : server.getPlayerManager() - .getPlayerList() ) + for( Player player : server.getPlayerList() + .getPlayers() ) { if( isInteracting( player ) ) { @@ -188,7 +187,7 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput return new ComputerDataClientMessage( this ); } - protected boolean isInteracting( PlayerEntity player ) + protected boolean isInteracting( Player player ) { return getContainer( player ) != null; } @@ -199,14 +198,14 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput } @Nullable - public IContainerComputer getContainer( PlayerEntity player ) + public IContainerComputer getContainer( Player player ) { if( player == null ) { return null; } - ScreenHandler container = player.currentScreenHandler; + AbstractContainerMenu container = player.containerMenu; if( !(container instanceof IContainerComputer) ) { return null; @@ -264,13 +263,13 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput return computer.isOn() && computer.isBlinking(); } - public void sendComputerState( PlayerEntity player ) + public void sendComputerState( Player player ) { // Send state to client NetworkHandler.sendToPlayer( player, createComputerPacket() ); } - public void sendTerminalState( PlayerEntity player ) + public void sendTerminalState( Player player ) { // Send terminal state to client NetworkHandler.sendToPlayer( player, createTerminalPacket() ); @@ -352,13 +351,13 @@ public class ServerComputer extends ServerTerminal implements IComputer, IComput @Override public int getDay() { - return (int) ((world.getTimeOfDay() + 6000) / 24000) + 1; + return (int) ((world.getDayTime() + 6000) / 24000) + 1; } @Override public double getTimeOfDay() { - return (world.getTimeOfDay() + 6000) % 24000 / 1000.0; + return (world.getDayTime() + 6000) % 24000 / 1000.0; } @Override diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java index f3384de72..849f3e307 100644 --- a/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java @@ -9,11 +9,10 @@ import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.IComputer; import dan200.computercraft.shared.network.container.ComputerContainerData; import dan200.computercraft.shared.util.InvisibleSlot; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.ScreenHandlerType; - import java.util.function.Predicate; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.MenuType; /** * A computer menu which does not have any visible inventory. @@ -22,19 +21,19 @@ import java.util.function.Predicate; */ public class ComputerMenuWithoutInventory extends ContainerComputerBase { - public ComputerMenuWithoutInventory( ScreenHandlerType type, int id, PlayerInventory player, Predicate canUse, IComputer computer, ComputerFamily family ) + public ComputerMenuWithoutInventory( MenuType type, int id, Inventory player, Predicate canUse, IComputer computer, ComputerFamily family ) { super( type, id, canUse, computer, family ); addSlots( player ); } - public ComputerMenuWithoutInventory( ScreenHandlerType type, int id, PlayerInventory player, ComputerContainerData data ) + public ComputerMenuWithoutInventory( MenuType type, int id, Inventory player, ComputerContainerData data ) { super( type, id, player, data ); addSlots( player ); } - private void addSlots( PlayerInventory player ) + private void addSlots( Inventory player ) { for( int i = 0; i < 9; i++ ) addSlot( new InvisibleSlot( player, i ) ); } diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java index 8ea9bbc7e..e49be66a0 100644 --- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java @@ -17,26 +17,25 @@ import dan200.computercraft.shared.computer.upload.UploadResult; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.client.UploadResultMessage; import dan200.computercraft.shared.network.container.ComputerContainerData; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.TranslatableText; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; import java.io.IOException; import java.nio.channels.WritableByteChannel; import java.util.*; import java.util.function.Function; import java.util.function.Predicate; -public abstract class ContainerComputerBase extends ScreenHandler implements IContainerComputer +public abstract class ContainerComputerBase extends AbstractContainerMenu implements IContainerComputer { private static final String LIST_PREFIX = "\n \u2022 "; - private final Predicate canUse; + private final Predicate canUse; private final IComputer computer; private final ComputerFamily family; private final InputState input = new InputState( this ); @@ -44,7 +43,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo private UUID toUploadId; private List toUpload; - public ContainerComputerBase( ScreenHandlerType type, int id, PlayerInventory player, ComputerContainerData data ) + public ContainerComputerBase( MenuType type, int id, Inventory player, ComputerContainerData data ) { this( type, id, @@ -53,7 +52,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo data.getFamily() ); } - public ContainerComputerBase( ScreenHandlerType type, int id, Predicate canUse, IComputer computer, + public ContainerComputerBase( MenuType type, int id, Predicate canUse, IComputer computer, ComputerFamily family ) { super( type, id ); @@ -62,10 +61,10 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo this.family = family; } - protected static IComputer getComputer( PlayerInventory player, ComputerContainerData data ) + protected static IComputer getComputer( Inventory player, ComputerContainerData data ) { int id = data.getInstanceId(); - if( !player.player.world.isClient ) + if( !player.player.level.isClientSide ) { return ComputerCraft.serverComputerRegistry.get( id ); } @@ -99,14 +98,14 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo } @Override - public void close( @Nonnull PlayerEntity player ) + public void removed( @Nonnull Player player ) { - super.close( player ); + super.removed( player ); input.close(); } @Override - public boolean canUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { return canUse.test( player ); } @@ -131,7 +130,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo } @Override - public void finishUpload( @Nonnull ServerPlayerEntity uploader, @Nonnull UUID uploadId ) + public void finishUpload( @Nonnull ServerPlayer uploader, @Nonnull UUID uploadId ) { if( toUploadId == null || toUpload == null || toUpload.isEmpty() || !toUploadId.equals( uploadId ) ) { @@ -144,7 +143,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo } @Override - public void confirmUpload( @Nonnull ServerPlayerEntity uploader, boolean overwrite ) + public void confirmUpload( @Nonnull ServerPlayer uploader, boolean overwrite ) { if( toUploadId == null || toUpload == null || toUpload.isEmpty() ) { @@ -170,7 +169,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo if( !upload.checksumMatches() ) { ComputerCraft.log.warn( "Checksum failed to match for {}.", upload.getName() ); - return new UploadResultMessage( UploadResult.ERROR, new TranslatableText( "gui.computercraft.upload.failed.corrupted" ) ); + return new UploadResultMessage( UploadResult.ERROR, new TranslatableComponent( "gui.computercraft.upload.failed.corrupted" ) ); } } @@ -186,7 +185,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo { return new UploadResultMessage( UploadResult.ERROR, - new TranslatableText( "gui.computercraft.upload.failed.overwrite_dir", upload.getName() ) + new TranslatableComponent( "gui.computercraft.upload.failed.overwrite_dir", upload.getName() ) ); } @@ -200,7 +199,7 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo toUpload = files; return new UploadResultMessage( UploadResult.CONFIRM_OVERWRITE, - new TranslatableText( "gui.computercraft.upload.overwrite.detail", joiner.toString() ) + new TranslatableComponent( "gui.computercraft.upload.overwrite.detail", joiner.toString() ) ); } @@ -219,13 +218,13 @@ public abstract class ContainerComputerBase extends ScreenHandler implements ICo } return new UploadResultMessage( - UploadResult.SUCCESS, new TranslatableText( "gui.computercraft.upload.success.msg", files.size() ) + UploadResult.SUCCESS, new TranslatableComponent( "gui.computercraft.upload.success.msg", files.size() ) ); } catch( FileSystemException | IOException e ) { ComputerCraft.log.error( "Error uploading files", e ); - return new UploadResultMessage( UploadResult.ERROR, new TranslatableText( "gui.computercraft.upload.failed.generic", e.getMessage() ) ); + return new UploadResultMessage( UploadResult.ERROR, new TranslatableComponent( "gui.computercraft.upload.failed.generic", e.getMessage() ) ); } } } diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java index 341908650..9f186b4cb 100644 --- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java @@ -12,30 +12,29 @@ import dan200.computercraft.shared.computer.blocks.TileCommandComputer; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.network.container.ViewComputerContainerData; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; - import javax.annotation.Nonnull; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; public class ContainerViewComputer extends ComputerMenuWithoutInventory { private final int width; private final int height; - public ContainerViewComputer( int id, PlayerInventory player, ServerComputer computer ) + public ContainerViewComputer( int id, Inventory player, ServerComputer computer ) { super( ComputerCraftRegistry.ModContainers.VIEW_COMPUTER, id, player, p -> canInteractWith( computer, p ), computer, computer.getFamily() ); width = height = 0; } - public ContainerViewComputer( int id, PlayerInventory player, ViewComputerContainerData data ) + public ContainerViewComputer( int id, Inventory player, ViewComputerContainerData data ) { super( ComputerCraftRegistry.ModContainers.VIEW_COMPUTER, id, player, data ); width = data.getWidth(); height = data.getHeight(); } - private static boolean canInteractWith( @Nonnull ServerComputer computer, @Nonnull PlayerEntity player ) + private static boolean canInteractWith( @Nonnull ServerComputer computer, @Nonnull Player player ) { // If this computer no longer exists then discard it. if( ComputerCraft.serverComputerRegistry.get( computer.getInstanceID() ) != computer ) diff --git a/src/main/java/dan200/computercraft/shared/computer/items/ComputerItemFactory.java b/src/main/java/dan200/computercraft/shared/computer/items/ComputerItemFactory.java index b267240c5..0394db48b 100644 --- a/src/main/java/dan200/computercraft/shared/computer/items/ComputerItemFactory.java +++ b/src/main/java/dan200/computercraft/shared/computer/items/ComputerItemFactory.java @@ -9,9 +9,8 @@ package dan200.computercraft.shared.computer.items; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.computer.blocks.TileComputer; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; public final class ComputerItemFactory { diff --git a/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java b/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java index e887dbb6b..aa26b0c68 100644 --- a/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java +++ b/src/main/java/dan200/computercraft/shared/computer/items/IComputerItem.java @@ -7,10 +7,9 @@ package dan200.computercraft.shared.computer.items; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; - import javax.annotation.Nonnull; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; public interface IComputerItem { @@ -18,13 +17,13 @@ public interface IComputerItem default int getComputerID( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1; } default String getLabel( @Nonnull ItemStack stack ) { - return stack.hasCustomName() ? stack.getName() + return stack.hasCustomHoverName() ? stack.getHoverName() .getString() : null; } diff --git a/src/main/java/dan200/computercraft/shared/computer/items/ItemComputer.java b/src/main/java/dan200/computercraft/shared/computer/items/ItemComputer.java index 3fc0370e8..ad0563612 100644 --- a/src/main/java/dan200/computercraft/shared/computer/items/ItemComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/items/ItemComputer.java @@ -8,14 +8,13 @@ package dan200.computercraft.shared.computer.items; import dan200.computercraft.shared.computer.blocks.BlockComputer; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.item.ItemStack; -import net.minecraft.text.LiteralText; - import javax.annotation.Nonnull; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.item.ItemStack; public class ItemComputer extends ItemComputerBase { - public ItemComputer( BlockComputer block, Settings settings ) + public ItemComputer( BlockComputer block, Properties settings ) { super( block, settings ); } @@ -25,12 +24,12 @@ public class ItemComputer extends ItemComputerBase ItemStack result = new ItemStack( this ); if( id >= 0 ) { - result.getOrCreateNbt() + result.getOrCreateTag() .putInt( NBT_ID, id ); } if( label != null ) { - result.setCustomName( new LiteralText( label ) ); + result.setHoverName( new TextComponent( label ) ); } return result; } @@ -39,9 +38,9 @@ public class ItemComputer extends ItemComputerBase public ItemStack withFamily( @Nonnull ItemStack stack, @Nonnull ComputerFamily family ) { ItemStack result = ComputerItemFactory.create( getComputerID( stack ), null, family ); - if( stack.hasCustomName() ) + if( stack.hasCustomHoverName() ) { - result.setCustomName( stack.getName() ); + result.setHoverName( stack.getHoverName() ); } return result; } diff --git a/src/main/java/dan200/computercraft/shared/computer/items/ItemComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/items/ItemComputerBase.java index 482e2916b..d02e7b7cf 100644 --- a/src/main/java/dan200/computercraft/shared/computer/items/ItemComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/items/ItemComputerBase.java @@ -12,38 +12,37 @@ import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.api.media.IMedia; import dan200.computercraft.shared.computer.blocks.BlockComputerBase; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import java.util.List; public abstract class ItemComputerBase extends BlockItem implements IComputerItem, IMedia { private final ComputerFamily family; - public ItemComputerBase( BlockComputerBase block, Settings settings ) + public ItemComputerBase( BlockComputerBase block, Properties settings ) { super( block, settings ); family = block.getFamily(); } @Override - public void appendTooltip( @Nonnull ItemStack stack, @Nullable World world, @Nonnull List list, @Nonnull TooltipContext options ) + public void appendHoverText( @Nonnull ItemStack stack, @Nullable Level world, @Nonnull List list, @Nonnull TooltipFlag options ) { if( options.isAdvanced() || getLabel( stack ) == null ) { int id = getComputerID( stack ); if( id >= 0 ) { - list.add( new TranslatableText( "gui.computercraft.tooltip.computer_id", id ).formatted( Formatting.GRAY ) ); + list.add( new TranslatableComponent( "gui.computercraft.tooltip.computer_id", id ).withStyle( ChatFormatting.GRAY ) ); } } } @@ -67,17 +66,17 @@ public abstract class ItemComputerBase extends BlockItem implements IComputerIte { if( label != null ) { - stack.setCustomName( new LiteralText( label ) ); + stack.setHoverName( new TextComponent( label ) ); } else { - stack.removeCustomName(); + stack.resetHoverName(); } return true; } @Override - public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world ) + public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull Level world ) { ComputerFamily family = getFamily(); if( family != ComputerFamily.COMMAND ) diff --git a/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerConvertRecipe.java b/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerConvertRecipe.java index 8b4cfaa58..168b7e131 100644 --- a/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerConvertRecipe.java +++ b/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerConvertRecipe.java @@ -7,15 +7,14 @@ package dan200.computercraft.shared.computer.recipe; import dan200.computercraft.shared.computer.items.IComputerItem; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.ShapedRecipe; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.level.Level; /** * Represents a recipe which converts a computer from one form into another. @@ -24,7 +23,7 @@ public abstract class ComputerConvertRecipe extends ShapedRecipe { private final String group; - public ComputerConvertRecipe( Identifier identifier, String group, int width, int height, DefaultedList ingredients, ItemStack result ) + public ComputerConvertRecipe( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result ) { super( identifier, group, width, height, ingredients, result ); this.group = group; @@ -38,16 +37,16 @@ public abstract class ComputerConvertRecipe extends ShapedRecipe } @Override - public boolean matches( @Nonnull CraftingInventory inventory, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inventory, @Nonnull Level world ) { if( !super.matches( inventory, world ) ) { return false; } - for( int i = 0; i < inventory.size(); i++ ) + for( int i = 0; i < inventory.getContainerSize(); i++ ) { - if( inventory.getStack( i ) + if( inventory.getItem( i ) .getItem() instanceof IComputerItem ) { return true; @@ -59,12 +58,12 @@ public abstract class ComputerConvertRecipe extends ShapedRecipe @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inventory ) + public ItemStack assemble( @Nonnull CraftingContainer inventory ) { // Find our computer item and convert it. - for( int i = 0; i < inventory.size(); i++ ) + for( int i = 0; i < inventory.getContainerSize(); i++ ) { - ItemStack stack = inventory.getStack( i ); + ItemStack stack = inventory.getItem( i ); if( stack.getItem() instanceof IComputerItem ) { return convert( (IComputerItem) stack.getItem(), stack ); diff --git a/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerFamilyRecipe.java b/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerFamilyRecipe.java index d882505f9..a0c6df14c 100644 --- a/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerFamilyRecipe.java +++ b/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerFamilyRecipe.java @@ -9,21 +9,20 @@ package dan200.computercraft.shared.computer.recipe; import com.google.gson.JsonObject; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.util.RecipeUtil; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; public abstract class ComputerFamilyRecipe extends ComputerConvertRecipe { private final ComputerFamily family; - public ComputerFamilyRecipe( Identifier identifier, String group, int width, int height, DefaultedList ingredients, ItemStack result, + public ComputerFamilyRecipe( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result, ComputerFamily family ) { super( identifier, group, width, height, ingredients, result ); @@ -39,51 +38,51 @@ public abstract class ComputerFamilyRecipe extends ComputerConvertRecipe { @Nonnull @Override - public T read( @Nonnull Identifier identifier, @Nonnull JsonObject json ) + public T fromJson( @Nonnull ResourceLocation identifier, @Nonnull JsonObject json ) { - String group = JsonHelper.getString( json, "group", "" ); + String group = GsonHelper.getAsString( json, "group", "" ); ComputerFamily family = RecipeUtil.getFamily( json, "family" ); RecipeUtil.ShapedTemplate template = RecipeUtil.getTemplate( json ); - ItemStack result = outputFromJson( JsonHelper.getObject( json, "result" ) ); + ItemStack result = itemStackFromJson( GsonHelper.getAsJsonObject( json, "result" ) ); return create( identifier, group, template.width, template.height, template.ingredients, result, family ); } - protected abstract T create( Identifier identifier, String group, int width, int height, DefaultedList ingredients, ItemStack result, + protected abstract T create( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result, ComputerFamily family ); @Nonnull @Override - public T read( @Nonnull Identifier identifier, @Nonnull PacketByteBuf buf ) + public T fromNetwork( @Nonnull ResourceLocation identifier, @Nonnull FriendlyByteBuf buf ) { int width = buf.readVarInt(); int height = buf.readVarInt(); - String group = buf.readString( Short.MAX_VALUE ); + String group = buf.readUtf( Short.MAX_VALUE ); - DefaultedList ingredients = DefaultedList.ofSize( width * height, Ingredient.EMPTY ); + NonNullList ingredients = NonNullList.withSize( width * height, Ingredient.EMPTY ); for( int i = 0; i < ingredients.size(); i++ ) { - ingredients.set( i, Ingredient.fromPacket( buf ) ); + ingredients.set( i, Ingredient.fromNetwork( buf ) ); } - ItemStack result = buf.readItemStack(); - ComputerFamily family = buf.readEnumConstant( ComputerFamily.class ); + ItemStack result = buf.readItem(); + ComputerFamily family = buf.readEnum( ComputerFamily.class ); return create( identifier, group, width, height, ingredients, result, family ); } @Override - public void write( @Nonnull PacketByteBuf buf, @Nonnull T recipe ) + public void write( @Nonnull FriendlyByteBuf buf, @Nonnull T recipe ) { buf.writeVarInt( recipe.getWidth() ); buf.writeVarInt( recipe.getHeight() ); - buf.writeString( recipe.getGroup() ); + buf.writeUtf( recipe.getGroup() ); for( Ingredient ingredient : recipe.getIngredients() ) { - ingredient.write( buf ); + ingredient.toNetwork( buf ); } - buf.writeItemStack( recipe.getOutput() ); - buf.writeEnumConstant( recipe.getFamily() ); + buf.writeItem( recipe.getResultItem() ); + buf.writeEnum( recipe.getFamily() ); } } } diff --git a/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerUpgradeRecipe.java b/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerUpgradeRecipe.java index b22c10b14..0a54e4f50 100644 --- a/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerUpgradeRecipe.java +++ b/src/main/java/dan200/computercraft/shared/computer/recipe/ComputerUpgradeRecipe.java @@ -8,13 +8,12 @@ package dan200.computercraft.shared.computer.recipe; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.items.IComputerItem; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; public class ComputerUpgradeRecipe extends ComputerFamilyRecipe { @@ -22,14 +21,14 @@ public class ComputerUpgradeRecipe extends ComputerFamilyRecipe new ComputerFamilyRecipe.Serializer() { @Override - protected ComputerUpgradeRecipe create( Identifier identifier, String group, int width, int height, DefaultedList ingredients, + protected ComputerUpgradeRecipe create( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result, ComputerFamily family ) { return new ComputerUpgradeRecipe( identifier, group, width, height, ingredients, result, family ); } }; - public ComputerUpgradeRecipe( Identifier identifier, String group, int width, int height, DefaultedList ingredients, ItemStack result, + public ComputerUpgradeRecipe( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result, ComputerFamily family ) { super( identifier, group, width, height, ingredients, result, family ); diff --git a/src/main/java/dan200/computercraft/shared/computer/upload/UploadResult.java b/src/main/java/dan200/computercraft/shared/computer/upload/UploadResult.java index 2c332c0ef..11398b04c 100644 --- a/src/main/java/dan200/computercraft/shared/computer/upload/UploadResult.java +++ b/src/main/java/dan200/computercraft/shared/computer/upload/UploadResult.java @@ -5,8 +5,8 @@ */ package dan200.computercraft.shared.computer.upload; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; public enum UploadResult { @@ -14,12 +14,12 @@ public enum UploadResult ERROR, CONFIRM_OVERWRITE; - public static final Text SUCCESS_TITLE = new TranslatableText( "gui.computercraft.upload.success" ); + public static final Component SUCCESS_TITLE = new TranslatableComponent( "gui.computercraft.upload.success" ); - public static final Text FAILED_TITLE = new TranslatableText( "gui.computercraft.upload.failed" ); - public static final Text COMPUTER_OFF_MSG = new TranslatableText( "gui.computercraft.upload.failed.computer_off" ); - public static final Text OUT_OF_SPACE_MSG = new TranslatableText( "gui.computercraft.upload.failed.out_of_space" ); - public static final Text TOO_MUCH_MSG = new TranslatableText( "gui.computercraft.upload.failed.too_much" ); + public static final Component FAILED_TITLE = new TranslatableComponent( "gui.computercraft.upload.failed" ); + public static final Component COMPUTER_OFF_MSG = new TranslatableComponent( "gui.computercraft.upload.failed.computer_off" ); + public static final Component OUT_OF_SPACE_MSG = new TranslatableComponent( "gui.computercraft.upload.failed.out_of_space" ); + public static final Component TOO_MUCH_MSG = new TranslatableComponent( "gui.computercraft.upload.failed.too_much" ); - public static final Text UPLOAD_OVERWRITE = new TranslatableText( "gui.computercraft.upload.overwrite" ); + public static final Component UPLOAD_OVERWRITE = new TranslatableComponent( "gui.computercraft.upload.overwrite" ); } diff --git a/src/main/java/dan200/computercraft/shared/data/BlockNamedEntityLootCondition.java b/src/main/java/dan200/computercraft/shared/data/BlockNamedEntityLootCondition.java index ee98295f1..f24697123 100644 --- a/src/main/java/dan200/computercraft/shared/data/BlockNamedEntityLootCondition.java +++ b/src/main/java/dan200/computercraft/shared/data/BlockNamedEntityLootCondition.java @@ -6,25 +6,24 @@ package dan200.computercraft.shared.data; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.condition.LootConditionType; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameter; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.util.Nameable; - import javax.annotation.Nonnull; +import net.minecraft.world.Nameable; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; import java.util.Collections; import java.util.Set; /** * A loot condition which checks if the tile entity has a name. */ -public final class BlockNamedEntityLootCondition implements LootCondition +public final class BlockNamedEntityLootCondition implements LootItemCondition { public static final BlockNamedEntityLootCondition INSTANCE = new BlockNamedEntityLootCondition(); - public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE ); + public static final LootItemConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE ); public static final Builder BUILDER = () -> INSTANCE; private BlockNamedEntityLootCondition() @@ -34,20 +33,20 @@ public final class BlockNamedEntityLootCondition implements LootCondition @Override public boolean test( LootContext lootContext ) { - BlockEntity tile = lootContext.get( LootContextParameters.BLOCK_ENTITY ); + BlockEntity tile = lootContext.getParamOrNull( LootContextParams.BLOCK_ENTITY ); return tile instanceof Nameable && ((Nameable) tile).hasCustomName(); } @Nonnull @Override - public Set> getRequiredParameters() + public Set> getReferencedContextParams() { - return Collections.singleton( LootContextParameters.BLOCK_ENTITY ); + return Collections.singleton( LootContextParams.BLOCK_ENTITY ); } @Override @Nonnull - public LootConditionType getType() + public LootItemConditionType getType() { return TYPE; } diff --git a/src/main/java/dan200/computercraft/shared/data/ConstantLootConditionSerializer.java b/src/main/java/dan200/computercraft/shared/data/ConstantLootConditionSerializer.java index 8a45e575b..d26e63910 100644 --- a/src/main/java/dan200/computercraft/shared/data/ConstantLootConditionSerializer.java +++ b/src/main/java/dan200/computercraft/shared/data/ConstantLootConditionSerializer.java @@ -9,13 +9,12 @@ package dan200.computercraft.shared.data; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; -import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.condition.LootConditionType; -import net.minecraft.util.JsonSerializer; - import javax.annotation.Nonnull; +import net.minecraft.world.level.storage.loot.Serializer; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; -public final class ConstantLootConditionSerializer implements JsonSerializer +public final class ConstantLootConditionSerializer implements Serializer { private final T instance; @@ -24,9 +23,9 @@ public final class ConstantLootConditionSerializer impl this.instance = instance; } - public static LootConditionType type( T condition ) + public static LootItemConditionType type( T condition ) { - return new LootConditionType( new ConstantLootConditionSerializer<>( condition ) ); + return new LootItemConditionType( new ConstantLootConditionSerializer<>( condition ) ); } @Override @@ -36,7 +35,7 @@ public final class ConstantLootConditionSerializer impl @Nonnull @Override - public T fromJson( @Nonnull JsonObject json, @Nonnull JsonDeserializationContext context ) + public T deserialize( @Nonnull JsonObject json, @Nonnull JsonDeserializationContext context ) { return instance; } diff --git a/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java b/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java index 7b2717d29..6e7601a13 100644 --- a/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java +++ b/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java @@ -7,24 +7,23 @@ package dan200.computercraft.shared.data; import dan200.computercraft.shared.computer.blocks.IComputerTile; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.condition.LootConditionType; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameter; -import net.minecraft.loot.context.LootContextParameters; - import javax.annotation.Nonnull; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; import java.util.Collections; import java.util.Set; /** * A loot condition which checks if the tile entity has has a non-0 ID. */ -public final class HasComputerIdLootCondition implements LootCondition +public final class HasComputerIdLootCondition implements LootItemCondition { public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition(); - public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE ); + public static final LootItemConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE ); public static final Builder BUILDER = () -> INSTANCE; private HasComputerIdLootCondition() @@ -34,20 +33,20 @@ public final class HasComputerIdLootCondition implements LootCondition @Override public boolean test( LootContext lootContext ) { - BlockEntity tile = lootContext.get( LootContextParameters.BLOCK_ENTITY ); + BlockEntity tile = lootContext.getParamOrNull( LootContextParams.BLOCK_ENTITY ); return tile instanceof IComputerTile && ((IComputerTile) tile).getComputerID() >= 0; } @Nonnull @Override - public Set> getRequiredParameters() + public Set> getReferencedContextParams() { - return Collections.singleton( LootContextParameters.BLOCK_ENTITY ); + return Collections.singleton( LootContextParams.BLOCK_ENTITY ); } @Override @Nonnull - public LootConditionType getType() + public LootItemConditionType getType() { return TYPE; } diff --git a/src/main/java/dan200/computercraft/shared/data/PlayerCreativeLootCondition.java b/src/main/java/dan200/computercraft/shared/data/PlayerCreativeLootCondition.java index debdffb46..fe48d81e5 100644 --- a/src/main/java/dan200/computercraft/shared/data/PlayerCreativeLootCondition.java +++ b/src/main/java/dan200/computercraft/shared/data/PlayerCreativeLootCondition.java @@ -6,25 +6,24 @@ package dan200.computercraft.shared.data; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.condition.LootConditionType; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameter; -import net.minecraft.loot.context.LootContextParameters; - import javax.annotation.Nonnull; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; import java.util.Collections; import java.util.Set; /** * A loot condition which checks if the entity is in creative mode. */ -public final class PlayerCreativeLootCondition implements LootCondition +public final class PlayerCreativeLootCondition implements LootItemCondition { public static final PlayerCreativeLootCondition INSTANCE = new PlayerCreativeLootCondition(); - public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE ); + public static final LootItemConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE ); public static final Builder BUILDER = () -> INSTANCE; private PlayerCreativeLootCondition() @@ -34,20 +33,20 @@ public final class PlayerCreativeLootCondition implements LootCondition @Override public boolean test( LootContext lootContext ) { - Entity entity = lootContext.get( LootContextParameters.THIS_ENTITY ); - return entity instanceof PlayerEntity && ((PlayerEntity) entity).getAbilities().creativeMode; + Entity entity = lootContext.getParamOrNull( LootContextParams.THIS_ENTITY ); + return entity instanceof Player && ((Player) entity).getAbilities().instabuild; } @Nonnull @Override - public Set> getRequiredParameters() + public Set> getReferencedContextParams() { - return Collections.singleton( LootContextParameters.THIS_ENTITY ); + return Collections.singleton( LootContextParams.THIS_ENTITY ); } @Override @Nonnull - public LootConditionType getType() + public LootItemConditionType getType() { return TYPE; } diff --git a/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java b/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java index f973cf5a5..eaba346e6 100644 --- a/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java +++ b/src/main/java/dan200/computercraft/shared/integration/ModMenuIntegration.java @@ -15,8 +15,8 @@ import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; // A poor mod menu integration just for testing the monitor rendering changes we've been making :) @@ -28,7 +28,7 @@ public class ModMenuIntegration implements ModMenuApi { return parent -> { ConfigBuilder builder = ConfigBuilder.create().setParentScreen( parent ) - .setTitle( new LiteralText( "Computer Craft" ) ) + .setTitle( new TextComponent( "Computer Craft" ) ) .setSavingRunnable( () -> { Config.clientSpec.correct( Config.clientConfig ); Config.sync(); @@ -36,14 +36,14 @@ public class ModMenuIntegration implements ModMenuApi ComputerCraft.log.info( "Monitor renderer: {}", ComputerCraft.monitorRenderer ); } ); - ConfigCategory client = builder.getOrCreateCategory( new LiteralText( "Client" ) ); + ConfigCategory client = builder.getOrCreateCategory( new TextComponent( "Client" ) ); ConfigEntryBuilder entryBuilder = builder.entryBuilder(); - client.addEntry( entryBuilder.startEnumSelector( new LiteralText( "Monitor Renderer" ), MonitorRenderer.class, ComputerCraft.monitorRenderer ) + client.addEntry( entryBuilder.startEnumSelector( new TextComponent( "Monitor Renderer" ), MonitorRenderer.class, ComputerCraft.monitorRenderer ) .setDefaultValue( MonitorRenderer.BEST ) .setSaveConsumer( renderer -> { Config.clientConfig.set( "monitor_renderer", renderer ); } ) - .setTooltip( Text.of( Config.clientConfig.getComment( "monitor_renderer" ) ) ) + .setTooltip( Component.nullToEmpty( Config.clientConfig.getComment( "monitor_renderer" ) ) ) .build() ); return builder.build(); diff --git a/src/main/java/dan200/computercraft/shared/media/items/ItemDisk.java b/src/main/java/dan200/computercraft/shared/media/items/ItemDisk.java index 3d656c87a..5e6b1e2d8 100644 --- a/src/main/java/dan200/computercraft/shared/media/items/ItemDisk.java +++ b/src/main/java/dan200/computercraft/shared/media/items/ItemDisk.java @@ -13,48 +13,47 @@ import dan200.computercraft.api.media.IMedia; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.util.Colour; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.ChatFormatting; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import java.util.List; public class ItemDisk extends Item implements IMedia, IColouredItem { private static final String NBT_ID = "DiskId"; - public ItemDisk( Settings settings ) + public ItemDisk( Properties settings ) { super( settings ); } @Override - public void appendTooltip( @Nonnull ItemStack stack, @Nullable World world, @Nonnull List list, TooltipContext options ) + public void appendHoverText( @Nonnull ItemStack stack, @Nullable Level world, @Nonnull List list, TooltipFlag options ) { if( options.isAdvanced() ) { int id = getDiskID( stack ); if( id >= 0 ) { - list.add( new TranslatableText( "gui.computercraft.tooltip.disk_id", id ).formatted( Formatting.GRAY ) ); + list.add( new TranslatableComponent( "gui.computercraft.tooltip.disk_id", id ).withStyle( ChatFormatting.GRAY ) ); } } } @Override - public void appendStacks( @Nonnull ItemGroup tabs, @Nonnull DefaultedList list ) + public void fillItemCategory( @Nonnull CreativeModeTab tabs, @Nonnull NonNullList list ) { - if( !isIn( tabs ) ) + if( !allowdedIn( tabs ) ) { return; } @@ -78,21 +77,21 @@ public class ItemDisk extends Item implements IMedia, IColouredItem { if( id >= 0 ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_ID, id ); } } public static int getDiskID( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1; } @Override public String getLabel( @Nonnull ItemStack stack ) { - return stack.hasCustomName() ? stack.getName() + return stack.hasCustomHoverName() ? stack.getHoverName() .getString() : null; } @@ -101,17 +100,17 @@ public class ItemDisk extends Item implements IMedia, IColouredItem { if( label != null ) { - stack.setCustomName( new LiteralText( label ) ); + stack.setHoverName( new TextComponent( label ) ); } else { - stack.removeCustomName(); + stack.resetHoverName(); } return true; } @Override - public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world ) + public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull Level world ) { int diskID = getDiskID( stack ); if( diskID < 0 ) diff --git a/src/main/java/dan200/computercraft/shared/media/items/ItemPrintout.java b/src/main/java/dan200/computercraft/shared/media/items/ItemPrintout.java index 07ecffb99..1120116b5 100644 --- a/src/main/java/dan200/computercraft/shared/media/items/ItemPrintout.java +++ b/src/main/java/dan200/computercraft/shared/media/items/ItemPrintout.java @@ -9,19 +9,18 @@ package dan200.computercraft.shared.media.items; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.ContainerHeldItem; import dan200.computercraft.shared.network.container.HeldItemContainerData; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import java.util.List; public class ItemPrintout extends Item @@ -35,7 +34,7 @@ public class ItemPrintout extends Item private static final String NBT_LINE_COLOUR = "Color"; private final Type type; - public ItemPrintout( Settings settings, Type type ) + public ItemPrintout( Properties settings, Type type ) { super( settings ); this.type = type; @@ -55,12 +54,12 @@ public class ItemPrintout extends Item // Build NBT if( title != null ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putString( NBT_TITLE, title ); } if( text != null ) { - NbtCompound tag = stack.getOrCreateNbt(); + CompoundTag tag = stack.getOrCreateTag(); tag.putInt( NBT_PAGES, text.length / LINES_PER_PAGE ); for( int i = 0; i < text.length; i++ ) { @@ -72,7 +71,7 @@ public class ItemPrintout extends Item } if( colours != null ) { - NbtCompound tag = stack.getOrCreateNbt(); + CompoundTag tag = stack.getOrCreateTag(); for( int i = 0; i < colours.length; i++ ) { if( colours[i] != null ) @@ -105,7 +104,7 @@ public class ItemPrintout extends Item private static String[] getLines( @Nonnull ItemStack stack, String prefix ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); int numLines = getPageCount( stack ) * LINES_PER_PAGE; String[] lines = new String[numLines]; for( int i = 0; i < lines.length; i++ ) @@ -117,7 +116,7 @@ public class ItemPrintout extends Item public static int getPageCount( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_PAGES ) ? nbt.getInt( NBT_PAGES ) : 1; } @@ -128,31 +127,31 @@ public class ItemPrintout extends Item @Nonnull @Override - public TypedActionResult use( World world, @Nonnull PlayerEntity player, @Nonnull Hand hand ) + public InteractionResultHolder use( Level world, @Nonnull Player player, @Nonnull InteractionHand hand ) { - if( !world.isClient ) + if( !world.isClientSide ) { new HeldItemContainerData( hand ).open( player, new ContainerHeldItem.Factory( ComputerCraftRegistry.ModContainers.PRINTOUT, - player.getStackInHand( hand ), + player.getItemInHand( hand ), hand ) ); } - return new TypedActionResult<>( ActionResult.SUCCESS, player.getStackInHand( hand ) ); + return new InteractionResultHolder<>( InteractionResult.SUCCESS, player.getItemInHand( hand ) ); } @Override - public void appendTooltip( @Nonnull ItemStack stack, World world, @Nonnull List list, @Nonnull TooltipContext options ) + public void appendHoverText( @Nonnull ItemStack stack, Level world, @Nonnull List list, @Nonnull TooltipFlag options ) { String title = getTitle( stack ); if( title != null && !title.isEmpty() ) { - list.add( new LiteralText( title ) ); + list.add( new TextComponent( title ) ); } } public static String getTitle( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_TITLE ) ? nbt.getString( NBT_TITLE ) : null; } diff --git a/src/main/java/dan200/computercraft/shared/media/items/ItemTreasureDisk.java b/src/main/java/dan200/computercraft/shared/media/items/ItemTreasureDisk.java index ae4e6e990..b00df1647 100644 --- a/src/main/java/dan200/computercraft/shared/media/items/ItemTreasureDisk.java +++ b/src/main/java/dan200/computercraft/shared/media/items/ItemTreasureDisk.java @@ -12,18 +12,17 @@ import dan200.computercraft.api.media.IMedia; import dan200.computercraft.core.filesystem.SubMount; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.util.Colour; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import java.io.IOException; import java.util.List; @@ -33,7 +32,7 @@ public class ItemTreasureDisk extends Item implements IMedia private static final String NBT_COLOUR = "Colour"; private static final String NBT_SUB_PATH = "SubPath"; - public ItemTreasureDisk( Settings settings ) + public ItemTreasureDisk( Properties settings ) { super( settings ); } @@ -41,7 +40,7 @@ public class ItemTreasureDisk extends Item implements IMedia public static ItemStack create( String subPath, int colourIndex ) { ItemStack result = new ItemStack( ComputerCraftRegistry.ModItems.TREASURE_DISK ); - NbtCompound nbt = result.getOrCreateNbt(); + CompoundTag nbt = result.getOrCreateTag(); nbt.putString( NBT_SUB_PATH, subPath ); int slash = subPath.indexOf( '/' ); @@ -62,29 +61,29 @@ public class ItemTreasureDisk extends Item implements IMedia public static int getColour( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_COLOUR ) ? nbt.getInt( NBT_COLOUR ) : Colour.BLUE.getHex(); } @Override - public void appendTooltip( @Nonnull ItemStack stack, @Nullable World world, @Nonnull List list, @Nonnull TooltipContext tooltipOptions ) + public void appendHoverText( @Nonnull ItemStack stack, @Nullable Level world, @Nonnull List list, @Nonnull TooltipFlag tooltipOptions ) { String label = getTitle( stack ); if( !label.isEmpty() ) { - list.add( new LiteralText( label ) ); + list.add( new TextComponent( label ) ); } } @Override - public void appendStacks( @Nonnull ItemGroup group, @Nonnull DefaultedList stacks ) + public void fillItemCategory( @Nonnull CreativeModeTab group, @Nonnull NonNullList stacks ) { } @Nonnull private static String getTitle( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_TITLE ) ? nbt.getString( NBT_TITLE ) : "'alongtimeago' by dan200"; } @@ -95,7 +94,7 @@ public class ItemTreasureDisk extends Item implements IMedia } @Override - public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world ) + public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull Level world ) { IMount rootTreasure = getTreasureMount(); String subPath = getSubPath( stack ); @@ -128,7 +127,7 @@ public class ItemTreasureDisk extends Item implements IMedia @Nonnull private static String getSubPath( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_SUB_PATH ) ? nbt.getString( NBT_SUB_PATH ) : "dan200/alongtimeago"; } } diff --git a/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java b/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java index 6a4a7f8d2..c090111dd 100644 --- a/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java +++ b/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java @@ -6,13 +6,12 @@ package dan200.computercraft.shared.media.items; import dan200.computercraft.api.media.IMedia; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.TranslatableText; - import javax.annotation.Nonnull; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.RecordItem; /** * An implementation of IMedia for ItemRecords. @@ -35,22 +34,22 @@ public final class RecordMedia implements IMedia public String getAudioTitle( @Nonnull ItemStack stack ) { Item item = stack.getItem(); - if( !(item instanceof MusicDiscItem) ) + if( !(item instanceof RecordItem) ) { return null; } - return new TranslatableText( item.getTranslationKey() + ".desc" ).getString(); + return new TranslatableComponent( item.getDescriptionId() + ".desc" ).getString(); } @Override public SoundEvent getAudio( @Nonnull ItemStack stack ) { Item item = stack.getItem(); - if( !(item instanceof MusicDiscItem) ) + if( !(item instanceof RecordItem) ) { return null; } - return ((MusicDiscItem) item).getSound(); + return ((RecordItem) item).getSound(); } } diff --git a/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java b/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java index 748e61f91..61ac56ab1 100644 --- a/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java +++ b/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java @@ -10,40 +10,39 @@ import dan200.computercraft.shared.media.items.ItemDisk; import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.ColourTracker; import dan200.computercraft.shared.util.ColourUtils; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.SpecialCraftingRecipe; -import net.minecraft.recipe.SpecialRecipeSerializer; -import net.minecraft.util.DyeColor; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; +import net.minecraft.world.level.Level; -public class DiskRecipe extends SpecialCraftingRecipe +public class DiskRecipe extends CustomRecipe { - public static final RecipeSerializer SERIALIZER = new SpecialRecipeSerializer<>( DiskRecipe::new ); - private final Ingredient paper = Ingredient.ofItems( Items.PAPER ); + public static final RecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>( DiskRecipe::new ); + private final Ingredient paper = Ingredient.of( Items.PAPER ); // TODO: Ingredient.fromTag( Tags.Items.DUSTS_REDSTONE ); - private final Ingredient redstone = Ingredient.ofItems( Items.REDSTONE ); + private final Ingredient redstone = Ingredient.of( Items.REDSTONE ); - public DiskRecipe( Identifier id ) + public DiskRecipe( ResourceLocation id ) { super( id ); } @Override - public boolean matches( @Nonnull CraftingInventory inv, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inv, @Nonnull Level world ) { boolean paperFound = false; boolean redstoneFound = false; - for( int i = 0; i < inv.size(); i++ ) + for( int i = 0; i < inv.getContainerSize(); i++ ) { - ItemStack stack = inv.getStack( i ); + ItemStack stack = inv.getItem( i ); if( !stack.isEmpty() ) { @@ -75,13 +74,13 @@ public class DiskRecipe extends SpecialCraftingRecipe @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inv ) + public ItemStack craft( @Nonnull CraftingContainer inv ) { ColourTracker tracker = new ColourTracker(); - for( int i = 0; i < inv.size(); i++ ) + for( int i = 0; i < inv.getContainerSize(); i++ ) { - ItemStack stack = inv.getStack( i ); + ItemStack stack = inv.getItem( i ); if( stack.isEmpty() ) { @@ -99,7 +98,7 @@ public class DiskRecipe extends SpecialCraftingRecipe } @Override - public boolean fits( int x, int y ) + public boolean canCraftInDimensions( int x, int y ) { return x >= 2 && y >= 2; } @@ -113,7 +112,7 @@ public class DiskRecipe extends SpecialCraftingRecipe @Nonnull @Override - public ItemStack getOutput() + public ItemStack getResultItem() { return ItemDisk.createFromIDAndColour( -1, null, Colour.BLUE.getHex() ); } diff --git a/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java b/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java index 421af7edf..2652c7018 100644 --- a/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java +++ b/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java @@ -7,46 +7,45 @@ package dan200.computercraft.shared.media.recipes; import dan200.computercraft.shared.media.items.ItemPrintout; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.SpecialCraftingRecipe; -import net.minecraft.recipe.SpecialRecipeSerializer; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; +import net.minecraft.world.level.Level; -public final class PrintoutRecipe extends SpecialCraftingRecipe +public final class PrintoutRecipe extends CustomRecipe { - public static final RecipeSerializer SERIALIZER = new SpecialRecipeSerializer<>( PrintoutRecipe::new ); - private final Ingredient paper = Ingredient.ofItems( Items.PAPER ); - private final Ingredient leather = Ingredient.ofItems( Items.LEATHER ); - private final Ingredient string = Ingredient.ofItems( Items.STRING ); + public static final RecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>( PrintoutRecipe::new ); + private final Ingredient paper = Ingredient.of( Items.PAPER ); + private final Ingredient leather = Ingredient.of( Items.LEATHER ); + private final Ingredient string = Ingredient.of( Items.STRING ); - private PrintoutRecipe( Identifier id ) + private PrintoutRecipe( ResourceLocation id ) { super( id ); } @Nonnull @Override - public ItemStack getOutput() + public ItemStack getResultItem() { return ItemPrintout.createMultipleFromTitleAndText( null, null, null ); } @Override - public boolean matches( @Nonnull CraftingInventory inventory, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inventory, @Nonnull Level world ) { return !craft( inventory ).isEmpty(); } @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inventory ) + public ItemStack craft( @Nonnull CraftingContainer inventory ) { // See if we match the recipe, and extract the input disk ID and dye colour int numPages = 0; @@ -59,7 +58,7 @@ public final class PrintoutRecipe extends SpecialCraftingRecipe { for( int x = 0; x < inventory.getWidth(); x++ ) { - ItemStack stack = inventory.getStack( x + y * inventory.getWidth() ); + ItemStack stack = inventory.getItem( x + y * inventory.getWidth() ); if( !stack.isEmpty() ) { if( stack.getItem() instanceof ItemPrintout && ((ItemPrintout) stack.getItem()).getType() != ItemPrintout.Type.BOOK ) @@ -153,7 +152,7 @@ public final class PrintoutRecipe extends SpecialCraftingRecipe } @Override - public boolean fits( int x, int y ) + public boolean canCraftInDimensions( int x, int y ) { return x >= 3 && y >= 3; } diff --git a/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java b/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java index e37f4411e..0d24ce401 100644 --- a/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java +++ b/src/main/java/dan200/computercraft/shared/network/NetworkHandler.java @@ -21,28 +21,27 @@ import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.api.network.PacketContext; import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.game.ServerboundCustomPayloadPacket; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraft.world.chunk.WorldChunk; - +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.phys.Vec3; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Supplier; public final class NetworkHandler { - private static final Int2ObjectMap> packetReaders = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap> packetReaders = new Int2ObjectOpenHashMap<>(); private static final Object2IntMap> packetIds = new Object2IntOpenHashMap<>(); - private static final Identifier ID = new Identifier( ComputerCraft.MOD_ID, "main" ); + private static final ResourceLocation ID = new ResourceLocation( ComputerCraft.MOD_ID, "main" ); private NetworkHandler() { @@ -79,7 +78,7 @@ public final class NetworkHandler registerMainThread( 19, UploadResultMessage.class, UploadResultMessage::new ); } - private static void receive( PacketContext context, PacketByteBuf buffer ) + private static void receive( PacketContext context, FriendlyByteBuf buffer ) { int type = buffer.readByte(); packetReaders.get( type ) @@ -94,7 +93,7 @@ public final class NetworkHandler * @param id The identifier for this packet type * @param decoder The factory for this type of packet. */ - private static void registerMainThread( int id, Class type, Function decoder ) + private static void registerMainThread( int id, Class type, Function decoder ) { packetIds.put( type, id ); packetReaders.put( id, ( context, buf ) -> { @@ -111,52 +110,52 @@ public final class NetworkHandler .getClass(); } - private static PacketByteBuf encode( NetworkMessage message ) + private static FriendlyByteBuf encode( NetworkMessage message ) { - PacketByteBuf buf = new PacketByteBuf( Unpooled.buffer() ); + FriendlyByteBuf buf = new FriendlyByteBuf( Unpooled.buffer() ); buf.writeByte( packetIds.getInt( message.getClass() ) ); message.toBytes( buf ); return buf; } - public static void sendToPlayer( PlayerEntity player, NetworkMessage packet ) + public static void sendToPlayer( Player player, NetworkMessage packet ) { - ((ServerPlayerEntity) player).networkHandler.sendPacket( new CustomPayloadS2CPacket( ID, encode( packet ) ) ); + ((ServerPlayer) player).connection.send( new ClientboundCustomPayloadPacket( ID, encode( packet ) ) ); } public static void sendToAllPlayers( NetworkMessage packet ) { MinecraftServer server = GameInstanceUtils.getServer(); - server.getPlayerManager() - .sendToAll( new CustomPayloadS2CPacket( ID, encode( packet ) ) ); + server.getPlayerList() + .broadcastAll( new ClientboundCustomPayloadPacket( ID, encode( packet ) ) ); } public static void sendToAllPlayers( MinecraftServer server, NetworkMessage packet ) { - server.getPlayerManager() - .sendToAll( new CustomPayloadS2CPacket( ID, encode( packet ) ) ); + server.getPlayerList() + .broadcastAll( new ClientboundCustomPayloadPacket( ID, encode( packet ) ) ); } @Environment( EnvType.CLIENT ) public static void sendToServer( NetworkMessage packet ) { - MinecraftClient.getInstance().player.networkHandler.sendPacket( new CustomPayloadC2SPacket( ID, encode( packet ) ) ); + Minecraft.getInstance().player.connection.send( new ServerboundCustomPayloadPacket( ID, encode( packet ) ) ); } - public static void sendToAllAround( NetworkMessage packet, World world, Vec3d pos, double range ) + public static void sendToAllAround( NetworkMessage packet, Level world, Vec3 pos, double range ) { world.getServer() - .getPlayerManager() - .sendToAround( null, pos.x, pos.y, pos.z, range, world.getRegistryKey(), new CustomPayloadS2CPacket( ID, encode( packet ) ) ); + .getPlayerList() + .broadcast( null, pos.x, pos.y, pos.z, range, world.dimension(), new ClientboundCustomPayloadPacket( ID, encode( packet ) ) ); } - public static void sendToAllTracking( NetworkMessage packet, WorldChunk chunk ) + public static void sendToAllTracking( NetworkMessage packet, LevelChunk chunk ) { - for( PlayerEntity player : chunk.getWorld().getPlayers() ) + for( Player player : chunk.getLevel().players() ) { - if ( chunk.getWorld().getRegistryKey().getValue() == player.getEntityWorld().getRegistryKey().getValue() && player.getChunkPos().equals( chunk.getPos() ) ) + if ( chunk.getLevel().dimension().location() == player.getCommandSenderWorld().dimension().location() && player.chunkPosition().equals( chunk.getPos() ) ) { - ((ServerPlayerEntity) player).networkHandler.sendPacket( new CustomPayloadS2CPacket( ID, encode( packet ) ) ); + ((ServerPlayer) player).connection.send( new ClientboundCustomPayloadPacket( ID, encode( packet ) ) ); } } } diff --git a/src/main/java/dan200/computercraft/shared/network/NetworkMessage.java b/src/main/java/dan200/computercraft/shared/network/NetworkMessage.java index b1ab12c69..1f4c387b4 100644 --- a/src/main/java/dan200/computercraft/shared/network/NetworkMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/NetworkMessage.java @@ -7,8 +7,7 @@ package dan200.computercraft.shared.network; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; /** @@ -23,7 +22,7 @@ public interface NetworkMessage * * @param buf The buffer to write data to. */ - void toBytes( @Nonnull PacketByteBuf buf ); + void toBytes( @Nonnull FriendlyByteBuf buf ); /** * Handle this {@link NetworkMessage}. diff --git a/src/main/java/dan200/computercraft/shared/network/client/ChatTableClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/ChatTableClientMessage.java index c21f60edf..224e3c4fe 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/ChatTableClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/ChatTableClientMessage.java @@ -12,9 +12,8 @@ import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.Text; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import javax.annotation.Nonnull; public class ChatTableClientMessage implements NetworkMessage @@ -30,17 +29,17 @@ public class ChatTableClientMessage implements NetworkMessage this.table = table; } - public ChatTableClientMessage( @Nonnull PacketByteBuf buf ) + public ChatTableClientMessage( @Nonnull FriendlyByteBuf buf ) { int id = buf.readVarInt(); int columns = buf.readVarInt(); TableBuilder table; if( buf.readBoolean() ) { - Text[] headers = new Text[columns]; + Component[] headers = new Component[columns]; for( int i = 0; i < columns; i++ ) { - headers[i] = buf.readText(); + headers[i] = buf.readComponent(); } table = new TableBuilder( id, headers ); } @@ -52,10 +51,10 @@ public class ChatTableClientMessage implements NetworkMessage int rows = buf.readVarInt(); for( int i = 0; i < rows; i++ ) { - Text[] row = new Text[columns]; + Component[] row = new Component[columns]; for( int j = 0; j < columns; j++ ) { - row[j] = buf.readText(); + row[j] = buf.readComponent(); } table.row( row ); } @@ -65,26 +64,26 @@ public class ChatTableClientMessage implements NetworkMessage } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { buf.writeVarInt( table.getId() ); buf.writeVarInt( table.getColumns() ); buf.writeBoolean( table.getHeaders() != null ); if( table.getHeaders() != null ) { - for( Text header : table.getHeaders() ) + for( Component header : table.getHeaders() ) { - buf.writeText( header ); + buf.writeComponent( header ); } } buf.writeVarInt( table.getRows() .size() ); - for( Text[] row : table.getRows() ) + for( Component[] row : table.getRows() ) { - for( Text column : row ) + for( Component column : row ) { - buf.writeText( column ); + buf.writeComponent( column ); } } diff --git a/src/main/java/dan200/computercraft/shared/network/client/ComputerClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/ComputerClientMessage.java index ad04ce2aa..a9611c524 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/ComputerClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/ComputerClientMessage.java @@ -9,9 +9,8 @@ package dan200.computercraft.shared.network.client; import dan200.computercraft.ComputerCraft; import dan200.computercraft.shared.computer.core.ClientComputer; import dan200.computercraft.shared.network.NetworkMessage; -import net.minecraft.network.PacketByteBuf; - import javax.annotation.Nonnull; +import net.minecraft.network.FriendlyByteBuf; /** * A packet, which performs an action on a {@link ClientComputer}. @@ -25,7 +24,7 @@ public abstract class ComputerClientMessage implements NetworkMessage this.instanceId = instanceId; } - public ComputerClientMessage( @Nonnull PacketByteBuf buf ) + public ComputerClientMessage( @Nonnull FriendlyByteBuf buf ) { instanceId = buf.readVarInt(); } @@ -36,7 +35,7 @@ public abstract class ComputerClientMessage implements NetworkMessage } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { buf.writeVarInt( instanceId ); } diff --git a/src/main/java/dan200/computercraft/shared/network/client/ComputerDataClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/ComputerDataClientMessage.java index 405d7e29e..85f271ec4 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/ComputerDataClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/ComputerDataClientMessage.java @@ -9,9 +9,8 @@ package dan200.computercraft.shared.network.client; import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.computer.core.ServerComputer; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; /** @@ -20,7 +19,7 @@ import javax.annotation.Nonnull; public class ComputerDataClientMessage extends ComputerClientMessage { private final ComputerState state; - private final NbtCompound userData; + private final CompoundTag userData; public ComputerDataClientMessage( ServerComputer computer ) { @@ -29,18 +28,18 @@ public class ComputerDataClientMessage extends ComputerClientMessage userData = computer.getUserData(); } - public ComputerDataClientMessage( @Nonnull PacketByteBuf buf ) + public ComputerDataClientMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); - state = buf.readEnumConstant( ComputerState.class ); + state = buf.readEnum( ComputerState.class ); userData = buf.readNbt(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); - buf.writeEnumConstant( state ); + buf.writeEnum( state ); buf.writeNbt( userData ); } diff --git a/src/main/java/dan200/computercraft/shared/network/client/ComputerDeletedClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/ComputerDeletedClientMessage.java index 7ae774055..322c11cc4 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/ComputerDeletedClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/ComputerDeletedClientMessage.java @@ -8,7 +8,7 @@ package dan200.computercraft.shared.network.client; import dan200.computercraft.ComputerCraft; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.FriendlyByteBuf; public class ComputerDeletedClientMessage extends ComputerClientMessage { @@ -17,7 +17,7 @@ public class ComputerDeletedClientMessage extends ComputerClientMessage super( instanceId ); } - public ComputerDeletedClientMessage( PacketByteBuf buffer ) + public ComputerDeletedClientMessage( FriendlyByteBuf buffer ) { super( buffer ); } diff --git a/src/main/java/dan200/computercraft/shared/network/client/ComputerTerminalClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/ComputerTerminalClientMessage.java index a6a7b745c..6e0b4cf1a 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/ComputerTerminalClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/ComputerTerminalClientMessage.java @@ -7,8 +7,7 @@ package dan200.computercraft.shared.network.client; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; public class ComputerTerminalClientMessage extends ComputerClientMessage @@ -21,14 +20,14 @@ public class ComputerTerminalClientMessage extends ComputerClientMessage this.state = state; } - public ComputerTerminalClientMessage( @Nonnull PacketByteBuf buf ) + public ComputerTerminalClientMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); state = new TerminalState( buf ); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); state.write( buf ); diff --git a/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java index 740171dab..b003a6a88 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/MonitorClientMessage.java @@ -8,12 +8,11 @@ package dan200.computercraft.shared.network.client; import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.math.BlockPos; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.entity.BlockEntity; import javax.annotation.Nonnull; public class MonitorClientMessage implements NetworkMessage @@ -27,14 +26,14 @@ public class MonitorClientMessage implements NetworkMessage this.state = state; } - public MonitorClientMessage( @Nonnull PacketByteBuf buf ) + public MonitorClientMessage( @Nonnull FriendlyByteBuf buf ) { pos = buf.readBlockPos(); state = new TerminalState( buf ); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { buf.writeBlockPos( pos ); state.write( buf ); @@ -43,13 +42,13 @@ public class MonitorClientMessage implements NetworkMessage @Override public void handle( PacketContext context ) { - ClientPlayerEntity player = MinecraftClient.getInstance().player; - if( player == null || player.world == null ) + LocalPlayer player = Minecraft.getInstance().player; + if( player == null || player.level == null ) { return; } - BlockEntity te = player.world.getBlockEntity( pos ); + BlockEntity te = player.level.getBlockEntity( pos ); if( !(te instanceof TileMonitor) ) { return; diff --git a/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java index 35587fdcf..cc5c2a49a 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java @@ -10,13 +10,12 @@ import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.client.MinecraftClient; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.LiteralText; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; - +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.sounds.SoundEvent; import javax.annotation.Nonnull; /** @@ -46,13 +45,13 @@ public class PlayRecordClientMessage implements NetworkMessage soundEvent = null; } - public PlayRecordClientMessage( PacketByteBuf buf ) + public PlayRecordClientMessage( FriendlyByteBuf buf ) { pos = buf.readBlockPos(); if( buf.readBoolean() ) { - name = buf.readString( Short.MAX_VALUE ); - soundEvent = Registry.SOUND_EVENT.get( buf.readIdentifier() ); + name = buf.readUtf( Short.MAX_VALUE ); + soundEvent = Registry.SOUND_EVENT.get( buf.readResourceLocation() ); } else { @@ -62,7 +61,7 @@ public class PlayRecordClientMessage implements NetworkMessage } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { buf.writeBlockPos( pos ); if( soundEvent == null ) @@ -72,8 +71,8 @@ public class PlayRecordClientMessage implements NetworkMessage else { buf.writeBoolean( true ); - buf.writeString( name ); - buf.writeIdentifier( soundEvent.getId() ); + buf.writeUtf( name ); + buf.writeResourceLocation( soundEvent.getLocation() ); } } @@ -81,11 +80,11 @@ public class PlayRecordClientMessage implements NetworkMessage @Environment( EnvType.CLIENT ) public void handle( PacketContext context ) { - MinecraftClient mc = MinecraftClient.getInstance(); - mc.worldRenderer.playSong( soundEvent, pos ); + Minecraft mc = Minecraft.getInstance(); + mc.levelRenderer.playStreamingMusic( soundEvent, pos ); if( name != null ) { - mc.inGameHud.setRecordPlayingOverlay( new LiteralText( name ) ); + mc.gui.setNowPlaying( new TextComponent( name ) ); } } } diff --git a/src/main/java/dan200/computercraft/shared/network/client/SpeakerMoveClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/SpeakerMoveClientMessage.java index 9bfe74a03..a8e131ca2 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/SpeakerMoveClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/SpeakerMoveClientMessage.java @@ -10,9 +10,8 @@ import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.math.Vec3d; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; import java.util.UUID; @@ -26,27 +25,27 @@ import java.util.UUID; public class SpeakerMoveClientMessage implements NetworkMessage { private final UUID source; - private final Vec3d pos; + private final Vec3 pos; - public SpeakerMoveClientMessage( UUID source, Vec3d pos ) + public SpeakerMoveClientMessage( UUID source, Vec3 pos ) { this.source = source; this.pos = pos; } - public SpeakerMoveClientMessage( PacketByteBuf buf ) + public SpeakerMoveClientMessage( FriendlyByteBuf buf ) { - source = buf.readUuid(); - pos = new Vec3d( buf.readDouble(), buf.readDouble(), buf.readDouble() ); + source = buf.readUUID(); + pos = new Vec3( buf.readDouble(), buf.readDouble(), buf.readDouble() ); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { - buf.writeUuid( source ); - buf.writeDouble( pos.getX() ); - buf.writeDouble( pos.getY() ); - buf.writeDouble( pos.getZ() ); + buf.writeUUID( source ); + buf.writeDouble( pos.x() ); + buf.writeDouble( pos.y() ); + buf.writeDouble( pos.z() ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java index a913d1ea9..9c93516f9 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/SpeakerPlayClientMessage.java @@ -10,10 +10,9 @@ import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Vec3d; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; import java.util.UUID; @@ -27,12 +26,12 @@ import java.util.UUID; public class SpeakerPlayClientMessage implements NetworkMessage { private final UUID source; - private final Vec3d pos; - private final Identifier sound; + private final Vec3 pos; + private final ResourceLocation sound; private final float volume; private final float pitch; - public SpeakerPlayClientMessage( UUID source, Vec3d pos, Identifier event, float volume, float pitch ) + public SpeakerPlayClientMessage( UUID source, Vec3 pos, ResourceLocation event, float volume, float pitch ) { this.source = source; this.pos = pos; @@ -41,23 +40,23 @@ public class SpeakerPlayClientMessage implements NetworkMessage this.pitch = pitch; } - public SpeakerPlayClientMessage( PacketByteBuf buf ) + public SpeakerPlayClientMessage( FriendlyByteBuf buf ) { - source = buf.readUuid(); - pos = new Vec3d( buf.readDouble(), buf.readDouble(), buf.readDouble() ); - sound = buf.readIdentifier(); + source = buf.readUUID(); + pos = new Vec3( buf.readDouble(), buf.readDouble(), buf.readDouble() ); + sound = buf.readResourceLocation(); volume = buf.readFloat(); pitch = buf.readFloat(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { - buf.writeUuid( source ); - buf.writeDouble( pos.getX() ); - buf.writeDouble( pos.getY() ); - buf.writeDouble( pos.getZ() ); - buf.writeIdentifier( sound ); + buf.writeUUID( source ); + buf.writeDouble( pos.x() ); + buf.writeDouble( pos.y() ); + buf.writeDouble( pos.z() ); + buf.writeResourceLocation( sound ); buf.writeFloat( volume ); buf.writeFloat( pitch ); } diff --git a/src/main/java/dan200/computercraft/shared/network/client/SpeakerStopClientMessage.java b/src/main/java/dan200/computercraft/shared/network/client/SpeakerStopClientMessage.java index bdc630244..5a14a23a6 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/SpeakerStopClientMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/SpeakerStopClientMessage.java @@ -10,8 +10,7 @@ import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; import java.util.UUID; @@ -31,15 +30,15 @@ public class SpeakerStopClientMessage implements NetworkMessage this.source = source; } - public SpeakerStopClientMessage( PacketByteBuf buf ) + public SpeakerStopClientMessage( FriendlyByteBuf buf ) { - source = buf.readUuid(); + source = buf.readUUID(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { - buf.writeUuid( source ); + buf.writeUUID( source ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java b/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java index 0ecfe413c..49d704f8b 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java +++ b/src/main/java/dan200/computercraft/shared/network/client/TerminalState.java @@ -11,9 +11,8 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufOutputStream; import io.netty.buffer.Unpooled; -import net.minecraft.network.PacketByteBuf; - import javax.annotation.Nullable; +import net.minecraft.network.FriendlyByteBuf; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -62,11 +61,11 @@ public class TerminalState height = terminal.getHeight(); ByteBuf buf = buffer = Unpooled.buffer(); - terminal.write( new PacketByteBuf( buf ) ); + terminal.write( new FriendlyByteBuf( buf ) ); } } - public TerminalState( PacketByteBuf buf ) + public TerminalState( FriendlyByteBuf buf ) { colour = buf.readBoolean(); compress = buf.readBoolean(); @@ -124,7 +123,7 @@ public class TerminalState } } - public void write( PacketByteBuf buf ) + public void write( FriendlyByteBuf buf ) { buf.writeBoolean( colour ); buf.writeBoolean( compress ); @@ -191,6 +190,6 @@ public class TerminalState { throw new NullPointerException( "buffer" ); } - terminal.read( new PacketByteBuf( buffer ) ); + terminal.read( new FriendlyByteBuf( buffer ) ); } } diff --git a/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java b/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java index 012908bd4..3dbaa8406 100644 --- a/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/client/UploadResultMessage.java @@ -10,11 +10,10 @@ import dan200.computercraft.client.gui.OptionScreen; import dan200.computercraft.shared.computer.upload.UploadResult; import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.Text; - +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import javax.annotation.Nonnull; public class UploadResultMessage implements NetworkMessage @@ -23,33 +22,33 @@ public class UploadResultMessage implements NetworkMessage public static final UploadResultMessage OUT_OF_SPACE = new UploadResultMessage( UploadResult.ERROR, UploadResult.OUT_OF_SPACE_MSG ); private final UploadResult result; - private final Text message; + private final Component message; - public UploadResultMessage( UploadResult result, Text message ) + public UploadResultMessage( UploadResult result, Component message ) { this.result = result; this.message = message; } - public UploadResultMessage( @Nonnull PacketByteBuf buf ) + public UploadResultMessage( @Nonnull FriendlyByteBuf buf ) { - result = buf.readEnumConstant( UploadResult.class ); - message = buf.readText(); + result = buf.readEnum( UploadResult.class ); + message = buf.readComponent(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { - buf.writeEnumConstant( result ); - buf.writeText( message ); + buf.writeEnum( result ); + buf.writeComponent( message ); } @Override public void handle( PacketContext context ) { - MinecraftClient minecraft = MinecraftClient.getInstance(); + Minecraft minecraft = Minecraft.getInstance(); - Screen screen = OptionScreen.unwrap( minecraft.currentScreen ); + Screen screen = OptionScreen.unwrap( minecraft.screen ); if( screen instanceof ComputerScreenBase ) { ((ComputerScreenBase) screen).uploadResult( result, message ); diff --git a/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java b/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java index 7edd25185..f39a12acf 100644 --- a/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java +++ b/src/main/java/dan200/computercraft/shared/network/container/ComputerContainerData.java @@ -8,7 +8,7 @@ package dan200.computercraft.shared.network.container; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.FriendlyByteBuf; public class ComputerContainerData implements ContainerData { @@ -21,17 +21,17 @@ public class ComputerContainerData implements ContainerData family = computer.getFamily(); } - public ComputerContainerData( PacketByteBuf byteBuf ) + public ComputerContainerData( FriendlyByteBuf byteBuf ) { id = byteBuf.readInt(); - family = byteBuf.readEnumConstant( ComputerFamily.class ); + family = byteBuf.readEnum( ComputerFamily.class ); } @Override - public void toBytes( PacketByteBuf buf ) + public void toBytes( FriendlyByteBuf buf ) { buf.writeInt( id ); - buf.writeEnumConstant( family ); + buf.writeEnum( family ); } public int getInstanceId() diff --git a/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java b/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java index c29d774b8..9f04a309a 100644 --- a/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java +++ b/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java @@ -7,14 +7,13 @@ package dan200.computercraft.shared.network.container; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.util.Identifier; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; import javax.annotation.Nonnull; import java.util.function.Function; @@ -23,7 +22,7 @@ import java.util.function.Function; */ public interface ContainerData { - static ScreenHandlerType toType( Identifier identifier, Function reader, + static MenuType toType( ResourceLocation identifier, Function reader, Factory factory ) { return ScreenHandlerRegistry.registerExtended( identifier, @@ -31,7 +30,7 @@ public interface ContainerData playerInventory, reader.apply( packetByteBuf ) ) ); } - static ScreenHandlerType toType( Identifier identifier, ScreenHandlerType type, Function reader, + static MenuType toType( ResourceLocation identifier, MenuType type, Function reader, FixedFactory factory ) { return ScreenHandlerRegistry.registerExtended( identifier, @@ -40,21 +39,21 @@ public interface ContainerData reader.apply( packetByteBuf ) ) ); } - void toBytes( PacketByteBuf buf ); + void toBytes( FriendlyByteBuf buf ); - default void open( PlayerEntity player, NamedScreenHandlerFactory owner ) + default void open( Player player, MenuProvider owner ) { - if ( player.world.isClient ) return; - player.openHandledScreen( owner ); + if ( player.level.isClientSide ) return; + player.openMenu( owner ); } - interface Factory + interface Factory { - C create( int id, @Nonnull PlayerInventory inventory, T data ); + C create( int id, @Nonnull Inventory inventory, T data ); } - interface FixedFactory + interface FixedFactory { - C create( ScreenHandlerType type, int id, @Nonnull PlayerInventory inventory, T data ); + C create( MenuType type, int id, @Nonnull Inventory inventory, T data ); } } diff --git a/src/main/java/dan200/computercraft/shared/network/container/HeldItemContainerData.java b/src/main/java/dan200/computercraft/shared/network/container/HeldItemContainerData.java index a32e35af0..a63f6da75 100644 --- a/src/main/java/dan200/computercraft/shared/network/container/HeldItemContainerData.java +++ b/src/main/java/dan200/computercraft/shared/network/container/HeldItemContainerData.java @@ -7,10 +7,9 @@ package dan200.computercraft.shared.network.container; import dan200.computercraft.shared.common.ContainerHeldItem; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.Hand; - import javax.annotation.Nonnull; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.InteractionHand; /** * Opens a printout GUI based on the currently held item. @@ -20,26 +19,26 @@ import javax.annotation.Nonnull; */ public class HeldItemContainerData implements ContainerData { - private final Hand hand; + private final InteractionHand hand; - public HeldItemContainerData( Hand hand ) + public HeldItemContainerData( InteractionHand hand ) { this.hand = hand; } - public HeldItemContainerData( PacketByteBuf buffer ) + public HeldItemContainerData( FriendlyByteBuf buffer ) { - hand = buffer.readEnumConstant( Hand.class ); + hand = buffer.readEnum( InteractionHand.class ); } @Override - public void toBytes( PacketByteBuf buf ) + public void toBytes( FriendlyByteBuf buf ) { - buf.writeEnumConstant( hand ); + buf.writeEnum( hand ); } @Nonnull - public Hand getHand() + public InteractionHand getHand() { return hand; } diff --git a/src/main/java/dan200/computercraft/shared/network/container/ViewComputerContainerData.java b/src/main/java/dan200/computercraft/shared/network/container/ViewComputerContainerData.java index 7999ca681..dc4cf0850 100644 --- a/src/main/java/dan200/computercraft/shared/network/container/ViewComputerContainerData.java +++ b/src/main/java/dan200/computercraft/shared/network/container/ViewComputerContainerData.java @@ -8,9 +8,8 @@ package dan200.computercraft.shared.network.container; import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.shared.computer.core.ServerComputer; -import net.minecraft.network.PacketByteBuf; - import javax.annotation.Nonnull; +import net.minecraft.network.FriendlyByteBuf; /** * View an arbitrary computer on the client. @@ -37,7 +36,7 @@ public class ViewComputerContainerData extends ComputerContainerData } } - public ViewComputerContainerData( PacketByteBuf buffer ) + public ViewComputerContainerData( FriendlyByteBuf buffer ) { super( buffer ); width = buffer.readVarInt(); @@ -45,7 +44,7 @@ public class ViewComputerContainerData extends ComputerContainerData } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); buf.writeVarInt( width ); diff --git a/src/main/java/dan200/computercraft/shared/network/server/ComputerActionServerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/ComputerActionServerMessage.java index 00395bbca..d9bf0e045 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/ComputerActionServerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/ComputerActionServerMessage.java @@ -9,8 +9,7 @@ package dan200.computercraft.shared.network.server; import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.ServerComputer; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; public class ComputerActionServerMessage extends ComputerServerMessage @@ -23,17 +22,17 @@ public class ComputerActionServerMessage extends ComputerServerMessage this.action = action; } - public ComputerActionServerMessage( @Nonnull PacketByteBuf buf ) + public ComputerActionServerMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); - action = buf.readEnumConstant( Action.class ); + action = buf.readEnum( Action.class ); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); - buf.writeEnumConstant( action ); + buf.writeEnum( action ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java index 3acf35e38..a4444ca44 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/ComputerServerMessage.java @@ -11,8 +11,7 @@ import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; /** @@ -29,13 +28,13 @@ public abstract class ComputerServerMessage implements NetworkMessage this.instanceId = instanceId; } - public ComputerServerMessage( @Nonnull PacketByteBuf buf ) + public ComputerServerMessage( @Nonnull FriendlyByteBuf buf ) { instanceId = buf.readVarInt(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { buf.writeVarInt( instanceId ); } diff --git a/src/main/java/dan200/computercraft/shared/network/server/ContinueUploadMessage.java b/src/main/java/dan200/computercraft/shared/network/server/ContinueUploadMessage.java index 557433f63..038bb9278 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/ContinueUploadMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/ContinueUploadMessage.java @@ -8,9 +8,8 @@ package dan200.computercraft.shared.network.server; import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.ServerComputer; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import javax.annotation.Nonnull; public class ContinueUploadMessage extends ComputerServerMessage @@ -23,14 +22,14 @@ public class ContinueUploadMessage extends ComputerServerMessage this.overwrite = overwrite; } - public ContinueUploadMessage( @Nonnull PacketByteBuf buf ) + public ContinueUploadMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); overwrite = buf.readBoolean(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); buf.writeBoolean( overwrite ); @@ -39,7 +38,7 @@ public class ContinueUploadMessage extends ComputerServerMessage @Override protected void handle( PacketContext context, @Nonnull ServerComputer computer, @Nonnull IContainerComputer container ) { - ServerPlayerEntity player = (ServerPlayerEntity) context.getPlayer(); + ServerPlayer player = (ServerPlayer) context.getPlayer(); if( player != null ) container.confirmUpload( player, overwrite ); } } diff --git a/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java index cf00e23f0..b2408449b 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/KeyEventServerMessage.java @@ -10,8 +10,7 @@ import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.InputState; import dan200.computercraft.shared.computer.core.ServerComputer; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; public class KeyEventServerMessage extends ComputerServerMessage @@ -30,7 +29,7 @@ public class KeyEventServerMessage extends ComputerServerMessage this.key = key; } - public KeyEventServerMessage( @Nonnull PacketByteBuf buf ) + public KeyEventServerMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); type = buf.readByte(); @@ -38,7 +37,7 @@ public class KeyEventServerMessage extends ComputerServerMessage } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); buf.writeByte( type ); diff --git a/src/main/java/dan200/computercraft/shared/network/server/MouseEventServerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/MouseEventServerMessage.java index 872f168ed..5959fca6b 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/MouseEventServerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/MouseEventServerMessage.java @@ -10,8 +10,7 @@ import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.InputState; import dan200.computercraft.shared.computer.core.ServerComputer; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; public class MouseEventServerMessage extends ComputerServerMessage @@ -35,7 +34,7 @@ public class MouseEventServerMessage extends ComputerServerMessage this.y = y; } - public MouseEventServerMessage( @Nonnull PacketByteBuf buf ) + public MouseEventServerMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); type = buf.readByte(); @@ -45,7 +44,7 @@ public class MouseEventServerMessage extends ComputerServerMessage } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); buf.writeByte( type ); diff --git a/src/main/java/dan200/computercraft/shared/network/server/QueueEventServerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/QueueEventServerMessage.java index 730d7b6f9..991ee5a27 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/QueueEventServerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/QueueEventServerMessage.java @@ -10,9 +10,8 @@ import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.util.NBTUtil; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -34,20 +33,20 @@ public class QueueEventServerMessage extends ComputerServerMessage this.args = args; } - public QueueEventServerMessage( @Nonnull PacketByteBuf buf ) + public QueueEventServerMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); - event = buf.readString( Short.MAX_VALUE ); + event = buf.readUtf( Short.MAX_VALUE ); - NbtCompound args = buf.readNbt(); + CompoundTag args = buf.readNbt(); this.args = args == null ? null : NBTUtil.decodeObjects( args ); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); - buf.writeString( event ); + buf.writeUtf( event ); buf.writeNbt( args == null ? null : NBTUtil.encodeObjects( args ) ); } diff --git a/src/main/java/dan200/computercraft/shared/network/server/RequestComputerMessage.java b/src/main/java/dan200/computercraft/shared/network/server/RequestComputerMessage.java index af7f8b29d..f7da4af24 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/RequestComputerMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/RequestComputerMessage.java @@ -10,8 +10,7 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.network.NetworkMessage; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; - +import net.minecraft.network.FriendlyByteBuf; import javax.annotation.Nonnull; public class RequestComputerMessage implements NetworkMessage @@ -23,13 +22,13 @@ public class RequestComputerMessage implements NetworkMessage this.instance = instance; } - public RequestComputerMessage( @Nonnull PacketByteBuf buf ) + public RequestComputerMessage( @Nonnull FriendlyByteBuf buf ) { instance = buf.readVarInt(); } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { buf.writeVarInt( instance ); } diff --git a/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java b/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java index 136ce08bb..8a1bd4f66 100644 --- a/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java +++ b/src/main/java/dan200/computercraft/shared/network/server/UploadFileMessage.java @@ -13,9 +13,8 @@ import dan200.computercraft.shared.computer.upload.FileUpload; import dan200.computercraft.shared.network.NetworkHandler; import io.netty.handler.codec.DecoderException; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import javax.annotation.Nonnull; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -47,10 +46,10 @@ public class UploadFileMessage extends ComputerServerMessage this.slices = slices; } - public UploadFileMessage( @Nonnull PacketByteBuf buf ) + public UploadFileMessage( @Nonnull FriendlyByteBuf buf ) { super( buf ); - uuid = buf.readUuid(); + uuid = buf.readUUID(); int flag = this.flag = buf.readByte(); int totalSize = 0; @@ -62,7 +61,7 @@ public class UploadFileMessage extends ComputerServerMessage List files = this.files = new ArrayList<>( nFiles ); for( int i = 0; i < nFiles; i++ ) { - String name = buf.readString( MAX_FILE_NAME ); + String name = buf.readUtf( MAX_FILE_NAME ); int size = buf.readVarInt(); if( size > MAX_SIZE || (totalSize += size) >= MAX_SIZE ) { @@ -99,10 +98,10 @@ public class UploadFileMessage extends ComputerServerMessage } @Override - public void toBytes( @Nonnull PacketByteBuf buf ) + public void toBytes( @Nonnull FriendlyByteBuf buf ) { super.toBytes( buf ); - buf.writeUuid( uuid ); + buf.writeUUID( uuid ); buf.writeByte( flag ); if( (flag & FLAG_FIRST) != 0 ) @@ -110,7 +109,7 @@ public class UploadFileMessage extends ComputerServerMessage buf.writeVarInt( files.size() ); for( FileUpload file : files ) { - buf.writeString( file.getName(), MAX_FILE_NAME ); + buf.writeUtf( file.getName(), MAX_FILE_NAME ); buf.writeVarInt( file.getLength() ); buf.writeBytes( file.getChecksum() ); } @@ -175,7 +174,7 @@ public class UploadFileMessage extends ComputerServerMessage @Override protected void handle( PacketContext context, @Nonnull ServerComputer computer, @Nonnull IContainerComputer container ) { - ServerPlayerEntity player = (ServerPlayerEntity) context.getPlayer(); + ServerPlayer player = (ServerPlayer) context.getPlayer(); if( player != null ) { if( (flag & FLAG_FIRST) != 0 ) container.startUpload( uuid, files ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java index c812dd91b..b6ada9750 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/commandblock/CommandBlockPeripheral.java @@ -10,10 +10,9 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.computer.apis.CommandAPI; -import net.minecraft.block.entity.CommandBlockBlockEntity; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.CommandBlockEntity; /** * This peripheral allows you to interact with command blocks. @@ -26,11 +25,11 @@ import javax.annotation.Nonnull; */ public class CommandBlockPeripheral implements IPeripheral { - private static final Identifier CAP_ID = new Identifier( ComputerCraft.MOD_ID, "command_block" ); + private static final ResourceLocation CAP_ID = new ResourceLocation( ComputerCraft.MOD_ID, "command_block" ); - private final CommandBlockBlockEntity commandBlock; + private final CommandBlockEntity commandBlock; - public CommandBlockPeripheral( CommandBlockBlockEntity commandBlock ) + public CommandBlockPeripheral( CommandBlockEntity commandBlock ) { this.commandBlock = commandBlock; } @@ -63,7 +62,7 @@ public class CommandBlockPeripheral implements IPeripheral @LuaFunction( mainThread = true ) public final String getCommand() { - return commandBlock.getCommandExecutor() + return commandBlock.getCommandBlock() .getCommand(); } @@ -75,10 +74,10 @@ public class CommandBlockPeripheral implements IPeripheral @LuaFunction( mainThread = true ) public final void setCommand( String command ) { - commandBlock.getCommandExecutor() + commandBlock.getCommandBlock() .setCommand( command ); - commandBlock.getCommandExecutor() - .markDirty(); + commandBlock.getCommandBlock() + .onUpdated(); } /** @@ -91,9 +90,9 @@ public class CommandBlockPeripheral implements IPeripheral @LuaFunction( mainThread = true ) public final Object[] runCommand() { - commandBlock.getCommandExecutor() - .execute( commandBlock.getWorld() ); - int result = commandBlock.getCommandExecutor() + commandBlock.getCommandBlock() + .performCommand( commandBlock.getLevel() ); + int result = commandBlock.getCommandBlock() .getSuccessCount(); return result > 0 ? new Object[] { true } : new Object[] { false, "Command failed" }; } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java index 295054c01..37e05fbc6 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java @@ -8,99 +8,98 @@ package dan200.computercraft.shared.peripheral.diskdrive; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityTicker; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.stat.Stats; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.Nameable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.stats.Stats; +import net.minecraft.world.Nameable; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; public class BlockDiskDrive extends BlockGeneric { - static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; - static final EnumProperty STATE = EnumProperty.of( "state", DiskDriveState.class ); + static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + static final EnumProperty STATE = EnumProperty.create( "state", DiskDriveState.class ); - public BlockDiskDrive( Settings settings ) + public BlockDiskDrive( Properties settings ) { super( settings, ComputerCraftRegistry.ModTiles.DISK_DRIVE ); - setDefaultState( getStateManager().getDefaultState() - .with( FACING, Direction.NORTH ) - .with( STATE, DiskDriveState.EMPTY ) ); + registerDefaultState( getStateDefinition().any() + .setValue( FACING, Direction.NORTH ) + .setValue( STATE, DiskDriveState.EMPTY ) ); } @Nullable @Override - public BlockState getPlacementState( ItemPlacementContext placement ) + public BlockState getStateForPlacement( BlockPlaceContext placement ) { - return getDefaultState().with( FACING, - placement.getPlayerFacing() + return defaultBlockState().setValue( FACING, + placement.getHorizontalDirection() .getOpposite() ); } @Nullable @Override - public BlockEntityTicker getTicker( World world, BlockState state, BlockEntityType type ) + public BlockEntityTicker getTicker( Level world, BlockState state, BlockEntityType type ) { - return world.isClient ? null : BlockDiskDrive.checkType( type, ComputerCraftRegistry.ModTiles.DISK_DRIVE, TileDiskDrive::tick ); + return world.isClientSide ? null : BlockDiskDrive.createTickerHelper( type, ComputerCraftRegistry.ModTiles.DISK_DRIVE, TileDiskDrive::tick ); } @Override - public void afterBreak( - @Nonnull World world, @Nonnull PlayerEntity player, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable BlockEntity te, @Nonnull ItemStack stack + public void playerDestroy( + @Nonnull Level world, @Nonnull Player player, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable BlockEntity te, @Nonnull ItemStack stack ) { if( te instanceof Nameable && ((Nameable) te).hasCustomName() ) { - player.incrementStat( Stats.MINED.getOrCreateStat( this ) ); - player.addExhaustion( 0.005F ); + player.awardStat( Stats.BLOCK_MINED.get( this ) ); + player.causeFoodExhaustion( 0.005F ); ItemStack result = new ItemStack( this ); - result.setCustomName( ((Nameable) te).getCustomName() ); - dropStack( world, pos, result ); + result.setHoverName( ((Nameable) te).getCustomName() ); + popResource( world, pos, result ); } else { - super.afterBreak( world, player, pos, state, te, stack ); + super.playerDestroy( world, player, pos, state, te, stack ); } } @Override - public void onPlaced( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, ItemStack stack ) + public void setPlacedBy( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, ItemStack stack ) { - if( stack.hasCustomName() ) + if( stack.hasCustomHoverName() ) { BlockEntity tileentity = world.getBlockEntity( pos ); if( tileentity instanceof TileDiskDrive ) { - ((TileDiskDrive) tileentity).customName = stack.getName(); + ((TileDiskDrive) tileentity).customName = stack.getHoverName(); } } } @Override - protected void appendProperties( StateManager.Builder properties ) + protected void createBlockStateDefinition( StateDefinition.Builder properties ) { properties.add( FACING, STATE ); } @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileDiskDrive( ComputerCraftRegistry.ModTiles.DISK_DRIVE, pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/ContainerDiskDrive.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/ContainerDiskDrive.java index 385fe16b1..a5d2245d7 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/ContainerDiskDrive.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/ContainerDiskDrive.java @@ -7,26 +7,25 @@ package dan200.computercraft.shared.peripheral.diskdrive; import dan200.computercraft.shared.ComputerCraftRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.slot.Slot; - import javax.annotation.Nonnull; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; -public class ContainerDiskDrive extends ScreenHandler +public class ContainerDiskDrive extends AbstractContainerMenu { - private final Inventory inventory; + private final Container inventory; - public ContainerDiskDrive( int id, PlayerInventory player ) + public ContainerDiskDrive( int id, Inventory player ) { - this( id, player, new SimpleInventory( 1 ) ); + this( id, player, new SimpleContainer( 1 ) ); } - public ContainerDiskDrive( int id, PlayerInventory player, Inventory inventory ) + public ContainerDiskDrive( int id, Inventory player, Container inventory ) { super( ComputerCraftRegistry.ModContainers.DISK_DRIVE, id ); @@ -50,21 +49,21 @@ public class ContainerDiskDrive extends ScreenHandler @Nonnull @Override - public ItemStack transferSlot( @Nonnull PlayerEntity player, int slotIndex ) + public ItemStack quickMoveStack( @Nonnull Player player, int slotIndex ) { Slot slot = slots.get( slotIndex ); - if( slot == null || !slot.hasStack() ) + if( slot == null || !slot.hasItem() ) { return ItemStack.EMPTY; } - ItemStack existing = slot.getStack() + ItemStack existing = slot.getItem() .copy(); ItemStack result = existing.copy(); if( slotIndex == 0 ) { // Insert into player inventory - if( !insertItem( existing, 1, 37, true ) ) + if( !moveItemStackTo( existing, 1, 37, true ) ) { return ItemStack.EMPTY; } @@ -72,7 +71,7 @@ public class ContainerDiskDrive extends ScreenHandler else { // Insert into drive inventory - if( !insertItem( existing, 0, 1, false ) ) + if( !moveItemStackTo( existing, 0, 1, false ) ) { return ItemStack.EMPTY; } @@ -80,11 +79,11 @@ public class ContainerDiskDrive extends ScreenHandler if( existing.isEmpty() ) { - slot.setStack( ItemStack.EMPTY ); + slot.set( ItemStack.EMPTY ); } else { - slot.markDirty(); + slot.setChanged(); } if( existing.getCount() == result.getCount() ) @@ -92,13 +91,13 @@ public class ContainerDiskDrive extends ScreenHandler return ItemStack.EMPTY; } - slot.onTakeItem( player, existing ); + slot.onTake( player, existing ); return result; } @Override - public boolean canUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { - return inventory.canPlayerUse( player ); + return inventory.stillValid( player ); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java index 91ee5bc82..fe074ca4c 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java @@ -14,10 +14,9 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.MediaProviders; import dan200.computercraft.shared.media.items.ItemDisk; import dan200.computercraft.shared.util.StringUtil; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.item.ItemStack; import java.util.Optional; /** diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveState.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveState.java index 1e146c3c7..1891bf501 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveState.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveState.java @@ -6,11 +6,10 @@ package dan200.computercraft.shared.peripheral.diskdrive; -import net.minecraft.util.StringIdentifiable; - import javax.annotation.Nonnull; +import net.minecraft.util.StringRepresentable; -public enum DiskDriveState implements StringIdentifiable +public enum DiskDriveState implements StringRepresentable { EMPTY( "empty" ), FULL( "full" ), INVALID( "invalid" ); @@ -23,7 +22,7 @@ public enum DiskDriveState implements StringIdentifiable @Override @Nonnull - public String asString() + public String getSerializedName() { return name; } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/TileDiskDrive.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/TileDiskDrive.java index 957f209b3..529aadab2 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/TileDiskDrive.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/TileDiskDrive.java @@ -17,38 +17,37 @@ import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.util.DefaultInventory; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.RecordUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Nameable; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.Nameable; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import java.util.HashMap; import java.util.Map; import java.util.Set; -public final class TileDiskDrive extends TileGeneric implements DefaultInventory, IPeripheralTile, Nameable, NamedScreenHandlerFactory +public final class TileDiskDrive extends TileGeneric implements DefaultInventory, IPeripheralTile, Nameable, MenuProvider { private static final String NBT_NAME = "CustomName"; private static final String NBT_ITEM = "Item"; private final Map computers = new HashMap<>(); - Text customName; + Component customName; @Nonnull private ItemStack diskStack = ItemStack.EMPTY; private IMount diskMount = null; @@ -74,81 +73,81 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - if( player.isInSneakingPose() ) + if( player.isCrouching() ) { // Try to put a disk into the drive - ItemStack disk = player.getStackInHand( hand ); + ItemStack disk = player.getItemInHand( hand ); if( disk.isEmpty() ) { - return ActionResult.PASS; + return InteractionResult.PASS; } - if( !getWorld().isClient && getStack( 0 ).isEmpty() && MediaProviders.get( disk ) != null ) + if( !getLevel().isClientSide && getItem( 0 ).isEmpty() && MediaProviders.get( disk ) != null ) { setDiskStack( disk ); - player.setStackInHand( hand, ItemStack.EMPTY ); + player.setItemInHand( hand, ItemStack.EMPTY ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } else { // Open the GUI - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { - player.openHandledScreen( this ); + player.openMenu( this ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } public Direction getDirection() { - return getCachedState().get( BlockDiskDrive.FACING ); + return getBlockState().getValue( BlockDiskDrive.FACING ); } @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); - customName = nbt.contains( NBT_NAME ) ? Text.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null; + super.load( nbt ); + customName = nbt.contains( NBT_NAME ) ? Component.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null; if( nbt.contains( NBT_ITEM ) ) { - NbtCompound item = nbt.getCompound( NBT_ITEM ); - diskStack = ItemStack.fromNbt( item ); + CompoundTag item = nbt.getCompound( NBT_ITEM ); + diskStack = ItemStack.of( item ); diskMount = null; } } @Nonnull @Override - public NbtCompound writeNbt( @Nonnull NbtCompound nbt ) + public CompoundTag save( @Nonnull CompoundTag nbt ) { if( customName != null ) { - nbt.putString( NBT_NAME, Text.Serializer.toJson( customName ) ); + nbt.putString( NBT_NAME, Component.Serializer.toJson( customName ) ); } if( !diskStack.isEmpty() ) { - NbtCompound item = new NbtCompound(); - diskStack.writeNbt( item ); + CompoundTag item = new CompoundTag(); + diskStack.save( item ); nbt.put( NBT_ITEM, item ); } - return super.writeNbt( nbt ); + return super.save( nbt ); } @Override - public void markDirty() + public void setChanged() { - if( !world.isClient ) + if( !level.isClientSide ) { updateBlockState(); } - super.markDirty(); + super.setChanged(); } - public static void tick( World world, BlockPos pos, BlockState state, TileDiskDrive tileDiskDrive ) + public static void tick( Level world, BlockPos pos, BlockState state, TileDiskDrive tileDiskDrive ) { // Ejection if( tileDiskDrive.ejectQueued ) @@ -160,7 +159,7 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory // Music synchronized( tileDiskDrive ) { - if( !world.isClient && tileDiskDrive.recordPlaying != tileDiskDrive.recordQueued || tileDiskDrive.restartRecord ) + if( !world.isClientSide && tileDiskDrive.recordPlaying != tileDiskDrive.recordQueued || tileDiskDrive.restartRecord ) { tileDiskDrive.restartRecord = false; if( tileDiskDrive.recordQueued ) @@ -189,7 +188,7 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory // IInventory implementation @Override - public int size() + public int getContainerSize() { return 1; } @@ -202,14 +201,14 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory @Nonnull @Override - public ItemStack getStack( int slot ) + public ItemStack getItem( int slot ) { return diskStack; } @Nonnull @Override - public ItemStack removeStack( int slot, int count ) + public ItemStack removeItem( int slot, int count ) { if( diskStack.isEmpty() ) { @@ -219,18 +218,18 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory if( diskStack.getCount() <= count ) { ItemStack disk = diskStack; - setStack( slot, ItemStack.EMPTY ); + setItem( slot, ItemStack.EMPTY ); return disk; } ItemStack part = diskStack.split( count ); - setStack( slot, diskStack.isEmpty() ? ItemStack.EMPTY : diskStack ); + setItem( slot, diskStack.isEmpty() ? ItemStack.EMPTY : diskStack ); return part; } @Nonnull @Override - public ItemStack removeStack( int slot ) + public ItemStack removeItemNoUpdate( int slot ) { ItemStack result = diskStack; diskStack = ItemStack.EMPTY; @@ -240,13 +239,13 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory } @Override - public void setStack( int slot, @Nonnull ItemStack stack ) + public void setItem( int slot, @Nonnull ItemStack stack ) { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { diskStack = stack; diskMount = null; - markDirty(); + setChanged(); return; } @@ -280,7 +279,7 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory // Swap disk over diskStack = stack; diskMount = null; - markDirty(); + setChanged(); // Mount new disk if( !diskStack.isEmpty() ) @@ -295,15 +294,15 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory } @Override - public boolean canPlayerUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { return isUsable( player, false ); } @Override - public void clear() + public void clearContent() { - setStack( 0, ItemStack.EMPTY ); + setItem( 0, ItemStack.EMPTY ); } @Nonnull @@ -341,7 +340,7 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory { if( diskMount == null ) { - diskMount = contents.createDataMount( diskStack, getWorld() ); + diskMount = contents.createDataMount( diskStack, getLevel() ); } if( diskMount != null ) { @@ -383,12 +382,12 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory @Nonnull ItemStack getDiskStack() { - return getStack( 0 ); + return getItem( 0 ); } void setDiskStack( @Nonnull ItemStack stack ) { - setStack( 0, stack ); + setItem( 0, stack ); } void unmount( IComputerAccess computer ) @@ -449,7 +448,7 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory private void updateBlockState() { - if( removed ) + if( remove ) { return; } @@ -467,18 +466,18 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory private void updateBlockState( DiskDriveState state ) { - BlockState blockState = getCachedState(); - if( blockState.get( BlockDiskDrive.STATE ) == state ) + BlockState blockState = getBlockState(); + if( blockState.getValue( BlockDiskDrive.STATE ) == state ) { return; } - getWorld().setBlockState( getPos(), blockState.with( BlockDiskDrive.STATE, state ) ); + getLevel().setBlockAndUpdate( getBlockPos(), blockState.setValue( BlockDiskDrive.STATE, state ) ); } private synchronized void ejectContents( boolean destroyed ) { - if( this.world.isClient || diskStack.isEmpty() ) + if( this.level.isClientSide || diskStack.isEmpty() ) { return; } @@ -493,21 +492,21 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory if( !destroyed ) { Direction dir = getDirection(); - xOff = dir.getOffsetX(); - zOff = dir.getOffsetZ(); + xOff = dir.getStepX(); + zOff = dir.getStepZ(); } - BlockPos pos = getPos(); + BlockPos pos = getBlockPos(); double x = pos.getX() + 0.5 + xOff * 0.5; double y = pos.getY() + 0.75; double z = pos.getZ() + 0.5 + zOff * 0.5; - ItemEntity entityitem = new ItemEntity( getWorld(), x, y, z, disks ); - entityitem.setVelocity( xOff * 0.15, 0, zOff * 0.15 ); + ItemEntity entityitem = new ItemEntity( getLevel(), x, y, z, disks ); + entityitem.setDeltaMovement( xOff * 0.15, 0, zOff * 0.15 ); - getWorld().spawnEntity( entityitem ); + getLevel().addFreshEntity( entityitem ); if( !destroyed ) { - getWorld().syncGlobalEvent( 1000, getPos(), 0 ); + getLevel().globalLevelEvent( 1000, getBlockPos(), 0 ); } } @@ -517,11 +516,11 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory SoundEvent record = contents != null ? contents.getAudio( diskStack ) : null; if( record != null ) { - RecordUtil.playRecord( record, contents.getAudioTitle( diskStack ), getWorld(), getPos() ); + RecordUtil.playRecord( record, contents.getAudioTitle( diskStack ), getLevel(), getBlockPos() ); } else { - RecordUtil.playRecord( null, null, getWorld(), getPos() ); + RecordUtil.playRecord( null, null, getLevel(), getBlockPos() ); } } @@ -529,15 +528,15 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory private void stopRecord() { - RecordUtil.playRecord( null, null, getWorld(), getPos() ); + RecordUtil.playRecord( null, null, getLevel(), getBlockPos() ); } @Nonnull @Override - public Text getName() + public Component getName() { - return customName != null ? customName : new TranslatableText( getCachedState().getBlock() - .getTranslationKey() ); + return customName != null ? customName : new TranslatableComponent( getBlockState().getBlock() + .getDescriptionId() ); } @Override @@ -548,21 +547,21 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory @Nonnull @Override - public Text getDisplayName() + public Component getDisplayName() { return Nameable.super.getDisplayName(); } @Nullable @Override - public Text getCustomName() + public Component getCustomName() { return customName; } @Nonnull @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory inventory, @Nonnull Player player ) { return new ContainerDiskDrive( id, inventory, this ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java index c4c59ee4a..48bcf77c5 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheral.java @@ -12,12 +12,11 @@ import dan200.computercraft.api.lua.MethodResult; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IDynamicPeripheral; import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import java.util.List; class GenericPeripheral implements IDynamicPeripheral @@ -28,7 +27,7 @@ class GenericPeripheral implements IDynamicPeripheral GenericPeripheral( BlockEntity tile, List methods ) { - Identifier type = BlockEntityType.getId( tile.getType() ); + ResourceLocation type = BlockEntityType.getKey( tile.getType() ); this.tile = tile; this.type = type == null ? "unknown" : type.toString(); this.methods = methods; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java index d4b3e0b16..a6dfbe1a2 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java @@ -8,20 +8,19 @@ package dan200.computercraft.shared.peripheral.generic; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.core.asm.NamedMethod; import dan200.computercraft.core.asm.PeripheralMethod; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import java.util.ArrayList; import java.util.List; public class GenericPeripheralProvider { @Nullable - public static IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side ) + public static IPeripheral getPeripheral( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Direction side ) { BlockEntity tile = world.getBlockEntity( pos ); if( tile == null ) return null; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/BlockData.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/BlockData.java index 4b9a9e0ed..ad965520c 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/BlockData.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/BlockData.java @@ -6,10 +6,9 @@ package dan200.computercraft.shared.peripheral.generic.data; import com.google.common.collect.ImmutableMap; -import net.minecraft.block.BlockState; -import net.minecraft.state.property.Property; - import javax.annotation.Nonnull; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import java.util.HashMap; import java.util.Map; @@ -21,7 +20,7 @@ public class BlockData data.put( "name", DataHelpers.getId( state.getBlock() ) ); Map stateTable = new HashMap<>(); - for( ImmutableMap.Entry, ? extends Comparable> entry : state.getEntries().entrySet() ) + for( ImmutableMap.Entry, ? extends Comparable> entry : state.getValues().entrySet() ) { Property property = entry.getKey(); stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) ); @@ -35,6 +34,6 @@ public class BlockData private static Object getPropertyValue( Property property, Comparable value ) { if( value instanceof String || value instanceof Number || value instanceof Boolean ) return value; - return property.name( value ); + return property.getName( value ); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DataHelpers.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DataHelpers.java index 210aa5b5a..fd771675b 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DataHelpers.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/DataHelpers.java @@ -5,14 +5,13 @@ */ package dan200.computercraft.shared.peripheral.generic.data; -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.block.Block; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -23,31 +22,31 @@ public final class DataHelpers { } @Nonnull - public static Map getTags( @Nonnull Collection tags ) + public static Map getTags( @Nonnull Collection tags ) { Map result = new HashMap<>( tags.size() ); - for( Identifier location : tags ) result.put( location.toString(), true ); + for( ResourceLocation location : tags ) result.put( location.toString(), true ); return result; } @Nullable public static String getId( @Nonnull Block block ) { - Identifier id = Registry.BLOCK.getId( block ); + ResourceLocation id = Registry.BLOCK.getKey( block ); return id == null ? null : id.toString(); } @Nullable public static String getId( @Nonnull Item item ) { - Identifier id = Registry.ITEM.getId( item ); + ResourceLocation id = Registry.ITEM.getKey( item ); return id == null ? null : id.toString(); } @Nullable public static String getId( @Nonnull Enchantment enchantment ) { - Identifier id = Registry.ENCHANTMENT.getId( enchantment ); + ResourceLocation id = Registry.ENCHANTMENT.getKey( enchantment ); return id == null ? null : id.toString(); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/ItemData.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/ItemData.java index a5781483a..61cb8e68a 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/data/ItemData.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/data/ItemData.java @@ -7,21 +7,20 @@ package dan200.computercraft.shared.peripheral.generic.data; import com.google.gson.JsonParseException; import dan200.computercraft.shared.util.NBTUtil; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.item.EnchantedBookItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtElement; -import net.minecraft.tag.ServerTagManagerHolder; -import net.minecraft.tag.TagGroup; -import net.minecraft.text.Text; -import net.minecraft.util.registry.Registry; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.SerializationTags; +import net.minecraft.tags.TagCollection; +import net.minecraft.world.item.EnchantedBookItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import java.util.*; import java.util.stream.Collectors; @@ -43,7 +42,7 @@ public class ItemData public static > T fillBasic( @Nonnull T data, @Nonnull ItemStack stack ) { fillBasicSafe( data, stack ); - String hash = NBTUtil.getNBTHash( stack.getNbt() ); + String hash = NBTUtil.getNBTHash( stack.getTag() ); if( hash != null ) data.put( "nbt", hash ); return data; @@ -56,39 +55,39 @@ public class ItemData fillBasic( data, stack ); - data.put( "displayName", stack.getName().getString() ); - data.put( "maxCount", stack.getMaxCount() ); + data.put( "displayName", stack.getHoverName().getString() ); + data.put( "maxCount", stack.getMaxStackSize() ); - if( stack.isDamageable() ) + if( stack.isDamageableItem() ) { - data.put( "damage", stack.getDamage() ); + data.put( "damage", stack.getDamageValue() ); data.put( "maxDamage", stack.getMaxDamage() ); } if( stack.isDamaged() ) { - data.put( "durability", (double) stack.getDamage() / stack.getMaxDamage() ); + data.put( "durability", (double) stack.getDamageValue() / stack.getMaxDamage() ); } // requireNonNull is safe because we got the Identifiers out of the TagGroup to start with. Would be nicer // to stream the tags directly but TagGroup isn't a collection :( - TagGroup itemTags = ServerTagManagerHolder.getTagManager().getOrCreateTagGroup( Registry.ITEM_KEY ); - data.put( "tags", DataHelpers.getTags( itemTags.getTagIds().stream() + TagCollection itemTags = SerializationTags.getInstance().getOrEmpty( Registry.ITEM_REGISTRY ); + data.put( "tags", DataHelpers.getTags( itemTags.getAvailableTags().stream() .filter( id -> Objects.requireNonNull( itemTags.getTag( id ) ).contains( stack.getItem() ) ) .collect( Collectors.toList() ) ) ); // chaos x2 - NbtCompound tag = stack.getNbt(); + CompoundTag tag = stack.getTag(); if( tag != null && tag.contains( "display", NBTUtil.TAG_COMPOUND ) ) { - NbtCompound displayTag = tag.getCompound( "display" ); + CompoundTag displayTag = tag.getCompound( "display" ); if( displayTag.contains( "Lore", NBTUtil.TAG_LIST ) ) { - NbtList loreTag = displayTag.getList( "Lore", NBTUtil.TAG_STRING ); + ListTag loreTag = displayTag.getList( "Lore", NBTUtil.TAG_STRING ); data.put( "lore", loreTag.stream() .map( ItemData::parseTextComponent ) .filter( Objects::nonNull ) - .map( Text::getString ) + .map( Component::getString ) .collect( Collectors.toList() ) ); } } @@ -113,11 +112,11 @@ public class ItemData @Nullable - private static Text parseTextComponent( @Nonnull NbtElement x ) + private static Component parseTextComponent( @Nonnull Tag x ) { try { - return Text.Serializer.fromJson( x.toString() ); + return Component.Serializer.fromJson( x.toString() ); } catch( JsonParseException e ) { @@ -139,17 +138,17 @@ public class ItemData if( stack.getItem() instanceof EnchantedBookItem && (hideFlags & 32) == 0 ) { - addEnchantments( EnchantedBookItem.getEnchantmentNbt( stack ), enchants ); + addEnchantments( EnchantedBookItem.getEnchantments( stack ), enchants ); } - if( stack.hasEnchantments() && (hideFlags & 1) == 0 ) + if( stack.isEnchanted() && (hideFlags & 1) == 0 ) { /* * Mimic the EnchantmentHelper.getEnchantments(ItemStack stack) behavior without special case for Enchanted book. * I'll do that to have the same data than ones displayed in tooltip. * @see EnchantmentHelper.getEnchantments(ItemStack stack) */ - addEnchantments( stack.getEnchantments(), enchants ); + addEnchantments( stack.getEnchantmentTags(), enchants ); } return enchants; @@ -162,21 +161,21 @@ public class ItemData * @param enchants The enchantment map to add it to. * @see EnchantmentHelper */ - private static void addEnchantments( @Nonnull NbtList rawEnchants, @Nonnull ArrayList> enchants ) + private static void addEnchantments( @Nonnull ListTag rawEnchants, @Nonnull ArrayList> enchants ) { if( rawEnchants.isEmpty() ) return; enchants.ensureCapacity( enchants.size() + rawEnchants.size() ); - for( Map.Entry entry : EnchantmentHelper.fromNbt( rawEnchants ).entrySet() ) + for( Map.Entry entry : EnchantmentHelper.deserializeEnchantments( rawEnchants ).entrySet() ) { Enchantment enchantment = entry.getKey(); Integer level = entry.getValue(); HashMap enchant = new HashMap<>( 3 ); enchant.put( "name", DataHelpers.getId( enchantment ) ); enchant.put( "level", level ); - enchant.put( "displayName", enchantment.getName( level ).getString() ); + enchant.put( "displayName", enchantment.getFullname( level ).getString() ); enchants.add( enchant ); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java index 4b5d76be1..30e1ef920 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java @@ -14,14 +14,13 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.peripheral.generic.data.ItemData; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.Nameable; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.Nameable; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -37,9 +36,9 @@ public class InventoryMethods implements GenericSource { @Nonnull @Override - public Identifier id() + public ResourceLocation id() { - return new Identifier( ComputerCraft.MOD_ID, "inventory" ); + return new ResourceLocation( ComputerCraft.MOD_ID, "inventory" ); } /** @@ -49,7 +48,7 @@ public class InventoryMethods implements GenericSource * @return The number of slots in this inventory. */ @LuaFunction( mainThread = true ) - public static int size( Inventory inventory ) + public static int size( Container inventory ) { return extractHandler( inventory ).size(); } @@ -61,12 +60,12 @@ public class InventoryMethods implements GenericSource * @return The name of this inventory, or {@code nil} if not present. */ @LuaFunction( mainThread = true ) - public static String name( Inventory inventory ) + public static String name( Container inventory ) { if( inventory instanceof Nameable ) { Nameable i = (Nameable) inventory; - return i.hasCustomName() ? i.getName().asString() : null; + return i.hasCustomName() ? i.getName().getContents() : null; } return null; } @@ -95,7 +94,7 @@ public class InventoryMethods implements GenericSource * } */ @LuaFunction( mainThread = true ) - public static Map> list( Inventory inventory ) + public static Map> list( Container inventory ) { ItemStorage itemStorage = extractHandler( inventory ); @@ -142,7 +141,7 @@ public class InventoryMethods implements GenericSource */ @Nullable @LuaFunction( mainThread = true ) - public static Map getItemDetail( Inventory inventory, int slot ) throws LuaException + public static Map getItemDetail( Container inventory, int slot ) throws LuaException { ItemStorage itemStorage = extractHandler( inventory ); @@ -173,10 +172,10 @@ public class InventoryMethods implements GenericSource * } */ @LuaFunction( mainThread = true ) - public static int getItemLimit( Inventory inventory, int slot ) throws LuaException + public static int getItemLimit( Container inventory, int slot ) throws LuaException { - assertBetween( slot, 1, inventory.size(), "Slot out of range (%s)" ); - return inventory.getMaxCountPerStack(); + assertBetween( slot, 1, inventory.getContainerSize(), "Slot out of range (%s)" ); + return inventory.getMaxStackSize(); } /** @@ -206,7 +205,7 @@ public class InventoryMethods implements GenericSource */ @LuaFunction( mainThread = true ) public static int pushItems( - Inventory from, IComputerAccess computer, + Container from, IComputerAccess computer, String toName, int fromSlot, Optional limit, Optional toSlot ) throws LuaException { @@ -255,7 +254,7 @@ public class InventoryMethods implements GenericSource */ @LuaFunction( mainThread = true ) public static int pullItems( - Inventory to, IComputerAccess computer, + Container to, IComputerAccess computer, String fromName, int fromSlot, Optional limit, Optional toSlot ) throws LuaException { @@ -284,15 +283,15 @@ public class InventoryMethods implements GenericSource { if( object instanceof BlockEntity ) { - Inventory inventory = InventoryUtil.getInventory( (BlockEntity) object ); + Container inventory = InventoryUtil.getInventory( (BlockEntity) object ); if( inventory != null ) { return ItemStorage.wrap( inventory ); } } - else if ( object instanceof Inventory ) + else if ( object instanceof Container ) { - return ItemStorage.wrap( (Inventory) object ); + return ItemStorage.wrap( (Container) object ); } return null; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java index 27e02f18f..3367fe068 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemPeripheral.java @@ -14,10 +14,9 @@ import dan200.computercraft.api.network.IPacketSender; import dan200.computercraft.api.network.Packet; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import java.util.HashSet; import java.util.Set; @@ -217,8 +216,8 @@ public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPa parseChannel( channel ); parseChannel( replyChannel ); - World world = getWorld(); - Vec3d position = getPosition(); + Level world = getWorld(); + Vec3 position = getPosition(); IPacketNetwork network = this.network; if( world == null || position == null || network == null ) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java index 1cf37fe63..ffec375cd 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/ModemShapes.java @@ -6,26 +6,25 @@ package dan200.computercraft.shared.peripheral.modem; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; - import javax.annotation.Nonnull; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; public final class ModemShapes { private static final VoxelShape[] BOXES = new VoxelShape[] { - VoxelShapes.cuboid( 0.125, 0.0, 0.125, 0.875, 0.1875, 0.875 ), + Shapes.box( 0.125, 0.0, 0.125, 0.875, 0.1875, 0.875 ), // Down - VoxelShapes.cuboid( 0.125, 0.8125, 0.125, 0.875, 1.0, 0.875 ), + Shapes.box( 0.125, 0.8125, 0.125, 0.875, 1.0, 0.875 ), // Up - VoxelShapes.cuboid( 0.125, 0.125, 0.0, 0.875, 0.875, 0.1875 ), + Shapes.box( 0.125, 0.125, 0.0, 0.875, 0.875, 0.1875 ), // North - VoxelShapes.cuboid( 0.125, 0.125, 0.8125, 0.875, 0.875, 1.0 ), + Shapes.box( 0.125, 0.125, 0.8125, 0.875, 0.875, 1.0 ), // South - VoxelShapes.cuboid( 0.0, 0.125, 0.125, 0.1875, 0.875, 0.875 ), + Shapes.box( 0.0, 0.125, 0.125, 0.1875, 0.875, 0.875 ), // West - VoxelShapes.cuboid( 0.8125, 0.125, 0.125, 1.0, 0.875, 0.875 ), + Shapes.box( 0.8125, 0.125, 0.125, 1.0, 0.875, 0.875 ), // East }; @@ -33,6 +32,6 @@ public final class ModemShapes public static VoxelShape getBounds( Direction facing ) { int direction = facing.ordinal(); - return direction < BOXES.length ? BOXES[direction] : VoxelShapes.fullCube(); + return direction < BOXES.length ? BOXES[direction] : Shapes.block(); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java index 7b90d4ffd..8c78bc226 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java @@ -12,43 +12,47 @@ import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; import dan200.computercraft.shared.util.WorldUtil; import net.fabricmc.fabric.api.block.BlockPickInteractionAware; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.*; - +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.EnumMap; import static dan200.computercraft.shared.util.WaterloggableHelpers.*; -public class BlockCable extends BlockGeneric implements Waterloggable, BlockPickInteractionAware +public class BlockCable extends BlockGeneric implements SimpleWaterloggedBlock, BlockPickInteractionAware { - public static final EnumProperty MODEM = EnumProperty.of( "modem", CableModemVariant.class ); - public static final BooleanProperty CABLE = BooleanProperty.of( "cable" ); + public static final EnumProperty MODEM = EnumProperty.create( "modem", CableModemVariant.class ); + public static final BooleanProperty CABLE = BooleanProperty.create( "cable" ); - private static final BooleanProperty NORTH = BooleanProperty.of( "north" ); - private static final BooleanProperty SOUTH = BooleanProperty.of( "south" ); - private static final BooleanProperty EAST = BooleanProperty.of( "east" ); - private static final BooleanProperty WEST = BooleanProperty.of( "west" ); - private static final BooleanProperty UP = BooleanProperty.of( "up" ); - private static final BooleanProperty DOWN = BooleanProperty.of( "down" ); + private static final BooleanProperty NORTH = BooleanProperty.create( "north" ); + private static final BooleanProperty SOUTH = BooleanProperty.create( "south" ); + private static final BooleanProperty EAST = BooleanProperty.create( "east" ); + private static final BooleanProperty WEST = BooleanProperty.create( "west" ); + private static final BooleanProperty UP = BooleanProperty.create( "up" ); + private static final BooleanProperty DOWN = BooleanProperty.create( "down" ); static final EnumMap CONNECTIONS = new EnumMap<>( new ImmutableMap.Builder().put( Direction.DOWN, DOWN ) @@ -64,56 +68,56 @@ public class BlockCable extends BlockGeneric implements Waterloggable, BlockPick EAST ) .build() ); - public BlockCable( Settings settings ) + public BlockCable( Properties settings ) { super( settings, ComputerCraftRegistry.ModTiles.CABLE ); - setDefaultState( getStateManager().getDefaultState() - .with( MODEM, CableModemVariant.None ) - .with( CABLE, false ) - .with( NORTH, false ) - .with( SOUTH, false ) - .with( EAST, false ) - .with( WEST, false ) - .with( UP, false ) - .with( DOWN, false ) - .with( WATERLOGGED, false ) ); + registerDefaultState( getStateDefinition().any() + .setValue( MODEM, CableModemVariant.None ) + .setValue( CABLE, false ) + .setValue( NORTH, false ) + .setValue( SOUTH, false ) + .setValue( EAST, false ) + .setValue( WEST, false ) + .setValue( UP, false ) + .setValue( DOWN, false ) + .setValue( WATERLOGGED, false ) ); } public static boolean canConnectIn( BlockState state, Direction direction ) { - return state.get( BlockCable.CABLE ) && state.get( BlockCable.MODEM ) + return state.getValue( BlockCable.CABLE ) && state.getValue( BlockCable.MODEM ) .getFacing() != direction; } @Nonnull @Override @Deprecated - public BlockState getStateForNeighborUpdate( @Nonnull BlockState state, @Nonnull Direction side, @Nonnull BlockState otherState, - @Nonnull WorldAccess world, @Nonnull BlockPos pos, @Nonnull BlockPos otherPos ) + public BlockState updateShape( @Nonnull BlockState state, @Nonnull Direction side, @Nonnull BlockState otherState, + @Nonnull LevelAccessor world, @Nonnull BlockPos pos, @Nonnull BlockPos otherPos ) { updateWaterloggedPostPlacement( state, world, pos ); // Should never happen, but handle the case where we've no modem or cable. - if( !state.get( CABLE ) && state.get( MODEM ) == CableModemVariant.None ) + if( !state.getValue( CABLE ) && state.getValue( MODEM ) == CableModemVariant.None ) { - return getFluidState( state ).getBlockState(); + return getFluidState( state ).createLegacyBlock(); } - return state.with( CONNECTIONS.get( side ), doesConnectVisually( state, world, pos, side ) ); + return state.setValue( CONNECTIONS.get( side ), doesConnectVisually( state, world, pos, side ) ); } - public static boolean doesConnectVisually( BlockState state, BlockView world, BlockPos pos, Direction direction ) + public static boolean doesConnectVisually( BlockState state, BlockGetter world, BlockPos pos, Direction direction ) { - if( !state.get( CABLE ) ) + if( !state.getValue( CABLE ) ) { return false; } - if( state.get( MODEM ) + if( state.getValue( MODEM ) .getFacing() == direction ) { return true; } - return ComputerCraftAPI.getWiredElementAt( world, pos.offset( direction ), direction.getOpposite() ) != null; + return ComputerCraftAPI.getWiredElementAt( world, pos.relative( direction ), direction.getOpposite() ) != null; } @Nonnull @@ -124,41 +128,41 @@ public class BlockCable extends BlockGeneric implements Waterloggable, BlockPick return getWaterloggedFluidState( state ); } - public boolean removedByPlayer( BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest, FluidState fluid ) + public boolean removedByPlayer( BlockState state, Level world, BlockPos pos, Player player, boolean willHarvest, FluidState fluid ) { - if( state.get( CABLE ) && state.get( MODEM ).getFacing() != null ) + if( state.getValue( CABLE ) && state.getValue( MODEM ).getFacing() != null ) { - BlockHitResult hit = world.raycast( new RaycastContext( + BlockHitResult hit = world.clip( new ClipContext( WorldUtil.getRayStart( player ), WorldUtil.getRayEnd( player ), - RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, player + ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, player ) ); if( hit.getType() == HitResult.Type.BLOCK ) { BlockEntity tile = world.getBlockEntity( pos ); - if( tile instanceof TileCable cable && tile.hasWorld() ) + if( tile instanceof TileCable cable && tile.hasLevel() ) { ItemStack item; BlockState newState; - if( WorldUtil.isVecInside( CableShapes.getModemShape( state ), hit.getPos().subtract( pos.getX(), pos.getY(), pos.getZ() ) ) ) + if( WorldUtil.isVecInside( CableShapes.getModemShape( state ), hit.getLocation().subtract( pos.getX(), pos.getY(), pos.getZ() ) ) ) { - newState = state.with( MODEM, CableModemVariant.None ); + newState = state.setValue( MODEM, CableModemVariant.None ); item = new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ); } else { - newState = state.with( CABLE, false ); + newState = state.setValue( CABLE, false ); item = new ItemStack( ComputerCraftRegistry.ModItems.CABLE ); } - world.setBlockState( pos, correctConnections( world, pos, newState ), 3 ); + world.setBlock( pos, correctConnections( world, pos, newState ), 3 ); cable.modemChanged(); cable.connectionsChanged(); - if( !world.isClient && !player.getAbilities().creativeMode ) + if( !world.isClientSide && !player.getAbilities().instabuild ) { - Block.dropStack( world, pos, item ); + Block.popResource( world, pos, item ); } return false; @@ -170,66 +174,66 @@ public class BlockCable extends BlockGeneric implements Waterloggable, BlockPick } @Override - public ItemStack getPickedStack( BlockState state, BlockView world, BlockPos pos, @Nullable PlayerEntity player, HitResult hit ) + public ItemStack getPickedStack( BlockState state, BlockGetter world, BlockPos pos, @Nullable Player player, HitResult hit ) { - Direction modem = state.get( MODEM ).getFacing(); - boolean cable = state.get( CABLE ); + Direction modem = state.getValue( MODEM ).getFacing(); + boolean cable = state.getValue( CABLE ); // If we've only got one, just use that. if( !cable ) return new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ); if( modem == null ) return new ItemStack( ComputerCraftRegistry.ModItems.CABLE ); // We've a modem and cable, so try to work out which one we're interacting with - return hit != null && WorldUtil.isVecInside( CableShapes.getModemShape( state ), hit.getPos().subtract( pos.getX(), pos.getY(), pos.getZ() ) ) + return hit != null && WorldUtil.isVecInside( CableShapes.getModemShape( state ), hit.getLocation().subtract( pos.getX(), pos.getY(), pos.getZ() ) ) ? new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ) : new ItemStack( ComputerCraftRegistry.ModItems.CABLE ); } @Override @Deprecated - public boolean canPlaceAt( BlockState state, @Nonnull WorldView world, @Nonnull BlockPos pos ) + public boolean canSurvive( BlockState state, @Nonnull LevelReader world, @Nonnull BlockPos pos ) { - Direction facing = state.get( MODEM ) + Direction facing = state.getValue( MODEM ) .getFacing(); if( facing == null ) { return true; } - return sideCoversSmallSquare( world, pos.offset( facing ), facing.getOpposite() ); + return canSupportCenter( world, pos.relative( facing ), facing.getOpposite() ); } @Nonnull @Override @Deprecated - public VoxelShape getOutlineShape( @Nonnull BlockState state, @Nonnull BlockView world, @Nonnull BlockPos pos, @Nonnull ShapeContext context ) + public VoxelShape getShape( @Nonnull BlockState state, @Nonnull BlockGetter world, @Nonnull BlockPos pos, @Nonnull CollisionContext context ) { return CableShapes.getShape( state ); } @Nullable @Override - public BlockState getPlacementState( @Nonnull ItemPlacementContext context ) + public BlockState getStateForPlacement( @Nonnull BlockPlaceContext context ) { - BlockState state = getDefaultState().with( WATERLOGGED, getWaterloggedStateForPlacement( context ) ); + BlockState state = defaultBlockState().setValue( WATERLOGGED, getWaterloggedStateForPlacement( context ) ); - if( context.getStack() + if( context.getItemInHand() .getItem() instanceof ItemBlockCable.Cable ) { - World world = context.getWorld(); - BlockPos pos = context.getBlockPos(); - return correctConnections( world, pos, state.with( CABLE, true ) ); + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); + return correctConnections( world, pos, state.setValue( CABLE, true ) ); } else { - return state.with( MODEM, - CableModemVariant.from( context.getSide() + return state.setValue( MODEM, + CableModemVariant.from( context.getClickedFace() .getOpposite() ) ); } } @Override - public void onPlaced( World world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, @Nonnull ItemStack stack ) + public void setPlacedBy( Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, @Nonnull ItemStack stack ) { BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileCable cable ) @@ -240,40 +244,40 @@ public class BlockCable extends BlockGeneric implements Waterloggable, BlockPick } } - super.onPlaced( world, pos, state, placer, stack ); + super.setPlacedBy( world, pos, state, placer, stack ); } @Override - protected void appendProperties( StateManager.Builder builder ) + protected void createBlockStateDefinition( StateDefinition.Builder builder ) { builder.add( MODEM, CABLE, NORTH, SOUTH, EAST, WEST, UP, DOWN, WATERLOGGED ); } - public static BlockState correctConnections( World world, BlockPos pos, BlockState state ) + public static BlockState correctConnections( Level world, BlockPos pos, BlockState state ) { - if( state.get( CABLE ) ) + if( state.getValue( CABLE ) ) { - return state.with( NORTH, doesConnectVisually( state, world, pos, Direction.NORTH ) ) - .with( SOUTH, doesConnectVisually( state, world, pos, Direction.SOUTH ) ) - .with( EAST, doesConnectVisually( state, world, pos, Direction.EAST ) ) - .with( WEST, doesConnectVisually( state, world, pos, Direction.WEST ) ) - .with( UP, doesConnectVisually( state, world, pos, Direction.UP ) ) - .with( DOWN, doesConnectVisually( state, world, pos, Direction.DOWN ) ); + return state.setValue( NORTH, doesConnectVisually( state, world, pos, Direction.NORTH ) ) + .setValue( SOUTH, doesConnectVisually( state, world, pos, Direction.SOUTH ) ) + .setValue( EAST, doesConnectVisually( state, world, pos, Direction.EAST ) ) + .setValue( WEST, doesConnectVisually( state, world, pos, Direction.WEST ) ) + .setValue( UP, doesConnectVisually( state, world, pos, Direction.UP ) ) + .setValue( DOWN, doesConnectVisually( state, world, pos, Direction.DOWN ) ); } else { - return state.with( NORTH, false ) - .with( SOUTH, false ) - .with( EAST, false ) - .with( WEST, false ) - .with( UP, false ) - .with( DOWN, false ); + return state.setValue( NORTH, false ) + .setValue( SOUTH, false ) + .setValue( EAST, false ) + .setValue( WEST, false ) + .setValue( UP, false ) + .setValue( DOWN, false ); } } @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileCable( ComputerCraftRegistry.ModTiles.CABLE, pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java index a14875443..4b9d98423 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java @@ -8,38 +8,37 @@ package dan200.computercraft.shared.peripheral.modem.wired; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.math.BlockPos; - import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; public class BlockWiredModemFull extends BlockGeneric { - public static final BooleanProperty MODEM_ON = BooleanProperty.of( "modem" ); - public static final BooleanProperty PERIPHERAL_ON = BooleanProperty.of( "peripheral" ); + public static final BooleanProperty MODEM_ON = BooleanProperty.create( "modem" ); + public static final BooleanProperty PERIPHERAL_ON = BooleanProperty.create( "peripheral" ); - public BlockWiredModemFull( Settings settings, BlockEntityType type ) + public BlockWiredModemFull( Properties settings, BlockEntityType type ) { super( settings, type ); - setDefaultState( getStateManager().getDefaultState() - .with( MODEM_ON, false ) - .with( PERIPHERAL_ON, false ) ); + registerDefaultState( getStateDefinition().any() + .setValue( MODEM_ON, false ) + .setValue( PERIPHERAL_ON, false ) ); } @Override - protected void appendProperties( StateManager.Builder builder ) + protected void createBlockStateDefinition( StateDefinition.Builder builder ) { builder.add( MODEM_ON, PERIPHERAL_ON ); } @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileWiredModemFull( ComputerCraftRegistry.ModTiles.WIRED_MODEM_FULL, pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java index a45f27db7..be6b6e1f3 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableModemVariant.java @@ -6,13 +6,12 @@ package dan200.computercraft.shared.peripheral.modem.wired; -import net.minecraft.util.StringIdentifiable; -import net.minecraft.util.math.Direction; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; -public enum CableModemVariant implements StringIdentifiable +public enum CableModemVariant implements StringRepresentable { None( "none", null ), DownOff( "down_off", Direction.DOWN ), @@ -54,19 +53,19 @@ public enum CableModemVariant implements StringIdentifiable @Nonnull public static CableModemVariant from( Direction facing ) { - return facing == null ? None : VALUES[1 + facing.getId()]; + return facing == null ? None : VALUES[1 + facing.get3DDataValue()]; } @Nonnull public static CableModemVariant from( Direction facing, boolean modem, boolean peripheral ) { int state = (modem ? 2 : 0) + (peripheral ? 1 : 0); - return facing == null ? None : VALUES[1 + 6 * state + facing.getId()]; + return facing == null ? None : VALUES[1 + 6 * state + facing.get3DDataValue()]; } @Nonnull @Override - public String asString() + public String getSerializedName() { return name; } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableShapes.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableShapes.java index 12bd696cb..dbb270816 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableShapes.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/CableShapes.java @@ -9,12 +9,11 @@ package dan200.computercraft.shared.peripheral.modem.wired; import com.google.common.collect.ImmutableMap; import dan200.computercraft.shared.peripheral.modem.ModemShapes; import dan200.computercraft.shared.util.DirectionUtil; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; - import java.util.EnumMap; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import static dan200.computercraft.shared.peripheral.modem.wired.BlockCable.*; @@ -23,10 +22,10 @@ public final class CableShapes private static final double MIN = 0.375; private static final double MAX = 1 - MIN; - private static final VoxelShape SHAPE_CABLE_CORE = VoxelShapes.cuboid( MIN, MIN, MIN, MAX, MAX, MAX ); + private static final VoxelShape SHAPE_CABLE_CORE = Shapes.box( MIN, MIN, MIN, MAX, MAX, MAX ); private static final EnumMap SHAPE_CABLE_ARM = new EnumMap<>( new ImmutableMap.Builder().put( Direction.DOWN, - VoxelShapes.cuboid( + Shapes.box( MIN, 0, MIN, @@ -34,7 +33,7 @@ public final class CableShapes MIN, MAX ) ) .put( Direction.UP, - VoxelShapes.cuboid( + Shapes.box( MIN, MAX, MIN, @@ -42,7 +41,7 @@ public final class CableShapes 1, MAX ) ) .put( Direction.NORTH, - VoxelShapes.cuboid( + Shapes.box( MIN, MIN, 0, @@ -50,7 +49,7 @@ public final class CableShapes MAX, MIN ) ) .put( Direction.SOUTH, - VoxelShapes.cuboid( + Shapes.box( MIN, MIN, MAX, @@ -58,7 +57,7 @@ public final class CableShapes MAX, 1 ) ) .put( Direction.WEST, - VoxelShapes.cuboid( + Shapes.box( 0, MIN, MIN, @@ -66,7 +65,7 @@ public final class CableShapes MAX, MAX ) ) .put( Direction.EAST, - VoxelShapes.cuboid( + Shapes.box( MAX, MIN, MIN, @@ -84,9 +83,9 @@ public final class CableShapes public static VoxelShape getCableShape( BlockState state ) { - if( !state.get( CABLE ) ) + if( !state.getValue( CABLE ) ) { - return VoxelShapes.empty(); + return Shapes.empty(); } return getCableShape( getCableIndex( state ) ); } @@ -104,7 +103,7 @@ public final class CableShapes { if( (index & (1 << facing.ordinal())) != 0 ) { - shape = VoxelShapes.union( shape, SHAPE_CABLE_ARM.get( facing ) ); + shape = Shapes.or( shape, SHAPE_CABLE_ARM.get( facing ) ); } } @@ -116,7 +115,7 @@ public final class CableShapes int index = 0; for( Direction facing : DirectionUtil.FACINGS ) { - if( state.get( CONNECTIONS.get( facing ) ) ) + if( state.getValue( CONNECTIONS.get( facing ) ) ) { index |= 1 << facing.ordinal(); } @@ -127,9 +126,9 @@ public final class CableShapes public static VoxelShape getShape( BlockState state ) { - Direction facing = state.get( MODEM ) + Direction facing = state.getValue( MODEM ) .getFacing(); - if( !state.get( CABLE ) ) + if( !state.getValue( CABLE ) ) { return getModemShape( state ); } @@ -146,15 +145,15 @@ public final class CableShapes shape = getCableShape( cableIndex ); if( facing != null ) { - shape = VoxelShapes.union( shape, ModemShapes.getBounds( facing ) ); + shape = Shapes.or( shape, ModemShapes.getBounds( facing ) ); } return SHAPES[index] = shape; } public static VoxelShape getModemShape( BlockState state ) { - Direction facing = state.get( MODEM ) + Direction facing = state.getValue( MODEM ) .getFacing(); - return facing == null ? VoxelShapes.empty() : ModemShapes.getBounds( facing ); + return facing == null ? Shapes.empty() : ModemShapes.getBounds( facing ); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/ItemBlockCable.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/ItemBlockCable.java index eb86b95f5..ec5e4872c 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/ItemBlockCable.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/ItemBlockCable.java @@ -7,24 +7,23 @@ package dan200.computercraft.shared.peripheral.modem.wired; import dan200.computercraft.shared.ComputerCraftRegistry; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Util; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.core.Registry; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import static dan200.computercraft.shared.peripheral.modem.wired.BlockCable.*; @@ -32,28 +31,28 @@ public abstract class ItemBlockCable extends BlockItem { private String translationKey; - public ItemBlockCable( BlockCable block, Settings settings ) + public ItemBlockCable( BlockCable block, Properties settings ) { super( block, settings ); } - boolean placeAtCorrected( World world, BlockPos pos, BlockState state ) + boolean placeAtCorrected( Level world, BlockPos pos, BlockState state ) { return placeAt( world, pos, correctConnections( world, pos, state ), null ); } - boolean placeAt( World world, BlockPos pos, BlockState state, PlayerEntity player ) + boolean placeAt( Level world, BlockPos pos, BlockState state, Player player ) { // TODO: Check entity collision. - if( !state.canPlaceAt( world, pos ) ) + if( !state.canSurvive( world, pos ) ) { return false; } - world.setBlockState( pos, state, 3 ); - BlockSoundGroup soundType = state.getBlock() - .getSoundGroup( state ); - world.playSound( null, pos, soundType.getPlaceSound(), SoundCategory.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F ); + world.setBlock( pos, state, 3 ); + SoundType soundType = state.getBlock() + .getSoundType( state ); + world.playSound( null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F ); BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileCable cable ) @@ -67,19 +66,19 @@ public abstract class ItemBlockCable extends BlockItem @Nonnull @Override - public String getTranslationKey() + public String getDescriptionId() { if( translationKey == null ) { - translationKey = Util.createTranslationKey( "block", Registry.ITEM.getId( this ) ); + translationKey = Util.makeDescriptionId( "block", Registry.ITEM.getKey( this ) ); } return translationKey; } @Override - public void appendStacks( @Nonnull ItemGroup group, @Nonnull DefaultedList list ) + public void fillItemCategory( @Nonnull CreativeModeTab group, @Nonnull NonNullList list ) { - if( isIn( group ) ) + if( allowdedIn( group ) ) { list.add( new ItemStack( this ) ); } @@ -87,36 +86,36 @@ public abstract class ItemBlockCable extends BlockItem public static class WiredModem extends ItemBlockCable { - public WiredModem( BlockCable block, Settings settings ) + public WiredModem( BlockCable block, Properties settings ) { super( block, settings ); } @Nonnull @Override - public ActionResult place( ItemPlacementContext context ) + public InteractionResult place( BlockPlaceContext context ) { - ItemStack stack = context.getStack(); + ItemStack stack = context.getItemInHand(); if( stack.isEmpty() ) { - return ActionResult.FAIL; + return InteractionResult.FAIL; } - World world = context.getWorld(); - BlockPos pos = context.getBlockPos(); + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); BlockState existingState = world.getBlockState( pos ); // Try to add a modem to a cable - if( existingState.getBlock() == ComputerCraftRegistry.ModBlocks.CABLE && existingState.get( MODEM ) == CableModemVariant.None ) + if( existingState.getBlock() == ComputerCraftRegistry.ModBlocks.CABLE && existingState.getValue( MODEM ) == CableModemVariant.None ) { - Direction side = context.getSide() + Direction side = context.getClickedFace() .getOpposite(); - BlockState newState = existingState.with( MODEM, CableModemVariant.from( side ) ) - .with( CONNECTIONS.get( side ), existingState.get( CABLE ) ); + BlockState newState = existingState.setValue( MODEM, CableModemVariant.from( side ) ) + .setValue( CONNECTIONS.get( side ), existingState.getValue( CABLE ) ); if( placeAt( world, pos, newState, context.getPlayer() ) ) { - stack.decrement( 1 ); - return ActionResult.SUCCESS; + stack.shrink( 1 ); + return InteractionResult.SUCCESS; } } @@ -126,48 +125,48 @@ public abstract class ItemBlockCable extends BlockItem public static class Cable extends ItemBlockCable { - public Cable( BlockCable block, Settings settings ) + public Cable( BlockCable block, Properties settings ) { super( block, settings ); } @Nonnull @Override - public ActionResult place( ItemPlacementContext context ) + public InteractionResult place( BlockPlaceContext context ) { - ItemStack stack = context.getStack(); + ItemStack stack = context.getItemInHand(); if( stack.isEmpty() ) { - return ActionResult.FAIL; + return InteractionResult.FAIL; } - World world = context.getWorld(); - BlockPos pos = context.getBlockPos(); + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); // Try to add a cable to a modem inside the block we're clicking on. - BlockPos insidePos = pos.offset( context.getSide() + BlockPos insidePos = pos.relative( context.getClickedFace() .getOpposite() ); BlockState insideState = world.getBlockState( insidePos ); - if( insideState.getBlock() == ComputerCraftRegistry.ModBlocks.CABLE && !insideState.get( BlockCable.CABLE ) && placeAtCorrected( world, + if( insideState.getBlock() == ComputerCraftRegistry.ModBlocks.CABLE && !insideState.getValue( BlockCable.CABLE ) && placeAtCorrected( world, insidePos, - insideState.with( + insideState.setValue( BlockCable.CABLE, true ) ) ) { - stack.decrement( 1 ); - return ActionResult.SUCCESS; + stack.shrink( 1 ); + return InteractionResult.SUCCESS; } // Try to add a cable to a modem adjacent to this block BlockState existingState = world.getBlockState( pos ); - if( existingState.getBlock() == ComputerCraftRegistry.ModBlocks.CABLE && !existingState.get( BlockCable.CABLE ) && placeAtCorrected( world, + if( existingState.getBlock() == ComputerCraftRegistry.ModBlocks.CABLE && !existingState.getValue( BlockCable.CABLE ) && placeAtCorrected( world, pos, - existingState.with( + existingState.setValue( BlockCable.CABLE, true ) ) ) { - stack.decrement( 1 ); - return ActionResult.SUCCESS; + stack.shrink( 1 ); + return InteractionResult.SUCCESS; } return super.place( context ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java index 077486c8e..75d14193f 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileCable.java @@ -18,23 +18,22 @@ import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.TickScheduler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import java.util.Collections; import java.util.Map; @@ -57,10 +56,10 @@ public class TileCable extends TileGeneric implements IPeripheralTile @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { - BlockPos pos = getPos().offset( getDirection() ); - return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); + BlockPos pos = getBlockPos().relative( getDirection() ); + return new Vec3( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } @Nonnull @@ -97,7 +96,7 @@ public class TileCable extends TileGeneric implements IPeripheralTile private void onRemove() { - if( world == null || !world.isClient ) + if( level == null || !level.isClientSide ) { node.remove(); connectionsFormed = false; @@ -106,20 +105,20 @@ public class TileCable extends TileGeneric implements IPeripheralTile @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - if( player.isInSneakingPose() ) + if( player.isCrouching() ) { - return ActionResult.PASS; + return InteractionResult.PASS; } if( !canAttachPeripheral() ) { - return ActionResult.FAIL; + return InteractionResult.FAIL; } - if( this.world.isClient ) + if( this.level.isClientSide ) { - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } String oldName = peripheral.getConnectedName(); @@ -129,39 +128,39 @@ public class TileCable extends TileGeneric implements IPeripheralTile { if( oldName != null ) { - player.sendMessage( new TranslatableText( "chat.computercraft.wired_modem.peripheral_disconnected", + player.displayClientMessage( new TranslatableComponent( "chat.computercraft.wired_modem.peripheral_disconnected", ChatHelpers.copy( oldName ) ), false ); } if( newName != null ) { - player.sendMessage( new TranslatableText( "chat.computercraft.wired_modem.peripheral_connected", + player.displayClientMessage( new TranslatableComponent( "chat.computercraft.wired_modem.peripheral_connected", ChatHelpers.copy( newName ) ), false ); } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } @Override public void onNeighbourChange( @Nonnull BlockPos neighbour ) { Direction dir = getDirection(); - if( neighbour.equals( getPos().offset( dir ) ) && hasModem() && !getCachedState().canPlaceAt( getWorld(), getPos() ) ) + if( neighbour.equals( getBlockPos().relative( dir ) ) && hasModem() && !getBlockState().canSurvive( getLevel(), getBlockPos() ) ) { if( hasCable() ) { // Drop the modem and convert to cable - Block.dropStack( getWorld(), getPos(), new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ) ); - getWorld().setBlockState( getPos(), - getCachedState().with( BlockCable.MODEM, CableModemVariant.None ) ); + Block.popResource( getLevel(), getBlockPos(), new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ) ); + getLevel().setBlockAndUpdate( getBlockPos(), + getBlockState().setValue( BlockCable.MODEM, CableModemVariant.None ) ); modemChanged(); connectionsChanged(); } else { // Drop everything and remove block - Block.dropStack( getWorld(), getPos(), new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ) ); - getWorld().removeBlock( getPos(), false ); + Block.popResource( getLevel(), getBlockPos(), new ItemStack( ComputerCraftRegistry.ModItems.WIRED_MODEM ) ); + getLevel().removeBlock( getBlockPos(), false ); // This'll call #destroy(), so we don't need to reset the network here. } @@ -180,18 +179,18 @@ public class TileCable extends TileGeneric implements IPeripheralTile public boolean hasModem() { - return getCachedState().get( BlockCable.MODEM ) != CableModemVariant.None; + return getBlockState().getValue( BlockCable.MODEM ) != CableModemVariant.None; } boolean hasCable() { - return getCachedState().get( BlockCable.CABLE ); + return getBlockState().getValue( BlockCable.CABLE ); } void modemChanged() { // Tell anyone who cares that the connection state has changed - if( getWorld().isClient ) + if( getLevel().isClientSide ) { return; } @@ -203,25 +202,25 @@ public class TileCable extends TileGeneric implements IPeripheralTile peripheralAccessAllowed = false; peripheral.detach(); node.updatePeripherals( Collections.emptyMap() ); - markDirty(); + setChanged(); updateBlockState(); } } void connectionsChanged() { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { return; } - BlockState state = getCachedState(); - World world = getWorld(); - BlockPos current = getPos(); + BlockState state = getBlockState(); + Level world = getLevel(); + BlockPos current = getBlockPos(); for( Direction facing : DirectionUtil.FACINGS ) { - BlockPos offset = current.offset( facing ); - if( !world.isChunkLoaded( offset ) ) + BlockPos offset = current.relative( facing ); + if( !world.hasChunkAt( offset ) ) { continue; } @@ -255,20 +254,20 @@ public class TileCable extends TileGeneric implements IPeripheralTile private void updateBlockState() { - BlockState state = getCachedState(); - CableModemVariant oldVariant = state.get( BlockCable.MODEM ); + BlockState state = getBlockState(); + CableModemVariant oldVariant = state.getValue( BlockCable.MODEM ); CableModemVariant newVariant = CableModemVariant.from( oldVariant.getFacing(), modem.getModemState() .isOpen(), peripheralAccessAllowed ); if( oldVariant != newVariant ) { - world.setBlockState( getPos(), state.with( BlockCable.MODEM, newVariant ) ); + level.setBlockAndUpdate( getBlockPos(), state.setValue( BlockCable.MODEM, newVariant ) ); } } private void refreshPeripheral() { - if( world != null && !isRemoved() && peripheral.attach( world, getPos(), getDirection() ) ) + if( level != null && !isRemoved() && peripheral.attach( level, getBlockPos(), getDirection() ) ) { updateConnectedPeripherals(); } @@ -291,10 +290,10 @@ public class TileCable extends TileGeneric implements IPeripheralTile public void onNeighbourTileEntityChange( @Nonnull BlockPos neighbour ) { super.onNeighbourTileEntityChange( neighbour ); - if( !world.isClient && peripheralAccessAllowed ) + if( !level.isClientSide && peripheralAccessAllowed ) { Direction facing = getDirection(); - if( getPos().offset( facing ) + if( getBlockPos().relative( facing ) .equals( neighbour ) ) { refreshPeripheral(); @@ -305,7 +304,7 @@ public class TileCable extends TileGeneric implements IPeripheralTile @Override public void blockTick() { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { return; } @@ -323,7 +322,7 @@ public class TileCable extends TileGeneric implements IPeripheralTile connectionsChanged(); if( peripheralAccessAllowed ) { - peripheral.attach( world, pos, getDirection() ); + peripheral.attach( level, worldPosition, getDirection() ); updateConnectedPeripherals(); } } @@ -333,7 +332,7 @@ public class TileCable extends TileGeneric implements IPeripheralTile { if( !peripheralAccessAllowed ) { - peripheral.attach( world, getPos(), getDirection() ); + peripheral.attach( level, getBlockPos(), getDirection() ); if( !peripheral.hasPeripheral() ) { return; @@ -356,56 +355,56 @@ public class TileCable extends TileGeneric implements IPeripheralTile @Nullable private Direction getMaybeDirection() { - return getCachedState().get( BlockCable.MODEM ).getFacing(); + return getBlockState().getValue( BlockCable.MODEM ).getFacing(); } @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); + super.load( nbt ); peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED ); peripheral.read( nbt, "" ); } @Nonnull @Override - public NbtCompound writeNbt( NbtCompound nbt ) + public CompoundTag save( CompoundTag nbt ) { nbt.putBoolean( NBT_PERIPHERAL_ENABLED, peripheralAccessAllowed ); peripheral.write( nbt, "" ); - return super.writeNbt( nbt ); + return super.save( nbt ); } @Override - public void markRemoved() + public void setRemoved() { - super.markRemoved(); + super.setRemoved(); onRemove(); } @Override - public void cancelRemoval() + public void clearRemoved() { - super.cancelRemoval(); + super.clearRemoved(); TickScheduler.schedule( this ); } @Override - public void setCachedState( BlockState state ) + public void setBlockState( BlockState state ) { - super.setCachedState( state ); + super.setBlockState( state ); if( state != null ) return; - if( !world.isClient ) + if( !level.isClientSide ) { - world.getBlockTickScheduler() - .schedule( pos, - getCachedState().getBlock(), 0 ); + level.getBlockTicks() + .scheduleTick( worldPosition, + getBlockState().getBlock(), 0 ); } } public IWiredElement getElement( Direction facing ) { - return BlockCable.canConnectIn( getCachedState(), facing ) ? cable : null; + return BlockCable.canConnectIn( getBlockState(), facing ) ? cable : null; } @Nonnull @@ -419,17 +418,17 @@ public class TileCable extends TileGeneric implements IPeripheralTile { @Nonnull @Override - public World getWorld() + public Level getWorld() { - return TileCable.this.getWorld(); + return TileCable.this.getLevel(); } @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { - BlockPos pos = getPos(); - return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); + BlockPos pos = getBlockPos(); + return new Vec3( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java index abeebbe38..62073dbff 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/TileWiredModemFull.java @@ -17,21 +17,20 @@ import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.TickScheduler; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import java.util.*; import static dan200.computercraft.shared.peripheral.modem.wired.BlockWiredModemFull.MODEM_ON; @@ -54,7 +53,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile super( type, pos, state ); for( int i = 0; i < peripherals.length; i++ ) { - Direction facing = Direction.byId( i ); + Direction facing = Direction.from3DDataValue( i ); peripherals[i] = new WiredModemLocalPeripheral(); } } @@ -79,7 +78,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile private void doRemove() { - if( world == null || !world.isClient ) + if( level == null || !level.isClientSide ) { node.remove(); connectionsFormed = false; @@ -88,11 +87,11 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } // On server, we interacted if a peripheral was found @@ -106,7 +105,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile sendPeripheralChanges( player, "chat.computercraft.wired_modem.peripheral_connected", periphNames ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } @Override @@ -118,11 +117,11 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile @Override public void onNeighbourTileEntityChange( @Nonnull BlockPos neighbour ) { - if( !world.isClient && peripheralAccessAllowed ) + if( !level.isClientSide && peripheralAccessAllowed ) { for( Direction facing : DirectionUtil.FACINGS ) { - if( getPos().offset( facing ) + if( getBlockPos().relative( facing ) .equals( neighbour ) ) { refreshPeripheral( facing ); @@ -134,7 +133,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile @Override public void blockTick() { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { return; } @@ -153,7 +152,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile { for( Direction facing : DirectionUtil.FACINGS ) { - peripherals[facing.ordinal()].attach( world, getPos(), facing ); + peripherals[facing.ordinal()].attach( level, getBlockPos(), facing ); } updateConnectedPeripherals(); } @@ -162,17 +161,17 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile private void connectionsChanged() { - if( getWorld().isClient ) + if( getLevel().isClientSide ) { return; } - World world = getWorld(); - BlockPos current = getPos(); + Level world = getLevel(); + BlockPos current = getBlockPos(); for( Direction facing : DirectionUtil.FACINGS ) { - BlockPos offset = current.offset( facing ); - if( !world.isChunkLoaded( offset ) ) + BlockPos offset = current.relative( facing ); + if( !world.hasChunkAt( offset ) ) { continue; } @@ -190,7 +189,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile private void refreshPeripheral( @Nonnull Direction facing ) { WiredModemLocalPeripheral peripheral = peripherals[facing.ordinal()]; - if( world != null && !isRemoved() && peripheral.attach( world, getPos(), facing ) ) + if( level != null && !isRemoved() && peripheral.attach( level, getBlockPos(), facing ) ) { updateConnectedPeripherals(); } @@ -226,16 +225,16 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile private void updateBlockState() { - BlockState state = getCachedState(); + BlockState state = getBlockState(); boolean modemOn = modemState.isOpen(), peripheralOn = peripheralAccessAllowed; - if( state.get( MODEM_ON ) == modemOn && state.get( PERIPHERAL_ON ) == peripheralOn ) + if( state.getValue( MODEM_ON ) == modemOn && state.getValue( PERIPHERAL_ON ) == peripheralOn ) { return; } - getWorld().setBlockState( getPos(), - state.with( MODEM_ON, modemOn ) - .with( PERIPHERAL_ON, peripheralOn ) ); + getLevel().setBlockAndUpdate( getBlockPos(), + state.setValue( MODEM_ON, modemOn ) + .setValue( PERIPHERAL_ON, peripheralOn ) ); } private Set getConnectedPeripheralNames() @@ -265,7 +264,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile for( Direction facing : DirectionUtil.FACINGS ) { WiredModemLocalPeripheral peripheral = peripherals[facing.ordinal()]; - peripheral.attach( world, getPos(), facing ); + peripheral.attach( level, getBlockPos(), facing ); hasAny |= peripheral.hasPeripheral(); } @@ -291,7 +290,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile updateBlockState(); } - private static void sendPeripheralChanges( PlayerEntity player, String kind, Collection peripherals ) + private static void sendPeripheralChanges( Player player, String kind, Collection peripherals ) { if( peripherals.isEmpty() ) { @@ -301,7 +300,7 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile List names = new ArrayList<>( peripherals ); names.sort( Comparator.naturalOrder() ); - LiteralText base = new LiteralText( "" ); + TextComponent base = new TextComponent( "" ); for( int i = 0; i < names.size(); i++ ) { if( i > 0 ) @@ -311,13 +310,13 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile base.append( ChatHelpers.copy( names.get( i ) ) ); } - player.sendMessage( new TranslatableText( kind, base ), false ); + player.displayClientMessage( new TranslatableComponent( kind, base ), false ); } @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); + super.load( nbt ); peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED ); for( int i = 0; i < peripherals.length; i++ ) { @@ -327,27 +326,27 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile @Nonnull @Override - public NbtCompound writeNbt( NbtCompound nbt ) + public CompoundTag save( CompoundTag nbt ) { nbt.putBoolean( NBT_PERIPHERAL_ENABLED, peripheralAccessAllowed ); for( int i = 0; i < peripherals.length; i++ ) { peripherals[i].write( nbt, Integer.toString( i ) ); } - return super.writeNbt( nbt ); + return super.save( nbt ); } @Override - public void markRemoved() + public void setRemoved() { - super.markRemoved(); + super.setRemoved(); doRemove(); } @Override - public void cancelRemoval() + public void clearRemoved() { - super.cancelRemoval(); + super.clearRemoved(); TickScheduler.schedule( this ); } @@ -378,10 +377,10 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { - BlockPos pos = getPos().offset( side ); - return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); + BlockPos pos = getBlockPos().relative( side ); + return new Vec3( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } @Nonnull @@ -430,17 +429,17 @@ public class TileWiredModemFull extends TileGeneric implements IPeripheralTile @Nonnull @Override - public World getWorld() + public Level getWorld() { - return entity.getWorld(); + return entity.getLevel(); } @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { - BlockPos pos = entity.getPos(); - return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); + BlockPos pos = entity.getBlockPos(); + return new Vec3( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java index de10208a1..d670aa68b 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java @@ -11,14 +11,13 @@ import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.Peripherals; import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.util.NBTUtil; -import net.minecraft.block.Block; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import java.util.Collections; import java.util.Map; @@ -45,7 +44,7 @@ public final class WiredModemLocalPeripheral * @param direction The direction so search in * @return Whether the peripheral changed. */ - public boolean attach( @Nonnull World world, @Nonnull BlockPos origin, @Nonnull Direction direction ) + public boolean attach( @Nonnull Level world, @Nonnull BlockPos origin, @Nonnull Direction direction ) { IPeripheral oldPeripheral = peripheral; IPeripheral peripheral = this.peripheral = getPeripheralFrom( world, origin, direction ); @@ -75,9 +74,9 @@ public final class WiredModemLocalPeripheral } @Nullable - private IPeripheral getPeripheralFrom( World world, BlockPos pos, Direction direction ) + private IPeripheral getPeripheralFrom( Level world, BlockPos pos, Direction direction ) { - BlockPos offset = pos.offset( direction ); + BlockPos offset = pos.relative( direction ); Block block = world.getBlockState( offset ) .getBlock(); @@ -135,7 +134,7 @@ public final class WiredModemLocalPeripheral return peripheral == null ? Collections.emptyMap() : Collections.singletonMap( type + "_" + id, peripheral ); } - public void write( @Nonnull NbtCompound tag, @Nonnull String suffix ) + public void write( @Nonnull CompoundTag tag, @Nonnull String suffix ) { if( id >= 0 ) { @@ -147,7 +146,7 @@ public final class WiredModemLocalPeripheral } } - public void read( @Nonnull NbtCompound tag, @Nonnull String suffix ) + public void read( @Nonnull CompoundTag tag, @Nonnull String suffix ) { id = tag.contains( NBT_PERIPHERAL_ID + suffix, NBTUtil.TAG_ANY_NUMERIC ) ? tag.getInt( NBT_PERIPHERAL_ID + suffix ) : -1; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java index 242354538..7574018cf 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemPeripheral.java @@ -22,10 +22,9 @@ import dan200.computercraft.core.apis.PeripheralAPI; import dan200.computercraft.core.asm.PeripheralMethod; import dan200.computercraft.shared.peripheral.modem.ModemPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemState; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.world.level.Level; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -122,7 +121,7 @@ public abstract class WiredModemPeripheral extends ModemPeripheral implements IW @Nonnull @Override - public World getWorld() + public Level getWorld() { return modem.getWorld(); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java index c6ebe3809..979212717 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java @@ -10,56 +10,55 @@ import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.peripheral.modem.ModemShapes; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.Waterloggable; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import static dan200.computercraft.shared.util.WaterloggableHelpers.*; -public class BlockWirelessModem extends BlockGeneric implements Waterloggable +public class BlockWirelessModem extends BlockGeneric implements SimpleWaterloggedBlock { - public static final DirectionProperty FACING = Properties.FACING; - public static final BooleanProperty ON = BooleanProperty.of( "on" ); + public static final DirectionProperty FACING = BlockStateProperties.FACING; + public static final BooleanProperty ON = BooleanProperty.create( "on" ); private final ComputerFamily family; - public BlockWirelessModem( Settings settings, BlockEntityType type, ComputerFamily family ) + public BlockWirelessModem( Properties settings, BlockEntityType type, ComputerFamily family ) { super( settings, type ); this.family = family; - setDefaultState( getStateManager().getDefaultState() - .with( FACING, Direction.NORTH ) - .with( ON, false ) - .with( WATERLOGGED, false ) ); + registerDefaultState( getStateDefinition().any() + .setValue( FACING, Direction.NORTH ) + .setValue( ON, false ) + .setValue( WATERLOGGED, false ) ); } @Nonnull @Override @Deprecated - public BlockState getStateForNeighborUpdate( @Nonnull BlockState state, @Nonnull Direction side, @Nonnull BlockState otherState, - @Nonnull WorldAccess world, @Nonnull BlockPos pos, @Nonnull BlockPos otherPos ) + public BlockState updateShape( @Nonnull BlockState state, @Nonnull Direction side, @Nonnull BlockState otherState, + @Nonnull LevelAccessor world, @Nonnull BlockPos pos, @Nonnull BlockPos otherPos ) { updateWaterloggedPostPlacement( state, world, pos ); - return side == state.get( FACING ) && !state.canPlaceAt( world, pos ) ? state.getFluidState() - .getBlockState() : state; + return side == state.getValue( FACING ) && !state.canSurvive( world, pos ) ? state.getFluidState() + .createLegacyBlock() : state; } @Nonnull @@ -72,32 +71,32 @@ public class BlockWirelessModem extends BlockGeneric implements Waterloggable @Override @Deprecated - public boolean canPlaceAt( BlockState state, @Nonnull WorldView world, BlockPos pos ) + public boolean canSurvive( BlockState state, @Nonnull LevelReader world, BlockPos pos ) { - Direction facing = state.get( FACING ); - return sideCoversSmallSquare( world, pos.offset( facing ), facing.getOpposite() ); + Direction facing = state.getValue( FACING ); + return canSupportCenter( world, pos.relative( facing ), facing.getOpposite() ); } @Nonnull @Override @Deprecated - public VoxelShape getOutlineShape( BlockState blockState, @Nonnull BlockView blockView, @Nonnull BlockPos blockPos, @Nonnull ShapeContext context ) + public VoxelShape getShape( BlockState blockState, @Nonnull BlockGetter blockView, @Nonnull BlockPos blockPos, @Nonnull CollisionContext context ) { - return ModemShapes.getBounds( blockState.get( FACING ) ); + return ModemShapes.getBounds( blockState.getValue( FACING ) ); } @Nullable @Override - public BlockState getPlacementState( ItemPlacementContext placement ) + public BlockState getStateForPlacement( BlockPlaceContext placement ) { - return getDefaultState().with( FACING, - placement.getSide() + return defaultBlockState().setValue( FACING, + placement.getClickedFace() .getOpposite() ) - .with( WATERLOGGED, getWaterloggedStateForPlacement( placement ) ); + .setValue( WATERLOGGED, getWaterloggedStateForPlacement( placement ) ); } @Override - protected void appendProperties( StateManager.Builder builder ) + protected void createBlockStateDefinition( StateDefinition.Builder builder ) { builder.add( FACING, ON, WATERLOGGED ); } @@ -113,7 +112,7 @@ public class BlockWirelessModem extends BlockGeneric implements Waterloggable @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileWirelessModem( getTypeByFamily( family ), family == ComputerFamily.ADVANCED, pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/TileWirelessModem.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/TileWirelessModem.java index 82d584a5b..0f44deaf5 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/TileWirelessModem.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/TileWirelessModem.java @@ -12,14 +12,13 @@ import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.peripheral.modem.ModemPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.util.TickScheduler; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; public class TileWirelessModem extends TileGeneric implements IPeripheralTile { @@ -37,21 +36,21 @@ public class TileWirelessModem extends TileGeneric implements IPeripheralTile } @Override - public void cancelRemoval() + public void clearRemoved() { - super.cancelRemoval(); + super.clearRemoved(); TickScheduler.schedule( this ); } @Override - public void setCachedState( BlockState state ) + public void setBlockState( BlockState state ) { - super.setCachedState( state ); + super.setBlockState( state ); if( state != null ) return; hasModemDirection = false; - world.getBlockTickScheduler() - .schedule( getPos(), - getCachedState().getBlock(), 0 ); + level.getBlockTicks() + .scheduleTick( getBlockPos(), + getBlockState().getBlock(), 0 ); } @Override @@ -87,17 +86,17 @@ public class TileWirelessModem extends TileGeneric implements IPeripheralTile } hasModemDirection = true; - modemDirection = getCachedState().get( BlockWirelessModem.FACING ); + modemDirection = getBlockState().getValue( BlockWirelessModem.FACING ); } private void updateBlockState() { boolean on = modem.getModemState() .isOpen(); - BlockState state = getCachedState(); - if( state.get( BlockWirelessModem.ON ) != on ) + BlockState state = getBlockState(); + if( state.getValue( BlockWirelessModem.ON ) != on ) { - getWorld().setBlockState( getPos(), state.with( BlockWirelessModem.ON, on ) ); + getLevel().setBlockAndUpdate( getBlockPos(), state.setValue( BlockWirelessModem.ON, on ) ); } } @@ -121,18 +120,18 @@ public class TileWirelessModem extends TileGeneric implements IPeripheralTile @Nonnull @Override - public World getWorld() + public Level getWorld() { - return entity.getWorld(); + return entity.getLevel(); } @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { - BlockPos pos = entity.getPos() - .offset( entity.modemDirection ); - return new Vec3d( pos.getX(), pos.getY(), pos.getZ() ); + BlockPos pos = entity.getBlockPos() + .relative( entity.modemDirection ); + return new Vec3( pos.getX(), pos.getY(), pos.getZ() ); } @Nonnull diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral.java index a628cadf0..3f0ca47aa 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessModemPeripheral.java @@ -10,8 +10,8 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.network.IPacketNetwork; import dan200.computercraft.shared.peripheral.modem.ModemPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemState; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; public abstract class WirelessModemPeripheral extends ModemPeripheral { @@ -32,10 +32,10 @@ public abstract class WirelessModemPeripheral extends ModemPeripheral } else { - World world = getWorld(); + Level world = getWorld(); if( world != null ) { - Vec3d position = getPosition(); + Vec3 position = getPosition(); double minRange = ComputerCraft.modemRange; double maxRange = ComputerCraft.modemHighAltitudeRange; if( world.isRaining() && world.isThundering() ) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessNetwork.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessNetwork.java index 14f809156..7f3dcb35f 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessNetwork.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/WirelessNetwork.java @@ -83,7 +83,7 @@ public class WirelessNetwork implements IPacketNetwork { double receiveRange = Math.max( range, receiver.getRange() ); // Ensure range is symmetrical double distanceSq = receiver.getPosition() - .squaredDistanceTo( sender.getPosition() ); + .distanceToSqr( sender.getPosition() ); if( interdimensional || receiver.isInterdimensional() || distanceSq <= receiveRange * receiveRange ) { receiver.receiveSameDimension( packet, Math.sqrt( distanceSq ) ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java index 22b3175e1..82e9b776d 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java @@ -9,50 +9,49 @@ package dan200.computercraft.shared.peripheral.monitor; import dan200.computercraft.api.turtle.FakePlayer; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; public class BlockMonitor extends BlockGeneric { - public static final DirectionProperty ORIENTATION = DirectionProperty.of( "orientation", Direction.UP, Direction.DOWN, Direction.NORTH ); + public static final DirectionProperty ORIENTATION = DirectionProperty.create( "orientation", Direction.UP, Direction.DOWN, Direction.NORTH ); - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - static final EnumProperty STATE = EnumProperty.of( "state", MonitorEdgeState.class ); + static final EnumProperty STATE = EnumProperty.create( "state", MonitorEdgeState.class ); public boolean advanced; - public BlockMonitor( Settings settings, BlockEntityType type, boolean advanced ) + public BlockMonitor( Properties settings, BlockEntityType type, boolean advanced ) { super( settings, type ); this.advanced = advanced; // TODO: Test underwater - do we need isSolid at all? - setDefaultState( getStateManager().getDefaultState() - .with( ORIENTATION, Direction.NORTH ) - .with( FACING, Direction.NORTH ) - .with( STATE, MonitorEdgeState.NONE ) ); + registerDefaultState( getStateDefinition().any() + .setValue( ORIENTATION, Direction.NORTH ) + .setValue( FACING, Direction.NORTH ) + .setValue( STATE, MonitorEdgeState.NONE ) ); } @Override @Nullable - public BlockState getPlacementState( ItemPlacementContext context ) + public BlockState getStateForPlacement( BlockPlaceContext context ) { - float pitch = context.getPlayer() == null ? 0 : context.getPlayer().getPitch(); + float pitch = context.getPlayer() == null ? 0 : context.getPlayer().getXRot(); Direction orientation; if( pitch > 66.5f ) { @@ -69,20 +68,20 @@ public class BlockMonitor extends BlockGeneric orientation = Direction.NORTH; } - return getDefaultState().with( FACING, - context.getPlayerFacing() + return defaultBlockState().setValue( FACING, + context.getHorizontalDirection() .getOpposite() ) - .with( ORIENTATION, orientation ); + .setValue( ORIENTATION, orientation ); } @Override - public void onPlaced( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState blockState, @Nullable LivingEntity livingEntity, + public void setPlacedBy( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState blockState, @Nullable LivingEntity livingEntity, @Nonnull ItemStack itemStack ) { - super.onPlaced( world, pos, blockState, livingEntity, itemStack ); + super.setPlacedBy( world, pos, blockState, livingEntity, itemStack ); BlockEntity entity = world.getBlockEntity( pos ); - if( entity instanceof TileMonitor monitor && !world.isClient ) + if( entity instanceof TileMonitor monitor && !world.isClientSide ) { // Defer the block update if we're being placed by another TE. See #691 if( livingEntity == null || livingEntity instanceof FakePlayer ) @@ -96,14 +95,14 @@ public class BlockMonitor extends BlockGeneric } @Override - protected void appendProperties( StateManager.Builder builder ) + protected void createBlockStateDefinition( StateDefinition.Builder builder ) { builder.add( ORIENTATION, FACING, STATE ); } @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileMonitor( advanced ? ComputerCraftRegistry.ModTiles.MONITOR_ADVANCED : ComputerCraftRegistry.ModTiles.MONITOR_NORMAL, advanced, pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java index db226210e..12eef839f 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/ClientMonitor.java @@ -8,11 +8,11 @@ package dan200.computercraft.shared.peripheral.monitor; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexBuffer; import dan200.computercraft.shared.common.ClientTerminal; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorEdgeState.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorEdgeState.java index 1c4a0a87e..9568cf1f3 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorEdgeState.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorEdgeState.java @@ -6,13 +6,12 @@ package dan200.computercraft.shared.peripheral.monitor; -import net.minecraft.util.StringIdentifiable; - import javax.annotation.Nonnull; +import net.minecraft.util.StringRepresentable; import static dan200.computercraft.shared.peripheral.monitor.MonitorEdgeState.Flags.*; -public enum MonitorEdgeState implements StringIdentifiable +public enum MonitorEdgeState implements StringRepresentable { NONE( "none", 0 ), @@ -60,7 +59,7 @@ public enum MonitorEdgeState implements StringIdentifiable @Nonnull @Override - public String asString() + public String getSerializedName() { return name; } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java index 38fd20cfa..c6299cab3 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/TileMonitor.java @@ -15,19 +15,18 @@ import dan200.computercraft.shared.common.ServerTerminal; import dan200.computercraft.shared.common.TileGeneric; import dan200.computercraft.shared.network.client.TerminalState; import dan200.computercraft.shared.util.TickScheduler; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import java.util.HashSet; import java.util.Set; @@ -74,16 +73,16 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile return; } destroyed = true; - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { contractNeighbours(); } } @Override - public void markRemoved() + public void setRemoved() { - super.markRemoved(); + super.setRemoved(); if( clientMonitor != null && xIndex == 0 && yIndex == 0 ) { clientMonitor.destroy(); @@ -103,23 +102,23 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - if( !player.isInSneakingPose() && getFront() == hit.getSide() ) + if( !player.isCrouching() && getFront() == hit.getDirection() ) { - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { - monitorTouched( (float) (hit.getPos().x - hit.getBlockPos() + monitorTouched( (float) (hit.getLocation().x - hit.getBlockPos() .getX()), - (float) (hit.getPos().y - hit.getBlockPos() + (float) (hit.getLocation().y - hit.getBlockPos() .getY()), - (float) (hit.getPos().z - hit.getBlockPos() + (float) (hit.getLocation().z - hit.getBlockPos() .getZ()) ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.PASS; + return InteractionResult.PASS; } @Override @@ -172,7 +171,7 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile } @Override - protected final void readDescription( @Nonnull NbtCompound nbt ) + protected final void readDescription( @Nonnull CompoundTag nbt ) { super.readDescription( nbt ); @@ -215,7 +214,7 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile } @Override - protected void writeDescription( @Nonnull NbtCompound nbt ) + protected void writeDescription( @Nonnull CompoundTag nbt ) { super.writeDescription( nbt ); nbt.putInt( NBT_X, xIndex ); @@ -231,18 +230,18 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile private MonitorState getNeighbour( int x, int y ) { - BlockPos pos = getPos(); + BlockPos pos = getBlockPos(); Direction right = getRight(); Direction down = getDown(); int xOffset = -xIndex + x; int yOffset = -yIndex + y; - return getSimilarMonitorAt( pos.offset( right, xOffset ) - .offset( down, yOffset ) ); + return getSimilarMonitorAt( pos.relative( right, xOffset ) + .relative( down, yOffset ) ); } public Direction getRight() { - return getDirection().rotateYCounterclockwise(); + return getDirection().getCounterClockWise(); } public Direction getDown() @@ -257,13 +256,13 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile private MonitorState getSimilarMonitorAt( BlockPos pos ) { - if( pos.equals( getPos() ) ) + if( pos.equals( getBlockPos() ) ) { return MonitorState.present( this ); } - World world = getWorld(); - if( world == null || !world.isChunkLoaded( pos ) ) + Level world = getLevel(); + if( world == null || !world.hasChunkAt( pos ) ) { return MonitorState.UNLOADED; } @@ -283,19 +282,19 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile { // Ensure we're actually a monitor block. This _should_ always be the case, but sometimes there's // fun problems with the block being missing on the client. - BlockState state = getCachedState(); - return state.contains( BlockMonitor.FACING ) ? state.get( BlockMonitor.FACING ) : Direction.NORTH; + BlockState state = getBlockState(); + return state.hasProperty( BlockMonitor.FACING ) ? state.getValue( BlockMonitor.FACING ) : Direction.NORTH; } public Direction getOrientation() { - return getCachedState().get( BlockMonitor.ORIENTATION ); + return getBlockState().getValue( BlockMonitor.ORIENTATION ); } @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); + super.load( nbt ); xIndex = nbt.getInt( NBT_X ); yIndex = nbt.getInt( NBT_Y ); @@ -307,13 +306,13 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile @Nonnull @Override - public NbtCompound writeNbt( NbtCompound nbt ) + public CompoundTag save( CompoundTag nbt ) { nbt.putInt( NBT_X, xIndex ); nbt.putInt( NBT_Y, yIndex ); nbt.putInt( NBT_WIDTH, width ); nbt.putInt( NBT_HEIGHT, height ); - return super.writeNbt( nbt ); + return super.save( nbt ); } // @Override //TODO: make BlockEntityRenderer work with this, i guess. @@ -325,9 +324,9 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile // Sizing and placement stuff @Override - public void cancelRemoval() + public void clearRemoved() { - super.cancelRemoval(); + super.clearRemoved(); needsValidating = true; TickScheduler.schedule( this ); } @@ -397,9 +396,9 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile { // Otherwise fetch the origin and attempt to get its monitor // Note this may load chunks, but we don't really have a choice here. - BlockPos pos = getPos(); - BlockEntity te = world.getBlockEntity( pos.offset( getRight(), -xIndex ) - .offset( getDown(), -yIndex ) ); + BlockPos pos = getBlockPos(); + BlockEntity te = level.getBlockEntity( pos.relative( getRight(), -xIndex ) + .relative( getDown(), -yIndex ) ); if( !(te instanceof TileMonitor) ) { return null; @@ -416,9 +415,9 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile return clientMonitor; } - BlockPos pos = getPos(); - BlockEntity te = world.getBlockEntity( pos.offset( getRight(), -xIndex ) - .offset( getDown(), -yIndex ) ); + BlockPos pos = getBlockPos(); + BlockEntity te = level.getBlockEntity( pos.relative( getRight(), -xIndex ) + .relative( getDown(), -yIndex ) ); if( !(te instanceof TileMonitor) ) { return null; @@ -431,7 +430,7 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile { if( xIndex != 0 || yIndex != 0 ) { - ComputerCraft.log.warn( "Receiving monitor state for non-origin terminal at {}", getPos() ); + ComputerCraft.log.warn( "Receiving monitor state for non-origin terminal at {}", getBlockPos() ); return; } @@ -444,8 +443,8 @@ public class TileMonitor extends TileGeneric implements IPeripheralTile private void updateBlockState() { - getWorld().setBlockState( getPos(), - getCachedState().with( BlockMonitor.STATE, + getLevel().setBlock( getBlockPos(), + getBlockState().setValue( BlockMonitor.STATE, MonitorEdgeState.fromConnections( yIndex < height - 1, yIndex > 0, xIndex > 0, xIndex < width - 1 ) ), 2 ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/XYPair.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/XYPair.java index 8aa24a4b3..ec660394e 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/XYPair.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/XYPair.java @@ -6,7 +6,7 @@ package dan200.computercraft.shared.peripheral.monitor; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; public class XYPair { diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java index d906fb391..ce267cc12 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java @@ -8,90 +8,89 @@ package dan200.computercraft.shared.peripheral.printer; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.stat.Stats; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.Nameable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.stats.Stats; +import net.minecraft.world.Nameable; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; public class BlockPrinter extends BlockGeneric { - static final BooleanProperty TOP = BooleanProperty.of( "top" ); - static final BooleanProperty BOTTOM = BooleanProperty.of( "bottom" ); - private static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + static final BooleanProperty TOP = BooleanProperty.create( "top" ); + static final BooleanProperty BOTTOM = BooleanProperty.create( "bottom" ); + private static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public BlockPrinter( Settings settings ) + public BlockPrinter( Properties settings ) { super( settings, ComputerCraftRegistry.ModTiles.PRINTER ); - setDefaultState( getStateManager().getDefaultState() - .with( FACING, Direction.NORTH ) - .with( TOP, false ) - .with( BOTTOM, false ) ); + registerDefaultState( getStateDefinition().any() + .setValue( FACING, Direction.NORTH ) + .setValue( TOP, false ) + .setValue( BOTTOM, false ) ); } @Nullable @Override - public BlockState getPlacementState( ItemPlacementContext placement ) + public BlockState getStateForPlacement( BlockPlaceContext placement ) { - return getDefaultState().with( FACING, - placement.getPlayerFacing() + return defaultBlockState().setValue( FACING, + placement.getHorizontalDirection() .getOpposite() ); } @Override - public void afterBreak( @Nonnull World world, @Nonnull PlayerEntity player, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable BlockEntity te, @Nonnull ItemStack stack ) + public void playerDestroy( @Nonnull Level world, @Nonnull Player player, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable BlockEntity te, @Nonnull ItemStack stack ) { if( te instanceof Nameable && ((Nameable) te).hasCustomName() ) { - player.incrementStat( Stats.MINED.getOrCreateStat( this ) ); - player.addExhaustion( 0.005F ); + player.awardStat( Stats.BLOCK_MINED.get( this ) ); + player.causeFoodExhaustion( 0.005F ); ItemStack result = new ItemStack( this ); - result.setCustomName( ((Nameable) te).getCustomName() ); - dropStack( world, pos, result ); + result.setHoverName( ((Nameable) te).getCustomName() ); + popResource( world, pos, result ); } else { - super.afterBreak( world, player, pos, state, te, stack ); + super.playerDestroy( world, player, pos, state, te, stack ); } } @Override - public void onPlaced( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, ItemStack stack ) + public void setPlacedBy( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, LivingEntity placer, ItemStack stack ) { - if( stack.hasCustomName() ) + if( stack.hasCustomHoverName() ) { BlockEntity tileentity = world.getBlockEntity( pos ); if( tileentity instanceof TilePrinter ) { - ((TilePrinter) tileentity).customName = stack.getName(); + ((TilePrinter) tileentity).customName = stack.getHoverName(); } } } @Override - protected void appendProperties( StateManager.Builder properties ) + protected void createBlockStateDefinition( StateDefinition.Builder properties ) { properties.add( FACING, TOP, BOTTOM ); } @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TilePrinter( ComputerCraftRegistry.ModTiles.PRINTER, pos, state ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java index 4b94cb54d..f32db943a 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/ContainerPrinter.java @@ -8,35 +8,34 @@ package dan200.computercraft.shared.peripheral.printer; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.util.SingleIntArray; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.ArrayPropertyDelegate; -import net.minecraft.screen.PropertyDelegate; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.slot.Slot; - import javax.annotation.Nonnull; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; -public class ContainerPrinter extends ScreenHandler +public class ContainerPrinter extends AbstractContainerMenu { - private final Inventory inventory; - private final PropertyDelegate properties; + private final Container inventory; + private final ContainerData properties; - public ContainerPrinter( int id, PlayerInventory player ) + public ContainerPrinter( int id, Inventory player ) { - this( id, player, new SimpleInventory( TilePrinter.SLOTS ), new ArrayPropertyDelegate( 1 ) ); + this( id, player, new SimpleContainer( TilePrinter.SLOTS ), new SimpleContainerData( 1 ) ); } - private ContainerPrinter( int id, PlayerInventory player, Inventory inventory, PropertyDelegate properties ) + private ContainerPrinter( int id, Inventory player, Container inventory, ContainerData properties ) { super( ComputerCraftRegistry.ModContainers.PRINTER, id ); this.properties = properties; this.inventory = inventory; - addProperties( properties ); + addDataSlots( properties ); // Ink slot addSlot( new Slot( inventory, 0, 13, 35 ) ); @@ -69,7 +68,7 @@ public class ContainerPrinter extends ScreenHandler } } - public ContainerPrinter( int id, PlayerInventory player, TilePrinter printer ) + public ContainerPrinter( int id, Inventory player, TilePrinter printer ) { this( id, player, printer, (SingleIntArray) () -> printer.isPrinting() ? 1 : 0 ); } @@ -81,19 +80,19 @@ public class ContainerPrinter extends ScreenHandler @Nonnull @Override - public ItemStack transferSlot( @Nonnull PlayerEntity player, int index ) + public ItemStack quickMoveStack( @Nonnull Player player, int index ) { Slot slot = slots.get( index ); - if( slot == null || !slot.hasStack() ) + if( slot == null || !slot.hasItem() ) { return ItemStack.EMPTY; } - ItemStack stack = slot.getStack(); + ItemStack stack = slot.getItem(); ItemStack result = stack.copy(); if( index < 13 ) { // Transfer from printer to inventory - if( !insertItem( stack, 13, 49, true ) ) + if( !moveItemStackTo( stack, 13, 49, true ) ) { return ItemStack.EMPTY; } @@ -103,14 +102,14 @@ public class ContainerPrinter extends ScreenHandler // Transfer from inventory to printer if( TilePrinter.isInk( stack ) ) { - if( !insertItem( stack, 0, 1, false ) ) + if( !moveItemStackTo( stack, 0, 1, false ) ) { return ItemStack.EMPTY; } } else //if is paper { - if( !insertItem( stack, 1, 13, false ) ) + if( !moveItemStackTo( stack, 1, 13, false ) ) { return ItemStack.EMPTY; } @@ -119,11 +118,11 @@ public class ContainerPrinter extends ScreenHandler if( stack.isEmpty() ) { - slot.setStack( ItemStack.EMPTY ); + slot.set( ItemStack.EMPTY ); } else { - slot.markDirty(); + slot.setChanged(); } if( stack.getCount() == result.getCount() ) @@ -131,13 +130,13 @@ public class ContainerPrinter extends ScreenHandler return ItemStack.EMPTY; } - slot.onTakeItem( player, stack ); + slot.onTake( player, stack ); return result; } @Override - public boolean canUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { - return inventory.canPlayerUse( player ); + return inventory.stillValid( player ); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java index d38eb04e1..505a86f7d 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/TilePrinter.java @@ -15,33 +15,32 @@ import dan200.computercraft.shared.util.ColourUtils; import dan200.computercraft.shared.util.DefaultSidedInventory; import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventories; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.DyeColor; -import net.minecraft.util.Hand; -import net.minecraft.util.Nameable; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.Nameable; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; -public final class TilePrinter extends TileGeneric implements DefaultSidedInventory, IPeripheralTile, Nameable, NamedScreenHandlerFactory +public final class TilePrinter extends TileGeneric implements DefaultSidedInventory, IPeripheralTile, Nameable, MenuProvider { static final int SLOTS = 13; private static final String NBT_NAME = "CustomName"; @@ -64,10 +63,10 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent 6, }; private static final int[] SIDE_SLOTS = new int[] { 0 }; - private final DefaultedList inventory = DefaultedList.ofSize( SLOTS, ItemStack.EMPTY ); + private final NonNullList inventory = NonNullList.withSize( SLOTS, ItemStack.EMPTY ); private final ItemStorage itemHandlerAll = ItemStorage.wrap( this ); private final Terminal page = new Terminal( ItemPrintout.LINE_MAX_LENGTH, ItemPrintout.LINES_PER_PAGE ); - Text customName; + Component customName; private String pageTitle = ""; private boolean printing = false; @@ -84,18 +83,18 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { - if( player.isInSneakingPose() ) + if( player.isCrouching() ) { - return ActionResult.PASS; + return InteractionResult.PASS; } - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { - player.openHandledScreen( this ); + player.openMenu( this ); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } private void ejectContents() @@ -106,11 +105,11 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent if( !stack.isEmpty() ) { // Remove the stack from the inventory - setStack( i, ItemStack.EMPTY ); + setItem( i, ItemStack.EMPTY ); // Spawn the item in the world - WorldUtil.dropItemStack( stack, getWorld(), - Vec3d.of( getPos() ) + WorldUtil.dropItemStack( stack, getLevel(), + Vec3.atLowerCornerOf( getBlockPos() ) .add( 0.5, 0.75, 0.5 ) ); } } @@ -149,28 +148,28 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent private void updateBlockState( boolean top, boolean bottom ) { - if( removed ) + if( remove ) { return; } - BlockState state = getCachedState(); - if( state.get( BlockPrinter.TOP ) == top & state.get( BlockPrinter.BOTTOM ) == bottom ) + BlockState state = getBlockState(); + if( state.getValue( BlockPrinter.TOP ) == top & state.getValue( BlockPrinter.BOTTOM ) == bottom ) { return; } - getWorld().setBlockState( getPos(), - state.with( BlockPrinter.TOP, top ) - .with( BlockPrinter.BOTTOM, bottom ) ); + getLevel().setBlockAndUpdate( getBlockPos(), + state.setValue( BlockPrinter.TOP, top ) + .setValue( BlockPrinter.BOTTOM, bottom ) ); } @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); + super.load( nbt ); - customName = nbt.contains( NBT_NAME ) ? Text.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null; + customName = nbt.contains( NBT_NAME ) ? Component.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null; // Read page synchronized( page ) @@ -181,16 +180,16 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent } // Read inventory - Inventories.readNbt( nbt, inventory ); + ContainerHelper.loadAllItems( nbt, inventory ); } @Nonnull @Override - public NbtCompound writeNbt( @Nonnull NbtCompound nbt ) + public CompoundTag save( @Nonnull CompoundTag nbt ) { if( customName != null ) { - nbt.putString( NBT_NAME, Text.Serializer.toJson( customName ) ); + nbt.putString( NBT_NAME, Component.Serializer.toJson( customName ) ); } // Write page @@ -202,9 +201,9 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent } // Write inventory - Inventories.writeNbt( nbt, inventory ); + ContainerHelper.saveAllItems( nbt, inventory ); - return super.writeNbt( nbt ); + return super.save( nbt ); } boolean isPrinting() @@ -214,7 +213,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent // IInventory implementation @Override - public int size() + public int getContainerSize() { return inventory.size(); } @@ -234,14 +233,14 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent @Nonnull @Override - public ItemStack getStack( int slot ) + public ItemStack getItem( int slot ) { return inventory.get( slot ); } @Nonnull @Override - public ItemStack removeStack( int slot, int count ) + public ItemStack removeItem( int slot, int count ) { ItemStack stack = inventory.get( slot ); if( stack.isEmpty() ) @@ -251,7 +250,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent if( stack.getCount() <= count ) { - setStack( slot, ItemStack.EMPTY ); + setItem( slot, ItemStack.EMPTY ); return stack; } @@ -262,17 +261,17 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent inventory.set( slot, ItemStack.EMPTY ); updateBlockState(); } - markDirty(); + setChanged(); return part; } @Nonnull @Override - public ItemStack removeStack( int slot ) + public ItemStack removeItemNoUpdate( int slot ) { ItemStack result = inventory.get( slot ); inventory.set( slot, ItemStack.EMPTY ); - markDirty(); + setChanged(); updateBlockState(); return result; } @@ -280,32 +279,32 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent // ISidedInventory implementation @Override - public void setStack( int slot, @Nonnull ItemStack stack ) + public void setItem( int slot, @Nonnull ItemStack stack ) { inventory.set( slot, stack ); - markDirty(); + setChanged(); updateBlockState(); } @Override - public boolean canPlayerUse( @Nonnull PlayerEntity playerEntity ) + public boolean stillValid( @Nonnull Player playerEntity ) { return isUsable( playerEntity, false ); } @Override - public void clear() + public void clearContent() { for( int i = 0; i < inventory.size(); i++ ) { inventory.set( i, ItemStack.EMPTY ); } - markDirty(); + setChanged(); updateBlockState(); } @Override - public boolean isValid( int slot, @Nonnull ItemStack stack ) + public boolean canPlaceItem( int slot, @Nonnull ItemStack stack ) { if( slot == 0 ) { @@ -328,7 +327,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent @Nonnull @Override - public int[] getAvailableSlots( @Nonnull Direction side ) + public int[] getSlotsForFace( @Nonnull Direction side ) { switch( side ) { @@ -400,7 +399,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent if( inventory.get( slot ) .isEmpty() ) { - setStack( slot, stack ); + setItem( slot, stack ); printing = false; return true; } @@ -480,21 +479,21 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent page.setCursorPos( 0, 0 ); // Decrement ink - inkStack.decrement( 1 ); + inkStack.shrink( 1 ); if( inkStack.isEmpty() ) { inventory.set( 0, ItemStack.EMPTY ); } // Decrement paper - paperStack.decrement( 1 ); + paperStack.shrink( 1 ); if( paperStack.isEmpty() ) { inventory.set( i, ItemStack.EMPTY ); updateBlockState(); } - markDirty(); + setChanged(); printing = true; return true; } @@ -503,10 +502,10 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent @Nonnull @Override - public Text getName() + public Component getName() { - return customName != null ? customName : new TranslatableText( getCachedState().getBlock() - .getTranslationKey() ); + return customName != null ? customName : new TranslatableComponent( getBlockState().getBlock() + .getDescriptionId() ); } @Override @@ -516,21 +515,21 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent } @Override - public Text getDisplayName() + public Component getDisplayName() { return Nameable.super.getDisplayName(); } @Nullable @Override - public Text getCustomName() + public Component getCustomName() { return customName; } @Nonnull @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory inventory, @Nonnull Player player ) { return new ContainerPrinter( id, inventory, this ); } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java index 34405b92b..6af719802 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java @@ -8,59 +8,58 @@ package dan200.computercraft.shared.peripheral.speaker; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityTicker; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; public class BlockSpeaker extends BlockGeneric { - private static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + private static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public BlockSpeaker( Settings settings ) + public BlockSpeaker( Properties settings ) { super( settings, ComputerCraftRegistry.ModTiles.SPEAKER ); - setDefaultState( getStateManager().getDefaultState() - .with( FACING, Direction.NORTH ) ); + registerDefaultState( getStateDefinition().any() + .setValue( FACING, Direction.NORTH ) ); } @Nullable @Override - public BlockState getPlacementState( ItemPlacementContext placement ) + public BlockState getStateForPlacement( BlockPlaceContext placement ) { - return getDefaultState().with( FACING, - placement.getPlayerFacing() + return defaultBlockState().setValue( FACING, + placement.getHorizontalDirection() .getOpposite() ); } @Override - protected void appendProperties( StateManager.Builder properties ) + protected void createBlockStateDefinition( StateDefinition.Builder properties ) { properties.add( FACING ); } @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileSpeaker( ComputerCraftRegistry.ModTiles.SPEAKER, pos, state ); } @Nullable @Override - public BlockEntityTicker getTicker( World world, BlockState state, BlockEntityType type ) + public BlockEntityTicker getTicker( Level world, BlockState state, BlockEntityType type ) { - return world.isClient ? null : BlockSpeaker.checkType( type, ComputerCraftRegistry.ModTiles.SPEAKER, TileSpeaker::tick ); + return world.isClientSide ? null : BlockSpeaker.createTickerHelper( type, ComputerCraftRegistry.ModTiles.SPEAKER, TileSpeaker::tick ); } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index a74ea4849..1c990c874 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -14,17 +14,16 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.client.SpeakerMoveClientMessage; import dan200.computercraft.shared.network.client.SpeakerPlayClientMessage; -import net.minecraft.block.enums.Instrument; -import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket; +import net.minecraft.ResourceLocationException; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.game.ClientboundCustomSoundPacket; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.sound.SoundCategory; -import net.minecraft.util.Identifier; -import net.minecraft.util.InvalidIdentifierException; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; import java.util.Optional; import java.util.UUID; @@ -46,7 +45,7 @@ public abstract class SpeakerPeripheral implements IPeripheral private long lastPlayTime = 0; private long lastPositionTime; - private Vec3d lastPosition; + private Vec3 lastPosition; public void update() { @@ -58,14 +57,14 @@ public abstract class SpeakerPeripheral implements IPeripheral // in the last second. if( lastPlayTime > 0 && (clock - lastPositionTime) >= 20 ) { - Vec3d position = getPosition(); + Vec3 position = getPosition(); if( lastPosition == null || lastPosition.distanceTo( position ) >= 0.1 ) { lastPosition = position; lastPositionTime = clock; NetworkHandler.sendToAllTracking( new SpeakerMoveClientMessage( getSource(), position ), - getWorld().getWorldChunk( new BlockPos( position ) ) + getWorld().getChunkAt( new BlockPos( position ) ) ); } } @@ -104,12 +103,12 @@ public abstract class SpeakerPeripheral implements IPeripheral float volume = (float) checkFinite( 1, volumeA.orElse( 1.0 ) ); float pitch = (float) checkFinite( 2, pitchA.orElse( 1.0 ) ); - Identifier identifier; + ResourceLocation identifier; try { - identifier = new Identifier( name ); + identifier = new ResourceLocation( name ); } - catch( InvalidIdentifierException e ) + catch( ResourceLocationException e ) { throw new LuaException( "Malformed sound name '" + name + "' " ); } @@ -117,7 +116,7 @@ public abstract class SpeakerPeripheral implements IPeripheral return playSound( context, identifier, volume, pitch, false ); } - private synchronized boolean playSound( ILuaContext context, Identifier name, float volume, float pitch, boolean isNote ) throws LuaException + private synchronized boolean playSound( ILuaContext context, ResourceLocation name, float volume, float pitch, boolean isNote ) throws LuaException { if( clock - lastPlayTime < MIN_TICKS_BETWEEN_SOUNDS ) { @@ -127,10 +126,10 @@ public abstract class SpeakerPeripheral implements IPeripheral if( clock - lastPlayTime != 0 || notesThisTick.get() >= ComputerCraft.maxNotesPerTick ) return false; } - World world = getWorld(); - Vec3d pos = getPosition(); + Level world = getWorld(); + Vec3 pos = getPosition(); - float actualVolume = MathHelper.clamp( volume, 0.0f, 3.0f ); + float actualVolume = Mth.clamp( volume, 0.0f, 3.0f ); float range = actualVolume * 16; context.issueMainThreadTask( () -> { @@ -142,9 +141,9 @@ public abstract class SpeakerPeripheral implements IPeripheral if( isNote ) { - server.getPlayerManager().sendToAround( - null, pos.x, pos.y, pos.z, range, world.getRegistryKey(), - new PlaySoundIdS2CPacket( name, SoundCategory.RECORDS, pos, actualVolume, pitch ) + server.getPlayerList().broadcast( + null, pos.x, pos.y, pos.z, range, world.dimension(), + new ClientboundCustomSoundPacket( name, SoundSource.RECORDS, pos, actualVolume, pitch ) ); } else @@ -161,9 +160,9 @@ public abstract class SpeakerPeripheral implements IPeripheral return true; } - public abstract World getWorld(); + public abstract Level getWorld(); - public abstract Vec3d getPosition(); + public abstract Vec3 getPosition(); /** * Plays a note block note through the speaker. @@ -186,10 +185,10 @@ public abstract class SpeakerPeripheral implements IPeripheral float volume = (float) checkFinite( 1, volumeA.orElse( 1.0 ) ); float pitch = (float) checkFinite( 2, pitchA.orElse( 1.0 ) ); - Instrument instrument = null; - for( Instrument testInstrument : Instrument.values() ) + NoteBlockInstrument instrument = null; + for( NoteBlockInstrument testInstrument : NoteBlockInstrument.values() ) { - if( testInstrument.asString() + if( testInstrument.getSerializedName() .equalsIgnoreCase( name ) ) { instrument = testInstrument; @@ -205,7 +204,7 @@ public abstract class SpeakerPeripheral implements IPeripheral // If the resource location for note block notes changes, this method call will need to be updated boolean success = playSound( context, - instrument.getSound().getId(), + instrument.getSoundEvent().getLocation(), volume, (float) Math.pow( 2.0, (pitch - 12.0) / 12.0 ), true ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java index 2a0de631e..e062a3e65 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java @@ -9,15 +9,14 @@ package dan200.computercraft.shared.peripheral.speaker; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheralTile; import dan200.computercraft.shared.common.TileGeneric; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import java.util.UUID; public class TileSpeaker extends TileGeneric implements IPeripheralTile @@ -33,7 +32,7 @@ public class TileSpeaker extends TileGeneric implements IPeripheralTile peripheral = new Peripheral( this ); } - public static void tick( World world, BlockPos pos, BlockState state, TileSpeaker tileSpeaker ) + public static void tick( Level world, BlockPos pos, BlockState state, TileSpeaker tileSpeaker ) { tileSpeaker.peripheral.update(); } @@ -55,16 +54,16 @@ public class TileSpeaker extends TileGeneric implements IPeripheralTile } @Override - public World getWorld() + public Level getWorld() { - return speaker.getWorld(); + return speaker.getLevel(); } @Override - public Vec3d getPosition() + public Vec3 getPosition() { - BlockPos pos = speaker.getPos(); - return new Vec3d( pos.getX(), pos.getY(), pos.getZ() ); + BlockPos pos = speaker.getBlockPos(); + return new Vec3( pos.getX(), pos.getY(), pos.getZ() ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java b/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java index fec1ce9ef..847b37d19 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java +++ b/src/main/java/dan200/computercraft/shared/pocket/apis/PocketAPI.java @@ -14,11 +14,11 @@ import dan200.computercraft.shared.pocket.core.PocketServerComputer; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.core.NonNullList; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; /** * Control the current pocket computer, adding or removing upgrades. @@ -63,20 +63,20 @@ public class PocketAPI implements ILuaAPI public final Object[] equipBack() { Entity entity = computer.getEntity(); - if( !(entity instanceof PlayerEntity) ) + if( !(entity instanceof Player) ) { return new Object[] { false, "Cannot find player" }; } - PlayerEntity player = (PlayerEntity) entity; - PlayerInventory inventory = player.getInventory(); + Player player = (Player) entity; + Inventory inventory = player.getInventory(); IPocketUpgrade previousUpgrade = computer.getUpgrade(); // Attempt to find the upgrade, starting in the main segment, and then looking in the opposite // one. We start from the position the item is currently in and loop round to the start. - IPocketUpgrade newUpgrade = findUpgrade( inventory.main, inventory.selectedSlot, previousUpgrade ); + IPocketUpgrade newUpgrade = findUpgrade( inventory.items, inventory.selected, previousUpgrade ); if( newUpgrade == null ) { - newUpgrade = findUpgrade( inventory.offHand, 0, previousUpgrade ); + newUpgrade = findUpgrade( inventory.offhand, 0, previousUpgrade ); } if( newUpgrade == null ) { @@ -89,10 +89,10 @@ public class PocketAPI implements ILuaAPI ItemStack stack = previousUpgrade.getCraftingItem(); if( !stack.isEmpty() ) { - stack = InventoryUtil.storeItems( stack, ItemStorage.wrap( inventory ), inventory.selectedSlot ); + stack = InventoryUtil.storeItems( stack, ItemStorage.wrap( inventory ), inventory.selected ); if( !stack.isEmpty() ) { - WorldUtil.dropItemStack( stack, player.getEntityWorld(), player.getPos() ); + WorldUtil.dropItemStack( stack, player.getCommandSenderWorld(), player.position() ); } } } @@ -103,7 +103,7 @@ public class PocketAPI implements ILuaAPI return new Object[] { true }; } - private static IPocketUpgrade findUpgrade( DefaultedList inv, int start, IPocketUpgrade previous ) + private static IPocketUpgrade findUpgrade( NonNullList inv, int start, IPocketUpgrade previous ) { for( int i = 0; i < inv.size(); i++ ) { @@ -116,7 +116,7 @@ public class PocketAPI implements ILuaAPI { // Consume an item from this stack and exit the loop invStack = invStack.copy(); - invStack.decrement( 1 ); + invStack.shrink( 1 ); inv.set( (i + start) % inv.size(), invStack.isEmpty() ? ItemStack.EMPTY : invStack ); return newUpgrade; @@ -138,12 +138,12 @@ public class PocketAPI implements ILuaAPI public final Object[] unequipBack() { Entity entity = computer.getEntity(); - if( !(entity instanceof PlayerEntity) ) + if( !(entity instanceof Player) ) { return new Object[] { false, "Cannot find player" }; } - PlayerEntity player = (PlayerEntity) entity; - PlayerInventory inventory = player.getInventory(); + Player player = (Player) entity; + Inventory inventory = player.getInventory(); IPocketUpgrade previousUpgrade = computer.getUpgrade(); if( previousUpgrade == null ) @@ -156,10 +156,10 @@ public class PocketAPI implements ILuaAPI ItemStack stack = previousUpgrade.getCraftingItem(); if( !stack.isEmpty() ) { - stack = InventoryUtil.storeItems( stack, ItemStorage.wrap( inventory ), inventory.selectedSlot ); + stack = InventoryUtil.storeItems( stack, ItemStorage.wrap( inventory ), inventory.selected ); if( stack.isEmpty() ) { - WorldUtil.dropItemStack( stack, player.getEntityWorld(), player.getPos() ); + WorldUtil.dropItemStack( stack, player.getCommandSenderWorld(), player.position() ); } } diff --git a/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java b/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java index 56b2e615a..3b69c6d1b 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java +++ b/src/main/java/dan200/computercraft/shared/pocket/core/PocketServerComputer.java @@ -17,18 +17,17 @@ import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.util.NBTUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import java.util.Collections; import java.util.Map; @@ -40,7 +39,7 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces private Entity entity; private ItemStack stack; - public PocketServerComputer( World world, int computerID, String label, int instanceID, ComputerFamily family ) + public PocketServerComputer( Level world, int computerID, String label, int instanceID, ComputerFamily family ) { super( world, computerID, label, instanceID, family, ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight ); } @@ -55,15 +54,15 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces return null; } - if( entity instanceof PlayerEntity ) + if( entity instanceof Player ) { - PlayerInventory inventory = ((PlayerEntity) entity).getInventory(); - return inventory.main.contains( stack ) || inventory.offHand.contains( stack ) ? entity : null; + Inventory inventory = ((Player) entity).getInventory(); + return inventory.items.contains( stack ) || inventory.offhand.contains( stack ) ? entity : null; } else if( entity instanceof LivingEntity ) { LivingEntity living = (LivingEntity) entity; - return living.getMainHandStack() == stack || living.getOffHandStack() == stack ? entity : null; + return living.getMainHandItem() == stack || living.getOffhandItem() == stack ? entity : null; } else { @@ -87,14 +86,14 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces @Override public int getLight() { - NbtCompound tag = getUserData(); + CompoundTag tag = getUserData(); return tag.contains( NBT_LIGHT, NBTUtil.TAG_ANY_NUMERIC ) ? tag.getInt( NBT_LIGHT ) : -1; } @Override public void setLight( int colour ) { - NbtCompound tag = getUserData(); + CompoundTag tag = getUserData(); if( colour >= 0 && colour <= 0xFFFFFF ) { if( !tag.contains( NBT_LIGHT, NBTUtil.TAG_ANY_NUMERIC ) || tag.getInt( NBT_LIGHT ) != colour ) @@ -112,7 +111,7 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces @Nonnull @Override - public NbtCompound getUpgradeNBTData() + public CompoundTag getUpgradeNBTData() { return ItemPocketComputer.getUpgradeInfo( stack ); } @@ -120,9 +119,9 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces @Override public void updateUpgradeNBTData() { - if( entity instanceof PlayerEntity ) + if( entity instanceof Player ) { - ((PlayerEntity) entity).getInventory().markDirty(); + ((Player) entity).getInventory().setChanged(); } } @@ -135,7 +134,7 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces @Nonnull @Override - public Map getUpgrades() + public Map getUpgrades() { return upgrade == null ? Collections.emptyMap() : Collections.singletonMap( upgrade.getUpgradeID(), getPeripheral( ComputerSide.BACK ) ); } @@ -172,12 +171,12 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces { if( entity != null ) { - setWorld( entity.getEntityWorld() ); - setPosition( entity.getBlockPos() ); + setWorld( entity.getCommandSenderWorld() ); + setPosition( entity.blockPosition() ); } // If a new entity has picked it up then rebroadcast the terminal to them - if( entity != this.entity && entity instanceof ServerPlayerEntity ) + if( entity != this.entity && entity instanceof ServerPlayer ) { markTerminalChanged(); } @@ -197,11 +196,11 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces { super.broadcastState( force ); - if( (hasTerminalChanged() || force) && entity instanceof ServerPlayerEntity ) + if( (hasTerminalChanged() || force) && entity instanceof ServerPlayer ) { // Broadcast the state to the current entity if they're not already interacting with it. - ServerPlayerEntity player = (ServerPlayerEntity) entity; - if( player.networkHandler != null && !isInteracting( player ) ) + ServerPlayer player = (ServerPlayer) entity; + if( player.connection != null && !isInteracting( player ) ) { NetworkHandler.sendToPlayer( player, createTerminalPacket() ); } diff --git a/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java b/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java index 2e1a066c2..47edf5f3e 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java +++ b/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java @@ -10,31 +10,30 @@ import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; - +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class PocketComputerMenuProvider implements NamedScreenHandlerFactory, ExtendedScreenHandlerFactory +public class PocketComputerMenuProvider implements MenuProvider, ExtendedScreenHandlerFactory { private final ServerComputer computer; - private final Text name; + private final Component name; private final ItemPocketComputer item; - private final Hand hand; + private final InteractionHand hand; private final boolean isTypingOnly; - public PocketComputerMenuProvider( ServerComputer computer, ItemStack stack, ItemPocketComputer item, Hand hand, boolean isTypingOnly ) + public PocketComputerMenuProvider( ServerComputer computer, ItemStack stack, ItemPocketComputer item, InteractionHand hand, boolean isTypingOnly ) { this.computer = computer; - name = stack.getName(); + name = stack.getHoverName(); this.item = item; this.hand = hand; this.isTypingOnly = isTypingOnly; @@ -43,19 +42,19 @@ public class PocketComputerMenuProvider implements NamedScreenHandlerFactory, Ex @Nonnull @Override - public Text getDisplayName() + public Component getDisplayName() { return name; } @Nullable @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity entity ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory inventory, @Nonnull Player entity ) { return new ComputerMenuWithoutInventory( isTypingOnly ? ComputerCraftRegistry.ModContainers.POCKET_COMPUTER_NO_TERM : ComputerCraftRegistry.ModContainers.POCKET_COMPUTER, id, inventory, p -> { - ItemStack stack = p.getStackInHand( hand ); + ItemStack stack = p.getItemInHand( hand ); return stack.getItem() == item && ItemPocketComputer.getServerComputer( stack ) == computer; }, computer, item.getFamily() @@ -63,9 +62,9 @@ public class PocketComputerMenuProvider implements NamedScreenHandlerFactory, Ex } @Override - public void writeScreenOpeningData( ServerPlayerEntity player, PacketByteBuf packetByteBuf ) + public void writeScreenOpeningData( ServerPlayer player, FriendlyByteBuf packetByteBuf ) { packetByteBuf.writeInt( computer.getInstanceID() ); - packetByteBuf.writeEnumConstant( computer.getFamily() ); + packetByteBuf.writeEnum( computer.getFamily() ); } } diff --git a/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java b/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java index 69d586869..ca845be99 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java +++ b/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java @@ -26,24 +26,23 @@ import dan200.computercraft.shared.pocket.core.PocketServerComputer; import dan200.computercraft.shared.pocket.inventory.PocketComputerMenuProvider; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - +import net.minecraft.ChatFormatting; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.Container; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; @@ -58,7 +57,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I private final ComputerFamily family; - public ItemPocketComputer( Settings settings, ComputerFamily family ) + public ItemPocketComputer( Properties settings, ComputerFamily family ) { super( settings ); this.family = family; @@ -92,7 +91,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I ClientComputer computer = getClientComputer( stack ); if( computer != null && computer.isOn() ) { - NbtCompound computerNBT = computer.getUserData(); + CompoundTag computerNBT = computer.getUserData(); if( computerNBT != null && computerNBT.contains( NBT_LIGHT ) ) { return computerNBT.getInt( NBT_LIGHT ); @@ -103,7 +102,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I public static void setUpgrade( @Nonnull ItemStack stack, IPocketUpgrade upgrade ) { - NbtCompound compound = stack.getOrCreateNbt(); + CompoundTag compound = stack.getOrCreateTag(); if( upgrade == null ) { @@ -119,9 +118,9 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I compound.remove( NBT_UPGRADE_INFO ); } - public static NbtCompound getUpgradeInfo( @Nonnull ItemStack stack ) + public static CompoundTag getUpgradeInfo( @Nonnull ItemStack stack ) { - return stack.getOrCreateSubNbt( NBT_UPGRADE_INFO ); + return stack.getOrCreateTagElement( NBT_UPGRADE_INFO ); } // @Nullable @@ -142,10 +141,10 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I @Nonnull @Override - public TypedActionResult use( World world, PlayerEntity player, @Nonnull Hand hand ) + public InteractionResultHolder use( Level world, Player player, @Nonnull InteractionHand hand ) { - ItemStack stack = player.getStackInHand( hand ); - if( !world.isClient ) + ItemStack stack = player.getItemInHand( hand ); + if( !world.isClientSide ) { PocketServerComputer computer = createServerComputer( world, player.getInventory(), player, stack ); @@ -164,20 +163,20 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I if( !stop && computer != null ) { - boolean isTypingOnly = hand == Hand.OFF_HAND; + boolean isTypingOnly = hand == InteractionHand.OFF_HAND; new ComputerContainerData( computer ).open( player, new PocketComputerMenuProvider( computer, stack, this, hand, isTypingOnly ) ); } } - return new TypedActionResult<>( ActionResult.SUCCESS, stack ); + return new InteractionResultHolder<>( InteractionResult.SUCCESS, stack ); } @Override - public void inventoryTick( @Nonnull ItemStack stack, World world, @Nonnull Entity entity, int slotNum, boolean selected ) + public void inventoryTick( @Nonnull ItemStack stack, Level world, @Nonnull Entity entity, int slotNum, boolean selected ) { - if( !world.isClient ) + if( !world.isClientSide ) { // Server side - Inventory inventory = entity instanceof PlayerEntity ? ((PlayerEntity) entity).getInventory() : null; + Container inventory = entity instanceof Player ? ((Player) entity).getInventory() : null; PocketServerComputer computer = createServerComputer( world, inventory, entity, stack ); if( computer != null ) { @@ -195,7 +194,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I setComputerID( stack, id ); if( inventory != null ) { - inventory.markDirty(); + inventory.setChanged(); } } @@ -206,7 +205,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I setLabel( stack, label ); if( inventory != null ) { - inventory.markDirty(); + inventory.setChanged(); } } @@ -225,27 +224,27 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I } @Override - public void appendTooltip( @Nonnull ItemStack stack, @Nullable World world, @Nonnull List list, TooltipContext flag ) + public void appendHoverText( @Nonnull ItemStack stack, @Nullable Level world, @Nonnull List list, TooltipFlag flag ) { if( flag.isAdvanced() || getLabel( stack ) == null ) { int id = getComputerID( stack ); if( id >= 0 ) { - list.add( new TranslatableText( "gui.computercraft.tooltip.computer_id", id ).formatted( Formatting.GRAY ) ); + list.add( new TranslatableComponent( "gui.computercraft.tooltip.computer_id", id ).withStyle( ChatFormatting.GRAY ) ); } } } @Nonnull @Override - public Text getName( @Nonnull ItemStack stack ) + public Component getName( @Nonnull ItemStack stack ) { - String baseString = getTranslationKey( stack ); + String baseString = getDescriptionId( stack ); IPocketUpgrade upgrade = getUpgrade( stack ); if( upgrade != null ) { - return new TranslatableText( baseString + ".upgraded", new TranslatableText( upgrade.getUnlocalisedAdjective() ) ); + return new TranslatableComponent( baseString + ".upgraded", new TranslatableComponent( upgrade.getUnlocalisedAdjective() ) ); } else { @@ -256,9 +255,9 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I // IComputerItem implementation @Override - public void appendStacks( @Nonnull ItemGroup group, @Nonnull DefaultedList stacks ) + public void fillItemCategory( @Nonnull CreativeModeTab group, @Nonnull NonNullList stacks ) { - if( !isIn( group ) ) + if( !allowdedIn( group ) ) { return; } @@ -274,31 +273,31 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I ItemStack result = new ItemStack( this ); if( id >= 0 ) { - result.getOrCreateNbt() + result.getOrCreateTag() .putInt( NBT_ID, id ); } if( label != null ) { - result.setCustomName( new LiteralText( label ) ); + result.setHoverName( new TextComponent( label ) ); } if( upgrade != null ) { - result.getOrCreateNbt() + result.getOrCreateTag() .putString( NBT_UPGRADE, upgrade.getUpgradeID() .toString() ); } if( colour != -1 ) { - result.getOrCreateNbt() + result.getOrCreateTag() .putInt( NBT_COLOUR, colour ); } return result; } - public PocketServerComputer createServerComputer( final World world, Inventory inventory, Entity entity, @Nonnull ItemStack stack ) + public PocketServerComputer createServerComputer( final Level world, Container inventory, Entity entity, @Nonnull ItemStack stack ) { - if( world.isClient ) + if( world.isClientSide ) { return null; } @@ -332,7 +331,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I ComputerCraft.serverComputerRegistry.add( instanceID, computer ); if( inventory != null ) { - inventory.markDirty(); + inventory.setChanged(); } } computer.setWorld( world ); @@ -341,7 +340,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I public static IPocketUpgrade getUpgrade( @Nonnull ItemStack stack ) { - NbtCompound compound = stack.getNbt(); + CompoundTag compound = stack.getTag(); return compound != null && compound.contains( NBT_UPGRADE ) ? PocketUpgrades.get( compound.getString( NBT_UPGRADE ) ) : null; } @@ -350,7 +349,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I private static void setComputerID( @Nonnull ItemStack stack, int computerID ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_ID, computerID ); } @@ -377,11 +376,11 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I { if( label != null ) { - stack.setCustomName( new LiteralText( label ) ); + stack.setHoverName( new TextComponent( label ) ); } else { - stack.removeCustomName(); + stack.resetHoverName(); } return true; } @@ -402,30 +401,30 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I private static int getInstanceID( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_INSTANCE ) ? nbt.getInt( NBT_INSTANCE ) : -1; } private static int getSessionID( @Nonnull ItemStack stack ) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); return nbt != null && nbt.contains( NBT_SESSION ) ? nbt.getInt( NBT_SESSION ) : -1; } private static void setInstanceID( @Nonnull ItemStack stack, int instanceID ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_INSTANCE, instanceID ); } private static void setSessionID( @Nonnull ItemStack stack, int sessionID ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_SESSION, sessionID ); } @Override - public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull World world ) + public IMount createDataMount( @Nonnull ItemStack stack, @Nonnull Level world ) { int id = getComputerID( stack ); if( id >= 0 ) diff --git a/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItemFactory.java b/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItemFactory.java index ac2d7303d..e7554d664 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItemFactory.java +++ b/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItemFactory.java @@ -9,9 +9,8 @@ package dan200.computercraft.shared.pocket.items; import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; public final class PocketComputerItemFactory { diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java index 6ba68d559..7735aa453 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModem.java @@ -11,11 +11,10 @@ import dan200.computercraft.api.pocket.AbstractPocketUpgrade; import dan200.computercraft.api.pocket.IPocketAccess; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.peripheral.modem.ModemState; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; public class PocketModem extends AbstractPocketUpgrade { @@ -23,7 +22,7 @@ public class PocketModem extends AbstractPocketUpgrade public PocketModem( boolean advanced ) { - super( new Identifier( "computercraft", advanced ? "wireless_modem_advanced" : "wireless_modem_normal" ), + super( new ResourceLocation( "computercraft", advanced ? "wireless_modem_advanced" : "wireless_modem_normal" ), advanced ? ComputerCraftRegistry.ModBlocks.WIRELESS_MODEM_ADVANCED : ComputerCraftRegistry.ModBlocks.WIRELESS_MODEM_NORMAL ); this.advanced = advanced; } @@ -49,7 +48,7 @@ public class PocketModem extends AbstractPocketUpgrade if( entity != null ) { - modem.setLocation( entity.getEntityWorld(), entity.getCameraPosVec( 1 ) ); + modem.setLocation( entity.getCommandSenderWorld(), entity.getEyePosition( 1 ) ); } ModemState state = modem.getModemState(); diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java index d43c860b4..abf9bde16 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketModemPeripheral.java @@ -9,22 +9,21 @@ package dan200.computercraft.shared.pocket.peripherals; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; public class PocketModemPeripheral extends WirelessModemPeripheral { - private World world = null; - private Vec3d position = Vec3d.ZERO; + private Level world = null; + private Vec3 position = Vec3.ZERO; public PocketModemPeripheral( boolean advanced ) { super( new ModemState(), advanced ); } - void setLocation( World world, Vec3d position ) + void setLocation( Level world, Vec3 position ) { this.position = position; this.world = world; @@ -32,14 +31,14 @@ public class PocketModemPeripheral extends WirelessModemPeripheral @Nonnull @Override - public World getWorld() + public Level getWorld() { return world; } @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { return position; } diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java index b5c98c7ad..beaa53a36 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeaker.java @@ -10,17 +10,16 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.pocket.AbstractPocketUpgrade; import dan200.computercraft.api.pocket.IPocketAccess; import dan200.computercraft.shared.ComputerCraftRegistry; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; public class PocketSpeaker extends AbstractPocketUpgrade { public PocketSpeaker() { - super( new Identifier( "computercraft", "speaker" ), ComputerCraftRegistry.ModBlocks.SPEAKER ); + super( new ResourceLocation( "computercraft", "speaker" ), ComputerCraftRegistry.ModBlocks.SPEAKER ); } @Nullable @@ -43,7 +42,7 @@ public class PocketSpeaker extends AbstractPocketUpgrade Entity entity = access.getEntity(); if( entity != null ) { - speaker.setLocation( entity.getEntityWorld(), entity.getCameraPosVec( 1 ) ); + speaker.setLocation( entity.getCommandSenderWorld(), entity.getEyePosition( 1 ) ); } speaker.update(); diff --git a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java index 315abd72c..366d9ac58 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/pocket/peripherals/PocketSpeakerPeripheral.java @@ -8,28 +8,28 @@ package dan200.computercraft.shared.pocket.peripherals; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.peripheral.speaker.UpgradeSpeakerPeripheral; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; public class PocketSpeakerPeripheral extends UpgradeSpeakerPeripheral { - private World world = null; - private Vec3d position = Vec3d.ZERO; + private Level world = null; + private Vec3 position = Vec3.ZERO; - void setLocation( World world, Vec3d position ) + void setLocation( Level world, Vec3 position ) { this.position = position; this.world = world; } @Override - public World getWorld() + public Level getWorld() { return world; } @Override - public Vec3d getPosition() + public Vec3 getPosition() { return world != null ? position : null; } diff --git a/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java b/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java index 279a2ad1c..a952baaa1 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java +++ b/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java @@ -11,41 +11,40 @@ import dan200.computercraft.shared.PocketUpgrades; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.SpecialCraftingRecipe; -import net.minecraft.recipe.SpecialRecipeSerializer; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; +import net.minecraft.world.level.Level; -public final class PocketComputerUpgradeRecipe extends SpecialCraftingRecipe +public final class PocketComputerUpgradeRecipe extends CustomRecipe { - public static final RecipeSerializer SERIALIZER = new SpecialRecipeSerializer<>( PocketComputerUpgradeRecipe::new ); + public static final RecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>( PocketComputerUpgradeRecipe::new ); - private PocketComputerUpgradeRecipe( Identifier identifier ) + private PocketComputerUpgradeRecipe( ResourceLocation identifier ) { super( identifier ); } @Nonnull @Override - public ItemStack getOutput() + public ItemStack getResultItem() { return PocketComputerItemFactory.create( -1, null, -1, ComputerFamily.NORMAL, null ); } @Override - public boolean matches( @Nonnull CraftingInventory inventory, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inventory, @Nonnull Level world ) { return !craft( inventory ).isEmpty(); } @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inventory ) + public ItemStack craft( @Nonnull CraftingContainer inventory ) { // Scan the grid for a pocket computer ItemStack computer = ItemStack.EMPTY; @@ -56,7 +55,7 @@ public final class PocketComputerUpgradeRecipe extends SpecialCraftingRecipe { for( int x = 0; x < inventory.getWidth(); x++ ) { - ItemStack item = inventory.getStack( x + y * inventory.getWidth() ); + ItemStack item = inventory.getItem( x + y * inventory.getWidth() ); if( !item.isEmpty() && item.getItem() instanceof ItemPocketComputer ) { computer = item; @@ -84,7 +83,7 @@ public final class PocketComputerUpgradeRecipe extends SpecialCraftingRecipe { for( int x = 0; x < inventory.getWidth(); x++ ) { - ItemStack item = inventory.getStack( x + y * inventory.getWidth() ); + ItemStack item = inventory.getItem( x + y * inventory.getWidth() ); if( x == computerX && y == computerY ) { continue; @@ -119,7 +118,7 @@ public final class PocketComputerUpgradeRecipe extends SpecialCraftingRecipe } @Override - public boolean fits( int x, int y ) + public boolean canCraftInDimensions( int x, int y ) { return x >= 2 && y >= 2; } diff --git a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java index cdbdc0c66..d617ae3aa 100644 --- a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java +++ b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java @@ -36,14 +36,14 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.CommandBlockBlockEntity; -import net.minecraft.item.Item; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.loot.condition.LootConditionType; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.RecordItem; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.CommandBlockEntity; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; public final class ComputerCraftProxyCommon { @@ -70,8 +70,8 @@ public final class ComputerCraftProxyCommon ComputerCraftAPI.registerPeripheralProvider( ( world, pos, side ) -> { BlockEntity tile = world.getBlockEntity( pos ); - return ComputerCraft.enableCommandBlock && tile instanceof CommandBlockBlockEntity ? - new CommandBlockPeripheral( (CommandBlockBlockEntity) tile ) : null; + return ComputerCraft.enableCommandBlock && tile instanceof CommandBlockEntity ? + new CommandBlockPeripheral( (CommandBlockEntity) tile ) : null; } ); // Register bundled power providers @@ -84,7 +84,7 @@ public final class ComputerCraftProxyCommon { return (IMedia) item; } - if( item instanceof MusicDiscItem ) + if( item instanceof RecordItem ) { return RecordMedia.INSTANCE; } @@ -146,8 +146,8 @@ public final class ComputerCraftProxyCommon registerCondition( "has_id", HasComputerIdLootCondition.TYPE ); } - private static void registerCondition( String name, LootConditionType serializer ) + private static void registerCondition( String name, LootItemConditionType serializer ) { - Registry.register( Registry.LOOT_CONDITION_TYPE, new Identifier( ComputerCraft.MOD_ID, name ), serializer ); + Registry.register( Registry.LOOT_CONDITION_TYPE, new ResourceLocation( ComputerCraft.MOD_ID, name ), serializer ); } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/FurnaceRefuelHandler.java b/src/main/java/dan200/computercraft/shared/turtle/FurnaceRefuelHandler.java index 6ca4aaadd..fd32629bc 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/FurnaceRefuelHandler.java +++ b/src/main/java/dan200/computercraft/shared/turtle/FurnaceRefuelHandler.java @@ -12,11 +12,10 @@ import dan200.computercraft.api.turtle.event.TurtleRefuelEvent; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.block.entity.FurnaceBlockEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.FurnaceBlockEntity; public final class FurnaceRefuelHandler implements TurtleRefuelEvent.Handler { @@ -44,7 +43,7 @@ public final class FurnaceRefuelHandler implements TurtleRefuelEvent.Handler // Store the replacement item in the inventory Item replacementStack = stack.getItem() - .getRecipeRemainder(); + .getCraftingRemainingItem(); if( replacementStack != null ) { ItemStack remainder = InventoryUtil.storeItems( new ItemStack( replacementStack ), storage, turtle.getSelectedSlot() ); @@ -63,7 +62,7 @@ public final class FurnaceRefuelHandler implements TurtleRefuelEvent.Handler private static int getFuelPerItem( @Nonnull ItemStack stack ) { - int burnTime = FurnaceBlockEntity.createFuelTimeMap() + int burnTime = FurnaceBlockEntity.getFuel() .getOrDefault( stack.getItem(), 0 ); return (burnTime * 5) / 100; } diff --git a/src/main/java/dan200/computercraft/shared/turtle/SignInspectHandler.java b/src/main/java/dan200/computercraft/shared/turtle/SignInspectHandler.java index f54c6f882..7cfbeb8af 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/SignInspectHandler.java +++ b/src/main/java/dan200/computercraft/shared/turtle/SignInspectHandler.java @@ -8,11 +8,10 @@ package dan200.computercraft.shared.turtle; import com.google.common.eventbus.Subscribe; import dan200.computercraft.api.turtle.event.TurtleBlockEvent; import dan200.computercraft.fabric.mixin.SignBlockEntityAccess; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.SignBlockEntity; - import java.util.HashMap; import java.util.Map; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; public class SignInspectHandler { @@ -26,7 +25,7 @@ public class SignInspectHandler Map textTable = new HashMap<>(); for( int k = 0; k < 4; k++ ) { - textTable.put( k + 1, ((SignBlockEntityAccess) sbe).getTexts()[k].asString() ); + textTable.put( k + 1, ((SignBlockEntityAccess) sbe).getTexts()[k].getContents() ); } event.getData().put( "text", textTable ); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java b/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java index 801f62d12..dc18b63cc 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java +++ b/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java @@ -19,11 +19,10 @@ import dan200.computercraft.core.asm.TaskCallback; import dan200.computercraft.core.tracking.TrackingField; import dan200.computercraft.shared.peripheral.generic.data.ItemData; import dan200.computercraft.shared.turtle.core.*; -import net.minecraft.item.ItemStack; - import java.util.HashMap; import java.util.Map; import java.util.Optional; +import net.minecraft.world.item.ItemStack; /** * The turtle API allows you to control your turtle. @@ -331,7 +330,7 @@ public class TurtleAPI implements ILuaAPI { int actualSlot = checkSlot( slot ).orElse( turtle.getSelectedSlot() ); return turtle.getInventory() - .getStack( actualSlot ) + .getItem( actualSlot ) .getCount(); } @@ -354,8 +353,8 @@ public class TurtleAPI implements ILuaAPI { int actualSlot = checkSlot( slot ).orElse( turtle.getSelectedSlot() ); ItemStack stack = turtle.getInventory() - .getStack( actualSlot ); - return stack.isEmpty() ? 64 : Math.min( stack.getMaxCount(), 64 ) - stack.getCount(); + .getItem( actualSlot ); + return stack.isEmpty() ? 64 : Math.min( stack.getMaxStackSize(), 64 ) - stack.getCount(); } /** @@ -763,7 +762,7 @@ public class TurtleAPI implements ILuaAPI private Object[] getItemDetail( int slot, boolean detailed ) { ItemStack stack = turtle.getInventory() - .getStack( slot ); + .getItem( slot ); if( stack.isEmpty() ) { return new Object[] { null }; diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java index 942214057..a30399a23 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java @@ -15,60 +15,64 @@ import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.items.ITurtleItem; import dan200.computercraft.shared.turtle.items.TurtleItemFactory; import net.minecraft.block.*; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityTicker; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import javax.annotation.Nonnull; import javax.annotation.Nullable; import static dan200.computercraft.shared.util.WaterloggableHelpers.*; -import static net.minecraft.state.property.Properties.WATERLOGGED; +import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED; -public class BlockTurtle extends BlockComputerBase implements Waterloggable +public class BlockTurtle extends BlockComputerBase implements SimpleWaterloggedBlock { - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - private static final VoxelShape DEFAULT_SHAPE = VoxelShapes.cuboid( 0.125, 0.125, 0.125, 0.875, 0.875, 0.875 ); + private static final VoxelShape DEFAULT_SHAPE = Shapes.box( 0.125, 0.125, 0.125, 0.875, 0.875, 0.875 ); - public BlockTurtle( Settings settings, ComputerFamily family, BlockEntityType type ) + public BlockTurtle( Properties settings, ComputerFamily family, BlockEntityType type ) { super( settings, family, type ); - setDefaultState( getStateManager().getDefaultState() - .with( FACING, Direction.NORTH ) - .with( WATERLOGGED, false ) ); + registerDefaultState( getStateDefinition().any() + .setValue( FACING, Direction.NORTH ) + .setValue( WATERLOGGED, false ) ); } @Nonnull @Override @Deprecated - public BlockRenderType getRenderType( @Nonnull BlockState state ) + public RenderShape getRenderShape( @Nonnull BlockState state ) { - return BlockRenderType.ENTITYBLOCK_ANIMATED; + return RenderShape.ENTITYBLOCK_ANIMATED; } @Nonnull @Override @Deprecated - public BlockState getStateForNeighborUpdate( @Nonnull BlockState state, @Nonnull Direction side, @Nonnull BlockState otherState, - @Nonnull WorldAccess world, @Nonnull BlockPos pos, @Nonnull BlockPos otherPos ) + public BlockState updateShape( @Nonnull BlockState state, @Nonnull Direction side, @Nonnull BlockState otherState, + @Nonnull LevelAccessor world, @Nonnull BlockPos pos, @Nonnull BlockPos otherPos ) { updateWaterloggedPostPlacement( state, world, pos ); return state; @@ -85,15 +89,15 @@ public class BlockTurtle extends BlockComputerBase implements Waterl @Nonnull @Override @Deprecated - public VoxelShape getOutlineShape( @Nonnull BlockState state, BlockView world, @Nonnull BlockPos pos, @Nonnull ShapeContext context ) + public VoxelShape getShape( @Nonnull BlockState state, BlockGetter world, @Nonnull BlockPos pos, @Nonnull CollisionContext context ) { BlockEntity tile = world.getBlockEntity( pos ); - Vec3d offset = tile instanceof TileTurtle ? ((TileTurtle) tile).getRenderOffset( 1.0f ) : Vec3d.ZERO; - return offset.equals( Vec3d.ZERO ) ? DEFAULT_SHAPE : DEFAULT_SHAPE.offset( offset.x, offset.y, offset.z ); + Vec3 offset = tile instanceof TileTurtle ? ((TileTurtle) tile).getRenderOffset( 1.0f ) : Vec3.ZERO; + return offset.equals( Vec3.ZERO ) ? DEFAULT_SHAPE : DEFAULT_SHAPE.move( offset.x, offset.y, offset.z ); } @Override - public float getBlastResistance() + public float getExplosionResistance() { // TODO Implement below functionality return 2000; @@ -101,14 +105,14 @@ public class BlockTurtle extends BlockComputerBase implements Waterl @Nullable @Override - public BlockState getPlacementState( ItemPlacementContext placement ) + public BlockState getStateForPlacement( BlockPlaceContext placement ) { - return getDefaultState().with( FACING, placement.getPlayerFacing() ) - .with( WATERLOGGED, getWaterloggedStateForPlacement( placement ) ); + return defaultBlockState().setValue( FACING, placement.getHorizontalDirection() ) + .setValue( WATERLOGGED, getWaterloggedStateForPlacement( placement ) ); } @Override - protected void appendProperties( StateManager.Builder builder ) + protected void createBlockStateDefinition( StateDefinition.Builder builder ) { builder.add( FACING, WATERLOGGED ); } @@ -133,17 +137,17 @@ public class BlockTurtle extends BlockComputerBase implements Waterl // } @Override - public void onPlaced( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable LivingEntity player, @Nonnull ItemStack stack ) + public void setPlacedBy( @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nullable LivingEntity player, @Nonnull ItemStack stack ) { - super.onPlaced( world, pos, state, player, stack ); + super.setPlacedBy( world, pos, state, player, stack ); BlockEntity tile = world.getBlockEntity( pos ); - if( !world.isClient && tile instanceof TileTurtle turtle ) + if( !world.isClientSide && tile instanceof TileTurtle turtle ) { - if( player instanceof PlayerEntity ) + if( player instanceof Player ) { - ((TileTurtle) tile).setOwningPlayer( ((PlayerEntity) player).getGameProfile() ); + ((TileTurtle) tile).setOwningPlayer( ((Player) player).getGameProfile() ); } if( stack.getItem() instanceof ITurtleItem ) @@ -169,7 +173,7 @@ public class BlockTurtle extends BlockComputerBase implements Waterl } // Set overlay - Identifier overlay = item.getOverlay( stack ); + ResourceLocation overlay = item.getOverlay( stack ); if( overlay != null ) { ((TurtleBrain) turtle.getAccess()).setOverlay( overlay ); @@ -189,15 +193,15 @@ public class BlockTurtle extends BlockComputerBase implements Waterl @Nullable @Override - public BlockEntity createBlockEntity( BlockPos pos, BlockState state ) + public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) { return new TileTurtle( getTypeByFamily( getFamily() ), pos, state, getFamily() ); } @Nullable @Override - public BlockEntityTicker getTicker( World world, BlockState state, BlockEntityType type ) + public BlockEntityTicker getTicker( Level world, BlockState state, BlockEntityType type ) { - return world.isClient ? BlockTurtle.checkType( type, getTypeByFamily( getFamily() ), ( world1, pos, state1, computer ) -> computer.clientTick() ) : super.getTicker( world, state, type ); + return world.isClientSide ? BlockTurtle.createTickerHelper( type, getTypeByFamily( getFamily() ), ( world1, pos, state1, computer ) -> computer.clientTick() ) : super.getTicker( world, state, type ); } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/ITurtleTile.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/ITurtleTile.java index 38224df84..8ea8006f0 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/ITurtleTile.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/ITurtleTile.java @@ -10,20 +10,20 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.shared.computer.blocks.IComputerTile; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Vec3d; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; public interface ITurtleTile extends IComputerTile { int getColour(); - Identifier getOverlay(); + ResourceLocation getOverlay(); ITurtleUpgrade getUpgrade( TurtleSide side ); ITurtleAccess getAccess(); - Vec3d getRenderOffset( float f ); + Vec3 getRenderOffset( float f ); float getRenderYaw( float f ); diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java index ba6112a82..483aa134b 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java @@ -22,28 +22,27 @@ import dan200.computercraft.shared.turtle.apis.TurtleAPI; import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; import dan200.computercraft.shared.util.*; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.DyeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.ActionResult; -import net.minecraft.util.DyeColor; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.DyeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import java.util.Collections; public class TileTurtle extends TileComputerBase @@ -52,10 +51,10 @@ public class TileTurtle extends TileComputerBase public static final int INVENTORY_SIZE = 16; public static final int INVENTORY_WIDTH = 4; public static final int INVENTORY_HEIGHT = 4; - private final DefaultedList inventory = DefaultedList - .ofSize( INVENTORY_SIZE, ItemStack.EMPTY ); - private final DefaultedList previousInventory = DefaultedList - .ofSize( INVENTORY_SIZE, ItemStack.EMPTY ); + private final NonNullList inventory = NonNullList + .withSize( INVENTORY_SIZE, ItemStack.EMPTY ); + private final NonNullList previousInventory = NonNullList + .withSize( INVENTORY_SIZE, ItemStack.EMPTY ); private boolean inventoryChanged = false; private TurtleBrain brain = new TurtleBrain( this ); private MoveState moveState = MoveState.NOT_MOVED; @@ -83,15 +82,15 @@ public class TileTurtle extends TileComputerBase super.destroy(); // Drop contents - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { - int size = size(); + int size = getContainerSize(); for( int i = 0; i < size; i++ ) { - ItemStack stack = getStack( i ); + ItemStack stack = getItem( i ); if( !stack.isEmpty() ) { - WorldUtil.dropItemStack( stack, getWorld(), getPos() ); + WorldUtil.dropItemStack( stack, getLevel(), getBlockPos() ); } } } @@ -101,7 +100,7 @@ public class TileTurtle extends TileComputerBase // Just turn off any redstone we had on for( Direction dir : DirectionUtil.FACINGS ) { - RedstoneUtil.propagateRedstoneOutput( getWorld(), getPos(), dir ); + RedstoneUtil.propagateRedstoneOutput( getLevel(), getBlockPos(), dir ); } } } @@ -112,7 +111,7 @@ public class TileTurtle extends TileComputerBase } @Override - public int size() + public int getContainerSize() { return INVENTORY_SIZE; } @@ -132,7 +131,7 @@ public class TileTurtle extends TileComputerBase @Nonnull @Override - public ItemStack getStack( int slot ) + public ItemStack getItem( int slot ) { return slot >= 0 && slot < INVENTORY_SIZE ? inventory.get( slot ) : ItemStack.EMPTY; @@ -140,14 +139,14 @@ public class TileTurtle extends TileComputerBase @Nonnull @Override - public ItemStack removeStack( int slot, int count ) + public ItemStack removeItem( int slot, int count ) { if( count == 0 ) { return ItemStack.EMPTY; } - ItemStack stack = getStack( slot ); + ItemStack stack = getItem( slot ); if( stack.isEmpty() ) { return ItemStack.EMPTY; @@ -155,7 +154,7 @@ public class TileTurtle extends TileComputerBase if( stack.getCount() <= count ) { - setStack( slot, ItemStack.EMPTY ); + setItem( slot, ItemStack.EMPTY ); return stack; } @@ -166,15 +165,15 @@ public class TileTurtle extends TileComputerBase @Nonnull @Override - public ItemStack removeStack( int slot ) + public ItemStack removeItemNoUpdate( int slot ) { - ItemStack result = getStack( slot ); - setStack( slot, ItemStack.EMPTY ); + ItemStack result = getItem( slot ); + setItem( slot, ItemStack.EMPTY ); return result; } @Override - public void setStack( int i, @Nonnull ItemStack stack ) + public void setItem( int i, @Nonnull ItemStack stack ) { if( i >= 0 && i < INVENTORY_SIZE && !InventoryUtil.areItemsEqual( stack, inventory.get( i ) ) ) @@ -185,66 +184,66 @@ public class TileTurtle extends TileComputerBase } @Override - public boolean canPlayerUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { return isUsable( player, false ); } private void onInventoryDefinitelyChanged() { - super.markDirty(); + super.setChanged(); inventoryChanged = true; } @Override - protected boolean canNameWithTag( PlayerEntity player ) + protected boolean canNameWithTag( Player player ) { return true; } @Nonnull @Override - public ActionResult onActivate( PlayerEntity player, Hand hand, BlockHitResult hit ) + public InteractionResult onActivate( Player player, InteractionHand hand, BlockHitResult hit ) { // Apply dye - ItemStack currentItem = player.getStackInHand( hand ); + ItemStack currentItem = player.getItemInHand( hand ); if( !currentItem.isEmpty() ) { if( currentItem.getItem() instanceof DyeItem ) { // Dye to change turtle colour - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { - DyeColor dye = ((DyeItem) currentItem.getItem()).getColor(); + DyeColor dye = ((DyeItem) currentItem.getItem()).getDyeColor(); if( brain.getDyeColour() != dye ) { brain.setDyeColour( dye ); if( !player.isCreative() ) { - currentItem.decrement( 1 ); + currentItem.shrink( 1 ); } } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } else if( currentItem.getItem() == Items.WATER_BUCKET && brain.getColour() != -1 ) { // Water to remove turtle colour - if( !getWorld().isClient ) + if( !getLevel().isClientSide ) { if( brain.getColour() != -1 ) { brain.setColour( -1 ); if( !player.isCreative() ) { - player.setStackInHand( hand, + player.setItemInHand( hand, new ItemStack( Items.BUCKET ) ); - player.getInventory().markDirty(); + player.getInventory().setChanged(); } } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } @@ -284,9 +283,9 @@ public class TileTurtle extends TileComputerBase } inventoryChanged = false; - for( int n = 0; n < size(); n++ ) + for( int n = 0; n < getContainerSize(); n++ ) { - previousInventory.set( n, getStack( n ).copy() ); + previousInventory.set( n, getItem( n ).copy() ); } } } @@ -302,17 +301,17 @@ public class TileTurtle extends TileComputerBase @Nonnull @Override - public NbtCompound writeNbt( @Nonnull NbtCompound nbt ) + public CompoundTag save( @Nonnull CompoundTag nbt ) { // Write inventory - NbtList nbttaglist = new NbtList(); + ListTag nbttaglist = new ListTag(); for( int i = 0; i < INVENTORY_SIZE; i++ ) { if( !inventory.get( i ).isEmpty() ) { - NbtCompound tag = new NbtCompound(); + CompoundTag tag = new CompoundTag(); tag.putByte( "Slot", (byte) i ); - inventory.get( i ).writeNbt( tag ); + inventory.get( i ).save( tag ); nbttaglist.add( tag ); } } @@ -321,27 +320,27 @@ public class TileTurtle extends TileComputerBase // Write brain nbt = brain.writeToNBT( nbt ); - return super.writeNbt( nbt ); + return super.save( nbt ); } // IDirectionalTile @Override - public void readNbt( @Nonnull NbtCompound nbt ) + public void load( @Nonnull CompoundTag nbt ) { - super.readNbt( nbt ); + super.load( nbt ); // Read inventory - NbtList nbttaglist = nbt.getList( "Items", NBTUtil.TAG_COMPOUND ); + ListTag nbttaglist = nbt.getList( "Items", NBTUtil.TAG_COMPOUND ); inventory.clear(); previousInventory.clear(); for( int i = 0; i < nbttaglist.size(); i++ ) { - NbtCompound tag = nbttaglist.getCompound( i ); + CompoundTag tag = nbttaglist.getCompound( i ); int slot = tag.getByte( "Slot" ) & 0xff; - if( slot < size() ) + if( slot < getContainerSize() ) { - inventory.set( slot, ItemStack.fromNbt( tag ) ); + inventory.set( slot, ItemStack.of( tag ) ); previousInventory.set( slot, inventory.get( slot ).copy() ); } } @@ -361,30 +360,30 @@ public class TileTurtle extends TileComputerBase @Override public Direction getDirection() { - return getCachedState().get( BlockTurtle.FACING ); + return getBlockState().getValue( BlockTurtle.FACING ); } @Override protected ServerComputer createComputer( int instanceID, int id ) { - ServerComputer computer = new ServerComputer( getWorld(), id, label, instanceID, + ServerComputer computer = new ServerComputer( getLevel(), id, label, instanceID, getFamily(), ComputerCraft.turtleTermWidth, ComputerCraft.turtleTermHeight ); - computer.setPosition( getPos() ); + computer.setPosition( getBlockPos() ); computer.addAPI( new TurtleAPI( computer.getAPIEnvironment(), getAccess() ) ); brain.setupComputer( computer ); return computer; } @Override - protected void writeDescription( @Nonnull NbtCompound nbt ) + protected void writeDescription( @Nonnull CompoundTag nbt ) { super.writeDescription( nbt ); brain.writeDescription( nbt ); } @Override - protected void readDescription( @Nonnull NbtCompound nbt ) + protected void readDescription( @Nonnull CompoundTag nbt ) { super.readDescription( nbt ); brain.readDescription( nbt ); @@ -402,7 +401,7 @@ public class TileTurtle extends TileComputerBase { dir = Direction.NORTH; } - world.setBlockState( pos, getCachedState().with( BlockTurtle.FACING, dir ) ); + level.setBlockAndUpdate( worldPosition, getBlockState().setValue( BlockTurtle.FACING, dir ) ); updateOutput(); updateInput(); onTileEntityChange(); @@ -410,7 +409,7 @@ public class TileTurtle extends TileComputerBase public void onTileEntityChange() { - super.markDirty(); + super.setChanged(); } private boolean hasPeripheralUpgradeOnSide( ComputerSide side ) @@ -433,7 +432,7 @@ public class TileTurtle extends TileComputerBase // IInventory @Override - protected double getInteractRange( PlayerEntity player ) + protected double getInteractRange( Player player ) { return 12.0; } @@ -462,7 +461,7 @@ public class TileTurtle extends TileComputerBase } @Override - public Identifier getOverlay() + public ResourceLocation getOverlay() { return brain.getOverlay(); } @@ -480,7 +479,7 @@ public class TileTurtle extends TileComputerBase } @Override - public Vec3d getRenderOffset( float f ) + public Vec3 getRenderOffset( float f ) { return brain.getRenderOffset( f ); } @@ -500,20 +499,20 @@ public class TileTurtle extends TileComputerBase void setOwningPlayer( GameProfile player ) { brain.setOwningPlayer( player ); - markDirty(); + setChanged(); } // Networking stuff @Override - public void markDirty() + public void setChanged() { - super.markDirty(); + super.setChanged(); if( !inventoryChanged ) { - for( int n = 0; n < size(); n++ ) + for( int n = 0; n < getContainerSize(); n++ ) { - if( !ItemStack.areEqual( getStack( n ), previousInventory.get( n ) ) ) + if( !ItemStack.matches( getItem( n ), previousInventory.get( n ) ) ) { inventoryChanged = true; break; @@ -523,7 +522,7 @@ public class TileTurtle extends TileComputerBase } @Override - public void clear() + public void clearContent() { boolean changed = false; for( int i = 0; i < INVENTORY_SIZE; i++ ) @@ -558,8 +557,8 @@ public class TileTurtle extends TileComputerBase @Nullable @Override - public ScreenHandler createMenu( int id, @Nonnull PlayerInventory inventory, - @Nonnull PlayerEntity player ) + public AbstractContainerMenu createMenu( int id, @Nonnull Inventory inventory, + @Nonnull Player player ) { return new ContainerTurtle( id, inventory, brain ); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/InteractDirection.java b/src/main/java/dan200/computercraft/shared/turtle/core/InteractDirection.java index 2f22305e1..02f489575 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/InteractDirection.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/InteractDirection.java @@ -7,7 +7,7 @@ package dan200.computercraft.shared.turtle.core; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; public enum InteractDirection { diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/MoveDirection.java b/src/main/java/dan200/computercraft/shared/turtle/core/MoveDirection.java index 0364db549..b4bc5872b 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/MoveDirection.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/MoveDirection.java @@ -7,7 +7,7 @@ package dan200.computercraft.shared.turtle.core; import dan200.computercraft.api.turtle.ITurtleAccess; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; public enum MoveDirection { diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java index 391ea0f3e..3e4df5600 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java @@ -20,27 +20,26 @@ import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.util.*; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.MovementType; -import net.minecraft.fluid.FluidState; -import net.minecraft.inventory.Inventory; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.DyeColor; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.Container; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import java.util.*; import java.util.concurrent.TimeUnit; @@ -62,17 +61,17 @@ public class TurtleBrain implements ITurtleAccess private final Queue commandQueue = new ArrayDeque<>(); private final Map upgrades = new EnumMap<>( TurtleSide.class ); private final Map peripherals = new EnumMap<>( TurtleSide.class ); - private final Map upgradeNBTData = new EnumMap<>( TurtleSide.class ); + private final Map upgradeNBTData = new EnumMap<>( TurtleSide.class ); TurtlePlayer cachedPlayer; private TileTurtle owner; - private final Inventory inventory = (InventoryDelegate) () -> owner; + private final Container inventory = (InventoryDelegate) () -> owner; private ComputerProxy proxy; private GameProfile owningPlayer; private int commandsIssued = 0; private int selectedSlot = 0; private int fuelLevel = 0; private int colourHex = -1; - private Identifier overlay = null; + private ResourceLocation overlay = null; private TurtleAnimation animation = TurtleAnimation.NONE; private int animationProgress = 0; private int lastAnimationProgress = 0; @@ -160,8 +159,8 @@ public class TurtleBrain implements ITurtleAccess public void update() { - World world = getWorld(); - if( !world.isClient ) + Level world = getWorld(); + if( !world.isClientSide ) { // Advance movement updateCommands(); @@ -187,31 +186,31 @@ public class TurtleBrain implements ITurtleAccess @Nonnull @Override - public World getWorld() + public Level getWorld() { - return owner.getWorld(); + return owner.getLevel(); } @Nonnull @Override public BlockPos getPosition() { - return owner.getPos(); + return owner.getBlockPos(); } @Override - public boolean teleportTo( @Nonnull World world, @Nonnull BlockPos pos ) + public boolean teleportTo( @Nonnull Level world, @Nonnull BlockPos pos ) { - if( world.isClient || getWorld().isClient ) + if( world.isClientSide || getWorld().isClientSide ) { throw new UnsupportedOperationException( "Cannot teleport on the client" ); } // Cache info about the old turtle (so we don't access this after we delete ourselves) - World oldWorld = getWorld(); + Level oldWorld = getWorld(); TileTurtle oldOwner = owner; - BlockPos oldPos = owner.getPos(); - BlockState oldBlock = owner.getCachedState(); + BlockPos oldPos = owner.getBlockPos(); + BlockState oldBlock = owner.getBlockState(); if( oldWorld == world && oldPos.equals( pos ) ) { @@ -220,14 +219,14 @@ public class TurtleBrain implements ITurtleAccess } // Ensure the chunk is loaded - if( !world.isChunkLoaded( pos ) ) + if( !world.hasChunkAt( pos ) ) { return false; } // Ensure we're inside the world border if( !world.getWorldBorder() - .contains( pos ) ) + .isWithinBounds( pos ) ) { return false; } @@ -238,14 +237,14 @@ public class TurtleBrain implements ITurtleAccess // 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 // then moving into that. - .with( WATERLOGGED, existingFluid.isIn( FluidTags.WATER ) && existingFluid.isStill() ); + .setValue( WATERLOGGED, existingFluid.is( FluidTags.WATER ) && existingFluid.isSource() ); oldOwner.notifyMoveStart(); try { // Create a new turtle - if( world.setBlockState( pos, newState, 0 ) ) + if( world.setBlock( pos, newState, 0 ) ) { Block block = world.getBlockState( pos ) .getBlock(); @@ -255,7 +254,7 @@ public class TurtleBrain implements ITurtleAccess if( newTile instanceof TileTurtle newTurtle ) { // Copy the old turtle state into the new turtle - newTurtle.setWorld( world ); + newTurtle.setLevel( world ); newTurtle.transferStateFrom( oldOwner ); newTurtle.createServerComputer() .setWorld( world ); @@ -288,17 +287,17 @@ public class TurtleBrain implements ITurtleAccess @Nonnull @Override - public Vec3d getVisualPosition( float f ) + public Vec3 getVisualPosition( float f ) { - Vec3d offset = getRenderOffset( f ); - BlockPos pos = owner.getPos(); - return new Vec3d( pos.getX() + 0.5 + offset.x, pos.getY() + 0.5 + offset.y, pos.getZ() + 0.5 + offset.z ); + Vec3 offset = getRenderOffset( f ); + BlockPos pos = owner.getBlockPos(); + return new Vec3( pos.getX() + 0.5 + offset.x, pos.getY() + 0.5 + offset.y, pos.getZ() + 0.5 + offset.z ); } @Override public float getVisualYaw( float f ) { - float yaw = getDirection().asRotation(); + float yaw = getDirection().toYRot(); switch( animation ) { case TURN_LEFT: @@ -341,12 +340,12 @@ public class TurtleBrain implements ITurtleAccess @Override public void setSelectedSlot( int slot ) { - if( getWorld().isClient ) + if( getWorld().isClientSide ) { throw new UnsupportedOperationException( "Cannot set the slot on the client" ); } - if( slot >= 0 && slot < owner.size() ) + if( slot >= 0 && slot < owner.getContainerSize() ) { selectedSlot = slot; owner.onTileEntityChange(); @@ -419,7 +418,7 @@ public class TurtleBrain implements ITurtleAccess @Override public boolean consumeFuel( int fuel ) { - if( getWorld().isClient ) + if( getWorld().isClientSide ) { throw new UnsupportedOperationException( "Cannot consume fuel on the client" ); } @@ -441,7 +440,7 @@ public class TurtleBrain implements ITurtleAccess @Override public void addFuel( int fuel ) { - if( getWorld().isClient ) + if( getWorld().isClientSide ) { throw new UnsupportedOperationException( "Cannot add fuel on the client" ); } @@ -454,7 +453,7 @@ public class TurtleBrain implements ITurtleAccess @Override public MethodResult executeCommand( @Nonnull ITurtleCommand command ) { - if( getWorld().isClient ) + if( getWorld().isClientSide ) { throw new UnsupportedOperationException( "Cannot run commands on the client" ); } @@ -474,7 +473,7 @@ public class TurtleBrain implements ITurtleAccess @Override public void playAnimation( @Nonnull TurtleAnimation animation ) { - if( getWorld().isClient ) + if( getWorld().isClientSide ) { throw new UnsupportedOperationException( "Cannot play animations on the client" ); } @@ -528,7 +527,7 @@ public class TurtleBrain implements ITurtleAccess } // Notify clients and create peripherals - if( owner.getWorld() != null ) + if( owner.getLevel() != null ) { updatePeripherals( owner.createServerComputer() ); owner.updateBlock(); @@ -543,12 +542,12 @@ public class TurtleBrain implements ITurtleAccess @Nonnull @Override - public NbtCompound getUpgradeNBTData( TurtleSide side ) + public CompoundTag getUpgradeNBTData( TurtleSide side ) { - NbtCompound nbt = upgradeNBTData.get( side ); + CompoundTag nbt = upgradeNBTData.get( side ); if( nbt == null ) { - upgradeNBTData.put( side, nbt = new NbtCompound() ); + upgradeNBTData.put( side, nbt = new CompoundTag() ); } return nbt; } @@ -561,7 +560,7 @@ public class TurtleBrain implements ITurtleAccess @Nonnull @Override - public Inventory getInventory() + public Container getInventory() { return inventory; } @@ -646,7 +645,7 @@ public class TurtleBrain implements ITurtleAccess { if( animation != TurtleAnimation.NONE ) { - World world = getWorld(); + Level world = getWorld(); if( ComputerCraft.turtlesCanPush ) { @@ -681,57 +680,57 @@ public class TurtleBrain implements ITurtleAccess float pushFrac = 1.0f - (float) (animationProgress + 1) / ANIM_DURATION; float push = Math.max( pushFrac + 0.0125f, 0.0f ); - if( moveDir.getOffsetX() < 0 ) + if( moveDir.getStepX() < 0 ) { - minX += moveDir.getOffsetX() * push; + minX += moveDir.getStepX() * push; } else { - maxX -= moveDir.getOffsetX() * push; + maxX -= moveDir.getStepX() * push; } - if( moveDir.getOffsetY() < 0 ) + if( moveDir.getStepY() < 0 ) { - minY += moveDir.getOffsetY() * push; + minY += moveDir.getStepY() * push; } else { - maxY -= moveDir.getOffsetY() * push; + maxY -= moveDir.getStepY() * push; } - if( moveDir.getOffsetZ() < 0 ) + if( moveDir.getStepZ() < 0 ) { - minZ += moveDir.getOffsetZ() * push; + minZ += moveDir.getStepZ() * push; } else { - maxZ -= moveDir.getOffsetZ() * push; + maxZ -= moveDir.getStepZ() * push; } - Box aabb = new Box( minX, minY, minZ, maxX, maxY, maxZ ); - List list = world.getEntitiesByClass( Entity.class, aabb, EntityPredicates.EXCEPT_SPECTATOR ); + AABB aabb = new AABB( minX, minY, minZ, maxX, maxY, maxZ ); + List list = world.getEntitiesOfClass( Entity.class, aabb, EntitySelector.NO_SPECTATORS ); if( !list.isEmpty() ) { double pushStep = 1.0f / ANIM_DURATION; - double pushStepX = moveDir.getOffsetX() * pushStep; - double pushStepY = moveDir.getOffsetY() * pushStep; - double pushStepZ = moveDir.getOffsetZ() * pushStep; + double pushStepX = moveDir.getStepX() * pushStep; + double pushStepY = moveDir.getStepY() * pushStep; + double pushStepZ = moveDir.getStepZ() * pushStep; for( Entity entity : list ) { - entity.move( MovementType.PISTON, new Vec3d( pushStepX, pushStepY, pushStepZ ) ); + entity.move( MoverType.PISTON, new Vec3( pushStepX, pushStepY, pushStepZ ) ); } } } } // Advance valentines day easter egg - if( world.isClient && animation == TurtleAnimation.MOVE_FORWARD && animationProgress == 4 ) + if( world.isClientSide && animation == TurtleAnimation.MOVE_FORWARD && animationProgress == 4 ) { // Spawn love pfx if valentines day Holiday currentHoliday = HolidayUtil.getCurrentHoliday(); if( currentHoliday == Holiday.VALENTINES ) { - Vec3d position = getVisualPosition( 1.0f ); + Vec3 position = getVisualPosition( 1.0f ); if( position != null ) { double x = position.x + world.random.nextGaussian() * 0.1; @@ -759,7 +758,7 @@ public class TurtleBrain implements ITurtleAccess } } - public Vec3d getRenderOffset( float f ) + public Vec3 getRenderOffset( float f ) { switch( animation ) { @@ -787,9 +786,9 @@ public class TurtleBrain implements ITurtleAccess } double distance = -1.0 + getAnimationFraction( f ); - return new Vec3d( distance * dir.getOffsetX(), distance * dir.getOffsetY(), distance * dir.getOffsetZ() ); + return new Vec3( distance * dir.getStepX(), distance * dir.getStepY(), distance * dir.getStepZ() ); default: - return Vec3d.ZERO; + return Vec3.ZERO; } } @@ -800,7 +799,7 @@ public class TurtleBrain implements ITurtleAccess return previous + (next - previous) * f; } - public void readFromNBT( NbtCompound nbt ) + public void readFromNBT( CompoundTag nbt ) { readCommon( nbt ); @@ -810,7 +809,7 @@ public class TurtleBrain implements ITurtleAccess // Read owner if( nbt.contains( "Owner", NBTUtil.TAG_COMPOUND ) ) { - NbtCompound owner = nbt.getCompound( "Owner" ); + CompoundTag owner = nbt.getCompound( "Owner" ); owningPlayer = new GameProfile( new UUID( owner.getLong( "UpperId" ), owner.getLong( "LowerId" ) ), owner.getString( "Name" ) ); } else @@ -824,12 +823,12 @@ public class TurtleBrain implements ITurtleAccess * * @param nbt The tag to read from */ - private void readCommon( NbtCompound nbt ) + private void readCommon( CompoundTag nbt ) { // Read fields colourHex = nbt.contains( NBT_COLOUR ) ? nbt.getInt( NBT_COLOUR ) : -1; fuelLevel = nbt.contains( NBT_FUEL ) ? nbt.getInt( NBT_FUEL ) : 0; - overlay = nbt.contains( NBT_OVERLAY ) ? new Identifier( nbt.getString( NBT_OVERLAY ) ) : null; + overlay = nbt.contains( NBT_OVERLAY ) ? new ResourceLocation( nbt.getString( NBT_OVERLAY ) ) : null; // Read upgrades setUpgrade( TurtleSide.LEFT, nbt.contains( NBT_LEFT_UPGRADE ) ? TurtleUpgrades.get( nbt.getString( NBT_LEFT_UPGRADE ) ) : null ); @@ -851,7 +850,7 @@ public class TurtleBrain implements ITurtleAccess } } - public NbtCompound writeToNBT( NbtCompound nbt ) + public CompoundTag writeToNBT( CompoundTag nbt ) { writeCommon( nbt ); @@ -861,7 +860,7 @@ public class TurtleBrain implements ITurtleAccess // Write owner if( owningPlayer != null ) { - NbtCompound owner = new NbtCompound(); + CompoundTag owner = new CompoundTag(); nbt.put( "Owner", owner ); owner.putLong( "UpperId", owningPlayer.getId() @@ -874,7 +873,7 @@ public class TurtleBrain implements ITurtleAccess return nbt; } - private void writeCommon( NbtCompound nbt ) + private void writeCommon( CompoundTag nbt ) { nbt.putInt( NBT_FUEL, fuelLevel ); if( colourHex != -1 ) @@ -917,7 +916,7 @@ public class TurtleBrain implements ITurtleAccess .toString() : null; } - public void readDescription( NbtCompound nbt ) + public void readDescription( CompoundTag nbt ) { readCommon( nbt ); @@ -931,18 +930,18 @@ public class TurtleBrain implements ITurtleAccess } } - public void writeDescription( NbtCompound nbt ) + public void writeDescription( CompoundTag nbt ) { writeCommon( nbt ); nbt.putInt( "Animation", animation.ordinal() ); } - public Identifier getOverlay() + public ResourceLocation getOverlay() { return overlay; } - public void setOverlay( Identifier overlay ) + public void setOverlay( ResourceLocation overlay ) { if( !Objects.equal( this.overlay, overlay ) ) { diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareCommand.java index b362f5d8b..1b6339af2 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareCommand.java @@ -9,15 +9,14 @@ package dan200.computercraft.shared.turtle.core; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleCommand; import dan200.computercraft.api.turtle.TurtleCommandResult; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import java.util.List; public class TurtleCompareCommand implements ITurtleCommand @@ -38,15 +37,15 @@ public class TurtleCompareCommand implements ITurtleCommand // Get currently selected stack ItemStack selectedStack = turtle.getInventory() - .getStack( turtle.getSelectedSlot() ); + .getItem( turtle.getSelectedSlot() ); // Get stack representing thing in front - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos oldPosition = turtle.getPosition(); - BlockPos newPosition = oldPosition.offset( direction ); + BlockPos newPosition = oldPosition.relative( direction ); ItemStack lookAtStack = ItemStack.EMPTY; - if( !world.isAir( newPosition ) ) + if( !world.isEmptyBlock( newPosition ) ) { BlockState lookAtState = world.getBlockState( newPosition ); Block lookAtBlock = lookAtState.getBlock(); @@ -56,7 +55,7 @@ public class TurtleCompareCommand implements ITurtleCommand // (try 5 times to try and beat random number generators) for( int i = 0; i < 5 && lookAtStack.isEmpty(); i++ ) { - List drops = Block.getDroppedStacks( lookAtState, (ServerWorld) world, newPosition, world.getBlockEntity( newPosition ) ); + List drops = Block.getDrops( lookAtState, (ServerLevel) world, newPosition, world.getBlockEntity( newPosition ) ); if( !drops.isEmpty() ) { for( ItemStack drop : drops ) diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareToCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareToCommand.java index e5a638828..ac4ed2f75 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareToCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCompareToCommand.java @@ -10,9 +10,8 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleCommand; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.shared.util.InventoryUtil; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; public class TurtleCompareToCommand implements ITurtleCommand { @@ -28,9 +27,9 @@ public class TurtleCompareToCommand implements ITurtleCommand public TurtleCommandResult execute( @Nonnull ITurtleAccess turtle ) { ItemStack selectedStack = turtle.getInventory() - .getStack( turtle.getSelectedSlot() ); + .getItem( turtle.getSelectedSlot() ); ItemStack stack = turtle.getInventory() - .getStack( slot ); + .getItem( slot ); if( InventoryUtil.areItemsStackable( selectedStack, stack ) ) { return TurtleCommandResult.success(); diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java index 8b6d63e17..83fa33645 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java @@ -13,9 +13,8 @@ import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.shared.turtle.upgrades.TurtleInventoryCrafting; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; import java.util.List; public class TurtleCraftCommand implements ITurtleCommand diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDetectCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDetectCommand.java index cbc97f931..ce9a88690 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDetectCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDetectCommand.java @@ -10,11 +10,10 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleCommand; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; public class TurtleDetectCommand implements ITurtleCommand { @@ -33,10 +32,10 @@ public class TurtleDetectCommand implements ITurtleCommand Direction direction = this.direction.toWorldDir( turtle ); // Check if thing in front is air or not - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos oldPosition = turtle.getPosition(); - BlockPos newPosition = oldPosition.offset( direction ); + BlockPos newPosition = oldPosition.relative( direction ); - return !WorldUtil.isLiquidBlock( world, newPosition ) && !world.isAir( newPosition ) ? TurtleCommandResult.success() : TurtleCommandResult.failure(); + return !WorldUtil.isLiquidBlock( world, newPosition ) && !world.isEmptyBlock( newPosition ) ? TurtleCommandResult.success() : TurtleCommandResult.failure(); } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java index bd53b9c66..02b5a9f5f 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleDropCommand.java @@ -15,13 +15,12 @@ import dan200.computercraft.api.turtle.event.TurtleInventoryEvent; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public class TurtleDropCommand implements ITurtleCommand { @@ -56,12 +55,12 @@ public class TurtleDropCommand implements ITurtleCommand } // Get inventory for thing in front - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos oldPosition = turtle.getPosition(); - BlockPos newPosition = oldPosition.offset( direction ); + BlockPos newPosition = oldPosition.relative( direction ); Direction side = direction.getOpposite(); - Inventory inventory = InventoryUtil.getInventory( world, newPosition, side ); + Container inventory = InventoryUtil.getInventory( world, newPosition, side ); // Fire the event, restoring the inventory and exiting if it is cancelled. TurtlePlayer player = TurtlePlaceCommand.createPlayer( turtle, oldPosition, direction ); @@ -97,7 +96,7 @@ public class TurtleDropCommand implements ITurtleCommand { // Drop the item into the world WorldUtil.dropItemStack( stack, world, oldPosition, direction ); - world.syncGlobalEvent( 1000, newPosition, 0 ); + world.globalLevelEvent( 1000, newPosition, 0 ); turtle.playAnimation( TurtleAnimation.WAIT ); return TurtleCommandResult.success(); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleEquipCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleEquipCommand.java index d289efc40..865f6dae6 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleEquipCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleEquipCommand.java @@ -14,11 +14,10 @@ import dan200.computercraft.shared.TurtleUpgrades; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; public class TurtleEquipCommand implements ITurtleCommand { @@ -36,8 +35,8 @@ public class TurtleEquipCommand implements ITurtleCommand // Determine the upgrade to equipLeft ITurtleUpgrade newUpgrade; ItemStack newUpgradeStack; - Inventory inventory = turtle.getInventory(); - ItemStack selectedStack = inventory.getStack( turtle.getSelectedSlot() ); + Container inventory = turtle.getInventory(); + ItemStack selectedStack = inventory.getItem( turtle.getSelectedSlot() ); if( !selectedStack.isEmpty() ) { newUpgradeStack = selectedStack.copy(); diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleInspectCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleInspectCommand.java index 5e781b23a..bdb4e25e0 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleInspectCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleInspectCommand.java @@ -12,13 +12,12 @@ import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.event.TurtleBlockEvent; import dan200.computercraft.api.turtle.event.TurtleEvent; import dan200.computercraft.shared.peripheral.generic.data.BlockData; -import net.minecraft.block.BlockState; -import net.minecraft.state.property.Property; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import java.util.HashMap; import java.util.Map; @@ -39,9 +38,9 @@ public class TurtleInspectCommand implements ITurtleCommand Direction direction = this.direction.toWorldDir( turtle ); // Check if thing in front is air or not - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos oldPosition = turtle.getPosition(); - BlockPos newPosition = oldPosition.offset( direction ); + BlockPos newPosition = oldPosition.relative( direction ); BlockState state = world.getBlockState( newPosition ); if( state.isAir() ) @@ -72,6 +71,6 @@ public class TurtleInspectCommand implements ITurtleCommand { return value; } - return property.name( value ); + return property.getName( value ); } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleMoveCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleMoveCommand.java index 60e58e7dd..bae8eae89 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleMoveCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleMoveCommand.java @@ -15,21 +15,20 @@ import dan200.computercraft.api.turtle.event.TurtleBlockEvent; import dan200.computercraft.api.turtle.event.TurtleEvent; import dan200.computercraft.shared.TurtlePermissions; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import java.util.List; public class TurtleMoveCommand implements ITurtleCommand { - private static final Box EMPTY_BOX = new Box( 0, 0, 0, 0, 0, 0 ); + private static final AABB EMPTY_BOX = new AABB( 0, 0, 0, 0, 0, 0 ); private final MoveDirection direction; public TurtleMoveCommand( MoveDirection direction ) @@ -45,9 +44,9 @@ public class TurtleMoveCommand implements ITurtleCommand Direction direction = this.direction.toWorldDir( turtle ); // Check if we can move - World oldWorld = turtle.getWorld(); + Level oldWorld = turtle.getWorld(); BlockPos oldPosition = turtle.getPosition(); - BlockPos newPosition = oldPosition.offset( direction ); + BlockPos newPosition = oldPosition.relative( direction ); TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, oldPosition, direction ); TurtleCommandResult canEnterResult = canEnter( turtlePlayer, oldWorld, newPosition ); @@ -58,7 +57,7 @@ public class TurtleMoveCommand implements ITurtleCommand // Check existing block is air or replaceable BlockState state = oldWorld.getBlockState( newPosition ); - if( !oldWorld.isAir( newPosition ) && !WorldUtil.isLiquidBlock( oldWorld, newPosition ) && !state.getMaterial() + if( !oldWorld.isEmptyBlock( newPosition ) && !WorldUtil.isLiquidBlock( oldWorld, newPosition ) && !state.getMaterial() .isReplaceable() ) { return TurtleCommandResult.failure( "Movement obstructed" ); @@ -66,9 +65,9 @@ public class TurtleMoveCommand implements ITurtleCommand // Check there isn't anything in the way VoxelShape collision = state.getCollisionShape( oldWorld, oldPosition ) - .offset( newPosition.getX(), newPosition.getY(), newPosition.getZ() ); + .move( newPosition.getX(), newPosition.getY(), newPosition.getZ() ); - if( !oldWorld.intersectsEntities( null, collision ) ) + if( !oldWorld.isUnobstructed( null, collision ) ) { if( !ComputerCraft.turtlesCanPush || this.direction == MoveDirection.UP || this.direction == MoveDirection.DOWN ) { @@ -76,12 +75,12 @@ public class TurtleMoveCommand implements ITurtleCommand } // Check there is space for all the pushable entities to be pushed - List list = oldWorld.getEntitiesByClass( Entity.class, getBox( collision ), x -> x != null && x.isAlive() && x.inanimate ); + List list = oldWorld.getEntitiesOfClass( Entity.class, getBox( collision ), x -> x != null && x.isAlive() && x.blocksBuilding ); for( Entity entity : list ) { - Box pushedBB = entity.getBoundingBox() - .offset( direction.getOffsetX(), direction.getOffsetY(), direction.getOffsetZ() ); - if( !oldWorld.intersectsEntities( null, VoxelShapes.cuboid( pushedBB ) ) ) + AABB pushedBB = entity.getBoundingBox() + .move( direction.getStepX(), direction.getStepY(), direction.getStepZ() ); + if( !oldWorld.isUnobstructed( null, Shapes.create( pushedBB ) ) ) { return TurtleCommandResult.failure( "Movement obstructed" ); } @@ -129,13 +128,13 @@ public class TurtleMoveCommand implements ITurtleCommand return TurtleCommandResult.success(); } - private static TurtleCommandResult canEnter( TurtlePlayer turtlePlayer, World world, BlockPos position ) + private static TurtleCommandResult canEnter( TurtlePlayer turtlePlayer, Level world, BlockPos position ) { - if( world.isOutOfHeightLimit( position ) ) + if( world.isOutsideBuildHeight( position ) ) { return TurtleCommandResult.failure( position.getY() < 0 ? "Too low to move" : "Too high to move" ); } - if( !world.isInBuildLimit( position ) ) + if( !world.isInWorldBounds( position ) ) { return TurtleCommandResult.failure( "Cannot leave the world" ); } @@ -146,12 +145,12 @@ public class TurtleMoveCommand implements ITurtleCommand return TurtleCommandResult.failure( "Cannot enter protected area" ); } - if( !world.isChunkLoaded( position ) ) + if( !world.hasChunkAt( position ) ) { return TurtleCommandResult.failure( "Cannot leave loaded world" ); } if( !world.getWorldBorder() - .contains( position ) ) + .isWithinBounds( position ) ) { return TurtleCommandResult.failure( "Cannot pass the world border" ); } @@ -159,8 +158,8 @@ public class TurtleMoveCommand implements ITurtleCommand return TurtleCommandResult.success(); } - private static Box getBox( VoxelShape shape ) + private static AABB getBox( VoxelShape shape ) { - return shape.isEmpty() ? EMPTY_BOX : shape.getBoundingBox(); + return shape.isEmpty() ? EMPTY_BOX : shape.bounds(); } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java index ea6c02a5a..f38ee775b 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlaceCommand.java @@ -18,21 +18,31 @@ import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.DropConsumer; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.item.*; -import net.minecraft.text.LiteralText; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.BoatItem; +import net.minecraft.world.item.BottleItem; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SignItem; +import net.minecraft.world.item.WaterLilyBlockItem; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; @@ -53,7 +63,7 @@ public class TurtlePlaceCommand implements ITurtleCommand { // Create a fake player, and orient it appropriately BlockPos playerPosition = turtle.getPosition() - .offset( direction ); + .relative( direction ); TurtlePlayer turtlePlayer = createPlayer( turtle, playerPosition, direction ); return deploy( stack, turtle, turtlePlayer, direction, extraArguments, outErrorMessage ); @@ -65,7 +75,7 @@ public class TurtlePlaceCommand implements ITurtleCommand { // Get thing to place ItemStack stack = turtle.getInventory() - .getStack( turtle.getSelectedSlot() ); + .getItem( turtle.getSelectedSlot() ); if( stack.isEmpty() ) { return TurtleCommandResult.failure( "No items to place" ); @@ -74,11 +84,11 @@ public class TurtlePlaceCommand implements ITurtleCommand // Remember old block Direction direction = this.direction.toWorldDir( turtle ); BlockPos coordinates = turtle.getPosition() - .offset( direction ); + .relative( direction ); // Create a fake player, and orient it appropriately BlockPos playerPosition = turtle.getPosition() - .offset( direction ); + .relative( direction ); TurtlePlayer turtlePlayer = createPlayer( turtle, playerPosition, direction ); TurtleBlockEvent.Place place = new TurtleBlockEvent.Place( turtle, turtlePlayer, turtle.getWorld(), coordinates, stack ); @@ -94,9 +104,9 @@ public class TurtlePlaceCommand implements ITurtleCommand { // Put the remaining items back turtle.getInventory() - .setStack( turtle.getSelectedSlot(), remainder ); + .setItem( turtle.getSelectedSlot(), remainder ); turtle.getInventory() - .markDirty(); + .setChanged(); // Animate and return success turtle.playAnimation( TurtleAnimation.WAIT ); @@ -138,7 +148,7 @@ public class TurtlePlaceCommand implements ITurtleCommand // Deploy on the block immediately in front BlockPos position = turtle.getPosition(); - BlockPos newPosition = position.offset( direction ); + BlockPos newPosition = position.relative( direction ); remainder = deployOnBlock( stack, turtle, turtlePlayer, newPosition, direction.getOpposite(), extraArguments, true, outErrorMessage ); if( remainder != stack ) { @@ -149,7 +159,7 @@ public class TurtlePlaceCommand implements ITurtleCommand remainder = deployOnBlock( stack, turtle, turtlePlayer, - newPosition.offset( direction ), + newPosition.relative( direction ), direction.getOpposite(), extraArguments, false, @@ -162,7 +172,7 @@ public class TurtlePlaceCommand implements ITurtleCommand if( direction.getAxis() != Direction.Axis.Y ) { // Deploy down on the block in front - remainder = deployOnBlock( stack, turtle, turtlePlayer, newPosition.down(), Direction.UP, extraArguments, false, outErrorMessage ); + remainder = deployOnBlock( stack, turtle, turtlePlayer, newPosition.below(), Direction.UP, extraArguments, false, outErrorMessage ); if( remainder != stack ) { return remainder; @@ -186,32 +196,32 @@ public class TurtlePlaceCommand implements ITurtleCommand if( turtle.getPosition() .equals( position ) ) { - posX += 0.48 * direction.getOffsetX(); - posY += 0.48 * direction.getOffsetY(); - posZ += 0.48 * direction.getOffsetZ(); + posX += 0.48 * direction.getStepX(); + posY += 0.48 * direction.getStepY(); + posZ += 0.48 * direction.getStepZ(); } if( direction.getAxis() != Direction.Axis.Y ) { - turtlePlayer.setYaw( direction.asRotation() ); - turtlePlayer.setPitch( 0.0f ); + turtlePlayer.setYRot( direction.toYRot() ); + turtlePlayer.setXRot( 0.0f ); } else { - turtlePlayer.setYaw( turtle.getDirection() - .asRotation() ); - turtlePlayer.setPitch( DirectionUtil.toPitchAngle( direction ) ); + turtlePlayer.setYRot( turtle.getDirection() + .toYRot() ); + turtlePlayer.setXRot( DirectionUtil.toPitchAngle( direction ) ); } - turtlePlayer.setPos( posX, posY, posZ ); - turtlePlayer.prevX = posX; - turtlePlayer.prevY = posY; - turtlePlayer.prevZ = posZ; - turtlePlayer.prevPitch = turtlePlayer.getPitch(); - turtlePlayer.prevYaw = turtlePlayer.getYaw(); + turtlePlayer.setPosRaw( posX, posY, posZ ); + turtlePlayer.xo = posX; + turtlePlayer.yo = posY; + turtlePlayer.zo = posZ; + turtlePlayer.xRotO = turtlePlayer.getXRot(); + turtlePlayer.yRotO = turtlePlayer.getYRot(); - turtlePlayer.headYaw = turtlePlayer.getYaw(); - turtlePlayer.prevHeadYaw = turtlePlayer.headYaw; + turtlePlayer.yHeadRot = turtlePlayer.getYRot(); + turtlePlayer.yHeadRotO = turtlePlayer.yHeadRot; } @Nonnull @@ -219,11 +229,11 @@ public class TurtlePlaceCommand implements ITurtleCommand Object[] extraArguments, String[] outErrorMessage ) { // See if there is an entity present - final World world = turtle.getWorld(); + final Level world = turtle.getWorld(); final BlockPos position = turtle.getPosition(); - Vec3d turtlePos = turtlePlayer.getPos(); - Vec3d rayDir = turtlePlayer.getRotationVec( 1.0f ); - Pair hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 ); + Vec3 turtlePos = turtlePlayer.position(); + Vec3 rayDir = turtlePlayer.getViewVector( 1.0f ); + Pair hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 ); if( hit == null ) { return stack; @@ -235,27 +245,27 @@ public class TurtlePlaceCommand implements ITurtleCommand // Start claiming entity drops Entity hitEntity = hit.getKey(); - Vec3d hitPos = hit.getValue(); + Vec3 hitPos = hit.getValue(); DropConsumer.set( hitEntity, drop -> InventoryUtil.storeItems( drop, turtle.getItemHandler(), turtle.getSelectedSlot() ) ); // Place on the entity boolean placed = false; - ActionResult cancelResult = hitEntity.interactAt( turtlePlayer, hitPos, Hand.MAIN_HAND ); + InteractionResult cancelResult = hitEntity.interactAt( turtlePlayer, hitPos, InteractionHand.MAIN_HAND ); - if( cancelResult != null && cancelResult.isAccepted() ) + if( cancelResult != null && cancelResult.consumesAction() ) { placed = true; } else { - cancelResult = hitEntity.interact( turtlePlayer, Hand.MAIN_HAND ); - if( cancelResult != null && cancelResult.isAccepted() ) + cancelResult = hitEntity.interact( turtlePlayer, InteractionHand.MAIN_HAND ); + if( cancelResult != null && cancelResult.consumesAction() ) { placed = true; } else if( hitEntity instanceof LivingEntity ) { - placed = stackCopy.useOnEntity( turtlePlayer, (LivingEntity) hitEntity, Hand.MAIN_HAND ).isAccepted(); + placed = stackCopy.interactLivingEntity( turtlePlayer, (LivingEntity) hitEntity, InteractionHand.MAIN_HAND ).consumesAction(); if( placed ) turtlePlayer.loadInventory( stackCopy ); } } @@ -273,7 +283,7 @@ public class TurtlePlaceCommand implements ITurtleCommand // Put everything we collected into the turtles inventory, then return ItemStack remainder = turtlePlayer.unloadInventory( turtle ); - if( !placed && ItemStack.areEqual( stack, remainder ) ) + if( !placed && ItemStack.matches( stack, remainder ) ) { return stack; } @@ -293,26 +303,26 @@ public class TurtlePlaceCommand implements ITurtleCommand { // Re-orient the fake player Direction playerDir = side.getOpposite(); - BlockPos playerPosition = position.offset( side ); + BlockPos playerPosition = position.relative( side ); orientPlayer( turtle, turtlePlayer, playerPosition, playerDir ); ItemStack stackCopy = stack.copy(); turtlePlayer.loadInventory( stackCopy ); // Calculate where the turtle would hit the block - float hitX = 0.5f + side.getOffsetX() * 0.5f; - float hitY = 0.5f + side.getOffsetY() * 0.5f; - float hitZ = 0.5f + side.getOffsetZ() * 0.5f; + float hitX = 0.5f + side.getStepX() * 0.5f; + float hitY = 0.5f + side.getStepY() * 0.5f; + float hitZ = 0.5f + side.getStepZ() * 0.5f; if( Math.abs( hitY - 0.5f ) < 0.01f ) { hitY = 0.45f; } // Check if there's something suitable to place onto - BlockHitResult hit = new BlockHitResult( new Vec3d( hitX, hitY, hitZ ), side, position, false ); - ItemUsageContext context = new ItemUsageContext( turtlePlayer, Hand.MAIN_HAND, hit ); - ItemPlacementContext placementContext = new ItemPlacementContext( context ); - if( !canDeployOnBlock( new ItemPlacementContext( context ), turtle, turtlePlayer, position, side, allowReplace, outErrorMessage ) ) + BlockHitResult hit = new BlockHitResult( new Vec3( hitX, hitY, hitZ ), side, position, false ); + UseOnContext context = new UseOnContext( turtlePlayer, InteractionHand.MAIN_HAND, hit ); + BlockPlaceContext placementContext = new BlockPlaceContext( context ); + if( !canDeployOnBlock( new BlockPlaceContext( context ), turtle, turtlePlayer, position, side, allowReplace, outErrorMessage ) ) { return stack; } @@ -325,20 +335,20 @@ public class TurtlePlaceCommand implements ITurtleCommand BlockEntity existingTile = turtle.getWorld() .getBlockEntity( position ); - if( stackCopy.useOnBlock( context ).isAccepted() ) + if( stackCopy.useOn( context ).consumesAction() ) { placed = true; turtlePlayer.loadInventory( stackCopy ); } - if( !placed && (item instanceof BucketItem || item instanceof BoatItem || item instanceof LilyPadItem || item instanceof GlassBottleItem) ) + if( !placed && (item instanceof BucketItem || item instanceof BoatItem || item instanceof WaterLilyBlockItem || item instanceof BottleItem) ) { - TypedActionResult result = stackCopy.use( turtle.getWorld(), turtlePlayer, Hand.MAIN_HAND ); + InteractionResultHolder result = stackCopy.use( turtle.getWorld(), turtlePlayer, InteractionHand.MAIN_HAND ); if( result.getResult() - .isAccepted() && !ItemStack.areEqual( stack, result.getValue() ) ) + .consumesAction() && !ItemStack.matches( stack, result.getObject() ) ) { placed = true; - turtlePlayer.loadInventory( result.getValue() ); + turtlePlayer.loadInventory( result.getObject() ); } } @@ -347,11 +357,11 @@ public class TurtlePlaceCommand implements ITurtleCommand { if( extraArguments != null && extraArguments.length >= 1 && extraArguments[0] instanceof String ) { - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockEntity tile = world.getBlockEntity( position ); if( tile == null || tile == existingTile ) { - tile = world.getBlockEntity( position.offset( side ) ); + tile = world.getBlockEntity( position.relative( side ) ); } if( tile instanceof SignBlockEntity ) { @@ -365,27 +375,27 @@ public class TurtlePlaceCommand implements ITurtleCommand { if( split[i - firstLine].length() > 15 ) { - signTile.setTextOnRow( i, new LiteralText( split[i - firstLine].substring( 0, 15 ) ) ); + signTile.setMessage( i, new TextComponent( split[i - firstLine].substring( 0, 15 ) ) ); } else { - signTile.setTextOnRow( i, new LiteralText( split[i - firstLine] ) ); + signTile.setMessage( i, new TextComponent( split[i - firstLine] ) ); } } else { - signTile.setTextOnRow( i, new LiteralText( "" ) ); + signTile.setMessage( i, new TextComponent( "" ) ); } } - signTile.markDirty(); - world.updateListeners( tile.getPos(), tile.getCachedState(), tile.getCachedState(), 3 ); + signTile.setChanged(); + world.sendBlockUpdated( tile.getBlockPos(), tile.getBlockState(), tile.getBlockState(), 3 ); } } } // Put everything we collected into the turtles inventory, then return ItemStack remainder = turtlePlayer.unloadInventory( turtle ); - if( !placed && ItemStack.areEqual( stack, remainder ) ) + if( !placed && ItemStack.matches( stack, remainder ) ) { return stack; } @@ -399,11 +409,11 @@ public class TurtlePlaceCommand implements ITurtleCommand } } - private static boolean canDeployOnBlock( @Nonnull ItemPlacementContext context, ITurtleAccess turtle, TurtlePlayer player, BlockPos position, + private static boolean canDeployOnBlock( @Nonnull BlockPlaceContext context, ITurtleAccess turtle, TurtlePlayer player, BlockPos position, Direction side, boolean allowReplaceable, String[] outErrorMessage ) { - World world = turtle.getWorld(); - if( !world.isInBuildLimit( position ) || world.isAir( position ) || (context.getStack() + Level world = turtle.getWorld(); + if( !world.isInWorldBounds( position ) || world.isEmptyBlock( position ) || (context.getItemInHand() .getItem() instanceof BlockItem && WorldUtil.isLiquidBlock( world, position )) ) { @@ -412,7 +422,7 @@ public class TurtlePlaceCommand implements ITurtleCommand BlockState state = world.getBlockState( position ); - boolean replaceable = state.canReplace( context ); + boolean replaceable = state.canBeReplaced( context ); if( !allowReplaceable && replaceable ) { return false; @@ -422,7 +432,7 @@ public class TurtlePlaceCommand implements ITurtleCommand { // Check spawn protection boolean editable = replaceable ? TurtlePermissions.isBlockEditable( world, position, player ) : TurtlePermissions.isBlockEditable( world, - position.offset( + position.relative( side ), player ); if( !editable ) diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java index 896ade7a6..73b6a6113 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java @@ -14,24 +14,23 @@ import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.util.FakeNetHandler; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.passive.HorseBaseEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.animal.horse.AbstractHorse; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.phys.Vec3; import java.util.OptionalInt; import java.util.UUID; @@ -41,18 +40,18 @@ public final class TurtlePlayer extends FakePlayer private static final GameProfile DEFAULT_PROFILE = new GameProfile( UUID.fromString( "0d0c4ca0-4ff1-11e4-916c-0800200c9a66" ), "[ComputerCraft]" ); // TODO [M3R1-01] Fix Turtle not giving player achievement for actions - private TurtlePlayer( ServerWorld world, GameProfile name ) + private TurtlePlayer( ServerLevel world, GameProfile name ) { super( world, name ); } private static TurtlePlayer create( ITurtleAccess turtle ) { - ServerWorld world = (ServerWorld) turtle.getWorld(); + ServerLevel world = (ServerLevel) turtle.getWorld(); GameProfile profile = turtle.getOwningPlayer(); TurtlePlayer player = new TurtlePlayer( world, getProfile( profile ) ); - player.networkHandler = new FakeNetHandler( player ); + player.connection = new FakeNetHandler( player ); player.setState( turtle ); if( profile != null && profile.getId() != null ) @@ -60,8 +59,8 @@ public final class TurtlePlayer extends FakePlayer // Constructing a player overrides the "active player" variable in advancements. As fake players cannot // get advancements, this prevents a normal player who has placed a turtle from getting advancements. // We try to locate the "actual" player and restore them. - ServerPlayerEntity actualPlayer = world.getServer().getPlayerManager().getPlayer( player.getUuid() ); - if( actualPlayer != null ) player.getAdvancementTracker().setOwner( actualPlayer ); + ServerPlayer actualPlayer = world.getServer().getPlayerList().getPlayer( player.getUUID() ); + if( actualPlayer != null ) player.getAdvancements().setPlayer( actualPlayer ); } return player; @@ -74,20 +73,20 @@ public final class TurtlePlayer extends FakePlayer private void setState( ITurtleAccess turtle ) { - if( currentScreenHandler != playerScreenHandler ) + if( containerMenu != inventoryMenu ) { - ComputerCraft.log.warn( "Turtle has open container ({})", currentScreenHandler ); - closeHandledScreen(); + ComputerCraft.log.warn( "Turtle has open container ({})", containerMenu ); + closeContainer(); } BlockPos position = turtle.getPosition(); - setPos( position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5 ); + setPosRaw( position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5 ); - setYaw( turtle.getDirection() - .asRotation() ); - setPitch( 0.0f ); + setYRot( turtle.getDirection() + .toYRot() ); + setXRot( 0.0f ); - getInventory().clear(); + getInventory().clearContent(); } public static TurtlePlayer get( ITurtleAccess access ) @@ -96,7 +95,7 @@ public final class TurtlePlayer extends FakePlayer TurtleBrain brain = (TurtleBrain) access; TurtlePlayer player = brain.cachedPlayer; - if( player == null || player.getGameProfile() != getProfile( access.getOwningPlayer() ) || player.getEntityWorld() != access.getWorld() ) + if( player == null || player.getGameProfile() != getProfile( access.getOwningPlayer() ) || player.getCommandSenderWorld() != access.getWorld() ) { player = brain.cachedPlayer = create( brain ); } @@ -111,23 +110,23 @@ public final class TurtlePlayer extends FakePlayer public void loadInventory( @Nonnull ItemStack currentStack ) { // Load up the fake inventory - getInventory().selectedSlot = 0; - getInventory().setStack( 0, currentStack ); + getInventory().selected = 0; + getInventory().setItem( 0, currentStack ); } public ItemStack unloadInventory( ITurtleAccess turtle ) { // Get the item we placed with - ItemStack results = getInventory().getStack( 0 ); - getInventory().setStack( 0, ItemStack.EMPTY ); + ItemStack results = getInventory().getItem( 0 ); + getInventory().setItem( 0, ItemStack.EMPTY ); // Store (or drop) anything else we found BlockPos dropPosition = turtle.getPosition(); Direction dropDirection = turtle.getDirection() .getOpposite(); - for( int i = 0; i < getInventory().size(); i++ ) + for( int i = 0; i < getInventory().getContainerSize(); i++ ) { - ItemStack stack = getInventory().getStack( i ); + ItemStack stack = getInventory().getItem( i ); if( !stack.isEmpty() ) { ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getItemHandler(), turtle.getSelectedSlot() ); @@ -135,10 +134,10 @@ public final class TurtlePlayer extends FakePlayer { WorldUtil.dropItemStack( remainder, turtle.getWorld(), dropPosition, dropDirection ); } - getInventory().setStack( i, ItemStack.EMPTY ); + getInventory().setItem( i, ItemStack.EMPTY ); } } - getInventory().markDirty(); + getInventory().setChanged(); return results; } @@ -150,30 +149,30 @@ public final class TurtlePlayer extends FakePlayer } @Override - public float getEyeHeight( @Nonnull EntityPose pose ) + public float getEyeHeight( @Nonnull Pose pose ) { return 0; } @Override - public Vec3d getPos() + public Vec3 position() { - return new Vec3d( getX(), getY(), getZ() ); + return new Vec3( getX(), getY(), getZ() ); } @Override - public float getActiveEyeHeight( @Nonnull EntityPose pose, @Nonnull EntityDimensions size ) + public float getStandingEyeHeight( @Nonnull Pose pose, @Nonnull EntityDimensions size ) { return 0; } @Override - public void enterCombat() + public void onEnterCombat() { } @Override - public void endCombat() + public void onLeaveCombat() { } @@ -189,30 +188,30 @@ public final class TurtlePlayer extends FakePlayer } @Override - public void openEditSignScreen( @Nonnull SignBlockEntity signTile ) + public void openTextEdit( @Nonnull SignBlockEntity signTile ) { } //region Code which depends on the connection @Nonnull @Override - public OptionalInt openHandledScreen( @Nullable NamedScreenHandlerFactory prover ) + public OptionalInt openMenu( @Nullable MenuProvider prover ) { return OptionalInt.empty(); } @Override - public void openHorseInventory( @Nonnull HorseBaseEntity horse, @Nonnull Inventory inventory ) + public void openHorseInventory( @Nonnull AbstractHorse horse, @Nonnull Container inventory ) { } @Override - public void closeHandledScreen() + public void closeContainer() { } @Override - protected void onStatusEffectRemoved( @Nonnull StatusEffectInstance effect ) + protected void onEffectRemoved( @Nonnull MobEffectInstance effect ) { } //endregion diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleRefuelCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleRefuelCommand.java index d97e28ad8..be8a3585c 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleRefuelCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleRefuelCommand.java @@ -12,9 +12,8 @@ import dan200.computercraft.api.turtle.TurtleAnimation; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.event.TurtleEvent; import dan200.computercraft.api.turtle.event.TurtleRefuelEvent; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; public class TurtleRefuelCommand implements ITurtleCommand { @@ -31,7 +30,7 @@ public class TurtleRefuelCommand implements ITurtleCommand { int slot = turtle.getSelectedSlot(); ItemStack stack = turtle.getInventory() - .getStack( slot ); + .getItem( slot ); if( stack.isEmpty() ) { return TurtleCommandResult.failure( "No items to combust" ); diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java index f8aa7ffe8..74897fbe6 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleSuckCommand.java @@ -14,16 +14,15 @@ import dan200.computercraft.api.turtle.event.TurtleEvent; import dan200.computercraft.api.turtle.event.TurtleInventoryEvent; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.ItemStorage; -import net.minecraft.entity.ItemEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import java.util.List; public class TurtleSuckCommand implements ITurtleCommand @@ -52,12 +51,12 @@ public class TurtleSuckCommand implements ITurtleCommand Direction direction = this.direction.toWorldDir( turtle ); // Get inventory for thing in front - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos turtlePosition = turtle.getPosition(); - BlockPos blockPosition = turtlePosition.offset( direction ); + BlockPos blockPosition = turtlePosition.relative( direction ); Direction side = direction.getOpposite(); - Inventory inventory = InventoryUtil.getInventory( world, blockPosition, side ); + Container inventory = InventoryUtil.getInventory( world, blockPosition, side ); // Fire the event, exiting if it is cancelled. TurtlePlayer player = TurtlePlaceCommand.createPlayer( turtle, turtlePosition, direction ); @@ -98,13 +97,13 @@ public class TurtleSuckCommand implements ITurtleCommand else { // Suck up loose items off the ground - Box aabb = new Box( blockPosition.getX(), + AABB aabb = new AABB( blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), blockPosition.getX() + 1.0, blockPosition.getY() + 1.0, blockPosition.getZ() + 1.0 ); - List list = world.getEntitiesByClass( ItemEntity.class, aabb, EntityPredicates.VALID_ENTITY ); + List list = world.getEntitiesOfClass( ItemEntity.class, aabb, EntitySelector.ENTITY_STILL_ALIVE ); if( list.isEmpty() ) { return TurtleCommandResult.failure( "No items to take" ); @@ -113,7 +112,7 @@ public class TurtleSuckCommand implements ITurtleCommand for( ItemEntity entity : list ) { // Suck up the item - ItemStack stack = entity.getStack() + ItemStack stack = entity.getItem() .copy(); ItemStack storeStack; @@ -139,20 +138,20 @@ public class TurtleSuckCommand implements ITurtleCommand } else if( remainder.isEmpty() ) { - entity.setStack( leaveStack ); + entity.setItem( leaveStack ); } else if( leaveStack.isEmpty() ) { - entity.setStack( remainder ); + entity.setItem( remainder ); } else { - leaveStack.increment( remainder.getCount() ); - entity.setStack( leaveStack ); + leaveStack.grow( remainder.getCount() ); + entity.setItem( leaveStack ); } // Play fx - world.syncGlobalEvent( 1000, turtlePosition, 0 ); // BLOCK_DISPENSER_DISPENSE + world.globalLevelEvent( 1000, turtlePosition, 0 ); // BLOCK_DISPENSER_DISPENSE turtle.playAnimation( TurtleAnimation.WAIT ); return TurtleCommandResult.success(); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTransferToCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTransferToCommand.java index 608d3196e..eb98cd731 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTransferToCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTransferToCommand.java @@ -11,9 +11,8 @@ import dan200.computercraft.api.turtle.ITurtleCommand; import dan200.computercraft.api.turtle.TurtleAnimation; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.shared.util.InventoryUtil; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; public class TurtleTransferToCommand implements ITurtleCommand { diff --git a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTurnCommand.java b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTurnCommand.java index fd669ac8d..add8d1fec 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTurnCommand.java +++ b/src/main/java/dan200/computercraft/shared/turtle/core/TurtleTurnCommand.java @@ -39,12 +39,12 @@ public class TurtleTurnCommand implements ITurtleCommand { case LEFT: turtle.setDirection( turtle.getDirection() - .rotateYCounterclockwise() ); + .getCounterClockWise() ); turtle.playAnimation( TurtleAnimation.TURN_LEFT ); return TurtleCommandResult.success(); case RIGHT: turtle.setDirection( turtle.getDirection() - .rotateYClockwise() ); + .getClockWise() ); turtle.playAnimation( TurtleAnimation.TURN_RIGHT ); return TurtleCommandResult.success(); default: diff --git a/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java index 17a06de7c..1e25ce1c7 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/inventory/ContainerTurtle.java @@ -15,17 +15,16 @@ import dan200.computercraft.shared.network.container.ComputerContainerData; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.util.SingleIntArray; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.screen.ArrayPropertyDelegate; -import net.minecraft.screen.PropertyDelegate; -import net.minecraft.screen.slot.Slot; - import javax.annotation.Nonnull; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import java.util.function.Predicate; public class ContainerTurtle extends ContainerComputerBase @@ -35,13 +34,13 @@ public class ContainerTurtle extends ContainerComputerBase public static final int TURTLE_START_X = ComputerSidebar.WIDTH + 175; public static final int PLAYER_START_X = ComputerSidebar.WIDTH + BORDER; - private final PropertyDelegate properties; + private final ContainerData properties; - public ContainerTurtle( int id, PlayerInventory player, TurtleBrain turtle ) + public ContainerTurtle( int id, Inventory player, TurtleBrain turtle ) { this( id, p -> turtle.getOwner() - .canPlayerUse( p ), + .stillValid( p ), turtle.getOwner() .createServerComputer(), turtle.getFamily(), @@ -50,13 +49,13 @@ public class ContainerTurtle extends ContainerComputerBase (SingleIntArray) turtle::getSelectedSlot ); } - private ContainerTurtle( int id, Predicate canUse, IComputer computer, ComputerFamily family, PlayerInventory playerInventory, - Inventory inventory, PropertyDelegate properties ) + private ContainerTurtle( int id, Predicate canUse, IComputer computer, ComputerFamily family, Inventory playerInventory, + Container inventory, ContainerData properties ) { super( ComputerCraftRegistry.ModContainers.TURTLE, id, canUse, computer, family ); this.properties = properties; - addProperties( properties ); + addDataSlots( properties ); // Turtle inventory for( int y = 0; y < 4; y++ ) @@ -83,20 +82,20 @@ public class ContainerTurtle extends ContainerComputerBase } } - public ContainerTurtle( int id, PlayerInventory player, PacketByteBuf packetByteBuf ) + public ContainerTurtle( int id, Inventory player, FriendlyByteBuf packetByteBuf ) { this( id, player, new ComputerContainerData( packetByteBuf ) ); } - public ContainerTurtle( int id, PlayerInventory player, ComputerContainerData data ) + public ContainerTurtle( int id, Inventory player, ComputerContainerData data ) { this( id, x -> true, getComputer( player, data ), data.getFamily(), player, - new SimpleInventory( TileTurtle.INVENTORY_SIZE ), - new ArrayPropertyDelegate( 1 ) ); + new SimpleContainer( TileTurtle.INVENTORY_SIZE ), + new SimpleContainerData( 1 ) ); } public int getSelectedSlot() @@ -106,7 +105,7 @@ public class ContainerTurtle extends ContainerComputerBase @Nonnull @Override - public ItemStack transferSlot( @Nonnull PlayerEntity player, int slotNum ) + public ItemStack quickMoveStack( @Nonnull Player player, int slotNum ) { if( slotNum >= 0 && slotNum < 16 ) { @@ -120,31 +119,31 @@ public class ContainerTurtle extends ContainerComputerBase } @Nonnull - private ItemStack tryItemMerge( PlayerEntity player, int slotNum, int firstSlot, int lastSlot, boolean reverse ) + private ItemStack tryItemMerge( Player player, int slotNum, int firstSlot, int lastSlot, boolean reverse ) { Slot slot = slots.get( slotNum ); ItemStack originalStack = ItemStack.EMPTY; - if( slot != null && slot.hasStack() ) + if( slot != null && slot.hasItem() ) { - ItemStack clickedStack = slot.getStack(); + ItemStack clickedStack = slot.getItem(); originalStack = clickedStack.copy(); - if( !insertItem( clickedStack, firstSlot, lastSlot, reverse ) ) + if( !moveItemStackTo( clickedStack, firstSlot, lastSlot, reverse ) ) { return ItemStack.EMPTY; } if( clickedStack.isEmpty() ) { - slot.setStack( ItemStack.EMPTY ); + slot.set( ItemStack.EMPTY ); } else { - slot.markDirty(); + slot.setChanged(); } if( clickedStack.getCount() != originalStack.getCount() ) { - slot.onTakeItem( player, clickedStack ); + slot.onTake( player, clickedStack ); } else { diff --git a/src/main/java/dan200/computercraft/shared/turtle/items/ITurtleItem.java b/src/main/java/dan200/computercraft/shared/turtle/items/ITurtleItem.java index 349fc3cab..52cadb86b 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/items/ITurtleItem.java +++ b/src/main/java/dan200/computercraft/shared/turtle/items/ITurtleItem.java @@ -10,11 +10,10 @@ import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.computer.items.IComputerItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; public interface ITurtleItem extends IComputerItem, IColouredItem { @@ -24,5 +23,5 @@ public interface ITurtleItem extends IComputerItem, IColouredItem int getFuelLevel( @Nonnull ItemStack stack ); @Nullable - Identifier getOverlay( @Nonnull ItemStack stack ); + ResourceLocation getOverlay( @Nonnull ItemStack stack ); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/items/ItemTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/items/ItemTurtle.java index 4193f3e32..8843e6a56 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/items/ItemTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/items/ItemTurtle.java @@ -13,30 +13,29 @@ import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.items.ItemComputerBase; import dan200.computercraft.shared.turtle.blocks.BlockTurtle; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; import static dan200.computercraft.shared.turtle.core.TurtleBrain.*; public class ItemTurtle extends ItemComputerBase implements ITurtleItem { - public ItemTurtle( BlockTurtle block, Settings settings ) + public ItemTurtle( BlockTurtle block, Properties settings ) { super( block, settings ); } @Override - public void appendStacks( @Nonnull ItemGroup group, @Nonnull DefaultedList list ) + public void fillItemCategory( @Nonnull CreativeModeTab group, @Nonnull NonNullList list ) { - if( !isIn( group ) ) + if( !allowdedIn( group ) ) { return; } @@ -50,34 +49,34 @@ public class ItemTurtle extends ItemComputerBase implements ITurtleItem .forEach( list::add ); } - public ItemStack create( int id, String label, int colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, int fuelLevel, Identifier overlay ) + public ItemStack create( int id, String label, int colour, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, int fuelLevel, ResourceLocation overlay ) { // Build the stack ItemStack stack = new ItemStack( this ); if( label != null ) { - stack.setCustomName( new LiteralText( label ) ); + stack.setHoverName( new TextComponent( label ) ); } if( id >= 0 ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_ID, id ); } IColouredItem.setColourBasic( stack, colour ); if( fuelLevel > 0 ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putInt( NBT_FUEL, fuelLevel ); } if( overlay != null ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putString( NBT_OVERLAY, overlay.toString() ); } if( leftUpgrade != null ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putString( NBT_LEFT_UPGRADE, leftUpgrade.getUpgradeID() .toString() ); @@ -85,7 +84,7 @@ public class ItemTurtle extends ItemComputerBase implements ITurtleItem if( rightUpgrade != null ) { - stack.getOrCreateNbt() + stack.getOrCreateTag() .putString( NBT_RIGHT_UPGRADE, rightUpgrade.getUpgradeID() .toString() ); @@ -96,28 +95,28 @@ public class ItemTurtle extends ItemComputerBase implements ITurtleItem @Nonnull @Override - public Text getName( @Nonnull ItemStack stack ) + public Component getName( @Nonnull ItemStack stack ) { - String baseString = getTranslationKey( stack ); + String baseString = getDescriptionId( stack ); ITurtleUpgrade left = getUpgrade( stack, TurtleSide.LEFT ); ITurtleUpgrade right = getUpgrade( stack, TurtleSide.RIGHT ); if( left != null && right != null ) { - return new TranslatableText( baseString + ".upgraded_twice", - new TranslatableText( right.getUnlocalisedAdjective() ), - new TranslatableText( left.getUnlocalisedAdjective() ) ); + return new TranslatableComponent( baseString + ".upgraded_twice", + new TranslatableComponent( right.getUnlocalisedAdjective() ), + new TranslatableComponent( left.getUnlocalisedAdjective() ) ); } else if( left != null ) { - return new TranslatableText( baseString + ".upgraded", new TranslatableText( left.getUnlocalisedAdjective() ) ); + return new TranslatableComponent( baseString + ".upgraded", new TranslatableComponent( left.getUnlocalisedAdjective() ) ); } else if( right != null ) { - return new TranslatableText( baseString + ".upgraded", new TranslatableText( right.getUnlocalisedAdjective() ) ); + return new TranslatableComponent( baseString + ".upgraded", new TranslatableComponent( right.getUnlocalisedAdjective() ) ); } else { - return new TranslatableText( baseString ); + return new TranslatableComponent( baseString ); } } @@ -148,7 +147,7 @@ public class ItemTurtle extends ItemComputerBase implements ITurtleItem @Override public ITurtleUpgrade getUpgrade( @Nonnull ItemStack stack, @Nonnull TurtleSide side ) { - NbtCompound tag = stack.getNbt(); + CompoundTag tag = stack.getTag(); if( tag == null ) { return null; @@ -161,15 +160,15 @@ public class ItemTurtle extends ItemComputerBase implements ITurtleItem @Override public int getFuelLevel( @Nonnull ItemStack stack ) { - NbtCompound tag = stack.getNbt(); + CompoundTag tag = stack.getTag(); return tag != null && tag.contains( NBT_FUEL ) ? tag.getInt( NBT_FUEL ) : 0; } @Override - public Identifier getOverlay( @Nonnull ItemStack stack ) + public ResourceLocation getOverlay( @Nonnull ItemStack stack ) { - NbtCompound tag = stack.getNbt(); - return tag != null && tag.contains( NBT_OVERLAY ) ? new Identifier( tag.getString( NBT_OVERLAY ) ) : null; + CompoundTag tag = stack.getTag(); + return tag != null && tag.contains( NBT_OVERLAY ) ? new ResourceLocation( tag.getString( NBT_OVERLAY ) ) : null; } @Override diff --git a/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItemFactory.java b/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItemFactory.java index 9d604502f..908dd8709 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItemFactory.java +++ b/src/main/java/dan200/computercraft/shared/turtle/items/TurtleItemFactory.java @@ -12,10 +12,9 @@ import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.turtle.blocks.ITurtleTile; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; public final class TurtleItemFactory { @@ -38,7 +37,7 @@ public final class TurtleItemFactory @Nonnull public static ItemStack create( int id, String label, int colour, ComputerFamily family, ITurtleUpgrade leftUpgrade, ITurtleUpgrade rightUpgrade, - int fuelLevel, Identifier overlay ) + int fuelLevel, ResourceLocation overlay ) { switch( family ) { diff --git a/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java b/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java index 3fda22471..f4e53bef9 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java +++ b/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleRecipe.java @@ -10,13 +10,12 @@ import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.items.IComputerItem; import dan200.computercraft.shared.computer.recipe.ComputerFamilyRecipe; import dan200.computercraft.shared.turtle.items.TurtleItemFactory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; public final class TurtleRecipe extends ComputerFamilyRecipe { @@ -24,13 +23,13 @@ public final class TurtleRecipe extends ComputerFamilyRecipe new ComputerFamilyRecipe.Serializer() { @Override - protected TurtleRecipe create( Identifier identifier, String group, int width, int height, DefaultedList ingredients, ItemStack result, ComputerFamily family ) + protected TurtleRecipe create( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result, ComputerFamily family ) { return new TurtleRecipe( identifier, group, width, height, ingredients, result, family ); } }; - private TurtleRecipe( Identifier identifier, String group, int width, int height, DefaultedList ingredients, ItemStack result, + private TurtleRecipe( ResourceLocation identifier, String group, int width, int height, NonNullList ingredients, ItemStack result, ComputerFamily family ) { super( identifier, group, width, height, ingredients, result, family ); diff --git a/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java b/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java index fc297291a..c68a539de 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java +++ b/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java @@ -12,41 +12,40 @@ import dan200.computercraft.shared.TurtleUpgrades; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.turtle.items.ITurtleItem; import dan200.computercraft.shared.turtle.items.TurtleItemFactory; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.SpecialCraftingRecipe; -import net.minecraft.recipe.SpecialRecipeSerializer; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; +import net.minecraft.world.level.Level; -public final class TurtleUpgradeRecipe extends SpecialCraftingRecipe +public final class TurtleUpgradeRecipe extends CustomRecipe { - public static final RecipeSerializer SERIALIZER = new SpecialRecipeSerializer<>( TurtleUpgradeRecipe::new ); + public static final RecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>( TurtleUpgradeRecipe::new ); - private TurtleUpgradeRecipe( Identifier id ) + private TurtleUpgradeRecipe( ResourceLocation id ) { super( id ); } @Nonnull @Override - public ItemStack getOutput() + public ItemStack getResultItem() { return TurtleItemFactory.create( -1, null, -1, ComputerFamily.NORMAL, null, null, 0, null ); } @Override - public boolean matches( @Nonnull CraftingInventory inventory, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inventory, @Nonnull Level world ) { return !craft( inventory ).isEmpty(); } @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inventory ) + public ItemStack craft( @Nonnull CraftingContainer inventory ) { // Scan the grid for a row containing a turtle and 1 or 2 items ItemStack leftItem = ItemStack.EMPTY; @@ -61,7 +60,7 @@ public final class TurtleUpgradeRecipe extends SpecialCraftingRecipe boolean finishedRow = false; for( int x = 0; x < inventory.getWidth(); x++ ) { - ItemStack item = inventory.getStack( x + y * inventory.getWidth() ); + ItemStack item = inventory.getItem( x + y * inventory.getWidth() ); if( !item.isEmpty() ) { if( finishedRow ) @@ -119,7 +118,7 @@ public final class TurtleUpgradeRecipe extends SpecialCraftingRecipe // Turtle is already found, just check this row is empty for( int x = 0; x < inventory.getWidth(); x++ ) { - ItemStack item = inventory.getStack( x + y * inventory.getWidth() ); + ItemStack item = inventory.getItem( x + y * inventory.getWidth() ); if( !item.isEmpty() ) { return ItemStack.EMPTY; @@ -171,12 +170,12 @@ public final class TurtleUpgradeRecipe extends SpecialCraftingRecipe String label = itemTurtle.getLabel( turtle ); int fuelLevel = itemTurtle.getFuelLevel( turtle ); int colour = itemTurtle.getColour( turtle ); - Identifier overlay = itemTurtle.getOverlay( turtle ); + ResourceLocation overlay = itemTurtle.getOverlay( turtle ); return TurtleItemFactory.create( computerID, label, colour, family, upgrades[0], upgrades[1], fuelLevel, overlay ); } @Override - public boolean fits( int x, int y ) + public boolean canCraftInDimensions( int x, int y ) { return x >= 3 && y >= 1; } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleAxe.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleAxe.java index 635536c0f..cdc91c422 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleAxe.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleAxe.java @@ -6,23 +6,23 @@ package dan200.computercraft.shared.turtle.upgrades; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; public class TurtleAxe extends TurtleTool { - public TurtleAxe( Identifier id, String adjective, Item item ) + public TurtleAxe( ResourceLocation id, String adjective, Item item ) { super( id, adjective, item ); } - public TurtleAxe( Identifier id, Item item ) + public TurtleAxe( ResourceLocation id, Item item ) { super( id, item ); } - public TurtleAxe( Identifier id, ItemStack craftItem, ItemStack toolItem ) + public TurtleAxe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem ) { super( id, craftItem, toolItem ); } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleCraftingTable.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleCraftingTable.java index 88d668a87..d238dc706 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleCraftingTable.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleCraftingTable.java @@ -14,21 +14,20 @@ import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleUpgradeType; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.block.Blocks; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.util.Identifier; - +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; import javax.annotation.Nonnull; public class TurtleCraftingTable extends AbstractTurtleUpgrade { @Environment( EnvType.CLIENT ) - private ModelIdentifier leftModel; + private ModelResourceLocation leftModel; @Environment( EnvType.CLIENT ) - private ModelIdentifier rightModel; + private ModelResourceLocation rightModel; - public TurtleCraftingTable( Identifier id ) + public TurtleCraftingTable( ResourceLocation id ) { super( id, TurtleUpgradeType.PERIPHERAL, Blocks.CRAFTING_TABLE ); } @@ -53,8 +52,8 @@ public class TurtleCraftingTable extends AbstractTurtleUpgrade { if( leftModel == null ) { - leftModel = new ModelIdentifier( "computercraft:turtle_crafting_table_left", "inventory" ); - rightModel = new ModelIdentifier( "computercraft:turtle_crafting_table_right", "inventory" ); + leftModel = new ModelResourceLocation( "computercraft:turtle_crafting_table_left", "inventory" ); + rightModel = new ModelResourceLocation( "computercraft:turtle_crafting_table_right", "inventory" ); } } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java index 1676455c6..e6e5ecf6e 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java @@ -12,30 +12,29 @@ import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleVerb; import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; public class TurtleHoe extends TurtleTool { - public TurtleHoe( Identifier id, String adjective, Item item ) + public TurtleHoe( ResourceLocation id, String adjective, Item item ) { super( id, adjective, item ); } - public TurtleHoe( Identifier id, Item item ) + public TurtleHoe( ResourceLocation id, Item item ) { super( id, item ); } - public TurtleHoe( Identifier id, ItemStack craftItem, ItemStack toolItem ) + public TurtleHoe( ResourceLocation id, ItemStack craftItem, ItemStack toolItem ) { super( id, craftItem, toolItem ); } @@ -57,7 +56,7 @@ public class TurtleHoe extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected boolean canBreakBlock( BlockState state, Level world, BlockPos pos, TurtlePlayer player ) { if( !super.canBreakBlock( state, world, pos, player ) ) { @@ -65,6 +64,6 @@ public class TurtleHoe extends TurtleTool } Material material = state.getMaterial(); - return material == Material.PLANT || material == Material.CACTUS || material == Material.GOURD || material == Material.LEAVES || material == Material.UNDERWATER_PLANT || material == Material.REPLACEABLE_PLANT; + return material == Material.PLANT || material == Material.CACTUS || material == Material.VEGETABLE || material == Material.LEAVES || material == Material.WATER_PLANT || material == Material.REPLACEABLE_PLANT; } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java index 2b36437fd..eb264d95b 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java @@ -9,22 +9,21 @@ package dan200.computercraft.shared.turtle.upgrades; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeType; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.NonNullList; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class TurtleInventoryCrafting extends CraftingInventory +public class TurtleInventoryCrafting extends CraftingContainer { private final ITurtleAccess turtle; private int xStart; @@ -42,7 +41,7 @@ public class TurtleInventoryCrafting extends CraftingInventory } @Nullable - private Recipe tryCrafting( int xStart, int yStart ) + private Recipe tryCrafting( int xStart, int yStart ) { this.xStart = xStart; this.yStart = yStart; @@ -55,7 +54,7 @@ public class TurtleInventoryCrafting extends CraftingInventory if( x < this.xStart || x >= this.xStart + 3 || y < this.yStart || y >= this.yStart + 3 ) { if( !turtle.getInventory() - .getStack( x + y * TileTurtle.INVENTORY_WIDTH ) + .getItem( x + y * TileTurtle.INVENTORY_WIDTH ) .isEmpty() ) { return null; @@ -67,20 +66,20 @@ public class TurtleInventoryCrafting extends CraftingInventory // Check the actual crafting return turtle.getWorld() .getRecipeManager() - .getFirstMatch( RecipeType.CRAFTING, this, turtle.getWorld() ) + .getRecipeFor( RecipeType.CRAFTING, this, turtle.getWorld() ) .orElse( null ); } @Nullable - public List doCrafting( World world, int maxCount ) + public List doCrafting( Level world, int maxCount ) { - if( world.isClient || !(world instanceof ServerWorld) ) + if( world.isClientSide || !(world instanceof ServerLevel) ) { return null; } // Find out what we can craft - Recipe recipe = tryCrafting( 0, 0 ); + Recipe recipe = tryCrafting( 0, 0 ); if( recipe == null ) { recipe = tryCrafting( 0, 1 ); @@ -109,25 +108,25 @@ public class TurtleInventoryCrafting extends CraftingInventory ArrayList results = new ArrayList<>(); for( int i = 0; i < maxCount && recipe.matches( this, world ); i++ ) { - ItemStack result = recipe.craft( this ); + ItemStack result = recipe.assemble( this ); if( result.isEmpty() ) { break; } results.add( result ); - result.onCraft( world, player, result.getCount() ); - DefaultedList remainders = recipe.getRemainder( this ); + result.onCraftedBy( world, player, result.getCount() ); + NonNullList remainders = recipe.getRemainingItems( this ); for( int slot = 0; slot < remainders.size(); slot++ ) { - ItemStack existing = getStack( slot ); + ItemStack existing = getItem( slot ); ItemStack remainder = remainders.get( slot ); if( !existing.isEmpty() ) { - removeStack( slot, 1 ); - existing = getStack( slot ); + removeItem( slot, 1 ); + existing = getItem( slot ); } if( remainder.isEmpty() ) @@ -139,12 +138,12 @@ public class TurtleInventoryCrafting extends CraftingInventory // afterwards). if( existing.isEmpty() ) { - setStack( slot, remainder ); + setItem( slot, remainder ); } - else if( ItemStack.areItemsEqualIgnoreDamage( existing, remainder ) && ItemStack.areNbtEqual( existing, remainder ) ) + else if( ItemStack.isSame( existing, remainder ) && ItemStack.tagMatches( existing, remainder ) ) { - remainder.increment( existing.getCount() ); - setStack( slot, remainder ); + remainder.grow( existing.getCount() ); + setItem( slot, remainder ); } else { @@ -157,10 +156,10 @@ public class TurtleInventoryCrafting extends CraftingInventory } @Override - public int getMaxCountPerStack() + public int getMaxStackSize() { return turtle.getInventory() - .getMaxCountPerStack(); + .getMaxStackSize(); } @Override @@ -170,11 +169,11 @@ public class TurtleInventoryCrafting extends CraftingInventory } @Override - public boolean isValid( int i, @Nonnull ItemStack stack ) + public boolean canPlaceItem( int i, @Nonnull ItemStack stack ) { i = modifyIndex( i ); return turtle.getInventory() - .isValid( i, stack ); + .canPlaceItem( i, stack ); } @Override @@ -193,69 +192,69 @@ public class TurtleInventoryCrafting extends CraftingInventory // IInventory implementation @Override - public int size() + public int getContainerSize() { return getWidth() * getHeight(); } @Nonnull @Override - public ItemStack getStack( int i ) + public ItemStack getItem( int i ) { i = modifyIndex( i ); return turtle.getInventory() - .getStack( i ); + .getItem( i ); } @Nonnull @Override - public ItemStack removeStack( int i ) + public ItemStack removeItemNoUpdate( int i ) { i = modifyIndex( i ); return turtle.getInventory() - .removeStack( i ); + .removeItemNoUpdate( i ); } @Nonnull @Override - public ItemStack removeStack( int i, int size ) + public ItemStack removeItem( int i, int size ) { i = modifyIndex( i ); return turtle.getInventory() - .removeStack( i, size ); + .removeItem( i, size ); } @Override - public void setStack( int i, @Nonnull ItemStack stack ) + public void setItem( int i, @Nonnull ItemStack stack ) { i = modifyIndex( i ); turtle.getInventory() - .setStack( i, stack ); + .setItem( i, stack ); } @Override - public void markDirty() + public void setChanged() { turtle.getInventory() - .markDirty(); + .setChanged(); } @Override - public boolean canPlayerUse( @Nonnull PlayerEntity player ) + public boolean stillValid( @Nonnull Player player ) { return true; } @Override - public void clear() + public void clearContent() { - for( int i = 0; i < size(); i++ ) + for( int i = 0; i < getContainerSize(); i++ ) { int j = modifyIndex( i ); turtle.getInventory() - .setStack( j, ItemStack.EMPTY ); + .setItem( j, ItemStack.EMPTY ); } } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java index 9ef5b0b6a..4c82d30b4 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleModem.java @@ -14,29 +14,28 @@ import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; public class TurtleModem extends AbstractTurtleUpgrade { private final boolean advanced; @Environment( EnvType.CLIENT ) - private ModelIdentifier leftOffModel; + private ModelResourceLocation leftOffModel; @Environment( EnvType.CLIENT ) - private ModelIdentifier rightOffModel; + private ModelResourceLocation rightOffModel; @Environment( EnvType.CLIENT ) - private ModelIdentifier leftOnModel; + private ModelResourceLocation leftOnModel; @Environment( EnvType.CLIENT ) - private ModelIdentifier rightOnModel; + private ModelResourceLocation rightOnModel; - public TurtleModem( boolean advanced, Identifier id ) + public TurtleModem( boolean advanced, ResourceLocation id ) { super( id, TurtleUpgradeType.PERIPHERAL, @@ -67,7 +66,7 @@ public class TurtleModem extends AbstractTurtleUpgrade boolean active = false; if( turtle != null ) { - NbtCompound turtleNBT = turtle.getUpgradeNBTData( side ); + CompoundTag turtleNBT = turtle.getUpgradeNBTData( side ); active = turtleNBT.contains( "active" ) && turtleNBT.getBoolean( "active" ); } @@ -81,17 +80,17 @@ public class TurtleModem extends AbstractTurtleUpgrade { if( advanced ) { - leftOffModel = new ModelIdentifier( "computercraft:turtle_modem_advanced_off_left", "inventory" ); - rightOffModel = new ModelIdentifier( "computercraft:turtle_modem_advanced_off_right", "inventory" ); - leftOnModel = new ModelIdentifier( "computercraft:turtle_modem_advanced_on_left", "inventory" ); - rightOnModel = new ModelIdentifier( "computercraft:turtle_modem_advanced_on_right", "inventory" ); + leftOffModel = new ModelResourceLocation( "computercraft:turtle_modem_advanced_off_left", "inventory" ); + rightOffModel = new ModelResourceLocation( "computercraft:turtle_modem_advanced_off_right", "inventory" ); + leftOnModel = new ModelResourceLocation( "computercraft:turtle_modem_advanced_on_left", "inventory" ); + rightOnModel = new ModelResourceLocation( "computercraft:turtle_modem_advanced_on_right", "inventory" ); } else { - leftOffModel = new ModelIdentifier( "computercraft:turtle_modem_normal_off_left", "inventory" ); - rightOffModel = new ModelIdentifier( "computercraft:turtle_modem_normal_off_right", "inventory" ); - leftOnModel = new ModelIdentifier( "computercraft:turtle_modem_normal_on_left", "inventory" ); - rightOnModel = new ModelIdentifier( "computercraft:turtle_modem_normal_on_right", "inventory" ); + leftOffModel = new ModelResourceLocation( "computercraft:turtle_modem_normal_off_left", "inventory" ); + rightOffModel = new ModelResourceLocation( "computercraft:turtle_modem_normal_off_right", "inventory" ); + leftOnModel = new ModelResourceLocation( "computercraft:turtle_modem_normal_on_left", "inventory" ); + rightOnModel = new ModelResourceLocation( "computercraft:turtle_modem_normal_on_right", "inventory" ); } } } @@ -100,7 +99,7 @@ public class TurtleModem extends AbstractTurtleUpgrade public void update( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side ) { // Advance the modem - if( !turtle.getWorld().isClient ) + if( !turtle.getWorld().isClientSide ) { IPeripheral peripheral = turtle.getPeripheral( side ); if( peripheral instanceof Peripheral ) @@ -128,17 +127,17 @@ public class TurtleModem extends AbstractTurtleUpgrade @Nonnull @Override - public World getWorld() + public Level getWorld() { return turtle.getWorld(); } @Nonnull @Override - public Vec3d getPosition() + public Vec3 getPosition() { BlockPos turtlePos = turtle.getPosition(); - return new Vec3d( turtlePos.getX(), turtlePos.getY(), turtlePos.getZ() ); + return new Vec3( turtlePos.getX(), turtlePos.getY(), turtlePos.getZ() ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java index f08164bb2..9255cccb2 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java @@ -12,30 +12,29 @@ import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleVerb; import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; public class TurtleShovel extends TurtleTool { - public TurtleShovel( Identifier id, String adjective, Item item ) + public TurtleShovel( ResourceLocation id, String adjective, Item item ) { super( id, adjective, item ); } - public TurtleShovel( Identifier id, Item item ) + public TurtleShovel( ResourceLocation id, Item item ) { super( id, item ); } - public TurtleShovel( Identifier id, ItemStack craftItem, ItemStack toolItem ) + public TurtleShovel( ResourceLocation id, ItemStack craftItem, ItemStack toolItem ) { super( id, craftItem, toolItem ); } @@ -57,7 +56,7 @@ public class TurtleShovel extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected boolean canBreakBlock( BlockState state, Level world, BlockPos pos, TurtlePlayer player ) { if( !super.canBreakBlock( state, world, pos, player ) ) { @@ -65,6 +64,6 @@ public class TurtleShovel extends TurtleTool } Material material = state.getMaterial(); - return material == Material.SOIL || material == Material.AGGREGATE || material == Material.SNOW_LAYER || material == Material.ORGANIC_PRODUCT || material == Material.SNOW_BLOCK || material == Material.PLANT || material == Material.CACTUS || material == Material.GOURD || material == Material.LEAVES || material == Material.REPLACEABLE_PLANT; + return material == Material.DIRT || material == Material.SAND || material == Material.TOP_SNOW || material == Material.CLAY || material == Material.SNOW || material == Material.PLANT || material == Material.CACTUS || material == Material.VEGETABLE || material == Material.LEAVES || material == Material.REPLACEABLE_PLANT; } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java index fe87ef4a3..e074a9237 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java @@ -15,22 +15,21 @@ import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.peripheral.speaker.UpgradeSpeakerPeripheral; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; public class TurtleSpeaker extends AbstractTurtleUpgrade { @Environment( EnvType.CLIENT ) - private ModelIdentifier leftModel; + private ModelResourceLocation leftModel; @Environment( EnvType.CLIENT ) - private ModelIdentifier rightModel; + private ModelResourceLocation rightModel; - public TurtleSpeaker( Identifier id ) + public TurtleSpeaker( ResourceLocation id ) { super( id, TurtleUpgradeType.PERIPHERAL, ComputerCraftRegistry.ModBlocks.SPEAKER ); } @@ -55,8 +54,8 @@ public class TurtleSpeaker extends AbstractTurtleUpgrade { if( leftModel == null ) { - leftModel = new ModelIdentifier( "computercraft:turtle_speaker_upgrade_left", "inventory" ); - rightModel = new ModelIdentifier( "computercraft:turtle_speaker_upgrade_right", "inventory" ); + leftModel = new ModelResourceLocation( "computercraft:turtle_speaker_upgrade_left", "inventory" ); + rightModel = new ModelResourceLocation( "computercraft:turtle_speaker_upgrade_right", "inventory" ); } } @@ -81,16 +80,16 @@ public class TurtleSpeaker extends AbstractTurtleUpgrade } @Override - public World getWorld() + public Level getWorld() { return turtle.getWorld(); } @Override - public Vec3d getPosition() + public Vec3 getPosition() { BlockPos pos = turtle.getPosition(); - return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); + return new Vec3( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); } @Override diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java index 7c41f9b46..e5fc53abc 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java @@ -7,27 +7,27 @@ package dan200.computercraft.shared.turtle.upgrades; import dan200.computercraft.shared.turtle.core.TurtlePlayer; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; public class TurtleSword extends TurtleTool { - public TurtleSword( Identifier id, String adjective, Item item ) + public TurtleSword( ResourceLocation id, String adjective, Item item ) { super( id, adjective, item ); } - public TurtleSword( Identifier id, Item item ) + public TurtleSword( ResourceLocation id, Item item ) { super( id, item ); } - public TurtleSword( Identifier id, ItemStack craftItem, ItemStack toolItem ) + public TurtleSword( ResourceLocation id, ItemStack craftItem, ItemStack toolItem ) { super( id, craftItem, toolItem ); } @@ -39,7 +39,7 @@ public class TurtleSword extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected boolean canBreakBlock( BlockState state, Level world, BlockPos pos, TurtlePlayer player ) { if( !super.canBreakBlock( state, world, pos, player ) ) { @@ -47,6 +47,6 @@ public class TurtleSword extends TurtleTool } Material material = state.getMaterial(); - return material == Material.PLANT || material == Material.LEAVES || material == Material.REPLACEABLE_PLANT || material == Material.WOOL || material == Material.COBWEB; + return material == Material.PLANT || material == Material.LEAVES || material == Material.REPLACEABLE_PLANT || material == Material.WOOL || material == Material.WEB; } } diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java index c5bbd31f4..d37811c43 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java @@ -6,6 +6,8 @@ package dan200.computercraft.shared.turtle.upgrades; +import com.mojang.math.Matrix4f; +import com.mojang.math.Transformation; import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.turtle.*; @@ -24,22 +26,25 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.event.player.AttackEntityCallback; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.*; -import net.minecraft.world.World; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; @@ -53,19 +58,19 @@ public class TurtleTool extends AbstractTurtleUpgrade private static final int TAG_LIST = 9; private static final int TAG_COMPOUND = 10; - public TurtleTool( Identifier id, String adjective, Item item ) + public TurtleTool( ResourceLocation id, String adjective, Item item ) { super( id, TurtleUpgradeType.TOOL, adjective, item ); this.item = new ItemStack( item ); } - public TurtleTool( Identifier id, Item item ) + public TurtleTool( ResourceLocation id, Item item ) { super( id, TurtleUpgradeType.TOOL, item ); this.item = new ItemStack( item ); } - public TurtleTool( Identifier id, ItemStack craftItem, ItemStack toolItem ) + public TurtleTool( ResourceLocation id, ItemStack craftItem, ItemStack toolItem ) { super( id, TurtleUpgradeType.TOOL, craftItem ); item = toolItem; @@ -74,12 +79,12 @@ public class TurtleTool extends AbstractTurtleUpgrade @Override public boolean isItemSuitable( @Nonnull ItemStack stack ) { - NbtCompound tag = stack.getNbt(); + CompoundTag tag = stack.getTag(); if( tag == null || tag.isEmpty() ) return true; // Check we've not got anything vaguely interesting on the item. We allow other mods to add their // own NBT, with the understanding such details will be lost to the mist of time. - if( stack.isDamaged() || stack.hasEnchantments() || stack.hasCustomName() ) return false; + if( stack.isDamaged() || stack.isEnchanted() || stack.hasCustomHoverName() ) return false; return !tag.contains( "AttributeModifiers", TAG_LIST ) || tag.getList( "AttributeModifiers", TAG_COMPOUND ).isEmpty(); } @@ -110,7 +115,7 @@ public class TurtleTool extends AbstractTurtleUpgrade private TurtleCommandResult attack( ITurtleAccess turtle, Direction direction, TurtleSide side ) { // Create a fake player, and orient it appropriately - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos position = turtle.getPosition(); BlockEntity turtleBlock = turtle instanceof TurtleBrain ? ((TurtleBrain) turtle).getOwner() : world.getBlockEntity( position ); if( turtleBlock == null ) return TurtleCommandResult.failure( "Turtle has vanished from existence." ); @@ -118,9 +123,9 @@ public class TurtleTool extends AbstractTurtleUpgrade final TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer( turtle, position, direction ); // See if there is an entity present - Vec3d turtlePos = turtlePlayer.getPos(); - Vec3d rayDir = turtlePlayer.getRotationVec( 1.0f ); - Pair hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 ); + Vec3 turtlePos = turtlePlayer.position(); + Vec3 rayDir = turtlePlayer.getViewVector( 1.0f ); + Pair hit = WorldUtil.rayTraceEntities( world, turtlePos, rayDir, 1.5 ); if( hit != null ) { // Load up the turtle's inventoryf @@ -133,9 +138,9 @@ public class TurtleTool extends AbstractTurtleUpgrade if( AttackEntityCallback.EVENT.invoker() .interact( turtlePlayer, world, - Hand.MAIN_HAND, + InteractionHand.MAIN_HAND, hitEntity, - null ) == ActionResult.FAIL || !hitEntity.isAttackable() ) + null ) == InteractionResult.FAIL || !hitEntity.isAttackable() ) { return TurtleCommandResult.failure( "Nothing to attack here" ); } @@ -151,26 +156,26 @@ public class TurtleTool extends AbstractTurtleUpgrade // Attack the entity boolean attacked = false; - if( !hitEntity.handleAttack( turtlePlayer ) ) + if( !hitEntity.skipAttackInteraction( turtlePlayer ) ) { - float damage = (float) turtlePlayer.getAttributeValue( EntityAttributes.GENERIC_ATTACK_DAMAGE ); + float damage = (float) turtlePlayer.getAttributeValue( Attributes.ATTACK_DAMAGE ); damage *= getDamageMultiplier(); if( damage > 0.0f ) { - DamageSource source = DamageSource.player( turtlePlayer ); - if( hitEntity instanceof ArmorStandEntity ) + DamageSource source = DamageSource.playerAttack( turtlePlayer ); + if( hitEntity instanceof ArmorStand ) { // Special case for armor stands: attack twice to guarantee destroy - hitEntity.damage( source, damage ); + hitEntity.hurt( source, damage ); if( hitEntity.isAlive() ) { - hitEntity.damage( source, damage ); + hitEntity.hurt( source, damage ); } attacked = true; } else { - if( hitEntity.damage( source, damage ) ) + if( hitEntity.hurt( source, damage ) ) { attacked = true; } @@ -195,15 +200,15 @@ public class TurtleTool extends AbstractTurtleUpgrade private TurtleCommandResult dig( ITurtleAccess turtle, Direction direction, TurtleSide side ) { // Get ready to dig - World world = turtle.getWorld(); + Level world = turtle.getWorld(); BlockPos turtlePosition = turtle.getPosition(); BlockEntity turtleBlock = turtle instanceof TurtleBrain ? ((TurtleBrain) turtle).getOwner() : world.getBlockEntity( turtlePosition ); if( turtleBlock == null ) return TurtleCommandResult.failure( "Turtle has vanished from existence." ); - BlockPos blockPosition = turtlePosition.offset( direction ); + BlockPos blockPosition = turtlePosition.relative( direction ); - if( world.isAir( blockPosition ) || WorldUtil.isLiquidBlock( world, blockPosition ) ) + if( world.isEmptyBlock( blockPosition ) || WorldUtil.isLiquidBlock( world, blockPosition ) ) { return TurtleCommandResult.failure( "Nothing to dig here" ); } @@ -248,19 +253,19 @@ public class TurtleTool extends AbstractTurtleUpgrade // to consult there before making any changes. // Play the destruction sound and particles - world.syncWorldEvent( 2001, blockPosition, Block.getRawIdFromState( state ) ); + world.levelEvent( 2001, blockPosition, Block.getId( state ) ); // Destroy the block state.getBlock() - .onBreak( world, blockPosition, state, turtlePlayer ); + .playerWillDestroy( world, blockPosition, state, turtlePlayer ); if( world.removeBlock( blockPosition, false ) ) { state.getBlock() - .onBroken( world, blockPosition, state ); - if( turtlePlayer.canHarvest( state ) ) + .destroy( world, blockPosition, state ); + if( turtlePlayer.hasCorrectToolForDrops( state ) ) { state.getBlock() - .afterBreak( world, turtlePlayer, blockPosition, state, tile, turtlePlayer.getMainHandStack() ); + .playerDestroy( world, turtlePlayer, blockPosition, state, tile, turtlePlayer.getMainHandItem() ); } } @@ -293,18 +298,18 @@ public class TurtleTool extends AbstractTurtleUpgrade } } - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected boolean canBreakBlock( BlockState state, Level world, BlockPos pos, TurtlePlayer player ) { Block block = state.getBlock(); - return !state.isAir() && block != Blocks.BEDROCK && state.calcBlockBreakingDelta( player, world, pos ) > 0; + return !state.isAir() && block != Blocks.BEDROCK && state.getDestroyProgress( player, world, pos ) > 0; } private static class Transforms { - static final AffineTransformation leftTransform = getMatrixFor( -0.40625f ); - static final AffineTransformation rightTransform = getMatrixFor( 0.40625f ); + static final Transformation leftTransform = getMatrixFor( -0.40625f ); + static final Transformation rightTransform = getMatrixFor( 0.40625f ); - private static AffineTransformation getMatrixFor( float offset ) + private static Transformation getMatrixFor( float offset ) { Matrix4f matrix = new Matrix4f(); ((IMatrix4f) (Object) matrix).setFloatArray( new float[] { @@ -313,7 +318,7 @@ public class TurtleTool extends AbstractTurtleUpgrade 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, } ); - return new AffineTransformation( matrix ); + return new Transformation( matrix ); } } } diff --git a/src/main/java/dan200/computercraft/shared/util/ColourTracker.java b/src/main/java/dan200/computercraft/shared/util/ColourTracker.java index da0e00bb1..c0d1532a0 100644 --- a/src/main/java/dan200/computercraft/shared/util/ColourTracker.java +++ b/src/main/java/dan200/computercraft/shared/util/ColourTracker.java @@ -6,7 +6,7 @@ package dan200.computercraft.shared.util; -import net.minecraft.util.DyeColor; +import net.minecraft.world.item.DyeColor; /** * A reimplementation of the colour system in {@link ArmorDyeRecipe}, but bundled together as an object. diff --git a/src/main/java/dan200/computercraft/shared/util/ColourUtils.java b/src/main/java/dan200/computercraft/shared/util/ColourUtils.java index 92a1a13fc..26f518c22 100644 --- a/src/main/java/dan200/computercraft/shared/util/ColourUtils.java +++ b/src/main/java/dan200/computercraft/shared/util/ColourUtils.java @@ -6,12 +6,11 @@ package dan200.computercraft.shared.util; -import net.minecraft.item.DyeItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DyeColor; - import javax.annotation.Nullable; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.DyeItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; public final class ColourUtils { @@ -21,6 +20,6 @@ public final class ColourUtils public static DyeColor getStackColour( ItemStack stack ) { Item item = stack.getItem(); - return item instanceof DyeItem ? ((DyeItem) item).getColor() : null; + return item instanceof DyeItem ? ((DyeItem) item).getDyeColor() : null; } } diff --git a/src/main/java/dan200/computercraft/shared/util/Config.java b/src/main/java/dan200/computercraft/shared/util/Config.java index 241f0282d..cb62f47f0 100644 --- a/src/main/java/dan200/computercraft/shared/util/Config.java +++ b/src/main/java/dan200/computercraft/shared/util/Config.java @@ -19,10 +19,9 @@ import dan200.computercraft.core.apis.http.options.AddressRuleConfig; import dan200.computercraft.fabric.mixin.WorldSavePathAccess; import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer; import net.fabricmc.loader.FabricLoader; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.WorldSavePath; - +import net.minecraft.world.level.storage.LevelResource; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; @@ -41,7 +40,7 @@ public final class Config public static CommentedFileConfig serverConfig; public static CommentedFileConfig clientConfig; - private static final WorldSavePath serverDir = WorldSavePathAccess.createWorldSavePath( "serverconfig" ); + private static final LevelResource serverDir = WorldSavePathAccess.createWorldSavePath( "serverconfig" ); private static final String serverFileName = "computercraft-server.toml"; private static Path serverPath = null; @@ -283,7 +282,7 @@ public final class Config public static void serverStarting( MinecraftServer server ) { - serverPath = server.getSavePath( serverDir ).resolve( serverFileName ); + serverPath = server.getWorldPath( serverDir ).resolve( serverFileName ); try( CommentedFileConfig config = buildFileConfig( serverPath ) ) { @@ -301,7 +300,7 @@ public final class Config serverPath = null; } - public static void clientStarted( MinecraftClient client ) + public static void clientStarted( Minecraft client ) { try( CommentedFileConfig config = buildFileConfig( clientPath ) ) { diff --git a/src/main/java/dan200/computercraft/shared/util/DefaultInventory.java b/src/main/java/dan200/computercraft/shared/util/DefaultInventory.java index 857fafd34..4a6699444 100644 --- a/src/main/java/dan200/computercraft/shared/util/DefaultInventory.java +++ b/src/main/java/dan200/computercraft/shared/util/DefaultInventory.java @@ -6,32 +6,31 @@ package dan200.computercraft.shared.util; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; -public interface DefaultInventory extends Inventory +public interface DefaultInventory extends Container { @Override - default int getMaxCountPerStack() + default int getMaxStackSize() { return 64; } @Override - default void onOpen( @Nonnull PlayerEntity player ) + default void startOpen( @Nonnull Player player ) { } @Override - default void onClose( @Nonnull PlayerEntity player ) + default void stopOpen( @Nonnull Player player ) { } @Override - default boolean isValid( int slot, @Nonnull ItemStack stack ) + default boolean canPlaceItem( int slot, @Nonnull ItemStack stack ) { return true; } diff --git a/src/main/java/dan200/computercraft/shared/util/DefaultSidedInventory.java b/src/main/java/dan200/computercraft/shared/util/DefaultSidedInventory.java index 706a0047b..80c1f34c9 100644 --- a/src/main/java/dan200/computercraft/shared/util/DefaultSidedInventory.java +++ b/src/main/java/dan200/computercraft/shared/util/DefaultSidedInventory.java @@ -6,23 +6,22 @@ package dan200.computercraft.shared.util; -import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Direction; - import javax.annotation.Nonnull; import javax.annotation.Nullable; +import net.minecraft.core.Direction; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.item.ItemStack; -public interface DefaultSidedInventory extends DefaultInventory, SidedInventory +public interface DefaultSidedInventory extends DefaultInventory, WorldlyContainer { @Override - default boolean canInsert( int slot, @Nonnull ItemStack stack, @Nullable Direction side ) + default boolean canPlaceItemThroughFace( int slot, @Nonnull ItemStack stack, @Nullable Direction side ) { - return isValid( slot, stack ); + return canPlaceItem( slot, stack ); } @Override - default boolean canExtract( int slot, @Nonnull ItemStack stack, @Nonnull Direction side ) + default boolean canTakeItemThroughFace( int slot, @Nonnull ItemStack stack, @Nonnull Direction side ) { return true; } diff --git a/src/main/java/dan200/computercraft/shared/util/DirectionUtil.java b/src/main/java/dan200/computercraft/shared/util/DirectionUtil.java index 9f6cb01a9..5744d00e4 100644 --- a/src/main/java/dan200/computercraft/shared/util/DirectionUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/DirectionUtil.java @@ -7,7 +7,7 @@ package dan200.computercraft.shared.util; import dan200.computercraft.core.computer.ComputerSide; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; public final class DirectionUtil { @@ -30,11 +30,11 @@ public final class DirectionUtil { return ComputerSide.BACK; } - if( dir == front.rotateYCounterclockwise() ) + if( dir == front.getCounterClockWise() ) { return ComputerSide.LEFT; } - if( dir == front.rotateYClockwise() ) + if( dir == front.getClockWise() ) { return ComputerSide.RIGHT; } diff --git a/src/main/java/dan200/computercraft/shared/util/DropConsumer.java b/src/main/java/dan200/computercraft/shared/util/DropConsumer.java index 43bb89d84..a33bc2928 100644 --- a/src/main/java/dan200/computercraft/shared/util/DropConsumer.java +++ b/src/main/java/dan200/computercraft/shared/util/DropConsumer.java @@ -6,25 +6,24 @@ package dan200.computercraft.shared.util; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.World; - import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.function.Function; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; public final class DropConsumer { private static Function dropConsumer; private static List remainingDrops; - private static WeakReference dropWorld; + private static WeakReference dropWorld; private static BlockPos dropPos; - private static Box dropBounds; + private static AABB dropBounds; private static WeakReference dropEntity; private DropConsumer() @@ -36,18 +35,18 @@ public final class DropConsumer dropConsumer = consumer; remainingDrops = new ArrayList<>(); dropEntity = new WeakReference<>( entity ); - dropWorld = new WeakReference<>( entity.world ); + dropWorld = new WeakReference<>( entity.level ); dropPos = null; - dropBounds = new Box( entity.getBlockPos() ).expand( 2, 2, 2 ); + dropBounds = new AABB( entity.blockPosition() ).inflate( 2, 2, 2 ); } - public static void set( World world, BlockPos pos, Function consumer ) + public static void set( Level world, BlockPos pos, Function consumer ) { dropConsumer = consumer; remainingDrops = new ArrayList<>( 2 ); dropEntity = null; dropWorld = new WeakReference<>( world ); - dropBounds = new Box( pos ).expand( 2, 2, 2 ); + dropBounds = new AABB( pos ).inflate( 2, 2, 2 ); } public static List clear() @@ -63,7 +62,7 @@ public final class DropConsumer return remainingStacks; } - public static boolean onHarvestDrops( World world, BlockPos pos, ItemStack stack ) + public static boolean onHarvestDrops( Level world, BlockPos pos, ItemStack stack ) { if( dropWorld != null && dropWorld.get() == world && dropPos != null && dropPos.equals( pos ) ) { @@ -85,9 +84,9 @@ public final class DropConsumer public static boolean onEntitySpawn( Entity entity ) { // Capture any nearby item spawns - if( dropWorld != null && dropWorld.get() == entity.getEntityWorld() && entity instanceof ItemEntity && dropBounds.contains( entity.getPos() ) ) + if( dropWorld != null && dropWorld.get() == entity.getCommandSenderWorld() && entity instanceof ItemEntity && dropBounds.contains( entity.position() ) ) { - handleDrops( ((ItemEntity) entity).getStack() ); + handleDrops( ((ItemEntity) entity).getItem() ); return true; } return false; diff --git a/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java b/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java index c955ae361..440665855 100644 --- a/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java +++ b/src/main/java/dan200/computercraft/shared/util/FakeNetHandler.java @@ -10,24 +10,67 @@ import dan200.computercraft.api.turtle.FakePlayer; import io.netty.channel.ChannelHandlerContext; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.NetworkSide; -import net.minecraft.network.NetworkState; -import net.minecraft.network.Packet; -import net.minecraft.network.listener.PacketListener; +import net.minecraft.network.Connection; +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.PacketListener; +import net.minecraft.network.chat.Component; import net.minecraft.network.packet.c2s.play.*; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.text.Text; - +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket; +import net.minecraft.network.protocol.game.ServerboundBlockEntityTagQuery; +import net.minecraft.network.protocol.game.ServerboundChangeDifficultyPacket; +import net.minecraft.network.protocol.game.ServerboundChatPacket; +import net.minecraft.network.protocol.game.ServerboundClientCommandPacket; +import net.minecraft.network.protocol.game.ServerboundClientInformationPacket; +import net.minecraft.network.protocol.game.ServerboundCommandSuggestionPacket; +import net.minecraft.network.protocol.game.ServerboundContainerButtonClickPacket; +import net.minecraft.network.protocol.game.ServerboundContainerClickPacket; +import net.minecraft.network.protocol.game.ServerboundContainerClosePacket; +import net.minecraft.network.protocol.game.ServerboundCustomPayloadPacket; +import net.minecraft.network.protocol.game.ServerboundEditBookPacket; +import net.minecraft.network.protocol.game.ServerboundEntityTagQuery; +import net.minecraft.network.protocol.game.ServerboundInteractPacket; +import net.minecraft.network.protocol.game.ServerboundJigsawGeneratePacket; +import net.minecraft.network.protocol.game.ServerboundKeepAlivePacket; +import net.minecraft.network.protocol.game.ServerboundLockDifficultyPacket; +import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; +import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket; +import net.minecraft.network.protocol.game.ServerboundPaddleBoatPacket; +import net.minecraft.network.protocol.game.ServerboundPickItemPacket; +import net.minecraft.network.protocol.game.ServerboundPlaceRecipePacket; +import net.minecraft.network.protocol.game.ServerboundPlayerAbilitiesPacket; +import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; +import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; +import net.minecraft.network.protocol.game.ServerboundPlayerInputPacket; +import net.minecraft.network.protocol.game.ServerboundRecipeBookChangeSettingsPacket; +import net.minecraft.network.protocol.game.ServerboundRecipeBookSeenRecipePacket; +import net.minecraft.network.protocol.game.ServerboundRenameItemPacket; +import net.minecraft.network.protocol.game.ServerboundResourcePackPacket; +import net.minecraft.network.protocol.game.ServerboundSeenAdvancementsPacket; +import net.minecraft.network.protocol.game.ServerboundSelectTradePacket; +import net.minecraft.network.protocol.game.ServerboundSetBeaconPacket; +import net.minecraft.network.protocol.game.ServerboundSetCarriedItemPacket; +import net.minecraft.network.protocol.game.ServerboundSetCommandBlockPacket; +import net.minecraft.network.protocol.game.ServerboundSetCommandMinecartPacket; +import net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket; +import net.minecraft.network.protocol.game.ServerboundSetJigsawBlockPacket; +import net.minecraft.network.protocol.game.ServerboundSetStructureBlockPacket; +import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket; +import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundTeleportToEntityPacket; +import net.minecraft.network.protocol.game.ServerboundUseItemOnPacket; +import net.minecraft.network.protocol.game.ServerboundUseItemPacket; +import net.minecraft.server.network.ServerGamePacketListenerImpl; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.crypto.Cipher; -public class FakeNetHandler extends ServerPlayNetworkHandler +public class FakeNetHandler extends ServerGamePacketListenerImpl { public FakeNetHandler( @Nonnull FakePlayer player ) { - super( player.getServerWorld() + super( player.getLevel() .getServer(), new FakeNetworkManager(), player ); } @@ -37,208 +80,208 @@ public class FakeNetHandler extends ServerPlayNetworkHandler } @Override - public void disconnect( @Nonnull Text reason ) + public void disconnect( @Nonnull Component reason ) { } @Override - public void onPlayerInput( @Nonnull PlayerInputC2SPacket packet ) + public void handlePlayerInput( @Nonnull ServerboundPlayerInputPacket packet ) { } @Override - public void onVehicleMove( @Nonnull VehicleMoveC2SPacket packet ) + public void handleMoveVehicle( @Nonnull ServerboundMoveVehiclePacket packet ) { } @Override - public void onTeleportConfirm( @Nonnull TeleportConfirmC2SPacket packet ) + public void handleAcceptTeleportPacket( @Nonnull ServerboundAcceptTeleportationPacket packet ) { } @Override - public void onAdvancementTab( @Nonnull AdvancementTabC2SPacket packet ) + public void handleSeenAdvancements( @Nonnull ServerboundSeenAdvancementsPacket packet ) { } @Override - public void onRequestCommandCompletions( @Nonnull RequestCommandCompletionsC2SPacket packet ) + public void handleCustomCommandSuggestions( @Nonnull ServerboundCommandSuggestionPacket packet ) { } @Override - public void onUpdateCommandBlock( @Nonnull UpdateCommandBlockC2SPacket packet ) + public void handleSetCommandBlock( @Nonnull ServerboundSetCommandBlockPacket packet ) { } @Override - public void onUpdateCommandBlockMinecart( @Nonnull UpdateCommandBlockMinecartC2SPacket packet ) + public void handleSetCommandMinecart( @Nonnull ServerboundSetCommandMinecartPacket packet ) { } @Override - public void onPickFromInventory( @Nonnull PickFromInventoryC2SPacket packet ) + public void handlePickItem( @Nonnull ServerboundPickItemPacket packet ) { } @Override - public void onRenameItem( @Nonnull RenameItemC2SPacket packet ) + public void handleRenameItem( @Nonnull ServerboundRenameItemPacket packet ) { } @Override - public void onUpdateBeacon( @Nonnull UpdateBeaconC2SPacket packet ) + public void handleSetBeaconPacket( @Nonnull ServerboundSetBeaconPacket packet ) { } @Override - public void onStructureBlockUpdate( @Nonnull UpdateStructureBlockC2SPacket packet ) + public void handleSetStructureBlock( @Nonnull ServerboundSetStructureBlockPacket packet ) { } @Override - public void onJigsawUpdate( @Nonnull UpdateJigsawC2SPacket packet ) + public void handleSetJigsawBlock( @Nonnull ServerboundSetJigsawBlockPacket packet ) { } @Override - public void onJigsawGenerating( JigsawGeneratingC2SPacket packet ) + public void handleJigsawGenerate( ServerboundJigsawGeneratePacket packet ) { } @Override - public void onMerchantTradeSelect( SelectMerchantTradeC2SPacket packet ) + public void handleSelectTrade( ServerboundSelectTradePacket packet ) { } @Override - public void onBookUpdate( @Nonnull BookUpdateC2SPacket packet ) + public void handleEditBook( @Nonnull ServerboundEditBookPacket packet ) { } @Override - public void onRecipeBookData( RecipeBookDataC2SPacket packet ) + public void handleRecipeBookSeenRecipePacket( ServerboundRecipeBookSeenRecipePacket packet ) { } @Override - public void onRecipeCategoryOptions( RecipeCategoryOptionsC2SPacket packet ) + public void handleRecipeBookChangeSettingsPacket( ServerboundRecipeBookChangeSettingsPacket packet ) { - super.onRecipeCategoryOptions( packet ); + super.handleRecipeBookChangeSettingsPacket( packet ); } @Override - public void onQueryEntityNbt( @Nonnull QueryEntityNbtC2SPacket packet ) + public void handleEntityTagQuery( @Nonnull ServerboundEntityTagQuery packet ) { } @Override - public void onQueryBlockNbt( @Nonnull QueryBlockNbtC2SPacket packet ) + public void handleBlockEntityTagQuery( @Nonnull ServerboundBlockEntityTagQuery packet ) { } @Override - public void onPlayerMove( @Nonnull PlayerMoveC2SPacket packet ) + public void handleMovePlayer( @Nonnull ServerboundMovePlayerPacket packet ) { } @Override - public void onPlayerAction( @Nonnull PlayerActionC2SPacket packet ) + public void handlePlayerAction( @Nonnull ServerboundPlayerActionPacket packet ) { } @Override - public void onPlayerInteractBlock( @Nonnull PlayerInteractBlockC2SPacket packet ) + public void handleUseItemOn( @Nonnull ServerboundUseItemOnPacket packet ) { } @Override - public void onPlayerInteractItem( @Nonnull PlayerInteractItemC2SPacket packet ) + public void handleUseItem( @Nonnull ServerboundUseItemPacket packet ) { } @Override - public void onSpectatorTeleport( @Nonnull SpectatorTeleportC2SPacket packet ) + public void handleTeleportToEntityPacket( @Nonnull ServerboundTeleportToEntityPacket packet ) { } @Override - public void onResourcePackStatus( @Nonnull ResourcePackStatusC2SPacket packet ) + public void handleResourcePackResponse( @Nonnull ServerboundResourcePackPacket packet ) { } @Override - public void onBoatPaddleState( @Nonnull BoatPaddleStateC2SPacket packet ) + public void handlePaddleBoat( @Nonnull ServerboundPaddleBoatPacket packet ) { } @Override - public void onDisconnected( @Nonnull Text reason ) + public void onDisconnect( @Nonnull Component reason ) { } @Override - public void sendPacket( @Nonnull Packet packet ) + public void send( @Nonnull Packet packet ) { } @Override - public void sendPacket( @Nonnull Packet packet, @Nullable GenericFutureListener> whenSent ) + public void send( @Nonnull Packet packet, @Nullable GenericFutureListener> whenSent ) { } @Override - public void onUpdateSelectedSlot( @Nonnull UpdateSelectedSlotC2SPacket packet ) + public void handleSetCarriedItem( @Nonnull ServerboundSetCarriedItemPacket packet ) { } @Override - public void onGameMessage( @Nonnull ChatMessageC2SPacket packet ) + public void handleChat( @Nonnull ServerboundChatPacket packet ) { } @Override - public void onHandSwing( @Nonnull HandSwingC2SPacket packet ) + public void handleAnimate( @Nonnull ServerboundSwingPacket packet ) { } @Override - public void onClientCommand( @Nonnull ClientCommandC2SPacket packet ) + public void handlePlayerCommand( @Nonnull ServerboundPlayerCommandPacket packet ) { } @Override - public void onPlayerInteractEntity( @Nonnull PlayerInteractEntityC2SPacket packet ) + public void handleInteract( @Nonnull ServerboundInteractPacket packet ) { } @Override - public void onClientStatus( @Nonnull ClientStatusC2SPacket packet ) + public void handleClientCommand( @Nonnull ServerboundClientCommandPacket packet ) { } @Override - public void onCloseHandledScreen( CloseHandledScreenC2SPacket packet ) + public void handleContainerClose( ServerboundContainerClosePacket packet ) { } @Override - public void onClickSlot( ClickSlotC2SPacket packet ) + public void handleContainerClick( ServerboundContainerClickPacket packet ) { } @Override - public void onCraftRequest( @Nonnull CraftRequestC2SPacket packet ) + public void handlePlaceRecipe( @Nonnull ServerboundPlaceRecipePacket packet ) { } @Override - public void onButtonClick( @Nonnull ButtonClickC2SPacket packet ) + public void handleContainerButtonClick( @Nonnull ServerboundContainerButtonClickPacket packet ) { } @Override - public void onCreativeInventoryAction( @Nonnull CreativeInventoryActionC2SPacket packet ) + public void handleSetCreativeModeSlot( @Nonnull ServerboundSetCreativeModeSlotPacket packet ) { } @@ -248,48 +291,48 @@ public class FakeNetHandler extends ServerPlayNetworkHandler // } @Override - public void onSignUpdate( @Nonnull UpdateSignC2SPacket packet ) + public void handleSignUpdate( @Nonnull ServerboundSignUpdatePacket packet ) { } @Override - public void onKeepAlive( @Nonnull KeepAliveC2SPacket packet ) + public void handleKeepAlive( @Nonnull ServerboundKeepAlivePacket packet ) { } @Override - public void onPlayerAbilities( @Nonnull UpdatePlayerAbilitiesC2SPacket packet ) + public void handlePlayerAbilities( @Nonnull ServerboundPlayerAbilitiesPacket packet ) { } @Override - public void onClientSettings( @Nonnull ClientSettingsC2SPacket packet ) + public void handleClientInformation( @Nonnull ServerboundClientInformationPacket packet ) { } @Override - public void onCustomPayload( @Nonnull CustomPayloadC2SPacket packet ) + public void handleCustomPayload( @Nonnull ServerboundCustomPayloadPacket packet ) { } @Override - public void onUpdateDifficulty( @Nonnull UpdateDifficultyC2SPacket packet ) + public void handleChangeDifficulty( @Nonnull ServerboundChangeDifficultyPacket packet ) { } @Override - public void onUpdateDifficultyLock( @Nonnull UpdateDifficultyLockC2SPacket packet ) + public void handleLockDifficulty( @Nonnull ServerboundLockDifficultyPacket packet ) { } - private static class FakeNetworkManager extends ClientConnection + private static class FakeNetworkManager extends Connection { private PacketListener handler; - private Text closeReason; + private Component closeReason; FakeNetworkManager() { - super( NetworkSide.CLIENTBOUND ); + super( PacketFlow.CLIENTBOUND ); } @Override @@ -298,7 +341,7 @@ public class FakeNetHandler extends ServerPlayNetworkHandler } @Override - public void setState( @Nonnull NetworkState state ) + public void setProtocol( @Nonnull ConnectionProtocol state ) { } @@ -318,7 +361,7 @@ public class FakeNetHandler extends ServerPlayNetworkHandler } @Override - public void setPacketListener( @Nonnull PacketListener handler ) + public void setListener( @Nonnull PacketListener handler ) { this.handler = handler; } @@ -339,13 +382,13 @@ public class FakeNetHandler extends ServerPlayNetworkHandler } @Override - public void disconnect( @Nonnull Text message ) + public void disconnect( @Nonnull Component message ) { closeReason = message; } @Override - public void setupEncryption( Cipher cipher, Cipher cipher2 ) + public void setEncryptionKey( Cipher cipher, Cipher cipher2 ) { } @@ -358,13 +401,13 @@ public class FakeNetHandler extends ServerPlayNetworkHandler @Nullable @Override - public Text getDisconnectReason() + public Component getDisconnectedReason() { return closeReason; } @Override - public void disableAutoRead() + public void setReadOnly() { } } diff --git a/src/main/java/dan200/computercraft/shared/util/IDAssigner.java b/src/main/java/dan200/computercraft/shared/util/IDAssigner.java index 6a10e44fa..0c4b14ec9 100644 --- a/src/main/java/dan200/computercraft/shared/util/IDAssigner.java +++ b/src/main/java/dan200/computercraft/shared/util/IDAssigner.java @@ -13,8 +13,7 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.fabric.mixin.WorldSavePathAccess; import me.shedaniel.cloth.api.utils.v1.GameInstanceUtils; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.WorldSavePath; - +import net.minecraft.world.level.storage.LevelResource; import java.io.File; import java.io.Reader; import java.io.Writer; @@ -28,7 +27,7 @@ import java.util.Map; public final class IDAssigner { - private static final WorldSavePath FOLDER = WorldSavePathAccess.createWorldSavePath( ComputerCraft.MOD_ID ); + private static final LevelResource FOLDER = WorldSavePathAccess.createWorldSavePath( ComputerCraft.MOD_ID ); private static final Gson GSON = new GsonBuilder().setPrettyPrinting() .create(); private static final Type ID_TOKEN = new TypeToken>() @@ -116,7 +115,7 @@ public final class IDAssigner public static File getDir() { return GameInstanceUtils.getServer() - .getSavePath( FOLDER ) + .getWorldPath( FOLDER ) .toFile(); } } diff --git a/src/main/java/dan200/computercraft/shared/util/ImpostorRecipe.java b/src/main/java/dan200/computercraft/shared/util/ImpostorRecipe.java index a9e8a3f2f..eed47d8d8 100644 --- a/src/main/java/dan200/computercraft/shared/util/ImpostorRecipe.java +++ b/src/main/java/dan200/computercraft/shared/util/ImpostorRecipe.java @@ -7,65 +7,64 @@ package dan200.computercraft.shared.util; import com.google.gson.JsonObject; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.ShapedRecipe; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.level.Level; public final class ImpostorRecipe extends ShapedRecipe { public static final RecipeSerializer SERIALIZER = new RecipeSerializer() { @Override - public ImpostorRecipe read( @Nonnull Identifier identifier, @Nonnull JsonObject json ) + public ImpostorRecipe fromJson( @Nonnull ResourceLocation identifier, @Nonnull JsonObject json ) { - String group = JsonHelper.getString( json, "group", "" ); - ShapedRecipe recipe = RecipeSerializer.SHAPED.read( identifier, json ); - JsonObject resultObject = JsonHelper.getObject( json, "result" ); - ItemStack itemStack = ShapedRecipe.outputFromJson( resultObject ); + String group = GsonHelper.getAsString( json, "group", "" ); + ShapedRecipe recipe = RecipeSerializer.SHAPED_RECIPE.fromJson( identifier, json ); + JsonObject resultObject = GsonHelper.getAsJsonObject( json, "result" ); + ItemStack itemStack = ShapedRecipe.itemStackFromJson( resultObject ); RecipeUtil.setNbt( itemStack, resultObject ); return new ImpostorRecipe( identifier, group, recipe.getWidth(), recipe.getHeight(), recipe.getIngredients(), itemStack ); } @Override - public ImpostorRecipe read( @Nonnull Identifier identifier, @Nonnull PacketByteBuf buf ) + public ImpostorRecipe fromNetwork( @Nonnull ResourceLocation identifier, @Nonnull FriendlyByteBuf buf ) { int width = buf.readVarInt(); int height = buf.readVarInt(); - String group = buf.readString( Short.MAX_VALUE ); - DefaultedList items = DefaultedList.ofSize( width * height, Ingredient.EMPTY ); + String group = buf.readUtf( Short.MAX_VALUE ); + NonNullList items = NonNullList.withSize( width * height, Ingredient.EMPTY ); for( int k = 0; k < items.size(); ++k ) { - items.set( k, Ingredient.fromPacket( buf ) ); + items.set( k, Ingredient.fromNetwork( buf ) ); } - ItemStack result = buf.readItemStack(); + ItemStack result = buf.readItem(); return new ImpostorRecipe( identifier, group, width, height, items, result ); } @Override - public void write( @Nonnull PacketByteBuf buf, @Nonnull ImpostorRecipe recipe ) + public void write( @Nonnull FriendlyByteBuf buf, @Nonnull ImpostorRecipe recipe ) { buf.writeVarInt( recipe.getWidth() ); buf.writeVarInt( recipe.getHeight() ); - buf.writeString( recipe.getGroup() ); + buf.writeUtf( recipe.getGroup() ); for( Ingredient ingredient : recipe.getIngredients() ) { - ingredient.write( buf ); + ingredient.toNetwork( buf ); } - buf.writeItemStack( recipe.getOutput() ); + buf.writeItem( recipe.getResultItem() ); } }; private final String group; - private ImpostorRecipe( @Nonnull Identifier id, @Nonnull String group, int width, int height, DefaultedList ingredients, + private ImpostorRecipe( @Nonnull ResourceLocation id, @Nonnull String group, int width, int height, NonNullList ingredients, @Nonnull ItemStack result ) { super( id, group, width, height, ingredients, result ); @@ -87,14 +86,14 @@ public final class ImpostorRecipe extends ShapedRecipe } @Override - public boolean matches( @Nonnull CraftingInventory inv, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inv, @Nonnull Level world ) { return false; } @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inventory ) + public ItemStack assemble( @Nonnull CraftingContainer inventory ) { return ItemStack.EMPTY; } diff --git a/src/main/java/dan200/computercraft/shared/util/ImpostorShapelessRecipe.java b/src/main/java/dan200/computercraft/shared/util/ImpostorShapelessRecipe.java index c2191843a..c5c44a1a0 100644 --- a/src/main/java/dan200/computercraft/shared/util/ImpostorShapelessRecipe.java +++ b/src/main/java/dan200/computercraft/shared/util/ImpostorShapelessRecipe.java @@ -9,29 +9,28 @@ package dan200.computercraft.shared.util; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.RecipeSerializer; -import net.minecraft.recipe.ShapedRecipe; -import net.minecraft.recipe.ShapelessRecipe; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.world.level.Level; public final class ImpostorShapelessRecipe extends ShapelessRecipe { public static final RecipeSerializer SERIALIZER = new RecipeSerializer() { @Override - public ImpostorShapelessRecipe read( @Nonnull Identifier id, @Nonnull JsonObject json ) + public ImpostorShapelessRecipe fromJson( @Nonnull ResourceLocation id, @Nonnull JsonObject json ) { - String s = JsonHelper.getString( json, "group", "" ); - DefaultedList ingredients = readIngredients( JsonHelper.getArray( json, "ingredients" ) ); + String s = GsonHelper.getAsString( json, "group", "" ); + NonNullList ingredients = readIngredients( GsonHelper.getAsJsonArray( json, "ingredients" ) ); if( ingredients.isEmpty() ) { @@ -41,15 +40,15 @@ public final class ImpostorShapelessRecipe extends ShapelessRecipe { throw new JsonParseException( "Too many ingredients for shapeless recipe the max is 9" ); } - JsonObject resultObject = JsonHelper.getObject( json, "result" ); - ItemStack itemStack = ShapedRecipe.outputFromJson( resultObject ); + JsonObject resultObject = GsonHelper.getAsJsonObject( json, "result" ); + ItemStack itemStack = ShapedRecipe.itemStackFromJson( resultObject ); RecipeUtil.setNbt( itemStack, resultObject ); return new ImpostorShapelessRecipe( id, s, itemStack, ingredients ); } - private DefaultedList readIngredients( JsonArray arrays ) + private NonNullList readIngredients( JsonArray arrays ) { - DefaultedList items = DefaultedList.of(); + NonNullList items = NonNullList.create(); for( int i = 0; i < arrays.size(); ++i ) { Ingredient ingredient = Ingredient.fromJson( arrays.get( i ) ); @@ -63,38 +62,38 @@ public final class ImpostorShapelessRecipe extends ShapelessRecipe } @Override - public ImpostorShapelessRecipe read( @Nonnull Identifier id, PacketByteBuf buffer ) + public ImpostorShapelessRecipe fromNetwork( @Nonnull ResourceLocation id, FriendlyByteBuf buffer ) { - String s = buffer.readString( 32767 ); + String s = buffer.readUtf( 32767 ); int i = buffer.readVarInt(); - DefaultedList items = DefaultedList.ofSize( i, Ingredient.EMPTY ); + NonNullList items = NonNullList.withSize( i, Ingredient.EMPTY ); for( int j = 0; j < items.size(); j++ ) { - items.set( j, Ingredient.fromPacket( buffer ) ); + items.set( j, Ingredient.fromNetwork( buffer ) ); } - ItemStack result = buffer.readItemStack(); + ItemStack result = buffer.readItem(); return new ImpostorShapelessRecipe( id, s, result, items ); } @Override - public void write( @Nonnull PacketByteBuf buffer, @Nonnull ImpostorShapelessRecipe recipe ) + public void write( @Nonnull FriendlyByteBuf buffer, @Nonnull ImpostorShapelessRecipe recipe ) { - buffer.writeString( recipe.getGroup() ); + buffer.writeUtf( recipe.getGroup() ); buffer.writeVarInt( recipe.getIngredients() .size() ); for( Ingredient ingredient : recipe.getIngredients() ) { - ingredient.write( buffer ); + ingredient.toNetwork( buffer ); } - buffer.writeItemStack( recipe.getOutput() ); + buffer.writeItem( recipe.getResultItem() ); } }; private final String group; - private ImpostorShapelessRecipe( @Nonnull Identifier id, @Nonnull String group, @Nonnull ItemStack result, DefaultedList ingredients ) + private ImpostorShapelessRecipe( @Nonnull ResourceLocation id, @Nonnull String group, @Nonnull ItemStack result, NonNullList ingredients ) { super( id, group, result, ingredients ); this.group = group; @@ -115,14 +114,14 @@ public final class ImpostorShapelessRecipe extends ShapelessRecipe } @Override - public boolean matches( @Nonnull CraftingInventory inv, @Nonnull World world ) + public boolean matches( @Nonnull CraftingContainer inv, @Nonnull Level world ) { return false; } @Nonnull @Override - public ItemStack craft( @Nonnull CraftingInventory inventory ) + public ItemStack assemble( @Nonnull CraftingContainer inventory ) { return ItemStack.EMPTY; } diff --git a/src/main/java/dan200/computercraft/shared/util/InventoryDelegate.java b/src/main/java/dan200/computercraft/shared/util/InventoryDelegate.java index 41af4a582..9dbbfffd8 100644 --- a/src/main/java/dan200/computercraft/shared/util/InventoryDelegate.java +++ b/src/main/java/dan200/computercraft/shared/util/InventoryDelegate.java @@ -6,12 +6,11 @@ package dan200.computercraft.shared.util; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - import javax.annotation.Nonnull; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import java.util.Set; /** @@ -21,15 +20,15 @@ import java.util.Set; * inventories which change their backing store. */ @FunctionalInterface -public interface InventoryDelegate extends Inventory +public interface InventoryDelegate extends Container { @Override - default int size() + default int getContainerSize() { - return getInventory().size(); + return getInventory().getContainerSize(); } - Inventory getInventory(); + Container getInventory(); @Override default boolean isEmpty() @@ -39,82 +38,82 @@ public interface InventoryDelegate extends Inventory @Nonnull @Override - default ItemStack getStack( int slot ) + default ItemStack getItem( int slot ) { - return getInventory().getStack( slot ); + return getInventory().getItem( slot ); } @Nonnull @Override - default ItemStack removeStack( int slot, int count ) + default ItemStack removeItem( int slot, int count ) { - return getInventory().removeStack( slot, count ); + return getInventory().removeItem( slot, count ); } @Nonnull @Override - default ItemStack removeStack( int slot ) + default ItemStack removeItemNoUpdate( int slot ) { - return getInventory().removeStack( slot ); + return getInventory().removeItemNoUpdate( slot ); } @Override - default void setStack( int slot, @Nonnull ItemStack stack ) + default void setItem( int slot, @Nonnull ItemStack stack ) { - getInventory().setStack( slot, stack ); + getInventory().setItem( slot, stack ); } @Override - default int getMaxCountPerStack() + default int getMaxStackSize() { - return getInventory().getMaxCountPerStack(); + return getInventory().getMaxStackSize(); } @Override - default void markDirty() + default void setChanged() { - getInventory().markDirty(); + getInventory().setChanged(); } @Override - default boolean canPlayerUse( @Nonnull PlayerEntity player ) + default boolean stillValid( @Nonnull Player player ) { - return getInventory().canPlayerUse( player ); + return getInventory().stillValid( player ); } @Override - default void onOpen( @Nonnull PlayerEntity player ) + default void startOpen( @Nonnull Player player ) { - getInventory().onOpen( player ); + getInventory().startOpen( player ); } @Override - default void onClose( @Nonnull PlayerEntity player ) + default void stopOpen( @Nonnull Player player ) { - getInventory().onClose( player ); + getInventory().stopOpen( player ); } @Override - default boolean isValid( int slot, @Nonnull ItemStack stack ) + default boolean canPlaceItem( int slot, @Nonnull ItemStack stack ) { - return getInventory().isValid( slot, stack ); + return getInventory().canPlaceItem( slot, stack ); } @Override - default int count( @Nonnull Item stack ) + default int countItem( @Nonnull Item stack ) { - return getInventory().count( stack ); + return getInventory().countItem( stack ); } @Override - default boolean containsAny( @Nonnull Set set ) + default boolean hasAnyOf( @Nonnull Set set ) { - return getInventory().containsAny( set ); + return getInventory().hasAnyOf( set ); } @Override - default void clear() + default void clearContent() { - getInventory().clear(); + getInventory().clearContent(); } } diff --git a/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java b/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java index 9d836718b..4dc196e95 100644 --- a/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/InventoryUtil.java @@ -6,22 +6,22 @@ package dan200.computercraft.shared.util; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.InventoryProvider; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Container; +import net.minecraft.world.WorldlyContainerHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; public final class InventoryUtil { @@ -30,12 +30,12 @@ public final class InventoryUtil public static boolean areItemsStackable( @Nonnull ItemStack a, @Nonnull ItemStack b ) { - return a == b || (a.getItem() == b.getItem() && ItemStack.areNbtEqual( a, b )); + return a == b || (a.getItem() == b.getItem() && ItemStack.tagMatches( a, b )); } // Methods for finding inventories: - public static Inventory getInventory( World world, BlockPos pos, Direction side ) + public static Container getInventory( Level world, BlockPos pos, Direction side ) { // Look for tile with inventory int y = pos.getY(); @@ -44,16 +44,16 @@ public final class InventoryUtil // Check if block is InventoryProvider BlockState blockState = world.getBlockState( pos ); Block block = blockState.getBlock(); - if( block instanceof InventoryProvider ) + if( block instanceof WorldlyContainerHolder ) { - return ((InventoryProvider) block).getInventory( blockState, world, pos ); + return ((WorldlyContainerHolder) block).getContainer( blockState, world, pos ); } // Check if block is BlockEntity w/ Inventory if( blockState.hasBlockEntity() ) { BlockEntity tileEntity = world.getBlockEntity( pos ); - Inventory inventory = getInventory( tileEntity ); + Container inventory = getInventory( tileEntity ); if( inventory != null ) { return inventory; @@ -62,36 +62,36 @@ public final class InventoryUtil } // Look for entity with inventory - Vec3d vecStart = new Vec3d( pos.getX() + 0.5 + 0.6 * side.getOffsetX(), - pos.getY() + 0.5 + 0.6 * side.getOffsetY(), - pos.getZ() + 0.5 + 0.6 * side.getOffsetZ() ); + Vec3 vecStart = new Vec3( pos.getX() + 0.5 + 0.6 * side.getStepX(), + pos.getY() + 0.5 + 0.6 * side.getStepY(), + pos.getZ() + 0.5 + 0.6 * side.getStepZ() ); Direction dir = side.getOpposite(); - Vec3d vecDir = new Vec3d( dir.getOffsetX(), dir.getOffsetY(), dir.getOffsetZ() ); - Pair hit = WorldUtil.rayTraceEntities( world, vecStart, vecDir, 1.1 ); + Vec3 vecDir = new Vec3( dir.getStepX(), dir.getStepY(), dir.getStepZ() ); + Pair hit = WorldUtil.rayTraceEntities( world, vecStart, vecDir, 1.1 ); if( hit != null ) { Entity entity = hit.getKey(); - if( entity instanceof Inventory ) + if( entity instanceof Container ) { - return (Inventory) entity; + return (Container) entity; } } return null; } - public static Inventory getInventory( BlockEntity tileEntity ) + public static Container getInventory( BlockEntity tileEntity ) { - World world = tileEntity.getWorld(); - BlockPos pos = tileEntity.getPos(); + Level world = tileEntity.getLevel(); + BlockPos pos = tileEntity.getBlockPos(); BlockState blockState = world.getBlockState( pos ); Block block = blockState.getBlock(); - if( tileEntity instanceof Inventory ) + if( tileEntity instanceof Container ) { - Inventory inventory = (Inventory) tileEntity; + Container inventory = (Container) tileEntity; if( inventory instanceof ChestBlockEntity && block instanceof ChestBlock ) { - return ChestBlock.getInventory( (ChestBlock) block, blockState, world, pos, true ); + return ChestBlock.getContainer( (ChestBlock) block, blockState, world, pos, true ); } return inventory; } @@ -131,7 +131,7 @@ public final class InventoryUtil public static boolean areItemsEqual( @Nonnull ItemStack a, @Nonnull ItemStack b ) { - return a == b || ItemStack.areEqual( a, b ); + return a == b || ItemStack.matches( a, b ); } @Nonnull @@ -173,11 +173,11 @@ public final class InventoryUtil { // If we've extracted for this first time, then limit the count to the maximum stack size. partialStack = extracted; - count = Math.min( count, extracted.getMaxCount() ); + count = Math.min( count, extracted.getMaxStackSize() ); } else { - partialStack.increment( extracted.getCount() ); + partialStack.grow( extracted.getCount() ); } } diff --git a/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java b/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java index 1e36de8ca..eea17b41f 100644 --- a/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java +++ b/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java @@ -5,34 +5,33 @@ */ package dan200.computercraft.shared.util; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; - import javax.annotation.Nonnull; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; public class InvisibleSlot extends Slot { - public InvisibleSlot( Inventory container, int slot ) + public InvisibleSlot( Container container, int slot ) { super( container, slot, 0, 0 ); } @Override - public boolean canInsert( @Nonnull ItemStack stack ) + public boolean mayPlace( @Nonnull ItemStack stack ) { return false; } @Override - public boolean canTakeItems( @Nonnull PlayerEntity player ) + public boolean mayPickup( @Nonnull Player player ) { return false; } @Override - public boolean isEnabled() + public boolean isActive() { return false; } diff --git a/src/main/java/dan200/computercraft/shared/util/ItemStorage.java b/src/main/java/dan200/computercraft/shared/util/ItemStorage.java index 2868ad395..b11f445d5 100644 --- a/src/main/java/dan200/computercraft/shared/util/ItemStorage.java +++ b/src/main/java/dan200/computercraft/shared/util/ItemStorage.java @@ -5,36 +5,35 @@ */ package dan200.computercraft.shared.util; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Direction; - import javax.annotation.Nonnull; +import net.minecraft.core.Direction; +import net.minecraft.world.Container; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.item.ItemStack; /** * The most cutesy alternative of {@code IItemHandler} the world has ever seen. */ public interface ItemStorage { - static ItemStorage wrap( Inventory inventory ) + static ItemStorage wrap( Container inventory ) { return new InventoryWrapper( inventory ); } - static ItemStorage wrap( @Nonnull SidedInventory inventory, @Nonnull Direction facing ) + static ItemStorage wrap( @Nonnull WorldlyContainer inventory, @Nonnull Direction facing ) { return new SidedInventoryWrapper( inventory, facing ); } - static ItemStorage wrap( @Nonnull Inventory inventory, @Nonnull Direction facing ) + static ItemStorage wrap( @Nonnull Container inventory, @Nonnull Direction facing ) { - return inventory instanceof SidedInventory ? new SidedInventoryWrapper( (SidedInventory) inventory, facing ) : new InventoryWrapper( inventory ); + return inventory instanceof WorldlyContainer ? new SidedInventoryWrapper( (WorldlyContainer) inventory, facing ) : new InventoryWrapper( inventory ); } static boolean areStackable( @Nonnull ItemStack a, @Nonnull ItemStack b ) { - return a == b || (a.getItem() == b.getItem() && ItemStack.areNbtEqual( a, b )); + return a == b || (a.getItem() == b.getItem() && ItemStack.tagMatches( a, b )); } int size(); @@ -55,9 +54,9 @@ public interface ItemStorage class InventoryWrapper implements ItemStorage { - private final Inventory inventory; + private final Container inventory; - InventoryWrapper( Inventory inventory ) + InventoryWrapper( Container inventory ) { this.inventory = inventory; } @@ -65,21 +64,21 @@ public interface ItemStorage @Override public int size() { - return inventory.size(); + return inventory.getContainerSize(); } @Override @Nonnull public ItemStack getStack( int slot ) { - return inventory.getStack( slot ); + return inventory.getItem( slot ); } @Override @Nonnull public ItemStack take( int slot, int limit, @Nonnull ItemStack filter, boolean simulate ) { - ItemStack existing = inventory.getStack( slot ); + ItemStack existing = inventory.getItem( slot ); if( existing.isEmpty() || !canExtract( slot, existing ) || (!filter.isEmpty() && !areStackable( existing, filter )) ) { return ItemStack.EMPTY; @@ -114,23 +113,23 @@ public interface ItemStorage private void setAndDirty( int slot, @Nonnull ItemStack stack ) { - inventory.setStack( slot, stack ); - inventory.markDirty(); + inventory.setItem( slot, stack ); + inventory.setChanged(); } @Override @Nonnull public ItemStack store( int slot, @Nonnull ItemStack stack, boolean simulate ) { - if( stack.isEmpty() || !inventory.isValid( slot, stack ) ) + if( stack.isEmpty() || !inventory.canPlaceItem( slot, stack ) ) { return stack; } - ItemStack existing = inventory.getStack( slot ); + ItemStack existing = inventory.getItem( slot ); if( existing.isEmpty() ) { - int limit = Math.min( stack.getMaxCount(), inventory.getMaxCountPerStack() ); + int limit = Math.min( stack.getMaxStackSize(), inventory.getMaxStackSize() ); if( limit <= 0 ) { return stack; @@ -157,7 +156,7 @@ public interface ItemStorage } else if( areStackable( stack, existing ) ) { - int limit = Math.min( existing.getMaxCount(), inventory.getMaxCountPerStack() ) - existing.getCount(); + int limit = Math.min( existing.getMaxStackSize(), inventory.getMaxStackSize() ) - existing.getCount(); if( limit <= 0 ) { return stack; @@ -167,7 +166,7 @@ public interface ItemStorage { if( !simulate ) { - existing.increment( stack.getCount() ); + existing.grow( stack.getCount() ); setAndDirty( slot, existing ); } return ItemStack.EMPTY; @@ -175,10 +174,10 @@ public interface ItemStorage else { stack = stack.copy(); - stack.decrement( limit ); + stack.shrink( limit ); if( !simulate ) { - existing.increment( limit ); + existing.grow( limit ); setAndDirty( slot, existing ); } return stack; @@ -193,10 +192,10 @@ public interface ItemStorage class SidedInventoryWrapper extends InventoryWrapper { - private final SidedInventory inventory; + private final WorldlyContainer inventory; private final Direction facing; - SidedInventoryWrapper( SidedInventory inventory, Direction facing ) + SidedInventoryWrapper( WorldlyContainer inventory, Direction facing ) { super( inventory ); this.inventory = inventory; @@ -206,20 +205,20 @@ public interface ItemStorage @Override protected boolean canExtract( int slot, ItemStack stack ) { - return super.canExtract( slot, stack ) && inventory.canExtract( slot, stack, facing ); + return super.canExtract( slot, stack ) && inventory.canTakeItemThroughFace( slot, stack, facing ); } @Override public int size() { - return inventory.getAvailableSlots( facing ).length; + return inventory.getSlotsForFace( facing ).length; } @Nonnull @Override public ItemStack take( int slot, int limit, @Nonnull ItemStack filter, boolean simulate ) { - int[] slots = inventory.getAvailableSlots( facing ); + int[] slots = inventory.getSlotsForFace( facing ); return slot >= 0 && slot < slots.length ? super.take( slots[slot], limit, filter, simulate ) : ItemStack.EMPTY; } @@ -227,14 +226,14 @@ public interface ItemStorage @Override public ItemStack store( int slot, @Nonnull ItemStack stack, boolean simulate ) { - int[] slots = inventory.getAvailableSlots( facing ); + int[] slots = inventory.getSlotsForFace( facing ); if( slot < 0 || slot >= slots.length ) { return stack; } int mappedSlot = slots[slot]; - if( !inventory.canInsert( slot, stack, facing ) ) + if( !inventory.canPlaceItemThroughFace( slot, stack, facing ) ) { return stack; } diff --git a/src/main/java/dan200/computercraft/shared/util/NBTUtil.java b/src/main/java/dan200/computercraft/shared/util/NBTUtil.java index 38d4fb494..80d3c67f3 100644 --- a/src/main/java/dan200/computercraft/shared/util/NBTUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/NBTUtil.java @@ -40,7 +40,7 @@ public final class NBTUtil private NBTUtil() {} - private static NbtElement toNBTTag( Object object ) + private static Tag toNBTTag( Object object ) { if( object == null ) { @@ -48,25 +48,25 @@ public final class NBTUtil } if( object instanceof Boolean ) { - return NbtByte.of( (byte) ((boolean) (Boolean) object ? 1 : 0) ); + return ByteTag.valueOf( (byte) ((boolean) (Boolean) object ? 1 : 0) ); } if( object instanceof Number ) { - return NbtDouble.of( ((Number) object).doubleValue() ); + return DoubleTag.valueOf( ((Number) object).doubleValue() ); } if( object instanceof String ) { - return NbtString.of( object.toString() ); + return StringTag.valueOf( object.toString() ); } if( object instanceof Map ) { Map m = (Map) object; - NbtCompound nbt = new NbtCompound(); + CompoundTag nbt = new CompoundTag(); int i = 0; for( Map.Entry entry : m.entrySet() ) { - NbtElement key = toNBTTag( entry.getKey() ); - NbtElement value = toNBTTag( entry.getKey() ); + Tag key = toNBTTag( entry.getKey() ); + Tag value = toNBTTag( entry.getKey() ); if( key != null && value != null ) { nbt.put( "k" + i, key ); @@ -81,18 +81,18 @@ public final class NBTUtil return null; } - public static NbtCompound encodeObjects( Object[] objects ) + public static CompoundTag encodeObjects( Object[] objects ) { if( objects == null || objects.length <= 0 ) { return null; } - NbtCompound nbt = new NbtCompound(); + CompoundTag nbt = new CompoundTag(); nbt.putInt( "len", objects.length ); for( int i = 0; i < objects.length; i++ ) { - NbtElement child = toNBTTag( objects[i] ); + Tag child = toNBTTag( objects[i] ); if( child != null ) { nbt.put( Integer.toString( i ), child ); @@ -101,23 +101,23 @@ public final class NBTUtil return nbt; } - private static Object fromNBTTag( NbtElement tag ) + private static Object fromNBTTag( Tag tag ) { if( tag == null ) { return null; } - switch( tag.getType() ) + switch( tag.getId() ) { case TAG_BYTE: - return ((NbtByte) tag).byteValue() > 0; + return ((ByteTag) tag).getAsByte() > 0; case TAG_DOUBLE: - return ((NbtDouble) tag).doubleValue(); + return ((DoubleTag) tag).getAsDouble(); default: case TAG_STRING: - return tag.asString(); + return tag.getAsString(); case TAG_COMPOUND: - NbtCompound c = (NbtCompound) tag; + CompoundTag c = (CompoundTag) tag; int len = c.getInt( "len" ); Map map = new HashMap<>( len ); for( int i = 0; i < len; i++ ) @@ -133,31 +133,31 @@ public final class NBTUtil } } - public static Object toLua( NbtElement tag ) + public static Object toLua( Tag tag ) { if( tag == null ) { return null; } - byte typeID = tag.getType(); + byte typeID = tag.getId(); switch( typeID ) { case TAG_BYTE: case TAG_SHORT: case TAG_INT: case TAG_LONG: - return ((AbstractNbtNumber) tag).longValue(); + return ((NumericTag) tag).getAsLong(); case TAG_FLOAT: case TAG_DOUBLE: - return ((AbstractNbtNumber) tag).doubleValue(); + return ((NumericTag) tag).getAsDouble(); case TAG_STRING: // String - return tag.asString(); + return tag.getAsString(); case TAG_COMPOUND: // Compound { - NbtCompound compound = (NbtCompound) tag; - Map map = new HashMap<>( compound.getSize() ); - for( String key : compound.getKeys() ) + CompoundTag compound = (CompoundTag) tag; + Map map = new HashMap<>( compound.size() ); + for( String key : compound.getAllKeys() ) { Object value = toLua( compound.get( key ) ); if( value != null ) @@ -169,7 +169,7 @@ public final class NBTUtil } case TAG_LIST: { - NbtList list = (NbtList) tag; + ListTag list = (ListTag) tag; Map map = new HashMap<>( list.size() ); for( int i = 0; i < list.size(); i++ ) { @@ -179,7 +179,7 @@ public final class NBTUtil } case TAG_BYTE_ARRAY: { - byte[] array = ((NbtByteArray) tag).getByteArray(); + byte[] array = ((ByteArrayTag) tag).getAsByteArray(); Map map = new HashMap<>( array.length ); for( int i = 0; i < array.length; i++ ) { @@ -188,7 +188,7 @@ public final class NBTUtil return map; } case TAG_INT_ARRAY: - int[] array = ((NbtIntArray) tag).getIntArray(); + int[] array = ((IntArrayTag) tag).getAsIntArray(); Map map = new HashMap<>( array.length ); for( int i = 0; i < array.length; i++ ) { @@ -201,7 +201,7 @@ public final class NBTUtil } } - public static Object[] decodeObjects( NbtCompound tag ) + public static Object[] decodeObjects( CompoundTag tag ) { int len = tag.getInt( "len" ); if( len <= 0 ) @@ -222,7 +222,7 @@ public final class NBTUtil } @Nullable - public static String getNBTHash( @Nullable NbtCompound tag ) + public static String getNBTHash( @Nullable CompoundTag tag ) { if( tag == null ) { diff --git a/src/main/java/dan200/computercraft/shared/util/Palette.java b/src/main/java/dan200/computercraft/shared/util/Palette.java index 2b4d65b52..4f4713f30 100644 --- a/src/main/java/dan200/computercraft/shared/util/Palette.java +++ b/src/main/java/dan200/computercraft/shared/util/Palette.java @@ -6,8 +6,8 @@ package dan200.computercraft.shared.util; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; public class Palette { @@ -61,7 +61,7 @@ public class Palette return null; } - public void write( PacketByteBuf buffer ) + public void write( FriendlyByteBuf buffer ) { for( double[] colour : colours ) { @@ -72,7 +72,7 @@ public class Palette } } - public void read( PacketByteBuf buffer ) + public void read( FriendlyByteBuf buffer ) { for( double[] colour : colours ) { @@ -83,7 +83,7 @@ public class Palette } } - public NbtCompound writeToNBT( NbtCompound nbt ) + public CompoundTag writeToNBT( CompoundTag nbt ) { int[] rgb8 = new int[colours.length]; @@ -105,7 +105,7 @@ public class Palette return (r << 16) | (g << 8) | b; } - public void readFromNBT( NbtCompound nbt ) + public void readFromNBT( CompoundTag nbt ) { if( !nbt.contains( "term_palette" ) ) { diff --git a/src/main/java/dan200/computercraft/shared/util/RecipeUtil.java b/src/main/java/dan200/computercraft/shared/util/RecipeUtil.java index 167933b8e..42d8d651c 100644 --- a/src/main/java/dan200/computercraft/shared/util/RecipeUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/RecipeUtil.java @@ -11,14 +11,13 @@ import com.google.common.collect.Sets; import com.google.gson.*; import com.mojang.brigadier.exceptions.CommandSyntaxException; import dan200.computercraft.shared.computer.core.ComputerFamily; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.StringNbtReader; -import net.minecraft.recipe.Ingredient; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.collection.DefaultedList; - import java.util.Map; import java.util.Set; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.TagParser; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; // TODO: Replace some things with Forge?? @@ -30,7 +29,7 @@ public final class RecipeUtil public static ShapedTemplate getTemplate( JsonObject json ) { Map ingMap = Maps.newHashMap(); - for( Map.Entry entry : JsonHelper.getObject( json, "key" ) + for( Map.Entry entry : GsonHelper.getAsJsonObject( json, "key" ) .entrySet() ) { if( entry.getKey() @@ -49,7 +48,7 @@ public final class RecipeUtil ingMap.put( ' ', Ingredient.EMPTY ); - JsonArray patternJ = JsonHelper.getArray( json, "pattern" ); + JsonArray patternJ = GsonHelper.getAsJsonArray( json, "pattern" ); if( patternJ.size() == 0 ) { @@ -59,7 +58,7 @@ public final class RecipeUtil String[] pattern = new String[patternJ.size()]; for( int x = 0; x < pattern.length; x++ ) { - String line = JsonHelper.asString( patternJ.get( x ), "pattern[" + x + "]" ); + String line = GsonHelper.convertToString( patternJ.get( x ), "pattern[" + x + "]" ); if( x > 0 && pattern[0].length() != line.length() ) { throw new JsonSyntaxException( "Invalid pattern: each row must be the same width" ); @@ -69,7 +68,7 @@ public final class RecipeUtil int width = pattern[0].length(); int height = pattern.length; - DefaultedList ingredients = DefaultedList.ofSize( width * height, Ingredient.EMPTY ); + NonNullList ingredients = NonNullList.withSize( width * height, Ingredient.EMPTY ); Set missingKeys = Sets.newHashSet( ingMap.keySet() ); missingKeys.remove( ' ' ); @@ -99,7 +98,7 @@ public final class RecipeUtil public static ComputerFamily getFamily( JsonObject json, String name ) { - String familyName = JsonHelper.getString( json, name ); + String familyName = GsonHelper.getAsString( json, name ); for( ComputerFamily family : ComputerFamily.values() ) { if( family.name() @@ -119,7 +118,7 @@ public final class RecipeUtil { try { - itemStack.setNbt( StringNbtReader.parse( nbtElement.isJsonObject() ? GSON.toJson( nbtElement ) : JsonHelper.asString( nbtElement, "nbt" ) ) ); + itemStack.setTag( TagParser.parseTag( nbtElement.isJsonObject() ? GSON.toJson( nbtElement ) : GsonHelper.convertToString( nbtElement, "nbt" ) ) ); } catch( CommandSyntaxException e ) { @@ -132,9 +131,9 @@ public final class RecipeUtil { public final int width; public final int height; - public final DefaultedList ingredients; + public final NonNullList ingredients; - public ShapedTemplate( int width, int height, DefaultedList ingredients ) + public ShapedTemplate( int width, int height, NonNullList ingredients ) { this.width = width; this.height = height; diff --git a/src/main/java/dan200/computercraft/shared/util/RecordUtil.java b/src/main/java/dan200/computercraft/shared/util/RecordUtil.java index 30de0b841..afe99a065 100644 --- a/src/main/java/dan200/computercraft/shared/util/RecordUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/RecordUtil.java @@ -9,18 +9,18 @@ package dan200.computercraft.shared.util; import dan200.computercraft.shared.network.NetworkHandler; import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.network.client.PlayRecordClientMessage; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; public final class RecordUtil { private RecordUtil() {} - public static void playRecord( SoundEvent record, String recordInfo, World world, BlockPos pos ) + public static void playRecord( SoundEvent record, String recordInfo, Level world, BlockPos pos ) { NetworkMessage packet = record != null ? new PlayRecordClientMessage( pos, record, recordInfo ) : new PlayRecordClientMessage( pos ); - NetworkHandler.sendToAllAround( packet, world, Vec3d.ofCenter( pos ), 64 ); + NetworkHandler.sendToAllAround( packet, world, Vec3.atCenterOf( pos ), 64 ); } } diff --git a/src/main/java/dan200/computercraft/shared/util/RedstoneUtil.java b/src/main/java/dan200/computercraft/shared/util/RedstoneUtil.java index ca27dcde5..5de8bdd7f 100644 --- a/src/main/java/dan200/computercraft/shared/util/RedstoneUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/RedstoneUtil.java @@ -6,19 +6,19 @@ package dan200.computercraft.shared.util; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; public final class RedstoneUtil { - public static void propagateRedstoneOutput( World world, BlockPos pos, Direction side ) + public static void propagateRedstoneOutput( Level world, BlockPos pos, Direction side ) { // Propagate ordinary output. See BlockRedstoneDiode.notifyNeighbors BlockState block = world.getBlockState( pos ); - BlockPos neighbourPos = pos.offset( side ); - world.updateNeighbor( neighbourPos, block.getBlock(), pos ); - world.updateNeighborsExcept( neighbourPos, block.getBlock(), side.getOpposite() ); + BlockPos neighbourPos = pos.relative( side ); + world.neighborChanged( neighbourPos, block.getBlock(), pos ); + world.updateNeighborsAtExceptFromFacing( neighbourPos, block.getBlock(), side.getOpposite() ); } } diff --git a/src/main/java/dan200/computercraft/shared/util/SingleIntArray.java b/src/main/java/dan200/computercraft/shared/util/SingleIntArray.java index 4e9141232..1329f1352 100644 --- a/src/main/java/dan200/computercraft/shared/util/SingleIntArray.java +++ b/src/main/java/dan200/computercraft/shared/util/SingleIntArray.java @@ -6,10 +6,10 @@ package dan200.computercraft.shared.util; -import net.minecraft.screen.PropertyDelegate; +import net.minecraft.world.inventory.ContainerData; @FunctionalInterface -public interface SingleIntArray extends PropertyDelegate +public interface SingleIntArray extends ContainerData { @Override default int get( int property ) @@ -25,7 +25,7 @@ public interface SingleIntArray extends PropertyDelegate } @Override - default int size() + default int getCount() { return 1; } diff --git a/src/main/java/dan200/computercraft/shared/util/TickScheduler.java b/src/main/java/dan200/computercraft/shared/util/TickScheduler.java index 98e3a8036..31917f7ad 100644 --- a/src/main/java/dan200/computercraft/shared/util/TickScheduler.java +++ b/src/main/java/dan200/computercraft/shared/util/TickScheduler.java @@ -8,13 +8,12 @@ package dan200.computercraft.shared.util; import com.google.common.collect.MapMaker; import dan200.computercraft.shared.common.TileGeneric; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import java.util.Collections; import java.util.Iterator; import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; /** * We use this when modems and other peripherals change a block in a different thread. @@ -30,8 +29,8 @@ public final class TickScheduler public static void schedule( TileGeneric tile ) { - World world = tile.getWorld(); - if( world != null && !world.isClient ) + Level world = tile.getLevel(); + if( world != null && !world.isClientSide ) { toTick.add( tile ); } @@ -45,14 +44,14 @@ public final class TickScheduler BlockEntity tile = iterator.next(); iterator.remove(); - World world = tile.getWorld(); - BlockPos pos = tile.getPos(); + Level world = tile.getLevel(); + BlockPos pos = tile.getBlockPos(); - if( world != null && pos != null && world.isChunkLoaded( pos ) && world.getBlockEntity( pos ) == tile ) + if( world != null && pos != null && world.hasChunkAt( pos ) && world.getBlockEntity( pos ) == tile ) { - world.getBlockTickScheduler() - .schedule( pos, - tile.getCachedState() + world.getBlockTicks() + .scheduleTick( pos, + tile.getBlockState() .getBlock(), 0 ); } diff --git a/src/main/java/dan200/computercraft/shared/util/ValidatingSlot.java b/src/main/java/dan200/computercraft/shared/util/ValidatingSlot.java index aa1e50940..bd9086102 100644 --- a/src/main/java/dan200/computercraft/shared/util/ValidatingSlot.java +++ b/src/main/java/dan200/computercraft/shared/util/ValidatingSlot.java @@ -6,21 +6,20 @@ package dan200.computercraft.shared.util; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; - import javax.annotation.Nonnull; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; public class ValidatingSlot extends Slot { - public ValidatingSlot( Inventory inventoryIn, int index, int xPosition, int yPosition ) + public ValidatingSlot( Container inventoryIn, int index, int xPosition, int yPosition ) { super( inventoryIn, index, xPosition, yPosition ); } @Override - public boolean canInsert( @Nonnull ItemStack stack ) + public boolean mayPlace( @Nonnull ItemStack stack ) { return true; // inventory.isItemValidForSlot( slotNumber, stack ); } diff --git a/src/main/java/dan200/computercraft/shared/util/WaterloggableHelpers.java b/src/main/java/dan200/computercraft/shared/util/WaterloggableHelpers.java index 7703ab8ef..414c88c3e 100644 --- a/src/main/java/dan200/computercraft/shared/util/WaterloggableHelpers.java +++ b/src/main/java/dan200/computercraft/shared/util/WaterloggableHelpers.java @@ -6,14 +6,14 @@ package dan200.computercraft.shared.util; -import net.minecraft.block.BlockState; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldAccess; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; /** * Represents a block which can be filled with water @@ -22,43 +22,43 @@ import net.minecraft.world.WorldAccess; */ public final class WaterloggableHelpers { - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; private WaterloggableHelpers() { } /** - * Call from {@link net.minecraft.block.Block#getFluidState(BlockState)}. + * Call from {@link net.minecraft.world.level.block.Block#getFluidState(BlockState)}. * * @param state The current state * @return This waterlogged block's current fluid */ public static FluidState getWaterloggedFluidState( BlockState state ) { - return state.get( WATERLOGGED ) ? Fluids.WATER.getStill( false ) : Fluids.EMPTY.getDefaultState(); + return state.getValue( WATERLOGGED ) ? Fluids.WATER.getSource( false ) : Fluids.EMPTY.defaultFluidState(); } /** - * Call from {@link net.minecraft.block.Block#updatePostPlacement(BlockState, Direction, BlockState, IWorld, BlockPos, BlockPos)}. + * Call from {@link net.minecraft.world.level.block.Block#updatePostPlacement(BlockState, Direction, BlockState, IWorld, BlockPos, BlockPos)}. * * @param state The current state * @param world The position of this block * @param pos The world this block exists in */ - public static void updateWaterloggedPostPlacement( BlockState state, WorldAccess world, BlockPos pos ) + public static void updateWaterloggedPostPlacement( BlockState state, LevelAccessor world, BlockPos pos ) { - if( state.get( WATERLOGGED ) ) + if( state.getValue( WATERLOGGED ) ) { - world.getFluidTickScheduler() - .schedule( pos, Fluids.WATER, Fluids.WATER.getTickRate( world ) ); + world.getLiquidTicks() + .scheduleTick( pos, Fluids.WATER, Fluids.WATER.getTickDelay( world ) ); } } - public static boolean getWaterloggedStateForPlacement( ItemPlacementContext context ) + public static boolean getWaterloggedStateForPlacement( BlockPlaceContext context ) { - return context.getWorld() - .getFluidState( context.getBlockPos() ) - .getFluid() == Fluids.WATER; + return context.getLevel() + .getFluidState( context.getClickedPos() ) + .getType() == Fluids.WATER; } } diff --git a/src/main/java/dan200/computercraft/shared/util/WorldUtil.java b/src/main/java/dan200/computercraft/shared/util/WorldUtil.java index 33c153401..a962bef3d 100644 --- a/src/main/java/dan200/computercraft/shared/util/WorldUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/WorldUtil.java @@ -8,17 +8,23 @@ package dan200.computercraft.shared.util; import com.google.common.base.Predicate; import com.google.common.collect.MapMaker; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.entity.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.VoxelShape; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; @@ -28,15 +34,15 @@ import java.util.Map; public final class WorldUtil { @SuppressWarnings( "Guava" ) - private static final Predicate CAN_COLLIDE = x -> x != null && x.isAlive() && x.collides(); + private static final Predicate CAN_COLLIDE = x -> x != null && x.isAlive() && x.isPickable(); - private static final Map entityCache = new MapMaker().weakKeys() + private static final Map entityCache = new MapMaker().weakKeys() .weakValues() .makeMap(); - public static boolean isLiquidBlock( World world, BlockPos pos ) + public static boolean isLiquidBlock( Level world, BlockPos pos ) { - if( !world.isInBuildLimit( pos ) ) + if( !world.isInWorldBounds( pos ) ) { return false; } @@ -45,33 +51,33 @@ public final class WorldUtil .isLiquid(); } - public static boolean isVecInside( VoxelShape shape, Vec3d vec ) + public static boolean isVecInside( VoxelShape shape, Vec3 vec ) { if( shape.isEmpty() ) { return false; } // AxisAlignedBB.contains, but without strict inequalities. - Box bb = shape.getBoundingBox(); + AABB bb = shape.bounds(); 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 rayTraceEntities( World world, Vec3d vecStart, Vec3d vecDir, double distance ) + public static Pair rayTraceEntities( Level world, Vec3 vecStart, Vec3 vecDir, double distance ) { - Vec3d vecEnd = vecStart.add( vecDir.x * distance, vecDir.y * distance, vecDir.z * distance ); + Vec3 vecEnd = vecStart.add( vecDir.x * distance, vecDir.y * distance, vecDir.z * distance ); // Raycast for blocks Entity collisionEntity = getEntity( world ); - collisionEntity.setPosition( vecStart.x, vecStart.y, vecStart.z ); - RaycastContext context = new RaycastContext( vecStart, + collisionEntity.setPos( vecStart.x, vecStart.y, vecStart.z ); + ClipContext context = new ClipContext( vecStart, vecEnd, - RaycastContext.ShapeType.COLLIDER, - RaycastContext.FluidHandling.NONE, + ClipContext.Block.COLLIDER, + ClipContext.Fluid.NONE, collisionEntity ); - HitResult result = world.raycast( context ); + HitResult result = world.clip( context ); if( result != null && result.getType() == HitResult.Type.BLOCK ) { - distance = vecStart.distanceTo( result.getPos() ); + distance = vecStart.distanceTo( result.getLocation() ); vecEnd = vecStart.add( vecDir.x * distance, vecDir.y * distance, vecDir.z * distance ); } @@ -79,7 +85,7 @@ public final class WorldUtil float xStretch = Math.abs( vecDir.x ) > 0.25f ? 0.0f : 1.0f; float yStretch = Math.abs( vecDir.y ) > 0.25f ? 0.0f : 1.0f; float zStretch = Math.abs( vecDir.z ) > 0.25f ? 0.0f : 1.0f; - Box bigBox = new Box( Math.min( vecStart.x, vecEnd.x ) - 0.375f * xStretch, + AABB bigBox = new AABB( Math.min( vecStart.x, vecEnd.x ) - 0.375f * xStretch, Math.min( vecStart.y, vecEnd.y ) - 0.375f * yStretch, Math.min( vecStart.z, vecEnd.z ) - 0.375f * zStretch, Math.max( vecStart.x, vecEnd.x ) + 0.375f * xStretch, @@ -88,10 +94,10 @@ public final class WorldUtil Entity closest = null; double closestDist = 99.0; - List list = world.getEntitiesByClass( Entity.class, bigBox, CAN_COLLIDE ); + List list = world.getEntitiesOfClass( Entity.class, bigBox, CAN_COLLIDE ); for( Entity entity : list ) { - Box littleBox = entity.getBoundingBox(); + AABB littleBox = entity.getBoundingBox(); if( littleBox.contains( vecStart ) ) { closest = entity; @@ -99,7 +105,7 @@ public final class WorldUtil continue; } - Vec3d littleBoxResult = littleBox.raycast( vecStart, vecEnd ) + Vec3 littleBoxResult = littleBox.clip( vecStart, vecEnd ) .orElse( null ); if( littleBoxResult != null ) { @@ -121,13 +127,13 @@ public final class WorldUtil } if( closest != null && closestDist <= distance ) { - Vec3d closestPos = vecStart.add( vecDir.x * closestDist, vecDir.y * closestDist, vecDir.z * closestDist ); + Vec3 closestPos = vecStart.add( vecDir.x * closestDist, vecDir.y * closestDist, vecDir.z * closestDist ); return Pair.of( closest, closestPos ); } return null; } - private static synchronized Entity getEntity( World world ) + private static synchronized Entity getEntity( Level world ) { // TODO: It'd be nice if we could avoid this. Maybe always use the turtle player (if it's available). Entity entity = entityCache.get( world ); @@ -140,45 +146,45 @@ public final class WorldUtil { @Nonnull @Override - public EntityDimensions getDimensions( @Nonnull EntityPose pose ) + public EntityDimensions getDimensions( @Nonnull Pose pose ) { return EntityDimensions.fixed( 0, 0 ); } }; - entity.noClip = true; - entity.calculateDimensions(); + entity.noPhysics = true; + entity.refreshDimensions(); entityCache.put( world, entity ); return entity; } - public static Vec3d getRayEnd( PlayerEntity player ) + public static Vec3 getRayEnd( Player player ) { double reach = 5; - Vec3d look = player.getRotationVector(); + Vec3 look = player.getLookAngle(); return getRayStart( player ).add( look.x * reach, look.y * reach, look.z * reach ); } - public static Vec3d getRayStart( LivingEntity entity ) + public static Vec3 getRayStart( LivingEntity entity ) { - return entity.getCameraPosVec( 1 ); + return entity.getEyePosition( 1 ); } - public static void dropItemStack( @Nonnull ItemStack stack, World world, BlockPos pos ) + public static void dropItemStack( @Nonnull ItemStack stack, Level world, BlockPos pos ) { dropItemStack( stack, world, pos, null ); } - public static void dropItemStack( @Nonnull ItemStack stack, World world, BlockPos pos, Direction direction ) + public static void dropItemStack( @Nonnull ItemStack stack, Level world, BlockPos pos, Direction direction ) { double xDir; double yDir; double zDir; if( direction != null ) { - xDir = direction.getOffsetX(); - yDir = direction.getOffsetY(); - zDir = direction.getOffsetZ(); + xDir = direction.getStepX(); + yDir = direction.getStepY(); + zDir = direction.getStepZ(); } else { @@ -190,23 +196,23 @@ public final class WorldUtil double xPos = pos.getX() + 0.5 + xDir * 0.4; double yPos = pos.getY() + 0.5 + yDir * 0.4; double zPos = pos.getZ() + 0.5 + zDir * 0.4; - dropItemStack( stack, world, new Vec3d( xPos, yPos, zPos ), xDir, yDir, zDir ); + dropItemStack( stack, world, new Vec3( xPos, yPos, zPos ), xDir, yDir, zDir ); } - public static void dropItemStack( @Nonnull ItemStack stack, World world, Vec3d pos, double xDir, double yDir, double zDir ) + public static void dropItemStack( @Nonnull ItemStack stack, Level world, Vec3 pos, double xDir, double yDir, double zDir ) { ItemEntity item = new ItemEntity( world, pos.x, pos.y, pos.z, stack.copy() ); - item.setVelocity( xDir * 0.7 + world.getRandom() + item.setDeltaMovement( xDir * 0.7 + world.getRandom() .nextFloat() * 0.2 - 0.1, yDir * 0.7 + world.getRandom() .nextFloat() * 0.2 - 0.1, zDir * 0.7 + world.getRandom() .nextFloat() * 0.2 - 0.1 ); - item.setToDefaultPickupDelay(); - world.spawnEntity( item ); + item.setDefaultPickUpDelay(); + world.addFreshEntity( item ); } - public static void dropItemStack( @Nonnull ItemStack stack, World world, Vec3d pos ) + public static void dropItemStack( @Nonnull ItemStack stack, Level world, Vec3 pos ) { dropItemStack( stack, world, pos, 0.0, 0.0, 0.0 ); } diff --git a/src/main/java/dan200/computercraft/shared/wired/WiredNetwork.java b/src/main/java/dan200/computercraft/shared/wired/WiredNetwork.java index ccbf63218..398e983f4 100644 --- a/src/main/java/dan200/computercraft/shared/wired/WiredNetwork.java +++ b/src/main/java/dan200/computercraft/shared/wired/WiredNetwork.java @@ -11,10 +11,9 @@ import dan200.computercraft.api.network.Packet; import dan200.computercraft.api.network.wired.IWiredNetwork; import dan200.computercraft.api.network.wired.IWiredNode; import dan200.computercraft.api.peripheral.IPeripheral; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - import javax.annotation.Nonnull; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -59,8 +58,8 @@ public final class WiredNetwork implements IWiredNetwork TransmitPoint point; while( (point = transmitTo.pollFirst()) != null ) { - World world = point.node.element.getWorld(); - Vec3d position = point.node.element.getPosition(); + Level world = point.node.element.getWorld(); + Vec3 position = point.node.element.getPosition(); for( WiredNode neighbour : point.node.neighbours ) { TransmitPoint neighbourPoint = points.get( neighbour );