Add boot error message when firmware is missing.

This commit is contained in:
Florian Nücke
2021-01-23 13:02:17 +01:00
parent 97c3a68b2d
commit 689f665f14
7 changed files with 27 additions and 7 deletions

View File

@@ -0,0 +1,12 @@
package li.cil.oc2.api.bus.device.data;
import li.cil.oc2.api.bus.device.vm.VMDevice;
/**
* This interface serves as a marker for devices that load firmware.
* <p>
* It is used exclusively to check if some firmware will be loaded early in the
* startup process, to provide a useful error to the user if none is present.
*/
public interface FirmwareLoader extends VMDevice {
}

View File

@@ -2,6 +2,7 @@ package li.cil.oc2.common.bus.device.item;
import com.google.common.eventbus.Subscribe;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.data.FirmwareLoader;
import li.cil.oc2.api.bus.device.vm.VMContext;
import li.cil.oc2.api.bus.device.vm.VMDevice;
import li.cil.oc2.api.bus.device.vm.VMDeviceLoadResult;
@@ -21,7 +22,7 @@ import java.nio.ByteBuffer;
import java.util.OptionalLong;
@SuppressWarnings("UnstableApiUsage")
public final class ByteBufferFlashMemoryVMDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice {
public final class ByteBufferFlashMemoryVMDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, FirmwareLoader {
public static final String DATA_TAG_NAME = "data";
///////////////////////////////////////////////////////////////

View File

@@ -3,6 +3,7 @@ package li.cil.oc2.common.bus.device.item;
import com.google.common.eventbus.Subscribe;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.data.Firmware;
import li.cil.oc2.api.bus.device.data.FirmwareLoader;
import li.cil.oc2.api.bus.device.vm.VMContext;
import li.cil.oc2.api.bus.device.vm.VMDevice;
import li.cil.oc2.api.bus.device.vm.VMDeviceLoadResult;
@@ -15,7 +16,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TranslationTextComponent;
@SuppressWarnings("UnstableApiUsage")
public final class FirmwareFlashMemoryVMDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice {
public final class FirmwareFlashMemoryVMDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, FirmwareLoader {
private final Firmware firmware;
private MemoryMap memoryMap;

View File

@@ -16,6 +16,7 @@ public final class JsonArraySerializer implements Serializer<JsonArray> {
visitor.putObject("value", String.class, jsonArray.toString());
}
@Nullable
@Override
public JsonArray deserialize(final DeserializationVisitor visitor, final Class<JsonArray> type, @Nullable final Object value) throws SerializationException {
JsonArray array = (JsonArray) value;

View File

@@ -15,6 +15,7 @@ public final class TextComponentSerializer implements Serializer<ITextComponent>
visitor.putObject("value", String.class, json);
}
@Nullable
@Override
public ITextComponent deserialize(final DeserializationVisitor visitor, final Class<ITextComponent> type, @Nullable final Object value) throws SerializationException {
if (!visitor.exists("value")) {

View File

@@ -1,5 +1,6 @@
package li.cil.oc2.common.vm;
import li.cil.oc2.api.bus.device.data.FirmwareLoader;
import li.cil.oc2.api.bus.device.vm.VMDeviceLoadResult;
import li.cil.oc2.api.bus.device.vm.event.VMPausingEvent;
import li.cil.oc2.common.Constants;
@@ -24,8 +25,6 @@ public abstract class AbstractVirtualMachineState<TBusController extends Abstrac
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
private static final String VIRTUAL_MACHINE_TAG_NAME = "virtualMachine";
private static final String RUNNER_TAG_NAME = "runner";
@@ -190,6 +189,11 @@ public abstract class AbstractVirtualMachineState<TBusController extends Abstrac
break;
}
if (busController.getDevices().stream().noneMatch(device -> device instanceof FirmwareLoader)) {
setBootError(new TranslationTextComponent(Constants.COMPUTER_ERROR_MISSING_FIRMWARE));
setRunState(RunState.STOPPED);
break;
}
// May have a valid runner after load. In which case we just had to wait for
// bus setup and devices to load. So we can keep using it.
@@ -205,12 +209,12 @@ public abstract class AbstractVirtualMachineState<TBusController extends Abstrac
// forgotten to add some RAM modules.
setBootError(new TranslationTextComponent(Constants.COMPUTER_ERROR_INSUFFICIENT_MEMORY));
setRunState(RunState.STOPPED);
return;
break;
} catch (final MemoryAccessException e) {
LOGGER.error(e);
setBootError(new TranslationTextComponent(Constants.COMPUTER_ERROR_UNKNOWN));
setRunState(RunState.STOPPED);
return;
break;
}
runner = createRunner();

View File

@@ -37,7 +37,7 @@
"config.oc2.admin.fakePlayerUUID": "Fake Player UUID",
"gui.oc2.computer.error.unknown": "Unknown Error",
"gui.oc2.computer.error.missing_firmware": "Missing Flash Memory",
"gui.oc2.computer.error.missing_firmware": "Missing Firmware",
"gui.oc2.computer.error.insufficient_memory": "Insufficient Memory",
"gui.oc2.computer.bus_state.incomplete": "Bus Incomplete",
"gui.oc2.computer.bus_state.too_complex": "Bus Too Complex",