diff --git a/build.gradle b/build.gradle index eef3430..6651ceb 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ processResources { } tasks.withType(JavaCompile).configureEach { - it.options.release = 17 + it.options.release = 19 } java { diff --git a/src/main/java/net/brokenmoon/redcontrol/RedControl.java b/src/main/java/net/brokenmoon/redcontrol/RedControl.java index f716d67..0234cca 100644 --- a/src/main/java/net/brokenmoon/redcontrol/RedControl.java +++ b/src/main/java/net/brokenmoon/redcontrol/RedControl.java @@ -6,6 +6,7 @@ import net.brokenmoon.redcontrol.blocks.CpuBlock; import net.brokenmoon.redcontrol.blocks.DriveBlock; import net.brokenmoon.redcontrol.blocks.TerminalBlock; import net.brokenmoon.redcontrol.blocks.TerminalEntity; +import net.brokenmoon.redcontrol.item.BasicFloppy; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; @@ -43,7 +44,9 @@ public class RedControl implements ModInitializer { public static final CpuBlock CPU = new CpuBlock(FabricBlockSettings.create().strength(4.0f)); public static final TerminalBlock TERMINAL = new TerminalBlock(FabricBlockSettings.create().strength(4.0f)); public static final DriveBlock DRIVE = new DriveBlock(FabricBlockSettings.create().strength(4.0f)); + //Items + public static final BasicFloppy BASIC_FLOPPY = new BasicFloppy(new FabricItemSettings().maxCount(1)); //Block Entities public static final BlockEntityType CPU_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, modloc("cpu_block_entity"), FabricBlockEntityTypeBuilder.create(CpuEntity::new, CPU).build()); @@ -88,6 +91,7 @@ public class RedControl implements ModInitializer { Registry.register(Registries.ITEM, modloc("monitor"), new BlockItem(TERMINAL, new FabricItemSettings())); Registry.register(Registries.ITEM, modloc("disk_drive"), new BlockItem(DRIVE, new FabricItemSettings())); Registry.register(Registries.ITEM, modloc("squeaky_hammer"), SQUEAKY_HAMMER); + Registry.register(Registries.ITEM, modloc("basic_disk"), BASIC_FLOPPY); //Packets ServerPlayNetworking.registerGlobalReceiver(RedControlNetworking.CPU_START, ((server, player, handler, buf, responseSender) -> server.execute(() -> { diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/DriveEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/DriveEntity.java index 455b460..a82bad5 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/DriveEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/DriveEntity.java @@ -4,6 +4,10 @@ import com.simon816.j65el02.device.DiskDriver; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.api.DriveFactory; import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import java.net.URI; @@ -13,106 +17,137 @@ public class DriveEntity extends Peripheral{ private static final int SECTOR_SIZE = 0x80; - private final DiskDriver driver; - private final byte[] diskName = new byte[SECTOR_SIZE]; - private final byte[] diskSerial = new byte[SECTOR_SIZE]; - private final ByteBuffer buffer; + private DiskDriver driver = null; + private ByteBuffer buffer = null; private int sector; private int command; + private ItemStack disk = ItemStack.EMPTY; + public DriveEntity(BlockPos pos, BlockState state) { super(RedControl.DRIVE_BLOCK_ENTITY, pos, state, 2); - this.driver = DriveFactory.INSTANCE.createDriver(URI.create("img://basic.img"),"Basic","BASIC"); this.buffer = ByteBuffer.allocateDirect(SECTOR_SIZE); - byte[] name = driver.getDriveName(); - byte[] serial = driver.getDriveSerial(); - System.arraycopy(name, 0, this.diskName, 0, name.length); - System.arraycopy(serial, 0, this.diskSerial, 0, serial.length); } @Override public void write(int address, int data) { - switch (address) { - case 0x80: // Sector number (lo) - this.sector = (this.sector & 0xff00) | data; - break; - case 0x81: // Sector number (hi) - this.sector = (data << 8) | (this.sector & 0xff); - break; - case 0x82: // Disk command - this.command = data; - break; - default: // Disk sector buffer - if (address >= 0 && address <= 0x7f) { - this.buffer.put(address, (byte) data); - } + if(driver != null) { + switch (address) { + case 0x80: // Sector number (lo) + this.sector = (this.sector & 0xff00) | data; + break; + case 0x81: // Sector number (hi) + this.sector = (data << 8) | (this.sector & 0xff); + break; + case 0x82: // Disk command + this.command = data; + break; + default: // Disk sector buffer + if (address >= 0 && address <= 0x7f) { + this.buffer.put(address, (byte) data); + } + } } } @Override public int read(int address) { - switch (address) { - case 0x80: // Sector number (lo) - return this.sector & 0xff; - case 0x81: // Sector number (hi) - return (this.sector >> 8) & 0xff; - case 0x82: // Disk command - return this.command; - default: // Disk sector buffer - if (address >= 0 && address <= 0x7f) { - return this.buffer.get(address); - } - return 0; + if(driver != null) { + switch (address) { + case 0x80: // Sector number (lo) + return this.sector & 0xff; + case 0x81: // Sector number (hi) + return (this.sector >> 8) & 0xff; + case 0x82: // Disk command + return this.command; + default: // Disk sector buffer + if (address >= 0 && address <= 0x7f) { + return this.buffer.get(address); + } + return 0; + } } + return 0; } @Override public void update() { - try { - switch (this.command) { - case 0x01: // Read Disk Name - this.buffer.clear(); - this.buffer.put(this.diskName); - this.command = 0; - break; - case 0x02: // Write Disk Name - this.buffer.position(0); - this.buffer.get(this.diskName); - this.driver.writeDiskName(this.diskName); - this.command = 0; - break; - case 0x03: // Read Disk Serial - this.buffer.clear(); - this.buffer.put(this.diskSerial); - this.command = 0; - break; - case 0x04: // Read Disk Sector - if (this.sector >= 0x800) { - this.command = 0xff; + if(driver != null) { + try { + switch (this.command) { + case 0x01: // Read Disk Name + this.buffer.clear(); + this.buffer.put(driver.getDriveName()); + this.command = 0; break; - } - this.driver.seek(this.sector << 7); - this.buffer.position(0); - this.driver.read(this.buffer); - this.command = 0; - break; - case 0x05: // Write Disk Sector - if (this.sector >= 0x800) { - this.command = 0xff; + case 0x02: // Write Disk Name + this.buffer.position(0); + byte[] diskName = new byte[SECTOR_SIZE]; + this.buffer.get(diskName); + this.driver.writeDiskName(diskName); + this.command = 0; break; - } - this.driver.seek(this.sector << 7); - this.buffer.position(0); - this.driver.write(this.buffer); - this.command = 0; - break; + case 0x03: // Read Disk Serial + this.buffer.clear(); + this.buffer.put(driver.getDriveSerial()); + this.command = 0; + break; + case 0x04: // Read Disk Sector + if (this.sector >= 0x800) { + this.command = 0xff; + break; + } + this.driver.seek(this.sector << 7); + this.buffer.position(0); + this.driver.read(this.buffer); + this.command = 0; + break; + case 0x05: // Write Disk Sector + if (this.sector >= 0x800) { + this.command = 0xff; + break; + } + this.driver.seek(this.sector << 7); + this.buffer.position(0); + this.driver.write(this.buffer); + this.command = 0; + break; + } + } catch (Exception e) { + this.command = 0xff; + //e.printStackTrace(); } - } catch (Exception e) { - this.command = 0xff; - //e.printStackTrace(); } } + + public ActionResult onUse(PlayerEntity player, Hand hand) { + if(!world.isClient) { + if (disk == ItemStack.EMPTY) { + return loadDisk(player, hand); + } else if (player.getStackInHand(hand) == ItemStack.EMPTY) { + return ejectDisk(player, hand); + } + } + return ActionResult.PASS; + } + + private ActionResult ejectDisk(PlayerEntity player, Hand hand) { + RedControl.LOGGER.info("Trying to eject!"); + player.setStackInHand(hand, disk.copy()); + disk = ItemStack.EMPTY; + this.driver = null; + this.buffer = null; + return ActionResult.SUCCESS; + } + + private ActionResult loadDisk(PlayerEntity player, Hand hand) { + disk = player.getStackInHand(hand).copy(); + player.setStackInHand(hand, ItemStack.EMPTY); + this.driver = DriveFactory.INSTANCE.createDriver(URI.create(String.valueOf(disk.getNbt().get("uri"))), String.valueOf(disk.getName()),disk.getNbt().getString("serial")); + this.buffer = ByteBuffer.allocateDirect(SECTOR_SIZE); + return ActionResult.SUCCESS; + } } diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/DriveBlock.java b/src/main/java/net/brokenmoon/redcontrol/blocks/DriveBlock.java index b72745d..5f7e66f 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/DriveBlock.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/DriveBlock.java @@ -3,10 +3,12 @@ package net.brokenmoon.redcontrol.blocks; import com.mojang.serialization.MapCodec; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.blockentities.DriveEntity; +import net.brokenmoon.redcontrol.item.FloppyDisk; import net.minecraft.block.BlockState; import net.minecraft.block.BlockWithEntity; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; @@ -34,8 +36,12 @@ public class DriveBlock extends NetworkCarrier{ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (player.getStackInHand(hand).getItem() == RedControl.SQUEAKY_HAMMER) { return super.onUse(state,world,pos,player,hand,hit); - } else { - return ActionResult.SUCCESS; + } else if(player.getStackInHand(hand).getItem() instanceof FloppyDisk || player.getStackInHand(hand) == ItemStack.EMPTY){ + if(world.getBlockEntity(pos) instanceof DriveEntity){ + + return ((DriveEntity)world.getBlockEntity(pos)).onUse(player, hand); + } } + return ActionResult.PASS; } } diff --git a/src/main/java/net/brokenmoon/redcontrol/item/FloppyDisk.java b/src/main/java/net/brokenmoon/redcontrol/item/FloppyDisk.java index 960d158..c87b638 100644 --- a/src/main/java/net/brokenmoon/redcontrol/item/FloppyDisk.java +++ b/src/main/java/net/brokenmoon/redcontrol/item/FloppyDisk.java @@ -1,22 +1,19 @@ package net.brokenmoon.redcontrol.item; -import com.simon816.j65el02.device.DiskDriver; import net.minecraft.item.Item; +import net.minecraft.text.Text; public class FloppyDisk extends Item { public String uri; public String name; - public String serial; public FloppyDisk(Settings settings) { super(settings); } - public FloppyDisk(Settings settings, String uri, String name, String serial){ - this(settings); - this.uri = uri; - this.name = name; - this.serial = serial; + @Override + public Text getName() { + return Text.literal(name); } } diff --git a/src/main/resources/assets/redcontrol/textures/item/forth_floppy_disk.png b/src/main/resources/assets/redcontrol/textures/item/basic_floppy_disk.png similarity index 100% rename from src/main/resources/assets/redcontrol/textures/item/forth_floppy_disk.png rename to src/main/resources/assets/redcontrol/textures/item/basic_floppy_disk.png