Add boot error message when firmware is missing.
This commit is contained in:
@@ -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 {
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user