diff --git a/build.gradle b/build.gradle index 242d0a40..55267951 100644 --- a/build.gradle +++ b/build.gradle @@ -40,8 +40,9 @@ java.toolchain { vendor = JvmVendorSpec.ADOPTOPENJDK } -compileJava.options.encoding = "utf-8" -compileTestJava.options.encoding = "utf-8" +tasks.withType(JavaCompile).configureEach { + options.encoding = 'utf-8' +} repositories { mavenCentral() @@ -68,12 +69,12 @@ dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - implementation "li.cil.sedna:sedna-${minecraft_version}-forge:1.0.12" + implementation "li.cil.sedna:sedna-${minecraft_version}-forge:1.0.13" - implementation fg.deobf("curse.maven:markdownmanual-502485:3565800") + implementation fg.deobf("curse.maven:markdownmanual-502485:3738124") - compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}:9.1.0.41:api") - runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:9.1.0.41") + compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}:9.7.0.180:api") + runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:9.7.0.180") testImplementation 'org.mockito:mockito-inline:4.3.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' diff --git a/gradle.properties b/gradle.properties index 520cff43..03f547f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -forge_version=39.0.66 +forge_version=40.0.40 semver=0.0.0 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 84d1f85f..41dfb879 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/minecraft.gradle b/minecraft.gradle index 742649be..03af5590 100644 --- a/minecraft.gradle +++ b/minecraft.gradle @@ -1,4 +1,4 @@ ext { - minecraft_version = '1.18.1' + minecraft_version = '1.18.2' minecraft_sdk = 'forge' } diff --git a/src/main/java/li/cil/oc2/api/bus/device/DeviceType.java b/src/main/java/li/cil/oc2/api/bus/device/DeviceType.java index 89e671bf..7730b3e4 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/DeviceType.java +++ b/src/main/java/li/cil/oc2/api/bus/device/DeviceType.java @@ -3,9 +3,11 @@ package li.cil.oc2.api.bus.device; import li.cil.oc2.api.API; +import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraftforge.registries.IForgeRegistryEntry; @@ -20,14 +22,14 @@ public interface DeviceType extends IForgeRegistryEntry { /** * The registry name of the registry holding device types. */ - ResourceLocation REGISTRY = new ResourceLocation(API.MOD_ID, "device_type"); + ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(API.MOD_ID, "device_type")); /** * The tag representing this device type. * * @return the item tag. */ - Tag getTag(); + TagKey getTag(); /** * An icon rendered as background of empty slots, visually indicating the diff --git a/src/main/java/li/cil/oc2/api/bus/device/data/BlockDeviceData.java b/src/main/java/li/cil/oc2/api/bus/device/data/BlockDeviceData.java index d936b85a..80a39e60 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/data/BlockDeviceData.java +++ b/src/main/java/li/cil/oc2/api/bus/device/data/BlockDeviceData.java @@ -4,7 +4,9 @@ package li.cil.oc2.api.bus.device.data; import li.cil.oc2.api.API; import li.cil.sedna.api.device.BlockDevice; +import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.IForgeRegistryEntry; @@ -31,7 +33,7 @@ public interface BlockDeviceData extends IForgeRegistryEntry { /** * The registry name of the registry holding block device bases. */ - ResourceLocation REGISTRY = new ResourceLocation(API.MOD_ID, "block_device_data"); + ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(API.MOD_ID, "block_device_data")); /** * Gets the read-only base block device this implementation describes. diff --git a/src/main/java/li/cil/oc2/api/bus/device/data/Firmware.java b/src/main/java/li/cil/oc2/api/bus/device/data/Firmware.java index 1ab39d36..178459f1 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/data/Firmware.java +++ b/src/main/java/li/cil/oc2/api/bus/device/data/Firmware.java @@ -4,7 +4,9 @@ package li.cil.oc2.api.bus.device.data; import li.cil.oc2.api.API; import li.cil.sedna.api.memory.MemoryMap; +import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.IForgeRegistryEntry; @@ -26,7 +28,7 @@ public interface Firmware extends IForgeRegistryEntry { /** * The registry name of the registry holding firmwares. */ - ResourceLocation REGISTRY = new ResourceLocation(API.MOD_ID, "firmware"); + ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(API.MOD_ID, "firmware")); /** * Runs this firmware. diff --git a/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceProvider.java b/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceProvider.java index a45e4626..331b220d 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceProvider.java +++ b/src/main/java/li/cil/oc2/api/bus/device/provider/BlockDeviceProvider.java @@ -2,11 +2,15 @@ package li.cil.oc2.api.bus.device.provider; +import li.cil.oc2.api.API; import li.cil.oc2.api.bus.device.Device; import li.cil.oc2.api.bus.device.rpc.RPCDevice; import li.cil.oc2.api.bus.device.vm.VMDevice; import li.cil.oc2.api.util.Invalidatable; +import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.IForgeRegistryEntry; /** @@ -30,7 +34,7 @@ import net.minecraftforge.registries.IForgeRegistryEntry; * are registered. For example: *
  * class YourModInitialization {
- *     static DeferredRegister<BlockDeviceProvider> BLOCK_DEVICE_PROVIDERS = DeferredRegister.create(BlockDeviceProvider.class, "your_mod_id");
+ *     static DeferredRegister<BlockDeviceProvider> BLOCK_DEVICE_PROVIDERS = DeferredRegister.create(BlockDeviceProvider.REGISTRY, "your_mod_id");
  *
  *     static void initialize() {
  *         BLOCK_DEVICE_PROVIDERS.register("your_block_device_name", YourBlockDeviceProvider::new);
@@ -46,6 +50,11 @@ import net.minecraftforge.registries.IForgeRegistryEntry;
  * @see BlockDeviceQuery
  */
 public interface BlockDeviceProvider extends IForgeRegistryEntry {
+    /**
+     * The registry name of the registry holding block device providers.
+     */
+    ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(API.MOD_ID, "block_device_provider"));
+
     /**
      * Get a device for the specified query.
      *
diff --git a/src/main/java/li/cil/oc2/api/bus/device/provider/ItemDeviceProvider.java b/src/main/java/li/cil/oc2/api/bus/device/provider/ItemDeviceProvider.java
index 5454d252..aa57b48a 100644
--- a/src/main/java/li/cil/oc2/api/bus/device/provider/ItemDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/api/bus/device/provider/ItemDeviceProvider.java
@@ -2,10 +2,14 @@
 
 package li.cil.oc2.api.bus.device.provider;
 
+import li.cil.oc2.api.API;
 import li.cil.oc2.api.bus.device.ItemDevice;
 import li.cil.oc2.api.bus.device.rpc.RPCDevice;
 import li.cil.oc2.api.bus.device.vm.VMDevice;
+import net.minecraft.core.Registry;
 import net.minecraft.nbt.CompoundTag;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.resources.ResourceLocation;
 import net.minecraftforge.registries.IForgeRegistryEntry;
 
 import javax.annotation.Nullable;
@@ -27,7 +31,7 @@ import java.util.Optional;
  * are registered. For example:
  * 
  * class YourModInitialization {
- *     static DeferredRegister<ItemDeviceProvider> ITEM_DEVICE_PROVIDERS = DeferredRegister.create(ItemDeviceProvider.class, "your_mod_id");
+ *     static DeferredRegister<ItemDeviceProvider> ITEM_DEVICE_PROVIDERS = DeferredRegister.create(ItemDeviceProvider.REGISTRY, "your_mod_id");
  *
  *     static void initialize() {
  *         ITEM_DEVICE_PROVIDERS.register("your_item_device_name", YourItemDeviceProvider::new);
@@ -43,6 +47,11 @@ import java.util.Optional;
  * @see ItemDeviceQuery
  */
 public interface ItemDeviceProvider extends IForgeRegistryEntry {
+    /**
+     * The registry name of the registry holding item device providers.
+     */
+    ResourceKey> REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(API.MOD_ID, "item_device_provider"));
+
     /**
      * Get a device for the specified query.
      *
diff --git a/src/main/java/li/cil/oc2/client/manual/Manuals.java b/src/main/java/li/cil/oc2/client/manual/Manuals.java
index bbd133d8..095d8f61 100644
--- a/src/main/java/li/cil/oc2/client/manual/Manuals.java
+++ b/src/main/java/li/cil/oc2/client/manual/Manuals.java
@@ -11,6 +11,7 @@ import li.cil.manual.api.prefab.tab.ItemStackTab;
 import li.cil.manual.api.prefab.tab.TextureTab;
 import li.cil.manual.api.provider.DocumentProvider;
 import li.cil.manual.api.provider.PathProvider;
+import li.cil.manual.api.util.Constants;
 import li.cil.oc2.api.API;
 import li.cil.oc2.common.block.Blocks;
 import li.cil.oc2.common.item.Items;
@@ -25,7 +26,7 @@ import net.minecraftforge.registries.RegistryObject;
 
 @OnlyIn(Dist.CLIENT)
 public final class Manuals {
-    private static final DeferredRegister MANUALS = RegistryUtils.create(ManualModel.class);
+    private static final DeferredRegister MANUALS = RegistryUtils.getInitializerFor(Constants.MANUAL_REGISTRY);
 
     ///////////////////////////////////////////////////////////////////
 
@@ -34,9 +35,9 @@ public final class Manuals {
     ///////////////////////////////////////////////////////////////////
 
     public static void initialize() {
-        final DeferredRegister pathProviders = RegistryUtils.create(PathProvider.class);
-        final DeferredRegister contentProviders = RegistryUtils.create(DocumentProvider.class);
-        final DeferredRegister tabs = RegistryUtils.create(Tab.class);
+        final DeferredRegister pathProviders = RegistryUtils.getInitializerFor(Constants.PATH_PROVIDER_REGISTRY);
+        final DeferredRegister contentProviders = RegistryUtils.getInitializerFor(Constants.DOCUMENT_PROVIDER_REGISTRY);
+        final DeferredRegister tabs = RegistryUtils.getInitializerFor(Constants.TAB_REGISTRY);
 
         pathProviders.register("path_provider", () -> new NamespacePathProvider(API.MOD_ID));
         contentProviders.register("content_provider", () -> new NamespaceDocumentProvider(API.MOD_ID, "doc"));
diff --git a/src/main/java/li/cil/oc2/common/block/Blocks.java b/src/main/java/li/cil/oc2/common/block/Blocks.java
index 0f9c4e87..bf36dc48 100644
--- a/src/main/java/li/cil/oc2/common/block/Blocks.java
+++ b/src/main/java/li/cil/oc2/common/block/Blocks.java
@@ -9,7 +9,7 @@ import net.minecraftforge.registries.ForgeRegistries;
 import net.minecraftforge.registries.RegistryObject;
 
 public final class Blocks {
-    private static final DeferredRegister BLOCKS = RegistryUtils.create(ForgeRegistries.BLOCKS);
+    private static final DeferredRegister BLOCKS = RegistryUtils.getInitializerFor(ForgeRegistries.BLOCKS);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/blockentity/BlockEntities.java b/src/main/java/li/cil/oc2/common/blockentity/BlockEntities.java
index 1c885086..17439e9a 100644
--- a/src/main/java/li/cil/oc2/common/blockentity/BlockEntities.java
+++ b/src/main/java/li/cil/oc2/common/blockentity/BlockEntities.java
@@ -12,7 +12,7 @@ import net.minecraftforge.registries.ForgeRegistries;
 import net.minecraftforge.registries.RegistryObject;
 
 public final class BlockEntities {
-    private static final DeferredRegister> BLOCK_ENTITIES = RegistryUtils.create(ForgeRegistries.BLOCK_ENTITIES);
+    private static final DeferredRegister> BLOCK_ENTITIES = RegistryUtils.getInitializerFor(ForgeRegistries.BLOCK_ENTITIES);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/blockentity/DiskDriveBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/DiskDriveBlockEntity.java
index b61eaeab..9e24cb51 100644
--- a/src/main/java/li/cil/oc2/common/blockentity/DiskDriveBlockEntity.java
+++ b/src/main/java/li/cil/oc2/common/blockentity/DiskDriveBlockEntity.java
@@ -55,11 +55,11 @@ public final class DiskDriveBlockEntity extends ModBlockEntity implements DiskDr
     ///////////////////////////////////////////////////////////////////
 
     public boolean canInsert(final ItemStack stack) {
-        return !stack.isEmpty() && ItemTags.DEVICES_FLOPPY.contains(stack.getItem());
+        return !stack.isEmpty() && stack.is(ItemTags.DEVICES_FLOPPY);
     }
 
     public ItemStack insert(final ItemStack stack, @Nullable final Player player) {
-        if (stack.isEmpty() || !ItemTags.DEVICES_FLOPPY.contains(stack.getItem())) {
+        if (!canInsert(stack)) {
             return stack;
         }
 
diff --git a/src/main/java/li/cil/oc2/common/bus/device/DeviceTypes.java b/src/main/java/li/cil/oc2/common/bus/device/DeviceTypes.java
index b81bd663..1bec29f7 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/DeviceTypes.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/DeviceTypes.java
@@ -8,8 +8,8 @@ import li.cil.oc2.common.bus.device.util.DeviceTypeImpl;
 import li.cil.oc2.common.tags.ItemTags;
 import li.cil.oc2.common.util.RegistryUtils;
 import net.minecraft.resources.ResourceLocation;
+import net.minecraft.tags.TagKey;
 import net.minecraft.world.item.Item;
-import net.minecraftforge.common.Tags;
 import net.minecraftforge.registries.DeferredRegister;
 import net.minecraftforge.registries.IForgeRegistry;
 import net.minecraftforge.registries.RegistryBuilder;
@@ -19,11 +19,11 @@ import java.util.function.Supplier;
 import static li.cil.oc2.common.util.TranslationUtils.text;
 
 public final class DeviceTypes {
-    private static final DeferredRegister DEVICE_TYPES = RegistryUtils.create(DeviceType.class);
+    private static final DeferredRegister DEVICE_TYPES = RegistryUtils.getInitializerFor(DeviceType.REGISTRY);
 
     ///////////////////////////////////////////////////////////////////
 
-    public static final Supplier> DEVICE_TYPE_REGISTRY = DEVICE_TYPES.makeRegistry("device_type", RegistryBuilder::new);
+    public static final Supplier> DEVICE_TYPE_REGISTRY = DEVICE_TYPES.makeRegistry(DeviceType.class, RegistryBuilder::new);
 
     ///////////////////////////////////////////////////////////////////
 
@@ -39,8 +39,8 @@ public final class DeviceTypes {
 
     ///////////////////////////////////////////////////////////////////
 
-    private static void register(final Tags.IOptionalNamedTag tag) {
-        final String id = tag.getName().getPath().replaceFirst("^devices/", "");
+    private static void register(final TagKey tag) {
+        final String id = tag.location().getPath().replaceFirst("^devices/", "");
         DEVICE_TYPES.register(id, () -> new DeviceTypeImpl(
             tag,
             new ResourceLocation(API.MOD_ID, "gui/icon/" + id),
diff --git a/src/main/java/li/cil/oc2/common/bus/device/data/BlockDeviceDataRegistry.java b/src/main/java/li/cil/oc2/common/bus/device/data/BlockDeviceDataRegistry.java
index 5dc07da3..eef3c365 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/data/BlockDeviceDataRegistry.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/data/BlockDeviceDataRegistry.java
@@ -15,11 +15,11 @@ import java.util.function.Supplier;
 import java.util.stream.Stream;
 
 public final class BlockDeviceDataRegistry {
-    private static final DeferredRegister INITIALIZER = RegistryUtils.create(BlockDeviceData.class);
+    private static final DeferredRegister INITIALIZER = RegistryUtils.getInitializerFor(BlockDeviceData.REGISTRY);
 
     ///////////////////////////////////////////////////////////////////
 
-    private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(BlockDeviceData.REGISTRY.getPath(), RegistryBuilder::new);
+    private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(BlockDeviceData.class, RegistryBuilder::new);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/bus/device/data/FirmwareRegistry.java b/src/main/java/li/cil/oc2/common/bus/device/data/FirmwareRegistry.java
index 5e82c145..026394a6 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/data/FirmwareRegistry.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/data/FirmwareRegistry.java
@@ -15,11 +15,11 @@ import java.util.function.Supplier;
 import java.util.stream.Stream;
 
 public final class FirmwareRegistry {
-    private static final DeferredRegister INITIALIZER = RegistryUtils.create(Firmware.class);
+    private static final DeferredRegister INITIALIZER = RegistryUtils.getInitializerFor(Firmware.REGISTRY);
 
     ///////////////////////////////////////////////////////////////////
 
-    private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(Firmware.REGISTRY.getPath(), RegistryBuilder::new);
+    private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(Firmware.class, RegistryBuilder::new);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java b/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java
index 14032bd5..e8633e26 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/ProviderRegistry.java
@@ -12,13 +12,13 @@ import net.minecraftforge.registries.RegistryBuilder;
 import java.util.function.Supplier;
 
 public final class ProviderRegistry {
-    private static final DeferredRegister BLOCK_DEVICE_PROVIDERS = RegistryUtils.create(BlockDeviceProvider.class);
-    public static final Supplier> BLOCK_DEVICE_PROVIDER_REGISTRY = BLOCK_DEVICE_PROVIDERS.makeRegistry("block_device_providers", RegistryBuilder::new);
+    private static final DeferredRegister BLOCK_DEVICE_PROVIDERS = RegistryUtils.getInitializerFor(BlockDeviceProvider.REGISTRY);
+    public static final Supplier> BLOCK_DEVICE_PROVIDER_REGISTRY = BLOCK_DEVICE_PROVIDERS.makeRegistry(BlockDeviceProvider.class, RegistryBuilder::new);
 
     ///////////////////////////////////////////////////////////////////
 
-    private static final DeferredRegister ITEM_DEVICE_PROVIDERS = RegistryUtils.create(ItemDeviceProvider.class);
-    public static final Supplier> ITEM_DEVICE_PROVIDER_REGISTRY = ITEM_DEVICE_PROVIDERS.makeRegistry("item_device_providers", RegistryBuilder::new);
+    private static final DeferredRegister ITEM_DEVICE_PROVIDERS = RegistryUtils.getInitializerFor(ItemDeviceProvider.REGISTRY);
+    public static final Supplier> ITEM_DEVICE_PROVIDER_REGISTRY = ITEM_DEVICE_PROVIDERS.makeRegistry(ItemDeviceProvider.class, RegistryBuilder::new);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/bus/device/util/DeviceTypeImpl.java b/src/main/java/li/cil/oc2/common/bus/device/util/DeviceTypeImpl.java
index 85e25428..821c3f04 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/util/DeviceTypeImpl.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/util/DeviceTypeImpl.java
@@ -5,23 +5,23 @@ package li.cil.oc2.common.bus.device.util;
 import li.cil.oc2.api.bus.device.DeviceType;
 import net.minecraft.network.chat.Component;
 import net.minecraft.resources.ResourceLocation;
-import net.minecraft.tags.Tag;
+import net.minecraft.tags.TagKey;
 import net.minecraft.world.item.Item;
 import net.minecraftforge.registries.ForgeRegistryEntry;
 
 public final class DeviceTypeImpl extends ForgeRegistryEntry implements DeviceType {
-    private final Tag tag;
+    private final TagKey tag;
     private final ResourceLocation icon;
     private final Component name;
 
-    public DeviceTypeImpl(final Tag tag, final ResourceLocation icon, final Component name) {
+    public DeviceTypeImpl(final TagKey tag, final ResourceLocation icon, final Component name) {
         this.tag = tag;
         this.icon = icon;
         this.name = name;
     }
 
     @Override
-    public Tag getTag() {
+    public TagKey getTag() {
         return tag;
     }
 
diff --git a/src/main/java/li/cil/oc2/common/container/Containers.java b/src/main/java/li/cil/oc2/common/container/Containers.java
index 684c3a8d..a5d4e797 100644
--- a/src/main/java/li/cil/oc2/common/container/Containers.java
+++ b/src/main/java/li/cil/oc2/common/container/Containers.java
@@ -10,7 +10,7 @@ import net.minecraftforge.registries.ForgeRegistries;
 import net.minecraftforge.registries.RegistryObject;
 
 public final class Containers {
-    private static final DeferredRegister> CONTAINERS = RegistryUtils.create(ForgeRegistries.CONTAINERS);
+    private static final DeferredRegister> CONTAINERS = RegistryUtils.getInitializerFor(ForgeRegistries.CONTAINERS);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/container/TypedItemStackHandler.java b/src/main/java/li/cil/oc2/common/container/TypedItemStackHandler.java
index 39f75bc6..c5a0b33d 100644
--- a/src/main/java/li/cil/oc2/common/container/TypedItemStackHandler.java
+++ b/src/main/java/li/cil/oc2/common/container/TypedItemStackHandler.java
@@ -2,16 +2,16 @@
 
 package li.cil.oc2.common.container;
 
-import net.minecraft.tags.Tag;
+import net.minecraft.tags.TagKey;
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 
 public class TypedItemStackHandler extends FixedSizeItemStackHandler {
-    private final Tag deviceType;
+    private final TagKey deviceType;
 
     ///////////////////////////////////////////////////////////////////
 
-    public TypedItemStackHandler(final int size, final Tag deviceType) {
+    public TypedItemStackHandler(final int size, final TagKey deviceType) {
         super(size);
         this.deviceType = deviceType;
     }
@@ -20,6 +20,6 @@ public class TypedItemStackHandler extends FixedSizeItemStackHandler {
 
     @Override
     public boolean isItemValid(final int slot, final ItemStack stack) {
-        return super.isItemValid(slot, stack) && !stack.isEmpty() && deviceType.contains(stack.getItem());
+        return super.isItemValid(slot, stack) && !stack.isEmpty() && stack.is(deviceType);
     }
 }
diff --git a/src/main/java/li/cil/oc2/common/entity/Entities.java b/src/main/java/li/cil/oc2/common/entity/Entities.java
index 5f3d1a62..088bebc8 100644
--- a/src/main/java/li/cil/oc2/common/entity/Entities.java
+++ b/src/main/java/li/cil/oc2/common/entity/Entities.java
@@ -13,7 +13,7 @@ import net.minecraftforge.registries.RegistryObject;
 import java.util.function.Function;
 
 public final class Entities {
-    private static final DeferredRegister> ENTITIES = RegistryUtils.create(ForgeRegistries.ENTITIES);
+    private static final DeferredRegister> ENTITIES = RegistryUtils.getInitializerFor(ForgeRegistries.ENTITIES);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/integration/Wrenches.java b/src/main/java/li/cil/oc2/common/integration/Wrenches.java
index fb7a25e7..e7743f10 100644
--- a/src/main/java/li/cil/oc2/common/integration/Wrenches.java
+++ b/src/main/java/li/cil/oc2/common/integration/Wrenches.java
@@ -4,23 +4,18 @@ package li.cil.oc2.common.integration;
 
 import li.cil.oc2.common.tags.ItemTags;
 import net.minecraft.world.entity.Entity;
-import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 
 import javax.annotation.Nullable;
 
 public final class Wrenches {
     public static boolean isWrench(@Nullable final ItemStack stack) {
-        return stack != null && !stack.isEmpty() && isWrench(stack.getItem());
-    }
-
-    public static boolean isWrench(final Item item) {
-        return ItemTags.WRENCHES.contains(item);
+        return stack != null && !stack.isEmpty() && stack.is(ItemTags.WRENCHES);
     }
 
     public static boolean isHoldingWrench(final Entity entity) {
         for (final ItemStack stack : entity.getHandSlots()) {
-            if (isWrench(stack.getItem())) {
+            if (isWrench(stack)) {
                 return true;
             }
         }
diff --git a/src/main/java/li/cil/oc2/common/integration/jei/ExtraItemsJEIPlugin.java b/src/main/java/li/cil/oc2/common/integration/jei/ExtraItemsJEIPlugin.java
index 2acfdab5..cc5fd689 100644
--- a/src/main/java/li/cil/oc2/common/integration/jei/ExtraItemsJEIPlugin.java
+++ b/src/main/java/li/cil/oc2/common/integration/jei/ExtraItemsJEIPlugin.java
@@ -10,6 +10,7 @@ import li.cil.oc2.common.util.ItemStackUtils;
 import li.cil.oc2.common.util.NBTUtils;
 import mezz.jei.api.IModPlugin;
 import mezz.jei.api.JeiPlugin;
+import mezz.jei.api.constants.VanillaTypes;
 import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter;
 import mezz.jei.api.ingredients.subtypes.UidContext;
 import mezz.jei.api.registration.ISubtypeRegistration;
@@ -29,10 +30,10 @@ public class ExtraItemsJEIPlugin implements IModPlugin {
 
     @Override
     public void registerItemSubtypes(final ISubtypeRegistration registration) {
-        registration.registerSubtypeInterpreter(Items.COMPUTER.get(), new ComputerSubtypeInterpreter());
-        registration.registerSubtypeInterpreter(Items.ROBOT.get(), new RobotSubtypeInterpreter());
-        registration.registerSubtypeInterpreter(Items.HARD_DRIVE_CUSTOM.get(), new BlockDeviceSubtypeInterpreter());
-        registration.registerSubtypeInterpreter(Items.FLASH_MEMORY_CUSTOM.get(), new BlockDeviceSubtypeInterpreter());
+        registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, Items.COMPUTER.get(), new ComputerSubtypeInterpreter());
+        registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, Items.ROBOT.get(), new RobotSubtypeInterpreter());
+        registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, Items.HARD_DRIVE_CUSTOM.get(), new BlockDeviceSubtypeInterpreter());
+        registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, Items.FLASH_MEMORY_CUSTOM.get(), new BlockDeviceSubtypeInterpreter());
     }
 
     private static final class ComputerSubtypeInterpreter implements IIngredientSubtypeInterpreter {
diff --git a/src/main/java/li/cil/oc2/common/item/Items.java b/src/main/java/li/cil/oc2/common/item/Items.java
index 09a630d8..5b7267af 100644
--- a/src/main/java/li/cil/oc2/common/item/Items.java
+++ b/src/main/java/li/cil/oc2/common/item/Items.java
@@ -18,7 +18,7 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 public final class Items {
-    private static final DeferredRegister ITEMS = RegistryUtils.create(ForgeRegistries.ITEMS);
+    private static final DeferredRegister ITEMS = RegistryUtils.getInitializerFor(ForgeRegistries.ITEMS);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/item/crafting/RecipeSerializers.java b/src/main/java/li/cil/oc2/common/item/crafting/RecipeSerializers.java
index 3e89e821..dea33c15 100644
--- a/src/main/java/li/cil/oc2/common/item/crafting/RecipeSerializers.java
+++ b/src/main/java/li/cil/oc2/common/item/crafting/RecipeSerializers.java
@@ -9,7 +9,7 @@ import net.minecraftforge.registries.ForgeRegistries;
 import net.minecraftforge.registries.RegistryObject;
 
 public final class RecipeSerializers {
-    private static final DeferredRegister> RECIPE_SERIALIZERS = RegistryUtils.create(ForgeRegistries.RECIPE_SERIALIZERS);
+    private static final DeferredRegister> RECIPE_SERIALIZERS = RegistryUtils.getInitializerFor(ForgeRegistries.RECIPE_SERIALIZERS);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/network/MessageUtils.java b/src/main/java/li/cil/oc2/common/network/MessageUtils.java
index 1ab8b0eb..9f9c9b8f 100644
--- a/src/main/java/li/cil/oc2/common/network/MessageUtils.java
+++ b/src/main/java/li/cil/oc2/common/network/MessageUtils.java
@@ -18,7 +18,7 @@ import java.util.function.Consumer;
 public final class MessageUtils {
     public static  void withNearbyServerBlockEntityForInteraction(final NetworkEvent.Context context, final BlockPos pos, final Class type, final BiConsumer callback) {
         final ServerPlayer player = context.getSender();
-        if (player == null || !pos.closerThan(player.position(), 8)) {
+        if (player == null || !pos.closerToCenterThan(player.position(), 8)) {
             return;
         }
 
diff --git a/src/main/java/li/cil/oc2/common/tags/BlockTags.java b/src/main/java/li/cil/oc2/common/tags/BlockTags.java
index 42ab03cf..5569b2f5 100644
--- a/src/main/java/li/cil/oc2/common/tags/BlockTags.java
+++ b/src/main/java/li/cil/oc2/common/tags/BlockTags.java
@@ -3,14 +3,15 @@
 package li.cil.oc2.common.tags;
 
 import li.cil.oc2.api.API;
+import net.minecraft.core.Registry;
 import net.minecraft.resources.ResourceLocation;
+import net.minecraft.tags.TagKey;
 import net.minecraft.world.level.block.Block;
-import net.minecraftforge.common.Tags;
 
 public final class BlockTags {
-    public static final Tags.IOptionalNamedTag DEVICES = tag("devices");
-    public static final Tags.IOptionalNamedTag CABLES = tag("cables");
-    public static final Tags.IOptionalNamedTag WRENCH_BREAKABLE = tag("wrench_breakable");
+    public static final TagKey DEVICES = tag("devices");
+    public static final TagKey CABLES = tag("cables");
+    public static final TagKey WRENCH_BREAKABLE = tag("wrench_breakable");
 
     ///////////////////////////////////////////////////////////////////
 
@@ -19,7 +20,7 @@ public final class BlockTags {
 
     ///////////////////////////////////////////////////////////////////
 
-    private static Tags.IOptionalNamedTag tag(final String name) {
-        return net.minecraft.tags.BlockTags.createOptional(new ResourceLocation(API.MOD_ID, name));
+    private static TagKey tag(final String name) {
+        return TagKey.create(Registry.BLOCK_REGISTRY, new ResourceLocation(API.MOD_ID, name));
     }
 }
diff --git a/src/main/java/li/cil/oc2/common/tags/ItemTags.java b/src/main/java/li/cil/oc2/common/tags/ItemTags.java
index a9b0c35d..dae50bc5 100644
--- a/src/main/java/li/cil/oc2/common/tags/ItemTags.java
+++ b/src/main/java/li/cil/oc2/common/tags/ItemTags.java
@@ -3,25 +3,24 @@
 package li.cil.oc2.common.tags;
 
 import li.cil.oc2.api.API;
+import net.minecraft.core.Registry;
 import net.minecraft.resources.ResourceLocation;
+import net.minecraft.tags.TagKey;
 import net.minecraft.world.item.Item;
-import net.minecraftforge.common.Tags;
-
-import static net.minecraft.tags.ItemTags.createOptional;
 
 public final class ItemTags {
-    public static final Tags.IOptionalNamedTag DEVICES = tag("devices");
-    public static final Tags.IOptionalNamedTag DEVICES_MEMORY = tag("devices/memory");
-    public static final Tags.IOptionalNamedTag DEVICES_HARD_DRIVE = tag("devices/hard_drive");
-    public static final Tags.IOptionalNamedTag DEVICES_FLASH_MEMORY = tag("devices/flash_memory");
-    public static final Tags.IOptionalNamedTag DEVICES_CARD = tag("devices/card");
-    public static final Tags.IOptionalNamedTag DEVICES_ROBOT_MODULE = tag("devices/robot_module");
-    public static final Tags.IOptionalNamedTag DEVICES_FLOPPY = tag("devices/floppy");
-    public static final Tags.IOptionalNamedTag DEVICES_NETWORK_TUNNEL = tag("devices/network_tunnel");
+    public static final TagKey DEVICES = tag("devices");
+    public static final TagKey DEVICES_MEMORY = tag("devices/memory");
+    public static final TagKey DEVICES_HARD_DRIVE = tag("devices/hard_drive");
+    public static final TagKey DEVICES_FLASH_MEMORY = tag("devices/flash_memory");
+    public static final TagKey DEVICES_CARD = tag("devices/card");
+    public static final TagKey DEVICES_ROBOT_MODULE = tag("devices/robot_module");
+    public static final TagKey DEVICES_FLOPPY = tag("devices/floppy");
+    public static final TagKey DEVICES_NETWORK_TUNNEL = tag("devices/network_tunnel");
 
-    public static final Tags.IOptionalNamedTag CABLES = tag("cables");
-    public static final Tags.IOptionalNamedTag WRENCHES = tag("wrenches");
-    public static final Tags.IOptionalNamedTag DEVICE_NEEDS_REBOOT = tag("device_needs_reboot");
+    public static final TagKey CABLES = tag("cables");
+    public static final TagKey WRENCHES = tag("wrenches");
+    public static final TagKey DEVICE_NEEDS_REBOOT = tag("device_needs_reboot");
 
     ///////////////////////////////////////////////////////////////////
 
@@ -30,7 +29,7 @@ public final class ItemTags {
 
     ///////////////////////////////////////////////////////////////////
 
-    private static Tags.IOptionalNamedTag tag(final String name) {
-        return createOptional(new ResourceLocation(API.MOD_ID, name));
+    private static TagKey tag(final String name) {
+        return TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(API.MOD_ID, name));
     }
 }
diff --git a/src/main/java/li/cil/oc2/common/util/RegistryUtils.java b/src/main/java/li/cil/oc2/common/util/RegistryUtils.java
index 87124940..f0589f1f 100644
--- a/src/main/java/li/cil/oc2/common/util/RegistryUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/RegistryUtils.java
@@ -3,6 +3,8 @@
 package li.cil.oc2.common.util;
 
 import li.cil.oc2.api.API;
+import net.minecraft.core.Registry;
+import net.minecraft.resources.ResourceKey;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
 import net.minecraftforge.registries.DeferredRegister;
@@ -25,15 +27,15 @@ public abstract class RegistryUtils {
     private static final List> ENTRIES = new ArrayList<>();
     private static Phase phase = Phase.PRE_INIT;
 
-    public static > DeferredRegister create(final Class type) {
+    public static > DeferredRegister getInitializerFor(final ResourceKey> key) {
         if (phase != Phase.INIT) throw new IllegalStateException();
 
-        final DeferredRegister entry = DeferredRegister.create(type, API.MOD_ID);
+        final DeferredRegister entry = DeferredRegister.create(key, API.MOD_ID);
         ENTRIES.add(entry);
         return entry;
     }
 
-    public static > DeferredRegister create(final IForgeRegistry registry) {
+    public static > DeferredRegister getInitializerFor(final IForgeRegistry registry) {
         if (phase != Phase.INIT) throw new IllegalStateException();
 
         final DeferredRegister entry = DeferredRegister.create(registry, API.MOD_ID);
diff --git a/src/main/java/li/cil/oc2/common/util/SoundEvents.java b/src/main/java/li/cil/oc2/common/util/SoundEvents.java
index 32984af6..b13baedf 100644
--- a/src/main/java/li/cil/oc2/common/util/SoundEvents.java
+++ b/src/main/java/li/cil/oc2/common/util/SoundEvents.java
@@ -10,7 +10,7 @@ import net.minecraftforge.registries.ForgeRegistries;
 import net.minecraftforge.registries.RegistryObject;
 
 public final class SoundEvents {
-    private static final DeferredRegister SOUNDS = RegistryUtils.create(ForgeRegistries.SOUND_EVENTS);
+    private static final DeferredRegister SOUNDS = RegistryUtils.getInitializerFor(ForgeRegistries.SOUND_EVENTS);
 
     ///////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java
index 34844c36..3a089322 100644
--- a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java
@@ -21,9 +21,7 @@ import net.minecraft.locale.Language;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.nbt.ListTag;
 import net.minecraft.network.chat.*;
-import net.minecraft.tags.Tag;
 import net.minecraft.world.item.BlockItem;
-import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraftforge.client.ForgeHooksClient;
 import net.minecraftforge.registries.ForgeRegistry;
@@ -35,7 +33,6 @@ import java.util.List;
 
 import static li.cil.oc2.common.Constants.*;
 import static li.cil.oc2.common.util.TextFormatUtils.withFormat;
-import static net.minecraft.tags.ItemTags.getAllTags;
 
 public final class TooltipUtils {
     private static final MutableComponent DEVICE_NEEDS_REBOOT =
@@ -89,11 +86,7 @@ public final class TooltipUtils {
             tooltip.add(withFormat(description, ChatFormatting.GRAY));
         }
 
-        // Tooltips get queried very early in Minecraft initialization, meaning tags may not
-        // have been initialized. Trying to directly use our tag would lead to an exception
-        // in that case, so we do the detour through the collection instead.
-        final Tag tag = getAllTags().getTag(ItemTags.DEVICE_NEEDS_REBOOT.getName());
-        if (tag != null && tag.contains(stack.getItem())) {
+        if (stack.is(ItemTags.DEVICE_NEEDS_REBOOT)) {
             tooltip.add(DEVICE_NEEDS_REBOOT);
         }
 
diff --git a/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java b/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java
index a65e9d2a..ab6a86f3 100644
--- a/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java
+++ b/src/main/java/li/cil/oc2/data/WrenchRecipeBuilder.java
@@ -14,7 +14,7 @@ import net.minecraft.advancements.RequirementsStrategy;
 import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
 import net.minecraft.data.recipes.FinishedRecipe;
 import net.minecraft.resources.ResourceLocation;
-import net.minecraft.tags.Tag;
+import net.minecraft.tags.TagKey;
 import net.minecraft.world.item.CreativeModeTab;
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.crafting.Ingredient;
@@ -48,7 +48,7 @@ public final class WrenchRecipeBuilder {
         return new WrenchRecipeBuilder(resultIn, countIn);
     }
 
-    public WrenchRecipeBuilder requires(final Tag tagIn) {
+    public WrenchRecipeBuilder requires(final TagKey tagIn) {
         return this.requires(Ingredient.of(tagIn));
     }
 
diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg
index 2c3a09f6..dad06a1e 100644
--- a/src/main/resources/META-INF/accesstransformer.cfg
+++ b/src/main/resources/META-INF/accesstransformer.cfg
@@ -1 +1,2 @@
 public net.minecraft.client.MouseHandler f_91520_ # mouseGrabbed
+public-f net.minecraft.world.entity.Entity m_142467_(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved
diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml
index e46ae304..a35eacc8 100644
--- a/src/main/resources/META-INF/mods.toml
+++ b/src/main/resources/META-INF/mods.toml
@@ -1,5 +1,5 @@
 modLoader = "javafml"
-loaderVersion = "[39,)"
+loaderVersion = "[40,)"
 issueTrackerURL = "https://github.com/fnuecke/oc2/issues"
 license = "MIT"
 
@@ -17,13 +17,13 @@ This mod uses the Terminus Font under the Open Font License. The full license ca
 [[dependencies.oc2]]
 modId = "forge"
 mandatory = true
-versionRange = "[39.0.63,)"
+versionRange = "[40.0.40,)"
 ordering = "NONE"
 side = "BOTH"
 [[dependencies.oc2]]
 modId = "minecraft"
 mandatory = true
-versionRange = "[1.18.1,1.19)"
+versionRange = "[1.18.2,1.19)"
 ordering = "NONE"
 side = "BOTH"
 [[dependencies.oc2]]
@@ -35,5 +35,5 @@ side = "BOTH"
 [[dependencies.oc2]]
 modId = "markdown_manual"
 mandatory = true
-versionRange = "[1.1.0,)"
+versionRange = "[1.2.1,)"
 side = "CLIENT"