diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/DiskDriveNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/DiskDriveNetworkNode.java index 4e4bc39da..5ff91e0e3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/DiskDriveNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/DiskDriveNetworkNode.java @@ -34,6 +34,26 @@ import java.util.List; import java.util.function.Predicate; public class DiskDriveNetworkNode extends NetworkNode implements IStorageScreen, IStorageProvider, IComparable, IWhitelistBlacklist, IPrioritizable, IType, IAccessType, IStorageDiskContainerContext { + public enum DiskState { + NONE, + NORMAL, + DISCONNECTED, + NEAR_CAPACITY, + FULL; + + public static final int DISK_NEAR_CAPACITY_THRESHOLD = 75; + + public static DiskState get(int stored, int capacity) { + if (stored == capacity) { + return FULL; + } else if ((int) ((float) stored / (float) capacity * 100F) >= DISK_NEAR_CAPACITY_THRESHOLD) { + return NEAR_CAPACITY; + } else { + return NORMAL; + } + } + } + public static final Predicate VALIDATOR_STORAGE_DISK = s -> s.getItem() instanceof IStorageDiskProvider && ((IStorageDiskProvider) s.getItem()).isValid(s); public static final String ID = "disk_drive"; @@ -339,6 +359,29 @@ public class DiskDriveNetworkNode extends NetworkNode implements IStorageScreen, } } + public DiskState[] getDiskState() { + DiskState[] diskStates = new DiskState[8]; + + for (int i = 0; i < 8; ++i) { + DiskState state = DiskState.NONE; + + if (itemDisks[i] != null || fluidDisks[i] != null) { + if (network == null) { + state = DiskState.DISCONNECTED; + } else { + state = DiskState.get( + itemDisks[i] != null ? itemDisks[i].getStored() : fluidDisks[i].getStored(), + itemDisks[i] != null ? itemDisks[i].getCapacity() : fluidDisks[i].getCapacity() + ); + } + } + + diskStates[i] = state; + } + + return diskStates; + } + public IItemHandler getDisks() { return disks; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java index d5379c47b..0585ff53a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java @@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskListener; import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.render.constants.ConstantsDisk; import com.raoulvdberge.refinedstorage.tile.config.IWhitelistBlacklist; import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.nbt.CompoundNBT; @@ -19,14 +18,14 @@ import java.util.Collection; public class StorageDiskFluidDriveWrapper implements IStorageDisk { private DiskDriveNetworkNode diskDrive; private IStorageDisk parent; - private int lastState; + private DiskDriveNetworkNode.DiskState lastState; public StorageDiskFluidDriveWrapper(DiskDriveNetworkNode diskDrive, IStorageDisk parent) { this.diskDrive = diskDrive; this.parent = parent; this.setSettings( () -> { - int currentState = ConstantsDisk.getDiskState(getStored(), getCapacity()); + DiskDriveNetworkNode.DiskState currentState = DiskDriveNetworkNode.DiskState.get(getStored(), getCapacity()); if (this.lastState != currentState) { this.lastState = currentState; @@ -36,7 +35,7 @@ public class StorageDiskFluidDriveWrapper implements IStorageDisk { }, diskDrive ); - this.lastState = ConstantsDisk.getDiskState(getStored(), getCapacity()); + this.lastState = DiskDriveNetworkNode.DiskState.get(getStored(), getCapacity()); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskItemDriveWrapper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskItemDriveWrapper.java index 57a1cede7..f95330c94 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskItemDriveWrapper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskItemDriveWrapper.java @@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskListener; import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.render.constants.ConstantsDisk; import com.raoulvdberge.refinedstorage.tile.config.IWhitelistBlacklist; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -19,14 +18,14 @@ import java.util.Collection; public class StorageDiskItemDriveWrapper implements IStorageDisk { private DiskDriveNetworkNode diskDrive; private IStorageDisk parent; - private int lastState; + private DiskDriveNetworkNode.DiskState lastState; public StorageDiskItemDriveWrapper(DiskDriveNetworkNode diskDrive, IStorageDisk parent) { this.diskDrive = diskDrive; this.parent = parent; this.setSettings( () -> { - int currentState = ConstantsDisk.getDiskState(getStored(), getCapacity()); + DiskDriveNetworkNode.DiskState currentState = DiskDriveNetworkNode.DiskState.get(getStored(), getCapacity()); if (this.lastState != currentState) { this.lastState = currentState; @@ -36,7 +35,7 @@ public class StorageDiskItemDriveWrapper implements IStorageDisk { }, diskDrive ); - this.lastState = ConstantsDisk.getDiskState(getStored(), getCapacity()); + this.lastState = DiskDriveNetworkNode.DiskState.get(getStored(), getCapacity()); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java index cd7200b55..d89f7a1e1 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageDiskFluidManipulatorWrapper.java @@ -5,7 +5,7 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskListener; import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.render.constants.ConstantsDisk; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; import com.raoulvdberge.refinedstorage.tile.config.IWhitelistBlacklist; import com.raoulvdberge.refinedstorage.util.StackUtils; import com.raoulvdberge.refinedstorage.util.WorldUtils; @@ -20,14 +20,14 @@ import java.util.Collection; public class StorageDiskFluidManipulatorWrapper implements IStorageDisk { private NetworkNodeDiskManipulator diskManipulator; private IStorageDisk parent; - private int lastState; + private DiskDriveNetworkNode.DiskState lastState; public StorageDiskFluidManipulatorWrapper(NetworkNodeDiskManipulator diskManipulator, IStorageDisk parent) { this.diskManipulator = diskManipulator; this.parent = parent; this.setSettings( () -> { - int currentState = ConstantsDisk.getDiskState(getStored(), getCapacity()); + DiskDriveNetworkNode.DiskState currentState = DiskDriveNetworkNode.DiskState.get(getStored(), getCapacity()); if (lastState != currentState) { lastState = currentState; @@ -37,7 +37,7 @@ public class StorageDiskFluidManipulatorWrapper implements IStorageDisk { private NetworkNodeDiskManipulator diskManipulator; private IStorageDisk parent; - private int lastState; + private DiskDriveNetworkNode.DiskState lastState; public StorageDiskItemManipulatorWrapper(NetworkNodeDiskManipulator diskManipulator, IStorageDisk parent) { this.diskManipulator = diskManipulator; this.parent = parent; this.setSettings( () -> { - int currentState = ConstantsDisk.getDiskState(getStored(), getCapacity()); + DiskDriveNetworkNode.DiskState currentState = DiskDriveNetworkNode.DiskState.get(getStored(), getCapacity()); if (lastState != currentState) { lastState = currentState; @@ -37,7 +37,7 @@ public class StorageDiskItemManipulatorWrapper implements IStorageDisk new CustomModelLoaderDefault(info.getId(), ModelDiskDrive::new)); - } - - @Override - @Nullable - public BlockDirection getDirection() { - return BlockDirection.HORIZONTAL; - } - @Override public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, EnumHand hand, Direction side, float hitX, float hitY, float hitZ) { return openNetworkGui(RSGui.DISK_DRIVE, player, world, pos, side); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/constants/ConstantsDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/render/constants/ConstantsDisk.java deleted file mode 100644 index 56e9f0782..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/constants/ConstantsDisk.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.raoulvdberge.refinedstorage.render.constants; - -public final class ConstantsDisk { - public static final int DISK_STATE_NORMAL = 0; - public static final int DISK_STATE_NEAR_CAPACITY = 1; - public static final int DISK_STATE_FULL = 2; - public static final int DISK_STATE_DISCONNECTED = 3; - public static final int DISK_STATE_NONE = 4; - - public static final int DISK_NEAR_CAPACITY_THRESHOLD = 75; - - public static int getDiskState(int stored, int capacity) { - if (stored == capacity) { - return DISK_STATE_FULL; - } else if ((int) ((float) stored / (float) capacity * 100F) >= DISK_NEAR_CAPACITY_THRESHOLD) { - return DISK_STATE_NEAR_CAPACITY; - } else { - return DISK_STATE_NORMAL; - } - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/DiskDriveBakedModel.java b/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/DiskDriveBakedModel.java index e2e349cda..2f7f4e0eb 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/DiskDriveBakedModel.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/model/baked/DiskDriveBakedModel.java @@ -4,7 +4,8 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.raoulvdberge.refinedstorage.RSBlocks; -import com.raoulvdberge.refinedstorage.render.constants.ConstantsDisk; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; +import com.raoulvdberge.refinedstorage.tile.DiskDriveTile; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; @@ -20,10 +21,10 @@ public class DiskDriveBakedModel extends DelegateBakedModel { private class CacheKey { private BlockState state; private Direction side; - private Integer[] diskState; + private DiskDriveNetworkNode.DiskState[] diskState; private Random random; - CacheKey(BlockState state, @Nullable Direction side, Integer[] diskState, Random random) { + CacheKey(BlockState state, @Nullable Direction side, DiskDriveNetworkNode.DiskState[] diskState, Random random) { this.state = state; this.side = side; this.diskState = diskState; @@ -63,7 +64,7 @@ public class DiskDriveBakedModel extends DelegateBakedModel { } private Map baseByFacing = new HashMap<>(); - private Map>> disksByFacing = new HashMap<>(); + private Map>> disksByFacing = new HashMap<>(); private LoadingCache> cache = CacheBuilder.newBuilder().build(new CacheLoader>() { @Override @@ -73,7 +74,7 @@ public class DiskDriveBakedModel extends DelegateBakedModel { List quads = new ArrayList<>(baseByFacing.get(facing).getQuads(key.state, key.side, key.random)); for (int i = 0; i < 8; ++i) { - if (key.diskState[i] != ConstantsDisk.DISK_STATE_NONE) { + if (key.diskState[i] != DiskDriveNetworkNode.DiskState.NONE) { quads.addAll(disksByFacing.get(facing).get(key.diskState[i]).get(i).getQuads(key.state, key.side, key.random)); } } @@ -98,14 +99,14 @@ public class DiskDriveBakedModel extends DelegateBakedModel { disksByFacing.put(facing, new HashMap<>()); - addDiskModels(disk, ConstantsDisk.DISK_STATE_NORMAL, facing); - addDiskModels(diskNearCapacity, ConstantsDisk.DISK_STATE_NEAR_CAPACITY, facing); - addDiskModels(diskFull, ConstantsDisk.DISK_STATE_FULL, facing); - addDiskModels(diskDisconnected, ConstantsDisk.DISK_STATE_DISCONNECTED, facing); + addDiskModels(disk, DiskDriveNetworkNode.DiskState.NORMAL, facing); + addDiskModels(diskNearCapacity, DiskDriveNetworkNode.DiskState.NEAR_CAPACITY, facing); + addDiskModels(diskFull, DiskDriveNetworkNode.DiskState.FULL, facing); + addDiskModels(diskDisconnected, DiskDriveNetworkNode.DiskState.DISCONNECTED, facing); } } - private void addDiskModels(IBakedModel disk, int type, Direction facing) { + private void addDiskModels(IBakedModel disk, DiskDriveNetworkNode.DiskState type, Direction facing) { disksByFacing.get(facing).put(type, new ArrayList<>()); for (int y = 0; y < 4; ++y) { @@ -129,20 +130,9 @@ public class DiskDriveBakedModel extends DelegateBakedModel { } } - private static Integer[] TEST_STATE = { - ConstantsDisk.DISK_STATE_FULL, - ConstantsDisk.DISK_STATE_NEAR_CAPACITY, - ConstantsDisk.DISK_STATE_NONE, - ConstantsDisk.DISK_STATE_NORMAL, - ConstantsDisk.DISK_STATE_NORMAL, - ConstantsDisk.DISK_STATE_NONE, - ConstantsDisk.DISK_STATE_NONE, - ConstantsDisk.DISK_STATE_NONE, - }; - @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, IModelData data) { - Integer[] diskState = TEST_STATE; + DiskDriveNetworkNode.DiskState[] diskState = data.getData(DiskDriveTile.DISK_STATE_PROPERTY); if (diskState == null) { return base.getQuads(state, side, rand, data); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/DiskDriveTile.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/DiskDriveTile.java index f8660f238..40a38b454 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/DiskDriveTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/DiskDriveTile.java @@ -4,15 +4,22 @@ import com.raoulvdberge.refinedstorage.RSTiles; import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.DiskDriveNetworkNode; -import com.raoulvdberge.refinedstorage.render.constants.ConstantsDisk; import com.raoulvdberge.refinedstorage.tile.config.*; import com.raoulvdberge.refinedstorage.tile.data.RSSerializers; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; +import com.raoulvdberge.refinedstorage.util.WorldUtils; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.IntNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; +import net.minecraftforge.common.util.Constants; import javax.annotation.Nonnull; +import java.util.Arrays; public class DiskDriveTile extends NetworkNodeTile { public static final TileDataParameter PRIORITY = IPrioritizable.createParameter(); @@ -63,9 +70,10 @@ public class DiskDriveTile extends NetworkNodeTile { return capacity; }); - private static final String NBT_DISK_STATE = "DiskState_%d"; + private static final String NBT_DISK_STATE = "DiskStates"; + public static final ModelProperty DISK_STATE_PROPERTY = new ModelProperty<>(); - private Integer[] diskState = new Integer[8]; + private DiskDriveNetworkNode.DiskState[] diskState = new DiskDriveNetworkNode.DiskState[8]; public DiskDriveTile() { super(RSTiles.DISK_DRIVE); @@ -78,14 +86,20 @@ public class DiskDriveTile extends NetworkNodeTile { dataManager.addWatchedParameter(STORED); dataManager.addWatchedParameter(CAPACITY); - initDiskState(diskState); + Arrays.fill(diskState, DiskDriveNetworkNode.DiskState.NONE); } @Override public CompoundNBT writeUpdate(CompoundNBT tag) { super.writeUpdate(tag); - writeDiskState(tag, 8, getNode().canUpdate(), getNode().getItemDisks(), getNode().getFluidDisks()); + ListNBT list = new ListNBT(); + + for (DiskDriveNetworkNode.DiskState state : getNode().getDiskState()) { + list.add(new IntNBT(state.ordinal())); + } + + tag.put(NBT_DISK_STATE, list); return tag; } @@ -94,42 +108,21 @@ public class DiskDriveTile extends NetworkNodeTile { public void readUpdate(CompoundNBT tag) { super.readUpdate(tag); - readDiskState(tag, diskState); - } + ListNBT list = tag.getList(NBT_DISK_STATE, Constants.NBT.TAG_INT); - public Integer[] getDiskState() { - return diskState; - } - - public static void writeDiskState(CompoundNBT tag, int disks, boolean connected, IStorageDisk[] itemStorages, IStorageDisk[] fluidStorages) { - for (int i = 0; i < disks; ++i) { - int state = ConstantsDisk.DISK_STATE_NONE; - - if (itemStorages[i] != null || fluidStorages[i] != null) { - if (!connected) { - state = ConstantsDisk.DISK_STATE_DISCONNECTED; - } else { - state = ConstantsDisk.getDiskState( - itemStorages[i] != null ? itemStorages[i].getStored() : fluidStorages[i].getStored(), - itemStorages[i] != null ? itemStorages[i].getCapacity() : fluidStorages[i].getCapacity() - ); - } - } - - tag.putInt(String.format(NBT_DISK_STATE, i), state); + for (int i = 0; i < list.size(); ++i) { + diskState[i] = DiskDriveNetworkNode.DiskState.values()[list.getInt(i)]; } + + requestModelDataUpdate(); + + WorldUtils.updateBlock(world, pos); } - public static void readDiskState(CompoundNBT tag, Integer[] diskState) { - for (int i = 0; i < diskState.length; ++i) { - diskState[i] = tag.getInt(String.format(NBT_DISK_STATE, i)); - } - } - - public static void initDiskState(Integer[] diskState) { - for (int i = 0; i < diskState.length; ++i) { - diskState[i] = ConstantsDisk.DISK_STATE_NONE; - } + @Nonnull + @Override + public IModelData getModelData() { + return new ModelDataMap.Builder().withInitial(DISK_STATE_PROPERTY, diskState).build(); } /* TODO diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java index d52e06902..7444cf089 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java @@ -32,14 +32,14 @@ public class TileDiskManipulator extends NetworkNodeTile= ConstantsDisk.DISK_NEAR_CAPACITY_THRESHOLD) { + } else if ((int) ((float) renderInfo.getStored() / (float) renderInfo.getCapacity() * 100F) >= DiskDriveNetworkNode.DiskState.DISK_NEAR_CAPACITY_THRESHOLD) { return PortableGridDiskState.NEAR_CAPACITY; } else { return PortableGridDiskState.NORMAL; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java index 73122985c..90c89a154 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/WorldUtils.java @@ -4,7 +4,6 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -22,7 +21,6 @@ import net.minecraftforge.items.wrapper.SidedInvWrapper; import javax.annotation.Nullable; public final class WorldUtils { - // TODO REMOVE. Can just use setBlockState now. public static void updateBlock(@Nullable World world, BlockPos pos) { if (world != null) { BlockState state = world.getBlockState(pos); @@ -58,12 +56,4 @@ public final class WorldUtils { public static void sendNoPermissionMessage(PlayerEntity player) { player.sendMessage(new TranslationTextComponent("misc.refinedstorage:security.no_permission").setStyle(new Style().setColor(TextFormatting.RED))); } - - public static void dropInventory(World world, BlockPos pos, IItemHandler handler) { - for (int i = 0; i < handler.getSlots(); ++i) { - if (!handler.getStackInSlot(i).isEmpty()) { - InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); - } - } - } }