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 071af682..bef0a06e 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 @@ -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(); } 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 5ab8c79c..e8814e5c 100644 --- a/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java +++ b/src/main/java/li/cil/oc2/client/gui/AbstractMachineInventoryScreen.java @@ -128,6 +128,7 @@ public abstract class AbstractMachineInventoryScreen { if (slot == hoveredSlot) { - //TooltipUtils.drawTooltip(graphics, Collections.singletonList(tooltip), mouseX, mouseY); + TooltipUtils.drawTooltip(graphics, Collections.singletonList(tooltip), mouseX, mouseY); } }); } diff --git a/src/main/java/li/cil/oc2/client/renderer/blockentity/DiskDriveRenderer.java b/src/main/java/li/cil/oc2/client/renderer/blockentity/DiskDriveRenderer.java index ebf37528..a1cf4be2 100644 --- a/src/main/java/li/cil/oc2/client/renderer/blockentity/DiskDriveRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/blockentity/DiskDriveRenderer.java @@ -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 { + if(itemHandler.getSlots() > 0) { + addSlot(new DeviceTypeSlotItemHandler(itemHandler, DeviceTypes.CPU, 0, 64, 52)); + } + }); + createPlayerInventoryAndHotbarSlots(player.getInventory(), 8, 115); } } diff --git a/src/main/java/li/cil/oc2/common/item/CPUItem.java b/src/main/java/li/cil/oc2/common/item/CPUItem.java new file mode 100644 index 00000000..a125cbbd --- /dev/null +++ b/src/main/java/li/cil/oc2/common/item/CPUItem.java @@ -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; + } +} diff --git a/src/main/java/li/cil/oc2/common/item/ItemGroup.java b/src/main/java/li/cil/oc2/common/item/ItemGroup.java index 4a1ffb7f..110e5ca9 100644 --- a/src/main/java/li/cil/oc2/common/item/ItemGroup.java +++ b/src/main/java/li/cil/oc2/common/item/ItemGroup.java @@ -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()); 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 3eb2acde..7195b8d0 100644 --- a/src/main/java/li/cil/oc2/common/item/Items.java +++ b/src/main/java/li/cil/oc2/common/item/Items.java @@ -68,6 +68,15 @@ public final class Items { public static final RegistryObject HARD_DRIVE_CUSTOM = register("hard_drive_custom", () -> new HardDriveWithExternalDataItem(BlockDeviceDataRegistry.BUILDROOT.getId(), DyeColor.BROWN)); + public static final RegistryObject CPU_TIER_1 = register("cpu_tier_1", () -> + new CPUItem(25_000_000)); + public static final RegistryObject CPU_TIER_2 = register("cpu_tier_2", () -> + new CPUItem(50_000_000)); + public static final RegistryObject CPU_TIER_3 = register("cpu_tier_3", () -> + new CPUItem(100_000_000)); + public static final RegistryObject CPU_TIER_4 = register("cpu_tier_4", () -> + new CPUItem(200_000_000)); + public static final RegistryObject FLASH_MEMORY = register("flash_memory", () -> new FlashMemoryItem(12 * Constants.MEGABYTE)); public static final RegistryObject FLASH_MEMORY_CUSTOM = register("flash_memory_custom", () -> diff --git a/src/main/java/li/cil/oc2/common/tags/ItemTags.java b/src/main/java/li/cil/oc2/common/tags/ItemTags.java index 353a1412..bf56a8b7 100644 --- a/src/main/java/li/cil/oc2/common/tags/ItemTags.java +++ b/src/main/java/li/cil/oc2/common/tags/ItemTags.java @@ -18,6 +18,7 @@ public final class ItemTags { public static final TagKey DEVICES_ROBOT_MODULE = tag("devices/robot_module"); public static final TagKey DEVICES_FLOPPY = tag("devices/floppy"); public static final TagKey DEVICES_NETWORK_TUNNEL = tag("devices/network_tunnel"); + public static final TagKey DEVICES_CPU = tag("devices/cpu"); public static final TagKey CABLES = tag("cables"); public static final TagKey WRENCHES = tag("wrenches"); 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 e2b6b9c8..9a66d250 100644 --- a/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java +++ b/src/main/java/li/cil/oc2/common/vm/AbstractVirtualMachine.java @@ -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); } 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 e81da735..866d24af 100644 --- a/src/main/java/li/cil/oc2/common/vm/VMRunner.java +++ b/src/main/java/li/cil/oc2/common/vm/VMRunner.java @@ -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; } } diff --git a/src/main/java/li/cil/oc2/data/ModItemModelProvider.java b/src/main/java/li/cil/oc2/data/ModItemModelProvider.java index b91522ac..d1cf7e70 100644 --- a/src/main/java/li/cil/oc2/data/ModItemModelProvider.java +++ b/src/main/java/li/cil/oc2/data/ModItemModelProvider.java @@ -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") diff --git a/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java b/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java index 42c514e8..733e3567 100644 --- a/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java +++ b/src/main/java/li/cil/oc2/data/ModItemTagsProvider.java @@ -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() + ); } } diff --git a/src/main/resources/assets/oc2/lang/en_us.json b/src/main/resources/assets/oc2/lang/en_us.json index 63fc4860..58653aa9 100644 --- a/src/main/resources/assets/oc2/lang/en_us.json +++ b/src/main/resources/assets/oc2/lang/en_us.json @@ -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", diff --git a/src/main/resources/assets/oc2/lang/ru_ru.json b/src/main/resources/assets/oc2/lang/ru_ru.json index 8b854f45..3142dabc 100644 --- a/src/main/resources/assets/oc2/lang/ru_ru.json +++ b/src/main/resources/assets/oc2/lang/ru_ru.json @@ -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", diff --git a/src/main/resources/assets/oc2/lang/zh_cn.json b/src/main/resources/assets/oc2/lang/zh_cn.json index 51ca918b..5a027e27 100644 --- a/src/main/resources/assets/oc2/lang/zh_cn.json +++ b/src/main/resources/assets/oc2/lang/zh_cn.json @@ -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", diff --git a/src/main/resources/assets/oc2/models/item/cpu_tier_1.json b/src/main/resources/assets/oc2/models/item/cpu_tier_1.json new file mode 100644 index 00000000..54a9a303 --- /dev/null +++ b/src/main/resources/assets/oc2/models/item/cpu_tier_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "oc2:item/cpu_tier_1" + } +} diff --git a/src/main/resources/assets/oc2/models/item/cpu_tier_2.json b/src/main/resources/assets/oc2/models/item/cpu_tier_2.json new file mode 100644 index 00000000..4c001339 --- /dev/null +++ b/src/main/resources/assets/oc2/models/item/cpu_tier_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "oc2:item/cpu_tier_2" + } +} diff --git a/src/main/resources/assets/oc2/models/item/cpu_tier_3.json b/src/main/resources/assets/oc2/models/item/cpu_tier_3.json new file mode 100644 index 00000000..9a311dc9 --- /dev/null +++ b/src/main/resources/assets/oc2/models/item/cpu_tier_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "oc2:item/cpu_tier_3" + } +} diff --git a/src/main/resources/assets/oc2/models/item/cpu_tier_4.json b/src/main/resources/assets/oc2/models/item/cpu_tier_4.json new file mode 100644 index 00000000..e38ee80e --- /dev/null +++ b/src/main/resources/assets/oc2/models/item/cpu_tier_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "oc2:item/cpu_tier_4" + } +} diff --git a/src/main/resources/assets/oc2/textures/gui/widget/computer_container.png b/src/main/resources/assets/oc2/textures/gui/widget/computer_container.png index 08cd17c4..5d063561 100644 Binary files a/src/main/resources/assets/oc2/textures/gui/widget/computer_container.png and b/src/main/resources/assets/oc2/textures/gui/widget/computer_container.png differ diff --git a/src/main/resources/data/oc2/tags/items/device_needs_reboot.json b/src/main/resources/data/oc2/tags/items/device_needs_reboot.json index d049cbb8..50ec87fa 100644 --- a/src/main/resources/data/oc2/tags/items/device_needs_reboot.json +++ b/src/main/resources/data/oc2/tags/items/device_needs_reboot.json @@ -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" ] } diff --git a/src/main/resources/data/oc2/tags/items/devices.json b/src/main/resources/data/oc2/tags/items/devices.json index 54632988..bc44270c 100644 --- a/src/main/resources/data/oc2/tags/items/devices.json +++ b/src/main/resources/data/oc2/tags/items/devices.json @@ -10,6 +10,7 @@ "#oc2:devices/flash_memory", "#oc2:devices/card", "#oc2:devices/robot_module", - "#oc2:devices/floppy" + "#oc2:devices/floppy", + "#oc2:devices/cpu" ] -} \ No newline at end of file +} diff --git a/src/main/resources/data/oc2/tags/items/devices/cpu.json b/src/main/resources/data/oc2/tags/items/devices/cpu.json new file mode 100644 index 00000000..0abfb014 --- /dev/null +++ b/src/main/resources/data/oc2/tags/items/devices/cpu.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "oc2:cpu_tier_1", + "oc2:cpu_tier_2", + "oc2:cpu_tier_3", + "oc2:cpu_tier_4" + ] +}