Finished initial implementation of tiered CPUs. They still need crafting recipes. Going to wait though because I plan to completely redo the recipes throughout the mod.

This commit is contained in:
Jackson Abney
2024-05-25 18:05:23 -08:00
parent abe9521f29
commit 26571b10a5
27 changed files with 133 additions and 10 deletions

View File

@@ -20,4 +20,5 @@ public final class DeviceTypes {
public static DeviceType FLOPPY = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "floppy"), new ResourceLocation("oc2", "device_type"), API.MOD_ID).get();
public static DeviceType NETWORK_TUNNEL = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "network_tunnel"), new ResourceLocation("oc2", "device_type"), API.MOD_ID).get();
public static DeviceType CPU = (DeviceType) RegistryObject.create(new ResourceLocation(API.MOD_ID, "cpu"), new ResourceLocation("oc2", "device_type"), API.MOD_ID).get();
}

View File

@@ -128,6 +128,7 @@ public abstract class AbstractMachineInventoryScreen<T extends AbstractMachineTe
GuiUtils.renderMissingDeviceInfoIcon(graphics, this, DeviceTypes.FLASH_MEMORY, Sprites.WARN_ICON);
GuiUtils.renderMissingDeviceInfoIcon(graphics, this, DeviceTypes.MEMORY, Sprites.WARN_ICON);
GuiUtils.renderMissingDeviceInfoIcon(graphics, this, DeviceTypes.HARD_DRIVE, Sprites.INFO_ICON);
GuiUtils.renderMissingDeviceInfoIcon(graphics, this, DeviceTypes.CPU, Sprites.INFO_ICON);
if (shouldRenderEnergyBar()) {
final int x = leftPos - Sprites.SIDEBAR_2.width + 4;
@@ -143,6 +144,7 @@ public abstract class AbstractMachineInventoryScreen<T extends AbstractMachineTe
GuiUtils.renderMissingDeviceInfoTooltip(graphics, this, mouseX, mouseY, DeviceTypes.FLASH_MEMORY);
GuiUtils.renderMissingDeviceInfoTooltip(graphics, this, mouseX, mouseY, DeviceTypes.MEMORY);
GuiUtils.renderMissingDeviceInfoTooltip(graphics, this, mouseX, mouseY, DeviceTypes.HARD_DRIVE);
GuiUtils.renderMissingDeviceInfoTooltip(graphics, this, mouseX, mouseY, DeviceTypes.CPU);
if (!shouldRenderEnergyBar()) {
return;

View File

@@ -27,6 +27,7 @@ public final class GuiUtils {
map.put(DeviceTypes.FLASH_MEMORY, text("tooltip.{mod}.flash_memory_missing"));
map.put(DeviceTypes.MEMORY, text("tooltip.{mod}.memory_missing"));
map.put(DeviceTypes.HARD_DRIVE, text("tooltip.{mod}.hard_drive_missing"));
map.put(DeviceTypes.CPU, text("tooltip.{mod}.cpu_missing"));
return map;
});
@@ -65,7 +66,7 @@ public final class GuiUtils {
findFirstSlotOfTypeIfAllSlotsOfTypeEmpty(screen.getMenu(), type).ifPresent(slot -> {
if (slot == hoveredSlot) {
//TooltipUtils.drawTooltip(graphics, Collections.singletonList(tooltip), mouseX, mouseY);
TooltipUtils.drawTooltip(graphics, Collections.singletonList(tooltip), mouseX, mouseY);
}
});
}

View File

@@ -3,6 +3,7 @@
package li.cil.oc2.client.renderer.blockentity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.world.item.ItemDisplayContext;
import org.joml.Quaternionf;
import org.joml.Vector3f;
@@ -40,9 +41,9 @@ public final class DiskDriveRenderer implements BlockEntityRenderer<DiskDriveBlo
stack.pushPose();
stack.translate(0.5f, 0.5f, 0.5f);
stack.mulPose(new Quaternionf().rotateY((float) Math.toRadians(blockFacing.toYRot())));
stack.mulPose(Axis.YN.rotationDegrees(blockFacing.toYRot()));
stack.translate(0.0f, 0.0f, 0.5f);
stack.mulPose(new Quaternionf().rotateX((float) Math.toRadians(90)));
stack.mulPose(Axis.XN.rotationDegrees(90));
stack.translate(0.0f, 0.2375f, 2.5f / 16f);
stack.scale(0.55f, 0.55f, 0.55f);

View File

@@ -46,6 +46,7 @@ public final class Constants {
public static final String COMPUTER_SCREEN_POWER_DESCRIPTION = key("gui.{mod}.computer.power.desc");
public static final String COMPUTER_ERROR_UNKNOWN = key("gui.{mod}.computer.error.unknown");
public static final String COMPUTER_ERROR_MISSING_FIRMWARE = key("gui.{mod}.computer.error.missing_firmware");
public static final String COMPUTER_ERROR_MISSING_CPU = key("gui.{mod}.computer.error.missing_cpu");
public static final String COMPUTER_ERROR_INSUFFICIENT_MEMORY = key("gui.{mod}.computer.error.insufficient_memory");
public static final String COMPUTER_BUS_STATE_INCOMPLETE = key("gui.{mod}.computer.bus_state.incomplete");
public static final String COMPUTER_BUS_STATE_TOO_COMPLEX = key("gui.{mod}.computer.bus_state.too_complex");

View File

@@ -4,11 +4,13 @@ package li.cil.oc2.common.blockentity;
import li.cil.oc2.api.bus.DeviceBusElement;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.DeviceType;
import li.cil.oc2.api.bus.device.DeviceTypes;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.api.capabilities.TerminalUserProvider;
import li.cil.oc2.client.audio.LoopingSoundManager;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.block.ComputerBlock;
import li.cil.oc2.common.bus.AbstractBlockDeviceBusElement;
import li.cil.oc2.common.bus.BlockDeviceBusController;
@@ -17,7 +19,9 @@ import li.cil.oc2.common.bus.device.util.Devices;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.container.ComputerInventoryContainer;
import li.cil.oc2.common.container.ComputerTerminalContainer;
import li.cil.oc2.common.container.DeviceTypeSlotItemHandler;
import li.cil.oc2.common.energy.FixedEnergyStorage;
import li.cil.oc2.common.item.CPUItem;
import li.cil.oc2.common.network.Network;
import li.cil.oc2.common.network.message.ComputerBootErrorMessage;
import li.cil.oc2.common.network.message.ComputerBusStateMessage;
@@ -32,6 +36,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.state.BlockState;
@@ -60,6 +65,7 @@ public final class ComputerBlockEntity extends ModBlockEntity implements Termina
private static final int HARD_DRIVE_SLOTS = 4;
private static final int FLASH_MEMORY_SLOTS = 1;
private static final int CARD_SLOTS = 4;
private static final int CPU_SLOTS = 1;
private static final int MAX_RUNNING_SOUND_DELAY = TickUtils.toTicks(Duration.ofSeconds(2));
@@ -101,6 +107,12 @@ public final class ComputerBlockEntity extends ModBlockEntity implements Termina
public void start() {
if (level != null && !level.isClientSide()) {
if (deviceItems.getItemHandler(DeviceTypes.CPU).get().getStackInSlot(0).isEmpty())
{
virtualMachine.error(Component.translatable(Constants.COMPUTER_ERROR_MISSING_CPU));
return;
}
virtualMachine.state.board.getCpu().setFrequency(((CPUItem) deviceItems.getItemHandler(DeviceTypes.CPU).get().getStackInSlot(0).getItem()).getFrequency());
virtualMachine.start();
}
}
@@ -308,7 +320,7 @@ public final class ComputerBlockEntity extends ModBlockEntity implements Termina
private final class ComputerItemStackHandlers extends AbstractVMItemStackHandlers {
public ComputerItemStackHandlers() {
super(new GroupDefinition(DeviceTypes.MEMORY, MEMORY_SLOTS), new GroupDefinition(DeviceTypes.HARD_DRIVE, HARD_DRIVE_SLOTS), new GroupDefinition(DeviceTypes.FLASH_MEMORY, FLASH_MEMORY_SLOTS), new GroupDefinition(DeviceTypes.CARD, CARD_SLOTS));
super(new GroupDefinition(DeviceTypes.MEMORY, MEMORY_SLOTS), new GroupDefinition(DeviceTypes.HARD_DRIVE, HARD_DRIVE_SLOTS), new GroupDefinition(DeviceTypes.FLASH_MEMORY, FLASH_MEMORY_SLOTS), new GroupDefinition(DeviceTypes.CARD, CARD_SLOTS), new GroupDefinition(DeviceTypes.CPU, CPU_SLOTS));
}
@Override

View File

@@ -44,6 +44,7 @@ public final class DeviceTypes {
register(ItemTags.DEVICES_ROBOT_MODULE);
register(ItemTags.DEVICES_FLOPPY);
register(ItemTags.DEVICES_NETWORK_TUNNEL);
register(ItemTags.DEVICES_CPU);
}
///////////////////////////////////////////////////////////////////

View File

@@ -74,6 +74,12 @@ public final class ComputerInventoryContainer extends AbstractComputerContainer
}
});
handlers.getItemHandler(DeviceTypes.CPU).ifPresent(itemHandler -> {
if(itemHandler.getSlots() > 0) {
addSlot(new DeviceTypeSlotItemHandler(itemHandler, DeviceTypes.CPU, 0, 64, 52));
}
});
createPlayerInventoryAndHotbarSlots(player.getInventory(), 8, 115);
}
}

View File

@@ -0,0 +1,16 @@
package li.cil.oc2.common.item;
public class CPUItem extends ModItem {
private final int frequency;
public CPUItem(int frequency)
{
this.frequency = frequency;
}
public int getFrequency()
{
return frequency;
}
}

View File

@@ -93,6 +93,10 @@ public final class ItemGroup {
output.accept(Items.HARD_DRIVE_LARGE.get());
output.accept(Items.HARD_DRIVE_EXTRA_LARGE.get());
output.accept(Items.HARD_DRIVE_CUSTOM.get());
output.accept(Items.CPU_TIER_1.get());
output.accept(Items.CPU_TIER_2.get());
output.accept(Items.CPU_TIER_3.get());
output.accept(Items.CPU_TIER_4.get());
output.accept(Items.FLASH_MEMORY.get());
output.accept(Items.FLASH_MEMORY_CUSTOM.get());
output.accept(Items.FLOPPY.get());

View File

@@ -68,6 +68,15 @@ public final class Items {
public static final RegistryObject<HardDriveWithExternalDataItem> HARD_DRIVE_CUSTOM = register("hard_drive_custom", () ->
new HardDriveWithExternalDataItem(BlockDeviceDataRegistry.BUILDROOT.getId(), DyeColor.BROWN));
public static final RegistryObject<CPUItem> CPU_TIER_1 = register("cpu_tier_1", () ->
new CPUItem(25_000_000));
public static final RegistryObject<CPUItem> CPU_TIER_2 = register("cpu_tier_2", () ->
new CPUItem(50_000_000));
public static final RegistryObject<CPUItem> CPU_TIER_3 = register("cpu_tier_3", () ->
new CPUItem(100_000_000));
public static final RegistryObject<CPUItem> CPU_TIER_4 = register("cpu_tier_4", () ->
new CPUItem(200_000_000));
public static final RegistryObject<FlashMemoryItem> FLASH_MEMORY = register("flash_memory", () ->
new FlashMemoryItem(12 * Constants.MEGABYTE));
public static final RegistryObject<FlashMemoryWithExternalDataItem> FLASH_MEMORY_CUSTOM = register("flash_memory_custom", () ->

View File

@@ -18,6 +18,7 @@ public final class ItemTags {
public static final TagKey<Item> DEVICES_ROBOT_MODULE = tag("devices/robot_module");
public static final TagKey<Item> DEVICES_FLOPPY = tag("devices/floppy");
public static final TagKey<Item> DEVICES_NETWORK_TUNNEL = tag("devices/network_tunnel");
public static final TagKey<Item> DEVICES_CPU = tag("devices/cpu");
public static final TagKey<Item> CABLES = tag("cables");
public static final TagKey<Item> WRENCHES = tag("wrenches");

View File

@@ -244,7 +244,7 @@ public abstract class AbstractVirtualMachine implements VirtualMachine {
protected void handleBootErrorChanged(@Nullable final Component value) {
}
protected void error(@Nullable final Component message) {
public void error(@Nullable final Component message) {
error(message, true);
}

View File

@@ -150,7 +150,7 @@ public class VMRunner implements Runnable {
///////////////////////////////////////////////////////////////////
private static int getCyclesPerTick() {
return Constants.CPU_FREQUENCY / TICKS_PER_SECOND;
private int getCyclesPerTick() {
return board.getCpu().getFrequency() / TICKS_PER_SECOND;
}
}

View File

@@ -30,6 +30,10 @@ public final class ModItemModelProvider extends ItemModelProvider {
simple(Items.MEMORY_MEDIUM);
simple(Items.MEMORY_LARGE);
simple(Items.MEMORY_EXTRA_LARGE);
simple(Items.CPU_TIER_1);
simple(Items.CPU_TIER_2);
simple(Items.CPU_TIER_3);
simple(Items.CPU_TIER_4);
simple(Items.HARD_DRIVE_SMALL, "item/hard_drive_base")
.texture("layer1", "item/hard_drive_tint");
simple(Items.HARD_DRIVE_MEDIUM, "item/hard_drive_base")

View File

@@ -3,6 +3,7 @@
package li.cil.oc2.data;
import li.cil.oc2.api.API;
import li.cil.oc2.common.item.CPUItem;
import li.cil.oc2.common.item.Items;
import li.cil.oc2.common.tags.BlockTags;
import net.minecraft.data.DataGenerator;
@@ -92,6 +93,10 @@ public final class ModItemTagsProvider extends ItemTagsProvider {
Items.HARD_DRIVE_LARGE.get(),
Items.HARD_DRIVE_EXTRA_LARGE.get(),
Items.HARD_DRIVE_CUSTOM.get(),
Items.CPU_TIER_1.get(),
Items.CPU_TIER_2.get(),
Items.CPU_TIER_3.get(),
Items.CPU_TIER_4.get(),
Items.KEYBOARD.get(),
Items.MEMORY_SMALL.get(),
Items.MEMORY_MEDIUM.get(),
@@ -102,5 +107,12 @@ public final class ModItemTagsProvider extends ItemTagsProvider {
Items.NETWORK_TUNNEL_MODULE.get(),
Items.PROJECTOR.get()
);
tag(DEVICES_CPU).add(
Items.CPU_TIER_1.get(),
Items.CPU_TIER_2.get(),
Items.CPU_TIER_3.get(),
Items.CPU_TIER_4.get()
);
}
}

View File

@@ -31,6 +31,14 @@
"item.oc2.manual.desc": "Holds information on all things needed when working with Computers.",
"item.oc2.bus_interface": "Bus Interface",
"item.oc2.bus_interface.desc": "Connects external devices to Computers.",
"item.oc2.cpu_tier_1": "CPU Tier 1",
"item.oc2.cpu_tier_1.desc": "Processes computer instructions.",
"item.oc2.cpu_tier_2": "CPU Tier 2",
"item.oc2.cpu_tier_2.desc": "Processes computer instructions.",
"item.oc2.cpu_tier_3": "CPU Tier 3",
"item.oc2.cpu_tier_3.desc": "Processes computer instructions.",
"item.oc2.cpu_tier_4": "CPU Tier 4",
"item.oc2.cpu_tier_4.desc": "Processes computer instructions.",
"item.oc2.network_cable": "Network Cable",
"item.oc2.network_cable.desc": "Connects Network Connectors.",
"item.oc2.memory": "Memory",
@@ -77,6 +85,7 @@
"gui.oc2.computer.bus_state.too_complex": "Bus Too Complex",
"gui.oc2.computer.bus_state.multiple_controllers": "Multiple Bus Controllers",
"gui.oc2.computer.error.not_enough_energy": "Not Enough Energy",
"gui.oc2.computer.error.missing_cpu": "Missing CPU",
"gui.oc2.computer.capture_input.capt": "Capture Input",
"gui.oc2.computer.capture_input.desc": "When enabled, as long as the mouse cursor is hovering the terminal contents, all input will be captured, including the escape key.",
@@ -122,6 +131,7 @@
"tooltip.oc2.flash_memory_missing": "A flash memory containing a firmware is required to boot.",
"tooltip.oc2.memory_missing": "Some memory is required to load the flash memory for execution to boot.",
"tooltip.oc2.hard_drive_missing": "Most systems will require a root file system to boot.",
"tooltip.oc2.cpu_missing": "A cpu is required to boot",
"tooltip.oc2.energy": "Energy: %s",
"tooltip.oc2.energyConsumption": "Energy Consumption: %s/t",
"tooltip.oc2.confirm": "Confirm",

View File

@@ -29,6 +29,7 @@
"gui.oc2.computer.capture_input.capt": "Захват ввода",
"gui.oc2.computer.capture_input.desc": "Пока курсор находится в пределах окна терминала, ввод (включая нажатие на ESC) будет захватываться.",
"gui.oc2.computer.error.insufficient_memory": "Недостаточно памяти",
"gui.oc2.computer.error.missing_cpu": "Отсутствует процессор",
"gui.oc2.computer.error.missing_firmware": "Отсутствует прошивка",
"gui.oc2.computer.error.not_enough_energy": "Недостаточно энергии",
"gui.oc2.computer.error.unknown": "Неизвестная ошибка",
@@ -110,6 +111,7 @@
"subtitles.oc2.hdd": "Шум жесткого диска",
"tooltip.oc2.cancel": "Отмена",
"tooltip.oc2.confirm": "Подтвердить",
"tooltip.oc2.cpu_missing": "Для загрузки требуется процессор",
"tooltip.oc2.device_needs_reboot": "Требуется перезагрузка",
"tooltip.oc2.energy": "Энергия: %s",
"tooltip.oc2.energyConsumption": "Потребление энергии: %s/t",

View File

@@ -29,6 +29,7 @@
"gui.oc2.computer.capture_input.capt": "捕获输入",
"gui.oc2.computer.capture_input.desc": "当开启并且鼠标移动到终端内时将捕获所有的输入包括ESC键",
"gui.oc2.computer.error.insufficient_memory": "内存不足",
"gui.oc2.computer.error.missing_cpu": "缺少CPU",
"gui.oc2.computer.error.missing_firmware": "丢失固件",
"gui.oc2.computer.error.not_enough_energy": "能量不足",
"gui.oc2.computer.error.unknown": "未知错误",
@@ -110,6 +111,7 @@
"subtitles.oc2.hdd": "硬盘:访问",
"tooltip.oc2.cancel": "取消",
"tooltip.oc2.confirm": "确认",
"tooltip.oc2.cpu_missing": "启动时需要CPU",
"tooltip.oc2.device_needs_reboot": "需要重启",
"tooltip.oc2.energy": "能量:%s",
"tooltip.oc2.energyConsumption": "能量使用:%s/t",

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "oc2:item/cpu_tier_1"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "oc2:item/cpu_tier_2"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "oc2:item/cpu_tier_3"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "oc2:item/cpu_tier_4"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -17,6 +17,10 @@
"oc2:network_interface_card",
"oc2:network_tunnel_card",
"oc2:network_tunnel_module",
"oc2:projector"
"oc2:projector",
"oc2:cpu_tier_1",
"oc2:cpu_tier_2",
"oc2:cpu_tier_3",
"oc2:cpu_tier_4"
]
}

View File

@@ -10,6 +10,7 @@
"#oc2:devices/flash_memory",
"#oc2:devices/card",
"#oc2:devices/robot_module",
"#oc2:devices/floppy"
"#oc2:devices/floppy",
"#oc2:devices/cpu"
]
}
}

View File

@@ -0,0 +1,9 @@
{
"replace": false,
"values": [
"oc2:cpu_tier_1",
"oc2:cpu_tier_2",
"oc2:cpu_tier_3",
"oc2:cpu_tier_4"
]
}