From 4b102f16b36466ce96b74704bf223a7ad8a63fd0 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 22 Jun 2024 16:19:59 +0100 Subject: [PATCH] Update to Minecraft 1.21 API Changes: - Minecraft had updated ModelResourceLocation to no longer inherit from ResourceLocation. To allow referencing both already baked models (ModelResourceLocation) and loading new models (via ResourceLocation) in turtle model loadders, we add a new "ModelLocation" class, that acts as a union between the two. I'm not entirely convinced by the design here, so might end up changing again before a stable release.o - Merge IMedia.getAudioTitle and IMedia.getAudio into a single IMedia.getAudio method, which now returns a JukeboxSong rather than a SoundEvent. Other update notes: - Minecraft had rewritten how buffers are managed again. This is a fairly minor change for us (vertex -> addVertex, normal -> setNormal, etc...), with the exception that you can no longer use MultiBufferSource.immediate with the tesselator. I've replaced this with GuiGraphics.bufferSource, which appears to be fine, but worth keeping an eye on in case there's any odd render state issues. - Crafting now uses a CraftingInput (a list of items) rather than a CraftingContainer, which allows us to simplify turtle crafting code. --- .../cc/tweaked/gradle/ForgeExtensions.kt | 4 +- gradle.properties | 4 +- gradle/libs.versions.toml | 30 +-- .../api/client/ModelLocation.java | 84 +++++++ .../api/client/TransformedModel.java | 51 +++-- .../client/turtle/TurtleUpgradeModeller.java | 15 +- .../impl/client/ClientPlatformHelper.java | 24 +- .../computercraft/api/ComputerCraftTags.java | 4 +- .../computercraft/api/media/IMedia.java | 32 +-- .../api/pocket/IPocketUpgrade.java | 2 +- .../api/turtle/ITurtleUpgrade.java | 2 +- .../api/turtle/TurtleToolBuilder.java | 2 +- .../api/upgrades/UpgradeType.java | 2 +- .../computercraft/client/ClientRegistry.java | 12 +- .../client/gui/DiskDriveScreen.java | 2 +- .../computercraft/client/gui/GuiSprites.java | 12 +- .../computercraft/client/gui/ItemToast.java | 2 +- .../client/gui/OptionScreen.java | 2 +- .../client/gui/PrinterScreen.java | 2 +- .../client/gui/PrintoutScreen.java | 8 +- .../client/gui/TurtleScreen.java | 4 +- .../client/gui/widgets/TerminalWidget.java | 7 +- .../client/model/turtle/ModelTransformer.java | 17 +- .../client/model/turtle/TurtleModelParts.java | 4 +- .../platform/ClientNetworkContextImpl.java | 13 +- .../client/platform/ClientPlatformHelper.java | 11 - .../client/render/CableHighlightRenderer.java | 14 +- .../client/render/ModelRenderer.java | 17 +- .../client/render/PrintoutRenderer.java | 2 +- .../client/render/RenderTypes.java | 2 +- .../client/render/SpriteRenderer.java | 8 +- .../render/TurtleBlockEntityRenderer.java | 8 +- .../monitor/MonitorBlockEntityRenderer.java | 17 +- .../monitor/MonitorHighlightRenderer.java | 14 +- .../text/DirectFixedWidthFontRenderer.java | 3 +- .../render/text/FixedWidthFontRenderer.java | 10 +- .../client/sound/SpeakerInstance.java | 2 +- .../client/turtle/TurtleModemModeller.java | 15 +- .../data/client/ClientDataProviders.java | 2 +- .../recipes/decorations/skull_cloudy.json | 0 .../recipes/decorations/skull_dan200.json | 0 .../recipes/redstone/cable.json | 0 .../recipes/redstone/computer_advanced.json | 0 .../redstone/computer_advanced_upgrade.json | 0 .../recipes/redstone/computer_command.json | 0 .../recipes/redstone/computer_normal.json | 0 .../recipes/redstone/disk_1.json | 0 .../recipes/redstone/disk_10.json | 0 .../recipes/redstone/disk_11.json | 0 .../recipes/redstone/disk_12.json | 0 .../recipes/redstone/disk_13.json | 0 .../recipes/redstone/disk_14.json | 0 .../recipes/redstone/disk_15.json | 0 .../recipes/redstone/disk_16.json | 0 .../recipes/redstone/disk_2.json | 0 .../recipes/redstone/disk_3.json | 0 .../recipes/redstone/disk_4.json | 0 .../recipes/redstone/disk_5.json | 0 .../recipes/redstone/disk_6.json | 0 .../recipes/redstone/disk_7.json | 0 .../recipes/redstone/disk_8.json | 0 .../recipes/redstone/disk_9.json | 0 .../recipes/redstone/disk_drive.json | 0 .../recipes/redstone/monitor_advanced.json | 0 .../recipes/redstone/monitor_normal.json | 0 .../computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../redstone/pocket_computer_advanced.json | 0 .../pocket_computer_advanced_upgrade.json | 0 .../redstone/pocket_computer_normal.json | 0 .../pocket_normal/computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../recipes/redstone/printed_book.json | 0 .../recipes/redstone/printed_pages.json | 0 .../recipes/redstone/printer.json | 0 .../recipes/redstone/speaker.json | 0 .../recipes/redstone/turtle_advanced.json | 0 .../computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../minecraft/crafting_table.json | 0 .../minecraft/diamond_axe.json | 0 .../minecraft/diamond_hoe.json | 0 .../minecraft/diamond_pickaxe.json | 0 .../minecraft/diamond_shovel.json | 0 .../minecraft/diamond_sword.json | 0 .../turtle_rainbow_overlay.json | 0 .../turtle_trans_overlay.json | 0 .../redstone/turtle_advanced_upgrade.json | 0 .../recipes/redstone/turtle_normal.json | 0 .../turtle_normal/computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../minecraft/crafting_table.json | 0 .../turtle_normal/minecraft/diamond_axe.json | 0 .../turtle_normal/minecraft/diamond_hoe.json | 0 .../minecraft/diamond_pickaxe.json | 0 .../minecraft/diamond_shovel.json | 0 .../minecraft/diamond_sword.json | 0 .../turtle_rainbow_overlay.json | 0 .../turtle_trans_overlay.json | 0 .../recipes/redstone/wired_modem.json | 0 .../redstone/wired_modem_full_from.json | 0 .../recipes/redstone/wired_modem_full_to.json | 0 .../redstone/wireless_modem_advanced.json | 0 .../redstone/wireless_modem_normal.json | 0 .../blocks/cable.json | 0 .../blocks/computer_advanced.json | 0 .../blocks/computer_command.json | 0 .../blocks/computer_normal.json | 0 .../blocks/disk_drive.json | 0 .../blocks/monitor_advanced.json | 0 .../blocks/monitor_normal.json | 0 .../blocks/printer.json | 0 .../blocks/speaker.json | 0 .../blocks/turtle_advanced.json | 0 .../blocks/turtle_normal.json | 0 .../blocks/wired_modem_full.json | 0 .../blocks/wireless_modem_advanced.json | 0 .../blocks/wireless_modem_normal.json | 0 .../treasure_disk.json | 0 .../{recipes => recipe}/cable.json | 0 .../{recipes => recipe}/clear_colour.json | 0 .../{recipes => recipe}/colour.json | 0 .../computer_advanced.json | 0 .../computer_advanced_upgrade.json | 0 .../{recipes => recipe}/computer_command.json | 0 .../{recipes => recipe}/computer_normal.json | 0 .../{recipes => recipe}/disk.json | 0 .../{recipes => recipe}/disk_1.json | 0 .../{recipes => recipe}/disk_10.json | 0 .../{recipes => recipe}/disk_11.json | 0 .../{recipes => recipe}/disk_12.json | 0 .../{recipes => recipe}/disk_13.json | 0 .../{recipes => recipe}/disk_14.json | 0 .../{recipes => recipe}/disk_15.json | 0 .../{recipes => recipe}/disk_16.json | 0 .../{recipes => recipe}/disk_2.json | 0 .../{recipes => recipe}/disk_3.json | 0 .../{recipes => recipe}/disk_4.json | 0 .../{recipes => recipe}/disk_5.json | 0 .../{recipes => recipe}/disk_6.json | 0 .../{recipes => recipe}/disk_7.json | 0 .../{recipes => recipe}/disk_8.json | 0 .../{recipes => recipe}/disk_9.json | 0 .../{recipes => recipe}/disk_drive.json | 0 .../{recipes => recipe}/monitor_advanced.json | 0 .../{recipes => recipe}/monitor_normal.json | 0 .../computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../pocket_computer_advanced.json | 0 .../pocket_computer_advanced_upgrade.json | 0 .../pocket_computer_normal.json | 0 .../pocket_computer_upgrade.json | 0 .../pocket_normal/computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../computercraft/recipe}/printed_book.json | 0 .../{recipes => recipe}/printed_pages.json | 0 .../{recipes => recipe}/printer.json | 0 .../{recipes => recipe}/skull_cloudy.json | 0 .../{recipes => recipe}/skull_dan200.json | 0 .../{recipes => recipe}/speaker.json | 0 .../{recipes => recipe}/turtle_advanced.json | 0 .../computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../minecraft/crafting_table.json | 0 .../minecraft/diamond_axe.json | 0 .../minecraft/diamond_hoe.json | 0 .../minecraft/diamond_pickaxe.json | 0 .../minecraft/diamond_shovel.json | 0 .../minecraft/diamond_sword.json | 0 .../turtle_rainbow_overlay.json | 0 .../turtle_trans_overlay.json | 0 .../turtle_advanced_upgrade.json | 0 .../{recipes => recipe}/turtle_normal.json | 0 .../turtle_normal/computercraft/speaker.json | 0 .../wireless_modem_advanced.json | 0 .../computercraft/wireless_modem_normal.json | 0 .../minecraft/crafting_table.json | 0 .../turtle_normal/minecraft/diamond_axe.json | 0 .../turtle_normal/minecraft/diamond_hoe.json | 0 .../minecraft/diamond_pickaxe.json | 0 .../minecraft/diamond_shovel.json | 0 .../minecraft/diamond_sword.json | 0 .../turtle_rainbow_overlay.json | 0 .../turtle_trans_overlay.json | 0 .../{recipes => recipe}/turtle_upgrade.json | 0 .../{recipes => recipe}/wired_modem.json | 0 .../wired_modem_full_from.json | 0 .../wired_modem_full_to.json | 0 .../wireless_modem_advanced.json | 0 .../tags/{blocks => block}/computer.json | 0 .../tags/{blocks => block}/monitor.json | 0 .../peripheral_hub_ignore.json | 0 .../tags/{blocks => block}/turtle.json | 0 .../turtle_always_breakable.json | 0 .../{blocks => block}/turtle_can_use.json | 0 .../turtle_hoe_harvestable.json | 0 .../turtle_shovel_harvestable.json | 0 .../turtle_sword_harvestable.json | 0 .../tags/{blocks => block}/wired_modem.json | 0 .../tags/{items => item}/computer.json | 0 .../tags/{items => item}/dyeable.json | 0 .../tags/{items => item}/monitor.json | 0 .../tags/{items => item}/turtle.json | 0 .../{items => item}/turtle_can_place.json | 0 .../tags/{items => item}/wired_modem.json | 0 .../tags/{blocks => block}/brittle.json | 0 .../{blocks => block}/mineable/pickaxe.json | 0 .../tags/{blocks => block}/wither_immune.json | 0 .../tags/{items => item}/bookshelf_books.json | 0 .../tags/{items => item}/piglin_loved.json | 0 .../data/BlockModelProvider.java | 38 ++-- .../computercraft/data/ItemModelProvider.java | 18 +- .../computercraft/data/LootTableProvider.java | 9 +- .../data/PocketUpgradeProvider.java | 2 +- .../computercraft/data/RecipeProvider.java | 22 +- .../data/TurtleUpgradeProvider.java | 4 +- .../impl/AbstractComputerCraftAPI.java | 6 +- .../computercraft/shared/CommonHooks.java | 2 +- .../computercraft/shared/ModRegistry.java | 10 +- .../shared/common/ClearColourRecipe.java | 14 +- .../shared/common/ColourableRecipe.java | 10 +- .../common/HorizontalContainerBlock.java | 8 +- .../shared/computer/core/ResourceMount.java | 6 +- .../computer/items/AbstractComputerItem.java | 3 +- .../shared/container/BasicContainer.java | 7 +- .../shared/container/ListContainer.java | 31 +++ .../shared/details/ItemDetails.java | 5 +- .../shared/integration/ExternalModTags.java | 2 +- .../integration/jei/JEIComputerCraft.java | 2 +- .../integration/jei/RecipeResolver.java | 2 +- .../shared/media/items/DiskItem.java | 3 +- .../shared/media/items/RecordMedia.java | 23 +- .../shared/media/items/TreasureDiskItem.java | 3 +- .../shared/media/recipes/DiskRecipe.java | 14 +- .../shared/media/recipes/PrintoutRecipe.java | 10 +- .../shared/network/NetworkMessages.java | 2 +- .../network/client/ClientNetworkContext.java | 5 +- .../client/PlayRecordClientMessage.java | 18 +- .../network/codec/MoreStreamCodecs.java | 2 +- .../diskdrive/DiskDriveBlockEntity.java | 10 +- .../diskdrive/DiskDrivePeripheral.java | 9 +- .../peripheral/diskdrive/MediaStack.java | 13 +- .../peripheral/speaker/SpeakerPeripheral.java | 8 +- .../shared/platform/PlatformHelper.java | 6 +- .../pocket/items/PocketComputerItem.java | 9 +- .../recipes/PocketComputerUpgradeRecipe.java | 19 +- .../shared/recipe/ImpostorShapedRecipe.java | 6 +- .../recipe/ImpostorShapelessRecipe.java | 6 +- .../shared/recipe/TransformShapedRecipe.java | 4 +- .../recipe/TransformShapelessRecipe.java | 4 +- .../recipe/function/CopyComponents.java | 6 +- .../recipe/function/RecipeFunction.java | 6 +- .../shared/turtle/core/TurtleBrain.java | 2 +- .../turtle/core/TurtleCraftCommand.java | 3 +- .../shared/turtle/inventory/UpgradeSlot.java | 4 +- .../turtle/recipes/TurtleUpgradeRecipe.java | 16 +- .../upgrades/TurtleInventoryCrafting.java | 214 ++++++------------ .../shared/turtle/upgrades/TurtleTool.java | 62 ++--- .../shared/util/ArgumentHelpers.java | 2 +- .../computercraft/TestPlatformHelper.java | 6 +- .../computercraft/gametest/Recipe_Test.kt | 18 +- .../computercraft/gametest/Speaker_Test.kt | 2 +- .../computercraft/gametest/Turtle_Test.kt | 13 +- .../gametest/api/TestExtensions.kt | 7 +- .../gametest/core/ClientTestHooks.kt | 2 +- .../api/network/wired/WiredElementLookup.java | 2 +- .../api/peripheral/PeripheralLookup.java | 2 +- .../client/model/CustomModelLoader.java | 5 +- .../model/turtle/UnbakedTurtleModel.java | 6 +- .../platform/ClientPlatformHelperImpl.java | 18 +- .../wireless_modem_normal.json | 0 .../computercraft/recipes/printed_book.json | 12 - .../computercraft/shared/ComputerCraft.java | 2 +- .../shared/platform/PlatformHelperImpl.java | 10 +- .../fabric/src/main/resources/fabric.mod.json | 4 +- .../computercraft/gametest/core/TestMod.java | 2 +- .../network/wired/WiredElementCapability.java | 2 +- .../api/peripheral/PeripheralCapability.java | 2 +- .../client/ForgeClientRegistry.java | 5 +- .../client/model/FoiledModel.java | 2 +- .../model/turtle/TurtleModelLoader.java | 6 +- .../platform/ClientPlatformHelperImpl.java | 18 +- .../wireless_modem_normal.json | 0 .../shared/platform/PlatformHelperImpl.java | 16 +- .../resources/META-INF/neoforge.mods.toml | 2 +- 292 files changed, 665 insertions(+), 655 deletions(-) create mode 100644 projects/common-api/src/client/java/dan200/computercraft/api/client/ModelLocation.java rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/decorations/skull_cloudy.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/decorations/skull_dan200.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/cable.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/computer_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/computer_advanced_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/computer_command.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/computer_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_1.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_10.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_11.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_12.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_13.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_14.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_15.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_16.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_2.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_3.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_4.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_5.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_6.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_7.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_8.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_9.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/disk_drive.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/monitor_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/monitor_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_advanced/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_advanced/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_advanced/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_computer_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_computer_advanced_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_computer_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_normal/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_normal/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/pocket_normal/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/printed_book.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/printed_pages.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/printer.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/minecraft/crafting_table.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/minecraft/diamond_axe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/minecraft/diamond_hoe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/minecraft/diamond_pickaxe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/minecraft/diamond_shovel.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced/minecraft/diamond_sword.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced_overlays/turtle_rainbow_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced_overlays/turtle_trans_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_advanced_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/minecraft/crafting_table.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/minecraft/diamond_axe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/minecraft/diamond_hoe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/minecraft/diamond_pickaxe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/minecraft/diamond_shovel.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal/minecraft/diamond_sword.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal_overlays/turtle_rainbow_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/turtle_normal_overlays/turtle_trans_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/wired_modem.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/wired_modem_full_from.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/wired_modem_full_to.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{advancements => advancement}/recipes/redstone/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/cable.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/computer_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/computer_command.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/computer_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/disk_drive.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/monitor_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/monitor_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/printer.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/turtle_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/turtle_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/wired_modem_full.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/blocks/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{loot_tables => loot_table}/treasure_disk.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/cable.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/clear_colour.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/colour.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/computer_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/computer_advanced_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/computer_command.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/computer_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_1.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_10.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_11.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_12.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_13.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_14.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_15.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_16.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_2.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_3.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_4.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_5.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_6.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_7.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_8.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_9.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/disk_drive.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/monitor_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/monitor_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_advanced/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_advanced/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_advanced/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_computer_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_computer_advanced_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_computer_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_computer_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_normal/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_normal/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/pocket_normal/computercraft/wireless_modem_normal.json (100%) rename projects/{forge/src/generated/resources/data/computercraft/recipes => common/src/generated/resources/data/computercraft/recipe}/printed_book.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/printed_pages.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/printer.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/skull_cloudy.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/skull_dan200.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/minecraft/crafting_table.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/minecraft/diamond_axe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/minecraft/diamond_hoe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/minecraft/diamond_pickaxe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/minecraft/diamond_shovel.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced/minecraft/diamond_sword.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced_overlays/turtle_rainbow_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced_overlays/turtle_trans_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_advanced_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/computercraft/speaker.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/computercraft/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/computercraft/wireless_modem_normal.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/minecraft/crafting_table.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/minecraft/diamond_axe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/minecraft/diamond_hoe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/minecraft/diamond_pickaxe.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/minecraft/diamond_shovel.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal/minecraft/diamond_sword.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal_overlays/turtle_rainbow_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_normal_overlays/turtle_trans_overlay.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/turtle_upgrade.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/wired_modem.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/wired_modem_full_from.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/wired_modem_full_to.json (100%) rename projects/common/src/generated/resources/data/computercraft/{recipes => recipe}/wireless_modem_advanced.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/computer.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/monitor.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/peripheral_hub_ignore.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/turtle.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/turtle_always_breakable.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/turtle_can_use.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/turtle_hoe_harvestable.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/turtle_shovel_harvestable.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/turtle_sword_harvestable.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{blocks => block}/wired_modem.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{items => item}/computer.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{items => item}/dyeable.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{items => item}/monitor.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{items => item}/turtle.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{items => item}/turtle_can_place.json (100%) rename projects/common/src/generated/resources/data/computercraft/tags/{items => item}/wired_modem.json (100%) rename projects/common/src/generated/resources/data/create/tags/{blocks => block}/brittle.json (100%) rename projects/common/src/generated/resources/data/minecraft/tags/{blocks => block}/mineable/pickaxe.json (100%) rename projects/common/src/generated/resources/data/minecraft/tags/{blocks => block}/wither_immune.json (100%) rename projects/common/src/generated/resources/data/minecraft/tags/{items => item}/bookshelf_books.json (100%) rename projects/common/src/generated/resources/data/minecraft/tags/{items => item}/piglin_loved.json (100%) create mode 100644 projects/common/src/main/java/dan200/computercraft/shared/container/ListContainer.java rename projects/fabric/src/generated/resources/data/computercraft/{recipes => recipe}/wireless_modem_normal.json (100%) delete mode 100644 projects/fabric/src/generated/resources/data/computercraft/recipes/printed_book.json rename projects/forge/src/generated/resources/data/computercraft/{recipes => recipe}/wireless_modem_normal.json (100%) diff --git a/buildSrc/src/main/kotlin/cc/tweaked/gradle/ForgeExtensions.kt b/buildSrc/src/main/kotlin/cc/tweaked/gradle/ForgeExtensions.kt index 9fca2ce6c..232b86d84 100644 --- a/buildSrc/src/main/kotlin/cc/tweaked/gradle/ForgeExtensions.kt +++ b/buildSrc/src/main/kotlin/cc/tweaked/gradle/ForgeExtensions.kt @@ -31,9 +31,9 @@ fun JavaExec.setRunConfig(config: Run) { environment(config.environmentVariables.get()) systemProperties(config.systemProperties.get()) - config.modSources.get().forEach { classpath(it.runtimeClasspath) } + config.modSources.all().get().values().forEach { classpath(it.runtimeClasspath) } classpath(config.classpath) - classpath(config.dependencies.get().configuration) + classpath(config.dependencies.get().runtimeConfiguration) (config as RunImpl).taskDependencies.forEach { dependsOn(it) } diff --git a/gradle.properties b/gradle.properties index 9d1b2e86a..1f95e3f29 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,9 +8,11 @@ org.gradle.parallel=true kotlin.stdlib.default.dependency=false kotlin.jvm.target.validation.mode=error +neogradle.subsystems.conventions.runs.enabled=false + # Mod properties isUnstable=true modVersion=1.111.0 # Minecraft properties: We want to configure this here so we can read it in settings.gradle -mcVersion=1.20.6 +mcVersion=1.21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3c4aa1f50..a0e738f2e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,14 +7,14 @@ # Minecraft # MC version is specified in gradle.properties, as we need that in settings.gradle. # Remember to update corresponding versions in fabric.mod.json/neoforge.mods.toml -fabric-api = "0.98.0+1.20.6" -fabric-loader = "0.15.10" -neoForge = "20.6.48-beta" +fabric-api = "0.100.3+1.21" +fabric-loader = "0.15.11" +neoForge = "21.0.21-beta" neoForgeSpi = "8.0.1" mixin = "0.8.5" -parchment = "2024.05.01" +parchment = "2024.06.16" parchmentMc = "1.20.6" -yarn = "1.20.6+build.1" +yarn = "1.21+build.1" # Core dependencies (these versions are tied to the version Minecraft uses) fastutil = "8.5.12" @@ -36,14 +36,14 @@ kotlin-coroutines = "1.7.3" nightConfig = "3.6.7" # Minecraft mods -emi = "1.1.5+1.20.6" +emi = "1.1.7+1.21" fabricPermissions = "0.3.1" iris = "1.6.14+1.20.4" -jei = "17.3.0.48" -modmenu = "9.0.0" +jei = "19.0.0.1" +modmenu = "11.0.0-rc.4" moreRed = "4.0.0.4" oculus = "1.2.5" -rei = "15.0.728" +rei = "16.0.729" rubidium = "0.6.1" sodium = "mc1.20-0.4.10" mixinExtra = "0.3.5" @@ -67,7 +67,7 @@ ideaExt = "1.1.7" illuaminate = "0.1.0-73-g43ee16c" lwjgl = "3.3.3" minotaur = "2.8.7" -neoGradle = "7.0.116" +neoGradle = "7.0.145" nullAway = "0.10.25" spotless = "6.23.3" taskTree = "2.1.1" @@ -106,9 +106,9 @@ fabric-junit = { module = "net.fabricmc:fabric-loader-junit", version.ref = "fab fabricPermissions = { module = "me.lucko:fabric-permissions-api", version.ref = "fabricPermissions" } emi = { module = "dev.emi:emi-xplat-mojmap", version.ref = "emi" } iris = { module = "maven.modrinth:iris", version.ref = "iris" } -jei-api = { module = "mezz.jei:jei-1.20.4-common-api", version.ref = "jei" } -jei-fabric = { module = "mezz.jei:jei-1.20.4-fabric", version.ref = "jei" } -jei-forge = { module = "mezz.jei:jei-1.20.4-forge", version.ref = "jei" } +jei-api = { module = "mezz.jei:jei-1.21-common-api", version.ref = "jei" } +jei-fabric = { module = "mezz.jei:jei-1.21-fabric", version.ref = "jei" } +jei-forge = { module = "mezz.jei:jei-1.21-neoforge", version.ref = "jei" } mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" } mixinExtra = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixinExtra" } modmenu = { module = "com.terraformersmc:modmenu", version.ref = "modmenu" } @@ -179,9 +179,9 @@ kotlin = ["kotlin-stdlib", "kotlin-coroutines"] # Minecraft externalMods-common = ["jei-api", "nightConfig-core", "nightConfig-toml"] externalMods-forge-compile = ["moreRed", "oculus", "jei-api"] -externalMods-forge-runtime = [] +externalMods-forge-runtime = ["jei-forge"] externalMods-fabric-compile = ["fabricPermissions", "iris", "jei-api", "rei-api", "rei-builtin"] -externalMods-fabric-runtime = [] # ["jei-fabric", "modmenu"] +externalMods-fabric-runtime = ["jei-fabric", "modmenu"] # Testing test = ["junit-jupiter-api", "junit-jupiter-params", "hamcrest", "jqwik-api"] diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/ModelLocation.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/ModelLocation.java new file mode 100644 index 000000000..0376fb786 --- /dev/null +++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/ModelLocation.java @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +package dan200.computercraft.api.client; + +import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; +import dan200.computercraft.impl.client.ClientPlatformHelper; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import java.util.stream.Stream; + +/** + * The location of a model to load. This may either be: + * + * + */ +public final class ModelLocation { + /** + * The location of the model. + *

+ * When {@link #resourceLocation} is null, this is the location of the model to load. When {@link #resourceLocation} + * is non-null, this is the "standalone" variant of the model resource — this is used by NeoForge's implementation + * of {@link ClientPlatformHelper#getModel(ModelManager, ModelResourceLocation, ResourceLocation)} to fetch the + * model from the model manger. It is not used on Fabric. + */ + private final ModelResourceLocation modelLocation; + private final @Nullable ResourceLocation resourceLocation; + + private ModelLocation(ModelResourceLocation modelLocation, @Nullable ResourceLocation resourceLocation) { + this.modelLocation = modelLocation; + this.resourceLocation = resourceLocation; + } + + /** + * Create a {@link ModelLocation} from model in the model manager. + * + * @param location The name of the model to load. + * @return The new {@link ModelLocation} instance. + */ + public static ModelLocation ofModel(ModelResourceLocation location) { + return new ModelLocation(location, null); + } + + /** + * Create a {@link ModelLocation} from a resource. + * + * @param location The location of the model resource, such as {@code minecraft:item/dirt}. + * @return The new {@link ModelLocation} instance. + */ + public static ModelLocation ofResource(ResourceLocation location) { + return new ModelLocation(new ModelResourceLocation(location, "standalone"), location); + } + + /** + * Get this model from the provided model manager. + * + * @param manager The model manger. + * @return This model, or the missing model if it could not be found. + */ + public BakedModel getModel(ModelManager manager) { + return ClientPlatformHelper.get().getModel(manager, modelLocation, resourceLocation); + } + + /** + * Get the models this model location depends on. + * + * @return A list of models that this model location depends on. + * @see TurtleUpgradeModeller#getDependencies() + */ + public Stream getDependencies() { + return resourceLocation == null ? Stream.empty() : Stream.of(resourceLocation); + } +} diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java index d3b58e9a0..a632920b4 100644 --- a/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java +++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java @@ -13,30 +13,47 @@ import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; -import java.util.Objects; - /** * A model to render, combined with a transformation matrix to apply. + * + * @param model The model. + * @param matrix The transformation matrix. */ -public final class TransformedModel { - private final BakedModel model; - private final Transformation matrix; - - public TransformedModel(BakedModel model, Transformation matrix) { - this.model = Objects.requireNonNull(model); - this.matrix = Objects.requireNonNull(matrix); - } - +public record TransformedModel(BakedModel model, Transformation matrix) { public TransformedModel(BakedModel model) { - this.model = Objects.requireNonNull(model); - matrix = Transformation.identity(); + this(model, Transformation.identity()); } + /** + * Look up a model in the model bakery and construct a {@link TransformedModel} with no transformation. + * + * @param location The location of the model to load. + * @return The new {@link TransformedModel} instance. + */ + public static TransformedModel of(ModelLocation location) { + var modelManager = Minecraft.getInstance().getModelManager(); + return new TransformedModel(location.getModel(modelManager)); + } + + /** + * Look up a model in the model bakery and construct a {@link TransformedModel} with no transformation. + * + * @param location The location of the model to load. + * @return The new {@link TransformedModel} instance. + * @see ModelLocation#ofModel(ModelResourceLocation) + */ public static TransformedModel of(ModelResourceLocation location) { var modelManager = Minecraft.getInstance().getModelManager(); return new TransformedModel(modelManager.getModel(location)); } + /** + * Look up a model in the model bakery and construct a {@link TransformedModel} with no transformation. + * + * @param location The location of the model to load. + * @return The new {@link TransformedModel} instance. + * @see ModelLocation#ofResource(ResourceLocation) + */ public static TransformedModel of(ResourceLocation location) { var modelManager = Minecraft.getInstance().getModelManager(); return new TransformedModel(ClientPlatformHelper.get().getModel(modelManager, location)); @@ -46,12 +63,4 @@ public final class TransformedModel { var model = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getItemModel(item); return new TransformedModel(model, transform); } - - public BakedModel getModel() { - return model; - } - - public Transformation getMatrix() { - return matrix; - } } diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java index f927547b0..4adfc8d91 100644 --- a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java +++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/TurtleUpgradeModeller.java @@ -4,6 +4,7 @@ package dan200.computercraft.api.client.turtle; +import dan200.computercraft.api.client.ModelLocation; import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.ITurtleUpgrade; @@ -77,6 +78,18 @@ public interface TurtleUpgradeModeller { * @return The constructed modeller. */ static TurtleUpgradeModeller sided(ResourceLocation left, ResourceLocation right) { + return sided(ModelLocation.ofResource(left), ModelLocation.ofResource(right)); + } + + /** + * Construct a {@link TurtleUpgradeModeller} which has a single model for the left and right side. + * + * @param left The model to use on the left. + * @param right The model to use on the right. + * @param The type of the turtle upgrade. + * @return The constructed modeller. + */ + static TurtleUpgradeModeller sided(ModelLocation left, ModelLocation right) { return new TurtleUpgradeModeller<>() { @Override public TransformedModel getModel(T upgrade, @Nullable ITurtleAccess turtle, TurtleSide side, DataComponentPatch data) { @@ -85,7 +98,7 @@ public interface TurtleUpgradeModeller { @Override public Stream getDependencies() { - return Stream.of(left, right); + return Stream.of(left, right).flatMap(ModelLocation::getDependencies); } }; } diff --git a/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java b/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java index 2f79ed05d..7d104c0a3 100644 --- a/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java +++ b/projects/common-api/src/client/java/dan200/computercraft/impl/client/ClientPlatformHelper.java @@ -4,6 +4,7 @@ package dan200.computercraft.impl.client; +import dan200.computercraft.api.client.ModelLocation; import dan200.computercraft.impl.Services; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.resources.model.BakedModel; @@ -17,13 +18,28 @@ import javax.annotation.Nullable; @ApiStatus.Internal public interface ClientPlatformHelper { /** - * Equivalent to {@link ModelManager#getModel(ModelResourceLocation)} but for arbitrary {@link ResourceLocation}s. + * Get a model from a resource. * - * @param manager The model manager. - * @param location The model location. + * @param manager The model manager. + * @param resourceLocation The model resourceLocation. * @return The baked model. + * @see ModelLocation */ - BakedModel getModel(ModelManager manager, ResourceLocation location); + BakedModel getModel(ModelManager manager, ResourceLocation resourceLocation); + + /** + * Set a model from a {@link ModelResourceLocation} or {@link ResourceLocation}. + *

+ * This is largely equivalent to {@code resourceLocation == null ? manager.getModel(modelLocation) : getModel(manager, resourceLocation)}, + * but allows pre-computing {@code modelLocation} (if needed). + * + * @param manager The model manager. + * @param modelLocation The location of the model to load. + * @param resourceLocation The location of the resource, if trying to load from a resource. + * @return The baked model. + * @see ModelLocation + */ + BakedModel getModel(ModelManager manager, ModelResourceLocation modelLocation, @Nullable ResourceLocation resourceLocation); /** * Wrap this model in a version which renders a foil/enchantment glint. diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftTags.java b/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftTags.java index 469e12407..042ea59c1 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftTags.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftTags.java @@ -46,7 +46,7 @@ public class ComputerCraftTags { public static final TagKey DYEABLE = make("dyeable"); private static TagKey make(String name) { - return TagKey.create(Registries.ITEM, new ResourceLocation(ComputerCraftAPI.MOD_ID, name)); + return TagKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name)); } } @@ -91,7 +91,7 @@ public class ComputerCraftTags { public static final TagKey TURTLE_CAN_USE = make("turtle_can_use"); private static TagKey make(String name) { - return TagKey.create(Registries.BLOCK, new ResourceLocation(ComputerCraftAPI.MOD_ID, name)); + return TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name)); } } } diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java b/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java index 045698aaa..1417a8e2f 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/media/IMedia.java @@ -7,11 +7,13 @@ package dan200.computercraft.api.media; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.filesystem.Mount; import dan200.computercraft.api.filesystem.WritableMount; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundEvent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.JukeboxSong; import javax.annotation.Nullable; @@ -25,11 +27,12 @@ public interface IMedia { /** * Get a string representing the label of this item. Will be called via {@code disk.getLabel()} in lua. * - * @param stack The {@link ItemStack} to inspect. + * @param registries The currently loaded registries. + * @param stack The {@link ItemStack} to inspect. * @return The label. ie: "Dan's Programs". */ @Nullable - String getLabel(ItemStack stack); + String getLabel(HolderLookup.Provider registries, ItemStack stack); /** * Set a string representing the label of this item. Will be called vi {@code disk.setLabel()} in lua. @@ -43,26 +46,15 @@ public interface IMedia { } /** - * If this disk represents an item with audio (like a record), get the readable name of the audio track. ie: - * "Jonathan Coulton - Still Alive" + * If this disk represents an item with audio (like a record), get the corresponding {@link JukeboxSong}. * - * @param stack The {@link ItemStack} to modify. - * @return The name, or null if this item does not represent an item with audio. + * @param registries The currently loaded registries. + * @param stack The {@link ItemStack} to query. + * @return The song, or null if this item does not represent an item with audio. */ @Nullable - default String getAudioTitle(ItemStack stack) { - return null; - } - - /** - * If this disk represents an item with audio (like a record), get the resource name of the audio track to play. - * - * @param stack The {@link ItemStack} to modify. - * @return The name, or null if this item does not represent an item with audio. - */ - @Nullable - default SoundEvent getAudio(ItemStack stack) { - return null; + default Holder getAudio(HolderLookup.Provider registries, ItemStack stack) { + return JukeboxSong.fromStack(registries, stack).orElse(null); } /** diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java b/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java index 7cfe90407..1b3c9c42f 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/pocket/IPocketUpgrade.java @@ -48,7 +48,7 @@ import javax.annotation.Nullable; * } */ public interface IPocketUpgrade extends UpgradeBase { - ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(ComputerCraftAPI.MOD_ID, "pocket_upgrade")); + ResourceKey> REGISTRY = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "pocket_upgrade")); /** * The registry key for pocket upgrade types. diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java index b5b138343..4241d501a 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java @@ -57,7 +57,7 @@ public interface ITurtleUpgrade extends UpgradeBase { /** * The registry in which turtle upgrades are stored. */ - ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(ComputerCraftAPI.MOD_ID, "turtle_upgrade")); + ResourceKey> REGISTRY = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "turtle_upgrade")); /** * Create a {@link ResourceKey} for a turtle upgrade given a {@link ResourceLocation}. diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleToolBuilder.java b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleToolBuilder.java index 735718bf1..485dad265 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleToolBuilder.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/turtle/TurtleToolBuilder.java @@ -35,7 +35,7 @@ import java.util.Optional; * import net.minecraft.world.item.Items; * * public void registerTool(BootstrapContext upgrades) { - * TurtleToolBuilder.tool(new ResourceLocation("my_mod", "wooden_pickaxe"), Items.WOODEN_PICKAXE).register(upgrades); + * TurtleToolBuilder.tool(ResourceLocation.fromNamespaceAndPath("my_mod", "wooden_pickaxe"), Items.WOODEN_PICKAXE).register(upgrades); * } *} */ diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeType.java b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeType.java index 0d6781e4b..268ae5e2a 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeType.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/upgrades/UpgradeType.java @@ -55,7 +55,7 @@ import java.util.function.Function; * public void generate(DataGenerator.PackGenerator output, CompletableFuture registries) { * var newRegistries = RegistryPatchGenerator.createLookup(registries, Util.make(new RegistrySetBuilder(), builder -> { * builder.add(ITurtleUpgrade.REGISTRY, upgrades -> { - * upgrades.register(ITurtleUpgrade.createKey(new ResourceLocation("my_mod", "my_upgrade")), new MyUpgrade()); + * upgrades.register(ITurtleUpgrade.createKey(ResourceLocation.fromNamespaceAndPath("my_mod", "my_upgrade")), new MyUpgrade()); * }); * })); * output.addProvider(o -> new DatapackBuiltinEntriesProvider(o, newRegistries, Set.of("my_mod"))); diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java index 3aeb87644..ddc566f17 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java +++ b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java @@ -118,12 +118,12 @@ public final class ClientRegistry { public static void registerTurtleModellers(RegisterTurtleUpgradeModeller register) { register.register(ModRegistry.TurtleUpgradeTypes.SPEAKER.get(), TurtleUpgradeModeller.sided( - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_left"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_right") + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_left"), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_right") )); register.register(ModRegistry.TurtleUpgradeTypes.WORKBENCH.get(), TurtleUpgradeModeller.sided( - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_left"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_right") + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_left"), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_right") )); register.register(ModRegistry.TurtleUpgradeTypes.WIRELESS_MODEM.get(), new TurtleModemModeller()); register.register(ModRegistry.TurtleUpgradeTypes.TOOL.get(), TurtleUpgradeModeller.flatItem()); @@ -131,7 +131,7 @@ public final class ClientRegistry { @SafeVarargs private static void registerItemProperty(RegisterItemProperty itemProperties, String name, ClampedItemPropertyFunction getter, Supplier... items) { - var id = new ResourceLocation(ComputerCraftAPI.MOD_ID, name); + var id = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name); for (var item : items) itemProperties.register(item.get(), id, getter); } @@ -155,7 +155,7 @@ public final class ClientRegistry { }; public static void registerExtraModels(Consumer register) { - for (var model : EXTRA_MODELS) register.accept(new ResourceLocation(ComputerCraftAPI.MOD_ID, model)); + for (var model : EXTRA_MODELS) register.accept(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, model)); TurtleUpgradeModellers.getDependencies().forEach(register); } diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/DiskDriveScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/DiskDriveScreen.java index 86fcbba52..70a8ed8db 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/DiskDriveScreen.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/DiskDriveScreen.java @@ -15,7 +15,7 @@ import net.minecraft.world.entity.player.Inventory; * The GUI for disk drives. */ public class DiskDriveScreen extends AbstractContainerScreen { - private static final ResourceLocation BACKGROUND = new ResourceLocation("computercraft", "textures/gui/disk_drive.png"); + private static final ResourceLocation BACKGROUND = ResourceLocation.fromNamespaceAndPath("computercraft", "textures/gui/disk_drive.png"); public DiskDriveScreen(DiskDriveMenu container, Inventory player, Component title) { super(container, player, title); diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java b/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java index 63b152dfe..e6025c221 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/GuiSprites.java @@ -21,7 +21,7 @@ import java.util.stream.Stream; * Sprite sheet for all GUI texutres in the mod. */ public final class GuiSprites extends TextureAtlasHolder { - public static final ResourceLocation SPRITE_SHEET = new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui"); + public static final ResourceLocation SPRITE_SHEET = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui"); public static final ResourceLocation TEXTURE = SPRITE_SHEET.withPath(x -> "textures/atlas/" + x + ".png"); public static final ButtonTextures TURNED_OFF = button("turned_off"); @@ -35,16 +35,16 @@ public final class GuiSprites extends TextureAtlasHolder { private static ButtonTextures button(String name) { return new ButtonTextures( - new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/buttons/" + name), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/buttons/" + name + "_hover") + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/buttons/" + name), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/buttons/" + name + "_hover") ); } private static ComputerTextures computer(String name, boolean pocket, boolean sidebar) { return new ComputerTextures( - new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/border_" + name), - pocket ? new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/pocket_bottom_" + name) : null, - sidebar ? new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/sidebar_" + name) : null + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/border_" + name), + pocket ? ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/pocket_bottom_" + name) : null, + sidebar ? ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/sidebar_" + name) : null ); } diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/ItemToast.java b/projects/common/src/client/java/dan200/computercraft/client/gui/ItemToast.java index 850db86ee..b3bfd4294 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/ItemToast.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/ItemToast.java @@ -19,7 +19,7 @@ import java.util.List; * A {@link Toast} implementation which displays an arbitrary message along with an optional {@link ItemStack}. */ public class ItemToast implements Toast { - private static final ResourceLocation TEXTURE = new ResourceLocation("toast/recipe"); + private static final ResourceLocation TEXTURE = ResourceLocation.withDefaultNamespace("toast/recipe"); public static final Object TRANSFER_NO_RESPONSE_TOKEN = new Object(); private static final long DISPLAY_TIME = 7000L; diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java index 36e74a698..0cf39fa21 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/OptionScreen.java @@ -24,7 +24,7 @@ import static dan200.computercraft.core.util.Nullability.assertNonNull; * When closed, it returns to the previous screen. */ public final class OptionScreen extends Screen { - private static final ResourceLocation BACKGROUND = new ResourceLocation("computercraft", "textures/gui/blank_screen.png"); + private static final ResourceLocation BACKGROUND = ResourceLocation.fromNamespaceAndPath("computercraft", "textures/gui/blank_screen.png"); public static final int BUTTON_WIDTH = 100; public static final int BUTTON_HEIGHT = 20; diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/PrinterScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/PrinterScreen.java index acc380536..70deac9c2 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/PrinterScreen.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/PrinterScreen.java @@ -15,7 +15,7 @@ import net.minecraft.world.entity.player.Inventory; * The GUI for printers. */ public class PrinterScreen extends AbstractContainerScreen { - private static final ResourceLocation BACKGROUND = new ResourceLocation("computercraft", "textures/gui/printer.png"); + private static final ResourceLocation BACKGROUND = ResourceLocation.fromNamespaceAndPath("computercraft", "textures/gui/printer.png"); public PrinterScreen(PrinterMenu container, Inventory player, Component title) { super(container, player, title); diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java index fa1add725..231faabbb 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/PrintoutScreen.java @@ -4,7 +4,6 @@ package dan200.computercraft.client.gui; -import com.mojang.blaze3d.vertex.Tesselator; import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.common.HeldItemMenu; @@ -12,7 +11,6 @@ import dan200.computercraft.shared.media.items.PrintoutData; import dan200.computercraft.shared.media.items.PrintoutItem; import net.minecraft.client.gui.GuiGraphics; 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 org.lwjgl.glfw.GLFW; @@ -90,10 +88,8 @@ public class PrintoutScreen extends AbstractContainerScreen { graphics.pose().pushPose(); graphics.pose().translate(0, 0, 1); - var renderer = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); - drawBorder(graphics.pose(), renderer, leftPos, topPos, 0, page, pages, book, FULL_BRIGHT_LIGHTMAP); - drawText(graphics.pose(), renderer, leftPos + X_TEXT_MARGIN, topPos + Y_TEXT_MARGIN, PrintoutData.LINES_PER_PAGE * page, FULL_BRIGHT_LIGHTMAP, text, colours); - renderer.endBatch(); + drawBorder(graphics.pose(), graphics.bufferSource(), leftPos, topPos, 0, page, pages, book, FULL_BRIGHT_LIGHTMAP); + drawText(graphics.pose(), graphics.bufferSource(), leftPos + X_TEXT_MARGIN, topPos + Y_TEXT_MARGIN, PrintoutData.LINES_PER_PAGE * page, FULL_BRIGHT_LIGHTMAP, text, colours); graphics.pose().popPose(); } diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/TurtleScreen.java b/projects/common/src/client/java/dan200/computercraft/client/gui/TurtleScreen.java index c401be67a..381bd6219 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/TurtleScreen.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/TurtleScreen.java @@ -23,8 +23,8 @@ import static dan200.computercraft.shared.turtle.inventory.TurtleMenu.*; * The GUI for turtles. */ public class TurtleScreen extends AbstractComputerScreen { - private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "textures/gui/turtle_normal.png"); - private static final ResourceLocation BACKGROUND_ADVANCED = new ResourceLocation(ComputerCraftAPI.MOD_ID, "textures/gui/turtle_advanced.png"); + private static final ResourceLocation BACKGROUND_NORMAL = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "textures/gui/turtle_normal.png"); + private static final ResourceLocation BACKGROUND_ADVANCED = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "textures/gui/turtle_advanced.png"); private static final int TEX_WIDTH = 278; private static final int TEX_HEIGHT = 217; diff --git a/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/TerminalWidget.java b/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/TerminalWidget.java index 3b7b69f57..50a0f35d4 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/TerminalWidget.java +++ b/projects/common/src/client/java/dan200/computercraft/client/gui/widgets/TerminalWidget.java @@ -4,7 +4,6 @@ package dan200.computercraft.client.gui.widgets; -import com.mojang.blaze3d.vertex.Tesselator; import dan200.computercraft.client.render.RenderTypes; import dan200.computercraft.client.render.text.FixedWidthFontRenderer; import dan200.computercraft.core.terminal.Terminal; @@ -16,7 +15,6 @@ import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarratedElementType; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.Component; import org.lwjgl.glfw.GLFW; @@ -259,15 +257,12 @@ public class TerminalWidget extends AbstractWidget { public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (!visible) return; - var bufferSource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); - var emitter = FixedWidthFontRenderer.toVertexConsumer(graphics.pose(), bufferSource.getBuffer(RenderTypes.TERMINAL)); + var emitter = FixedWidthFontRenderer.toVertexConsumer(graphics.pose(), graphics.bufferSource().getBuffer(RenderTypes.TERMINAL)); FixedWidthFontRenderer.drawTerminal( emitter, (float) innerX, (float) innerY, terminal, (float) MARGIN, (float) MARGIN, (float) MARGIN, (float) MARGIN ); - - bufferSource.endBatch(); } @Override diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java index c512f0c0d..72c7e3bd5 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java @@ -4,11 +4,9 @@ package dan200.computercraft.client.model.turtle; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.blaze3d.vertex.VertexFormatElement; import com.mojang.math.Transformation; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.FaceBakery; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import org.joml.Matrix4f; @@ -29,8 +27,8 @@ import java.util.List; public class ModelTransformer { private static final int[] INVERSE_ORDER = new int[]{ 3, 2, 1, 0 }; - private static final int STRIDE = DefaultVertexFormat.BLOCK.getIntegerSize(); - private static final int POS_OFFSET = findOffset(DefaultVertexFormat.BLOCK, DefaultVertexFormat.ELEMENT_POSITION); + private static final int STRIDE = FaceBakery.VERTEX_INT_SIZE; + private static final int POS_OFFSET = 0; protected final Matrix4f transformation; protected final boolean invert; @@ -91,13 +89,4 @@ public class ModelTransformer { private record TransformedQuads(List original, List transformed) { } - - private static int findOffset(VertexFormat format, VertexFormatElement element) { - var offset = 0; - for (var other : format.getElements()) { - if (other == element) return offset / Integer.BYTES; - offset += element.getByteSize(); - } - throw new IllegalArgumentException("Cannot find " + element + " in " + format); - } } diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java index f8da518c8..f714a64f2 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java +++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java @@ -85,7 +85,7 @@ public final class TurtleModelParts { public TurtleModelParts(BakedModel familyModel, BakedModel colourModel, ModelTransformer transformer, Function, T> combineModel) { this.familyModel = familyModel; this.colourModel = colourModel; - this.transformer = x -> transformer.transform(x.getModel(), x.getMatrix()); + this.transformer = x -> transformer.transform(x.model(), x.matrix()); buildModel = x -> combineModel.apply(buildModel(x)); } @@ -127,7 +127,7 @@ public final class TurtleModelParts { private void addUpgrade(List parts, Transformation transformation, TurtleSide side, @Nullable UpgradeData upgrade) { if (upgrade == null) return; var model = TurtleUpgradeModellers.getModel(upgrade.upgrade(), upgrade.data(), side); - parts.add(transform(model.getModel(), transformation.compose(model.getMatrix()))); + parts.add(transform(model.model(), transformation.compose(model.matrix()))); } private BakedModel transform(BakedModel model, Transformation transformation) { diff --git a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java index ca3d9f9e7..45fc090a2 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java +++ b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java @@ -21,10 +21,11 @@ import dan200.computercraft.shared.peripheral.speaker.EncodedAudio; import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.JukeboxSong; import net.minecraft.world.level.Level; import javax.annotation.Nullable; @@ -60,10 +61,12 @@ public final class ClientNetworkContextImpl implements ClientNetworkContext { } @Override - public void handlePlayRecord(BlockPos pos, @Nullable SoundEvent sound, @Nullable String name) { - var mc = Minecraft.getInstance(); - ClientPlatformHelper.get().playStreamingMusic(pos, sound); - if (name != null) mc.gui.setNowPlaying(Component.literal(name)); + public void handlePlayRecord(BlockPos pos, @Nullable Holder song) { + if (song == null) { + Minecraft.getInstance().levelRenderer.stopJukeboxSongAndNotifyNearby(pos); + } else { + Minecraft.getInstance().levelRenderer.playJukeboxSong(song, pos); + } } @Override diff --git a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java index 63d956756..665e22da2 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java +++ b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java @@ -7,8 +7,6 @@ package dan200.computercraft.client.platform; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.sounds.SoundEvent; import javax.annotation.Nullable; @@ -28,13 +26,4 @@ public interface ClientPlatformHelper extends dan200.computercraft.impl.client.C * @param tints Block colour tints to apply to the model. */ void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints); - - /** - * Play a record at a particular position. - * - * @param pos The position to play this record. - * @param sound The record to play, or {@code null} to stop it. - * @see net.minecraft.client.renderer.LevelRenderer#playStreamingMusic(SoundEvent, BlockPos) - */ - void playStreamingMusic(BlockPos pos, @Nullable SoundEvent sound); } diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/CableHighlightRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/CableHighlightRenderer.java index e0a629403..c9208d1f7 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/CableHighlightRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/CableHighlightRenderer.java @@ -62,15 +62,13 @@ public final class CableHighlightRenderer { zDelta = zDelta / len; buffer - .vertex(matrix4f, (float) (x1 + xOffset), (float) (y1 + yOffset), (float) (z1 + zOffset)) - .color(0, 0, 0, 0.4f) - .normal(transform.last(), xDelta, yDelta, zDelta) - .endVertex(); + .addVertex(matrix4f, (float) (x1 + xOffset), (float) (y1 + yOffset), (float) (z1 + zOffset)) + .setColor(0, 0, 0, 0.4f) + .setNormal(transform.last(), xDelta, yDelta, zDelta); buffer - .vertex(matrix4f, (float) (x2 + xOffset), (float) (y2 + yOffset), (float) (z2 + zOffset)) - .color(0, 0, 0, 0.4f) - .normal(transform.last(), xDelta, yDelta, zDelta) - .endVertex(); + .addVertex(matrix4f, (float) (x2 + xOffset), (float) (y2 + yOffset), (float) (z2 + zOffset)) + .setColor(0, 0, 0, 0.4f) + .setNormal(transform.last(), xDelta, yDelta, zDelta); }); return true; diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java index f054f3f40..4e4019430 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java @@ -50,28 +50,23 @@ public final class ModelRenderer { if (idx >= 0 && idx < tints.length) tint = tints[bakedquad.getTintIndex()]; } - var r = (float) (tint >> 16 & 255) / 255.0F; - var g = (float) (tint >> 8 & 255) / 255.0F; - var b = (float) (tint & 255) / 255.0F; - putBulkQuad(buffer, matrix, bakedquad, r, g, b, lightmapCoord, overlayLight, inverted); + putBulkQuad(buffer, matrix, bakedquad, tint, lightmapCoord, overlayLight, inverted); } } /** - * A version of {@link VertexConsumer#putBulkData(PoseStack.Pose, BakedQuad, float, float, float, int, int)} which + * A version of {@link VertexConsumer#putBulkData(PoseStack.Pose, BakedQuad, float, float, float, float, int, int)} which * will reverse vertex order when the matrix is inverted. * * @param buffer The buffer to draw to. * @param pose The current matrix stack. * @param quad The quad to draw. - * @param red The red tint of this quad. - * @param green The green tint of this quad. - * @param blue The blue tint of this quad. + * @param colour The tint for this quad. * @param lightmapCoord The lightmap coordinate * @param overlayLight The overlay light. * @param invert Whether to reverse the order of this quad. */ - private static void putBulkQuad(VertexConsumer buffer, PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, int lightmapCoord, int overlayLight, boolean invert) { + private static void putBulkQuad(VertexConsumer buffer, PoseStack.Pose pose, BakedQuad quad, int colour, int lightmapCoord, int overlayLight, boolean invert) { var matrix = pose.pose(); // It's a little dubious to transform using this matrix rather than the normal matrix. This mirrors the logic in // Direction.rotate (so not out of nowhere!), but is a little suspicious. @@ -93,9 +88,9 @@ public final class ModelRenderer { var u = Float.intBitsToFloat(vertices[i + 4]); var v = Float.intBitsToFloat(vertices[i + 5]); - buffer.vertex( + buffer.addVertex( vector.x(), vector.y(), vector.z(), - red, green, blue, 1.0F, u, v, overlayLight, lightmapCoord, + colour, u, v, overlayLight, lightmapCoord, normalX, normalY, normalZ ); } diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/PrintoutRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/PrintoutRenderer.java index f8eec2b96..68bbfaacf 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/PrintoutRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/PrintoutRenderer.java @@ -158,7 +158,7 @@ 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).uv(u, v).uv2(light).endVertex(); + buffer.addVertex(matrix, x, y, z).setColor(255, 255, 255, 255).setUv(u, v).setLight(light); } public static float offsetAt(int page) { diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java b/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java index 3a701e4ed..3868c472d 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/RenderTypes.java @@ -52,7 +52,7 @@ public class RenderTypes { * Printout's background texture. {@link RenderType#text(ResourceLocation)} is a little questionable, but * it is what maps use, so should behave the same as vanilla in both item frames and in-hand. */ - public static final RenderType PRINTOUT_BACKGROUND = RenderType.text(new ResourceLocation("computercraft", "textures/gui/printout.png")); + public static final RenderType PRINTOUT_BACKGROUND = RenderType.text(ResourceLocation.fromNamespaceAndPath("computercraft", "textures/gui/printout.png")); /** * Render type for {@linkplain GuiSprites GUI sprites}. diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/SpriteRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/SpriteRenderer.java index e9cb768f5..bb1a3d02e 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/SpriteRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/SpriteRenderer.java @@ -118,10 +118,10 @@ public class SpriteRenderer { */ public void blit( int x, int y, int width, int height, float u0, float v0, float u1, float v1) { - builder.vertex(transform, x, y + height, z).color(r, g, b, 255).uv(u0, v1).uv2(light).endVertex(); - builder.vertex(transform, x + width, y + height, z).color(r, g, b, 255).uv(u1, v1).uv2(light).endVertex(); - builder.vertex(transform, x + width, y, z).color(r, g, b, 255).uv(u1, v0).uv2(light).endVertex(); - builder.vertex(transform, x, y, z).color(r, g, b, 255).uv(u0, v0).uv2(light).endVertex(); + builder.addVertex(transform, x, y + height, z).setColor(r, g, b, 255).setUv(u0, v1).setLight(light); + builder.addVertex(transform, x + width, y + height, z).setColor(r, g, b, 255).setUv(u1, v1).setLight(light); + builder.addVertex(transform, x + width, y, z).setColor(r, g, b, 255).setUv(u1, v0).setLight(light); + builder.addVertex(transform, x, y, z).setColor(r, g, b, 255).setUv(u0, v0).setLight(light); } public static float u(TextureAtlasSprite sprite, int x, int width) { diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java index caf56621e..5890d40ad 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java @@ -27,8 +27,8 @@ import net.minecraft.world.phys.HitResult; import javax.annotation.Nullable; public class TurtleBlockEntityRenderer implements BlockEntityRenderer { - private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); - private static final ResourceLocation ELF_OVERLAY_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_elf_overlay"); + private static final ResourceLocation COLOUR_TURTLE_MODEL = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); + private static final ResourceLocation ELF_OVERLAY_MODEL = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_elf_overlay"); private final BlockEntityRenderDispatcher renderer; private final Font font; @@ -121,8 +121,8 @@ public class TurtleBlockEntityRenderer implements BlockEntityRenderer { var backgroundBuffer = assertNonNull(renderState.backgroundBuffer); @@ -242,13 +245,13 @@ public class MonitorBlockEntityRenderer implements BlockEntityRenderer *

  • No transformation matrix (not needed for VBOs).
  • *
  • Only works with {@link DefaultVertexFormat#POSITION_COLOR_TEX_LIGHTMAP}.
  • - *
  • The buffer MUST be allocated with {@link MemoryTracker}, and not through any other means.
  • + *
  • The buffer MUST be allocated with {@link MemoryUtil}, and not through any other means.
  • * *

    * Note this is almost an exact copy of {@link FixedWidthFontRenderer}. While the code duplication is unfortunate, diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java index 1111d06d3..b2d495ba4 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/text/FixedWidthFontRenderer.java @@ -32,7 +32,7 @@ import static dan200.computercraft.client.render.RenderTypes.FULL_BRIGHT_LIGHTMA * {@link DirectFixedWidthFontRenderer}. */ public final class FixedWidthFontRenderer { - public static final ResourceLocation FONT = new ResourceLocation("computercraft", "textures/gui/term_font.png"); + public static final ResourceLocation FONT = ResourceLocation.fromNamespaceAndPath("computercraft", "textures/gui/term_font.png"); public static final int FONT_HEIGHT = 9; public static final int FONT_WIDTH = 6; @@ -221,9 +221,9 @@ public final class FixedWidthFontRenderer { var consumer = c.consumer(); byte r = rgba[0], g = rgba[1], b = rgba[2], a = rgba[3]; - consumer.vertex(poseMatrix, x1, y1, z).color(r, g, b, a).uv(u1, v1).uv2(light).endVertex(); - consumer.vertex(poseMatrix, x1, y2, z).color(r, g, b, a).uv(u1, v2).uv2(light).endVertex(); - consumer.vertex(poseMatrix, x2, y2, z).color(r, g, b, a).uv(u2, v2).uv2(light).endVertex(); - consumer.vertex(poseMatrix, x2, y1, z).color(r, g, b, a).uv(u2, v1).uv2(light).endVertex(); + consumer.addVertex(poseMatrix, x1, y1, z).setColor(r, g, b, a).setUv(u1, v1).setLight(light); + consumer.addVertex(poseMatrix, x1, y2, z).setColor(r, g, b, a).setUv(u1, v2).setLight(light); + consumer.addVertex(poseMatrix, x2, y2, z).setColor(r, g, b, a).setUv(u2, v2).setLight(light); + consumer.addVertex(poseMatrix, x2, y1, z).setColor(r, g, b, a).setUv(u2, v1).setLight(light); } } diff --git a/projects/common/src/client/java/dan200/computercraft/client/sound/SpeakerInstance.java b/projects/common/src/client/java/dan200/computercraft/client/sound/SpeakerInstance.java index c3957168c..c297f5b50 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/sound/SpeakerInstance.java +++ b/projects/common/src/client/java/dan200/computercraft/client/sound/SpeakerInstance.java @@ -17,7 +17,7 @@ import javax.annotation.Nullable; * An instance of a speaker, which is either playing a {@link DfpwmStream} stream or a normal sound. */ public class SpeakerInstance { - public static final ResourceLocation DFPWM_STREAM = new ResourceLocation(ComputerCraftAPI.MOD_ID, "speaker.dfpwm_fake_audio_should_not_be_played"); + public static final ResourceLocation DFPWM_STREAM = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "speaker.dfpwm_fake_audio_should_not_be_played"); private @Nullable DfpwmStream currentStream; private @Nullable SpeakerSound sound; diff --git a/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleModemModeller.java b/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleModemModeller.java index 29367c358..86cb6fc4c 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleModemModeller.java +++ b/projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleModemModeller.java @@ -5,6 +5,7 @@ package dan200.computercraft.client.turtle; import dan200.computercraft.api.ComputerCraftAPI; +import dan200.computercraft.api.client.ModelLocation; import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; import dan200.computercraft.api.turtle.ITurtleAccess; @@ -38,23 +39,23 @@ public class TurtleModemModeller implements TurtleUpgradeModeller { } private record ModemModels( - ResourceLocation leftOffModel, ResourceLocation rightOffModel, - ResourceLocation leftOnModel, ResourceLocation rightOnModel + ModelLocation leftOffModel, ModelLocation rightOffModel, + ModelLocation leftOnModel, ModelLocation rightOnModel ) { private static final ModemModels NORMAL = create("normal"); private static final ModemModels ADVANCED = create("advanced"); public static ModemModels create(String type) { return new ModemModels( - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_off_left"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_off_right"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_on_left"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_on_right") + ModelLocation.ofResource(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_off_left")), + ModelLocation.ofResource(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_off_right")), + ModelLocation.ofResource(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_on_left")), + ModelLocation.ofResource(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_modem_" + type + "_on_right")) ); } public Stream getDependencies() { - return Stream.of(leftOffModel, rightOffModel, leftOnModel, rightOnModel); + return Stream.of(leftOffModel, rightOffModel, leftOnModel, rightOnModel).flatMap(ModelLocation::getDependencies); } } } diff --git a/projects/common/src/client/java/dan200/computercraft/data/client/ClientDataProviders.java b/projects/common/src/client/java/dan200/computercraft/data/client/ClientDataProviders.java index 76891e250..45c188f31 100644 --- a/projects/common/src/client/java/dan200/computercraft/data/client/ClientDataProviders.java +++ b/projects/common/src/client/java/dan200/computercraft/data/client/ClientDataProviders.java @@ -28,7 +28,7 @@ public final class ClientDataProviders { public static void add(DataProviders.GeneratorSink generator) { generator.addFromCodec("Block atlases", PackType.CLIENT_RESOURCES, "atlases", SpriteSources.FILE_CODEC, out -> { - out.accept(new ResourceLocation("blocks"), List.of( + out.accept(ResourceLocation.withDefaultNamespace("blocks"), List.of( new SingleFile(UpgradeSlot.LEFT_UPGRADE, Optional.empty()), new SingleFile(UpgradeSlot.RIGHT_UPGRADE, Optional.empty()) )); diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/decorations/skull_cloudy.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/decorations/skull_cloudy.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/decorations/skull_cloudy.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/decorations/skull_cloudy.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/decorations/skull_dan200.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/decorations/skull_dan200.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/decorations/skull_dan200.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/decorations/skull_dan200.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/cable.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/cable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/cable.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/cable.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_advanced_upgrade.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_advanced_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_advanced_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_advanced_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_command.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_command.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_command.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_command.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/computer_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/computer_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_1.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_1.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_1.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_1.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_10.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_10.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_10.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_10.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_11.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_11.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_11.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_11.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_12.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_12.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_12.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_12.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_13.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_13.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_13.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_13.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_14.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_14.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_14.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_14.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_15.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_15.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_15.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_15.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_16.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_16.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_16.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_16.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_2.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_2.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_2.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_2.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_3.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_3.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_3.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_3.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_4.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_4.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_4.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_4.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_5.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_5.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_5.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_5.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_6.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_6.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_6.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_6.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_7.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_7.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_7.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_7.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_8.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_8.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_8.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_8.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_9.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_9.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_9.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_9.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_drive.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_drive.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/disk_drive.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/disk_drive.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/monitor_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/monitor_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/monitor_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/monitor_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/monitor_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/monitor_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/monitor_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/monitor_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_advanced/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_advanced/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_advanced/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_advanced/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_advanced/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_advanced/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_advanced/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_advanced/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_advanced/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_advanced/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_advanced/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_advanced/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_computer_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_computer_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_computer_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_computer_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_computer_advanced_upgrade.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_computer_advanced_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_computer_advanced_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_computer_advanced_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_computer_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_computer_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_computer_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_computer_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_normal/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_normal/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_normal/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_normal/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_normal/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_normal/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_normal/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_normal/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_normal/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_normal/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/pocket_normal/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/pocket_normal/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/printed_book.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/printed_book.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/printed_book.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/printed_book.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/printed_pages.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/printed_pages.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/printed_pages.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/printed_pages.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/printer.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/printer.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/printer.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/printer.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/speaker.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/speaker.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/crafting_table.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/crafting_table.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/crafting_table.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/crafting_table.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_axe.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_axe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_axe.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_axe.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_hoe.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_hoe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_hoe.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_hoe.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_pickaxe.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_pickaxe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_pickaxe.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_pickaxe.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_shovel.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_shovel.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_shovel.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_shovel.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_sword.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_sword.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced/minecraft/diamond_sword.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced/minecraft/diamond_sword.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced_overlays/turtle_rainbow_overlay.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced_overlays/turtle_rainbow_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced_overlays/turtle_rainbow_overlay.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced_overlays/turtle_rainbow_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced_overlays/turtle_trans_overlay.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced_overlays/turtle_trans_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced_overlays/turtle_trans_overlay.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced_overlays/turtle_trans_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced_upgrade.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_advanced_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_advanced_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/crafting_table.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/crafting_table.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/crafting_table.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/crafting_table.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_axe.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_axe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_axe.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_axe.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_hoe.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_hoe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_hoe.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_hoe.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_pickaxe.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_pickaxe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_pickaxe.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_pickaxe.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_shovel.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_shovel.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_shovel.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_shovel.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_sword.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_sword.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal/minecraft/diamond_sword.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal/minecraft/diamond_sword.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal_overlays/turtle_rainbow_overlay.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal_overlays/turtle_rainbow_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal_overlays/turtle_rainbow_overlay.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal_overlays/turtle_rainbow_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal_overlays/turtle_trans_overlay.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal_overlays/turtle_trans_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/turtle_normal_overlays/turtle_trans_overlay.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/turtle_normal_overlays/turtle_trans_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wired_modem.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wired_modem.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wired_modem.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wired_modem.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wired_modem_full_from.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wired_modem_full_from.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wired_modem_full_from.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wired_modem_full_from.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wired_modem_full_to.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wired_modem_full_to.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wired_modem_full_to.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wired_modem_full_to.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/advancements/recipes/redstone/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/cable.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/cable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/cable.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/cable.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/computer_advanced.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/computer_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/computer_advanced.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/computer_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/computer_command.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/computer_command.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/computer_command.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/computer_command.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/computer_normal.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/computer_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/computer_normal.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/computer_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/disk_drive.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/disk_drive.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/disk_drive.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/disk_drive.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/monitor_advanced.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/monitor_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/monitor_advanced.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/monitor_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/monitor_normal.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/monitor_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/monitor_normal.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/monitor_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/printer.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/printer.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/printer.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/printer.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/speaker.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/speaker.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/turtle_advanced.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/turtle_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/turtle_advanced.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/turtle_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/turtle_normal.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/turtle_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/turtle_normal.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/turtle_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/wired_modem_full.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/wired_modem_full.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/wired_modem_full.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/wired_modem_full.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/blocks/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/blocks/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/loot_tables/treasure_disk.json b/projects/common/src/generated/resources/data/computercraft/loot_table/treasure_disk.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/loot_tables/treasure_disk.json rename to projects/common/src/generated/resources/data/computercraft/loot_table/treasure_disk.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/cable.json b/projects/common/src/generated/resources/data/computercraft/recipe/cable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/cable.json rename to projects/common/src/generated/resources/data/computercraft/recipe/cable.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/clear_colour.json b/projects/common/src/generated/resources/data/computercraft/recipe/clear_colour.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/clear_colour.json rename to projects/common/src/generated/resources/data/computercraft/recipe/clear_colour.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/colour.json b/projects/common/src/generated/resources/data/computercraft/recipe/colour.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/colour.json rename to projects/common/src/generated/resources/data/computercraft/recipe/colour.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/computer_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/computer_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/computer_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/computer_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/computer_advanced_upgrade.json b/projects/common/src/generated/resources/data/computercraft/recipe/computer_advanced_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/computer_advanced_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/recipe/computer_advanced_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/computer_command.json b/projects/common/src/generated/resources/data/computercraft/recipe/computer_command.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/computer_command.json rename to projects/common/src/generated/resources/data/computercraft/recipe/computer_command.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/computer_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/computer_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/computer_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/computer_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_1.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_1.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_1.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_1.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_10.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_10.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_10.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_10.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_11.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_11.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_11.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_11.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_12.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_12.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_12.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_12.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_13.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_13.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_13.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_13.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_14.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_14.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_14.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_14.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_15.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_15.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_15.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_15.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_16.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_16.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_16.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_16.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_2.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_2.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_2.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_2.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_3.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_3.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_3.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_3.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_4.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_4.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_4.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_4.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_5.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_5.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_5.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_5.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_6.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_6.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_6.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_6.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_7.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_7.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_7.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_7.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_8.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_8.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_8.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_8.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_9.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_9.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_9.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_9.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/disk_drive.json b/projects/common/src/generated/resources/data/computercraft/recipe/disk_drive.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/disk_drive.json rename to projects/common/src/generated/resources/data/computercraft/recipe/disk_drive.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/monitor_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/monitor_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/monitor_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/monitor_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/monitor_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/monitor_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/monitor_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/monitor_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_advanced/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_advanced/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_advanced/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_advanced/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_advanced/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_advanced/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_advanced/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_advanced_upgrade.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_advanced_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_advanced_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_advanced_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_upgrade.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_computer_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_computer_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_normal/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_normal/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_normal/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_normal/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/pocket_normal/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/pocket_normal/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/pocket_normal/computercraft/wireless_modem_normal.json diff --git a/projects/forge/src/generated/resources/data/computercraft/recipes/printed_book.json b/projects/common/src/generated/resources/data/computercraft/recipe/printed_book.json similarity index 100% rename from projects/forge/src/generated/resources/data/computercraft/recipes/printed_book.json rename to projects/common/src/generated/resources/data/computercraft/recipe/printed_book.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/printed_pages.json b/projects/common/src/generated/resources/data/computercraft/recipe/printed_pages.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/printed_pages.json rename to projects/common/src/generated/resources/data/computercraft/recipe/printed_pages.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/printer.json b/projects/common/src/generated/resources/data/computercraft/recipe/printer.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/printer.json rename to projects/common/src/generated/resources/data/computercraft/recipe/printer.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/skull_cloudy.json b/projects/common/src/generated/resources/data/computercraft/recipe/skull_cloudy.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/skull_cloudy.json rename to projects/common/src/generated/resources/data/computercraft/recipe/skull_cloudy.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/skull_dan200.json b/projects/common/src/generated/resources/data/computercraft/recipe/skull_dan200.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/skull_dan200.json rename to projects/common/src/generated/resources/data/computercraft/recipe/skull_dan200.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/speaker.json b/projects/common/src/generated/resources/data/computercraft/recipe/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/speaker.json rename to projects/common/src/generated/resources/data/computercraft/recipe/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/crafting_table.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/crafting_table.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/crafting_table.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/crafting_table.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_axe.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_axe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_axe.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_axe.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_hoe.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_hoe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_hoe.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_hoe.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_pickaxe.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_pickaxe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_pickaxe.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_pickaxe.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_shovel.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_shovel.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_shovel.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_shovel.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_sword.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_sword.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced/minecraft/diamond_sword.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced/minecraft/diamond_sword.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced_overlays/turtle_rainbow_overlay.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced_overlays/turtle_rainbow_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced_overlays/turtle_rainbow_overlay.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced_overlays/turtle_rainbow_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced_overlays/turtle_trans_overlay.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced_overlays/turtle_trans_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced_overlays/turtle_trans_overlay.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced_overlays/turtle_trans_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced_upgrade.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_advanced_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_advanced_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/speaker.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/computercraft/speaker.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/speaker.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/computercraft/speaker.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/computercraft/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/computercraft/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_normal.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/computercraft/wireless_modem_normal.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/computercraft/wireless_modem_normal.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/computercraft/wireless_modem_normal.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/crafting_table.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/crafting_table.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/crafting_table.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/crafting_table.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_axe.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_axe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_axe.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_axe.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_hoe.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_hoe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_hoe.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_hoe.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_pickaxe.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_pickaxe.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_pickaxe.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_pickaxe.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_shovel.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_shovel.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_shovel.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_shovel.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_sword.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_sword.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal/minecraft/diamond_sword.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal/minecraft/diamond_sword.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal_overlays/turtle_rainbow_overlay.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal_overlays/turtle_rainbow_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal_overlays/turtle_rainbow_overlay.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal_overlays/turtle_rainbow_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal_overlays/turtle_trans_overlay.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal_overlays/turtle_trans_overlay.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_normal_overlays/turtle_trans_overlay.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_normal_overlays/turtle_trans_overlay.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/turtle_upgrade.json b/projects/common/src/generated/resources/data/computercraft/recipe/turtle_upgrade.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/turtle_upgrade.json rename to projects/common/src/generated/resources/data/computercraft/recipe/turtle_upgrade.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/wired_modem.json b/projects/common/src/generated/resources/data/computercraft/recipe/wired_modem.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/wired_modem.json rename to projects/common/src/generated/resources/data/computercraft/recipe/wired_modem.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/wired_modem_full_from.json b/projects/common/src/generated/resources/data/computercraft/recipe/wired_modem_full_from.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/wired_modem_full_from.json rename to projects/common/src/generated/resources/data/computercraft/recipe/wired_modem_full_from.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/wired_modem_full_to.json b/projects/common/src/generated/resources/data/computercraft/recipe/wired_modem_full_to.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/wired_modem_full_to.json rename to projects/common/src/generated/resources/data/computercraft/recipe/wired_modem_full_to.json diff --git a/projects/common/src/generated/resources/data/computercraft/recipes/wireless_modem_advanced.json b/projects/common/src/generated/resources/data/computercraft/recipe/wireless_modem_advanced.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/recipes/wireless_modem_advanced.json rename to projects/common/src/generated/resources/data/computercraft/recipe/wireless_modem_advanced.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/computer.json b/projects/common/src/generated/resources/data/computercraft/tags/block/computer.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/computer.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/computer.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/monitor.json b/projects/common/src/generated/resources/data/computercraft/tags/block/monitor.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/monitor.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/monitor.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/peripheral_hub_ignore.json b/projects/common/src/generated/resources/data/computercraft/tags/block/peripheral_hub_ignore.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/peripheral_hub_ignore.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/peripheral_hub_ignore.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle.json b/projects/common/src/generated/resources/data/computercraft/tags/block/turtle.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/turtle.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json b/projects/common/src/generated/resources/data/computercraft/tags/block/turtle_always_breakable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/turtle_always_breakable.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_can_use.json b/projects/common/src/generated/resources/data/computercraft/tags/block/turtle_can_use.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_can_use.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/turtle_can_use.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json b/projects/common/src/generated/resources/data/computercraft/tags/block/turtle_hoe_harvestable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/turtle_hoe_harvestable.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json b/projects/common/src/generated/resources/data/computercraft/tags/block/turtle_shovel_harvestable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/turtle_shovel_harvestable.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json b/projects/common/src/generated/resources/data/computercraft/tags/block/turtle_sword_harvestable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/turtle_sword_harvestable.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json b/projects/common/src/generated/resources/data/computercraft/tags/block/wired_modem.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json rename to projects/common/src/generated/resources/data/computercraft/tags/block/wired_modem.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/items/computer.json b/projects/common/src/generated/resources/data/computercraft/tags/item/computer.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/items/computer.json rename to projects/common/src/generated/resources/data/computercraft/tags/item/computer.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/items/dyeable.json b/projects/common/src/generated/resources/data/computercraft/tags/item/dyeable.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/items/dyeable.json rename to projects/common/src/generated/resources/data/computercraft/tags/item/dyeable.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/items/monitor.json b/projects/common/src/generated/resources/data/computercraft/tags/item/monitor.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/items/monitor.json rename to projects/common/src/generated/resources/data/computercraft/tags/item/monitor.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/items/turtle.json b/projects/common/src/generated/resources/data/computercraft/tags/item/turtle.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/items/turtle.json rename to projects/common/src/generated/resources/data/computercraft/tags/item/turtle.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/items/turtle_can_place.json b/projects/common/src/generated/resources/data/computercraft/tags/item/turtle_can_place.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/items/turtle_can_place.json rename to projects/common/src/generated/resources/data/computercraft/tags/item/turtle_can_place.json diff --git a/projects/common/src/generated/resources/data/computercraft/tags/items/wired_modem.json b/projects/common/src/generated/resources/data/computercraft/tags/item/wired_modem.json similarity index 100% rename from projects/common/src/generated/resources/data/computercraft/tags/items/wired_modem.json rename to projects/common/src/generated/resources/data/computercraft/tags/item/wired_modem.json diff --git a/projects/common/src/generated/resources/data/create/tags/blocks/brittle.json b/projects/common/src/generated/resources/data/create/tags/block/brittle.json similarity index 100% rename from projects/common/src/generated/resources/data/create/tags/blocks/brittle.json rename to projects/common/src/generated/resources/data/create/tags/block/brittle.json diff --git a/projects/common/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json similarity index 100% rename from projects/common/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json rename to projects/common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json diff --git a/projects/common/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json b/projects/common/src/generated/resources/data/minecraft/tags/block/wither_immune.json similarity index 100% rename from projects/common/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json rename to projects/common/src/generated/resources/data/minecraft/tags/block/wither_immune.json diff --git a/projects/common/src/generated/resources/data/minecraft/tags/items/bookshelf_books.json b/projects/common/src/generated/resources/data/minecraft/tags/item/bookshelf_books.json similarity index 100% rename from projects/common/src/generated/resources/data/minecraft/tags/items/bookshelf_books.json rename to projects/common/src/generated/resources/data/minecraft/tags/item/bookshelf_books.json diff --git a/projects/common/src/generated/resources/data/minecraft/tags/items/piglin_loved.json b/projects/common/src/generated/resources/data/minecraft/tags/item/piglin_loved.json similarity index 100% rename from projects/common/src/generated/resources/data/minecraft/tags/items/piglin_loved.json rename to projects/common/src/generated/resources/data/minecraft/tags/item/piglin_loved.json diff --git a/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java b/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java index c0c9f3491..cce81f774 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java @@ -43,33 +43,33 @@ class BlockModelProvider { private static final TextureSlot BACKPACK = TextureSlot.create("backpack"); private static final ModelTemplate COMPUTER_ON = new ModelTemplate( - Optional.of(new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/computer_on")), + Optional.of(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/computer_on")), Optional.empty(), TextureSlot.FRONT, TextureSlot.SIDE, TextureSlot.TOP, CURSOR ); private static final ModelTemplate MONITOR_BASE = new ModelTemplate( - Optional.of(new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/monitor_base")), + Optional.of(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/monitor_base")), Optional.empty(), TextureSlot.FRONT, TextureSlot.SIDE, TextureSlot.TOP, TextureSlot.BACK ); private static final ModelTemplate MODEM = new ModelTemplate( - Optional.of(new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/modem")), + Optional.of(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/modem")), Optional.empty(), TextureSlot.FRONT, TextureSlot.BACK ); private static final ModelTemplate TURTLE = new ModelTemplate( - Optional.of(new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_base")), + Optional.of(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_base")), Optional.empty(), TextureSlot.FRONT, TextureSlot.BACK, TextureSlot.TOP, TextureSlot.BOTTOM, LEFT, RIGHT, BACKPACK ); private static final ModelTemplate TURTLE_UPGRADE_LEFT = new ModelTemplate( - Optional.of(new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_upgrade_base_left")), + Optional.of(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_upgrade_base_left")), Optional.of("_left"), TextureSlot.TEXTURE ); private static final ModelTemplate TURTLE_UPGRADE_RIGHT = new ModelTemplate( - Optional.of(new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_upgrade_base_right")), + Optional.of(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_upgrade_base_right")), Optional.of("_left"), TextureSlot.TEXTURE ); @@ -161,7 +161,7 @@ class BlockModelProvider { ); case ON, BLINKING -> COMPUTER_ON.createWithSuffix( block, "_" + state.getSerializedName(), - TextureMapping.orientableCube(block).put(CURSOR, new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/computer" + state.getTexture())), + TextureMapping.orientableCube(block).put(CURSOR, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/computer" + state.getTexture())), generators.modelOutput ); })) @@ -207,10 +207,10 @@ class BlockModelProvider { generators.blockStateOutput.accept(MultiVariantGenerator.multiVariant(fullBlock) .with(createModelDispatch(WiredModemFullBlock.MODEM_ON, WiredModemFullBlock.PERIPHERAL_ON, (on, peripheral) -> { var suffix = (on ? "_on" : "_off") + (peripheral ? "_peripheral" : ""); - var faceTexture = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/wired_modem_face" + (peripheral ? "_peripheral" : "") + (on ? "_on" : "")); + var faceTexture = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/wired_modem_face" + (peripheral ? "_peripheral" : "") + (on ? "_on" : "")); // TODO: Do this somewhere more elegant! - modemModel(generators, new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/wired_modem" + suffix), faceTexture); + modemModel(generators, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/wired_modem" + suffix), faceTexture); return ModelTemplates.CUBE_ALL.create( getModelLocation(fullBlock, suffix), @@ -220,7 +220,7 @@ class BlockModelProvider { }))); generators.delegateItemModel(fullBlock, getModelLocation(fullBlock, "_off")); - generators.delegateItemModel(ModRegistry.Items.WIRED_MODEM.get(), new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/wired_modem_off")); + generators.delegateItemModel(ModRegistry.Items.WIRED_MODEM.get(), ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/wired_modem_off")); } private static ResourceLocation modemModel(BlockModelGenerators generators, ResourceLocation name, ResourceLocation texture) { @@ -228,7 +228,7 @@ class BlockModelProvider { name, new TextureMapping() .put(TextureSlot.FRONT, texture) - .put(TextureSlot.BACK, new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/modem_back")), + .put(TextureSlot.BACK, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/modem_back")), generators.modelOutput ); } @@ -275,7 +275,7 @@ class BlockModelProvider { var generator = MultiPartGenerator.multiPart(ModRegistry.Blocks.CABLE.get()); // When a cable only has a neighbour in a single direction, we redirect the core to face that direction. - var coreFacing = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/cable_core_facing"); + var coreFacing = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/cable_core_facing"); // Up/Down generator.with( Condition.or( @@ -305,7 +305,7 @@ class BlockModelProvider { ); // Find all other possibilities and emit a "solid" core which doesn't have a facing direction. - var core = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/cable_core_any"); + var core = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/cable_core_any"); List rightAngles = new ArrayList<>(); for (var i = 0; i < DirectionUtil.FACINGS.length; i++) { for (var j = i; j < DirectionUtil.FACINGS.length; j++) { @@ -319,7 +319,7 @@ class BlockModelProvider { generator.with(Condition.or(rightAngles.toArray(new Condition[0])), Variant.variant().with(VariantProperties.MODEL, core)); // Then emit the actual cable arms - var arm = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/cable_arm"); + var arm = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/cable_arm"); for (var direction : DirectionUtil.FACINGS) { generator.with( new Condition.TerminalCondition().term(CABLE_DIRECTIONS[direction.ordinal()], true), @@ -338,7 +338,7 @@ class BlockModelProvider { generator.with( new Condition.TerminalCondition().term(CableBlock.MODEM, CableModemVariant.from(direction, on, peripheral)), Variant.variant() - .with(VariantProperties.MODEL, new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/wired_modem" + suffix)) + .with(VariantProperties.MODEL, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/wired_modem" + suffix)) .with(VariantProperties.X_ROT, toXAngle(direction)) .with(VariantProperties.Y_ROT, toYAngle(direction)) ); @@ -360,13 +360,13 @@ class BlockModelProvider { private static void registerTurtleUpgrade(BlockModelGenerators generators, String name, String texture) { TURTLE_UPGRADE_LEFT.create( - new ResourceLocation(ComputerCraftAPI.MOD_ID, name + "_left"), - TextureMapping.defaultTexture(new ResourceLocation(ComputerCraftAPI.MOD_ID, texture)), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name + "_left"), + TextureMapping.defaultTexture(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, texture)), generators.modelOutput ); TURTLE_UPGRADE_RIGHT.create( - new ResourceLocation(ComputerCraftAPI.MOD_ID, name + "_right"), - TextureMapping.defaultTexture(new ResourceLocation(ComputerCraftAPI.MOD_ID, texture)), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name + "_right"), + TextureMapping.defaultTexture(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, texture)), generators.modelOutput ); } diff --git a/projects/common/src/main/java/dan200/computercraft/data/ItemModelProvider.java b/projects/common/src/main/java/dan200/computercraft/data/ItemModelProvider.java index 4d0e990c8..f483641bb 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/ItemModelProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/ItemModelProvider.java @@ -28,7 +28,7 @@ public final class ItemModelProvider { registerPocketComputer(generators, getModelLocation(ModRegistry.Items.POCKET_COMPUTER_NORMAL.get()), false); registerPocketComputer(generators, getModelLocation(ModRegistry.Items.POCKET_COMPUTER_ADVANCED.get()), false); - registerPocketComputer(generators, new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/pocket_computer_colour"), true); + registerPocketComputer(generators, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/pocket_computer_colour"), true); generators.generateFlatItem(ModRegistry.Items.PRINTED_BOOK.get(), ModelTemplates.FLAT_ITEM); generators.generateFlatItem(ModRegistry.Items.PRINTED_PAGE.get(), ModelTemplates.FLAT_ITEM); @@ -37,21 +37,21 @@ public final class ItemModelProvider { private static void registerPocketComputer(ItemModelGenerators generators, ResourceLocation id, boolean off) { createFlatItem(generators, id.withSuffix("_blinking"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/pocket_computer_blink"), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/pocket_computer_blink"), id, - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/pocket_computer_light") + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/pocket_computer_light") ); createFlatItem(generators, id.withSuffix("_on"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/pocket_computer_on"), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/pocket_computer_on"), id, - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/pocket_computer_light") + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/pocket_computer_light") ); // Don't emit the default/off state for advanced/normal pocket computers, as they have item overrides. if (off) { createFlatItem(generators, id, - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/pocket_computer_frame"), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/pocket_computer_frame"), id ); } @@ -59,8 +59,8 @@ public final class ItemModelProvider { private static void registerDisk(ItemModelGenerators generators, Item item) { createFlatItem(generators, item, - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/disk_frame"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "item/disk_colour") + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/disk_frame"), + ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "item/disk_colour") ); } @@ -91,7 +91,7 @@ public final class ItemModelProvider { mapping.put(slot, textures[i]); } - new ModelTemplate(Optional.of(new ResourceLocation("item/generated")), Optional.empty(), slots) + new ModelTemplate(Optional.of(ResourceLocation.withDefaultNamespace("item/generated")), Optional.empty(), slots) .create(model, mapping, generators.output); } } diff --git a/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java b/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java index 90fc2733b..c407d1c18 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java @@ -12,7 +12,6 @@ import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.peripheral.modem.wired.CableBlock; import dan200.computercraft.shared.peripheral.modem.wired.CableModemVariant; import net.minecraft.advancements.critereon.StatePropertiesPredicate; -import net.minecraft.core.HolderLookup; import net.minecraft.data.loot.LootTableProvider.SubProviderEntry; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.block.Block; @@ -36,12 +35,12 @@ import java.util.function.Supplier; class LootTableProvider { public static List getTables() { return List.of( - new SubProviderEntry(() -> LootTableProvider::registerBlocks, LootContextParamSets.BLOCK), - new SubProviderEntry(() -> LootTableProvider::registerGeneric, LootContextParamSets.ALL_PARAMS) + new SubProviderEntry(r -> LootTableProvider::registerBlocks, LootContextParamSets.BLOCK), + new SubProviderEntry(r -> LootTableProvider::registerGeneric, LootContextParamSets.ALL_PARAMS) ); } - private static void registerBlocks(HolderLookup.Provider registries, BiConsumer, LootTable.Builder> add) { + private static void registerBlocks(BiConsumer, LootTable.Builder> add) { namedBlockDrop(add, ModRegistry.Blocks.DISK_DRIVE); selfDrop(add, ModRegistry.Blocks.MONITOR_NORMAL); selfDrop(add, ModRegistry.Blocks.MONITOR_ADVANCED); @@ -78,7 +77,7 @@ class LootTableProvider { )); } - private static void registerGeneric(HolderLookup.Provider registries, BiConsumer, LootTable.Builder> add) { + private static void registerGeneric(BiConsumer, LootTable.Builder> add) { add.accept(CommonHooks.TREASURE_DISK_LOOT, LootTable.lootTable()); } diff --git a/projects/common/src/main/java/dan200/computercraft/data/PocketUpgradeProvider.java b/projects/common/src/main/java/dan200/computercraft/data/PocketUpgradeProvider.java index 7481598d0..ec9de0c49 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/PocketUpgradeProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/PocketUpgradeProvider.java @@ -23,6 +23,6 @@ class PocketUpgradeProvider { } private static ResourceKey id(String id) { - return ResourceKey.create(IPocketUpgrade.REGISTRY, new ResourceLocation(ComputerCraftAPI.MOD_ID, id)); + return ResourceKey.create(IPocketUpgrade.REGISTRY, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, id)); } } diff --git a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java index 8d7233077..b62e1384d 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java @@ -14,7 +14,6 @@ import dan200.computercraft.api.upgrades.UpgradeData; import dan200.computercraft.core.util.Colour; import dan200.computercraft.data.recipe.ShapedSpecBuilder; import dan200.computercraft.data.recipe.ShapelessSpecBuilder; -import dan200.computercraft.shared.util.RegistryHelper; import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.common.ClearColourRecipe; import dan200.computercraft.shared.common.ColourableRecipe; @@ -33,6 +32,7 @@ import dan200.computercraft.shared.turtle.items.TurtleItem; import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe; import dan200.computercraft.shared.util.ColourUtils; import dan200.computercraft.shared.util.DataComponentUtil; +import dan200.computercraft.shared.util.RegistryHelper; import net.minecraft.advancements.Criterion; import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.advancements.critereon.ItemPredicate; @@ -120,7 +120,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .group("computercraft:disk") .unlockedBy("has_drive", inventoryChange(ModRegistry.Items.DISK_DRIVE.get())) .build(ImpostorShapelessRecipe::new) - .save(output, new ResourceLocation(ComputerCraftAPI.MOD_ID, "disk_" + (colour.ordinal() + 1))); + .save(output, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "disk_" + (colour.ordinal() + 1))); } } @@ -211,7 +211,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { } private void turtleOverlay(RecipeOutput add, String overlay, Consumer build) { - var overlayId = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/" + overlay); + var overlayId = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/" + overlay); for (var turtleItem : turtleItems()) { var name = RegistryHelper.getKeyOrThrow(BuiltInRegistries.ITEM, turtleItem); @@ -274,7 +274,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .define('C', ModRegistry.Items.COMPUTER_NORMAL.get()) .unlockedBy("has_components", inventoryChange(itemPredicate(ModRegistry.Items.COMPUTER_NORMAL.get()), itemPredicate(ingredients.goldIngot()))) .build(x -> new TransformShapedRecipe(x, List.of(new CopyComponents(ModRegistry.Items.COMPUTER_NORMAL.get())))) - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "computer_advanced_upgrade")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "computer_advanced_upgrade")); ShapedRecipeBuilder .shaped(RecipeCategory.REDSTONE, ModRegistry.Items.COMPUTER_COMMAND.get()) @@ -321,7 +321,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .define('B', ingredients.goldBlock()) .unlockedBy("has_components", inventoryChange(itemPredicate(ModRegistry.Items.TURTLE_NORMAL.get()), itemPredicate(ingredients.goldIngot()))) .build(x -> new TransformShapedRecipe(x, List.of(new CopyComponents(ModRegistry.Items.TURTLE_NORMAL.get())))) - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "turtle_advanced_upgrade")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "turtle_advanced_upgrade")); ShapedRecipeBuilder .shaped(RecipeCategory.REDSTONE, ModRegistry.Items.DISK_DRIVE.get()) @@ -386,7 +386,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .define('C', ModRegistry.Items.POCKET_COMPUTER_NORMAL.get()) .unlockedBy("has_components", inventoryChange(itemPredicate(ModRegistry.Items.POCKET_COMPUTER_NORMAL.get()), itemPredicate(ingredients.goldIngot()))) .build(x -> new TransformShapedRecipe(x, List.of(new CopyComponents(ModRegistry.Items.POCKET_COMPUTER_NORMAL.get())))) - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "pocket_computer_advanced_upgrade")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "pocket_computer_advanced_upgrade")); ShapedRecipeBuilder .shaped(RecipeCategory.REDSTONE, ModRegistry.Items.PRINTER.get()) @@ -425,12 +425,12 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .shapeless(RecipeCategory.REDSTONE, ModRegistry.Items.WIRED_MODEM_FULL.get()) .requires(ModRegistry.Items.WIRED_MODEM.get()) .unlockedBy("has_modem", inventoryChange(WIRED_MODEM)) - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "wired_modem_full_from")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "wired_modem_full_from")); ShapelessRecipeBuilder .shapeless(RecipeCategory.REDSTONE, ModRegistry.Items.WIRED_MODEM.get()) .requires(ModRegistry.Items.WIRED_MODEM_FULL.get()) .unlockedBy("has_modem", inventoryChange(WIRED_MODEM)) - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "wired_modem_full_to")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "wired_modem_full_to")); ShapedRecipeBuilder .shaped(RecipeCategory.REDSTONE, ModRegistry.Items.WIRELESS_MODEM_NORMAL.get()) @@ -459,7 +459,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .requires(ModRegistry.Items.MONITOR_NORMAL.get()) .unlockedBy("has_monitor", inventoryChange(ModRegistry.Items.MONITOR_NORMAL.get())) .build() - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "skull_cloudy")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "skull_cloudy")); ShapelessSpecBuilder .shapeless(RecipeCategory.DECORATIONS, playerHead("dan200", "f3c8d69b-0776-4512-8434-d1b2165909eb")) @@ -467,7 +467,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { .requires(ModRegistry.Items.COMPUTER_ADVANCED.get()) .unlockedBy("has_computer", inventoryChange(ModRegistry.Items.COMPUTER_ADVANCED.get())) .build() - .save(add, new ResourceLocation(ComputerCraftAPI.MOD_ID, "skull_dan200")); + .save(add, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "skull_dan200")); var pages = Ingredient.of( ModRegistry.Items.PRINTED_PAGE.get(), @@ -523,7 +523,7 @@ final class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { var item = ItemStack.SIMPLE_ITEM_CODEC.parse(JsonOps.INSTANCE, object).getOrThrow(); return itemPredicate(item.getItem()); } else if (object.has("tag")) { - return itemPredicate(TagKey.create(Registries.ITEM, new ResourceLocation(GsonHelper.getAsString(object, "tag")))); + return itemPredicate(TagKey.create(Registries.ITEM, ResourceLocation.parse(GsonHelper.getAsString(object, "tag")))); } else { throw new IllegalArgumentException("Unknown ingredient " + json); } diff --git a/projects/common/src/main/java/dan200/computercraft/data/TurtleUpgradeProvider.java b/projects/common/src/main/java/dan200/computercraft/data/TurtleUpgradeProvider.java index 001ca3485..2ecf48a2b 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/TurtleUpgradeProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/TurtleUpgradeProvider.java @@ -34,11 +34,11 @@ class TurtleUpgradeProvider { } private static ResourceKey id(String id) { - return ITurtleUpgrade.createKey(new ResourceLocation(ComputerCraftAPI.MOD_ID, id)); + return ITurtleUpgrade.createKey(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, id)); } private static ResourceKey vanilla(String id) { // Naughty, please don't do this. Mostly here for some semblance of backwards compatibility. - return ITurtleUpgrade.createKey(new ResourceLocation("minecraft", id)); + return ITurtleUpgrade.createKey(ResourceLocation.fromNamespaceAndPath("minecraft", id)); } } diff --git a/projects/common/src/main/java/dan200/computercraft/impl/AbstractComputerCraftAPI.java b/projects/common/src/main/java/dan200/computercraft/impl/AbstractComputerCraftAPI.java index 4652c35e0..0cf968bc8 100644 --- a/projects/common/src/main/java/dan200/computercraft/impl/AbstractComputerCraftAPI.java +++ b/projects/common/src/main/java/dan200/computercraft/impl/AbstractComputerCraftAPI.java @@ -48,12 +48,12 @@ public abstract class AbstractComputerCraftAPI implements ComputerCraftAPIServic private final DetailRegistry itemStackDetails = new DetailRegistryImpl<>(ItemDetails::fillBasic); private final DetailRegistry blockDetails = new DetailRegistryImpl<>(BlockDetails::fillBasic); - protected static final ResourceKey>> turtleUpgradeRegistryId = ResourceKey.createRegistryKey(new ResourceLocation(ComputerCraftAPI.MOD_ID, "turtle_upgrade_type")); - protected static final ResourceKey>> pocketUpgradeRegistryId = ResourceKey.createRegistryKey(new ResourceLocation(ComputerCraftAPI.MOD_ID, "pocket_upgrade_type")); + protected static final ResourceKey>> turtleUpgradeRegistryId = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "turtle_upgrade_type")); + protected static final ResourceKey>> pocketUpgradeRegistryId = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "pocket_upgrade_type")); public static @Nullable InputStream getResourceFile(MinecraftServer server, String domain, String subPath) { var manager = server.getResourceManager(); - var resource = manager.getResource(new ResourceLocation(domain, subPath)).orElse(null); + var resource = manager.getResource(ResourceLocation.fromNamespaceAndPath(domain, subPath)).orElse(null); if (resource == null) return null; try { return resource.open(); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java b/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java index 3b077f3b2..615849473 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/CommonHooks.java @@ -92,7 +92,7 @@ public final class CommonHooks { TickScheduler.onChunkTicketChanged(level, chunkPos, oldLevel, newLevel); } - public static final ResourceKey TREASURE_DISK_LOOT = ResourceKey.create(Registries.LOOT_TABLE, new ResourceLocation(ComputerCraftAPI.MOD_ID, "treasure_disk")); + public static final ResourceKey TREASURE_DISK_LOOT = ResourceKey.create(Registries.LOOT_TABLE, ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "treasure_disk")); private static final Set> TREASURE_DISK_LOOT_TABLES = Set.of( BuiltInLootTables.SIMPLE_DUNGEON, diff --git a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java index a46489491..0c7fd6df1 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java @@ -100,7 +100,10 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.*; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.Recipe; @@ -580,9 +583,8 @@ public final class ModRegistry { ComputerCraftAPI.registerBundledRedstoneProvider(new DefaultBundledRedstoneProvider()); ComputerCraftAPI.registerRefuelHandler(new FurnaceRefuelHandler()); ComputerCraftAPI.registerMediaProvider(stack -> { - var item = stack.getItem(); - if (item instanceof IMedia media) return media; - if (item instanceof RecordItem) return RecordMedia.INSTANCE; + if (stack.getItem() instanceof IMedia media) return media; + if (stack.has(net.minecraft.core.component.DataComponents.JUKEBOX_PLAYABLE)) return RecordMedia.INSTANCE; return null; }); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java index 05a53a87a..396c30a9f 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java @@ -10,10 +10,10 @@ import dan200.computercraft.shared.util.DataComponentUtil; import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; import net.minecraft.core.component.DataComponents; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.Level; @@ -27,10 +27,10 @@ public final class ClearColourRecipe extends CustomRecipe { } @Override - public boolean matches(CraftingContainer inv, Level world) { + public boolean matches(CraftingInput inv, Level world) { var hasColourable = false; var hasSponge = false; - for (var i = 0; i < inv.getContainerSize(); i++) { + for (var i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (stack.isEmpty()) continue; @@ -50,10 +50,10 @@ public final class ClearColourRecipe extends CustomRecipe { } @Override - public ItemStack assemble(CraftingContainer inv, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registryAccess) { var colourable = ItemStack.EMPTY; - for (var i = 0; i < inv.getContainerSize(); i++) { + for (var i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (stack.is(ComputerCraftTags.Items.DYEABLE)) colourable = stack; } @@ -64,8 +64,8 @@ public final class ClearColourRecipe extends CustomRecipe { } @Override - public NonNullList getRemainingItems(CraftingContainer container) { - var remaining = NonNullList.withSize(container.getContainerSize(), ItemStack.EMPTY); + public NonNullList getRemainingItems(CraftingInput container) { + var remaining = NonNullList.withSize(container.size(), ItemStack.EMPTY); for (var i = 0; i < remaining.size(); i++) { if (container.getItem(i).getItem() == Items.WET_SPONGE) remaining.set(i, new ItemStack(Items.WET_SPONGE)); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java index dda9564f3..e643b8a41 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java @@ -11,10 +11,10 @@ import dan200.computercraft.shared.util.ColourUtils; import dan200.computercraft.shared.util.DataComponentUtil; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.Level; @@ -25,10 +25,10 @@ public final class ColourableRecipe extends CustomRecipe { } @Override - public boolean matches(CraftingContainer inv, Level world) { + public boolean matches(CraftingInput inv, Level world) { var hasColourable = false; var hasDye = false; - for (var i = 0; i < inv.getContainerSize(); i++) { + for (var i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (stack.isEmpty()) continue; @@ -46,12 +46,12 @@ public final class ColourableRecipe extends CustomRecipe { } @Override - public ItemStack assemble(CraftingContainer inv, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registryAccess) { var colourable = ItemStack.EMPTY; var tracker = new ColourTracker(); - for (var i = 0; i < inv.getContainerSize(); i++) { + for (var i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (stack.isEmpty()) continue; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java index d9392c962..07a1f5472 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/common/HorizontalContainerBlock.java @@ -62,13 +62,7 @@ public abstract class HorizontalContainerBlock extends BaseEntityBlock { @Override protected final void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.is(newState.getBlock())) return; - - if (level.getBlockEntity(pos) instanceof BaseContainerBlockEntity container) { - Containers.dropContents(level, pos, container); - level.updateNeighbourForOutputSignal(pos, this); - } - + Containers.dropContentsOnDestroy(state, newState, level, pos); super.onRemove(state, level, pos, newState, isMoving); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ResourceMount.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ResourceMount.java index 2171ac6d4..3fc81f9b2 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ResourceMount.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ResourceMount.java @@ -41,7 +41,7 @@ public final class ResourceMount extends ArchiveMount { private ResourceManager manager; public static ResourceMount get(String namespace, String subPath, ResourceManager manager) { - var path = new ResourceLocation(namespace, subPath); + var path = ResourceLocation.fromNamespaceAndPath(namespace, subPath); synchronized (MOUNT_CACHE) { var mount = MOUNT_CACHE.get(path); if (mount == null) MOUNT_CACHE.put(path, mount = new ResourceMount(namespace, subPath, manager)); @@ -60,7 +60,7 @@ public final class ResourceMount extends ArchiveMount { var hasAny = false; String existingNamespace = null; - var newRoot = new FileEntry(new ResourceLocation(namespace, subPath)); + var newRoot = new FileEntry(ResourceLocation.fromNamespaceAndPath(namespace, subPath)); for (var file : manager.listResources(subPath, s -> true).keySet()) { existingNamespace = file.getNamespace(); @@ -88,7 +88,7 @@ public final class ResourceMount extends ArchiveMount { } private FileEntry createEntry(String path) { - return new FileEntry(new ResourceLocation(namespace, subPath + "/" + path)); + return new FileEntry(ResourceLocation.fromNamespaceAndPath(namespace, subPath + "/" + path)); } @Override diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java index 73ff33c56..4c86246ee 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/items/AbstractComputerItem.java @@ -12,6 +12,7 @@ import dan200.computercraft.shared.computer.blocks.AbstractComputerBlock; import dan200.computercraft.shared.config.Config; import dan200.computercraft.shared.util.DataComponentUtil; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -39,7 +40,7 @@ public class AbstractComputerItem extends BlockItem implements IMedia { } @Override - public @Nullable String getLabel(ItemStack stack) { + public @Nullable String getLabel(HolderLookup.Provider registries, ItemStack stack) { return DataComponentUtil.getCustomName(stack); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java b/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java index 8541329b8..e250a8923 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java @@ -4,16 +4,17 @@ package dan200.computercraft.shared.container; -import net.minecraft.core.NonNullList; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; import net.minecraft.world.item.ItemStack; +import java.util.List; + /** * A basic implementation of {@link Container} which operates on a {@linkplain #getItems() list of stacks}. */ public interface BasicContainer extends Container { - NonNullList getItems(); + List getItems(); @Override default int getContainerSize() { @@ -55,7 +56,7 @@ public interface BasicContainer extends Container { getItems().clear(); } - static void defaultSetItems(NonNullList inventory, NonNullList items) { + static void defaultSetItems(List inventory, List items) { var i = 0; for (; i < items.size(); i++) inventory.set(i, items.get(i)); for (; i < inventory.size(); i++) inventory.set(i, ItemStack.EMPTY); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/container/ListContainer.java b/projects/common/src/main/java/dan200/computercraft/shared/container/ListContainer.java new file mode 100644 index 000000000..303557ec6 --- /dev/null +++ b/projects/common/src/main/java/dan200/computercraft/shared/container/ListContainer.java @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +package dan200.computercraft.shared.container; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +/** + * A container backed by a simple list. + * + * @param items The items backing this list. + */ +public record ListContainer(List items) implements BasicContainer { + @Override + public List getItems() { + return items; + } + + @Override + public void setChanged() { + } + + @Override + public boolean stillValid(Player player) { + return true; + } +} diff --git a/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java b/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java index 7d16804c2..1ff92aef4 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/details/ItemDetails.java @@ -13,6 +13,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; @@ -112,9 +113,9 @@ public class ItemDetails { var enchantment = entry.getKey(); var level = entry.getIntValue(); var enchant = new HashMap(3); - enchant.put("name", DetailHelpers.getId(BuiltInRegistries.ENCHANTMENT, enchantment.value())); + enchant.put("name", enchantment.getRegisteredName()); enchant.put("level", level); - enchant.put("displayName", enchantment.value().getFullname(level).getString()); + enchant.put("displayName", Enchantment.getFullname(enchantment, level).getString()); enchants.add(enchant); } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/ExternalModTags.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/ExternalModTags.java index 29a666217..8d3cc6d23 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/integration/ExternalModTags.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/ExternalModTags.java @@ -31,7 +31,7 @@ public final class ExternalModTags { public static final TagKey CREATE_BRITTLE = make("create", "brittle"); private static TagKey make(String mod, String name) { - return TagKey.create(Registries.BLOCK, new ResourceLocation(mod, name)); + return TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath(mod, name)); } } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java index 730778631..7e0fc4f5a 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/JEIComputerCraft.java @@ -28,7 +28,7 @@ import java.util.List; public class JEIComputerCraft implements IModPlugin { @Override public ResourceLocation getPluginUid() { - return new ResourceLocation(ComputerCraftAPI.MOD_ID, "jei"); + return ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "jei"); } @Override diff --git a/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java b/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java index f7addc311..9e9246753 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/integration/jei/RecipeResolver.java @@ -22,7 +22,7 @@ import net.minecraft.world.item.crafting.RecipeHolder; import java.util.List; class RecipeResolver implements IRecipeManagerPlugin { - private static final ResourceLocation RECIPE_ID = new ResourceLocation(ComputerCraftAPI.MOD_ID, "upgrade"); + private static final ResourceLocation RECIPE_ID = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "upgrade"); private final UpgradeRecipeGenerator> resolver = new UpgradeRecipeGenerator<>(x -> new RecipeHolder<>(RECIPE_ID, x), RecipeModHelpers.getEmptyRegistryAccess()); @Override diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java index 59fbbbf33..b5be0a559 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/DiskItem.java @@ -14,6 +14,7 @@ import dan200.computercraft.shared.config.Config; import dan200.computercraft.shared.util.NonNegativeId; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -49,7 +50,7 @@ public class DiskItem extends Item implements IMedia { } @Override - public @Nullable String getLabel(ItemStack stack) { + public @Nullable String getLabel(HolderLookup.Provider registries, ItemStack stack) { var label = stack.get(DataComponents.CUSTOM_NAME); return label != null ? label.getString() : null; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java index 8442d7d17..b15e6489e 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/RecordMedia.java @@ -5,14 +5,14 @@ package dan200.computercraft.shared.media.items; import dan200.computercraft.api.media.IMedia; -import net.minecraft.sounds.SoundEvent; +import net.minecraft.core.HolderLookup; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.RecordItem; +import net.minecraft.world.item.JukeboxSong; import javax.annotation.Nullable; /** - * An implementation of {@link IMedia} for {@link RecordItem}. + * An implementation of {@link IMedia} for items with a {@link JukeboxSong}. */ public final class RecordMedia implements IMedia { public static final RecordMedia INSTANCE = new RecordMedia(); @@ -21,19 +21,8 @@ public final class RecordMedia implements IMedia { } @Override - public @Nullable String getLabel(ItemStack stack) { - return getAudioTitle(stack); - } - - @Override - public @Nullable String getAudioTitle(ItemStack stack) { - var item = stack.getItem(); - return item instanceof RecordItem record ? record.getDisplayName().getString() : null; - } - - @Override - public @Nullable SoundEvent getAudio(ItemStack stack) { - var item = stack.getItem(); - return item instanceof RecordItem record ? record.getSound() : null; + public @Nullable String getLabel(HolderLookup.Provider registries, ItemStack stack) { + var song = getAudio(registries, stack); + return song == null ? null : song.value().description().getString(); } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java b/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java index 0d768b813..86a990863 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/media/items/TreasureDiskItem.java @@ -11,6 +11,7 @@ import dan200.computercraft.api.media.IMedia; import dan200.computercraft.core.filesystem.SubMount; import dan200.computercraft.shared.ModRegistry; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; @@ -39,7 +40,7 @@ public class TreasureDiskItem extends Item implements IMedia { } @Override - public String getLabel(ItemStack stack) { + public String getLabel(HolderLookup.Provider registries, ItemStack stack) { return TreasureDisk.getTitle(stack); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java index 5f478cc5e..1c7586bed 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/DiskRecipe.java @@ -12,14 +12,10 @@ import dan200.computercraft.shared.util.ColourUtils; import dan200.computercraft.shared.util.DataComponentUtil; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponents; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.component.DyedItemColor; -import net.minecraft.world.item.crafting.CraftingBookCategory; -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.*; import net.minecraft.world.level.Level; public class DiskRecipe extends CustomRecipe { @@ -31,11 +27,11 @@ public class DiskRecipe extends CustomRecipe { } @Override - public boolean matches(CraftingContainer inv, Level world) { + public boolean matches(CraftingInput inv, Level world) { var paperFound = false; var redstoneFound = false; - for (var i = 0; i < inv.getContainerSize(); i++) { + for (var i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (!stack.isEmpty()) { @@ -55,10 +51,10 @@ public class DiskRecipe extends CustomRecipe { } @Override - public ItemStack assemble(CraftingContainer inv, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registryAccess) { var tracker = new ColourTracker(); - for (var i = 0; i < inv.getContainerSize(); i++) { + for (var i = 0; i < inv.size(); i++) { var stack = inv.getItem(i); if (stack.isEmpty()) continue; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java index a99635f0f..8837e3256 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/media/recipes/PrintoutRecipe.java @@ -18,8 +18,8 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ExtraCodecs; import net.minecraft.world.entity.player.StackedContents; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; @@ -93,7 +93,7 @@ public final class PrintoutRecipe extends ShapelessRecipe { } @Override - public boolean matches(CraftingContainer inv, Level world) { + public boolean matches(CraftingInput inv, Level world) { var stackedContents = new StackedContents(); var inputs = 0; @@ -101,7 +101,7 @@ public final class PrintoutRecipe extends ShapelessRecipe { var pages = 0; var hasPrintout = false; - for (var j = 0; j < inv.getContainerSize(); ++j) { + for (var j = 0; j < inv.size(); ++j) { var stack = inv.getItem(j); if (stack.isEmpty()) continue; if (printout.test(stack)) { @@ -125,9 +125,9 @@ public final class PrintoutRecipe extends ShapelessRecipe { } @Override - public ItemStack assemble(CraftingContainer inv, HolderLookup.Provider registries) { + public ItemStack assemble(CraftingInput inv, HolderLookup.Provider registries) { List data = new ArrayList<>(); - for (var j = 0; j < inv.getContainerSize(); ++j) { + for (var j = 0; j < inv.size(); ++j) { var stack = inv.getItem(j); if (!stack.isEmpty() && printout.test(stack)) data.add(PrintoutData.getOrEmpty(stack)); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/NetworkMessages.java b/projects/common/src/main/java/dan200/computercraft/shared/network/NetworkMessages.java index 216a39ca4..1abe0498a 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/network/NetworkMessages.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/network/NetworkMessages.java @@ -51,7 +51,7 @@ public final class NetworkMessages { String channel, StreamCodec codec ) { if (!seenChannel.add(channel)) throw new IllegalArgumentException("Duplicate channel " + channel); - var type = new CustomPacketPayload.Type(new ResourceLocation(ComputerCraftAPI.MOD_ID, channel)); + var type = new CustomPacketPayload.Type(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, channel)); messages.add(new CustomPacketPayload.TypeAndCodec<>(type, codec)); return type; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java index d5822536d..5dc5bc3f7 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/ClientNetworkContext.java @@ -11,9 +11,10 @@ import dan200.computercraft.shared.computer.upload.UploadResult; import dan200.computercraft.shared.peripheral.speaker.EncodedAudio; import dan200.computercraft.shared.peripheral.speaker.SpeakerPosition; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.JukeboxSong; import javax.annotation.Nullable; import java.util.UUID; @@ -28,7 +29,7 @@ public interface ClientNetworkContext { void handleMonitorData(BlockPos pos, @Nullable TerminalState terminal); - void handlePlayRecord(BlockPos pos, @Nullable SoundEvent sound, @Nullable String name); + void handlePlayRecord(BlockPos pos, @Nullable Holder sound); void handlePocketComputerData(UUID instanceId, ComputerState state, int lightState, @Nullable TerminalState terminal); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java b/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java index a40b3b608..e9b294e89 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/network/client/PlayRecordClientMessage.java @@ -13,37 +13,35 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.JukeboxSong; import java.util.Optional; /** - * Starts or stops a record on the client, depending on if {@link #soundEvent} is {@code null}. + * Starts or stops a record on the client, depending on if {@link #song} is {@code null}. *

    * Used by disk drives to play record items. * - * @param pos The position of the speaker, where we should play this sound. - * @param soundEvent The sound to play, or {@link Optional#empty()} if we should stop playing. - * @param name The title of the audio to play. + * @param pos The position of the speaker, where we should play this sound. + * @param song The sound to play, or {@link Optional#empty()} if we should stop playing. * @see DiskDriveBlockEntity */ public record PlayRecordClientMessage( - BlockPos pos, Optional> soundEvent, Optional name + BlockPos pos, Optional> song ) implements NetworkMessage { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( BlockPos.STREAM_CODEC, PlayRecordClientMessage::pos, - ByteBufCodecs.optional(SoundEvent.STREAM_CODEC), PlayRecordClientMessage::soundEvent, - ByteBufCodecs.optional(ByteBufCodecs.STRING_UTF8), PlayRecordClientMessage::name, + ByteBufCodecs.optional(JukeboxSong.STREAM_CODEC), PlayRecordClientMessage::song, PlayRecordClientMessage::new ); public PlayRecordClientMessage(BlockPos pos) { - this(pos, Optional.empty(), Optional.empty()); + this(pos, Optional.empty()); } @Override public void handle(ClientNetworkContext context) { - context.handlePlayRecord(pos, soundEvent.map(Holder::value).orElse(null), name.orElse(null)); + context.handlePlayRecord(pos, song.orElse(null)); } @Override diff --git a/projects/common/src/main/java/dan200/computercraft/shared/network/codec/MoreStreamCodecs.java b/projects/common/src/main/java/dan200/computercraft/shared/network/codec/MoreStreamCodecs.java index f20f92014..893980b68 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/network/codec/MoreStreamCodecs.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/network/codec/MoreStreamCodecs.java @@ -48,7 +48,7 @@ public class MoreStreamCodecs { @Override public void encode(B buffer, NonNullList list) { - var count = buffer.writeVarInt(list.size()); + buffer.writeVarInt(list.size()); for (var entry : list) codec.encode(buffer, entry); } }; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java index 870355e5a..80be04f06 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDriveBlockEntity.java @@ -15,7 +15,10 @@ import dan200.computercraft.shared.container.BasicContainer; import dan200.computercraft.shared.network.client.PlayRecordClientMessage; import dan200.computercraft.shared.network.server.ServerNetworking; import dan200.computercraft.shared.util.WorldUtil; -import net.minecraft.core.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Inventory; @@ -131,11 +134,10 @@ public final class DiskDriveBlockEntity extends AbstractContainerBlockEntity imp switch (recordQueued) { case PLAY -> { var media = getMedia(); - var record = media.getAudio(); + var record = media.getAudio(getLevel().registryAccess()); if (record != null) { recordPlaying = true; - var title = media.getAudioTitle(); - sendMessage(new PlayRecordClientMessage(getBlockPos(), Optional.of(Holder.direct(record)), Optional.ofNullable(title))); + sendMessage(new PlayRecordClientMessage(getBlockPos(), Optional.of(record))); } } case STOP -> { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java index d103baf96..2c1b1630c 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/DiskDrivePeripheral.java @@ -64,7 +64,7 @@ public class DiskDrivePeripheral implements IPeripheral { @LuaFunction public final Object[] getDiskLabel() { var media = diskDrive.getMedia(); - return media.media() == null ? null : new Object[]{ media.media().getLabel(media.stack()) }; + return media.media() == null ? null : new Object[]{ media.media().getLabel(diskDrive.getLevel().registryAccess(), media.stack()) }; } /** @@ -117,7 +117,7 @@ public class DiskDrivePeripheral implements IPeripheral { */ @LuaFunction public final boolean hasAudio() { - return diskDrive.getMedia().getAudio() != null; + return diskDrive.getMedia().getAudio(diskDrive.getLevel().registryAccess()) != null; } /** @@ -130,7 +130,10 @@ public class DiskDrivePeripheral implements IPeripheral { @Nullable public final Object getAudioTitle() { var stack = diskDrive.getMedia(); - return stack.media() != null ? stack.getAudioTitle() : false; + if (stack.media() == null) return false; + + var audio = stack.getAudio(diskDrive.getLevel().registryAccess()); + return audio == null ? null : audio.value().description().getString(); } /** diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java index dc56eabcc..e3c5a15e8 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/MediaStack.java @@ -6,8 +6,10 @@ package dan200.computercraft.shared.peripheral.diskdrive; import dan200.computercraft.api.media.IMedia; import dan200.computercraft.impl.MediaProviders; -import net.minecraft.sounds.SoundEvent; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.JukeboxSong; import javax.annotation.Nullable; @@ -28,12 +30,7 @@ record MediaStack(ItemStack stack, @Nullable IMedia media) { } @Nullable - SoundEvent getAudio() { - return media != null ? media.getAudio(stack) : null; - } - - @Nullable - String getAudioTitle() { - return media != null ? media.getAudioTitle(stack) : null; + Holder getAudio(HolderLookup.Provider registries) { + return media != null ? media.getAudio(registries, stack) : null; } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index 4df09543d..2477174ae 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -22,13 +22,13 @@ import dan200.computercraft.shared.util.PauseAwareTimer; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.network.protocol.game.ClientboundSoundPacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; -import net.minecraft.world.item.RecordItem; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import javax.annotation.Nullable; @@ -258,7 +258,11 @@ public abstract class SpeakerPeripheral implements IPeripheral { // Prevent playing music discs. var soundEvent = BuiltInRegistries.SOUND_EVENT.get(identifier); - if (soundEvent != null && RecordItem.getBySound(soundEvent) != null) return false; + // TODO: Build a set of sound events at server startup, and cache this. + var level = Objects.requireNonNull(getPosition().level()); + if (soundEvent != null && level.registryAccess().registry(Registries.JUKEBOX_SONG).orElseThrow().stream().anyMatch(x -> x.soundEvent().value() == soundEvent)) { + return false; + } synchronized (lock) { if (pendingSound != null || (dfpwmState != null && dfpwmState.isPlaying())) return false; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java b/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java index 278e34f51..9f1e821b1 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java @@ -28,12 +28,12 @@ import net.minecraft.world.*; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -217,7 +217,7 @@ public interface PlatformHelper { * @param container The crafting container. * @return A list of items to return to the player after crafting. */ - List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingContainer container); + List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingInput container); /** * Fire an event after crafting has occurred. @@ -226,7 +226,7 @@ public interface PlatformHelper { * @param container The current crafting container. * @param stack The resulting stack from crafting. */ - void onItemCrafted(ServerPlayer player, CraftingContainer container, ItemStack stack); + void onItemCrafted(ServerPlayer player, CraftingInput container, ItemStack stack); /** * Check whether we should notify neighbours in a particular direction. diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java index 6bc675687..99f5c93fd 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java @@ -25,6 +25,7 @@ import dan200.computercraft.shared.util.DataComponentUtil; import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.util.NonNegativeId; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -189,11 +190,15 @@ public class PocketComputerItem extends Item implements IMedia { // IMedia - @Override - public @Nullable String getLabel(ItemStack stack) { + private @Nullable String getLabel(ItemStack stack) { return DataComponentUtil.getCustomName(stack); } + @Override + public @Nullable String getLabel(HolderLookup.Provider registries, ItemStack stack) { + return getLabel(stack); + } + @Override public boolean setLabel(ItemStack stack, @Nullable String label) { DataComponentUtil.setCustomName(stack, label); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java index 30ff8cc05..89927be37 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/recipes/PocketComputerUpgradeRecipe.java @@ -10,9 +10,9 @@ import dan200.computercraft.impl.PocketUpgrades; import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.pocket.items.PocketComputerItem; import net.minecraft.core.HolderLookup; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.Level; @@ -33,20 +33,20 @@ public final class PocketComputerUpgradeRecipe extends CustomRecipe { } @Override - public boolean matches(CraftingContainer inventory, Level world) { + public boolean matches(CraftingInput inventory, Level world) { return !assemble(inventory, world.registryAccess()).isEmpty(); } @Override - public ItemStack assemble(CraftingContainer inventory, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inventory, HolderLookup.Provider registryAccess) { // Scan the grid for a pocket computer var computer = ItemStack.EMPTY; var computerX = -1; var computerY = -1; computer: - for (var y = 0; y < inventory.getHeight(); y++) { - for (var x = 0; x < inventory.getWidth(); x++) { - var item = inventory.getItem(x + y * inventory.getWidth()); + for (var y = 0; y < inventory.height(); y++) { + for (var x = 0; x < inventory.width(); x++) { + var item = inventory.getItem(x, y); if (!item.isEmpty() && item.getItem() instanceof PocketComputerItem) { computer = item; computerX = x; @@ -58,14 +58,13 @@ public final class PocketComputerUpgradeRecipe extends CustomRecipe { if (computer.isEmpty()) return ItemStack.EMPTY; - var itemComputer = (PocketComputerItem) computer.getItem(); if (PocketComputerItem.getUpgradeWithData(computer) != null) return ItemStack.EMPTY; // Check for upgrades around the item UpgradeData upgrade = null; - for (var y = 0; y < inventory.getHeight(); y++) { - for (var x = 0; x < inventory.getWidth(); x++) { - var item = inventory.getItem(x + y * inventory.getWidth()); + for (var y = 0; y < inventory.height(); y++) { + for (var x = 0; x < inventory.width(); x++) { + var item = inventory.getItem(x, y); if (x == computerX && y == computerY) continue; if (x == computerX && y == computerY - 1) { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapedRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapedRecipe.java index f2eabcfc0..4639df6a5 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapedRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapedRecipe.java @@ -6,8 +6,8 @@ package dan200.computercraft.shared.recipe; import dan200.computercraft.shared.ModRegistry; import net.minecraft.core.HolderLookup; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapedRecipe; @@ -24,12 +24,12 @@ public final class ImpostorShapedRecipe extends CustomShapedRecipe { } @Override - public boolean matches(CraftingContainer inv, Level world) { + public boolean matches(CraftingInput inv, Level world) { return false; } @Override - public ItemStack assemble(CraftingContainer inventory, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inventory, HolderLookup.Provider registryAccess) { return ItemStack.EMPTY; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapelessRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapelessRecipe.java index 1bb329251..c81d94153 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapelessRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/recipe/ImpostorShapelessRecipe.java @@ -6,8 +6,8 @@ package dan200.computercraft.shared.recipe; import dan200.computercraft.shared.ModRegistry; import net.minecraft.core.HolderLookup; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; @@ -24,12 +24,12 @@ public final class ImpostorShapelessRecipe extends CustomShapelessRecipe { } @Override - public boolean matches(CraftingContainer inv, Level world) { + public boolean matches(CraftingInput inv, Level world) { return false; } @Override - public ItemStack assemble(CraftingContainer inventory, HolderLookup.Provider access) { + public ItemStack assemble(CraftingInput inventory, HolderLookup.Provider access) { return ItemStack.EMPTY; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapedRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapedRecipe.java index 358bee2ab..c6dad2f08 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapedRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapedRecipe.java @@ -11,8 +11,8 @@ import dan200.computercraft.shared.recipe.function.RecipeFunction; import net.minecraft.core.HolderLookup; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapedRecipe; @@ -42,7 +42,7 @@ public final class TransformShapedRecipe extends CustomShapedRecipe { } @Override - public ItemStack assemble(CraftingContainer inventory, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inventory, HolderLookup.Provider registryAccess) { var result = super.assemble(inventory, registryAccess); for (var function : functions) result = function.apply(inventory, result); return result; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapelessRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapelessRecipe.java index f3a8b8f2b..dcc2d125c 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapelessRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/recipe/TransformShapelessRecipe.java @@ -11,8 +11,8 @@ import dan200.computercraft.shared.recipe.function.RecipeFunction; import net.minecraft.core.HolderLookup; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; @@ -41,7 +41,7 @@ public class TransformShapelessRecipe extends CustomShapelessRecipe { } @Override - public ItemStack assemble(CraftingContainer inventory, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inventory, HolderLookup.Provider registryAccess) { var result = super.assemble(inventory, registryAccess); for (var function : functions) result = function.apply(inventory, result); return result; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/CopyComponents.java b/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/CopyComponents.java index 09f9653e6..8d7425304 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/CopyComponents.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/CopyComponents.java @@ -12,8 +12,8 @@ import net.minecraft.core.component.DataComponentType; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; @@ -83,8 +83,8 @@ public final class CopyComponents implements RecipeFunction { } @Override - public ItemStack apply(CraftingContainer container, ItemStack result) { - for (var item : container.getItems()) { + public ItemStack apply(CraftingInput container, ItemStack result) { + for (var item : container.items()) { if (from.test(item)) { applyPatch(item.getComponentsPatch(), result); break; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/RecipeFunction.java b/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/RecipeFunction.java index 08f603733..ae4ebe767 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/RecipeFunction.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/recipe/function/RecipeFunction.java @@ -16,8 +16,8 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.level.storage.loot.functions.LootItemFunction; import java.util.List; @@ -39,7 +39,7 @@ public interface RecipeFunction { /** * The registry where {@link RecipeFunction}s are registered. */ - ResourceKey>> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(ComputerCraftAPI.MOD_ID, "recipe_function")); + ResourceKey>> REGISTRY = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "recipe_function")); /** * The codec to read and write {@link RecipeFunction}s with. @@ -75,7 +75,7 @@ public interface RecipeFunction { * @param result The result item to modify. This may be mutated in place. * @return The new result item. This may be {@code result}. */ - ItemStack apply(CraftingContainer container, ItemStack result); + ItemStack apply(CraftingInput container, ItemStack result); /** * Properties about a type of {@link RecipeFunction}. These are stored in {@linkplain #REGISTRY a Minecraft diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java index c4799d3fa..d5c91da3f 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleBrain.java @@ -134,7 +134,7 @@ public class TurtleBrain implements TurtleAccessInternal { // 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 ResourceLocation(nbt.getString(NBT_OVERLAY)) : null; + overlay = nbt.contains(NBT_OVERLAY) ? ResourceLocation.parse(nbt.getString(NBT_OVERLAY)) : null; // Read upgrades setUpgradeDirect(TurtleSide.LEFT, NBTUtil.decodeFrom(TurtleUpgrades.instance().upgradeDataCodec(), registries, nbt, NBT_LEFT_UPGRADE)); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java index 2d7125d26..015c74168 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtleCraftCommand.java @@ -21,8 +21,7 @@ public class TurtleCraftCommand implements TurtleCommand { @Override public TurtleCommandResult execute(ITurtleAccess turtle) { // Craft the item - var crafting = new TurtleInventoryCrafting(turtle); - var results = crafting.doCrafting(turtle.getLevel(), limit); + var results = TurtleInventoryCrafting.craft(turtle, limit); if (results == null) return TurtleCommandResult.failure("No matching recipes"); // Store or drop any remainders diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java index fb9e42810..4664414c6 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/inventory/UpgradeSlot.java @@ -23,8 +23,8 @@ import javax.annotation.Nullable; * @see TurtleMenu */ public class UpgradeSlot extends Slot { - public static final ResourceLocation LEFT_UPGRADE = new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/turtle_upgrade_left"); - public static final ResourceLocation RIGHT_UPGRADE = new ResourceLocation(ComputerCraftAPI.MOD_ID, "gui/turtle_upgrade_right"); + public static final ResourceLocation LEFT_UPGRADE = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/turtle_upgrade_left"); + public static final ResourceLocation RIGHT_UPGRADE = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "gui/turtle_upgrade_right"); private final HolderLookup.Provider registries; private final TurtleSide side; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java index 61095eb5e..095bb29b6 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java @@ -11,9 +11,9 @@ import dan200.computercraft.impl.TurtleUpgrades; import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.turtle.items.TurtleItem; import net.minecraft.core.HolderLookup; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.Level; @@ -34,23 +34,23 @@ public final class TurtleUpgradeRecipe extends CustomRecipe { } @Override - public boolean matches(CraftingContainer inventory, Level world) { + public boolean matches(CraftingInput inventory, Level world) { return !assemble(inventory, world.registryAccess()).isEmpty(); } @Override - public ItemStack assemble(CraftingContainer inventory, HolderLookup.Provider registryAccess) { + public ItemStack assemble(CraftingInput inventory, HolderLookup.Provider registryAccess) { // Scan the grid for a row containing a turtle and 1 or 2 items var leftItem = ItemStack.EMPTY; var turtle = ItemStack.EMPTY; var rightItem = ItemStack.EMPTY; - for (var y = 0; y < inventory.getHeight(); y++) { + for (var y = 0; y < inventory.height(); y++) { if (turtle.isEmpty()) { // Search this row for potential turtles var finishedRow = false; - for (var x = 0; x < inventory.getWidth(); x++) { - var item = inventory.getItem(x + y * inventory.getWidth()); + for (var x = 0; x < inventory.width(); x++) { + var item = inventory.getItem(x, y); if (!item.isEmpty()) { if (finishedRow) { return ItemStack.EMPTY; @@ -87,8 +87,8 @@ public final class TurtleUpgradeRecipe extends CustomRecipe { } } else { // Turtle is already found, just check this row is empty - for (var x = 0; x < inventory.getWidth(); x++) { - var item = inventory.getItem(x + y * inventory.getWidth()); + for (var x = 0; x < inventory.width(); x++) { + var item = inventory.getItem(x, y); if (!item.isEmpty()) { return ItemStack.EMPTY; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java index f550f7b5d..224d07395 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleInventoryCrafting.java @@ -9,12 +9,10 @@ import dan200.computercraft.shared.platform.PlatformHelper; import dan200.computercraft.shared.turtle.blocks.TurtleBlockEntity; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.StackedContents; -import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; @@ -24,87 +22,101 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class TurtleInventoryCrafting implements CraftingContainer { +public final class TurtleInventoryCrafting { public static final int WIDTH = 3; public static final int HEIGHT = 3; - public static final int SIZE = WIDTH * HEIGHT; - private final ITurtleAccess turtle; - private int xStart = 0; - private int yStart = 0; - - @SuppressWarnings("ConstantConditions") - public TurtleInventoryCrafting(ITurtleAccess turtle) { - this.turtle = turtle; + private TurtleInventoryCrafting() { } - @Nullable - private Recipe tryCrafting(int xStart, int yStart) { - this.xStart = xStart; - this.yStart = yStart; - + private static @Nullable FoundRecipe tryCrafting(Level level, Container inventory, int xStart, int yStart) { // Check the non-relevant parts of the inventory are empty for (var x = 0; x < TurtleBlockEntity.INVENTORY_WIDTH; x++) { for (var y = 0; y < TurtleBlockEntity.INVENTORY_HEIGHT; y++) { - if (x < this.xStart || x >= this.xStart + 3 || - y < this.yStart || y >= this.yStart + 3) { - if (!turtle.getInventory().getItem(x + y * TurtleBlockEntity.INVENTORY_WIDTH).isEmpty()) { + if (x < xStart || x >= xStart + WIDTH || y < yStart || y >= yStart + HEIGHT) { + if (!inventory.getItem(x + y * TurtleBlockEntity.INVENTORY_WIDTH).isEmpty()) { return null; } } } } - // Check the actual crafting - return turtle.getLevel().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, this, turtle.getLevel()).map(RecipeHolder::value).orElse(null); + var input = CraftingInput.ofPositioned(WIDTH, HEIGHT, new AbstractList<>() { + @Override + public ItemStack get(int index) { + var x = xStart + index % WIDTH; + var y = yStart + index / WIDTH; + return x >= 0 && x < TurtleBlockEntity.INVENTORY_WIDTH && y >= 0 && y < TurtleBlockEntity.INVENTORY_HEIGHT + ? inventory.getItem(x + y * TurtleBlockEntity.INVENTORY_WIDTH) + : ItemStack.EMPTY; + } + + @Override + public int size() { + return WIDTH * HEIGHT; + } + }); + var recipe = level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, input.input(), level).orElse(null); + return recipe == null ? null : new FoundRecipe(recipe.value(), input.input(), input.left() + xStart, input.top() + yStart); } @Nullable - public List doCrafting(Level world, int maxCount) { - if (world.isClientSide || !(world instanceof ServerLevel)) return null; + public static List craft(ITurtleAccess turtle, int maxCount) { + var level = turtle.getLevel(); + if (level.isClientSide || !(level instanceof ServerLevel)) return null; + + var inventory = turtle.getInventory(); // Find out what we can craft - var recipe = tryCrafting(0, 0); - if (recipe == null) recipe = tryCrafting(0, 1); - if (recipe == null) recipe = tryCrafting(1, 0); - if (recipe == null) recipe = tryCrafting(1, 1); - if (recipe == null) return null; + var candidate = tryCrafting(level, inventory, 0, 0); + if (candidate == null) candidate = tryCrafting(level, inventory, 0, 1); + if (candidate == null) candidate = tryCrafting(level, inventory, 1, 0); + if (candidate == null) candidate = tryCrafting(level, inventory, 1, 1); + if (candidate == null) return null; // Special case: craft(0) just returns an empty list if crafting was possible if (maxCount == 0) return List.of(); + var recipe = candidate.recipe(); + var input = candidate.input(); + var xStart = candidate.xStart(); + var yStart = candidate.xStart(); + var player = TurtlePlayer.get(turtle).player(); var results = new ArrayList(); - for (var i = 0; i < maxCount && recipe.matches(this, world); i++) { - var result = recipe.assemble(this, world.registryAccess()); + for (var i = 0; i < maxCount && recipe.matches(input, level); i++) { + var result = recipe.assemble(input, level.registryAccess()); if (result.isEmpty()) break; results.add(result); - result.onCraftedBy(world, player, result.getCount()); - PlatformHelper.get().onItemCrafted(player, this, result); + result.onCraftedBy(level, player, result.getCount()); + PlatformHelper.get().onItemCrafted(player, input, result); - var remainders = PlatformHelper.get().getRecipeRemainingItems(player, recipe, this); - for (var slot = 0; slot < remainders.size(); slot++) { - var existing = getItem(slot); - var remainder = remainders.get(slot); + var remainders = PlatformHelper.get().getRecipeRemainingItems(player, recipe, input); + for (var y = 0; y < input.height(); y++) { + for (var x = 0; x < input.width(); x++) { + var slot = xStart + x + (y + yStart) * TurtleBlockEntity.INVENTORY_WIDTH; + var existing = inventory.getItem(slot); + var remainder = remainders.get(x + y * input.width()); - if (!existing.isEmpty()) { - removeItem(slot, 1); - existing = getItem(slot); - } + if (!existing.isEmpty()) { + inventory.removeItem(slot, 1); + existing = inventory.getItem(slot); + } - if (remainder.isEmpty()) continue; + if (remainder.isEmpty()) continue; - // Either update the current stack or add it to the remainder list (to be inserted into the inventory - // afterwards). - if (existing.isEmpty()) { - setItem(slot, remainder); - } else if (ItemStack.isSameItemSameComponents(existing, remainder)) { - remainder.grow(existing.getCount()); - setItem(slot, remainder); - } else { - results.add(remainder); + // Either update the current stack or add it to the remainder list (to be inserted into the inventory + // afterwards). + if (existing.isEmpty()) { + inventory.setItem(slot, existing); + } else if (ItemStack.isSameItemSameComponents(existing, remainder)) { + remainder.grow(existing.getCount()); + inventory.setItem(slot, remainder); + } else { + results.add(remainder); + } } } } @@ -112,102 +124,6 @@ public class TurtleInventoryCrafting implements CraftingContainer { return Collections.unmodifiableList(results); } - @Override - public int getWidth() { - return WIDTH; - } - - @Override - public int getHeight() { - return HEIGHT; - } - - private int modifyIndex(int index) { - var x = xStart + index % getWidth(); - var y = yStart + index / getHeight(); - return x >= 0 && x < TurtleBlockEntity.INVENTORY_WIDTH && y >= 0 && y < TurtleBlockEntity.INVENTORY_HEIGHT - ? x + y * TurtleBlockEntity.INVENTORY_WIDTH - : -1; - } - - @Override - public boolean isEmpty() { - for (int i = 0; i < SIZE; i++) { - if (!getItem(i).isEmpty()) return false; - } - return true; - } - - @Override - public int getContainerSize() { - return SIZE; - } - - @Override - public ItemStack getItem(int i) { - return turtle.getInventory().getItem(modifyIndex(i)); - } - - @Override - public ItemStack removeItemNoUpdate(int i) { - return turtle.getInventory().removeItemNoUpdate(modifyIndex(i)); - } - - @Override - public ItemStack removeItem(int i, int size) { - return turtle.getInventory().removeItem(modifyIndex(i), size); - } - - @Override - public void setItem(int i, ItemStack stack) { - turtle.getInventory().setItem(modifyIndex(i), stack); - } - - @Override - public int getMaxStackSize() { - return turtle.getInventory().getMaxStackSize(); - } - - @Override - public void setChanged() { - turtle.getInventory().setChanged(); - } - - @Override - public boolean stillValid(Player player) { - return true; - } - - @Override - public boolean canPlaceItem(int i, ItemStack stack) { - return turtle.getInventory().canPlaceItem(modifyIndex(i), stack); - } - - @Override - public void clearContent() { - for (var i = 0; i < SIZE; i++) { - var j = modifyIndex(i); - turtle.getInventory().setItem(j, ItemStack.EMPTY); - } - } - - @Override - public void fillStackedContents(StackedContents contents) { - for (int i = 0; i < SIZE; i++) contents.accountSimpleStack(getItem(i)); - } - - @Override - public List getItems() { - return new AbstractList<>() { - @Override - public ItemStack get(int index) { - return getItem(index); - } - - @Override - public int size() { - return SIZE; - } - }; + private record FoundRecipe(Recipe recipe, CraftingInput input, int xStart, int yStart) { } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java index e29d85335..afac649d5 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java @@ -21,8 +21,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponents; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.EntityTypeTags; import net.minecraft.tags.TagKey; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -31,6 +33,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.entity.projectile.ProjectileDeflection; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.BlockGetter; @@ -207,32 +211,30 @@ public class TurtleTool extends AbstractTurtleUpgrade { */ private boolean attack(ServerPlayer player, Direction direction, Entity entity) { var baseDamage = (float) player.getAttributeValue(Attributes.ATTACK_DAMAGE) * spec.damageMultiplier(); - var bonusDamage = EnchantmentHelper.getDamageBonus(player.getItemInHand(InteractionHand.MAIN_HAND), entity.getType()); - var damage = baseDamage + bonusDamage; - if (damage <= 0) return false; - - var knockBack = EnchantmentHelper.getKnockbackBonus(player); - - // We follow the logic in Player.attack of setting the entity on fire before attacking, so it's burning when it - // (possibly) dies. - var fireAspect = EnchantmentHelper.getFireAspect(player); - var onFire = false; - if (entity instanceof LivingEntity target && fireAspect > 0 && !target.isOnFire()) { - onFire = true; - target.igniteForSeconds(1); - } - + var tool = player.getWeaponItem(); var source = player.damageSources().playerAttack(player); - if (!entity.hurt(source, damage)) { - // If we failed to damage the entity, undo us setting the entity on fire. - if (onFire) entity.clearFire(); - return false; + var bonusDamage = EnchantmentHelper.modifyDamage(player.serverLevel(), tool, entity, source, baseDamage) - baseDamage; + + // If this is a projectile, attempt to deflect it instead. + if (entity.getType().is(EntityTypeTags.REDIRECTABLE_PROJECTILE) && entity instanceof Projectile projectile && + projectile.deflect(ProjectileDeflection.AIM_DEFLECT, player, player, true) + ) { + return true; } + if (baseDamage <= 0 && bonusDamage <= 0) return false; + + var entityVelocity = entity.getDeltaMovement(); + + // Compute the total damage, and deal it out. + var damage = baseDamage + bonusDamage + tool.getItem().getAttackDamageBonus(entity, baseDamage, source); + if (!entity.hurt(source, damage)) return false; + // Special case for armor stands: attack twice to guarantee destroy if (entity.isAlive() && entity instanceof ArmorStand) entity.hurt(source, damage); // Apply knockback + var knockBack = EnchantmentHelper.modifyKnockback(player.serverLevel(), tool, entity, source, (float) player.getAttributeValue(Attributes.ATTACK_KNOCKBACK)); if (knockBack > 0) { if (entity instanceof LivingEntity target) { target.knockback(knockBack * 0.5, -direction.getStepX(), -direction.getStepZ()); @@ -241,18 +243,20 @@ public class TurtleTool extends AbstractTurtleUpgrade { } } - // Apply remaining enchantments - if (entity instanceof LivingEntity target) EnchantmentHelper.doPostHurtEffects(target, player); - EnchantmentHelper.doPostDamageEffects(player, entity); - - // Damage the original item stack. - if (entity instanceof LivingEntity target) { - player.getItemInHand(InteractionHand.MAIN_HAND).hurtEnemy(target, player); + if (entity instanceof ServerPlayer otherPlayer && entity.hurtMarked) { + otherPlayer.connection.send(new ClientboundSetEntityMotionPacket(entity)); + entity.hurtMarked = false; + entity.setDeltaMovement(entityVelocity); } - // Apply fire aspect - if (entity instanceof LivingEntity target && fireAspect > 0 && !target.isOnFire()) { - target.igniteForSeconds(4 * fireAspect); + var didHurt = entity instanceof LivingEntity target && tool.hurtEnemy(target, player); + + // Apply remaining enchantments + EnchantmentHelper.doPostAttackEffects(player.serverLevel(), entity, source); + + // Damage the original item stack. + if (!tool.isEmpty() && entity instanceof LivingEntity && didHurt) { + tool.postHurtEnemy((LivingEntity) entity, player); } return true; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/ArgumentHelpers.java b/projects/common/src/main/java/dan200/computercraft/shared/util/ArgumentHelpers.java index 8f4b96f04..f4c4fb257 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/util/ArgumentHelpers.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/util/ArgumentHelpers.java @@ -22,7 +22,7 @@ public final class ArgumentHelpers { public static T getRegistryEntry(String name, String typeName, Registry registry) throws LuaException { ResourceLocation id; try { - id = new ResourceLocation(name); + id = ResourceLocation.parse(name); } catch (ResourceLocationException e) { id = null; } diff --git a/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java b/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java index 36cf80a8e..ab7cb71d0 100644 --- a/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java +++ b/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java @@ -30,11 +30,11 @@ import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -156,12 +156,12 @@ public class TestPlatformHelper extends AbstractComputerCraftAPI implements Plat } @Override - public List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingContainer container) { + public List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingInput container) { throw new UnsupportedOperationException("Cannot query recipes inside tests"); } @Override - public void onItemCrafted(ServerPlayer player, CraftingContainer container, ItemStack stack) { + public void onItemCrafted(ServerPlayer player, CraftingInput container, ItemStack stack) { throw new UnsupportedOperationException("Cannot interact with the world inside tests"); } diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Recipe_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Recipe_Test.kt index 699075d9d..9186ef2a3 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Recipe_Test.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Recipe_Test.kt @@ -8,18 +8,16 @@ import com.mojang.authlib.GameProfile import dan200.computercraft.gametest.api.Structures import dan200.computercraft.gametest.api.sequence import dan200.computercraft.shared.ModRegistry +import net.minecraft.core.NonNullList import net.minecraft.core.component.DataComponentPatch import net.minecraft.core.component.DataComponents import net.minecraft.gametest.framework.GameTest import net.minecraft.gametest.framework.GameTestAssertException import net.minecraft.gametest.framework.GameTestHelper -import net.minecraft.world.entity.player.Player -import net.minecraft.world.inventory.AbstractContainerMenu -import net.minecraft.world.inventory.MenuType -import net.minecraft.world.inventory.TransientCraftingContainer import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraft.world.item.component.ResolvableProfile +import net.minecraft.world.item.crafting.CraftingInput import net.minecraft.world.item.crafting.RecipeType import org.junit.jupiter.api.Assertions.assertEquals import java.util.* @@ -33,9 +31,10 @@ class Recipe_Test { @GameTest(template = Structures.DEFAULT) fun Craft_result_has_nbt(context: GameTestHelper) = context.sequence { thenExecute { - val container = TransientCraftingContainer(DummyMenu, 3, 3) - container.setItem(0, ItemStack(Items.SKELETON_SKULL)) - container.setItem(1, ItemStack(ModRegistry.Items.COMPUTER_ADVANCED.get())) + val items = NonNullList.withSize(3 * 3, ItemStack.EMPTY) + items[0] = ItemStack(Items.SKELETON_SKULL) + items[1] = ItemStack(ModRegistry.Items.COMPUTER_ADVANCED.get()) + val container = CraftingInput.of(3, 3, items) val recipe = context.level.server.recipeManager .getRecipeFor(RecipeType.CRAFTING, container, context.level) @@ -49,9 +48,4 @@ class Recipe_Test { assertEquals(tag, result.componentsPatch, "Expected NBT tags to be the same") } } - - object DummyMenu : AbstractContainerMenu(MenuType.GENERIC_9x1, 0) { - override fun quickMoveStack(player: Player, slot: Int): ItemStack = ItemStack.EMPTY - override fun stillValid(p0: Player): Boolean = true - } } diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Speaker_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Speaker_Test.kt index 8a2d9572f..778b2f0b9 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Speaker_Test.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Speaker_Test.kt @@ -36,7 +36,7 @@ class Speaker_Test { @GameTest fun Will_not_play_record(helper: GameTestHelper) = helper.sequence { thenOnComputer { - callPeripheral("right", "playSound", SoundEvents.MUSIC_DISC_PIGSTEP.location.toString()) + callPeripheral("right", "playSound", SoundEvents.MUSIC_DISC_PIGSTEP.key().location().toString()) .assertArrayEquals(false) } } diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt index b99606217..3fde0e6ce 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt @@ -27,6 +27,7 @@ import dan200.computercraft.test.core.assertArrayEquals import dan200.computercraft.test.core.computer.LuaTaskContext import dan200.computercraft.test.core.computer.getApi import net.minecraft.core.BlockPos +import net.minecraft.core.registries.Registries import net.minecraft.gametest.framework.GameTest import net.minecraft.gametest.framework.GameTestHelper import net.minecraft.resources.ResourceLocation @@ -234,7 +235,7 @@ class Turtle_Test { val upgrade = turtle.getUpgrade(TurtleSide.LEFT) assertEquals( helper.level.registryAccess().registryOrThrow(ITurtleUpgrade.REGISTRY) - .get(ResourceLocation("cctest", "wooden_pickaxe")), + .get(ResourceLocation.fromNamespaceAndPath("cctest", "wooden_pickaxe")), upgrade, "Upgrade is a wooden pickaxe", ) @@ -263,7 +264,7 @@ class Turtle_Test { ItemStack(Items.WOODEN_PICKAXE), UpgradeData.ofDefault( helper.level.registryAccess().registryOrThrow(ITurtleUpgrade.REGISTRY) - .getHolder(ResourceLocation("cctest", "wooden_pickaxe")).orElseThrow(), + .getHolder(ResourceLocation.fromNamespaceAndPath("cctest", "wooden_pickaxe")).orElseThrow(), ), ) } @@ -284,14 +285,18 @@ class Turtle_Test { val upgrade = turtle.getUpgrade(TurtleSide.LEFT) assertEquals( helper.level.registryAccess().registryOrThrow(ITurtleUpgrade.REGISTRY) - .get(ResourceLocation("cctest", "netherite_pickaxe")), + .get(ResourceLocation.fromNamespaceAndPath("cctest", "netherite_pickaxe")), upgrade, "Upgrade is a netherite pickaxe", ) val item = ItemStack(Items.NETHERITE_PICKAXE) item.damageValue = 1 - item.enchant(Enchantments.SILK_TOUCH, 1) + item.enchant( + helper.level.registryAccess().registryOrThrow(Registries.ENCHANTMENT) + .getHolderOrThrow(Enchantments.SILK_TOUCH), + 1, + ) helper.assertUpgradeItem(item, turtle.getUpgradeWithData(TurtleSide.LEFT)!!) } diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/api/TestExtensions.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/api/TestExtensions.kt index 60fecc0f4..f636682e2 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/api/TestExtensions.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/api/TestExtensions.kt @@ -177,7 +177,7 @@ fun > GameTestHelper.assertBlockHas(pos: BlockPos, property: P * Get a [Container] at a given position. */ fun GameTestHelper.getContainerAt(pos: BlockPos): Container = - when (val container = getBlockEntity(pos)) { + when (val container: BlockEntity = getBlockEntity(pos)) { is Container -> container null -> failVerbose("Expected a container at $pos, found nothing", pos) else -> failVerbose("Expected a container at $pos, found ${getName(container.type)}", pos) @@ -226,7 +226,7 @@ private fun GameTestHelper.assertContainerExactlyImpl(pos: BlockPos, container: */ private fun GameTestHelper.getPeripheralAt(pos: BlockPos, direction: Direction): IPeripheral? { val be = BarrelBlockEntity(absolutePos(pos).relative(direction), Blocks.BARREL.defaultBlockState()) - be.level = level + be.setLevel(level) return PlatformHelper.get().createPeripheralAccess(be) { }.get(direction.opposite) } @@ -260,10 +260,9 @@ private fun getName(type: BlockEntityType<*>): ResourceLocation = * Get a [BlockEntity] of a specific type. */ fun GameTestHelper.getBlockEntity(pos: BlockPos, type: BlockEntityType): T { - val tile = getBlockEntity(pos) + val tile: BlockEntity = getBlockEntity(pos) @Suppress("UNCHECKED_CAST") return when { - tile == null -> failVerbose("Expected ${getName(type)}, but no tile was there", pos) tile.type != type -> failVerbose("Expected ${getName(type)} but got ${getName(tile.type)}", pos) else -> tile as T } diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt index e42b19ae9..2240934da 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/ClientTestHooks.kt @@ -125,7 +125,7 @@ object ClientTestHooks { GameTestBatchFactory.fromTestFunction(GameTestRegistry.getAllTestFunctions(), server.overworld()), server.overworld(), ) - .newStructureSpawner(StructureGridSpawner(TestHooks.getTestOrigin(server), 8)) + .newStructureSpawner(StructureGridSpawner(TestHooks.getTestOrigin(server), 8, false)) .build() val testTracker = MultipleTestTracker(tests.testInfos) diff --git a/projects/fabric-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementLookup.java b/projects/fabric-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementLookup.java index 73cde4d01..6e5023ef7 100644 --- a/projects/fabric-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementLookup.java +++ b/projects/fabric-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementLookup.java @@ -14,7 +14,7 @@ import net.minecraft.resources.ResourceLocation; * from a block. */ public final class WiredElementLookup { - public static final ResourceLocation ID = new ResourceLocation(ComputerCraftAPI.MOD_ID, "wired_node"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "wired_node"); private static final BlockApiLookup lookup = BlockApiLookup.get(ID, WiredElement.class, Direction.class); diff --git a/projects/fabric-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralLookup.java b/projects/fabric-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralLookup.java index 439beb341..f5256cca1 100644 --- a/projects/fabric-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralLookup.java +++ b/projects/fabric-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralLookup.java @@ -14,7 +14,7 @@ import net.minecraft.resources.ResourceLocation; * for a block. It should NOT be used to query peripherals. */ public final class PeripheralLookup { - public static final ResourceLocation ID = new ResourceLocation(ComputerCraftAPI.MOD_ID, "peripheral"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "peripheral"); private static final BlockApiLookup lookup = BlockApiLookup.get(ID, IPeripheral.class, Direction.class); diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java index bc2c28650..cd2b8e287 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/CustomModelLoader.java @@ -106,10 +106,11 @@ public final class CustomModelLoader { * @return The wrapped model. */ public BakedModel wrapModel(ModelModifier.AfterBake.Context ctx, BakedModel baked) { - if (!ctx.id().getNamespace().equals(ComputerCraftAPI.MOD_ID)) return baked; + var id = ctx.resourceId(); + if (id == null || !id.getNamespace().equals(ComputerCraftAPI.MOD_ID)) return baked; if (!(ctx.sourceModel() instanceof BlockModel model)) return baked; - var emissive = getEmissive(ctx.id(), model); + var emissive = getEmissive(id, model); return emissive == null ? baked : EmissiveBakedModel.wrap(baked, ctx.textureGetter().apply(model.getMaterial(emissive))); } diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/UnbakedTurtleModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/UnbakedTurtleModel.java index 4a8806735..e04a7da2c 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/UnbakedTurtleModel.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/turtle/UnbakedTurtleModel.java @@ -22,7 +22,7 @@ import java.util.function.Function; * {@link TurtleModel}. */ public final class UnbakedTurtleModel implements UnbakedModel { - private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); + private static final ResourceLocation COLOUR_TURTLE_MODEL = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); private final ResourceLocation model; @@ -31,7 +31,7 @@ public final class UnbakedTurtleModel implements UnbakedModel { } public static UnbakedModel parse(JsonObject json) { - var model = new ResourceLocation(GsonHelper.getAsString(json, "model")); + var model = ResourceLocation.parse(GsonHelper.getAsString(json, "model")); return new UnbakedTurtleModel(model); } @@ -47,7 +47,7 @@ public final class UnbakedTurtleModel implements UnbakedModel { } @Override - public BakedModel bake(ModelBaker bakery, Function spriteGetter, ModelState transform, ResourceLocation location) { + public BakedModel bake(ModelBaker bakery, Function spriteGetter, ModelState transform) { var mainModel = bakery.bake(model, transform); if (mainModel == null) throw new NullPointerException(model + " failed to bake"); diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java b/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java index 58a072006..b8eaee2d2 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java @@ -9,15 +9,13 @@ import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.client.model.FoiledModel; import dan200.computercraft.client.render.ModelRenderer; import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.core.BlockPos; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; import net.minecraft.util.RandomSource; import javax.annotation.Nullable; @@ -27,11 +25,16 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper { private static final RandomSource random = RandomSource.create(0); @Override - public BakedModel getModel(ModelManager manager, ResourceLocation location) { - var model = manager.getModel(location); + public BakedModel getModel(ModelManager manager, ResourceLocation resourceLocation) { + var model = manager.getModel(resourceLocation); return model == null ? manager.getMissingModel() : model; } + @Override + public BakedModel getModel(ModelManager manager, ModelResourceLocation modelLocation, @Nullable ResourceLocation resourceLocation) { + return resourceLocation == null ? manager.getModel(modelLocation) : getModel(manager, resourceLocation); + } + @Override public BakedModel createdFoiledModel(BakedModel model) { return new FoiledModel(model); @@ -49,9 +52,4 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper { ModelRenderer.renderQuads(transform, buffer, model.getQuads(null, face, random), lightmapCoord, overlayLight, tints); } } - - @Override - public void playStreamingMusic(BlockPos pos, @Nullable SoundEvent sound) { - Minecraft.getInstance().levelRenderer.playStreamingMusic(sound, pos); - } } diff --git a/projects/fabric/src/generated/resources/data/computercraft/recipes/wireless_modem_normal.json b/projects/fabric/src/generated/resources/data/computercraft/recipe/wireless_modem_normal.json similarity index 100% rename from projects/fabric/src/generated/resources/data/computercraft/recipes/wireless_modem_normal.json rename to projects/fabric/src/generated/resources/data/computercraft/recipe/wireless_modem_normal.json diff --git a/projects/fabric/src/generated/resources/data/computercraft/recipes/printed_book.json b/projects/fabric/src/generated/resources/data/computercraft/recipes/printed_book.json deleted file mode 100644 index 44c5aafa6..000000000 --- a/projects/fabric/src/generated/resources/data/computercraft/recipes/printed_book.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "computercraft:printout", - "category": "redstone", - "ingredients": [{"item": "minecraft:leather"}, {"tag": "c:strings"}], - "min_printouts": 1, - "printout": [ - {"item": "computercraft:printed_page"}, - {"item": "computercraft:printed_pages"}, - {"item": "minecraft:paper"} - ], - "result": {"count": 1, "id": "computercraft:printed_book"} -} diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java b/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java index 4a459cf2e..ab9f4bf71 100644 --- a/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java +++ b/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java @@ -148,7 +148,7 @@ public class ComputerCraft { @Override public ResourceLocation getFabricId() { - return new ResourceLocation(ComputerCraftAPI.MOD_ID, name); + return ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name); } @Override diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java index c38c23a2d..1136a29cc 100644 --- a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java +++ b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java @@ -51,10 +51,10 @@ 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.inventory.CraftingContainer; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.*; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; @@ -142,7 +142,7 @@ public class PlatformHelperImpl implements PlatformHelper { return new RecipeIngredients( Ingredient.of(ConventionalItemTags.REDSTONE_DUSTS), Ingredient.of(ConventionalItemTags.STRINGS), - Ingredient.of(Items.LEATHER), + Ingredient.of(ConventionalItemTags.LEATHERS), Ingredient.of(ConventionalItemTags.GLASS_PANES), Ingredient.of(ConventionalItemTags.GOLD_INGOTS), Ingredient.of(ConventionalItemTags.STORAGE_BLOCKS_GOLD), @@ -192,12 +192,12 @@ public class PlatformHelperImpl implements PlatformHelper { } @Override - public List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingContainer container) { + public List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingInput container) { return recipe.getRemainingItems(container); } @Override - public void onItemCrafted(ServerPlayer player, CraftingContainer container, ItemStack stack) { + public void onItemCrafted(ServerPlayer player, CraftingInput container, ItemStack stack) { } @Override @@ -256,7 +256,7 @@ public class PlatformHelperImpl implements PlatformHelper { @Override public RegistryEntry register(String name, Supplier create) { - var entry = new RegistryEntryImpl<>(new ResourceLocation(ComputerCraftAPI.MOD_ID, name), create); + var entry = new RegistryEntryImpl<>(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, name), create); entries.add(entry); return entry; } diff --git a/projects/fabric/src/main/resources/fabric.mod.json b/projects/fabric/src/main/resources/fabric.mod.json index 63268f2b8..f110a9f5a 100644 --- a/projects/fabric/src/main/resources/fabric.mod.json +++ b/projects/fabric/src/main/resources/fabric.mod.json @@ -46,8 +46,8 @@ ], "depends": { "fabricloader": ">=0.15.10", - "fabric-api": ">=0.97.3", - "minecraft": "=1.20.6" + "fabric-api": ">=0.100.3", + "minecraft": "=1.21" }, "accessWidener": "computercraft.accesswidener" } diff --git a/projects/fabric/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java b/projects/fabric/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java index 4a2ba819d..6d82feef2 100644 --- a/projects/fabric/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java +++ b/projects/fabric/src/testMod/java/dan200/computercraft/gametest/core/TestMod.java @@ -22,7 +22,7 @@ public class TestMod implements ModInitializer, ClientModInitializer { public void onInitialize() { TestHooks.init(); - var phase = new ResourceLocation(ComputerCraftAPI.MOD_ID, "test_mod"); + var phase = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "test_mod"); ServerLifecycleEvents.SERVER_STARTED.addPhaseOrdering(Event.DEFAULT_PHASE, phase); ServerLifecycleEvents.SERVER_STARTED.register(phase, TestHooks::onServerStarted); CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> CCTestCommand.register(dispatcher)); diff --git a/projects/forge-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementCapability.java b/projects/forge-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementCapability.java index 6ce9a1ffd..db8cdce9e 100644 --- a/projects/forge-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementCapability.java +++ b/projects/forge-api/src/main/java/dan200/computercraft/api/network/wired/WiredElementCapability.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.capabilities.BlockCapability; * from a block. */ public final class WiredElementCapability { - public static final ResourceLocation ID = new ResourceLocation(ComputerCraftAPI.MOD_ID, "wired_node"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "wired_node"); private static final BlockCapability capability = BlockCapability.create(ID, WiredElement.class, Direction.class); diff --git a/projects/forge-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralCapability.java b/projects/forge-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralCapability.java index e4067beb0..462c374d4 100644 --- a/projects/forge-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralCapability.java +++ b/projects/forge-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralCapability.java @@ -14,7 +14,7 @@ import net.neoforged.neoforge.capabilities.BlockCapability; * for a block. It should NOT be used to query peripherals. */ public final class PeripheralCapability { - public static final ResourceLocation ID = new ResourceLocation(ComputerCraftAPI.MOD_ID, "peripheral"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "peripheral"); private static final BlockCapability capability = BlockCapability.create(ID, IPeripheral.class, Direction.class); diff --git a/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java b/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java index 81279dbf0..64ea01d23 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java @@ -10,6 +10,7 @@ import dan200.computercraft.client.model.turtle.TurtleModelLoader; import dan200.computercraft.client.turtle.TurtleUpgradeModellers; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; @@ -33,7 +34,7 @@ public final class ForgeClientRegistry { @SubscribeEvent public static void registerModelLoaders(ModelEvent.RegisterGeometryLoaders event) { - event.register(new ResourceLocation(ComputerCraftAPI.MOD_ID, "turtle"), TurtleModelLoader.INSTANCE); + event.register(ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "turtle"), TurtleModelLoader.INSTANCE); } /** @@ -56,7 +57,7 @@ public final class ForgeClientRegistry { @SubscribeEvent public static void registerModels(ModelEvent.RegisterAdditional event) { gatherModellers(); - ClientRegistry.registerExtraModels(event::register); + ClientRegistry.registerExtraModels(x -> event.register(ModelResourceLocation.standalone(x))); } @SubscribeEvent diff --git a/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java b/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java index 1da96866f..430582937 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/model/FoiledModel.java @@ -35,7 +35,7 @@ public final class FoiledModel extends BakedModelWrapper { @Override public List getRenderTypes(ItemStack itemStack, boolean fabulous) { - return new ConsList<>(fabulous ? RenderType.glintDirect() : RenderType.glint(), super.getRenderTypes(itemStack, fabulous)); + return new ConsList<>(fabulous ? RenderType.glintTranslucent() : RenderType.glint(), super.getRenderTypes(itemStack, fabulous)); } @Override diff --git a/projects/forge/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelLoader.java b/projects/forge/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelLoader.java index 6ebed3b6a..34a042428 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelLoader.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelLoader.java @@ -28,7 +28,7 @@ import java.util.function.Function; * {@link TurtleModel}. */ public final class TurtleModelLoader implements IGeometryLoader { - private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); + private static final ResourceLocation COLOUR_TURTLE_MODEL = ResourceLocation.fromNamespaceAndPath(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); public static final TurtleModelLoader INSTANCE = new TurtleModelLoader(); @@ -37,7 +37,7 @@ public final class TurtleModelLoader implements IGeometryLoader spriteGetter, ModelState transform, ItemOverrides overrides, ResourceLocation modelLocation) { + public BakedModel bake(IGeometryBakingContext owner, ModelBaker bakery, Function spriteGetter, ModelState transform, ItemOverrides overrides) { var mainModel = bakery.bake(family, transform, spriteGetter); if (mainModel == null) throw new NullPointerException(family + " failed to bake"); diff --git a/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java b/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java index 381b8dd7c..2e1c72ed6 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java @@ -8,14 +8,12 @@ import com.google.auto.service.AutoService; import com.mojang.blaze3d.vertex.PoseStack; import dan200.computercraft.client.model.FoiledModel; import dan200.computercraft.client.render.ModelRenderer; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.core.BlockPos; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; import net.minecraft.util.RandomSource; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.client.model.data.ModelData; @@ -29,8 +27,13 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper { private static final Direction[] directions = Arrays.copyOf(Direction.values(), 7); @Override - public BakedModel getModel(ModelManager manager, ResourceLocation location) { - return manager.getModel(location); + public BakedModel getModel(ModelManager manager, ResourceLocation resourceLocation) { + return manager.getModel(ModelResourceLocation.standalone(resourceLocation)); + } + + @Override + public BakedModel getModel(ModelManager manager, ModelResourceLocation modelLocation, @Nullable ResourceLocation resourceLocation) { + return manager.getModel(modelLocation); } @Override @@ -49,9 +52,4 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper { } } } - - @Override - public void playStreamingMusic(BlockPos pos, @Nullable SoundEvent sound) { - Minecraft.getInstance().levelRenderer.playStreamingMusic(sound, pos, null); - } } diff --git a/projects/forge/src/generated/resources/data/computercraft/recipes/wireless_modem_normal.json b/projects/forge/src/generated/resources/data/computercraft/recipe/wireless_modem_normal.json similarity index 100% rename from projects/forge/src/generated/resources/data/computercraft/recipes/wireless_modem_normal.json rename to projects/forge/src/generated/resources/data/computercraft/recipe/wireless_modem_normal.json diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java index c841d4aab..68b47c5ee 100644 --- a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java +++ b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java @@ -15,6 +15,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.PeripheralCapability; import dan200.computercraft.impl.Peripherals; import dan200.computercraft.shared.config.ConfigFile; +import dan200.computercraft.shared.container.ListContainer; import dan200.computercraft.shared.network.container.ContainerData; import dan200.computercraft.shared.util.InventoryUtil; import net.minecraft.commands.synchronization.ArgumentTypeInfo; @@ -36,12 +37,12 @@ import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.crafting.CraftingInput; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; @@ -49,7 +50,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.neoforged.bus.api.Event; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.BlockCapabilityCache; import net.neoforged.neoforge.capabilities.Capabilities; @@ -187,7 +187,7 @@ public class PlatformHelperImpl implements PlatformHelper { } @Override - public List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingContainer container) { + public List getRecipeRemainingItems(ServerPlayer player, Recipe recipe, CraftingInput container) { CommonHooks.setCraftingPlayer(player); var result = recipe.getRemainingItems(container); CommonHooks.setCraftingPlayer(null); @@ -195,8 +195,8 @@ public class PlatformHelperImpl implements PlatformHelper { } @Override - public void onItemCrafted(ServerPlayer player, CraftingContainer container, ItemStack stack) { - EventHooks.firePlayerCraftingEvent(player, stack, container); + public void onItemCrafted(ServerPlayer player, CraftingInput container, ItemStack stack) { + EventHooks.firePlayerCraftingEvent(player, stack, new ListContainer(container.items())); } @Override @@ -239,18 +239,18 @@ public class PlatformHelperImpl implements PlatformHelper { if (event.isCanceled()) return event.getCancellationResult(); var context = new UseOnContext(player, InteractionHand.MAIN_HAND, hit); - if (event.getUseItem() != Event.Result.DENY) { + if (!event.getUseItem().isFalse()) { var result = stack.onItemUseFirst(context); if (result != InteractionResult.PASS) return result; } var block = level.getBlockState(hit.getBlockPos()); - if (event.getUseBlock() != Event.Result.DENY && !block.isAir() && canUseBlock.test(block)) { + if (!event.getUseBlock().isFalse() && !block.isAir() && canUseBlock.test(block)) { var useResult = block.useItemOn(stack, level, player, InteractionHand.MAIN_HAND, hit); if (useResult.consumesAction()) return useResult.result(); } - return event.getUseItem() == Event.Result.DENY ? InteractionResult.PASS : stack.useOn(context); + return event.getUseItem().isFalse() ? InteractionResult.PASS : stack.useOn(context); } private record RegistrationHelperImpl(DeferredRegister registry) implements RegistrationHelper { diff --git a/projects/forge/src/main/resources/META-INF/neoforge.mods.toml b/projects/forge/src/main/resources/META-INF/neoforge.mods.toml index 726ecfe82..fe851f3e5 100644 --- a/projects/forge/src/main/resources/META-INF/neoforge.mods.toml +++ b/projects/forge/src/main/resources/META-INF/neoforge.mods.toml @@ -26,7 +26,7 @@ CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles a [[dependencies.computercraft]] modId="neoforge" type="required" - versionRange="[${neoVersion},20.7)" + versionRange="[${neoVersion},21.1)" ordering="NONE" side="BOTH"