Split up vm and rpc device packages.

This commit is contained in:
Florian Nücke
2022-02-05 15:09:33 +01:00
parent 6f7f0fa048
commit 814f9d37dd
51 changed files with 251 additions and 187 deletions

View File

@@ -18,7 +18,7 @@ import com.mojang.math.Matrix4f;
import com.mojang.math.Vector3f;
import li.cil.oc2.common.block.ProjectorBlock;
import li.cil.oc2.common.blockentity.ProjectorBlockEntity;
import li.cil.oc2.common.bus.device.vm.ProjectorVMDevice;
import li.cil.oc2.common.bus.device.vm.block.ProjectorDevice;
import li.cil.oc2.common.ext.MinecraftExt;
import li.cil.oc2.common.util.FakePlayerUtils;
import li.cil.oc2.jcodec.common.model.Picture;
@@ -427,7 +427,7 @@ public final class ProjectorDepthRenderer {
private static RenderInfo getRenderInfo(final ProjectorBlockEntity projector) {
try {
return RENDER_INFO.get(projector, () -> {
final DynamicTexture texture = new DynamicTexture(ProjectorVMDevice.WIDTH, ProjectorVMDevice.HEIGHT, false);
final DynamicTexture texture = new DynamicTexture(ProjectorDevice.WIDTH, ProjectorDevice.HEIGHT, false);
final RenderInfo renderInfo = new RenderInfo(texture);
projector.setFrameConsumer(renderInfo);
return renderInfo;
@@ -465,17 +465,17 @@ public final class ProjectorDepthRenderer {
// Convert in quads, based on the half resolution of UV. As such, skip every other row, since
// we're setting the current and the next.
int lumaIndex = 0, chromaIndex = 0;
for (int halfRow = 0; halfRow < ProjectorVMDevice.HEIGHT / 2; halfRow++, lumaIndex += ProjectorVMDevice.WIDTH * 2) {
for (int halfRow = 0; halfRow < ProjectorDevice.HEIGHT / 2; halfRow++, lumaIndex += ProjectorDevice.WIDTH * 2) {
final int row = halfRow * 2;
for (int halfCol = 0; halfCol < ProjectorVMDevice.WIDTH / 2; halfCol++, chromaIndex++) {
for (int halfCol = 0; halfCol < ProjectorDevice.WIDTH / 2; halfCol++, chromaIndex++) {
final int col = halfCol * 2;
final int yIndex = lumaIndex + col;
final byte cb = u[chromaIndex];
final byte cr = v[chromaIndex];
setFromYUV420(image, col, row, y[yIndex], cb, cr);
setFromYUV420(image, col + 1, row, y[yIndex + 1], cb, cr);
setFromYUV420(image, col, row + 1, y[yIndex + ProjectorVMDevice.WIDTH], cb, cr);
setFromYUV420(image, col + 1, row + 1, y[yIndex + ProjectorVMDevice.WIDTH + 1], cb, cr);
setFromYUV420(image, col, row + 1, y[yIndex + ProjectorDevice.WIDTH], cb, cr);
setFromYUV420(image, col + 1, row + 1, y[yIndex + ProjectorDevice.WIDTH + 1], cb, cr);
}
}

View File

@@ -2,51 +2,39 @@
package li.cil.oc2.common.blockentity;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.block.DiskDriveBlock;
import li.cil.oc2.common.bus.device.item.AbstractBlockDeviceVMDevice;
import li.cil.oc2.common.bus.device.vm.block.DiskDriveContainer;
import li.cil.oc2.common.bus.device.vm.block.DiskDriveDevice;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.container.TypedItemStackHandler;
import li.cil.oc2.common.item.FloppyItem;
import li.cil.oc2.common.network.Network;
import li.cil.oc2.common.network.message.DiskDriveFloppyMessage;
import li.cil.oc2.common.serialization.BlobStorage;
import li.cil.oc2.common.tags.ItemTags;
import li.cil.oc2.common.util.ItemStackUtils;
import li.cil.oc2.common.util.LocationSupplierUtils;
import li.cil.oc2.common.util.SoundEvents;
import li.cil.oc2.common.util.ThrottledSoundEmitter;
import li.cil.sedna.api.device.BlockDevice;
import li.cil.sedna.device.block.ByteBufferBlockDevice;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.time.Duration;
import java.util.concurrent.CompletableFuture;
public final class DiskDriveBlockEntity extends ModBlockEntity {
public final class DiskDriveBlockEntity extends ModBlockEntity implements DiskDriveContainer {
private static final String DATA_TAG_NAME = "data";
private static final ByteBufferBlockDevice EMPTY_BLOCK_DEVICE = ByteBufferBlockDevice.create(0, false);
///////////////////////////////////////////////////////////////////
private final DiskDriveItemStackHandler itemHandler = new DiskDriveItemStackHandler();
private final DiskDriveVMDevice device = new DiskDriveVMDevice();
private final DiskDriveDevice<DiskDriveBlockEntity> device = new DiskDriveDevice<>(this);
private final ThrottledSoundEmitter accessSoundEmitter;
private final ThrottledSoundEmitter insertSoundEmitter;
private final ThrottledSoundEmitter ejectSoundEmitter;
@@ -148,6 +136,16 @@ public final class DiskDriveBlockEntity extends ModBlockEntity {
itemHandler.deserializeNBT(tag.getCompound(Constants.ITEMS_TAG_NAME));
}
@Override
public ItemStack getDiskItemStack() {
return itemHandler.getStackInSlotRaw(0);
}
@Override
public void handleDataAccess() {
accessSoundEmitter.play();
}
///////////////////////////////////////////////////////////////////
private final class DiskDriveItemStackHandler extends TypedItemStackHandler {
@@ -223,87 +221,4 @@ public final class DiskDriveBlockEntity extends ModBlockEntity {
ItemStackUtils.getOrCreateModDataTag(stack).put(DATA_TAG_NAME, tag);
}
}
private final class DiskDriveVMDevice extends AbstractBlockDeviceVMDevice<BlockDevice, BlockEntity> {
public DiskDriveVMDevice() {
super(DiskDriveBlockEntity.this, false);
}
public void updateBlockDevice(final CompoundTag tag) {
joinOpenJob();
if (device == null) {
return;
}
try {
device.setBlock(EMPTY_BLOCK_DEVICE);
} catch (final IOException e) {
LOGGER.error(e);
}
if (blobHandle != null) {
BlobStorage.close(blobHandle);
blobHandle = null;
}
importFromItemStack(tag);
setOpenJob(createBlockDevice().thenAcceptAsync(blockDevice -> {
try {
device.setBlock(blockDevice);
} catch (final IOException e) {
throw new RuntimeException(e);
}
}, WORKERS));
}
public void removeBlockDevice() {
joinOpenJob();
if (device == null) {
return;
}
try {
device.setBlock(EMPTY_BLOCK_DEVICE);
} catch (final IOException e) {
LOGGER.error(e);
}
if (blobHandle != null) {
BlobStorage.close(blobHandle);
blobHandle = null;
}
}
@Override
protected CompletableFuture<BlockDevice> createBlockDevice() {
final ItemStack stack = itemHandler.getStackInSlotRaw(0);
if (stack.isEmpty() || !(stack.getItem() instanceof final FloppyItem floppy)) {
return CompletableFuture.completedFuture(EMPTY_BLOCK_DEVICE);
}
final int capacity = Mth.clamp(floppy.getCapacity(stack), 0, Config.maxFloppySize);
if (capacity <= 0) {
return CompletableFuture.completedFuture(EMPTY_BLOCK_DEVICE);
}
blobHandle = BlobStorage.validateHandle(blobHandle);
return CompletableFuture.supplyAsync(() -> {
try {
final FileChannel channel = BlobStorage.getOrOpen(blobHandle);
final MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, capacity);
return ByteBufferBlockDevice.wrap(buffer, false);
} catch (final IOException e) {
throw new RuntimeException(e);
}
}, WORKERS);
}
@Override
protected void handleDataAccess() {
accessSoundEmitter.play();
}
}
}

View File

@@ -2,7 +2,7 @@
package li.cil.oc2.common.blockentity;
import li.cil.oc2.common.bus.device.vm.KeyboardVMDevice;
import li.cil.oc2.common.bus.device.vm.block.KeyboardDevice;
import li.cil.oc2.common.capabilities.Capabilities;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@@ -11,7 +11,7 @@ import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
public final class KeyboardBlockEntity extends ModBlockEntity {
private final KeyboardVMDevice<BlockEntity> keyboardDevice = new KeyboardVMDevice<>(this);
private final KeyboardDevice<BlockEntity> keyboardDevice = new KeyboardDevice<>(this);
///////////////////////////////////////////////////////////////////

View File

@@ -4,7 +4,7 @@ package li.cil.oc2.common.blockentity;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.block.ProjectorBlock;
import li.cil.oc2.common.bus.device.vm.ProjectorVMDevice;
import li.cil.oc2.common.bus.device.vm.block.ProjectorDevice;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.energy.FixedEnergyStorage;
import li.cil.oc2.common.network.Network;
@@ -47,7 +47,7 @@ public final class ProjectorBlockEntity extends ModBlockEntity implements Tickab
public static final int MAX_RENDER_DISTANCE = 16;
public static final int MAX_GOOD_RENDER_DISTANCE = 12;
public static final int MAX_WIDTH = MAX_GOOD_RENDER_DISTANCE + 1; // +1 To make it odd, so we can center.
public static final int MAX_HEIGHT = (MAX_GOOD_RENDER_DISTANCE * ProjectorVMDevice.HEIGHT / ProjectorVMDevice.WIDTH) + 1; // + 1 To match horizontal margin.
public static final int MAX_HEIGHT = (MAX_GOOD_RENDER_DISTANCE * ProjectorDevice.HEIGHT / ProjectorDevice.WIDTH) + 1; // + 1 To match horizontal margin.
private static final String ENERGY_TAG_NAME = "energy";
private static final String IS_PROJECTING_TAG_NAME = "projecting";
@@ -61,10 +61,10 @@ public final class ProjectorBlockEntity extends ModBlockEntity implements Tickab
///////////////////////////////////////////////////////////////
private final ProjectorVMDevice projectorDevice = new ProjectorVMDevice(this);
private final ProjectorDevice projectorDevice = new ProjectorDevice(this);
private boolean isProjecting, hasEnergy;
private final FixedEnergyStorage energy = new FixedEnergyStorage(Config.projectorEnergyStorage);
private final Picture picture = Picture.create(ProjectorVMDevice.WIDTH, ProjectorVMDevice.HEIGHT, ColorSpace.YUV420J);
private final Picture picture = Picture.create(ProjectorDevice.WIDTH, ProjectorDevice.HEIGHT, ColorSpace.YUV420J);
// Video encoding.
private final H264Encoder encoder = new H264Encoder(new CQPRateControl(12));

View File

@@ -4,8 +4,9 @@ package li.cil.oc2.common.bus.device.provider;
import li.cil.oc2.api.bus.device.provider.BlockDeviceProvider;
import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider;
import li.cil.oc2.common.bus.device.provider.block.*;
import li.cil.oc2.common.bus.device.provider.block.BlockEntityCapabilityDeviceProvider;
import li.cil.oc2.common.bus.device.provider.item.*;
import li.cil.oc2.common.bus.device.rpc.block.*;
import li.cil.oc2.common.util.RegistryUtils;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.IForgeRegistry;
@@ -25,8 +26,8 @@ public final class Providers {
///////////////////////////////////////////////////////////////////
public static void initialize() {
BLOCK_DEVICE_PROVIDERS.register("block", BlockStateDeviceProvider::new);
BLOCK_DEVICE_PROVIDERS.register("block_entity", BlockEntityDeviceProvider::new);
BLOCK_DEVICE_PROVIDERS.register("block", BlockStateObjectDeviceProvider::new);
BLOCK_DEVICE_PROVIDERS.register("block_entity", BlockEntityObjectDeviceProvider::new);
BLOCK_DEVICE_PROVIDERS.register("block_entity/capability", BlockEntityCapabilityDeviceProvider::new);
BLOCK_DEVICE_PROVIDERS.register("energy_storage", EnergyStorageBlockDeviceProvider::new);

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.BlockOperationsModuleDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.rpc.item.BlockOperationsModuleDevice;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.item.Items;

View File

@@ -6,8 +6,8 @@ import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.api.capabilities.TerminalUserProvider;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.rpc.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.item.Items;
import net.minecraftforge.common.util.LazyOptional;

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.ByteBufferFlashMemoryVMDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.ByteBufferFlashStorageDevice;
import li.cil.oc2.common.item.FlashMemoryItem;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
@@ -26,6 +26,6 @@ public final class FlashMemoryItemDeviceProvider extends AbstractItemDeviceProvi
final FlashMemoryItem item = (FlashMemoryItem) stack.getItem();
final int capacity = Mth.clamp(item.getCapacity(stack), 0, Config.maxFlashMemorySize);
return Optional.of(new ByteBufferFlashMemoryVMDevice(stack, capacity));
return Optional.of(new ByteBufferFlashStorageDevice(stack, capacity));
}
}

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.data.Firmware;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.bus.device.item.FirmwareFlashMemoryVMDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.FirmwareFlashStorageDevice;
import li.cil.oc2.common.item.FlashMemoryWithExternalDataItem;
import net.minecraft.world.item.ItemStack;
@@ -29,6 +29,6 @@ public final class FlashMemoryWithExternalDataItemDeviceProvider extends Abstrac
return Optional.empty();
}
return Optional.of(new FirmwareFlashMemoryVMDevice(stack, firmware));
return Optional.of(new FirmwareFlashStorageDevice(stack, firmware));
}
}

View File

@@ -6,8 +6,8 @@ import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.bus.device.item.HardDriveVMDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.HardDriveDevice;
import li.cil.oc2.common.item.HardDriveItem;
import li.cil.oc2.common.util.LocationSupplierUtils;
import net.minecraft.nbt.CompoundTag;
@@ -27,14 +27,14 @@ public final class HardDriveItemDeviceProvider extends AbstractItemDeviceProvide
@Override
public void unmount(@Nullable final ItemDeviceQuery query, final CompoundTag tag) {
super.unmount(query, tag);
HardDriveVMDevice.unmount(tag);
HardDriveDevice.unmount(tag);
}
///////////////////////////////////////////////////////////////////
@Override
protected Optional<ItemDevice> getItemDevice(final ItemDeviceQuery query) {
return Optional.of(new HardDriveVMDevice(query.getItemStack(), getCapacity(query), false, LocationSupplierUtils.of(query)));
return Optional.of(new HardDriveDevice(query.getItemStack(), getCapacity(query), false, LocationSupplierUtils.of(query)));
}
@Override

View File

@@ -7,8 +7,8 @@ import li.cil.oc2.api.bus.device.data.BlockDeviceData;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.bus.device.item.HardDriveVMDeviceWithInitialData;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.HardDriveDeviceWithInitialData;
import li.cil.oc2.common.item.HardDriveWithExternalDataItem;
import li.cil.oc2.common.util.LocationSupplierUtils;
import net.minecraft.nbt.CompoundTag;
@@ -27,7 +27,7 @@ public final class HardDriveWithExternalDataItemDeviceProvider extends AbstractI
@Override
public void unmount(@Nullable final ItemDeviceQuery query, final CompoundTag tag) {
super.unmount(query, tag);
HardDriveVMDeviceWithInitialData.unmount(tag);
HardDriveDeviceWithInitialData.unmount(tag);
}
///////////////////////////////////////////////////////////////////
@@ -41,7 +41,7 @@ public final class HardDriveWithExternalDataItemDeviceProvider extends AbstractI
return Optional.empty();
}
return Optional.of(new HardDriveVMDeviceWithInitialData(stack, data.getBlockDevice(), false, LocationSupplierUtils.of(query)));
return Optional.of(new HardDriveDeviceWithInitialData(stack, data.getBlockDevice(), false, LocationSupplierUtils.of(query)));
}
@Override

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.InventoryOperationsModuleDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.rpc.item.InventoryOperationsModuleDevice;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.item.Items;

View File

@@ -6,8 +6,8 @@ import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.Constants;
import li.cil.oc2.common.bus.device.item.MemoryDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.MemoryDevice;
import li.cil.oc2.common.item.MemoryItem;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.NetworkInterfaceCardItemDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.NetworkInterfaceCardDevice;
import li.cil.oc2.common.item.Items;
import java.util.Optional;
@@ -20,7 +20,7 @@ public final class NetworkInterfaceCardItemDeviceProvider extends AbstractItemDe
@Override
protected Optional<ItemDevice> getItemDevice(final ItemDeviceQuery query) {
return Optional.of(new NetworkInterfaceCardItemDevice(query.getItemStack()));
return Optional.of(new NetworkInterfaceCardDevice(query.getItemStack()));
}
@Override

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.NetworkTunnelItemDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.NetworkTunnelDevice;
import li.cil.oc2.common.item.Items;
import java.util.Optional;
@@ -20,7 +20,7 @@ public final class NetworkTunnelCardItemDeviceProvider extends AbstractItemDevic
@Override
protected Optional<ItemDevice> getItemDevice(final ItemDeviceQuery query) {
return Optional.of(new NetworkTunnelItemDevice(query.getItemStack()));
return Optional.of(new NetworkTunnelDevice(query.getItemStack()));
}
@Override

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.NetworkTunnelItemDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.vm.item.NetworkTunnelDevice;
import li.cil.oc2.common.item.Items;
import java.util.Optional;
@@ -20,7 +20,7 @@ public final class NetworkTunnelModuleItemDeviceProvider extends AbstractItemDev
@Override
protected Optional<ItemDevice> getItemDevice(final ItemDeviceQuery query) {
return Optional.of(new NetworkTunnelItemDevice(query.getItemStack()));
return Optional.of(new NetworkTunnelDevice(query.getItemStack()));
}
@Override

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.RedstoneInterfaceCardItemDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.rpc.item.RedstoneInterfaceCardItemDevice;
import li.cil.oc2.common.item.Items;
import java.util.Optional;

View File

@@ -5,8 +5,8 @@ package li.cil.oc2.common.bus.device.provider.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.item.SoundCardItemDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.rpc.item.SoundCardItemDevice;
import li.cil.oc2.common.item.Items;
import li.cil.oc2.common.util.LocationSupplierUtils;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.provider.block;
package li.cil.oc2.common.bus.device.rpc.block;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.Callbacks;
@@ -10,7 +10,7 @@ import li.cil.oc2.api.util.Invalidatable;
import li.cil.oc2.common.bus.device.provider.util.AbstractBlockEntityDeviceProvider;
import net.minecraft.world.level.block.entity.BlockEntity;
public final class BlockEntityDeviceProvider extends AbstractBlockEntityDeviceProvider<BlockEntity> {
public final class BlockEntityObjectDeviceProvider extends AbstractBlockEntityDeviceProvider<BlockEntity> {
@Override
public Invalidatable<Device> getBlockDevice(final BlockDeviceQuery query, final BlockEntity blockEntity) {
if (Callbacks.hasMethods(blockEntity)) {

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.provider.block;
package li.cil.oc2.common.bus.device.rpc.block;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.Callbacks;
@@ -13,7 +13,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
public final class BlockStateDeviceProvider extends AbstractBlockDeviceProvider {
public final class BlockStateObjectDeviceProvider extends AbstractBlockDeviceProvider {
@Override
public Invalidatable<Device> getDevice(final BlockDeviceQuery query) {
final Level level = query.getLevel();

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.provider.block;
package li.cil.oc2.common.bus.device.rpc.block;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.ObjectDevice;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.provider.block;
package li.cil.oc2.common.bus.device.rpc.block;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.ObjectDevice;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.provider.block;
package li.cil.oc2.common.bus.device.rpc.block;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.ObjectDevice;

View File

@@ -0,0 +1,9 @@
/* SPDX-License-Identifier: MIT */
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package li.cil.oc2.common.bus.device.rpc.block;
import net.minecraft.MethodsReturnNonnullByDefault;
import javax.annotation.ParametersAreNonnullByDefault;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.rpc.item;
import li.cil.oc2.api.bus.device.DeviceContainer;
import li.cil.oc2.api.bus.device.ItemDevice;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.rpc.item;
import li.cil.oc2.api.bus.device.object.Callback;
import li.cil.oc2.api.bus.device.object.Parameter;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.rpc.item;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import li.cil.oc2.api.bus.device.object.Callback;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.rpc.item;
import li.cil.oc2.api.bus.device.object.Callback;
import li.cil.oc2.api.bus.device.object.Parameter;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.rpc.item;
import li.cil.oc2.api.bus.device.object.Callback;
import li.cil.oc2.api.bus.device.object.DocumentedDevice;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.rpc.item;
import li.cil.oc2.api.bus.device.object.Callback;
import li.cil.oc2.api.bus.device.object.Parameter;

View File

@@ -0,0 +1,9 @@
/* SPDX-License-Identifier: MIT */
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package li.cil.oc2.common.bus.device.rpc.item;
import net.minecraft.MethodsReturnNonnullByDefault;
import javax.annotation.ParametersAreNonnullByDefault;

View File

@@ -0,0 +1,11 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.vm.block;
import net.minecraft.world.item.ItemStack;
public interface DiskDriveContainer {
ItemStack getDiskItemStack();
void handleDataAccess();
}

View File

@@ -0,0 +1,110 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.vm.block;
import li.cil.oc2.common.Config;
import li.cil.oc2.common.bus.device.vm.item.AbstractBlockStorageDevice;
import li.cil.oc2.common.item.FloppyItem;
import li.cil.oc2.common.serialization.BlobStorage;
import li.cil.sedna.api.device.BlockDevice;
import li.cil.sedna.device.block.ByteBufferBlockDevice;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.concurrent.CompletableFuture;
public final class DiskDriveDevice<T extends BlockEntity & DiskDriveContainer> extends AbstractBlockStorageDevice<BlockDevice, T> {
private static final ByteBufferBlockDevice EMPTY_BLOCK_DEVICE = ByteBufferBlockDevice.create(0, false);
///////////////////////////////////////////////////////////////
public DiskDriveDevice(final T container) {
super(container, false);
}
///////////////////////////////////////////////////////////////
public void updateBlockDevice(final CompoundTag tag) {
joinOpenJob();
if (device == null) {
return;
}
try {
device.setBlock(EMPTY_BLOCK_DEVICE);
} catch (final IOException e) {
LOGGER.error(e);
}
if (blobHandle != null) {
BlobStorage.close(blobHandle);
blobHandle = null;
}
importFromItemStack(tag);
setOpenJob(createBlockDevice().thenAcceptAsync(blockDevice -> {
try {
device.setBlock(blockDevice);
} catch (final IOException e) {
throw new RuntimeException(e);
}
}, WORKERS));
}
public void removeBlockDevice() {
joinOpenJob();
if (device == null) {
return;
}
try {
device.setBlock(EMPTY_BLOCK_DEVICE);
} catch (final IOException e) {
LOGGER.error(e);
}
if (blobHandle != null) {
BlobStorage.close(blobHandle);
blobHandle = null;
}
}
///////////////////////////////////////////////////////////////
@Override
protected CompletableFuture<BlockDevice> createBlockDevice() {
final ItemStack stack = identity.getDiskItemStack();
if (stack.isEmpty() || !(stack.getItem() instanceof final FloppyItem floppy)) {
return CompletableFuture.completedFuture(EMPTY_BLOCK_DEVICE);
}
final int capacity = Mth.clamp(floppy.getCapacity(stack), 0, Config.maxFloppySize);
if (capacity <= 0) {
return CompletableFuture.completedFuture(EMPTY_BLOCK_DEVICE);
}
blobHandle = BlobStorage.validateHandle(blobHandle);
return CompletableFuture.supplyAsync(() -> {
try {
final FileChannel channel = BlobStorage.getOrOpen(blobHandle);
final MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, capacity);
return ByteBufferBlockDevice.wrap(buffer, false);
} catch (final IOException e) {
throw new RuntimeException(e);
}
}, WORKERS);
}
@Override
protected void handleDataAccess() {
identity.handleDataAccess();
}
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.vm;
package li.cil.oc2.common.bus.device.vm.block;
import li.cil.oc2.api.bus.device.vm.VMDevice;
import li.cil.oc2.api.bus.device.vm.VMDeviceLoadResult;
@@ -16,7 +16,7 @@ import net.minecraft.nbt.CompoundTag;
import javax.annotation.Nullable;
public final class KeyboardVMDevice<T> extends IdentityProxy<T> implements VMDevice {
public final class KeyboardDevice<T> extends IdentityProxy<T> implements VMDevice {
private static final String DEVICE_TAG_NAME = "device";
private static final String ADDRESS_TAG_NAME = "address";
private static final String INTERRUPT_TAG_NAME = "interrupt";
@@ -33,7 +33,7 @@ public final class KeyboardVMDevice<T> extends IdentityProxy<T> implements VMDev
///////////////////////////////////////////////////////////////
public KeyboardVMDevice(final T identity) {
public KeyboardDevice(final T identity) {
super(identity);
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.vm;
package li.cil.oc2.common.bus.device.vm.block;
import li.cil.oc2.api.bus.device.vm.VMDevice;
import li.cil.oc2.api.bus.device.vm.VMDeviceLoadResult;
@@ -21,7 +21,7 @@ import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.UUID;
public final class ProjectorVMDevice extends IdentityProxy<ProjectorBlockEntity> implements VMDevice {
public final class ProjectorDevice extends IdentityProxy<ProjectorBlockEntity> implements VMDevice {
private static final String ADDRESS_TAG_NAME = "address";
private static final String BLOB_HANDLE_TAG_NAME = "blob";
@@ -40,7 +40,7 @@ public final class ProjectorVMDevice extends IdentityProxy<ProjectorBlockEntity>
///////////////////////////////////////////////////////////////
public ProjectorVMDevice(final ProjectorBlockEntity identity) {
public ProjectorDevice(final ProjectorBlockEntity identity) {
super(identity);
}

View File

@@ -0,0 +1,9 @@
/* SPDX-License-Identifier: MIT */
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package li.cil.oc2.common.bus.device.vm.block;
import net.minecraft.MethodsReturnNonnullByDefault;
import javax.annotation.ParametersAreNonnullByDefault;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import com.google.common.eventbus.Subscribe;
import li.cil.oc2.api.bus.device.ItemDevice;
@@ -32,7 +32,7 @@ import java.util.concurrent.CompletionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public abstract class AbstractBlockDeviceVMDevice<TBlock extends BlockDevice, TIdentity> extends IdentityProxy<TIdentity> implements VMDevice, ItemDevice {
public abstract class AbstractBlockStorageDevice<TBlock extends BlockDevice, TIdentity> extends IdentityProxy<TIdentity> implements VMDevice, ItemDevice {
protected static final Logger LOGGER = LogManager.getLogger();
private static final String DEVICE_TAG_NAME = "device";
@@ -64,7 +64,7 @@ public abstract class AbstractBlockDeviceVMDevice<TBlock extends BlockDevice, TI
///////////////////////////////////////////////////////////////
protected AbstractBlockDeviceVMDevice(final TIdentity identity, final boolean readonly) {
protected AbstractBlockStorageDevice(final TIdentity identity, final boolean readonly) {
super(identity);
this.readonly = readonly;
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.vm.VMDevice;
@@ -24,7 +24,7 @@ import net.minecraftforge.common.util.LazyOptional;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public abstract class AbstractNetworkInterfaceItemDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, ICapabilityProvider {
public abstract class AbstractNetworkInterfaceDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, ICapabilityProvider {
private static final String DEVICE_TAG_NAME = "device";
private static final String ADDRESS_TAG_NAME = "address";
private static final String INTERRUPT_TAG_NAME = "interrupt";
@@ -41,7 +41,7 @@ public abstract class AbstractNetworkInterfaceItemDevice extends IdentityProxy<I
///////////////////////////////////////////////////////////////
protected AbstractNetworkInterfaceItemDevice(final ItemStack identity) {
protected AbstractNetworkInterfaceDevice(final ItemStack identity) {
super(identity);
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import com.google.common.eventbus.Subscribe;
import li.cil.oc2.api.bus.device.ItemDevice;
@@ -23,7 +23,7 @@ import net.minecraft.world.item.ItemStack;
import java.nio.ByteBuffer;
public final class ByteBufferFlashMemoryVMDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, FirmwareLoader {
public final class ByteBufferFlashStorageDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, FirmwareLoader {
public static final String DATA_TAG_NAME = "data";
///////////////////////////////////////////////////////////////
@@ -41,7 +41,7 @@ public final class ByteBufferFlashMemoryVMDevice extends IdentityProxy<ItemStack
///////////////////////////////////////////////////////////////
public ByteBufferFlashMemoryVMDevice(final ItemStack identity, final int size) {
public ByteBufferFlashStorageDevice(final ItemStack identity, final int size) {
super(identity);
this.size = size;
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import com.google.common.eventbus.Subscribe;
import li.cil.oc2.api.bus.device.ItemDevice;
@@ -17,13 +17,13 @@ import li.cil.sedna.api.memory.MemoryMap;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.item.ItemStack;
public final class FirmwareFlashMemoryVMDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, FirmwareLoader {
public final class FirmwareFlashStorageDevice extends IdentityProxy<ItemStack> implements VMDevice, ItemDevice, FirmwareLoader {
private final Firmware firmware;
private MemoryMap memoryMap;
///////////////////////////////////////////////////////////////
public FirmwareFlashMemoryVMDevice(final ItemStack identity, final Firmware firmware) {
public FirmwareFlashStorageDevice(final ItemStack identity, final Firmware firmware) {
super(identity);
this.firmware = firmware;
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import li.cil.oc2.common.serialization.BlobStorage;
import li.cil.oc2.common.util.Location;
@@ -17,13 +17,13 @@ import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
public class HardDriveVMDevice extends AbstractBlockDeviceVMDevice<ByteBufferBlockDevice, ItemStack> {
public class HardDriveDevice extends AbstractBlockStorageDevice<ByteBufferBlockDevice, ItemStack> {
private final int size;
private final ThrottledSoundEmitter soundEmitter;
///////////////////////////////////////////////////////////////////
public HardDriveVMDevice(final ItemStack identity, final int size, final boolean readonly, final Supplier<Optional<Location>> location) {
public HardDriveDevice(final ItemStack identity, final int size, final boolean readonly, final Supplier<Optional<Location>> location) {
super(identity, readonly);
this.size = size;
this.soundEmitter = new ThrottledSoundEmitter(location, SoundEvents.HDD_ACCESS.get())

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import com.google.common.io.ByteStreams;
import li.cil.oc2.common.util.Location;
@@ -15,12 +15,12 @@ import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
public final class HardDriveVMDeviceWithInitialData extends HardDriveVMDevice {
public final class HardDriveDeviceWithInitialData extends HardDriveDevice {
private final BlockDevice base;
///////////////////////////////////////////////////////////////////
public HardDriveVMDeviceWithInitialData(final ItemStack identity, final BlockDevice base, final boolean readonly, final Supplier<Optional<Location>> location) {
public HardDriveDeviceWithInitialData(final ItemStack identity, final BlockDevice base, final boolean readonly, final Supplier<Optional<Location>> location) {
super(identity, (int) base.getCapacity(), readonly, location);
this.base = base;
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import li.cil.oc2.api.bus.device.ItemDevice;
import li.cil.oc2.api.bus.device.vm.VMDevice;

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import li.cil.oc2.common.item.NetworkInterfaceCardItem;
import net.minecraft.core.Direction;
@@ -11,8 +11,8 @@ import net.minecraftforge.common.util.LazyOptional;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public final class NetworkInterfaceCardItemDevice extends AbstractNetworkInterfaceItemDevice {
public NetworkInterfaceCardItemDevice(final ItemStack identity) {
public final class NetworkInterfaceCardDevice extends AbstractNetworkInterfaceDevice {
public NetworkInterfaceCardDevice(final ItemStack identity) {
super(identity);
}

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: MIT */
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
@@ -23,8 +23,8 @@ import org.jetbrains.annotations.Nullable;
import java.time.Duration;
import java.util.*;
public final class NetworkTunnelItemDevice extends AbstractNetworkInterfaceItemDevice {
public NetworkTunnelItemDevice(final ItemStack identity) {
public final class NetworkTunnelDevice extends AbstractNetworkInterfaceDevice {
public NetworkTunnelDevice(final ItemStack identity) {
super(identity);
}

View File

@@ -2,7 +2,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package li.cil.oc2.common.bus.device.item;
package li.cil.oc2.common.bus.device.vm.item;
import net.minecraft.MethodsReturnNonnullByDefault;

View File

@@ -3,7 +3,7 @@
package li.cil.oc2.common.item;
import li.cil.oc2.api.API;
import li.cil.oc2.common.bus.device.item.ByteBufferFlashMemoryVMDevice;
import li.cil.oc2.common.bus.device.vm.item.ByteBufferFlashStorageDevice;
import li.cil.oc2.common.util.NBTTagIds;
import net.minecraft.Util;
import net.minecraft.nbt.CompoundTag;
@@ -25,7 +25,7 @@ public final class FlashMemoryItem extends AbstractStorageItem {
public CompoundTag getShareTag(final ItemStack stack) {
final CompoundTag tag = super.getShareTag(stack);
if (tag != null && tag.contains(API.MOD_ID, NBTTagIds.TAG_COMPOUND)) {
tag.getCompound(API.MOD_ID).remove(ByteBufferFlashMemoryVMDevice.DATA_TAG_NAME);
tag.getCompound(API.MOD_ID).remove(ByteBufferFlashStorageDevice.DATA_TAG_NAME);
}
return tag;
}

View File

@@ -2,7 +2,7 @@
package li.cil.oc2.common.network.message;
import li.cil.oc2.common.bus.device.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.bus.device.rpc.item.FileImportExportCardItemDevice;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;

View File

@@ -2,7 +2,7 @@
package li.cil.oc2.common.network.message;
import li.cil.oc2.common.bus.device.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.bus.device.rpc.item.FileImportExportCardItemDevice;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;

View File

@@ -3,7 +3,7 @@
package li.cil.oc2.common.network.message;
import li.cil.oc2.client.gui.FileChooserScreen;
import li.cil.oc2.common.bus.device.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.bus.device.rpc.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.network.Network;
import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf;

View File

@@ -2,7 +2,7 @@
package li.cil.oc2.common.network.message;
import li.cil.oc2.common.bus.device.item.FileImportExportCardItemDevice;
import li.cil.oc2.common.bus.device.rpc.item.FileImportExportCardItemDevice;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;