diff --git a/build.gradle b/build.gradle
index e559622e..270c2c5d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,13 +6,21 @@ buildscript {
plugins {
id "idea"
id "maven-publish"
- id "net.minecraftforge.gradle" version "5.1.+"
+ id "net.minecraftforge.gradle" version "5.1.73"
id "com.matthewprenger.cursegradle" version "1.4.0"
}
apply plugin: 'org.spongepowered.mixin'
apply from: "minecraft.gradle"
+allprojects {
+ gradle.projectsEvaluated {
+ tasks.withType(JavaCompile) {
+ options.compilerArgs << "-Xmaxerrs" << "1000"
+ }
+ }
+}
+
def getGitRef() {
try {
final def stdout = new ByteArrayOutputStream()
@@ -42,12 +50,12 @@ final def hasGithubPackageCredentials =
repositories {
mavenCentral()
maven {
- url 'https://cursemaven.com'
- content { includeGroup 'curse.maven' }
+ url "https://cursemaven.com"
}
maven {
- url 'https://dvs1.progwml6.com/files/maven/'
- content { includeGroup 'mezz.jei' }
+ // location of the maven that hosts JEI files since January 2023
+ name = "Jared's maven"
+ url = "https://maven.blamejared.com/"
}
if (hasGithubPackageCredentials) {
final def GithubPackages = [
@@ -69,7 +77,7 @@ repositories {
}
dependencies {
- minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
+ minecraft "net.minecraftforge:forge:1.19.2-43.2.10"
annotationProcessor "org.spongepowered:mixin:0.8.5:processor"
// Specify the libs embedded in the library mod explicitly for local development, where
@@ -83,10 +91,13 @@ dependencies {
}
implementation "curse.maven:sedna-511276:3885542"
- implementation fg.deobf("curse.maven:markdownmanual-502485:3738124")
+ implementation fg.deobf("curse.maven:markdownmanual-502485:4306669")
+ implementation fg.deobf("curse.maven:architectury-api-419699:4521273")
- 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")
+ compileOnly fg.deobf("mezz.jei:jei-1.19.2-common-api:11.6.0.1015")
+ compileOnly fg.deobf("mezz.jei:jei-1.19.2-forge-api:11.6.0.1015")
+
+ runtimeOnly fg.deobf("mezz.jei:jei-1.19.2-forge:11.6.0.1015")
testImplementation "org.mockito:mockito-inline:4.3.1"
testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.2"
@@ -116,7 +127,7 @@ minecraft {
runs {
all {
property "forge.logging.markers", "REGISTRIES"
- property "forge.logging.console.level", "info"
+ property "forge.logging.console.level", "debug"
mods {
oc2 {
@@ -126,7 +137,7 @@ minecraft {
}
client {
- workingDirectory project.file("run")
+ workingDirectory project.file("runclient")
property "forge.enabledGameTestNamespaces", "oc2"
}
diff --git a/gradle.properties b/gradle.properties
index 3dc993a9..89ea9c0b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,7 @@
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false
-forge_version=40.1.68
+forge_version=43.2.10
semver=0.0.0
diff --git a/minecraft.gradle b/minecraft.gradle
index 03af5590..a4a49e1e 100644
--- a/minecraft.gradle
+++ b/minecraft.gradle
@@ -1,4 +1,4 @@
ext {
- minecraft_version = '1.18.2'
+ minecraft_version = '1.19.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 7730b3e4..844c0fa9 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
@@ -9,7 +9,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
-import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.IForgeRegistry;
/**
* Implementations describe individual slot types. Slot types are only used
@@ -18,7 +18,7 @@ import net.minecraftforge.registries.IForgeRegistryEntry;
*
* For built-in slot types, see {@link DeviceTypes}.
*/
-public interface DeviceType extends IForgeRegistryEntry {
+public interface DeviceType {
/**
* The registry name of the registry holding device types.
*/
diff --git a/src/main/java/li/cil/oc2/api/bus/device/DeviceTypes.java b/src/main/java/li/cil/oc2/api/bus/device/DeviceTypes.java
index 68fb72f6..2af235fd 100644
--- a/src/main/java/li/cil/oc2/api/bus/device/DeviceTypes.java
+++ b/src/main/java/li/cil/oc2/api/bus/device/DeviceTypes.java
@@ -3,18 +3,21 @@
package li.cil.oc2.api.bus.device;
import li.cil.oc2.api.API;
-import net.minecraftforge.registries.ObjectHolder;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraftforge.registries.RegistryObject;
/**
* Lists built-in device types for convenience.
*/
-@ObjectHolder(API.MOD_ID)
public final class DeviceTypes {
- @ObjectHolder("memory") public static DeviceType MEMORY = null;
- @ObjectHolder("hard_drive") public static DeviceType HARD_DRIVE = null;
- @ObjectHolder("flash_memory") public static DeviceType FLASH_MEMORY = null;
- @ObjectHolder("card") public static DeviceType CARD = null;
- @ObjectHolder("robot_module") public static DeviceType ROBOT_MODULE = null;
- @ObjectHolder("floppy") public static DeviceType FLOPPY = null;
- @ObjectHolder("network_tunnel") public static DeviceType NETWORK_TUNNEL = null;
+ public static DeviceType MEMORY = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "memory"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
+
+ public static DeviceType HARD_DRIVE = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "hard_drive"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
+
+ public static DeviceType FLASH_MEMORY = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "flash_memory"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
+ public static DeviceType CARD = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "card"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
+ public static DeviceType ROBOT_MODULE = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "robot_module"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
+
+ public static DeviceType FLOPPY = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "floppy"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
+ public static DeviceType NETWORK_TUNNEL = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "network_tunnel"), new ResourceLocation("minecraft", "device_type"), API.MOD_ID).get();
}
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 818b1ecd..5b97d8fc 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.sedna.api.device.BlockDevice;
import net.minecraft.network.chat.Component;
-import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.IForgeRegistry;
+
+import java.util.function.Supplier;
/**
* Implementations of this interface that are registered with the registry for
@@ -25,7 +27,8 @@ import net.minecraftforge.registries.IForgeRegistryEntry;
* /give ? oc2:hard_drive{oc2:{data:"my_mod:my_block_device",readonly:true}}
*
*/
-public interface BlockDeviceData extends IForgeRegistryEntry {
+public interface BlockDeviceData {
+
/**
* 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 503a83a7..3cfdb08c 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,7 @@ package li.cil.oc2.api.bus.device.data;
import li.cil.sedna.api.memory.MemoryMap;
import net.minecraft.network.chat.Component;
-import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.IForgeRegistry;
/**
* Implementations of this interface that are registered with the registry for
@@ -20,7 +20,7 @@ import net.minecraftforge.registries.IForgeRegistryEntry;
* /give @p oc2:flash_memory{oc2:{firmware:"my_mod:my_firmware"}}
*
*/
-public interface Firmware extends IForgeRegistryEntry {
+public interface 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 247d3ff8..07b8ce35 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
@@ -7,7 +7,7 @@ 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.nbt.CompoundTag;
-import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.IForgeRegistry;
/**
* This is used to query for devices given a block face.
@@ -45,7 +45,7 @@ import net.minecraftforge.registries.IForgeRegistryEntry;
* @see li.cil.oc2.api.bus.device.vm.VMDevice
* @see BlockDeviceQuery
*/
-public interface BlockDeviceProvider extends IForgeRegistryEntry {
+public interface BlockDeviceProvider {
/**
* 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 2608c535..0b713eaa 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
@@ -6,7 +6,7 @@ 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.nbt.CompoundTag;
-import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.IForgeRegistry;
import javax.annotation.Nullable;
import java.util.Optional;
@@ -42,7 +42,7 @@ import java.util.Optional;
* @see li.cil.oc2.api.bus.device.vm.VMDevice
* @see ItemDeviceQuery
*/
-public interface ItemDeviceProvider extends IForgeRegistryEntry {
+public interface ItemDeviceProvider {
/**
* Get a device for the specified query.
*
diff --git a/src/main/java/li/cil/oc2/client/ClientSetup.java b/src/main/java/li/cil/oc2/client/ClientSetup.java
index f281338f..10cfc035 100644
--- a/src/main/java/li/cil/oc2/client/ClientSetup.java
+++ b/src/main/java/li/cil/oc2/client/ClientSetup.java
@@ -24,9 +24,10 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.world.inventory.InventoryMenu;
import net.minecraftforge.client.event.EntityRenderersEvent;
-import net.minecraftforge.client.event.ModelRegistryEvent;
+import net.minecraftforge.client.event.ModelEvent.RegisterGeometryLoaders;
+import net.minecraftforge.client.event.RenderGuiOverlayEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
-import net.minecraftforge.client.model.ModelLoaderRegistry;
+import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
@@ -62,8 +63,17 @@ public final class ClientSetup {
}
@SubscribeEvent
- public static void handleModelRegistryEvent(final ModelRegistryEvent event) {
- ModelLoaderRegistry.registerLoader(Blocks.BUS_CABLE.getId(), new BusCableModelLoader());
+ public static void handleModelRegistryEvent(final RegisterGeometryLoaders event) {
+ event.register(Blocks.BUS_CABLE.getId().toString().replace("oc2:", ""), new BusCableModelLoader());
+ }
+
+ @SubscribeEvent
+ public void renderHotbar(RenderGuiOverlayEvent event) {
+ if(event.getOverlay().id() == VanillaGuiOverlay.HOTBAR.id() && KeyboardScreen.hideHotbar) {
+ event.setCanceled(true);
+ } else if(event.getOverlay().id() == VanillaGuiOverlay.HOTBAR.id()) {
+ event.setCanceled(false);
+ }
}
@SubscribeEvent
diff --git a/src/main/java/li/cil/oc2/client/audio/LoopingBlockEntitySound.java b/src/main/java/li/cil/oc2/client/audio/LoopingBlockEntitySound.java
index c1f4c806..8cf84f4e 100644
--- a/src/main/java/li/cil/oc2/client/audio/LoopingBlockEntitySound.java
+++ b/src/main/java/li/cil/oc2/client/audio/LoopingBlockEntitySound.java
@@ -7,6 +7,7 @@ import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
+import net.minecraft.util.RandomSource;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.Vec3;
@@ -25,7 +26,7 @@ public final class LoopingBlockEntitySound extends AbstractTickableSoundInstance
///////////////////////////////////////////////////////////////////
public LoopingBlockEntitySound(final BlockEntity blockEntity, final SoundEvent sound) {
- super(sound, SoundSource.BLOCKS);
+ super(sound, SoundSource.BLOCKS, RandomSource.create());
this.blockEntity = blockEntity;
this.volume = 0;
diff --git a/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java b/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java
index 49686aec..0b86ac29 100644
--- a/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java
+++ b/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java
@@ -16,7 +16,6 @@ import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
-import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@@ -81,8 +80,8 @@ public abstract class AbstractMachineInventoryScreen tooltip = asList(
- new TranslatableComponent(Constants.TOOLTIP_ENERGY,
+ Component.translatable(Constants.TOOLTIP_ENERGY,
withFormat(menu.getEnergy() + "/" + menu.getEnergyCapacity(), ChatFormatting.GREEN)),
- new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION,
+ Component.translatable(Constants.TOOLTIP_ENERGY_CONSUMPTION,
withFormat(String.valueOf(menu.getEnergyConsumption()), ChatFormatting.GREEN))
);
TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200);
diff --git a/src/main/java/li/cil/oc2/client/gui/AbstractMachineTerminalScreen.java b/src/main/java/li/cil/oc2/client/gui/AbstractMachineTerminalScreen.java
index 4e10e9c3..e540ee01 100644
--- a/src/main/java/li/cil/oc2/client/gui/AbstractMachineTerminalScreen.java
+++ b/src/main/java/li/cil/oc2/client/gui/AbstractMachineTerminalScreen.java
@@ -14,8 +14,6 @@ import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
-import net.minecraft.network.chat.TextComponent;
-import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@@ -101,7 +99,7 @@ public abstract class AbstractMachineTerminalScreen tooltip = asList(
- new TranslatableComponent(Constants.TOOLTIP_ENERGY,
+ Component.translatable(Constants.TOOLTIP_ENERGY,
withFormat(menu.getEnergy() + "/" + menu.getEnergyCapacity(), ChatFormatting.GREEN)),
- new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION,
+ Component.translatable(Constants.TOOLTIP_ENERGY_CONSUMPTION,
withFormat(String.valueOf(menu.getEnergyConsumption()), ChatFormatting.GREEN))
);
TooltipUtils.drawTooltip(stack, tooltip, mouseX, mouseY, 200);
diff --git a/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java b/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java
index 556b35f0..74712cdd 100644
--- a/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java
+++ b/src/main/java/li/cil/oc2/client/gui/BusInterfaceScreen.java
@@ -13,7 +13,7 @@ import li.cil.oc2.common.network.message.BusInterfaceNameMessage;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.core.Direction;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
import net.minecraft.world.phys.Vec3;
import org.lwjgl.glfw.GLFW;
@@ -74,7 +74,7 @@ public final class BusInterfaceScreen extends Screen {
setInterfaceName(nameField.getValue());
onClose();
}
- }).withTooltip(new TranslatableComponent(Constants.TOOLTIP_CONFIRM));
+ }).withTooltip(Component.translatable(Constants.TOOLTIP_CONFIRM));
addRenderableWidget(new ImageButton(
left + CANCEL_LEFT, top + CANCEL_TOP,
@@ -87,7 +87,7 @@ public final class BusInterfaceScreen extends Screen {
super.onPress();
onClose();
}
- }).withTooltip(new TranslatableComponent(Constants.TOOLTIP_CANCEL));
+ }).withTooltip(Component.translatable(Constants.TOOLTIP_CANCEL));
}
@Override
diff --git a/src/main/java/li/cil/oc2/client/gui/FileChooserScreen.java b/src/main/java/li/cil/oc2/client/gui/FileChooserScreen.java
index 1c13f186..8bfab6e7 100644
--- a/src/main/java/li/cil/oc2/client/gui/FileChooserScreen.java
+++ b/src/main/java/li/cil/oc2/client/gui/FileChooserScreen.java
@@ -11,8 +11,6 @@ import net.minecraft.client.gui.components.ObjectSelectionList;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextColor;
-import net.minecraft.network.chat.TextComponent;
-import net.minecraft.network.chat.TranslatableComponent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -22,6 +20,7 @@ import java.nio.file.*;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
+import java.util.stream.Collectors;
import static li.cil.oc2.common.util.TranslationUtils.text;
@@ -157,7 +156,7 @@ public final class FileChooserScreen extends Screen {
final int buttonTop = fileNameTop + TEXT_FIELD_HEIGHT + WIDGET_SPACING;
final int buttonCount = 2;
final int buttonWidth = widgetsWidth / buttonCount - (buttonCount - 1) * WIDGET_SPACING;
- okButton = addRenderableWidget(new Button(MARGIN, buttonTop, buttonWidth, BUTTON_HEIGHT, TextComponent.EMPTY, this::handleOkPressed));
+ okButton = addRenderableWidget(new Button(MARGIN, buttonTop, buttonWidth, BUTTON_HEIGHT, Component.empty(), this::handleOkPressed));
addRenderableWidget(new Button(MARGIN + buttonWidth + WIDGET_SPACING, buttonTop, buttonWidth, BUTTON_HEIGHT, CANCEL_TEXT, this::handleCancelPressed));
fileList.refreshFiles(directory);
@@ -300,7 +299,7 @@ public final class FileChooserScreen extends Screen {
return 1;
}
return p1.getFileName().compareTo(p2.getFileName());
- }).toList();
+ }).collect(Collectors.toList());
for (final Path path : files) {
try {
if (Files.isHidden(path)) {
@@ -347,7 +346,7 @@ public final class FileChooserScreen extends Screen {
}
private FileList.FileEntry createFileEntry(final Path file) {
- return new FileList.FileEntry(file, new TextComponent(file.getFileName().toString()));
+ return new FileList.FileEntry(file, Component.literal(file.getFileName().toString()));
}
private FileList.FileEntry createDirectoryEntry(final Path path) {
@@ -358,7 +357,7 @@ public final class FileChooserScreen extends Screen {
final TextColor color = path != null && Files.exists(path)
? TextColor.fromRgb(0xA0A0FF)
: TextColor.fromLegacyFormat(ChatFormatting.GRAY);
- return new FileList.FileEntry(path, new TextComponent(displayName)
+ return new FileList.FileEntry(path, Component.literal(displayName)
.withStyle(s -> s.withColor(color)));
}
@@ -412,7 +411,7 @@ public final class FileChooserScreen extends Screen {
@Override
public Component getNarration() {
- return new TranslatableComponent("narrator.select", displayName);
+ return Component.translatable("narrator.select", displayName);
}
}
}
diff --git a/src/main/java/li/cil/oc2/client/gui/KeyboardScreen.java b/src/main/java/li/cil/oc2/client/gui/KeyboardScreen.java
index e5e5d730..59eac8f4 100644
--- a/src/main/java/li/cil/oc2/client/gui/KeyboardScreen.java
+++ b/src/main/java/li/cil/oc2/client/gui/KeyboardScreen.java
@@ -14,21 +14,22 @@ import net.minecraft.client.MouseHandler;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.GameRenderer;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.MutableComponent;
+import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.client.gui.ForgeIngameGui;
-import net.minecraftforge.client.gui.OverlayRegistry;
+import net.minecraftforge.client.event.RenderGuiOverlayEvent;
+import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.lwjgl.glfw.GLFW;
-import java.util.Random;
-
public final class KeyboardScreen extends Screen {
private static final int BORDER_SIZE = 4;
private static final float ARM_SWING_RATE = 0.8f;
private static final int BORDER_COLOR = 0xFFFFFFFF;
- private static final TranslatableComponent CLOSE_INFO = new TranslatableComponent("gui.oc2.keyboard.close_info");
+ private static final MutableComponent CLOSE_INFO = Component.translatable("gui.oc2.keyboard.close_info");
///////////////////////////////////////////////////////////////////
@@ -36,6 +37,8 @@ public final class KeyboardScreen extends Screen {
///////////////////////////////////////////////////////////////////
+ public static boolean hideHotbar = false;
+
public KeyboardScreen(final KeyboardBlockEntity keyboard) {
super(Items.KEYBOARD.get().getDescription());
this.keyboard = keyboard;
@@ -52,7 +55,7 @@ public final class KeyboardScreen extends Screen {
grabMouse();
// Disable hotbar since we don't need it here, and it just blocks screen space.
- OverlayRegistry.enableOverlay(ForgeIngameGui.HOTBAR_ELEMENT, false);
+ hideHotbar = true;
}
@Override
@@ -109,7 +112,7 @@ public final class KeyboardScreen extends Screen {
public void removed() {
super.removed();
- OverlayRegistry.enableOverlay(ForgeIngameGui.HOTBAR_ELEMENT, true);
+ hideHotbar = false;
}
///////////////////////////////////////////////////////////////////
@@ -155,7 +158,7 @@ public final class KeyboardScreen extends Screen {
return;
}
- final Random random = player.getRandom();
+ final RandomSource random = player.getRandom();
if (random.nextFloat() < ARM_SWING_RATE) {
return;
}
diff --git a/src/main/java/li/cil/oc2/client/gui/NetworkInterfaceCardScreen.java b/src/main/java/li/cil/oc2/client/gui/NetworkInterfaceCardScreen.java
index e94ceffd..1438a7b8 100644
--- a/src/main/java/li/cil/oc2/client/gui/NetworkInterfaceCardScreen.java
+++ b/src/main/java/li/cil/oc2/client/gui/NetworkInterfaceCardScreen.java
@@ -24,7 +24,7 @@ import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.MutableComponent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
@@ -33,6 +33,7 @@ import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
+import org.spongepowered.asm.mixin.Mutable;
import javax.annotation.Nullable;
@@ -159,7 +160,7 @@ public final class NetworkInterfaceCardScreen extends Screen {
if (focusedSide != null) {
final Component enabledComponent = getConfiguration(focusedSide) ? CONNECTIVITY_ENABLED_TEXT : CONNECTIVITY_DISABLED_TEXT;
- final TranslatableComponent tooltip = new TranslatableComponent(SIDE_STATE_TEXT, enabledComponent);
+ final MutableComponent tooltip = Component.translatable(SIDE_STATE_TEXT, enabledComponent);
renderTooltip(stack, tooltip, mouseX, mouseY);
}
diff --git a/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java b/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java
index dbeeb2e1..124f2f88 100644
--- a/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java
+++ b/src/main/java/li/cil/oc2/client/gui/widget/ImageButton.java
@@ -10,7 +10,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.AbstractButton;
import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TextComponent;
import net.minecraft.util.Mth;
import java.util.Arrays;
@@ -35,7 +34,7 @@ public abstract class ImageButton extends AbstractButton {
///////////////////////////////////////////////////////////////////
protected ImageButton(final int x, final int y, final int width, final int height, final Sprite baseImage, final Sprite pressedImage) {
- super(x, y, width, height, TextComponent.EMPTY);
+ super(x, y, width, height, Component.empty());
this.baseImage = baseImage;
this.pressedImage = pressedImage;
}
@@ -104,7 +103,7 @@ public abstract class ImageButton extends AbstractButton {
background.draw(stack, x, y);
- if (!Objects.equals(getMessage(), TextComponent.EMPTY)) {
+ if (!Objects.equals(getMessage(), Component.empty())) {
drawCenteredString(stack, Minecraft.getInstance().font, getMessage(),
x + width / 2, y + (height - 8) / 2,
getFGColor() | Mth.ceil(alpha * 255) << 24);
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 095d8f61..6791400f 100644
--- a/src/main/java/li/cil/oc2/client/manual/Manuals.java
+++ b/src/main/java/li/cil/oc2/client/manual/Manuals.java
@@ -16,17 +16,21 @@ import li.cil.oc2.api.API;
import li.cil.oc2.common.block.Blocks;
import li.cil.oc2.common.item.Items;
import li.cil.oc2.common.util.RegistryUtils;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.RegistryObject;
@OnlyIn(Dist.CLIENT)
public final class Manuals {
- private static final DeferredRegister MANUALS = RegistryUtils.getInitializerFor(Constants.MANUAL_REGISTRY);
+ private static final DeferredRegister MANUALS = DeferredRegister.create(Constants.MANUAL_REGISTRY, Constants.MOD_ID);
+ private static final DeferredRegister PATH_PROVIDERS = DeferredRegister.create(Constants.PATH_PROVIDER_REGISTRY, Constants.MOD_ID);
+ private static final DeferredRegister CONTENT_PROVIDERS = DeferredRegister.create(Constants.DOCUMENT_PROVIDER_REGISTRY, Constants.MOD_ID);
+ private static final DeferredRegister TABS = DeferredRegister.create(Constants.TAB_REGISTRY, Constants.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -35,24 +39,26 @@ public final class Manuals {
///////////////////////////////////////////////////////////////////
public static void initialize() {
- 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);
+ MANUALS.register(FMLJavaModLoadingContext.get().getModEventBus());
- pathProviders.register("path_provider", () -> new NamespacePathProvider(API.MOD_ID));
- contentProviders.register("content_provider", () -> new NamespaceDocumentProvider(API.MOD_ID, "doc"));
+ PATH_PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
+ CONTENT_PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
+ TABS.register(FMLJavaModLoadingContext.get().getModEventBus());
- tabs.register("home", () -> new TextureTab(
+ PATH_PROVIDERS.register("path_provider", () -> new NamespacePathProvider(API.MOD_ID));
+ CONTENT_PROVIDERS.register("content_provider", () -> new NamespaceDocumentProvider(API.MOD_ID, "doc"));
+
+ TABS.register("home", () -> new TextureTab(
ManualModel.LANGUAGE_KEY + "/index.md",
- new TranslatableComponent("manual." + API.MOD_ID + ".home"),
+ Component.translatable("manual." + API.MOD_ID + ".home"),
new ResourceLocation(API.MOD_ID, "textures/gui/manual/home.png")));
- tabs.register("blocks", () -> new ItemStackTab(
+ TABS.register("blocks", () -> new ItemStackTab(
ManualModel.LANGUAGE_KEY + "/block/index.md",
- new TranslatableComponent("manual." + API.MOD_ID + ".blocks"),
+ Component.translatable("manual." + API.MOD_ID + ".blocks"),
new ItemStack(Blocks.COMPUTER.get())));
- tabs.register("modules", () -> new ItemStackTab(
+ TABS.register("modules", () -> new ItemStackTab(
ManualModel.LANGUAGE_KEY + "/item/index.md",
- new TranslatableComponent("manual." + API.MOD_ID + ".items"),
+ Component.translatable("manual." + API.MOD_ID + ".items"),
new ItemStack(Items.TRANSISTOR.get())));
}
}
diff --git a/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java b/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java
index ca73d49e..273f57d4 100644
--- a/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java
+++ b/src/main/java/li/cil/oc2/client/model/BusCableBakedModel.java
@@ -16,16 +16,16 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
+import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.EnumProperty;
-import net.minecraftforge.client.MinecraftForgeClient;
-import net.minecraftforge.client.model.data.IDynamicBakedModel;
-import net.minecraftforge.client.model.data.IModelData;
-import net.minecraftforge.client.model.data.ModelDataMap;
+import net.minecraftforge.client.model.IDynamicBakedModel;
+import net.minecraftforge.client.model.data.ModelData;
+import net.minecraftforge.client.model.data.ModelDataManager;
import net.minecraftforge.client.model.data.ModelProperty;
import javax.annotation.Nonnull;
@@ -33,51 +33,51 @@ import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Random;
-public record BusCableBakedModel(
- BakedModel proxy,
- BakedModel[] straightModelByAxis,
- BakedModel[] supportModelByFace
-) implements IDynamicBakedModel {
+public final class BusCableBakedModel implements IDynamicBakedModel {
private static final ModelProperty BUS_CABLE_SUPPORT_PROPERTY = new ModelProperty<>();
private static final ModelProperty BUS_CABLE_FACADE_PROPERTY = new ModelProperty<>();
+ private final BakedModel proxy;
+
///////////////////////////////////////////////////////////////////
+ BusCableBakedModel(final BakedModel proxy) {
+ this.proxy = proxy;
+ }
+
@Override
@Nonnull
- public List getQuads(@Nullable final BlockState state, @Nullable final Direction side, final Random rand, final IModelData extraData) {
- final RenderType layer = MinecraftForgeClient.getRenderType();
+ public List getQuads(@Nullable final BlockState state, @Nullable final Direction side, final RandomSource rand, final ModelData extraData, @Nullable RenderType renderType) {
- if (extraData.hasProperty(BUS_CABLE_FACADE_PROPERTY)) {
- final BusCableFacade facade = extraData.getData(BUS_CABLE_FACADE_PROPERTY);
- if (facade != null && (layer == null || ItemBlockRenderTypes.canRenderInLayer(facade.blockState, layer))) {
- return facade.model.getQuads(facade.blockState, side, rand, facade.data);
+ final BusCableFacade facade = extraData.get(BUS_CABLE_FACADE_PROPERTY);
+ if (side != null) {
+ if (facade != null && (renderType != null && renderType.equals(RenderType.solid()))) {
+ return facade.model.getQuads(state, side, rand, facade.data, renderType);
} else {
return Collections.emptyList();
}
- }
-
- if (state == null || !state.getValue(BusCableBlock.HAS_CABLE) || layer == null || !layer.equals(RenderType.solid())) {
- return Collections.emptyList();
- }
-
- for (int i = 0; i < Constants.AXES.length; i++) {
- final Direction.Axis axis = Constants.AXES[i];
- if (isStraightAlongAxis(state, axis)) {
- return straightModelByAxis[i].getQuads(state, side, rand, extraData);
+ } else {
+ if (state == null || !state.getValue(BusCableBlock.HAS_CABLE) || renderType == null || !renderType.equals(RenderType.solid())) {
+ return Collections.emptyList();
}
+
+ for (int i = 0; i < Constants.AXES.length; i++) {
+ final Direction.Axis axis = Constants.AXES[i];
+ if (isStraightAlongAxis(state, axis)) {
+ return proxy.getQuads(state, side, rand, extraData, renderType);
+ }
+ }
+
+ final ArrayList quads = new ArrayList<>(proxy.getQuads(state, side, rand, extraData, renderType));
+
+ final BusCableSupportSide supportSide = extraData.get(BUS_CABLE_SUPPORT_PROPERTY);
+ if (supportSide != null) {
+ quads.addAll(proxy.getQuads(state, side, rand, extraData, renderType));
+ }
+
+ return quads;
}
-
- final ArrayList quads = new ArrayList<>(proxy.getQuads(state, side, rand, extraData));
-
- final BusCableSupportSide supportSide = extraData.getData(BUS_CABLE_SUPPORT_PROPERTY);
- if (supportSide != null) {
- quads.addAll(supportModelByFace[supportSide.value.get3DDataValue()].getQuads(state, side, rand, extraData));
- }
-
- return quads;
}
@Override
@@ -113,7 +113,7 @@ public record BusCableBakedModel(
@Override
@Nonnull
- public IModelData getModelData(final BlockAndTintGetter level, final BlockPos pos, final BlockState state, final IModelData blockEntityData) {
+ public ModelData getModelData(final BlockAndTintGetter level, final BlockPos pos, final BlockState state, final ModelData blockEntityData) {
if (state.hasProperty(BusCableBlock.HAS_FACADE) && state.getValue(BusCableBlock.HAS_FACADE)) {
final BlockEntity blockEntity = level.getBlockEntity(pos);
@@ -128,10 +128,10 @@ public record BusCableBakedModel(
final BlockModelShaper shapes = Minecraft.getInstance().getBlockRenderer().getBlockModelShaper();
final BakedModel model = shapes.getBlockModel(facadeState);
- final IModelData data = model.getModelData(level, pos, facadeState, blockEntityData);
+ final ModelData data = model.getModelData(level, pos, facadeState, blockEntityData);
- return new ModelDataMap.Builder()
- .withInitial(BUS_CABLE_FACADE_PROPERTY, new BusCableFacade(facadeState, model, data))
+ return ModelData.builder()
+ .with(BUS_CABLE_FACADE_PROPERTY, new BusCableFacade(facadeState, model, data))
.build();
}
@@ -150,8 +150,8 @@ public record BusCableBakedModel(
}
if (supportSide != null) {
- return new ModelDataMap.Builder()
- .withInitial(BUS_CABLE_SUPPORT_PROPERTY, new BusCableSupportSide(supportSide))
+ return ModelData.builder()
+ .with(BUS_CABLE_SUPPORT_PROPERTY, new BusCableSupportSide(supportSide))
.build();
}
@@ -186,5 +186,5 @@ public record BusCableBakedModel(
private record BusCableSupportSide(Direction value) { }
- private record BusCableFacade(BlockState blockState, BakedModel model, IModelData data) { }
+ private record BusCableFacade(BlockState blockState, BakedModel model, ModelData data) { }
}
diff --git a/src/main/java/li/cil/oc2/client/model/BusCableModel.java b/src/main/java/li/cil/oc2/client/model/BusCableModel.java
index 733ce0b5..3e2ee849 100644
--- a/src/main/java/li/cil/oc2/client/model/BusCableModel.java
+++ b/src/main/java/li/cil/oc2/client/model/BusCableModel.java
@@ -8,10 +8,8 @@ import net.minecraft.client.renderer.block.model.ItemOverrides;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.*;
import net.minecraft.resources.ResourceLocation;
-import net.minecraftforge.client.model.CompositeModelState;
-import net.minecraftforge.client.model.IModelConfiguration;
-import net.minecraftforge.client.model.ModelLoaderRegistry;
-import net.minecraftforge.client.model.geometry.IModelGeometry;
+import net.minecraftforge.client.model.geometry.IGeometryBakingContext;
+import net.minecraftforge.client.model.geometry.IUnbakedGeometry;
import java.util.ArrayList;
import java.util.Collection;
@@ -20,35 +18,25 @@ import java.util.function.Function;
import static java.util.Objects.requireNonNull;
-public record BusCableModel(ModelLoaderRegistry.VanillaProxy proxy) implements IModelGeometry {
+public final class BusCableModel implements IUnbakedGeometry {
private static final ResourceLocation BUS_CABLE_STRAIGHT_MODEL = new ResourceLocation(API.MOD_ID, "block/cable_straight");
private static final ResourceLocation BUS_CABLE_SUPPORT_MODEL = new ResourceLocation(API.MOD_ID, "block/cable_support");
+ private final IUnbakedGeometry> proxy;
+
+ BusCableModel(final IUnbakedGeometry> proxy) {
+ this.proxy = proxy;
+ }
///////////////////////////////////////////////////////////////////
@Override
- public BakedModel bake(final IModelConfiguration owner, final ModelBakery bakery, final Function spriteGetter, final ModelState modelTransform, final ItemOverrides overrides, final ResourceLocation modelLocation) {
- final BakedModel bakedBaseModel = proxy.bake(owner, bakery, spriteGetter, modelTransform, overrides, modelLocation);
- final BakedModel[] straightModelByAxis = {
- requireNonNull(bakery.bake(BUS_CABLE_STRAIGHT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X0_Y90), spriteGetter)),
- requireNonNull(bakery.bake(BUS_CABLE_STRAIGHT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X90_Y0), spriteGetter)),
- requireNonNull(bakery.bake(BUS_CABLE_STRAIGHT_MODEL, modelTransform, spriteGetter))
- };
- final BakedModel[] supportModelByFace = {
- requireNonNull(bakery.bake(BUS_CABLE_SUPPORT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X270_Y0), spriteGetter)), // -y
- requireNonNull(bakery.bake(BUS_CABLE_SUPPORT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X90_Y0), spriteGetter)), // +y
- requireNonNull(bakery.bake(BUS_CABLE_SUPPORT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X0_Y180), spriteGetter)), // -z
- requireNonNull(bakery.bake(BUS_CABLE_SUPPORT_MODEL, modelTransform, spriteGetter)), // +z
- requireNonNull(bakery.bake(BUS_CABLE_SUPPORT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X0_Y90), spriteGetter)), // -x
- requireNonNull(bakery.bake(BUS_CABLE_SUPPORT_MODEL, new CompositeModelState(modelTransform, BlockModelRotation.X0_Y270), spriteGetter)) // +x
- };
-
- return new BusCableBakedModel(bakedBaseModel, straightModelByAxis, supportModelByFace);
+ public BakedModel bake(final IGeometryBakingContext owner, final ModelBakery bakery, final Function spriteGetter, final ModelState modelTransform, final ItemOverrides overrides, final ResourceLocation modelLocation) {
+ return new BusCableBakedModel(proxy.bake(owner, bakery, spriteGetter, modelTransform, overrides, modelLocation));
}
@Override
- public Collection getTextures(final IModelConfiguration owner, final Function modelGetter, final Set> missingTextureErrors) {
- final ArrayList textures = new ArrayList<>(proxy.getTextures(owner, modelGetter, missingTextureErrors));
+ public Collection getMaterials(final IGeometryBakingContext owner, final Function modelGetter, final Set> missingTextureErrors) {
+ final ArrayList textures = new ArrayList<>(proxy.getMaterials(owner, modelGetter, missingTextureErrors));
textures.addAll(modelGetter.apply(BUS_CABLE_STRAIGHT_MODEL).getMaterials(modelGetter, missingTextureErrors));
textures.addAll(modelGetter.apply(BUS_CABLE_SUPPORT_MODEL).getMaterials(modelGetter, missingTextureErrors));
return textures;
diff --git a/src/main/java/li/cil/oc2/client/model/BusCableModelLoader.java b/src/main/java/li/cil/oc2/client/model/BusCableModelLoader.java
index 42d35c44..6d5ce6e7 100644
--- a/src/main/java/li/cil/oc2/client/model/BusCableModelLoader.java
+++ b/src/main/java/li/cil/oc2/client/model/BusCableModelLoader.java
@@ -4,17 +4,13 @@ package li.cil.oc2.client.model;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
-import net.minecraft.server.packs.resources.ResourceManager;
-import net.minecraftforge.client.model.IModelLoader;
-import net.minecraftforge.client.model.ModelLoaderRegistry;
+import net.minecraftforge.client.model.ElementsModel;
+import net.minecraftforge.client.model.geometry.IGeometryLoader;
-public final class BusCableModelLoader implements IModelLoader {
- @Override
- public void onResourceManagerReload(final ResourceManager resourceManager) {
- }
+public final class BusCableModelLoader implements IGeometryLoader {
@Override
- public BusCableModel read(final JsonDeserializationContext context, final JsonObject modelContents) {
- return new BusCableModel(ModelLoaderRegistry.VanillaProxy.Loader.INSTANCE.read(context, modelContents));
+ public BusCableModel read(final JsonObject modelContents, final JsonDeserializationContext context) {
+ return new BusCableModel(ElementsModel.Loader.INSTANCE.read(modelContents, context));
}
}
diff --git a/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java b/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java
index 627a23b4..810d920d 100644
--- a/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java
+++ b/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java
@@ -21,8 +21,8 @@ import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderLevelStageEvent;
-import net.minecraftforge.event.world.ChunkEvent;
-import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.event.level.ChunkEvent;
+import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@@ -80,7 +80,7 @@ public final class NetworkCableRenderer {
@SubscribeEvent
public static void handleChunkUnloadEvent(final ChunkEvent.Unload event) {
- if (event.getWorld().isClientSide()) {
+ if (event.getLevel().isClientSide()) {
final ChunkPos chunkPos = event.getChunk().getPos();
final ArrayList list = new ArrayList<>(NetworkCableRenderer.connectors);
@@ -96,9 +96,9 @@ public final class NetworkCableRenderer {
}
@SubscribeEvent
- public static void handleWorldUnloadEvent(final WorldEvent.Unload event) {
- if (event.getWorld().isClientSide()) {
- final LevelAccessor level = event.getWorld();
+ public static void handleWorldUnloadEvent(final LevelEvent.Unload event) {
+ if (event.getLevel().isClientSide()) {
+ final LevelAccessor level = event.getLevel();
final ArrayList list = new ArrayList<>(NetworkCableRenderer.connectors);
for (final NetworkConnectorBlockEntity connector : list) {
diff --git a/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java b/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java
index 75bd0c02..be6aba20 100644
--- a/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java
+++ b/src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java
@@ -40,9 +40,9 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.client.event.EntityViewRenderEvent;
+import net.minecraftforge.client.event.EntityRenderersEvent;
import net.minecraftforge.client.event.RenderLevelStageEvent;
-import net.minecraftforge.client.event.RenderNameplateEvent;
+import net.minecraftforge.client.event.RenderNameTagEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -203,7 +203,7 @@ public final class ProjectorDepthRenderer {
* Suppresses fog rendering while rendering depth buffer for projectors.
*/
@SubscribeEvent
- public static void handleFog(final EntityViewRenderEvent.RenderFogEvent event) {
+ public static void handleFog(final EntityRenderersEvent event) {
if (isRenderingProjectorDepth) {
FogRenderer.setupNoFog();
}
@@ -213,7 +213,7 @@ public final class ProjectorDepthRenderer {
* Suppresses nameplate rendering while rendering depth buffer for projectors.
*/
@SubscribeEvent
- public static void handleNameplate(final RenderNameplateEvent event) {
+ public static void handleNameplate(final RenderNameTagEvent event) {
if (isRenderingProjectorDepth) {
event.setResult(Event.Result.DENY);
}
@@ -275,8 +275,8 @@ public final class ProjectorDepthRenderer {
minecraft.hitResult = null;
// Skip shadow rendering for perf.
- entityShadowsBak = minecraft.options.entityShadows;
- minecraft.options.entityShadows = false;
+ entityShadowsBak = minecraft.options.entityShadows().get();
+ minecraft.options.entityShadows().set(false);
minecraftCameraEntityBak = minecraft.getCameraEntity();
minecraft.setCameraEntity(ProjectorCameraEntity.get(level, Vec3.ZERO, partialTicks));
@@ -288,7 +288,7 @@ public final class ProjectorDepthRenderer {
private static void finishDepthBufferRendering(final Minecraft minecraft) {
minecraft.hitResult = hitResultBak;
- minecraft.options.entityShadows = entityShadowsBak;
+ minecraft.options.entityShadows().set(entityShadowsBak);
RenderSystem.restoreProjectionMatrix();
@@ -566,7 +566,7 @@ public final class ProjectorDepthRenderer {
}
private ProjectorCameraEntity(final Level level, final BlockPos blockPos, final float rotationY) {
- super(level, blockPos, rotationY, FakePlayerUtils.getFakePlayerProfile());
+ super(level, blockPos, rotationY, FakePlayerUtils.getFakePlayerProfile(), null);
}
@Override
diff --git a/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java b/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java
index 73770f44..20606be5 100644
--- a/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java
+++ b/src/main/java/li/cil/oc2/client/renderer/entity/model/RobotModel.java
@@ -16,7 +16,7 @@ import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.resources.ResourceLocation;
-import net.minecraftforge.common.model.TransformationHelper;
+import net.minecraftforge.common.util.TransformationHelper;
public final class RobotModel extends EntityModel {
public static final ModelLayerLocation ROBOT_MODEL_LAYER = new ModelLayerLocation(new ResourceLocation(API.MOD_ID, "robot"), "main");
diff --git a/src/main/java/li/cil/oc2/common/Main.java b/src/main/java/li/cil/oc2/common/Main.java
index f9a3d9b2..22fadf45 100644
--- a/src/main/java/li/cil/oc2/common/Main.java
+++ b/src/main/java/li/cil/oc2/common/Main.java
@@ -2,6 +2,7 @@
package li.cil.oc2.common;
+import dev.architectury.platform.forge.EventBuses;
import li.cil.ceres.Ceres;
import li.cil.oc2.api.API;
import li.cil.oc2.client.ClientSetup;
@@ -25,13 +26,16 @@ import li.cil.oc2.common.util.SoundEvents;
import li.cil.oc2.common.vm.provider.DeviceTreeProviders;
import li.cil.sedna.Sedna;
import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
+import net.minecraftforge.registries.NewRegistryEvent;
@Mod(API.MOD_ID)
public final class Main {
public Main() {
+ EventBuses.registerModEventBus(API.MOD_ID, FMLJavaModLoadingContext.get().getModEventBus());
Ceres.initialize();
Sedna.initialize();
DeviceTreeProviders.initialize();
@@ -57,12 +61,9 @@ public final class Main {
BlockDeviceDataRegistry.initialize();
FirmwareRegistry.initialize();
- DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> Manuals::initialize);
-
RegistryUtils.finish();
- ItemRenameHandler.initialize();
-
+ DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> Manuals::initialize);
FMLJavaModLoadingContext.get().getModEventBus().register(CommonSetup.class);
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () ->
FMLJavaModLoadingContext.get().getModEventBus().register(ClientSetup.class));
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 bf36dc48..d7087741 100644
--- a/src/main/java/li/cil/oc2/common/block/Blocks.java
+++ b/src/main/java/li/cil/oc2/common/block/Blocks.java
@@ -2,14 +2,16 @@
package li.cil.oc2.common.block;
+import li.cil.oc2.api.API;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.world.level.block.Block;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public final class Blocks {
- private static final DeferredRegister BLOCKS = RegistryUtils.getInitializerFor(ForgeRegistries.BLOCKS);
+ private static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -27,5 +29,6 @@ public final class Blocks {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
}
diff --git a/src/main/java/li/cil/oc2/common/block/ComputerBlock.java b/src/main/java/li/cil/oc2/common/block/ComputerBlock.java
index 502fe676..b84b34eb 100644
--- a/src/main/java/li/cil/oc2/common/block/ComputerBlock.java
+++ b/src/main/java/li/cil/oc2/common/block/ComputerBlock.java
@@ -230,7 +230,7 @@ public final class ComputerBlock extends HorizontalDirectionalBlock implements E
final ItemStack computer = new ItemStack(this);
final CompoundTag itemsTag = NBTUtils.getOrCreateChildTag(computer.getOrCreateTag(), BLOCK_ENTITY_TAG_NAME_IN_ITEM, ITEMS_TAG_NAME);
- itemsTag.put(key(DeviceTypes.FLASH_MEMORY), makeInventoryTag(
+ itemsTag.put(DeviceTypes.FLASH_MEMORY.getName().toString(), makeInventoryTag(
new ItemStack(Items.FLASH_MEMORY_CUSTOM.get())
));
@@ -241,16 +241,16 @@ public final class ComputerBlock extends HorizontalDirectionalBlock implements E
final ItemStack computer = getComputerWithFlash();
final CompoundTag itemsTag = NBTUtils.getOrCreateChildTag(computer.getOrCreateTag(), BLOCK_ENTITY_TAG_NAME_IN_ITEM, ITEMS_TAG_NAME);
- itemsTag.put(key(DeviceTypes.MEMORY), makeInventoryTag(
+ itemsTag.put(DeviceTypes.MEMORY.getName().toString(), makeInventoryTag(
new ItemStack(Items.MEMORY_LARGE.get()),
new ItemStack(Items.MEMORY_LARGE.get()),
new ItemStack(Items.MEMORY_LARGE.get()),
new ItemStack(Items.MEMORY_LARGE.get())
));
- itemsTag.put(key(DeviceTypes.HARD_DRIVE), makeInventoryTag(
+ itemsTag.put(DeviceTypes.HARD_DRIVE.getName().toString(), makeInventoryTag(
new ItemStack(Items.HARD_DRIVE_CUSTOM.get())
));
- itemsTag.put(key(DeviceTypes.CARD), makeInventoryTag(
+ itemsTag.put(DeviceTypes.CARD.getName().toString(), makeInventoryTag(
new ItemStack(Items.NETWORK_INTERFACE_CARD.get())
));
diff --git a/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java b/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java
index 99229528..dae445c5 100644
--- a/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java
+++ b/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java
@@ -23,7 +23,7 @@ public final class CreativeEnergyBlock extends Block implements EntityBlock {
.of(Material.METAL)
.sound(SoundType.METAL)
.strength(-1, 3600000)
- .noDrops());
+ .noLootTable());
}
///////////////////////////////////////////////////////////////////
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 17439e9a..9822a26b 100644
--- a/src/main/java/li/cil/oc2/common/blockentity/BlockEntities.java
+++ b/src/main/java/li/cil/oc2/common/blockentity/BlockEntities.java
@@ -2,17 +2,19 @@
package li.cil.oc2.common.blockentity;
+import li.cil.oc2.api.API;
import li.cil.oc2.common.block.Blocks;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public final class BlockEntities {
- private static final DeferredRegister> BLOCK_ENTITIES = RegistryUtils.getInitializerFor(ForgeRegistries.BLOCK_ENTITIES);
+ private static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -30,6 +32,7 @@ public final class BlockEntities {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ BLOCK_ENTITIES.register(FMLJavaModLoadingContext.get().getModEventBus());
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/AbstractBlockDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/AbstractBlockDeviceBusElement.java
index 8a1b26ec..99df2632 100644
--- a/src/main/java/li/cil/oc2/common/bus/AbstractBlockDeviceBusElement.java
+++ b/src/main/java/li/cil/oc2/common/bus/AbstractBlockDeviceBusElement.java
@@ -7,6 +7,7 @@ import li.cil.oc2.api.bus.DeviceBusElement;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.provider.BlockDeviceProvider;
import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery;
+import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider;
import li.cil.oc2.api.util.Invalidatable;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.bus.device.provider.Providers;
diff --git a/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java
index 86be7a21..d08d9154 100644
--- a/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java
+++ b/src/main/java/li/cil/oc2/common/bus/AbstractGroupingDeviceBusElement.java
@@ -3,6 +3,7 @@
package li.cil.oc2.common.bus;
import li.cil.oc2.api.bus.device.Device;
+import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider;
import li.cil.oc2.common.util.NBTTagIds;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
diff --git a/src/main/java/li/cil/oc2/common/bus/AbstractItemDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/AbstractItemDeviceBusElement.java
index e0259644..5229b628 100644
--- a/src/main/java/li/cil/oc2/common/bus/AbstractItemDeviceBusElement.java
+++ b/src/main/java/li/cil/oc2/common/bus/AbstractItemDeviceBusElement.java
@@ -90,10 +90,8 @@ public abstract class AbstractItemDeviceBusElement extends AbstractGroupingDevic
return;
}
- final ResourceLocation registryName = query.getItemStack().getItem().getRegistryName();
- if (registryName != null) {
- final String itemName = registryName.toString();
- entries.add(new ItemEntry(new ItemDeviceInfo(null, new TypeNameRPCDevice(itemName), 0)));
+ if (query.getItemStack().getDisplayName() != null) {
+ entries.add(new ItemEntry(new ItemDeviceInfo(null, new TypeNameRPCDevice(query.getItemStack().getDisplayName().toString()), 0)));
}
}
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 1bec29f7..0bce2e87 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
@@ -10,6 +10,7 @@ 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.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.RegistryBuilder;
@@ -19,15 +20,18 @@ 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.getInitializerFor(DeviceType.REGISTRY);
+ private static final DeferredRegister DEVICE_TYPES = DeferredRegister.create(new ResourceLocation("device_type"), API.MOD_ID);
///////////////////////////////////////////////////////////////////
- public static final Supplier> DEVICE_TYPE_REGISTRY = DEVICE_TYPES.makeRegistry(DeviceType.class, RegistryBuilder::new);
+ public static final Supplier> DEVICE_TYPE_REGISTRY = DEVICE_TYPES.makeRegistry(RegistryBuilder::new);
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ DEVICE_TYPES.register(FMLJavaModLoadingContext.get().getModEventBus());
+
+
register(ItemTags.DEVICES_MEMORY);
register(ItemTags.DEVICES_HARD_DRIVE);
register(ItemTags.DEVICES_FLASH_MEMORY);
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 0172c689..5285da91 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
@@ -2,10 +2,12 @@
package li.cil.oc2.common.bus.device.data;
+import li.cil.oc2.api.API;
import li.cil.oc2.api.bus.device.data.BlockDeviceData;
import li.cil.oc2.api.util.Registries;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.resources.ResourceLocation;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.RegistryBuilder;
@@ -16,11 +18,11 @@ import java.util.function.Supplier;
import java.util.stream.Stream;
public final class BlockDeviceDataRegistry {
- private static final DeferredRegister INITIALIZER = RegistryUtils.getInitializerFor(Registries.BLOCK_DEVICE_DATA);
+ private static final DeferredRegister INITIALIZER = DeferredRegister.create(new ResourceLocation("block_device_data"), API.MOD_ID);
///////////////////////////////////////////////////////////////////
- private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(BlockDeviceData.class, RegistryBuilder::new);
+ private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(RegistryBuilder::new);
///////////////////////////////////////////////////////////////////
@@ -29,11 +31,12 @@ public final class BlockDeviceDataRegistry {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ INITIALIZER.register(FMLJavaModLoadingContext.get().getModEventBus());
}
@Nullable
public static ResourceLocation getKey(final BlockDeviceData data) {
- return data.getRegistryName();
+ return INITIALIZER.getRegistryName();
}
@Nullable
diff --git a/src/main/java/li/cil/oc2/common/bus/device/data/BuildrootBlockDeviceData.java b/src/main/java/li/cil/oc2/common/bus/device/data/BuildrootBlockDeviceData.java
index cbc5465a..6cd84f81 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/data/BuildrootBlockDeviceData.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/data/BuildrootBlockDeviceData.java
@@ -2,19 +2,20 @@
package li.cil.oc2.common.bus.device.data;
+import com.mojang.serialization.Codec;
import li.cil.oc2.api.bus.device.data.BlockDeviceData;
import li.cil.sedna.api.device.BlockDevice;
import li.cil.sedna.buildroot.Buildroot;
import li.cil.sedna.device.block.ByteBufferBlockDevice;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TextComponent;
-import net.minecraftforge.registries.ForgeRegistryEntry;
+import net.minecraftforge.registries.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.IOException;
+import java.util.*;
-public final class BuildrootBlockDeviceData extends ForgeRegistryEntry implements BlockDeviceData {
+public final class BuildrootBlockDeviceData implements BlockDeviceData {
private static final Logger LOGGER = LogManager.getLogger();
///////////////////////////////////////////////////////////////////
@@ -34,13 +35,11 @@ public final class BuildrootBlockDeviceData extends ForgeRegistryEntry implements Firmware {
+public final class BuildrootFirmware implements Firmware {
@Override
public boolean run(final MemoryMap memory, final long startAddress) {
try {
@@ -26,6 +24,6 @@ public final class BuildrootFirmware extends ForgeRegistryEntry implem
@Override
public Component getDisplayName() {
- return new TextComponent("Sedna Linux");
+ return Component.literal("Sedna Linux");
}
}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java b/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java
index 40aa9801..4b01c087 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/data/FileSystems.java
@@ -79,7 +79,7 @@ public final class FileSystems {
LOGGER.info("Searching for datapack filesystems...");
final Collection fileSystemDescriptorLocations = resourceManager
- .listResources("file_systems", s -> s.endsWith(".json"));
+ .listResources("file_systems", s -> s.toString().endsWith(".json")).keySet();
final ArrayList fileSystems = new ArrayList<>();
final Object2IntArrayMap fileSystemOrder = new Object2IntArrayMap<>();
@@ -87,15 +87,15 @@ public final class FileSystems {
for (final ResourceLocation fileSystemDescriptorLocation : fileSystemDescriptorLocations) {
LOGGER.info("Found [{}]", fileSystemDescriptorLocation);
try {
- final Resource fileSystemDescriptor = resourceManager.getResource(fileSystemDescriptorLocation);
- final JsonObject json = JsonParser.parseReader(new InputStreamReader(fileSystemDescriptor.getInputStream())).getAsJsonObject();
+ final Resource fileSystemDescriptor = resourceManager.getResource(fileSystemDescriptorLocation).get();
+ final JsonObject json = JsonParser.parseReader(new InputStreamReader(fileSystemDescriptor.open())).getAsJsonObject();
final String type = json.getAsJsonPrimitive("type").getAsString();
switch (type) {
case "layer" -> {
final ResourceLocation location = new ResourceLocation(json.getAsJsonPrimitive("location").getAsString());
final ZipStreamFileSystem fileSystem;
- try (final InputStream stream = resourceManager.getResource(location).getInputStream()) {
+ try (final InputStream stream = resourceManager.getResource(location).get().open()) {
fileSystem = new ZipStreamFileSystem(stream);
}
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 0008618a..2dae7fc0 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
@@ -2,10 +2,12 @@
package li.cil.oc2.common.bus.device.data;
+import li.cil.oc2.api.API;
import li.cil.oc2.api.bus.device.data.Firmware;
import li.cil.oc2.api.util.Registries;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.resources.ResourceLocation;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.RegistryBuilder;
@@ -16,11 +18,11 @@ import java.util.function.Supplier;
import java.util.stream.Stream;
public final class FirmwareRegistry {
- private static final DeferredRegister INITIALIZER = RegistryUtils.getInitializerFor(Registries.FIRMWARE);
+ private static final DeferredRegister INITIALIZER = DeferredRegister.create(new ResourceLocation("firmware"), API.MOD_ID);
///////////////////////////////////////////////////////////////////
- private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(Firmware.class, RegistryBuilder::new);
+ private static final Supplier> REGISTRY = INITIALIZER.makeRegistry(RegistryBuilder::new);
///////////////////////////////////////////////////////////////////
@@ -29,11 +31,12 @@ public final class FirmwareRegistry {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ INITIALIZER.register(FMLJavaModLoadingContext.get().getModEventBus());
}
@Nullable
public static ResourceLocation getKey(final Firmware firmware) {
- return firmware.getRegistryName();
+ return INITIALIZER.getRegistryName();
}
@Nullable
diff --git a/src/main/java/li/cil/oc2/common/bus/device/data/ResourceBlockDeviceData.java b/src/main/java/li/cil/oc2/common/bus/device/data/ResourceBlockDeviceData.java
index 757b6759..e7cc733d 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/data/ResourceBlockDeviceData.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/data/ResourceBlockDeviceData.java
@@ -6,43 +6,23 @@ import li.cil.oc2.api.bus.device.data.BlockDeviceData;
import li.cil.sedna.api.device.BlockDevice;
import li.cil.sedna.device.block.ByteBufferBlockDevice;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
-import net.minecraftforge.registries.IForgeRegistryEntry;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.io.InputStream;
-public final class ResourceBlockDeviceData implements IForgeRegistryEntry, BlockDeviceData, AutoCloseable {
- private final ResourceLocation location;
+public final class ResourceBlockDeviceData implements BlockDeviceData, AutoCloseable {
private final String name;
private final BlockDevice blockDevice;
public ResourceBlockDeviceData(final ResourceManager resourceManager, final ResourceLocation location, final String name) throws IOException {
- this.location = location;
this.name = name;
- final InputStream stream = resourceManager.getResource(location).getInputStream();
+ final InputStream stream = resourceManager.getResource(location).get().open();
this.blockDevice = ByteBufferBlockDevice.createFromStream(stream, true);
}
- @Override
- public BlockDeviceData setRegistryName(final ResourceLocation name) {
- throw new UnsupportedOperationException();
- }
-
- @Nullable
- @Override
- public ResourceLocation getRegistryName() {
- return location;
- }
-
- @Override
- public Class getRegistryType() {
- return BlockDeviceData.class;
- }
-
@Override
public void close() throws Exception {
blockDevice.close();
@@ -55,6 +35,6 @@ public final class ResourceBlockDeviceData implements IForgeRegistryEntry BLOCK_DEVICE_PROVIDERS = RegistryUtils.getInitializerFor(Registries.BLOCK_DEVICE_PROVIDER);
- public static final Supplier> BLOCK_DEVICE_PROVIDER_REGISTRY = BLOCK_DEVICE_PROVIDERS.makeRegistry(BlockDeviceProvider.class, RegistryBuilder::new);
+ private static final DeferredRegister BLOCK_DEVICE_PROVIDERS = DeferredRegister.create(new ResourceLocation("block_device_provider"), API.MOD_ID);
+ public static final Supplier> BLOCK_DEVICE_PROVIDER_REGISTRY = BLOCK_DEVICE_PROVIDERS.makeRegistry(RegistryBuilder::new);
///////////////////////////////////////////////////////////////////
- private static final DeferredRegister ITEM_DEVICE_PROVIDERS = RegistryUtils.getInitializerFor(Registries.ITEM_DEVICE_PROVIDER);
- public static final Supplier> ITEM_DEVICE_PROVIDER_REGISTRY = ITEM_DEVICE_PROVIDERS.makeRegistry(ItemDeviceProvider.class, RegistryBuilder::new);
+ private static final DeferredRegister ITEM_DEVICE_PROVIDERS = DeferredRegister.create(new ResourceLocation("item_device_provider"), API.MOD_ID);
+ public static final Supplier> ITEM_DEVICE_PROVIDER_REGISTRY = ITEM_DEVICE_PROVIDERS.makeRegistry(RegistryBuilder::new);
///////////////////////////////////////////////////////////////////
public static void initialize() {
- Providers.registerBlockDeviceProviders(BLOCK_DEVICE_PROVIDERS::register);
- Providers.registerItemDeviceProviders(ITEM_DEVICE_PROVIDERS::register);
+ ITEM_DEVICE_PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
+ BLOCK_DEVICE_PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
+
+ ITEM_DEVICE_PROVIDERS.register("memory", MemoryItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("hard_drive", HardDriveItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("hard_drive_custom", HardDriveWithExternalDataItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("flash_memory", FlashMemoryItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("flash_memory_custom", FlashMemoryWithExternalDataItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("redstone_interface_card", RedstoneInterfaceCardItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("network_interface_card", NetworkInterfaceCardItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("network_tunnel_card", NetworkTunnelCardItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("file_import_export_card", FileImportExportCardItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("sound_card", SoundCardItemDeviceProvider::new);
+
+ ITEM_DEVICE_PROVIDERS.register("inventory_operations_module", InventoryOperationsModuleDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("block_operations_module", BlockOperationsModuleDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("network_tunnel_module", NetworkTunnelModuleItemDeviceProvider::new);
+
+ ITEM_DEVICE_PROVIDERS.register("item_stack/capability", ItemStackCapabilityDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("energy_storage", EnergyStorageItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("fluid_handler", FluidHandlerItemDeviceProvider::new);
+ ITEM_DEVICE_PROVIDERS.register("item_handler", ItemHandlerItemDeviceProvider::new);
+
+ BLOCK_DEVICE_PROVIDERS.register("block", BlockStateObjectDeviceProvider::new);
+ BLOCK_DEVICE_PROVIDERS.register("block_entity", BlockEntityObjectDeviceProvider::new);
+
+ BLOCK_DEVICE_PROVIDERS.register("block_entity/capability", BlockEntityCapabilityDeviceProvider::new);
+ BLOCK_DEVICE_PROVIDERS.register("energy_storage", EnergyStorageBlockDeviceProvider::new);
+ BLOCK_DEVICE_PROVIDERS.register("fluid_handler", FluidHandlerBlockDeviceProvider::new);
+ BLOCK_DEVICE_PROVIDERS.register("item_handler", ItemHandlerBlockDeviceProvider::new);
}
}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java b/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java
index e306bdb6..f9619c65 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java
@@ -22,34 +22,10 @@ public final class Providers {
}
public static void registerBlockDeviceProviders(final BiConsumer> registry) {
- registry.accept("block", BlockStateObjectDeviceProvider::new);
- registry.accept("block_entity", BlockEntityObjectDeviceProvider::new);
- registry.accept("block_entity/capability", BlockEntityCapabilityDeviceProvider::new);
- registry.accept("energy_storage", EnergyStorageBlockDeviceProvider::new);
- registry.accept("fluid_handler", FluidHandlerBlockDeviceProvider::new);
- registry.accept("item_handler", ItemHandlerBlockDeviceProvider::new);
}
public static void registerItemDeviceProviders(final BiConsumer> registry) {
- registry.accept("memory", MemoryItemDeviceProvider::new);
- registry.accept("hard_drive", HardDriveItemDeviceProvider::new);
- registry.accept("hard_drive_custom", HardDriveWithExternalDataItemDeviceProvider::new);
- registry.accept("flash_memory", FlashMemoryItemDeviceProvider::new);
- registry.accept("flash_memory_custom", FlashMemoryWithExternalDataItemDeviceProvider::new);
- registry.accept("redstone_interface_card", RedstoneInterfaceCardItemDeviceProvider::new);
- registry.accept("network_interface_card", NetworkInterfaceCardItemDeviceProvider::new);
- registry.accept("network_tunnel_card", NetworkTunnelCardItemDeviceProvider::new);
- registry.accept("file_import_export_card", FileImportExportCardItemDeviceProvider::new);
- registry.accept("sound_card", SoundCardItemDeviceProvider::new);
- registry.accept("inventory_operations_module", InventoryOperationsModuleDeviceProvider::new);
- registry.accept("block_operations_module", BlockOperationsModuleDeviceProvider::new);
- registry.accept("network_tunnel_module", NetworkTunnelModuleItemDeviceProvider::new);
-
- registry.accept("item_stack/capability", ItemStackCapabilityDeviceProvider::new);
- registry.accept("energy_storage", EnergyStorageItemDeviceProvider::new);
- registry.accept("fluid_handler", FluidHandlerItemDeviceProvider::new);
- registry.accept("item_handler", ItemHandlerItemDeviceProvider::new);
}
}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractBlockDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractBlockDeviceProvider.java
index 3a412a8c..442fbaef 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractBlockDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractBlockDeviceProvider.java
@@ -3,6 +3,5 @@
package li.cil.oc2.common.bus.device.provider.util;
import li.cil.oc2.api.bus.device.provider.BlockDeviceProvider;
-import net.minecraftforge.registries.ForgeRegistryEntry;
-public abstract class AbstractBlockDeviceProvider extends ForgeRegistryEntry implements BlockDeviceProvider { }
+public abstract class AbstractBlockDeviceProvider implements BlockDeviceProvider { }
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java
index 768e3a39..eadb2932 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java
@@ -7,13 +7,12 @@ import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
-import net.minecraftforge.registries.ForgeRegistryEntry;
import net.minecraftforge.registries.RegistryObject;
import java.util.Optional;
import java.util.function.Predicate;
-public abstract class AbstractItemDeviceProvider extends ForgeRegistryEntry implements ItemDeviceProvider {
+public abstract class AbstractItemDeviceProvider implements ItemDeviceProvider {
private final Predicate- predicate;
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCItemStackTagFilter.java b/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCItemStackTagFilter.java
index bc287b97..0543c662 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCItemStackTagFilter.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCItemStackTagFilter.java
@@ -8,6 +8,7 @@ import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.StringUtil;
import net.minecraft.world.item.ItemStack;
+import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nullable;
import java.util.Objects;
@@ -26,7 +27,7 @@ public final class RPCItemStackTagFilter {
return null;
}
- if (item != null && !Objects.equals(stack.getItem().getRegistryName(), item)) {
+ if (item != null && !Objects.equals(ForgeRegistries.ITEMS.getKey(stack.getItem()), item)) {
return null;
}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java b/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java
index 87d8bb3f..7ead62ba 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java
@@ -3,12 +3,12 @@
package li.cil.oc2.common.bus.device.util;
import li.cil.oc2.api.bus.device.Device;
-import net.minecraftforge.registries.IForgeRegistryEntry;
+import net.minecraftforge.registries.IForgeRegistry;
import javax.annotation.Nullable;
import java.util.Objects;
-public abstract class AbstractDeviceInfo, TDevice extends Device> {
+public abstract class AbstractDeviceInfo {
@Nullable public final TProvider provider;
public final TDevice device;
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 821c3f04..f314dad4 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
@@ -7,9 +7,8 @@ import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
-import net.minecraftforge.registries.ForgeRegistryEntry;
-public final class DeviceTypeImpl extends ForgeRegistryEntry implements DeviceType {
+public final class DeviceTypeImpl implements DeviceType {
private final TagKey
- tag;
private final ResourceLocation icon;
private final Component name;
diff --git a/src/main/java/li/cil/oc2/common/bus/device/vm/item/ByteBufferFlashStorageDevice.java b/src/main/java/li/cil/oc2/common/bus/device/vm/item/ByteBufferFlashStorageDevice.java
index a3921a18..428d004a 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/vm/item/ByteBufferFlashStorageDevice.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/vm/item/ByteBufferFlashStorageDevice.java
@@ -18,7 +18,7 @@ import li.cil.sedna.api.memory.MemoryMap;
import li.cil.sedna.device.flash.FlashMemoryDevice;
import li.cil.sedna.memory.MemoryMaps;
import net.minecraft.nbt.CompoundTag;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import java.nio.ByteBuffer;
@@ -133,7 +133,7 @@ public final class ByteBufferFlashStorageDevice extends IdentityProxy
try {
MemoryMaps.store(memoryMap, startAddress, data);
} catch (final MemoryAccessException e) {
- throw new VMInitializationException(new TranslatableComponent(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
+ throw new VMInitializationException(Component.translatable(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
}
}
}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/vm/item/FirmwareFlashStorageDevice.java b/src/main/java/li/cil/oc2/common/bus/device/vm/item/FirmwareFlashStorageDevice.java
index eba6aba0..ff0db73d 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/vm/item/FirmwareFlashStorageDevice.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/vm/item/FirmwareFlashStorageDevice.java
@@ -14,7 +14,7 @@ import li.cil.oc2.api.bus.device.vm.event.VMInitializingEvent;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.bus.device.util.IdentityProxy;
import li.cil.sedna.api.memory.MemoryMap;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
public final class FirmwareFlashStorageDevice extends IdentityProxy implements VMDevice, ItemDevice, FirmwareLoader {
@@ -57,7 +57,7 @@ public final class FirmwareFlashStorageDevice extends IdentityProxy i
private void copyDataToMemory(final long address) {
if (!firmware.run(memoryMap, address)) {
- throw new VMInitializationException(new TranslatableComponent(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
+ throw new VMInitializationException(Component.translatable(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
}
}
}
diff --git a/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java b/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java
index 30f17c2e..ac09797a 100644
--- a/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java
+++ b/src/main/java/li/cil/oc2/common/container/ComputerInventoryContainer.java
@@ -9,7 +9,6 @@ import li.cil.oc2.common.vm.VMItemStackHandlers;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.entity.player.Inventory;
@@ -21,10 +20,10 @@ import net.minecraftforge.network.NetworkHooks;
public final class ComputerInventoryContainer extends AbstractComputerContainer {
public static void createServer(final ComputerBlockEntity computer, final IEnergyStorage energy, final CommonDeviceBusController busController, final ServerPlayer player) {
- NetworkHooks.openGui(player, new MenuProvider() {
+ NetworkHooks.openScreen(player, new MenuProvider() {
@Override
public Component getDisplayName() {
- return new TranslatableComponent(computer.getBlockState().getBlock().getDescriptionId());
+ return Component.translatable(computer.getBlockState().getBlock().getDescriptionId());
}
@Override
diff --git a/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java b/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java
index e521b9c7..0e5e51e0 100644
--- a/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java
+++ b/src/main/java/li/cil/oc2/common/container/ComputerTerminalContainer.java
@@ -7,7 +7,6 @@ import li.cil.oc2.common.bus.CommonDeviceBusController;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.MenuProvider;
import net.minecraft.world.entity.player.Inventory;
@@ -19,10 +18,10 @@ import net.minecraftforge.network.NetworkHooks;
public final class ComputerTerminalContainer extends AbstractComputerContainer {
public static void createServer(final ComputerBlockEntity computer, final IEnergyStorage energy, final CommonDeviceBusController busController, final ServerPlayer player) {
- NetworkHooks.openGui(player, new MenuProvider() {
+ NetworkHooks.openScreen(player, new MenuProvider() {
@Override
public Component getDisplayName() {
- return new TranslatableComponent(computer.getBlockState().getBlock().getDescriptionId());
+ return Component.translatable(computer.getBlockState().getBlock().getDescriptionId());
}
@Override
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 a5d4e797..9359c5bf 100644
--- a/src/main/java/li/cil/oc2/common/container/Containers.java
+++ b/src/main/java/li/cil/oc2/common/container/Containers.java
@@ -2,15 +2,17 @@
package li.cil.oc2.common.container;
+import li.cil.oc2.api.API;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.world.inventory.MenuType;
import net.minecraftforge.common.extensions.IForgeMenuType;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public final class Containers {
- private static final DeferredRegister> CONTAINERS = RegistryUtils.getInitializerFor(ForgeRegistries.CONTAINERS);
+ private static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -23,5 +25,6 @@ public final class Containers {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
}
diff --git a/src/main/java/li/cil/oc2/common/container/NetworkTunnelContainer.java b/src/main/java/li/cil/oc2/common/container/NetworkTunnelContainer.java
index d1f55153..34a5139c 100644
--- a/src/main/java/li/cil/oc2/common/container/NetworkTunnelContainer.java
+++ b/src/main/java/li/cil/oc2/common/container/NetworkTunnelContainer.java
@@ -22,7 +22,7 @@ import java.util.UUID;
public final class NetworkTunnelContainer extends AbstractContainer {
public static void createServer(final ServerPlayer player, final InteractionHand hand) {
- NetworkHooks.openGui(player, new MenuProvider() {
+ NetworkHooks.openScreen(player, new MenuProvider() {
@Override
public Component getDisplayName() {
return player.getItemInHand(hand).getItem().getDescription();
diff --git a/src/main/java/li/cil/oc2/common/container/RobotInventoryContainer.java b/src/main/java/li/cil/oc2/common/container/RobotInventoryContainer.java
index ec6e89bd..696a20e7 100644
--- a/src/main/java/li/cil/oc2/common/container/RobotInventoryContainer.java
+++ b/src/main/java/li/cil/oc2/common/container/RobotInventoryContainer.java
@@ -20,7 +20,7 @@ import net.minecraftforge.network.NetworkHooks;
public final class RobotInventoryContainer extends AbstractRobotContainer {
public static void createServer(final Robot robot, final FixedEnergyStorage energy, final CommonDeviceBusController busController, final ServerPlayer player) {
- NetworkHooks.openGui(player, new MenuProvider() {
+ NetworkHooks.openScreen(player, new MenuProvider() {
@Override
public Component getDisplayName() {
return robot.getName();
diff --git a/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java b/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java
index 07a0a1d5..ed77b4ab 100644
--- a/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java
+++ b/src/main/java/li/cil/oc2/common/container/RobotTerminalContainer.java
@@ -19,7 +19,7 @@ import net.minecraftforge.network.NetworkHooks;
public final class RobotTerminalContainer extends AbstractRobotContainer {
public static void createServer(final Robot robot, final FixedEnergyStorage energy, final CommonDeviceBusController busController, final ServerPlayer player) {
- NetworkHooks.openGui(player, new MenuProvider() {
+ NetworkHooks.openScreen(player, new MenuProvider() {
@Override
public Component getDisplayName() {
return robot.getName();
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 088bebc8..6e61d7a0 100644
--- a/src/main/java/li/cil/oc2/common/entity/Entities.java
+++ b/src/main/java/li/cil/oc2/common/entity/Entities.java
@@ -2,10 +2,12 @@
package li.cil.oc2.common.entity;
+import li.cil.oc2.api.API;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
@@ -13,7 +15,7 @@ import net.minecraftforge.registries.RegistryObject;
import java.util.function.Function;
public final class Entities {
- private static final DeferredRegister> ENTITIES = RegistryUtils.getInitializerFor(ForgeRegistries.ENTITIES);
+ private static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -22,6 +24,7 @@ public final class Entities {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ ENTITIES.register(FMLJavaModLoadingContext.get().getModEventBus());
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/entity/Robot.java b/src/main/java/li/cil/oc2/common/entity/Robot.java
index d002d4ab..d94df8c6 100644
--- a/src/main/java/li/cil/oc2/common/entity/Robot.java
+++ b/src/main/java/li/cil/oc2/common/entity/Robot.java
@@ -43,6 +43,7 @@ import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
+import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
@@ -69,8 +70,8 @@ import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
-import net.minecraftforge.event.world.ChunkEvent;
-import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.event.level.ChunkEvent;
+import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.network.NetworkHooks;
@@ -108,7 +109,7 @@ public final class Robot extends Entity implements li.cil.oc2.api.capabilities.R
///////////////////////////////////////////////////////////////////
private final Consumer chunkUnloadListener = this::handleChunkUnload;
- private final Consumer worldUnloadListener = this::handleWorldUnload;
+ private final Consumer worldUnloadListener = this::handleWorldUnload;
private final BlockPos.MutableBlockPos mutablePosition = new BlockPos.MutableBlockPos();
private final AnimationState animationState = new AnimationState();
@@ -471,7 +472,7 @@ public final class Robot extends Entity implements li.cil.oc2.api.capabilities.R
}
private void handleChunkUnload(final ChunkEvent.Unload event) {
- if (event.getWorld() != level) {
+ if (event.getLevel() != level) {
return;
}
@@ -485,8 +486,8 @@ public final class Robot extends Entity implements li.cil.oc2.api.capabilities.R
virtualMachine.dispose();
}
- private void handleWorldUnload(final WorldEvent.Unload event) {
- if (event.getWorld() != level) {
+ private void handleWorldUnload(final LevelEvent.Unload event) {
+ if (event.getLevel() != level) {
return;
}
@@ -541,7 +542,7 @@ public final class Robot extends Entity implements li.cil.oc2.api.capabilities.R
public float topRenderRotationSpeed;
public float topRenderHover = -(hashCode() & 0xFFFF); // init to "random" to avoid synchronous hovering
- public void update(final float deltaTime, final Random random) {
+ public void update(final float deltaTime, final RandomSource random) {
if (getVirtualMachine().isRunning() || actionProcessor.hasQueuedActions()) {
topRenderHover = topRenderHover + deltaTime * HOVER_ANIMATION_SPEED;
final float topOffsetY = Mth.sin(topRenderHover) / 32f;
diff --git a/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java b/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java
index 1c141686..8b7b7354 100644
--- a/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java
+++ b/src/main/java/li/cil/oc2/common/item/AbstractBlockDeviceItem.java
@@ -7,7 +7,6 @@ import li.cil.oc2.common.bus.device.data.BlockDeviceDataRegistry;
import li.cil.oc2.common.util.ItemStackUtils;
import net.minecraft.ResourceLocationException;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.StringUtil;
import net.minecraft.world.item.ItemStack;
@@ -76,7 +75,7 @@ public abstract class AbstractBlockDeviceItem extends ModItem {
public Component getName(final ItemStack stack) {
final BlockDeviceData data = getData(stack);
if (data != null) {
- return new TextComponent("")
+ return Component.literal("")
.append(super.getName(stack))
.append(" (")
.append(data.getDisplayName())
diff --git a/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java b/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java
index 0e8c0fbd..a5007b3b 100644
--- a/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java
+++ b/src/main/java/li/cil/oc2/common/item/AbstractStorageItem.java
@@ -7,7 +7,6 @@ import li.cil.oc2.common.util.NBTTagIds;
import li.cil.oc2.common.util.TextFormatUtils;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TextComponent;
import net.minecraft.world.item.ItemStack;
public abstract class AbstractStorageItem extends ModItem {
@@ -51,7 +50,7 @@ public abstract class AbstractStorageItem extends ModItem {
@Override
public Component getName(final ItemStack stack) {
final int capacity = getCapacity(stack);
- return new TextComponent("")
+ return Component.literal("")
.append(super.getName(stack))
.append(" (")
.append(TextFormatUtils.formatSize(capacity))
diff --git a/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java b/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java
index f3595648..621e803c 100644
--- a/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java
+++ b/src/main/java/li/cil/oc2/common/item/BusInterfaceItem.java
@@ -70,7 +70,7 @@ public final class BusInterfaceItem extends ModBlockItem {
@Override
public void fillItemCategory(final CreativeModeTab tab, final NonNullList items) {
- if (allowdedIn(tab)) {
+ if (this.allowedIn(tab)) {
items.add(new ItemStack(this));
}
}
diff --git a/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java b/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java
index 9a27d0d7..d1c3a10b 100644
--- a/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java
+++ b/src/main/java/li/cil/oc2/common/item/FlashMemoryWithExternalDataItem.java
@@ -8,7 +8,6 @@ import li.cil.oc2.common.util.ItemStackUtils;
import net.minecraft.ResourceLocationException;
import net.minecraft.Util;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.StringUtil;
import net.minecraft.world.item.ItemStack;
@@ -74,7 +73,7 @@ public final class FlashMemoryWithExternalDataItem extends ModItem {
public Component getName(final ItemStack stack) {
final Firmware firmware = getFirmware(stack);
if (firmware != null) {
- return new TextComponent("")
+ return Component.literal("")
.append(super.getName(stack))
.append(" (")
.append(firmware.getDisplayName())
diff --git a/src/main/java/li/cil/oc2/common/item/ItemRenameHandler.java b/src/main/java/li/cil/oc2/common/item/ItemRenameHandler.java
index c1b8c6c7..2f26df71 100644
--- a/src/main/java/li/cil/oc2/common/item/ItemRenameHandler.java
+++ b/src/main/java/li/cil/oc2/common/item/ItemRenameHandler.java
@@ -1,13 +1,12 @@
-/* SPDX-License-Identifier: MIT */
-
package li.cil.oc2.common.item;
import li.cil.oc2.api.API;
import net.minecraft.Util;
+import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.RegistryEvent;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.registries.MissingMappingsEvent;
import java.util.HashMap;
import java.util.Map;
@@ -26,15 +25,13 @@ public final class ItemRenameHandler {
///////////////////////////////////////////////////////////////////
- public static void initialize() {
- MinecraftForge.EVENT_BUS.addGenericListener(Item.class, ItemRenameHandler::handleMissingMappings);
- }
-
///////////////////////////////////////////////////////////////////
- private static void handleMissingMappings(final RegistryEvent.MissingMappings
- event) {
- for (final RegistryEvent.MissingMappings.Mapping
- mapping : event.getAllMappings()) {
- final ResourceLocation key = mapping.key;
+ @SubscribeEvent
+ private static void handleMissingMappings(final MissingMappingsEvent event) {
+
+ for (final MissingMappingsEvent.Mapping mapping : event.getAllMappings(ResourceKey.createRegistryKey(event.getKey().location()))) {
+ final ResourceLocation key = mapping.getKey();
if (key == null || !Objects.equals(key.getNamespace(), API.MOD_ID)) {
continue;
}
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 5b7267af..17529421 100644
--- a/src/main/java/li/cil/oc2/common/item/Items.java
+++ b/src/main/java/li/cil/oc2/common/item/Items.java
@@ -2,6 +2,7 @@
package li.cil.oc2.common.item;
+import li.cil.oc2.api.API;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.block.Blocks;
import li.cil.oc2.common.bus.device.data.BlockDeviceDataRegistry;
@@ -10,6 +11,7 @@ import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
@@ -18,7 +20,7 @@ import java.util.function.Function;
import java.util.function.Supplier;
public final class Items {
- private static final DeferredRegister
- ITEMS = RegistryUtils.getInitializerFor(ForgeRegistries.ITEMS);
+ private static final DeferredRegister
- ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -82,6 +84,7 @@ public final class Items {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/item/ManualItem.java b/src/main/java/li/cil/oc2/common/item/ManualItem.java
index f10fb359..0d7aac41 100644
--- a/src/main/java/li/cil/oc2/common/item/ManualItem.java
+++ b/src/main/java/li/cil/oc2/common/item/ManualItem.java
@@ -11,6 +11,7 @@ import li.cil.oc2.client.manual.ModManualScreenStyle;
import li.cil.oc2.client.manual.ModManualStyle;
import li.cil.oc2.common.util.TooltipUtils;
import net.minecraft.network.chat.Component;
+import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
@@ -22,7 +23,7 @@ import java.util.List;
public final class ManualItem extends AbstractManualItem {
public ManualItem() {
- super(new Properties().tab(ItemGroup.COMMON));
+ super(new Item.Properties().tab(ItemGroup.COMMON));
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java b/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java
index 6247b844..20be21b8 100644
--- a/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java
+++ b/src/main/java/li/cil/oc2/common/item/NetworkCableItem.java
@@ -9,7 +9,7 @@ import li.cil.oc2.common.blockentity.NetworkConnectorBlockEntity.ConnectionResul
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@@ -70,7 +70,7 @@ public final class NetworkCableItem extends ModItem {
if (currentConnector.canConnectMore()) {
persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(currentPos));
} else {
- player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_FULL), true);
+ player.displayClientMessage(Component.translatable(Constants.CONNECTOR_ERROR_FULL), true);
}
} else {
final BlockEntity startBlockEntity = level.getBlockEntity(startPos);
@@ -92,15 +92,15 @@ public final class NetworkCableItem extends ModItem {
break;
case FAILURE_FULL:
persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos));
- player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_FULL), true);
+ player.displayClientMessage(Component.translatable(Constants.CONNECTOR_ERROR_FULL), true);
break;
case FAILURE_TOO_FAR:
persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos));
- player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_TOO_FAR), true);
+ player.displayClientMessage(Component.translatable(Constants.CONNECTOR_ERROR_TOO_FAR), true);
break;
case FAILURE_OBSTRUCTED:
persistentData.put(LINK_START_TAG_NAME, NbtUtils.writeBlockPos(startPos));
- player.displayClientMessage(new TranslatableComponent(Constants.CONNECTOR_ERROR_OBSTRUCTED), true);
+ player.displayClientMessage(Component.translatable(Constants.CONNECTOR_ERROR_OBSTRUCTED), true);
break;
}
}
diff --git a/src/main/java/li/cil/oc2/common/item/NetworkTunnelItem.java b/src/main/java/li/cil/oc2/common/item/NetworkTunnelItem.java
index 1e40939d..a71074f8 100644
--- a/src/main/java/li/cil/oc2/common/item/NetworkTunnelItem.java
+++ b/src/main/java/li/cil/oc2/common/item/NetworkTunnelItem.java
@@ -9,7 +9,7 @@ import net.minecraft.ChatFormatting;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.contents.TranslatableContents;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.StringUtil;
import net.minecraft.world.InteractionHand;
@@ -59,7 +59,7 @@ public final class NetworkTunnelItem extends ModItem {
getTunnelId(stack).ifPresent(id -> {
final String idString = StringUtil.truncateStringIfNecessary(id.toString(), 8 + 3, true);
final MutableComponent idComponent = TextFormatUtils.withFormat(idString, ChatFormatting.GREEN);
- tooltip.add(new TranslatableComponent(TUNNEL_ID_TEXT, idComponent).withStyle(ChatFormatting.GRAY));
+ tooltip.add(Component.translatable(TUNNEL_ID_TEXT, idComponent).withStyle(ChatFormatting.GRAY));
});
}
diff --git a/src/main/java/li/cil/oc2/common/item/RobotItem.java b/src/main/java/li/cil/oc2/common/item/RobotItem.java
index 4c5fdc8a..95c63a8f 100644
--- a/src/main/java/li/cil/oc2/common/item/RobotItem.java
+++ b/src/main/java/li/cil/oc2/common/item/RobotItem.java
@@ -30,7 +30,7 @@ import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.client.IItemRenderProperties;
+import net.minecraftforge.client.extensions.common.IClientItemExtensions;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import javax.annotation.Nullable;
@@ -42,12 +42,6 @@ import static li.cil.oc2.common.util.NBTUtils.makeInventoryTag;
import static li.cil.oc2.common.util.RegistryUtils.key;
public final class RobotItem extends ModItem {
- @Override
- public void fillItemCategory(final CreativeModeTab tab, final NonNullList items) {
- if (allowdedIn(tab)) {
- items.add(getRobotWithFlash());
- }
- }
@Override
public void appendHoverText(final ItemStack stack, @Nullable final Level level, final List tooltip, final TooltipFlag flag) {
@@ -116,18 +110,6 @@ public final class RobotItem extends ModItem {
///////////////////////////////////////////////////////////////////
- @Override
- public void initializeClient(final Consumer consumer) {
- consumer.accept(new IItemRenderProperties() {
- @Override
- public BlockEntityWithoutLevelRenderer getItemStackRenderer() {
- return new RobotWithoutLevelRenderer(Minecraft.getInstance().getBlockEntityRenderDispatcher(), Minecraft.getInstance().getEntityModels());
- }
- });
- }
-
- ///////////////////////////////////////////////////////////////////
-
private ItemStack getRobotWithFlash() {
final ItemStack robot = new ItemStack(this);
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 dea33c15..989a5f00 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
@@ -2,14 +2,16 @@
package li.cil.oc2.common.item.crafting;
+import li.cil.oc2.api.API;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraft.world.item.crafting.RecipeSerializer;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public final class RecipeSerializers {
- private static final DeferredRegister> RECIPE_SERIALIZERS = RegistryUtils.getInitializerFor(ForgeRegistries.RECIPE_SERIALIZERS);
+ private static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -18,5 +20,6 @@ public final class RecipeSerializers {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ RECIPE_SERIALIZERS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
}
diff --git a/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java b/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java
index e4534c01..3df3169c 100644
--- a/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java
+++ b/src/main/java/li/cil/oc2/common/item/crafting/WrenchRecipe.java
@@ -11,7 +11,7 @@ import net.minecraft.world.inventory.CraftingContainer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.ShapelessRecipe;
-import net.minecraftforge.registries.ForgeRegistryEntry;
+import net.minecraftforge.common.capabilities.Capability;
import org.jetbrains.annotations.Nullable;
public final class WrenchRecipe extends ShapelessRecipe {
@@ -25,8 +25,8 @@ public final class WrenchRecipe extends ShapelessRecipe {
for (int slot = 0; slot < inventory.getContainerSize(); slot++) {
final ItemStack stack = inventory.getItem(slot);
- if (stack.hasContainerItem()) {
- result.set(slot, stack.getContainerItem());
+ if (stack.hasCraftingRemainingItem()) {
+ result.set(slot, stack.getCraftingRemainingItem());
} else if (Wrenches.isWrench(stack)) {
final ItemStack copy = stack.copy();
copy.setCount(1);
@@ -42,7 +42,7 @@ public final class WrenchRecipe extends ShapelessRecipe {
return Serializer.INSTANCE;
}
- public static final class Serializer extends ForgeRegistryEntry> implements RecipeSerializer {
+ public static final class Serializer implements RecipeSerializer {
public static final Serializer INSTANCE = new Serializer();
@Override
diff --git a/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java b/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java
index e559a918..2b03b5e5 100644
--- a/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java
+++ b/src/main/java/li/cil/oc2/common/network/message/RequestImportedFileMessage.java
@@ -8,7 +8,7 @@ import li.cil.oc2.common.network.Network;
import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.TextColor;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.MutableComponent;
import net.minecraftforge.network.NetworkEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -21,7 +21,7 @@ import static li.cil.oc2.common.util.TranslationUtils.text;
public final class RequestImportedFileMessage extends AbstractMessage {
private static final Logger LOGGER = LogManager.getLogger();
- private static final TranslatableComponent FILE_TOO_LARGE_TEXT = text("message.{mod}.import_file.file_too_large");
+ private static final MutableComponent FILE_TOO_LARGE_TEXT = text("message.{mod}.import_file.file_too_large");
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/util/ChainableVertexConsumer.java b/src/main/java/li/cil/oc2/common/util/ChainableVertexConsumer.java
index 79197360..3383af12 100644
--- a/src/main/java/li/cil/oc2/common/util/ChainableVertexConsumer.java
+++ b/src/main/java/li/cil/oc2/common/util/ChainableVertexConsumer.java
@@ -123,16 +123,6 @@ public record ChainableVertexConsumer(VertexConsumer inner) implements VertexCon
return this;
}
- @Override
- public void putBulkData(final PoseStack.Pose matrixStack, final BakedQuad bakedQuad, final float red, final float green, final float blue, final int lightmapCoord, final int overlayColor, final boolean readExistingColor) {
- inner.putBulkData(matrixStack, bakedQuad, red, green, blue, lightmapCoord, overlayColor, readExistingColor);
- }
-
- @Override
- public void putBulkData(final PoseStack.Pose matrixEntry, final BakedQuad bakedQuad, final float red, final float green, final float blue, final float alpha, final int lightmapCoord, final int overlayColor) {
- inner.putBulkData(matrixEntry, bakedQuad, red, green, blue, alpha, lightmapCoord, overlayColor);
- }
-
@Override
public void putBulkData(final PoseStack.Pose matrixEntry, final BakedQuad bakedQuad, final float red, final float green, final float blue, final float alpha, final int lightmapCoord, final int overlayColor, final boolean readExistingColor) {
inner.putBulkData(matrixEntry, bakedQuad, red, green, blue, alpha, lightmapCoord, overlayColor, readExistingColor);
diff --git a/src/main/java/li/cil/oc2/common/util/ChunkUtils.java b/src/main/java/li/cil/oc2/common/util/ChunkUtils.java
index da0ee155..9b8430ca 100644
--- a/src/main/java/li/cil/oc2/common/util/ChunkUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/ChunkUtils.java
@@ -9,7 +9,7 @@ import net.minecraft.core.SectionPos;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.chunk.ChunkAccess;
-import net.minecraftforge.event.world.ChunkEvent;
+import net.minecraftforge.event.level.ChunkEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
diff --git a/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java b/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java
index 915ad548..ba3a6807 100644
--- a/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/ItemStackUtils.java
@@ -5,6 +5,7 @@ package li.cil.oc2.common.util;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
+import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
@@ -51,7 +52,7 @@ public final class ItemStackUtils {
return Optional.empty();
}
- final Random rng = level.random;
+ final RandomSource rng = level.random;
final float tx = 0.5f * (rng.nextFloat() - 1.0f);
final float ty = 0.5f * (rng.nextFloat() - 1.0f);
@@ -80,7 +81,7 @@ public final class ItemStackUtils {
return Optional.empty();
}
- final Random rng = level.random;
+ final RandomSource rng = level.random;
final float ox = direction.getStepX();
final float oy = direction.getStepY();
diff --git a/src/main/java/li/cil/oc2/common/util/LevelUtils.java b/src/main/java/li/cil/oc2/common/util/LevelUtils.java
index 4d3395fa..c47ae008 100644
--- a/src/main/java/li/cil/oc2/common/util/LevelUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/LevelUtils.java
@@ -11,6 +11,7 @@ import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nullable;
import java.util.function.Function;
@@ -35,7 +36,7 @@ public final class LevelUtils {
final BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity != null) {
- final ResourceLocation registryName = blockEntity.getType().getRegistryName();
+ final ResourceLocation registryName = ForgeRegistries.BLOCK_ENTITY_TYPES.getKey(blockEntity.getType());
if (registryName != null) {
return registryName.toString();
}
@@ -43,7 +44,7 @@ public final class LevelUtils {
final Block block = level.getBlockState(pos).getBlock();
{
- final ResourceLocation registryName = block.getRegistryName();
+ final ResourceLocation registryName = ForgeRegistries.BLOCKS.getKey(block);
if (registryName != null) {
return registryName.toString();
}
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 f0589f1f..12c32c56 100644
--- a/src/main/java/li/cil/oc2/common/util/RegistryUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/RegistryUtils.java
@@ -3,13 +3,17 @@
package li.cil.oc2.common.util;
import li.cil.oc2.api.API;
+import li.cil.oc2.api.bus.device.DeviceType;
+import li.cil.oc2.api.bus.device.provider.BlockDeviceProvider;
+import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider;
+import li.cil.oc2.common.bus.device.provider.ProviderRegistry;
+import li.cil.oc2.common.bus.device.util.BlockDeviceInfo;
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;
import net.minecraftforge.registries.IForgeRegistry;
-import net.minecraftforge.registries.IForgeRegistryEntry;
import javax.annotation.Nullable;
import java.util.ArrayList;
@@ -27,7 +31,7 @@ public abstract class RegistryUtils {
private static final List> ENTRIES = new ArrayList<>();
private static Phase phase = Phase.PRE_INIT;
- public static > DeferredRegister getInitializerFor(final ResourceKey> key) {
+ public static > DeferredRegister getInitializerFor(final ResourceKey> key) {
if (phase != Phase.INIT) throw new IllegalStateException();
final DeferredRegister entry = DeferredRegister.create(key, API.MOD_ID);
@@ -35,7 +39,7 @@ public abstract class RegistryUtils {
return entry;
}
- public static > DeferredRegister getInitializerFor(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);
@@ -59,21 +63,26 @@ public abstract class RegistryUtils {
ENTRIES.clear();
}
- public static String key(final IForgeRegistryEntry registryEntry) {
- return Objects.requireNonNull(registryEntry.getRegistryName()).toString();
+ public static String key(final DeviceType registryEntry) {
+ return Objects.requireNonNull(registryEntry.getName()).toString();
}
- public static Optional optionalKey(@Nullable final IForgeRegistryEntry registryEntry) {
- if (registryEntry == null) {
+ public static Optional optionalKey(@Nullable final T registryEntry) {
+ if(registryEntry == null) {
+ return Optional.empty();
+ }
+ String providerName = null;
+ if (registryEntry.getClass() == BlockDeviceProvider.class) {
+ providerName = ProviderRegistry.BLOCK_DEVICE_PROVIDER_REGISTRY.get().getKey((BlockDeviceProvider) registryEntry).toString();
+ } else if (registryEntry.getClass() == ItemDeviceProvider.class) {
+ providerName = ProviderRegistry.ITEM_DEVICE_PROVIDER_REGISTRY.get().getKey((ItemDeviceProvider) registryEntry).toString();
+ }
+
+ if(providerName == null) {
return Optional.empty();
}
- final ResourceLocation providerName = registryEntry.getRegistryName();
- if (providerName == null) {
- return Optional.empty();
- }
-
- return Optional.of(providerName.toString());
+ return Optional.of(providerName);
}
private RegistryUtils() {
diff --git a/src/main/java/li/cil/oc2/common/util/ServerScheduler.java b/src/main/java/li/cil/oc2/common/util/ServerScheduler.java
index 21ff0fd4..ade3a86b 100644
--- a/src/main/java/li/cil/oc2/common/util/ServerScheduler.java
+++ b/src/main/java/li/cil/oc2/common/util/ServerScheduler.java
@@ -7,8 +7,8 @@ import net.minecraft.world.level.LevelAccessor;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.server.ServerStoppedEvent;
-import net.minecraftforge.event.world.ChunkEvent;
-import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.event.level.ChunkEvent;
+import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import javax.annotation.Nullable;
@@ -126,8 +126,8 @@ public final class ServerScheduler {
}
@SubscribeEvent
- public static void handleLevelUnload(final WorldEvent.Unload event) {
- final LevelAccessor level = event.getWorld();
+ public static void handleLevelUnload(final LevelEvent.Unload event) {
+ final LevelAccessor level = event.getLevel();
levelTickSchedulers.remove(level);
chunkLoadSchedulers.remove(level);
@@ -141,7 +141,7 @@ public final class ServerScheduler {
@SubscribeEvent
public static void handleChunkLoad(final ChunkEvent.Load event) {
- final HashMap chunkMap = chunkLoadSchedulers.get(event.getWorld());
+ final HashMap chunkMap = chunkLoadSchedulers.get(event.getLevel());
if (chunkMap == null) {
return;
}
@@ -154,7 +154,7 @@ public final class ServerScheduler {
@SubscribeEvent
public static void handleChunkUnload(final ChunkEvent.Unload event) {
- final HashMap chunkMap = chunkUnloadSchedulers.get(event.getWorld());
+ final HashMap chunkMap = chunkUnloadSchedulers.get(event.getLevel());
if (chunkMap == null) {
return;
}
@@ -177,14 +177,14 @@ public final class ServerScheduler {
}
@SubscribeEvent
- public static void handleLevelTick(final TickEvent.WorldTickEvent event) {
+ public static void handleLevelTick(final TickEvent.LevelTickEvent event) {
if (event.phase != TickEvent.Phase.START) {
return;
}
globalTickScheduler.processQueue();
- final TickScheduler scheduler = levelTickSchedulers.get(event.world);
+ final TickScheduler scheduler = levelTickSchedulers.get(event.level);
if (scheduler != null) {
scheduler.processQueue();
}
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 b13baedf..7e3c1e02 100644
--- a/src/main/java/li/cil/oc2/common/util/SoundEvents.java
+++ b/src/main/java/li/cil/oc2/common/util/SoundEvents.java
@@ -5,12 +5,13 @@ package li.cil.oc2.common.util;
import li.cil.oc2.api.API;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public final class SoundEvents {
- private static final DeferredRegister SOUNDS = RegistryUtils.getInitializerFor(ForgeRegistries.SOUND_EVENTS);
+ private static final DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, API.MOD_ID);
///////////////////////////////////////////////////////////////////
@@ -23,6 +24,7 @@ public final class SoundEvents {
///////////////////////////////////////////////////////////////////
public static void initialize() {
+ SOUNDS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/util/TextFormatUtils.java b/src/main/java/li/cil/oc2/common/util/TextFormatUtils.java
index 7aa48e1d..350a3a6e 100644
--- a/src/main/java/li/cil/oc2/common/util/TextFormatUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/TextFormatUtils.java
@@ -6,7 +6,6 @@ import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextColor;
-import net.minecraft.network.chat.TextComponent;
public final class TextFormatUtils {
private static final int SIZE_STEP = 1024;
@@ -22,7 +21,7 @@ public final class TextFormatUtils {
}
public static MutableComponent withFormat(final String value, final ChatFormatting formatting) {
- return withFormat(new TextComponent(value), formatting);
+ return withFormat(Component.literal(value), formatting);
}
public static MutableComponent withFormat(final MutableComponent text, final ChatFormatting formatting) {
@@ -30,6 +29,6 @@ public final class TextFormatUtils {
}
public static Component withFormat(final Component text, final ChatFormatting formatting) {
- return new TextComponent("").withStyle(formatting).append(text);
+ return Component.literal("").withStyle(formatting).append(text);
}
}
diff --git a/src/main/java/li/cil/oc2/common/util/ThrottledSoundEmitter.java b/src/main/java/li/cil/oc2/common/util/ThrottledSoundEmitter.java
index c9702c08..ad8b755b 100644
--- a/src/main/java/li/cil/oc2/common/util/ThrottledSoundEmitter.java
+++ b/src/main/java/li/cil/oc2/common/util/ThrottledSoundEmitter.java
@@ -5,6 +5,7 @@ package li.cil.oc2.common.util;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
+import net.minecraft.util.RandomSource;
import java.time.Duration;
import java.util.Optional;
@@ -78,11 +79,11 @@ public final class ThrottledSoundEmitter {
///////////////////////////////////////////////////////////////////
- private float sampleVolume(final Random random) {
+ private float sampleVolume(final RandomSource random) {
return Mth.clamp(volume + volumeVariance * (random.nextFloat() - 0.5f), 0, 1);
}
- private float samplePitch(final Random random) {
+ private float samplePitch(final RandomSource random) {
return Mth.clamp(pitch + pitchVariance * (random.nextFloat() - 0.5f), 0, 1);
}
}
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 3a089322..6d3b70a6 100644
--- a/src/main/java/li/cil/oc2/common/util/TooltipUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/TooltipUtils.java
@@ -36,7 +36,7 @@ import static li.cil.oc2.common.util.TextFormatUtils.withFormat;
public final class TooltipUtils {
private static final MutableComponent DEVICE_NEEDS_REBOOT =
- new TranslatableComponent(Constants.TOOLTIP_DEVICE_NEEDS_REBOOT)
+ Component.translatable(Constants.TOOLTIP_DEVICE_NEEDS_REBOOT)
.withStyle(s -> s.withColor(TextColor.fromLegacyFormat(ChatFormatting.YELLOW)));
private static final ThreadLocal
> ITEM_STACKS = ThreadLocal.withInitial(ArrayList::new);
@@ -82,7 +82,7 @@ public final class TooltipUtils {
final String translationKey = stack.getDescriptionId() + Constants.TOOLTIP_DESCRIPTION_SUFFIX;
final Language language = Language.getInstance();
if (language.has(translationKey)) {
- final TranslatableComponent description = new TranslatableComponent(translationKey);
+ final MutableComponent description = Component.translatable(translationKey);
tooltip.add(withFormat(description, ChatFormatting.GRAY));
}
@@ -101,7 +101,7 @@ public final class TooltipUtils {
if (energyConsumption > 0) {
final MutableComponent energy = withFormat(String.valueOf(energyConsumption), ChatFormatting.GREEN);
- tooltip.add(withFormat(new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION, energy), ChatFormatting.GRAY));
+ tooltip.add(withFormat(Component.translatable(Constants.TOOLTIP_ENERGY_CONSUMPTION, energy), ChatFormatting.GRAY));
}
}
@@ -133,10 +133,10 @@ public final class TooltipUtils {
for (int i = 0; i < itemStacks.size(); i++) {
final ItemStack itemStack = itemStacks.get(i);
- tooltip.add(new TextComponent("- ")
+ tooltip.add(Component.literal("- ")
.append(itemStack.getDisplayName())
.withStyle(style -> style.withColor(TextColor.fromLegacyFormat(ChatFormatting.GRAY)))
- .append(new TextComponent(" x")
+ .append(Component.literal(" x")
.append(String.valueOf(itemStackSizes.getInt(i)))
.withStyle(style -> style.withColor(TextColor.fromLegacyFormat(ChatFormatting.DARK_GRAY))))
);
@@ -150,13 +150,13 @@ public final class TooltipUtils {
}
final MutableComponent value = withFormat(energy.getEnergyStored() + "/" + energy.getMaxEnergyStored(), ChatFormatting.GREEN);
- tooltip.add(withFormat(new TranslatableComponent(Constants.TOOLTIP_ENERGY, value), ChatFormatting.GRAY));
+ tooltip.add(withFormat(Component.translatable(Constants.TOOLTIP_ENERGY, value), ChatFormatting.GRAY));
});
}
public static void addEnergyConsumption(final double value, final List tooltip) {
if (value > 0) {
- tooltip.add(withFormat(new TranslatableComponent(Constants.TOOLTIP_ENERGY_CONSUMPTION, withFormat(new DecimalFormat("#.##").format(value), ChatFormatting.GREEN)), ChatFormatting.GRAY));
+ tooltip.add(withFormat(Component.translatable(Constants.TOOLTIP_ENERGY_CONSUMPTION, withFormat(new DecimalFormat("#.##").format(value), ChatFormatting.GREEN)), ChatFormatting.GRAY));
}
}
diff --git a/src/main/java/li/cil/oc2/common/util/TranslationUtils.java b/src/main/java/li/cil/oc2/common/util/TranslationUtils.java
index 1191c97f..d2816471 100644
--- a/src/main/java/li/cil/oc2/common/util/TranslationUtils.java
+++ b/src/main/java/li/cil/oc2/common/util/TranslationUtils.java
@@ -3,15 +3,16 @@
package li.cil.oc2.common.util;
import li.cil.oc2.api.API;
-import net.minecraft.network.chat.TranslatableComponent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.MutableComponent;
public final class TranslationUtils {
public static String key(final String pattern) {
return pattern.replaceAll("\\{mod}", API.MOD_ID);
}
- public static TranslatableComponent text(final String pattern) {
- return new TranslatableComponent(key(pattern));
+ public static MutableComponent text(final String pattern) {
+ return Component.translatable(key(pattern));
}
private TranslationUtils() {
diff --git a/src/main/java/li/cil/oc2/common/vm/AbstractVMItemStackHandlers.java b/src/main/java/li/cil/oc2/common/vm/AbstractVMItemStackHandlers.java
index 4ec36ff7..0e1a5078 100644
--- a/src/main/java/li/cil/oc2/common/vm/AbstractVMItemStackHandlers.java
+++ b/src/main/java/li/cil/oc2/common/vm/AbstractVMItemStackHandlers.java
@@ -105,7 +105,7 @@ public abstract class AbstractVMItemStackHandlers implements VMItemStackHandlers
public void saveItems(final CompoundTag tag) {
itemHandlers.forEach((deviceType, handler) -> {
if (!handler.isEmpty()) {
- tag.put(key(deviceType), handler.saveItems());
+ tag.put(deviceType.getName().toString(), handler.saveItems());
}
});
}
@@ -118,12 +118,12 @@ public abstract class AbstractVMItemStackHandlers implements VMItemStackHandlers
public void loadItems(final CompoundTag tag) {
itemHandlers.forEach((deviceType, handler) ->
- handler.loadItems(tag.getCompound(key(deviceType))));
+ handler.loadItems(tag.getCompound(deviceType.getName().toString())));
}
public void saveDevices(final CompoundTag tag) {
itemHandlers.forEach((deviceType, handler) ->
- tag.put(key(deviceType), handler.saveDevices()));
+ tag.put(deviceType.getName().toString(), handler.saveDevices()));
}
public CompoundTag saveDevices() {
@@ -134,7 +134,7 @@ public abstract class AbstractVMItemStackHandlers implements VMItemStackHandlers
public void loadDevices(final CompoundTag tag) {
itemHandlers.forEach((deviceType, handler) ->
- handler.loadDevices(tag.getCompound(key(deviceType))));
+ handler.loadDevices(tag.getCompound(deviceType.getName().toString())));
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java b/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java
index fc649a81..9faca5fd 100644
--- a/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java
+++ b/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java
@@ -17,7 +17,6 @@ import li.cil.sedna.api.memory.MemoryAccessException;
import li.cil.sedna.riscv.R5Board;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TranslatableComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.apache.logging.log4j.LogManager;
@@ -141,11 +140,11 @@ public abstract class AbstractVirtualMachine implements VirtualMachine {
switch (busState) {
case SCAN_PENDING:
case INCOMPLETE:
- return new TranslatableComponent(Constants.COMPUTER_BUS_STATE_INCOMPLETE);
+ return Component.translatable(Constants.COMPUTER_BUS_STATE_INCOMPLETE);
case TOO_COMPLEX:
- return new TranslatableComponent(Constants.COMPUTER_BUS_STATE_TOO_COMPLEX);
+ return Component.translatable(Constants.COMPUTER_BUS_STATE_TOO_COMPLEX);
case MULTIPLE_CONTROLLERS:
- return new TranslatableComponent(Constants.COMPUTER_BUS_STATE_MULTIPLE_CONTROLLERS);
+ return Component.translatable(Constants.COMPUTER_BUS_STATE_MULTIPLE_CONTROLLERS);
case READY:
switch (runState) {
case STOPPED:
@@ -283,12 +282,12 @@ public abstract class AbstractVirtualMachine implements VirtualMachine {
if (!consumeEnergy(busController.getEnergyConsumption(), true)) {
// Don't even start running if we couldn't keep running.
- error(new TranslatableComponent(Constants.COMPUTER_ERROR_NOT_ENOUGH_ENERGY));
+ error(Component.translatable(Constants.COMPUTER_ERROR_NOT_ENOUGH_ENERGY));
return;
}
if (busController.getDevices().stream().noneMatch(device -> device instanceof FirmwareLoader)) {
- error(new TranslatableComponent(Constants.COMPUTER_ERROR_MISSING_FIRMWARE));
+ error(Component.translatable(Constants.COMPUTER_ERROR_MISSING_FIRMWARE));
return;
}
@@ -299,7 +298,7 @@ public abstract class AbstractVirtualMachine implements VirtualMachine {
if (loadResult.getErrorMessage() != null) {
error(loadResult.getErrorMessage(), false);
} else {
- error(new TranslatableComponent(Constants.COMPUTER_ERROR_UNKNOWN), false);
+ error(Component.translatable(Constants.COMPUTER_ERROR_UNKNOWN), false);
}
loadDevicesDelay = DEVICE_LOAD_RETRY_INTERVAL;
return;
@@ -317,11 +316,11 @@ public abstract class AbstractVirtualMachine implements VirtualMachine {
// a program that only uses registers. But not supporting that esoteric
// use-case loses out against avoiding people getting confused for having
// forgotten to add some RAM modules.
- error(new TranslatableComponent(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
+ error(Component.translatable(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
return;
} catch (final MemoryAccessException e) {
LOGGER.error(e);
- error(new TranslatableComponent(Constants.COMPUTER_ERROR_UNKNOWN));
+ error(Component.translatable(Constants.COMPUTER_ERROR_UNKNOWN));
return;
}
@@ -349,7 +348,7 @@ public abstract class AbstractVirtualMachine implements VirtualMachine {
}
if (!consumeEnergy(busController.getEnergyConsumption(), false)) {
- error(new TranslatableComponent(Constants.COMPUTER_ERROR_NOT_ENOUGH_ENERGY));
+ error(Component.translatable(Constants.COMPUTER_ERROR_NOT_ENOUGH_ENERGY));
return;
}
diff --git a/src/main/java/li/cil/oc2/common/vm/Terminal.java b/src/main/java/li/cil/oc2/common/vm/Terminal.java
index 2745857b..805d254c 100644
--- a/src/main/java/li/cil/oc2/common/vm/Terminal.java
+++ b/src/main/java/li/cil/oc2/common/vm/Terminal.java
@@ -791,13 +791,15 @@ public final class Terminal {
renderBackground(matrix, builder, row);
renderForeground(matrix, builder, row);
- builder.end();
+ BufferBuilder.RenderedBuffer rb = builder.end();
if (lines[row] == null) {
lines[row] = new VertexBuffer();
}
- lines[row].upload(builder);
+
+
+ lines[row].upload(rb);
}
}
@@ -910,6 +912,7 @@ public final class Terminal {
}
private void renderCursor(final PoseStack stack) {
+ BufferUploader.reset();
if (terminal.x < 0 || terminal.x >= WIDTH || terminal.y < 0 || terminal.y >= HEIGHT) {
return;
}
@@ -934,8 +937,8 @@ public final class Terminal {
buffer.vertex(matrix, CHAR_WIDTH, 0, 0).color(r, g, b, 1).endVertex();
buffer.vertex(matrix, 0, 0, 0).color(r, g, b, 1).endVertex();
- buffer.end();
- BufferUploader.end(buffer);
+ BufferBuilder.RenderedBuffer rb = buffer.end();
+ BufferUploader.draw(rb);
stack.popPose();
diff --git a/src/main/java/li/cil/oc2/common/vm/VMRunner.java b/src/main/java/li/cil/oc2/common/vm/VMRunner.java
index 99cddfd0..e81da735 100644
--- a/src/main/java/li/cil/oc2/common/vm/VMRunner.java
+++ b/src/main/java/li/cil/oc2/common/vm/VMRunner.java
@@ -12,7 +12,6 @@ import li.cil.oc2.common.bus.RPCDeviceBusAdapter;
import li.cil.oc2.common.vm.context.global.GlobalVMContext;
import li.cil.sedna.riscv.R5Board;
import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TranslatableComponent;
import javax.annotation.Nullable;
import java.util.concurrent.ExecutionException;
@@ -131,7 +130,7 @@ public class VMRunner implements Runnable {
context.postEvent(new VMInitializingEvent(board.getDefaultProgramStart()));
} catch (final VMInitializationException e) {
board.setRunning(false);
- runtimeError = e.getErrorMessage().orElse(new TranslatableComponent(Constants.COMPUTER_ERROR_UNKNOWN));
+ runtimeError = e.getErrorMessage().orElse(Component.translatable(Constants.COMPUTER_ERROR_UNKNOWN));
return;
}
}
diff --git a/src/main/java/li/cil/oc2/data/DataGenerators.java b/src/main/java/li/cil/oc2/data/DataGenerators.java
index 7df13d76..4a6d7681 100644
--- a/src/main/java/li/cil/oc2/data/DataGenerators.java
+++ b/src/main/java/li/cil/oc2/data/DataGenerators.java
@@ -5,9 +5,9 @@ package li.cil.oc2.data;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.tags.BlockTagsProvider;
import net.minecraftforge.common.data.ExistingFileHelper;
+import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
-import net.minecraftforge.forge.event.lifecycle.GatherDataEvent;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public final class DataGenerators {
@@ -17,15 +17,15 @@ public final class DataGenerators {
final ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
if (event.includeServer()) {
- generator.addProvider(new ModLootTableProvider(generator));
+ generator.addProvider(true, new ModLootTableProvider(generator));
final BlockTagsProvider blockTagProvider = new ModBlockTagsProvider(generator, existingFileHelper);
- generator.addProvider(blockTagProvider);
- generator.addProvider(new ModItemTagsProvider(generator, blockTagProvider, existingFileHelper));
- generator.addProvider(new ModRecipesProvider(generator));
+ generator.addProvider(true, blockTagProvider);
+ generator.addProvider(true, new ModItemTagsProvider(generator, blockTagProvider, existingFileHelper));
+ generator.addProvider(true, new ModRecipesProvider(generator));
}
if (event.includeClient()) {
- generator.addProvider(new ModBlockStateProvider(generator, existingFileHelper));
- generator.addProvider(new ModItemModelProvider(generator, existingFileHelper));
+ generator.addProvider(true, new ModBlockStateProvider(generator, existingFileHelper));
+ generator.addProvider(true, new ModItemModelProvider(generator, existingFileHelper));
}
}
}
diff --git a/src/main/java/li/cil/oc2/data/ModLootTableProvider.java b/src/main/java/li/cil/oc2/data/ModLootTableProvider.java
index 31c7ebac..d9e6f7bb 100644
--- a/src/main/java/li/cil/oc2/data/ModLootTableProvider.java
+++ b/src/main/java/li/cil/oc2/data/ModLootTableProvider.java
@@ -20,6 +20,8 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
+import net.minecraftforge.registries.ForgeRegistries;
+import net.minecraftforge.registries.ForgeRegistry;
import java.util.List;
import java.util.Map;
@@ -64,7 +66,7 @@ public final class ModLootTableProvider extends LootTableProvider {
@Override
protected Iterable getKnownBlocks() {
return StreamSupport.stream(super.getKnownBlocks().spliterator(), false)
- .filter(block -> requireNonNull(block.getRegistryName()).getNamespace().equals(API.MOD_ID))
+ .filter(block -> requireNonNull(ForgeRegistries.BLOCKS.getKey(block)).getNamespace().equals(API.MOD_ID))
.filter(block -> block != Blocks.BUS_CABLE.get()) // All bus drops depend on block state.
.collect(Collectors.toList());
}
diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml
index 95c997ed..9c313062 100644
--- a/src/main/resources/META-INF/mods.toml
+++ b/src/main/resources/META-INF/mods.toml
@@ -23,7 +23,7 @@ side = "BOTH"
[[dependencies.oc2]]
modId = "minecraft"
mandatory = true
-versionRange = "[1.18.2,1.19)"
+versionRange = "1.19.2"
ordering = "NONE"
side = "BOTH"
[[dependencies.oc2]]
diff --git a/src/test/java/li/cil/oc2/common/bus/AbstractTestMethod.java b/src/test/java/li/cil/oc2/common/bus/AbstractTestMethod.java
deleted file mode 100644
index 81a5795a..00000000
--- a/src/test/java/li/cil/oc2/common/bus/AbstractTestMethod.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package li.cil.oc2.common.bus;
-
-import li.cil.oc2.api.bus.device.rpc.AbstractRPCMethod;
-import li.cil.oc2.api.bus.device.rpc.RPCParameter;
-
-import javax.annotation.Nullable;
-import java.util.Optional;
-
-abstract class AbstractTestMethod extends AbstractRPCMethod {
- protected AbstractTestMethod(final Class> returnType, final Class>... parameterTypes) {
- super("", returnType, wrapParameters(parameterTypes));
- }
-
- @Override
- public String getName() {
- return getClass().getSimpleName();
- }
-
- @Override
- public boolean isSynchronized() {
- return false;
- }
-
- private static RPCParameter[] wrapParameters(final Class>... parameterTypes) {
- final RPCParameter[] parameters = new RPCParameter[parameterTypes.length];
- for (int i = 0; i < parameterTypes.length; i++) {
- parameters[i] = new TestParameter("arg" + i, parameterTypes[i]);
- }
- return parameters;
- }
-
- private static final class TestParameter implements RPCParameter {
- @Nullable private final String name;
- private final Class> type;
-
- public TestParameter(@Nullable final String name, final Class> type) {
- this.name = name;
- this.type = type;
- }
-
- @Override
- public Optional getName() {
- return Optional.ofNullable(name);
- }
-
- @Override
- public Class> getType() {
- return type;
- }
- }
-}
diff --git a/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java b/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java
deleted file mode 100644
index 7bbde896..00000000
--- a/src/test/java/li/cil/oc2/common/bus/BlockDeviceBusControllerTests.java
+++ /dev/null
@@ -1,735 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-
-package li.cil.oc2.common.bus;
-
-import li.cil.oc2.api.API;
-import li.cil.oc2.api.bus.DeviceBusElement;
-import li.cil.oc2.api.bus.device.Device;
-import li.cil.oc2.api.bus.device.ItemDevice;
-import li.cil.oc2.api.bus.device.object.Callback;
-import li.cil.oc2.api.bus.device.object.ObjectDevice;
-import li.cil.oc2.api.bus.device.provider.BlockDeviceProvider;
-import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery;
-import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider;
-import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
-import li.cil.oc2.api.util.Invalidatable;
-import li.cil.oc2.common.Constants;
-import li.cil.oc2.common.bus.device.provider.Providers;
-import li.cil.oc2.common.capabilities.Capabilities;
-import li.cil.oc2.common.util.LevelUtils;
-import li.cil.sedna.api.device.serial.SerialDevice;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.LevelAccessor;
-import net.minecraft.world.level.block.entity.BlockEntity;
-import net.minecraftforge.common.capabilities.Capability;
-import net.minecraftforge.common.util.LazyOptional;
-import net.minecraftforge.registries.IForgeRegistry;
-import org.jetbrains.annotations.Nullable;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.MockedStatic;
-import org.mockito.stubbing.OngoingStubbing;
-
-import java.util.*;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.*;
-
-public class BlockDeviceBusControllerTests {
- public static final ResourceLocation TEST_PROVIDER_REGISTRY_NAME = new ResourceLocation(API.MOD_ID, "test");
-
- private static MockedStatic capabilitiesMock;
- private static MockedStatic providersMock;
- private static MockedStatic levelUtilsMock;
-
- private FakeLevel fakeLevel;
- private LevelAccessor level;
-
- ///////////////////////////////////////////////////////////////////
-
- @SuppressWarnings("ResultOfMethodCallIgnored")
- @BeforeEach
- public void setupEach() {
- capabilitiesMock = mockStatic(Capabilities.class);
- registerCapability(capabilitiesMock.when(Capabilities::energyStorage));
- registerCapability(capabilitiesMock.when(Capabilities::fluidHandler));
- registerCapability(capabilitiesMock.when(Capabilities::itemHandler));
- registerCapability(capabilitiesMock.when(Capabilities::deviceBusElement));
- registerCapability(capabilitiesMock.when(Capabilities::device));
- registerCapability(capabilitiesMock.when(Capabilities::redstoneEmitter));
- registerCapability(capabilitiesMock.when(Capabilities::networkInterface));
- registerCapability(capabilitiesMock.when(Capabilities::terminalUserProvider));
- registerCapability(capabilitiesMock.when(Capabilities::robot));
-
- providersMock = mockStatic(Providers.class);
- final IForgeRegistry blockDeviceProviderRegistry = createBlockDeviceProviderRegistry();
- providersMock.when(Providers::blockDeviceProviderRegistry).thenReturn(blockDeviceProviderRegistry);
- final IForgeRegistry itemDeviceProviderRegistry = createItemDeviceProviderRegistry();
- providersMock.when(Providers::itemDeviceProviderRegistry).thenReturn(itemDeviceProviderRegistry);
-
- levelUtilsMock = mockStatic(LevelUtils.class);
- levelUtilsMock.when(() -> LevelUtils.getBlockName(any(), any())).thenReturn("test_block");
-
- fakeLevel = new FakeLevel();
- level = fakeLevel.getLevel();
- }
-
- @SuppressWarnings("unchecked")
- private static void registerCapability(final OngoingStubbing> stubbing) {
- final Capability capability = mock(Capability.class);
- stubbing.thenReturn(capability);
- }
-
- @AfterEach
- public void teardownEach() {
- capabilitiesMock.close();
- providersMock.close();
- levelUtilsMock.close();
- }
-
- @Test
- public void busTouchingUnloadedChunkStaysIncomplete() {
- final BlockPos posAtChunkEdge = new BlockPos(0, 0, 0);
- final BlockDeviceBusController busController = new TestBusControllerBlockEntity(posAtChunkEdge).getBusController();
-
- busController.scan();
-
- assertEquals(CommonDeviceBusController.BusState.INCOMPLETE, busController.getState());
- }
-
- @Test
- public void busNotTouchingUnloadedChunkCompletes() {
- final BlockPos posInsideChunk = new BlockPos(8, 0, 8);
- final BlockDeviceBusController busController = new TestBusControllerBlockEntity(posInsideChunk).getBusController();
-
- busController.scan();
-
- assertEquals(CommonDeviceBusController.BusState.READY, busController.getState());
- }
-
- @Test
- public void busControllerIgnoresNonAccessibleBusElements() {
- final BlockPos controllerPos = new BlockPos(8, 0, 8);
- final TestBusControllerBlockEntity busController = new TestBusControllerBlockEntity(controllerPos);
-
- final BlockPos elementPos = controllerPos.east();
- final TestBusElementBlockEntity busElement = new TestBusElementBlockEntity(elementPos);
- busElement.setSideEnabled(Direction.WEST, false);
-
- busController.getBusController().scan();
-
- assertEquals(CommonDeviceBusController.BusState.READY, busController.getBusController().getState());
-
- assertFalse(busElement.getBusElement().getControllers().contains(busController.getBusController()));
- assertFalse(busController.getBusController().getElements().contains(busElement.getBusElement()));
- }
-
- @Test
- public void busControllerDetectsBusElements() {
- final BlockPos controllerPos = new BlockPos(8, 0, 8);
- final BlockDeviceBusController busController = new TestBusControllerBlockEntity(controllerPos).getBusController();
-
- final BlockPos elementPos = controllerPos.east();
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
- final DeviceBusElement busElement = busElementInfo.getBusElement();
-
- busController.scan();
-
- assertTrue(busElement.getControllers().contains(busController));
- assertTrue(busController.getElements().contains(busElement));
- }
-
- @Test
- public void devicesInUnloadedChunksAreMarkedAsUnloaded() {
- final BlockPos elementPos = new BlockPos(0, 0, 0);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
- final TestBlockDeviceBusElement busElement = busElementInfo.getBusElement();
-
- busElement.updateDevicesForNeighbor(Direction.WEST);
- verify(busElement, atLeastOnce()).setEntriesForGroupUnloaded(Direction.WEST.get3DDataValue());
- }
-
- @Test
- public void unloadedDeviceIsRemovedFromElement() {
- final BlockPos elementPos = new BlockPos(0, 0, 8);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
-
- final BlockPos devicePos = elementPos.west();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
- assertTrue(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
-
- fakeLevel.setChunkLoaded(new ChunkPos(devicePos), false);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
- assertFalse(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
- }
-
- @Test
- public void devicesInLoadedChunksAreCollected() {
- final BlockPos elementPos = new BlockPos(0, 0, 0);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
- final TestBlockDeviceBusElement busElement = busElementInfo.getBusElement();
-
- final BlockPos devicePos = elementPos.east();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- busElement.updateDevicesForNeighbor(Direction.EAST);
- verify(busElement, atLeastOnce()).setEntriesForGroup(eq(Direction.EAST.get3DDataValue()), any());
- assertTrue(busElement.getDevices().contains(deviceBlockEntity.getObjectDevice()));
- }
-
- @Test
- public void equalDevicesAreIgnored() {
- final BlockPos elementPos = new BlockPos(0, 0, 0);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
- final TestBlockDeviceBusElement busElement = busElementInfo.getBusElement();
-
- final BlockPos devicePos = elementPos.east();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- busElement.updateDevicesForNeighbor(Direction.EAST);
-
- assertTrue(busElement.getDevices().contains(deviceBlockEntity.getObjectDevice()));
-
- final ObjectDevice equalDevice = new ObjectDevice(deviceBlockEntity.getTestDevice());
- deviceBlockEntity.setObjectDevice(equalDevice);
-
- busElement.updateDevicesForNeighbor(Direction.EAST);
-
- assertTrue(busElement.getDevices().contains(deviceBlockEntity.getObjectDevice()));
- assertNotSame(busElement.getDevices().stream().findFirst().orElseThrow(), equalDevice);
- }
-
- @Test
- public void busControllerDetectsDevices() {
- final BlockPos controllerPos = new BlockPos(8, 0, 8);
- final BlockDeviceBusController busController = new TestBusControllerBlockEntity(controllerPos).getBusController();
-
- final BlockPos elementPos = controllerPos.east();
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
- when(busElementInfo.getBlockEntity().getCapability(eq(Capabilities.deviceBusElement()), any())).thenReturn(LazyOptional.of(busElementInfo::getBusElement));
-
- final BlockPos devicePos = elementPos.east();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.EAST);
- busController.scan();
-
- assertTrue(busController.getDevices().contains(deviceBlockEntity.getObjectDevice()));
- }
-
- @Test
- public void devicesGetSerializedWhenUnloadedAndDeserializedWhenLoaded() {
- final BlockPos controllerPos = new BlockPos(1, 0, 8);
- final BlockDeviceBusController busController = new TestBusControllerBlockEntity(controllerPos).getBusController();
-
- final BlockPos elementPos = controllerPos.west();
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
- when(busElementInfo.getBlockEntity().getCapability(eq(Capabilities.deviceBusElement()), any())).thenReturn(LazyOptional.of(busElementInfo::getBusElement));
-
- final BlockPos devicePos = elementPos.west();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- fakeLevel.setChunkLoaded(new ChunkPos(devicePos), false);
- busController.scheduleBusScan();
-
- final RPCDeviceBusAdapter rpcDeviceBusAdapter = new RPCDeviceBusAdapter(mock(SerialDevice.class));
- busController.onBeforeDeviceScan.add(rpcDeviceBusAdapter::pause);
- busController.onAfterDeviceScan.add(event -> rpcDeviceBusAdapter.resume(busController, event.didDevicesChange()));
-
- busController.scan();
-
- // Reminder: missing chunk -> bus scan cannot complete.
- assertEquals(CommonDeviceBusController.BusState.INCOMPLETE, busController.getState());
-
- final ObjectDevice objectDevice = spy(deviceBlockEntity.getObjectDevice());
- deviceBlockEntity.setObjectDevice(objectDevice);
-
- // Initialize with unloaded chunk.
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- assertFalse(busController.getDevices().contains(objectDevice));
-
- verify(objectDevice, never()).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, never()).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
-
- // Load device chunk.
- fakeLevel.setChunkLoaded(new ChunkPos(devicePos), true);
- busController.scheduleBusScan();
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- busController.scan();
- assertEquals(CommonDeviceBusController.BusState.READY, busController.getState());
-
- assertTrue(busController.getDevices().contains(objectDevice));
-
- rpcDeviceBusAdapter.mountDevices();
-
- verify(objectDevice, times(1)).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, never()).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any()); // no state to deserialize
-
- // Unload device chunk.
- fakeLevel.setChunkLoaded(new ChunkPos(devicePos), false);
- busController.scheduleBusScan();
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- busController.scan();
- assertEquals(CommonDeviceBusController.BusState.INCOMPLETE, busController.getState());
-
- assertFalse(busController.getDevices().contains(objectDevice));
-
- verify(objectDevice, times(1)).mount();
- verify(objectDevice, times(1)).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, times(1)).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
- }
-
- // Different load states and how removals effect state. Adds are uninteresting,
- // because we need a fully loaded state before anything happens here.
-
- // Loaded: [ ] Controller, [ ] Element, [ ] Device
- // -> No interaction possible.
-
- // Loaded: [ ] Controller, [ ] Element, [x] Device
- // -> Removing Device:
- // -> Provider#dispose() when Element is loaded.
-
- @Test
- public void providerDisposeIsCalledWhenDeviceIsRemovedWhileElementIsUnloaded() {
- final BlockPos elementPos = new BlockPos(0, 0, 8);
- TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
-
- final BlockPos devicePos = elementPos.west();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- final ObjectDevice objectDevice = spy(deviceBlockEntity.getObjectDevice());
- deviceBlockEntity.setObjectDevice(objectDevice);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- assertTrue(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
- verify(objectDevice, never()).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, never()).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
-
- final CompoundTag data = busElementInfo.getBusElement().save();
- verify(objectDevice, times(1)).serializeNBT();
-
- fakeLevel.setChunkLoaded(new ChunkPos(elementPos), false);
- fakeLevel.removeBlockEntity(elementPos);
-
- fakeLevel.removeBlockEntity(devicePos);
-
- fakeLevel.setChunkLoaded(new ChunkPos(elementPos), true);
- busElementInfo = new TestBusElementBlockEntity(elementPos);
- busElementInfo.getBusElement().load(data);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- final BlockDeviceProvider provider = Providers.blockDeviceProviderRegistry().getValue(TEST_PROVIDER_REGISTRY_NAME);
- verify(provider, times(1)).unmount(any(), any());
- }
-
- // Loaded: [ ] Controller, [x] Element, [ ] Device
- // -> Removing Element:
- // -> Provider#dispose()
-
- @Test
- public void providerDisposeIsCalledWhenElementIsRemovedWhileDeviceIsUnloaded() {
- final BlockPos elementPos = new BlockPos(0, 0, 8);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
-
- final BlockPos devicePos = elementPos.west();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- final ObjectDevice objectDevice = spy(deviceBlockEntity.getObjectDevice());
- deviceBlockEntity.setObjectDevice(objectDevice);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- assertTrue(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
- verify(objectDevice, never()).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, never()).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
-
- fakeLevel.setChunkLoaded(new ChunkPos(devicePos), false);
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
- assertFalse(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
- verify(objectDevice, never()).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, times(1)).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
-
- fakeLevel.removeBlockEntity(elementPos);
- busElementInfo.getBusElement().setRemoved();
-
- final BlockDeviceProvider provider = Providers.blockDeviceProviderRegistry().getValue(TEST_PROVIDER_REGISTRY_NAME);
- verify(provider, times(1)).unmount(any(), any());
- }
-
- // Loaded: [ ] Controller, [x] Element, [x] Device
- // -> Removing Element:
- // -> Device#dispose()
-
- @Test
- public void deviceIsDisposedWhenElementIsRemoved() {
- final BlockPos elementPos = new BlockPos(8, 0, 8);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
-
- final BlockPos devicePos = elementPos.west();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- final ObjectDevice objectDevice = spy(deviceBlockEntity.getObjectDevice());
- deviceBlockEntity.setObjectDevice(objectDevice);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- assertTrue(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
- verify(objectDevice, never()).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, never()).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
-
- fakeLevel.removeBlockEntity(elementPos);
- busElementInfo.getBusElement().setRemoved();
-
- verify(objectDevice, times(1)).dispose();
-
- final BlockDeviceProvider provider = Providers.blockDeviceProviderRegistry().getValue(TEST_PROVIDER_REGISTRY_NAME);
- verify(provider, never()).unmount(any(), any());
- }
-
- // -> Removing Device:
- // -> Device#dispose()
-
- @Test
- public void deviceIsDisposedWhenDeviceIsRemoved() {
- final BlockPos elementPos = new BlockPos(8, 0, 8);
- final TestBusElementBlockEntity busElementInfo = new TestBusElementBlockEntity(elementPos);
-
- final BlockPos devicePos = elementPos.west();
- final TestDeviceBlockEntity deviceBlockEntity = new TestDeviceBlockEntity(devicePos);
-
- final ObjectDevice objectDevice = spy(deviceBlockEntity.getObjectDevice());
- deviceBlockEntity.setObjectDevice(objectDevice);
-
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- assertTrue(busElementInfo.getBusElement().getDevices().contains(deviceBlockEntity.getObjectDevice()));
- verify(objectDevice, never()).mount();
- verify(objectDevice, never()).unmount();
- verify(objectDevice, never()).dispose();
- verify(objectDevice, never()).serializeNBT();
- verify(objectDevice, never()).deserializeNBT(any());
-
- fakeLevel.removeBlockEntity(devicePos);
- busElementInfo.getBusElement().updateDevicesForNeighbor(Direction.WEST);
-
- verify(objectDevice, times(1)).dispose();
-
- final BlockDeviceProvider provider = Providers.blockDeviceProviderRegistry().getValue(TEST_PROVIDER_REGISTRY_NAME);
- verify(provider, never()).unmount(any(), any());
- }
-
- // Loaded: [x] Controller, [ ] Element, [ ] Device
- // -> Removing Controller:
- // -> Edge-case: suspended Devices will *not* be disposed. If a new controller
- // picks them up, they will resume under the assumption that they're managed
- // by the same controller as before their previous unmount.
-
- // Loaded: [x] Controller, [ ] Element, [x] Device
- // -> Removing Controller:
- // -> Edge-case: suspended Devices will *not* be disposed. If a new controller
- // picks them up, they will resume under the assumption that they're managed
- // by the same controller as before their previous unmount.
- // -> Removing Device:
- // -> Provider#dispose() when Element is loaded.
-
- // Same as providerDisposeIsCalledWhenDeviceIsRemovedWhileElementIsUnloaded()
-
- // Loaded: [x] Controller, [x] Element, [ ] Device
- // -> Removing Controller:
- // -> Edge-case: suspended Devices will *not* be disposed. If a new controller
- // picks them up, they will resume under the assumption that they're managed
- // by the same controller as before their previous unmount.
- // -> Removing Element:
- // -> Provider#dispose()
-
- // Same as providerDisposeIsCalledWhenElementIsRemovedWhileDeviceIsUnloaded()
-
- // Loaded: [x] Controller, [x] Element, [x] Device
- // -> Removing Controller:
- // -> Stop VM if running.
- // -> Stopping VM:
- // -> Device#unmount(), Device#dispose()
-
- // Handled in Computer/Robot, too much pain to try to mock this.
-
- // -> Removing Element:
- // -> Device#unmount() if mounted, Device#dispose()
- // -> Removing Device:
- // -> Device#unmount() if mounted, Device#dispose()
- // -> Unloading Controller, Element or Device:
- // -> Device#unmount() if mounted.
-
- // TODO
-
- // Last case (all loaded) is the only case where the bus can be complete, so
- // also the only case where Devices can possibly be mounted.
-
- // In all but the last case (all loaded) it makes no difference if there's more
- // loaded/unloaded elements in the chain. However, in the last case it does:
- // -> Removing intermediate element:
- // -> Edge-case: suspended Devices will *not* be disposed. If a new controller
- // picks them up, they will resume under the assumption that they're managed
- // by the same controller as before their previous unmount.
-
-
- ///////////////////////////////////////////////////////////////////
-
- @SuppressWarnings("unchecked")
- private static IForgeRegistry createBlockDeviceProviderRegistry() {
- final IForgeRegistry registry = mock(IForgeRegistry.class);
-
- final Map blockDeviceProviders = new HashMap<>();
- blockDeviceProviders.put(TEST_PROVIDER_REGISTRY_NAME, spy(new TestBlockDeviceProvider()));
-
- when(registry.getValues()).thenReturn(blockDeviceProviders.values());
- when(registry.getValue(notNull())).then(a -> blockDeviceProviders.get(a.getArgument(0)));
-
- return registry;
- }
-
- @SuppressWarnings("unchecked")
- private static IForgeRegistry createItemDeviceProviderRegistry() {
- final IForgeRegistry registry = mock(IForgeRegistry.class);
-
- final Map itemDeviceProviders = new HashMap<>();
- itemDeviceProviders.put(TEST_PROVIDER_REGISTRY_NAME, spy(new TestItemDeviceProvider()));
-
- when(registry.getValues()).thenReturn(itemDeviceProviders.values());
- when(registry.getValue(notNull())).then(a -> itemDeviceProviders.get(a.getArgument(0)));
-
- return registry;
- }
-
- ///////////////////////////////////////////////////////////////////
-
- private static final class FakeLevel {
- private final LevelAccessor level = mock(LevelAccessor.class);
- private final HashMap blockEntities = new HashMap<>();
- private final HashSet loadedChunks = new HashSet<>();
-
- public FakeLevel() {
- when(level.getBlockEntity(any())).then(a -> blockEntities.get(a.getArgument(0)));
-
- when(level.hasChunk(anyInt(), anyInt())).then(a -> {
- final int chunkX = a.getArgument(0);
- final int chunkZ = a.getArgument(1);
- return loadedChunks.contains(new ChunkPos(chunkX, chunkZ));
- });
- }
-
- public LevelAccessor getLevel() {
- return level;
- }
-
- public void addBlockEntity(final BlockEntity blockEntity) {
- blockEntities.put(blockEntity.getBlockPos(), blockEntity);
- }
-
- public void removeBlockEntity(final BlockPos pos) {
- blockEntities.remove(pos);
- }
-
- public void setChunkLoaded(final ChunkPos chunkPos, final boolean loaded) {
- if (loaded) {
- loadedChunks.add(chunkPos);
- } else {
- loadedChunks.remove(chunkPos);
- }
- }
- }
-
- private class TestBlockEntity {
- private final BlockEntity blockEntity;
-
- public TestBlockEntity(final BlockPos pos) {
- blockEntity = mock(BlockEntity.class);
- when(blockEntity.getBlockPos()).thenReturn(pos);
- when(blockEntity.getCapability(any(), any())).thenReturn(LazyOptional.empty());
- when(blockEntity.getCapability(any())).thenCallRealMethod();
-
- fakeLevel.addBlockEntity(blockEntity);
- fakeLevel.setChunkLoaded(new ChunkPos(pos), true);
- }
-
- public BlockEntity getBlockEntity() {
- return blockEntity;
- }
- }
-
- private class TestBusElementBlockEntity extends TestBlockEntity {
- private final TestBlockDeviceBusElement busElement;
- private final boolean[] enabledSides = new boolean[Constants.BLOCK_FACE_COUNT];
-
- public TestBusElementBlockEntity(final BlockPos pos) {
- super(pos);
- busElement = spy(new TestBlockDeviceBusElement(level, pos));
- when(getBlockEntity().getCapability(eq(Capabilities.deviceBusElement()), any())).then(a -> {
- if (enabledSides[a.getArgument(1).get3DDataValue()]) {
- return LazyOptional.of(() -> busElement);
- } else {
- return LazyOptional.empty();
- }
- });
- Arrays.fill(enabledSides, true);
- }
-
- public TestBlockDeviceBusElement getBusElement() {
- return busElement;
- }
-
- public void setSideEnabled(final Direction side, final boolean value) {
- enabledSides[side.get3DDataValue()] = value;
- }
- }
-
- private class TestBusControllerBlockEntity extends TestBusElementBlockEntity {
- private final BlockDeviceBusController busController;
-
- public TestBusControllerBlockEntity(final BlockPos pos) {
- super(pos);
- busController = new BlockDeviceBusController(getBusElement(), 0, getBlockEntity());
- }
-
- public BlockDeviceBusController getBusController() {
- return busController;
- }
- }
-
- private class TestDeviceBlockEntity extends TestBlockEntity {
- private final TestDevice testDevice;
- private ObjectDevice objectDevice;
-
- public TestDeviceBlockEntity(final BlockPos pos) {
- super(pos);
- testDevice = new TestDevice();
- objectDevice = new ObjectDevice(testDevice);
- when(getBlockEntity().getCapability(eq(Capabilities.device()), any())).thenReturn(LazyOptional.of(() -> objectDevice));
- }
-
- public TestDevice getTestDevice() {
- return testDevice;
- }
-
- public ObjectDevice getObjectDevice() {
- return objectDevice;
- }
-
- public void setObjectDevice(final ObjectDevice device) {
- this.objectDevice = device;
- }
- }
-
- private static final class TestBlockDeviceBusElement extends AbstractBlockDeviceBusElement {
- private final LevelAccessor level;
- private final BlockPos blockPos;
-
- public TestBlockDeviceBusElement(final LevelAccessor level, final BlockPos blockPos) {
- this.level = level;
- this.blockPos = blockPos;
- }
-
- @Override
- public LevelAccessor getLevel() {
- return level;
- }
-
- @Override
- public BlockPos getPosition() {
- return blockPos;
- }
- }
-
- private static class TestBlockDeviceProvider implements BlockDeviceProvider {
- @Override
- public BlockDeviceProvider setRegistryName(final ResourceLocation name) {
- return this;
- }
-
- @Nullable
- @Override
- public ResourceLocation getRegistryName() {
- return TEST_PROVIDER_REGISTRY_NAME;
- }
-
- @Override
- public Class getRegistryType() {
- return BlockDeviceProvider.class;
- }
-
- @Override
- public Invalidatable getDevice(final BlockDeviceQuery query) {
- final LevelAccessor level = query.getLevel();
- final BlockEntity blockEntity = level.getBlockEntity(query.getQueryPosition());
- if (blockEntity != null) {
- final Optional optional = blockEntity.getCapability(Capabilities.device()).resolve();
- return optional.map(Invalidatable::of).orElseGet(Invalidatable::empty);
- }
- return Invalidatable.empty();
- }
- }
-
- private static class TestItemDeviceProvider implements ItemDeviceProvider {
- @Override
- public ItemDeviceProvider setRegistryName(final ResourceLocation name) {
- return this;
- }
-
- @Nullable
- @Override
- public ResourceLocation getRegistryName() {
- return TEST_PROVIDER_REGISTRY_NAME;
- }
-
- @Override
- public Class getRegistryType() {
- return ItemDeviceProvider.class;
- }
-
- @Override
- public Optional getDevice(final ItemDeviceQuery query) {
- return Optional.empty();
- }
- }
-
- public static class TestDevice {
- @Callback
- public int test() {
- return 42;
- }
- }
-}
diff --git a/src/test/java/li/cil/oc2/common/bus/CommonDeviceBusControllerTests.java b/src/test/java/li/cil/oc2/common/bus/CommonDeviceBusControllerTests.java
deleted file mode 100644
index ea2eed4a..00000000
--- a/src/test/java/li/cil/oc2/common/bus/CommonDeviceBusControllerTests.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package li.cil.oc2.common.bus;
-
-import li.cil.oc2.api.bus.DeviceBusElement;
-import li.cil.oc2.api.bus.device.rpc.RPCDevice;
-import net.minecraftforge.common.util.LazyOptional;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.util.Collections;
-import java.util.Optional;
-
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.*;
-
-public class CommonDeviceBusControllerTests {
- private CommonDeviceBusController busController;
- private DeviceBusElement busControllerBusElement;
-
- @BeforeEach
- public void setupEach() {
- busControllerBusElement = mock(DeviceBusElement.class);
- when(busControllerBusElement.getLocalDevices()).thenReturn(emptyList());
- when(busControllerBusElement.getNeighbors()).thenReturn(Optional.empty());
-
- busController = new CommonDeviceBusController(busControllerBusElement, 0);
- }
-
- @Test
- public void scanPendingWhenBlockEntityNotLoaded() {
- busController.scan();
- assertEquals(CommonDeviceBusController.BusState.INCOMPLETE, busController.getState());
- }
-
- @Test
- public void scanCompletesWhenNoNeighbors() {
- when(busControllerBusElement.getNeighbors()).thenReturn(Optional.of(Collections.emptyList()));
-
- busController.scan();
- assertEquals(CommonDeviceBusController.BusState.READY, busController.getState());
- }
-
- @Test
- public void scanSuccessfulWithLocalElement() {
- when(busControllerBusElement.getNeighbors()).thenReturn(Optional.of(Collections.emptyList()));
-
- final RPCDevice device = mock(RPCDevice.class);
- when(busControllerBusElement.getLocalDevices()).thenReturn(singletonList(device));
-
- busController.scan();
- assertEquals(CommonDeviceBusController.BusState.READY, busController.getState());
-
- verify(busControllerBusElement).addController(busController);
- assertTrue(busController.getDevices().contains(device));
- }
-
- @Test
- public void scanSuccessfulWithMultipleElements() {
- // topology: controller <-> element 1 <-> element 2
-
- final DeviceBusElement busElement1 = mock(DeviceBusElement.class);
- final DeviceBusElement busElement2 = mock(DeviceBusElement.class);
-
- when(busControllerBusElement.getNeighbors()).thenReturn(Optional.of(Collections.singleton(LazyOptional.of(() -> busElement1))));
- when(busElement1.getNeighbors()).thenReturn(Optional.of(Collections.singleton(LazyOptional.of(() -> busControllerBusElement))));
-
- when(busElement1.getNeighbors()).thenReturn(Optional.of(Collections.singleton(LazyOptional.of(() -> busElement2))));
- when(busElement2.getNeighbors()).thenReturn(Optional.of(Collections.singleton(LazyOptional.of(() -> busElement1))));
-
- busController.scan();
- assertEquals(CommonDeviceBusController.BusState.READY, busController.getState());
-
- verify(busElement1).addController(busController);
- verify(busElement2).addController(busController);
- }
-}
diff --git a/src/test/java/li/cil/oc2/common/bus/RPCDeviceBusAdapterTests.java b/src/test/java/li/cil/oc2/common/bus/RPCDeviceBusAdapterTests.java
deleted file mode 100644
index 385d76c3..00000000
--- a/src/test/java/li/cil/oc2/common/bus/RPCDeviceBusAdapterTests.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package li.cil.oc2.common.bus;
-
-import li.cil.oc2.api.bus.DeviceBusController;
-import li.cil.oc2.api.bus.device.Device;
-import li.cil.oc2.api.bus.device.rpc.RPCDevice;
-import li.cil.oc2.api.bus.device.rpc.RPCMethod;
-import li.cil.oc2.common.bus.device.rpc.RPCDeviceList;
-import li.cil.sedna.api.device.serial.SerialDevice;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.util.*;
-
-import static org.mockito.Mockito.*;
-
-public final class RPCDeviceBusAdapterTests {
- private RPCDeviceBusAdapter adapter;
- private Set busDevices;
- private Map> deviceIdentifiers;
- private DeviceBusController controller;
-
- @BeforeEach
- public void setupEach() {
- adapter = new RPCDeviceBusAdapter(mock(SerialDevice.class));
- busDevices = new HashSet<>();
- deviceIdentifiers = new HashMap<>();
- controller = mock(DeviceBusController.class);
- when(controller.getDevices()).thenReturn(busDevices);
- when(controller.getDeviceIdentifiers(any())).then(invocation -> deviceIdentifiers.get((Device) invocation.getArgument(0)));
- }
-
- @Test
- public void resumeDoesNotMountDirectly() {
- final RPCDevice device1 = addDevice();
-
- adapter.resume(controller, true);
- verify(device1, never()).mount();
- }
-
- @Test
- public void emptyDevicesAreNotMounted() {
- final RPCDevice device = addEmptyDevice();
- adapter.resume(controller, true);
-
- adapter.mountDevices();
- verify(device, never()).mount();
- }
-
- @Test
- public void addedDevicesHaveMountCalled() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
-
- adapter.mountDevices();
- verify(device).mount();
- }
-
- @Test
- public void mountedDevicesAreUnmountedWhenRemoved() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
- adapter.mountDevices();
-
- removeDevice(device);
- adapter.resume(controller, true);
- verify(device).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void unmountedDevicesAreSilentlyRemoved() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
-
- removeDevice(device);
- adapter.resume(controller, true);
- verify(device, never()).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void mountedDevicesAreUnmountedButNotDisposedOnGlobalUnmount() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
- adapter.mountDevices();
-
- adapter.unmountDevices();
- verify(device).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void unmountedDevicesAreNotUnmountedAndNotDisposedOnGlobalUnmount() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
-
- adapter.unmountDevices();
- verify(device, never()).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void mountedDevicesAreUnmountedAndDisposedOnGlobalDispose() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
- adapter.mountDevices();
-
- adapter.disposeDevices();
- verify(device).unmount();
- verify(device).dispose();
- }
-
- @Test
- public void unmountedDevicesAreNotUnmountedButDisposedOnGlobalDispose() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
-
- adapter.disposeDevices();
- verify(device, never()).unmount();
- verify(device).dispose();
- }
-
- @Test
- public void devicesHaveMountCalledAfterGlobalUnmount() {
- final RPCDevice device = addDevice();
- adapter.resume(controller, true);
- adapter.mountDevices();
- adapter.unmountDevices();
-
- adapter.mountDevices();
- verify(device, times(2)).mount();
- }
-
- @Test
- public void deviceListIsStable() {
- final RPCDevice device1 = mock(RPCDevice.class);
- final RPCDevice device2 = mock(RPCDevice.class);
- final RPCDevice listDevice = new RPCDeviceList(new ArrayList<>(Arrays.asList(device1, device2)));
- when(device1.getMethodGroups()).thenReturn(Collections.singletonList(mock(RPCMethod.class)));
- when(device2.getMethodGroups()).thenReturn(Collections.singletonList(mock(RPCMethod.class)));
- addDevice(listDevice);
-
- adapter.resume(controller, true);
- verify(device1, never()).mount();
- verify(device2, never()).mount();
-
- adapter.mountDevices();
- verify(device1).mount();
- verify(device2).mount();
-
- adapter.resume(controller, true);
-
- verify(device1, never()).unmount();
- verify(device2, never()).unmount();
-
- adapter.mountDevices();
- verify(device1, atMostOnce()).mount();
- verify(device2, atMostOnce()).mount();
- }
-
- private RPCDevice addEmptyDevice() {
- final RPCDevice device = mock(RPCDevice.class);
- addDevice(device);
- return device;
- }
-
- private RPCDevice addDevice() {
- final RPCDevice device = mock(RPCDevice.class);
- when(device.getMethodGroups()).thenReturn(Collections.singletonList(mock(RPCMethod.class)));
- addDevice(device);
- return device;
- }
-
- private void addDevice(final Device device, UUID... identifiers) {
- if (identifiers.length == 0) {
- identifiers = new UUID[]{UUID.randomUUID()};
- }
-
- busDevices.add(device);
- deviceIdentifiers.put(device, new HashSet<>(Arrays.asList(identifiers)));
- }
-
- private void removeDevice(final Device device) {
- busDevices.remove(device);
- deviceIdentifiers.remove(device);
- }
-}
diff --git a/src/test/java/li/cil/oc2/common/bus/RPCMethodTests.java b/src/test/java/li/cil/oc2/common/bus/RPCMethodTests.java
deleted file mode 100644
index d2133f24..00000000
--- a/src/test/java/li/cil/oc2/common/bus/RPCMethodTests.java
+++ /dev/null
@@ -1,289 +0,0 @@
-package li.cil.oc2.common.bus;
-
-import com.google.gson.*;
-import it.unimi.dsi.fastutil.bytes.ByteArrayFIFOQueue;
-import li.cil.oc2.api.bus.DeviceBusController;
-import li.cil.oc2.api.bus.device.object.Callback;
-import li.cil.oc2.api.bus.device.object.ObjectDevice;
-import li.cil.oc2.api.bus.device.object.Parameter;
-import li.cil.oc2.api.bus.device.rpc.*;
-import li.cil.sedna.api.device.serial.SerialDevice;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import javax.annotation.Nullable;
-import java.io.ByteArrayOutputStream;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-
-import static java.util.Collections.singleton;
-import static java.util.Collections.singletonList;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class RPCMethodTests {
- private static final UUID DEVICE_UUID = java.util.UUID.randomUUID();
-
- private TestSerialDevice serialDevice;
- private DeviceBusController busController;
- private RPCDeviceBusAdapter rpcAdapter;
-
- @BeforeEach
- public void setupEach() {
- serialDevice = new TestSerialDevice();
- busController = mock(DeviceBusController.class);
- rpcAdapter = new RPCDeviceBusAdapter(serialDevice);
- }
-
- @Test
- public void resetAndReadDescriptor() {
- final VoidIntMethod method = new VoidIntMethod();
- final TestRPCDevice device = new TestRPCDevice(method);
- setDevice(device, DEVICE_UUID);
-
- final JsonObject request = new JsonObject();
- request.addProperty("type", "list");
- serialDevice.putAsVM(request.toString());
- rpcAdapter.step(0); // process message
-
- final String message = serialDevice.readMessageAsVM();
- assertNotNull(message);
-
- final JsonObject json = JsonParser.parseString(message).getAsJsonObject();
-
- final JsonArray devicesJson = json.getAsJsonArray("data");
- assertEquals(1, devicesJson.size());
-
- final JsonObject deviceJson = devicesJson.get(0).getAsJsonObject();
-
- assertNotNull(deviceJson.get("deviceId"));
- assertNotNull(deviceJson.get("typeNames"));
- }
-
- @Test
- public void simpleMethod() {
- final VoidIntMethod method = new VoidIntMethod();
- final TestRPCDevice device = new TestRPCDevice(method);
- setDevice(device, DEVICE_UUID);
-
- invokeMethod(DEVICE_UUID, method.getName(), 0xdeadbeef);
-
- assertEquals(0xdeadbeef, method.passedValue);
- }
-
- @Test
- public void returningMethod() {
- final IntLongMethod method = new IntLongMethod();
- final TestRPCDevice device = new TestRPCDevice(method);
- setDevice(device, DEVICE_UUID);
-
- final JsonElement result = invokeMethod(DEVICE_UUID, method.getName(), 0xdeadbeefcafebabeL);
- assertNotNull(result);
- assertTrue(result.isJsonPrimitive());
- assertEquals(0xcafebabe, result.getAsInt());
- }
-
- @Test
- public void annotatedObject() {
- final SimpleObject object = new SimpleObject();
- final ObjectDevice device = new ObjectDevice(object);
- setDevice(device, DEVICE_UUID);
-
- assertEquals(42 + 23, invokeMethod(DEVICE_UUID, "add", 42, 23).getAsInt());
- }
-
- @Test
- public void customDeviceGroupRejectsInvalidParameters() {
- final RPCDevice device = mock(RPCDevice.class);
- when(device.getTypeNames()).thenReturn(Collections.singletonList("test"));
- when(device.getMethodGroups()).thenReturn(Collections.singletonList(new CustomMethodGroup()));
- setDevice(device, DEVICE_UUID);
-
- assertEquals("error", invokeMethodRaw(DEVICE_UUID, "test", "invalid", 123).get("type").getAsString());
- }
-
- @Test
- public void customDeviceGroupAcceptsValidParameters() {
- final RPCDevice device = mock(RPCDevice.class);
- when(device.getTypeNames()).thenReturn(Collections.singletonList("test"));
- when(device.getMethodGroups()).thenReturn(Collections.singletonList(new CustomMethodGroup()));
- setDevice(device, DEVICE_UUID);
-
- assertEquals(42, invokeMethod(DEVICE_UUID, "test", 123, "valid").getAsInt());
- }
-
- private void setDevice(final RPCDevice device, final UUID deviceId) {
- when(busController.getDevices()).thenReturn(singleton(device));
- when(busController.getDeviceIdentifiers(device)).thenReturn(singleton(deviceId));
-
- // trigger device cache rebuild
- rpcAdapter.resume(busController, true);
- }
-
- private JsonObject invokeMethodRaw(final UUID deviceId, final String name, final Object... parameters) {
- final JsonObject request = new JsonObject();
- request.addProperty("type", "invoke");
- final JsonObject methodInvocation = new JsonObject();
- methodInvocation.addProperty("deviceId", deviceId.toString());
- methodInvocation.addProperty("name", name);
- final JsonArray parametersJson = new JsonArray();
- methodInvocation.add("parameters", parametersJson);
- for (final Object parameter : parameters) {
- parametersJson.add(new Gson().toJsonTree(parameter));
- }
- request.add("data", methodInvocation);
- serialDevice.putAsVM(request.toString());
-
- rpcAdapter.step(0);
-
- final String result = serialDevice.readMessageAsVM();
- assertNotNull(result);
- return JsonParser.parseString(result).getAsJsonObject();
- }
-
- private JsonElement invokeMethod(final UUID deviceId, final String name, final Object... parameters) {
- final JsonObject resultJson = invokeMethodRaw(deviceId, name, parameters);
- assertEquals("result", resultJson.get("type").getAsString());
- return resultJson.get("data");
- }
-
- private static final class VoidIntMethod extends AbstractTestMethod {
- public int passedValue;
-
- VoidIntMethod() {
- super(void.class, int.class);
- }
-
- @Override
- public Object invoke(final Object... parameters) {
- passedValue = (int) parameters[0];
- return 0;
- }
- }
-
- private static final class IntLongMethod extends AbstractTestMethod {
- public long passedValue;
-
- IntLongMethod() {
- super(int.class, long.class);
- }
-
- @Override
- public Object invoke(final Object... parameters) {
- passedValue = (long) parameters[0];
- return (int) passedValue;
- }
- }
-
- private static final class CustomMethodGroup implements RPCMethodGroup {
- @Override
- public String getName() {
- return "test";
- }
-
- @Override
- public Optional findOverload(final RPCInvocation invocation) {
- final JsonArray parameters = invocation.getParameters();
- if (parameters.size() != 2)
- return Optional.empty();
- if (!parameters.get(0).isJsonPrimitive() || !parameters.get(0).getAsJsonPrimitive().isNumber())
- return Optional.empty();
- if (!parameters.get(1).isJsonPrimitive() || !parameters.get(1).getAsJsonPrimitive().isString())
- return Optional.empty();
-
- return Optional.of(new AbstractRPCMethod("test", int.class, () -> int.class, () -> String.class) {
- @Override
- protected Object invoke(final Object... parameters) {
- return 42;
- }
- });
- }
- }
-
- public static final class SimpleObject {
- @Callback(synchronize = false)
- public int add(@Parameter("a") final int a,
- @Parameter("b") final int b) {
- return a + b;
- }
-
- @Callback(synchronize = false)
- public int div(@Parameter("a") final long a,
- @Parameter("b") final long b) {
- return (int) (a / b);
- }
- }
-
- private static final class TestSerialDevice implements SerialDevice {
- private final ByteArrayFIFOQueue transmit = new ByteArrayFIFOQueue();
- private final ByteArrayFIFOQueue receive = new ByteArrayFIFOQueue();
-
- public void putAsVM(final String data) {
- final byte[] bytes = data.getBytes();
- for (int i = 0; i < bytes.length; i++) {
- transmit.enqueue(bytes[i]);
- }
- transmit.enqueue((byte) 0);
- }
-
- @Nullable
- public String readMessageAsVM() {
- final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
- while (!receive.isEmpty()) {
- final byte value = receive.dequeueByte();
-
- if (value == 0) {
- if (bytes.size() == 0) {
- continue;
- } else {
- break;
- }
- }
-
- bytes.write(value);
- }
-
- if (bytes.size() > 0) {
- return bytes.toString();
- } else {
- return null;
- }
- }
-
- @Override
- public int read() {
- return transmit.isEmpty() ? -1 : transmit.dequeueByte();
- }
-
- @Override
- public boolean canPutByte() {
- return true;
- }
-
- @Override
- public void putByte(final byte value) {
- receive.enqueue(value);
- }
- }
-
- private static final class TestRPCDevice implements RPCDevice {
- private final RPCMethod method;
-
- public TestRPCDevice(final RPCMethod method) {
- this.method = method;
- }
-
- @Override
- public List getTypeNames() {
- return singletonList(getClass().getSimpleName());
- }
-
- @Override
- public List getMethodGroups() {
- return singletonList(method);
- }
- }
-}
diff --git a/src/test/java/li/cil/oc2/common/bus/VMDeviceBusAdapterTests.java b/src/test/java/li/cil/oc2/common/bus/VMDeviceBusAdapterTests.java
deleted file mode 100644
index e33ecae9..00000000
--- a/src/test/java/li/cil/oc2/common/bus/VMDeviceBusAdapterTests.java
+++ /dev/null
@@ -1,386 +0,0 @@
-package li.cil.oc2.common.bus;
-
-import li.cil.oc2.api.bus.device.vm.VMDevice;
-import li.cil.oc2.api.bus.device.vm.VMDeviceLoadResult;
-import li.cil.oc2.api.bus.device.vm.context.VMContext;
-import li.cil.oc2.common.vm.VMDeviceBusAdapter;
-import li.cil.oc2.common.vm.context.global.GlobalVMContext;
-import li.cil.sedna.api.Board;
-import li.cil.sedna.api.device.InterruptController;
-import li.cil.sedna.api.device.MemoryMappedDevice;
-import li.cil.sedna.api.memory.MemoryMap;
-import li.cil.sedna.api.memory.MemoryRangeAllocationStrategy;
-import li.cil.sedna.memory.SimpleMemoryMap;
-import li.cil.sedna.riscv.R5MemoryRangeAllocationStrategy;
-import li.cil.sedna.riscv.device.R5PlatformLevelInterruptController;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.util.Collections;
-import java.util.OptionalInt;
-import java.util.OptionalLong;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-public final class VMDeviceBusAdapterTests {
- private MemoryMap memoryMap;
- private InterruptController interruptController;
- private R5MemoryRangeAllocationStrategy allocationStrategy;
- private GlobalVMContext context;
- private VMDeviceBusAdapter adapter;
-
- @BeforeEach
- public void setupEach() {
- memoryMap = new SimpleMemoryMap();
- interruptController = new R5PlatformLevelInterruptController();
- allocationStrategy = new R5MemoryRangeAllocationStrategy();
-
- final Board board = mock(Board.class);
- when(board.getMemoryMap()).thenReturn(memoryMap);
- when(board.getInterruptController()).thenReturn(interruptController);
- when(board.getInterruptCount()).thenReturn(16);
- when(board.addDevice(any())).then(invocation -> {
- final MemoryMappedDevice device = invocation.getArgument(0);
- final OptionalLong address = allocationStrategy.findMemoryRange(device, MemoryRangeAllocationStrategy.getMemoryMapIntersectionProvider(memoryMap));
- if (address.isPresent() && memoryMap.addDevice(address.getAsLong(), device)) {
- return address;
- }
- return OptionalLong.empty();
- });
- doAnswer(invocation -> {
- memoryMap.removeDevice(invocation.getArgument(0));
- return null;
- }).when(board).removeDevice(any());
-
- context = new GlobalVMContext(board);
- adapter = new VMDeviceBusAdapter(context);
- }
-
- @Test
- public void addingDeviceDoesNotMountDirectly() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device));
- verify(device, never()).mount(any());
- }
-
- @Test
- public void addedDevicesHaveMountCalled() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
- verify(device).mount(any());
- }
-
- @Test
- public void existingDevicesDoNotHaveMountCalledAgain() {
- final VMDevice device1 = mock(VMDevice.class);
- final VMDevice device2 = mock(VMDevice.class);
- when(device1.mount(any())).thenReturn(VMDeviceLoadResult.success());
- when(device2.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device1));
- adapter.mountDevices();
- verify(device1).mount(any());
-
- adapter.addDevices(Collections.singleton(device2));
- adapter.mountDevices();
- verifyNoMoreInteractions(device1);
- }
-
- @Test
- public void deviceFailingMountDoesNotHaveUnmountOrDisposeCalled() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.fail());
-
- adapter.addDevices(Collections.singleton(device));
- assertFalse(adapter.mountDevices().wasSuccessful());
- verify(device).mount(any());
- verify(device, never()).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void mountedDevicesAreUnmountedIfOtherMountFails() {
- final VMDevice device1 = mock(VMDevice.class);
- final VMDevice device2 = mock(VMDevice.class);
- when(device1.mount(any())).thenReturn(VMDeviceLoadResult.success());
- when(device2.mount(any())).thenReturn(VMDeviceLoadResult.fail());
-
- adapter.addDevices(Collections.singleton(device1));
- adapter.addDevices(Collections.singleton(device2));
- adapter.mountDevices();
-
- verify(device1).mount(any());
- verify(device2).mount(any());
- verify(device1).unmount();
- verify(device1, never()).dispose();
- }
-
- @Test
- public void mountedDevicesAreUnmountedWhenRemoved() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- adapter.removeDevices(Collections.singleton(device));
- verify(device).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void unmountedDevicesAreSilentlyRemoved() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device));
- adapter.mountDevices();
- verify(device).mount(any());
-
- adapter.unmountDevices();
- verify(device).unmount();
-
- adapter.removeDevices(Collections.singleton(device));
-
- verify(device, never()).dispose();
- }
-
- @Test
- public void mountedDevicesAreUnmountedButNotDisposedOnGlobalUnmount() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- adapter.unmountDevices();
- verify(device).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void unmountedDevicesAreNotUnmountedAndNotDisposedOnGlobalUnmount() {
- final VMDevice device = mock(VMDevice.class);
-
- adapter.addDevices(Collections.singleton(device));
-
- adapter.unmountDevices();
- verify(device, never()).unmount();
- verify(device, never()).dispose();
- }
-
- @Test
- public void mountedDevicesAreUnmountedAndDisposedOnGlobalDispose() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
- adapter.addDevices(Collections.singleton(device));
- adapter.mountDevices();
-
- adapter.disposeDevices();
- verify(device).unmount();
- verify(device).dispose();
- }
-
- @Test
- public void unmountedDevicesAreNotUnmountedButDisposedOnGlobalDispose() {
- final VMDevice device = mock(VMDevice.class);
- adapter.addDevices(Collections.singleton(device));
-
- adapter.disposeDevices();
- verify(device, never()).unmount();
- verify(device).dispose();
- }
-
- @Test
- public void devicesHaveMountCalledAfterGlobalUnmount() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenReturn(VMDeviceLoadResult.success());
-
- adapter.addDevices(Collections.singleton(device));
- adapter.mountDevices();
- adapter.unmountDevices();
-
- assertTrue(adapter.mountDevices().wasSuccessful());
- verify(device, times(2)).mount(any());
- }
-
- @Test
- public void deviceCanClaimInterrupts() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
- final OptionalInt interrupt = context.getInterruptAllocator().claimInterrupt();
- assertTrue(interrupt.isPresent());
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- verify(device).mount(any());
- }
-
- @Test
- public void deviceCannotClaimClaimedInterrupts() {
- final int claimedInterrupt = 1;
-
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
- final boolean result = context.getInterruptAllocator().claimInterrupt(claimedInterrupt);
- assertFalse(result);
- return VMDeviceLoadResult.success();
- });
-
- context.getInterruptAllocator().claimInterrupt(claimedInterrupt);
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
- }
-
- @Test
- public void deviceCanRaiseClaimedInterrupts() {
- final DeviceData deviceData = new DeviceData();
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
- final OptionalInt interrupt = context.getInterruptAllocator().claimInterrupt();
- assertTrue(interrupt.isPresent());
-
- deviceData.context = context;
- deviceData.interrupt = interrupt.getAsInt();
-
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- final int claimedInterruptMask = 1 << deviceData.interrupt;
- deviceData.context.getInterruptController().raiseInterrupts(claimedInterruptMask);
-
- assertTrue((interruptController.getRaisedInterrupts() & claimedInterruptMask) != 0);
- }
-
- @Test
- public void devicesCannotRaiseUnclaimedInterrupts() {
- final DeviceData deviceData = new DeviceData();
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- deviceData.context = invocation.getArgument(0);
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- final int someInterruptMask = 0x1;
- assertThrows(IllegalArgumentException.class, () ->
- deviceData.context.getInterruptController().raiseInterrupts(someInterruptMask));
- }
-
- @Test
- public void unmountLowersClaimedInterrupts() {
- final DeviceData deviceData = new DeviceData();
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
- final OptionalInt interrupt = context.getInterruptAllocator().claimInterrupt();
- assertTrue(interrupt.isPresent());
-
- deviceData.context = context;
- deviceData.interrupt = interrupt.getAsInt();
-
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- final int claimedInterruptMask = 1 << deviceData.interrupt;
- deviceData.context.getInterruptController().raiseInterrupts(claimedInterruptMask);
-
- assertTrue((interruptController.getRaisedInterrupts() & claimedInterruptMask) != 0);
-
- adapter.unmountDevices();
-
- assertFalse((interruptController.getRaisedInterrupts() & claimedInterruptMask) != 0);
- }
-
- @Test
- public void devicesCannotAddToMemoryMapDirectly() {
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
-
- assertThrows(UnsupportedOperationException.class, () ->
- context.getMemoryMap().addDevice(0, mock(MemoryMappedDevice.class)));
-
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- adapter.mountDevices();
- }
-
- @Test
- public void devicesCanAddMemoryMappedDevices() {
- final DeviceData deviceData = new DeviceData();
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
-
- deviceData.context = context;
- deviceData.device = mock(MemoryMappedDevice.class);
- when(deviceData.device.getLength()).thenReturn(0x1000);
-
- assertTrue(context.getMemoryRangeAllocator().claimMemoryRange(deviceData.device).isPresent());
-
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- assertTrue(deviceData.context.getMemoryMap().getMemoryRange(deviceData.device).isPresent());
- }
-
- @Test
- public void addedDevicesGetRemovedOnUnmount() {
- final DeviceData deviceData = new DeviceData();
- final VMDevice device = mock(VMDevice.class);
- when(device.mount(any())).thenAnswer(invocation -> {
- final VMContext context = invocation.getArgument(0);
-
- deviceData.context = context;
- deviceData.device = mock(MemoryMappedDevice.class);
- when(deviceData.device.getLength()).thenReturn(0x1000);
-
- assertTrue(context.getMemoryRangeAllocator().claimMemoryRange(deviceData.device).isPresent());
-
- return VMDeviceLoadResult.success();
- });
-
- adapter.addDevices(Collections.singleton(device));
- assertTrue(adapter.mountDevices().wasSuccessful());
-
- assertTrue(deviceData.context.getMemoryMap().getMemoryRange(deviceData.device).isPresent());
-
- adapter.unmountDevices();
-
- assertFalse(deviceData.context.getMemoryMap().getMemoryRange(deviceData.device).isPresent());
- }
-
- private static final class DeviceData {
- public VMContext context;
- public int interrupt;
- public MemoryMappedDevice device;
- }
-}
diff --git a/src/test/java/li/cil/oc2/common/bus/package-info.java b/src/test/java/li/cil/oc2/common/bus/package-info.java
deleted file mode 100644
index 44244ffe..00000000
--- a/src/test/java/li/cil/oc2/common/bus/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-@ParametersAreNonnullByDefault
-@MethodsReturnNonnullByDefault
-package li.cil.oc2.common.bus;
-
-import net.minecraft.MethodsReturnNonnullByDefault;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java b/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java
deleted file mode 100644
index f23cb6e0..00000000
--- a/src/test/java/li/cil/oc2/common/serialization/SerializationTests.java
+++ /dev/null
@@ -1,200 +0,0 @@
-package li.cil.oc2.common.serialization;
-
-import li.cil.ceres.api.Serialized;
-import net.minecraft.nbt.CompoundTag;
-import org.junit.jupiter.api.Test;
-
-import java.util.UUID;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-public final class SerializationTests {
- @Test
- public void testSerializeFlat() {
- final Flat value = new Flat();
-
- final UUID uuid = UUID.randomUUID();
- value.byteValue = 123;
- value.shortValue = 234;
- value.intValue = 456;
- value.longValue = 567;
- value.floatValue = 678.9f;
- value.doubleValue = 789.0;
- value.byteArrayValue = new byte[]{1, 2, 3};
- value.intArrayValue = new int[]{4, 5, 6};
- value.longArrayValue = new long[]{7, 8, 9};
- value.stringValue = "test string";
- value.uuidValue = uuid;
-
- final CompoundTag nbt = assertDoesNotThrow(() -> NBTSerialization.serialize(value));
-
- assertEquals(123, nbt.getByte("byteValue"));
- assertEquals(234, nbt.getShort("shortValue"));
- assertEquals(456, nbt.getInt("intValue"));
- assertEquals(567, nbt.getLong("longValue"));
- assertEquals(678.9f, nbt.getFloat("floatValue"));
- assertEquals(789.0, nbt.getDouble("doubleValue"));
- assertArrayEquals(new byte[]{1, 2, 3}, nbt.getByteArray("byteArrayValue"));
- assertArrayEquals(new int[]{4, 5, 6}, nbt.getIntArray("intArrayValue"));
- assertArrayEquals(new long[]{7, 8, 9}, nbt.getLongArray("longArrayValue"));
- assertEquals("test string", nbt.getString("stringValue"));
- assertEquals(uuid, nbt.getCompound("uuidValue").getUUID("uuidValue"));
- }
-
- @Test
- public void testDeserializeFlatInto() {
- final CompoundTag nbt = new CompoundTag();
- nbt.putByte("byteValue", (byte) 98);
- nbt.putShort("shortValue", (short) 876);
- nbt.putInt("intValue", 765);
- nbt.putLong("longValue", 654);
- nbt.putFloat("floatValue", 543.2f);
- nbt.putDouble("doubleValue", 432.1);
- nbt.putByteArray("byteArrayValue", new byte[]{9, 8, 7});
- nbt.putIntArray("intArrayValue", new int[]{8, 7, 6});
- nbt.putLongArray("longArrayValue", new long[]{7, 6, 5});
- nbt.putString("stringValue", "another test");
- final UUID uuid = UUID.randomUUID();
- final CompoundTag uuidNBT = new CompoundTag();
- uuidNBT.putUUID("uuidValue", uuid);
- nbt.put("uuidValue", uuidNBT);
-
- final Flat value = assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, Flat.class, new Flat()));
-
- assertEquals(98, value.byteValue);
- assertEquals(876, value.shortValue);
- assertEquals(765, value.intValue);
- assertEquals(654, value.longValue);
- assertEquals(543.2f, value.floatValue);
- assertEquals(432, .1, value.doubleValue);
- assertArrayEquals(new byte[]{9, 8, 7}, value.byteArrayValue);
- assertArrayEquals(new int[]{8, 7, 6}, value.intArrayValue);
- assertArrayEquals(new long[]{7, 6, 5}, value.longArrayValue);
- assertEquals("another test", value.stringValue);
- assertEquals(uuid, value.uuidValue);
- }
-
- @Test
- public void testDeserializeFlatNew() {
- final CompoundTag nbt = new CompoundTag();
-
- nbt.putByte("byteValue", (byte) 98);
- nbt.putShort("shortValue", (short) 876);
- nbt.putInt("intValue", 765);
- nbt.putLong("longValue", 654);
- nbt.putFloat("floatValue", 543.2f);
- nbt.putDouble("doubleValue", 432.1);
- nbt.putByteArray("byteArrayValue", new byte[]{9, 8, 7});
- nbt.putIntArray("intArrayValue", new int[]{8, 7, 6});
- nbt.putLongArray("longArrayValue", new long[]{7, 6, 5});
- nbt.putString("stringValue", "another test");
- final UUID uuid = UUID.randomUUID();
- final CompoundTag uuidNBT = new CompoundTag();
- uuidNBT.putUUID("uuidValue", uuid);
- nbt.put("uuidValue", uuidNBT);
-
- final Flat value = assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, Flat.class, null));
-
- assertEquals(98, value.byteValue);
- assertEquals(876, value.shortValue);
- assertEquals(765, value.intValue);
- assertEquals(654, value.longValue);
- assertEquals(543.2f, value.floatValue);
- assertEquals(432, .1, value.doubleValue);
- assertArrayEquals(new byte[]{9, 8, 7}, value.byteArrayValue);
- assertArrayEquals(new int[]{8, 7, 6}, value.intArrayValue);
- assertArrayEquals(new long[]{7, 6, 5}, value.longArrayValue);
- assertEquals("another test", value.stringValue);
- assertEquals(uuid, value.uuidValue);
- }
-
- @Test
- public void testModifiers() {
- final WithModifiers value = new WithModifiers();
- final CompoundTag nbt = assertDoesNotThrow(() -> NBTSerialization.serialize(value));
-
- assertTrue(nbt.contains("nonTransientInt"));
- assertEquals(123, nbt.getInt("nonTransientInt"));
- assertFalse(nbt.contains("transientInt"));
- assertFalse(nbt.contains("finalInt"));
-
- nbt.putIntArray("finalIntArray", new int[]{8, 7, 6});
-
- assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, value));
-
- assertArrayEquals(new int[]{8, 7, 6}, value.finalIntArray);
- }
-
- @Test
- public void testSerializeNested() {
- final Nested root = new Nested();
- root.value = 123;
- root.child = new Nested();
- root.child.value = 234;
-
- final CompoundTag nbt = assertDoesNotThrow(() -> NBTSerialization.serialize(root));
-
- assertEquals(123, nbt.getInt("value"));
- assertTrue(nbt.contains("child"));
- assertEquals(234, nbt.getCompound("child").getInt("value"));
- }
-
- @Test
- public void testDeserializeNestedInto() {
- final CompoundTag nbt = new CompoundTag();
- nbt.putInt("value", 123);
- final CompoundTag child = new CompoundTag();
- nbt.put("child", child);
- child.putInt("value", 234);
-
- final Nested value = assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, Nested.class, new Nested()));
-
- assertEquals(123, value.value);
- assertEquals(234, value.child.value);
- assertNull(value.child.child);
- }
-
- @Test
- public void testDeserializeNestedNew() {
- final CompoundTag nbt = new CompoundTag();
- nbt.putInt("value", 123);
- final CompoundTag child = new CompoundTag();
- nbt.put("child", child);
- child.putInt("value", 234);
-
- final Nested value = assertDoesNotThrow(() -> NBTSerialization.deserialize(nbt, Nested.class, null));
-
- assertEquals(123, value.value);
- assertEquals(234, value.child.value);
- assertNull(value.child.child);
- }
-
- @Serialized
- private static final class Flat {
- private byte byteValue;
- private short shortValue;
- private int intValue;
- private long longValue;
- private float floatValue;
- private double doubleValue;
- private byte[] byteArrayValue;
- private int[] intArrayValue;
- private long[] longArrayValue;
- private String stringValue;
- private UUID uuidValue;
- }
-
- @Serialized
- private static final class WithModifiers {
- private int nonTransientInt = 123;
- private transient int transientInt = 345;
- private final int finalInt = 678;
- private final int[] finalIntArray = {4, 5, 6};
- }
-
- @Serialized
- private static final class Nested {
- private int value;
- private Nested child;
- }
-}