From 4f3566ba19867c7e7a7afb2ef39bec0aa5d347de Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 12 Jun 2017 23:38:06 +0200 Subject: [PATCH] Dynamic portable grid model --- .../block/BlockPortableGrid.java | 14 + .../block/PortableGridDiskState.java | 44 ++ .../refinedstorage/proxy/ProxyClient.java | 9 +- .../tile/grid/portable/IPortableGrid.java | 8 +- .../tile/grid/portable/PortableGrid.java | 58 +- .../tile/grid/portable/TilePortableGrid.java | 104 ++- .../blockstates/portable_grid.json | 62 +- .../models/block/portable_grid.json | 630 ++++++++---------- .../models/block/portable_grid_disk.json | 110 +++ .../textures/blocks/portable_grid_0.png | Bin 439 -> 0 bytes .../textures/blocks/portable_grid_1.png | Bin 462 -> 439 bytes .../textures/blocks/portable_grid_2.png | Bin 616 -> 462 bytes .../blocks/portable_grid_2_disconnected.png | Bin 0 -> 557 bytes .../textures/blocks/portable_grid_3.png | Bin 324 -> 616 bytes .../textures/blocks/portable_grid_4.png | Bin 485 -> 324 bytes .../textures/blocks/portable_grid_5.png | Bin 220 -> 485 bytes .../textures/blocks/portable_grid_6.png | Bin 522 -> 220 bytes .../textures/blocks/portable_grid_7.png | Bin 150 -> 522 bytes .../textures/blocks/portable_grid_8.png | Bin 0 -> 150 bytes .../textures/blocks/portable_grid_disk.png | Bin 0 -> 1079 bytes .../portable_grid_disk_disconnected.png | Bin 0 -> 1081 bytes .../blocks/portable_grid_disk_full.png | Bin 0 -> 1089 bytes .../portable_grid_disk_near_capacity.png | Bin 0 -> 1082 bytes 23 files changed, 671 insertions(+), 368 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/block/PortableGridDiskState.java create mode 100644 src/main/resources/assets/refinedstorage/models/block/portable_grid_disk.json delete mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_0.png create mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_2_disconnected.png create mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_8.png create mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk.png create mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk_disconnected.png create mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk_full.png create mode 100644 src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk_near_capacity.png diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockPortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockPortableGrid.java index d32386621..2ffe5019f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockPortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockPortableGrid.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.item.ItemBlockPortableGrid; import com.raoulvdberge.refinedstorage.tile.grid.portable.TilePortableGrid; +import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; @@ -27,6 +28,8 @@ public class BlockPortableGrid extends BlockBase { private static final AxisAlignedBB PORTABLE_GRID_AABB = new AxisAlignedBB(0, 0, 0, 1, 13.2F / 16F, 1); public static final PropertyEnum TYPE = PropertyEnum.create("type", PortableGridType.class); + public static final PropertyEnum DISK_STATE = PropertyEnum.create("disk_state", PortableGridDiskState.class); + public static final PropertyBool CONNECTED = PropertyBool.create("connected"); public BlockPortableGrid() { super("portable_grid"); @@ -89,10 +92,21 @@ public class BlockPortableGrid extends BlockBase { return drops; } + @Override + public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { + TilePortableGrid portableGrid = (TilePortableGrid) world.getTileEntity(pos); + + return super.getActualState(state, world, pos) + .withProperty(DISK_STATE, portableGrid.getDiskState()) + .withProperty(CONNECTED, portableGrid.isConnected()); + } + @Override protected BlockStateContainer createBlockState() { return createBlockStateBuilder() .add(TYPE) + .add(DISK_STATE) + .add(CONNECTED) .build(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/PortableGridDiskState.java b/src/main/java/com/raoulvdberge/refinedstorage/block/PortableGridDiskState.java new file mode 100644 index 000000000..0c3b81e1a --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/PortableGridDiskState.java @@ -0,0 +1,44 @@ +package com.raoulvdberge.refinedstorage.block; + +import net.minecraft.util.IStringSerializable; + +public enum PortableGridDiskState implements IStringSerializable { + NORMAL(0, "normal"), + NEAR_CAPACITY(1, "near_capacity"), + FULL(2, "full"), + DISCONNECTED(3, "disconnected"), + NONE(4, "none"); + + private int id; + private String type; + + PortableGridDiskState(int id, String type) { + this.id = id; + this.type = type; + } + + public int getId() { + return id; + } + + @Override + public String getName() { + return type; + } + + @Override + public String toString() { + return type; + } + + public static PortableGridDiskState getById(int id) { + for (PortableGridDiskState diskState : values()) { + if (diskState.getId() == id) { + return diskState; + } + } + + return NONE; + } +} + diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java index 2c26c322c..a6cfe7c43 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyClient.java @@ -15,6 +15,8 @@ import com.raoulvdberge.refinedstorage.render.ModelDiskManipulator; import com.raoulvdberge.refinedstorage.render.TileEntitySpecialRendererStorageMonitor; import com.raoulvdberge.refinedstorage.tile.TileController; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; +import com.raoulvdberge.refinedstorage.tile.grid.portable.PortableGrid; +import com.raoulvdberge.refinedstorage.tile.grid.portable.TilePortableGrid; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; @@ -211,7 +213,6 @@ public class ProxyClient extends ProxyCommon { ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.SECURITY_MANAGER), 0, new ModelResourceLocation("refinedstorage:security_manager", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.QUARTZ_ENRICHED_IRON), 0, new ModelResourceLocation("refinedstorage:quartz_enriched_iron_block", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.STORAGE_MONITOR), 0, new ModelResourceLocation("refinedstorage:storage_monitor", "connected=false,direction=north")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RSBlocks.PORTABLE_GRID), 0, new ModelResourceLocation("refinedstorage:portable_grid", "inventory")); ModelLoaderRegistry.registerLoader(new ICustomModelLoader() { @Override @@ -253,6 +254,12 @@ public class ProxyClient extends ProxyCommon { return new ModelResourceLocation("refinedstorage:controller", "direction=north,energy=" + energy); }); + + ModelLoader.setCustomMeshDefinition(Item.getItemFromBlock(RSBlocks.PORTABLE_GRID), stack -> { + PortableGrid portableGrid = new PortableGrid(null, stack); + + return new ModelResourceLocation("refinedstorage:portable_grid", "connected=" + Boolean.toString(portableGrid.getEnergy() != 0) + ",direction=north,disk_state=" + TilePortableGrid.getDiskState(portableGrid)); + }); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java index d48d82d03..3903b8cab 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/IPortableGrid.java @@ -1,22 +1,26 @@ package com.raoulvdberge.refinedstorage.tile.grid.portable; -import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; +import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import javax.annotation.Nullable; import java.util.List; public interface IPortableGrid { IStorageCache getCache(); - IStorage getStorage(); + @Nullable + IStorageDisk getStorage(); List getWatchers(); void drainEnergy(int energy); + int getEnergy(); + ItemHandlerBase getDisk(); ItemHandlerBase getFilter(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java index 9ac590a74..e31551540 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/PortableGrid.java @@ -17,6 +17,7 @@ import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter; import com.raoulvdberge.refinedstorage.item.ItemBlockPortableGrid; +import com.raoulvdberge.refinedstorage.item.ItemEnergyItem; import com.raoulvdberge.refinedstorage.item.ItemWirelessGrid; import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.FilterTab; @@ -82,14 +83,19 @@ public class PortableGrid implements IGrid, IPortableGrid { IStorageDiskProvider provider = (IStorageDiskProvider) getStackInSlot(slot).getItem(); storage = new StorageDiskItemPortable(provider.create(getStackInSlot(slot)), PortableGrid.this); - storage.readFromNBT(); - storage.onPassContainerContext(() -> { - }, () -> false, () -> AccessType.INSERT_EXTRACT); + + if (player != null) { + storage.readFromNBT(); + storage.onPassContainerContext(() -> { + }, () -> false, () -> AccessType.INSERT_EXTRACT); + } } - cache.invalidate(); + if (player != null) { + cache.invalidate(); - RSUtils.writeItems(this, 4, stack.getTagCompound()); + RSUtils.writeItems(this, 4, stack.getTagCompound()); + } } } @@ -104,31 +110,37 @@ public class PortableGrid implements IGrid, IPortableGrid { } }; - public PortableGrid(EntityPlayer player, ItemStack stack) { + public PortableGrid(@Nullable EntityPlayer player, ItemStack stack) { this.player = player; this.stack = stack; - this.sortingType = ItemWirelessGrid.getSortingType(stack); - this.sortingDirection = ItemWirelessGrid.getSortingDirection(stack); - this.searchBoxMode = ItemWirelessGrid.getSearchBoxMode(stack); - this.tabSelected = ItemWirelessGrid.getTabSelected(stack); - this.size = ItemWirelessGrid.getSize(stack); + if (player != null) { + this.sortingType = ItemWirelessGrid.getSortingType(stack); + this.sortingDirection = ItemWirelessGrid.getSortingDirection(stack); + this.searchBoxMode = ItemWirelessGrid.getSearchBoxMode(stack); + this.tabSelected = ItemWirelessGrid.getTabSelected(stack); + this.size = ItemWirelessGrid.getSize(stack); + } if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } - for (int i = 0; i < 4; ++i) { - RSUtils.readItems(filter, i, stack.getTagCompound()); + if (player != null) { + for (int i = 0; i < 4; ++i) { + RSUtils.readItems(filter, i, stack.getTagCompound()); + } } RSUtils.readItems(disk, 4, stack.getTagCompound()); - drainEnergy(RS.INSTANCE.config.portableGridOpenUsage); + if (player != null) { + drainEnergy(RS.INSTANCE.config.portableGridOpenUsage); - // If there is no disk onContentsChanged isn't called and the update isn't sent, thus items from the previous grid view would remain clientside - if (!player.getEntityWorld().isRemote && disk.getStackInSlot(0).isEmpty()) { - cache.invalidate(); + // If there is no disk onContentsChanged isn't called and the update isn't sent, thus items from the previous grid view would remain clientside + if (!player.getEntityWorld().isRemote && disk.getStackInSlot(0).isEmpty()) { + cache.invalidate(); + } } } @@ -136,10 +148,12 @@ public class PortableGrid implements IGrid, IPortableGrid { return stack; } + @Override public StorageCacheItemPortable getCache() { return cache; } + @Override @Nullable public IStorageDisk getStorage() { return storage; @@ -157,6 +171,16 @@ public class PortableGrid implements IGrid, IPortableGrid { } } + @Override + public int getEnergy() { + if (RS.INSTANCE.config.portableGridUsesEnergy && stack.getItemDamage() != ItemBlockPortableGrid.TYPE_CREATIVE) { + return stack.getCapability(CapabilityEnergy.ENERGY, null).getEnergyStored(); + } + + return ItemEnergyItem.CAPACITY; + } + + @Override public ItemHandlerBase getDisk() { return disk; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index 5f979a617..7c3207ae7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -13,6 +13,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItemPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageDiskItemPortable; import com.raoulvdberge.refinedstorage.block.BlockPortableGrid; import com.raoulvdberge.refinedstorage.block.GridType; +import com.raoulvdberge.refinedstorage.block.PortableGridDiskState; import com.raoulvdberge.refinedstorage.block.PortableGridType; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.integration.forgeenergy.EnergyForge; @@ -146,6 +147,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); private static final String NBT_ENERGY = "Energy"; + private static final String NBT_DISK_STATE = "DiskState"; + private static final String NBT_CONNECTED = "Connected"; private EnergyForge energyStorage = new EnergyForge(ItemEnergyItem.CAPACITY); private PortableGridType type; @@ -174,10 +177,15 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, storage = new StorageDiskItemPortable(provider.create(getStackInSlot(slot)), TilePortableGrid.this); storage.readFromNBT(); - storage.onPassContainerContext(TilePortableGrid.this::markDirty, () -> false, () -> AccessType.INSERT_EXTRACT); + storage.onPassContainerContext(() -> { + TilePortableGrid.this.markDirty(); + TilePortableGrid.this.checkIfDiskStateChanged(); + }, () -> false, () -> AccessType.INSERT_EXTRACT); } cache.invalidate(); + + checkIfDiskStateChanged(); } } @@ -196,6 +204,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, private IStorageDisk storage; private StorageCacheItemPortable cache = new StorageCacheItemPortable(this); private ItemGridHandlerPortable handler = new ItemGridHandlerPortable(this, this); + private PortableGridDiskState diskState = PortableGridDiskState.NONE; + private boolean connected; public TilePortableGrid() { dataManager.addWatchedParameter(ENERGY_STORED); @@ -207,6 +217,14 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, dataManager.addWatchedParameter(REDSTONE_MODE); } + public PortableGridDiskState getDiskState() { + return diskState; + } + + public boolean isConnected() { + return connected; + } + public PortableGridType getPortableType() { if (type == null && world.getBlockState(pos).getBlock() == RSBlocks.PORTABLE_GRID) { this.type = (PortableGridType) world.getBlockState(pos).getValue(BlockPortableGrid.TYPE); @@ -234,6 +252,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, this.redstoneMode = RedstoneMode.read(stack.getTagCompound()); } + this.diskState = getDiskState(this); + markDirty(); } @@ -441,7 +461,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, } @Override - public IStorage getStorage() { + @Nullable + public IStorageDisk getStorage() { return storage; } @@ -454,6 +475,39 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, public void drainEnergy(int energy) { if (RS.INSTANCE.config.portableGridUsesEnergy && getPortableType() != PortableGridType.CREATIVE && redstoneMode.isEnabled(world, pos)) { energyStorage.extractEnergyInternal(energy); + + checkIfDiskStateChanged(); + } + + checkIfConnectivityChanged(); + } + + @Override + public int getEnergy() { + if (RS.INSTANCE.config.portableGridUsesEnergy && getPortableType() != PortableGridType.CREATIVE) { + return energyStorage.getEnergyStored(); + } + + return energyStorage.getMaxEnergyStored(); + } + + private void checkIfDiskStateChanged() { + PortableGridDiskState newDiskState = getDiskState(this); + + if (this.diskState != newDiskState) { + this.diskState = newDiskState; + + RSUtils.updateBlock(world, pos); + } + } + + private void checkIfConnectivityChanged() { + boolean isConnected = getEnergy() != 0; + + if (this.connected != isConnected) { + this.connected = isConnected; + + RSUtils.updateBlock(world, pos); } } @@ -518,6 +572,31 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, } redstoneMode = RedstoneMode.read(tag); + + diskState = getDiskState(this); + } + + @Override + public void onLoad() { + super.onLoad(); + + checkIfConnectivityChanged(); + } + + @Override + public NBTTagCompound writeUpdate(NBTTagCompound tag) { + tag.setInteger(NBT_DISK_STATE, diskState.getId()); + tag.setBoolean(NBT_CONNECTED, getEnergy() != 0); + + return super.writeUpdate(tag); + } + + @Override + public void readUpdate(NBTTagCompound tag) { + super.readUpdate(tag); + + diskState = PortableGridDiskState.getById(tag.getInteger(NBT_DISK_STATE)); + connected = tag.getBoolean(NBT_CONNECTED); } @Override @@ -552,4 +631,25 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, markDirty(); } + + public static PortableGridDiskState getDiskState(IPortableGrid portableGrid) { + if (portableGrid.getStorage() == null) { + return PortableGridDiskState.NONE; + } + + if (portableGrid.getEnergy() == 0) { + return PortableGridDiskState.DISCONNECTED; + } + + int stored = portableGrid.getStorage().getStored(); + int capacity = portableGrid.getStorage().getCapacity(); + + if (stored == capacity) { + return PortableGridDiskState.FULL; + } else if ((int) ((float) stored / (float) capacity * 100F) >= 85) { + return PortableGridDiskState.NEAR_CAPACITY; + } else { + return PortableGridDiskState.NORMAL; + } + } } diff --git a/src/main/resources/assets/refinedstorage/blockstates/portable_grid.json b/src/main/resources/assets/refinedstorage/blockstates/portable_grid.json index c1e0a1d52..99bf9eb10 100644 --- a/src/main/resources/assets/refinedstorage/blockstates/portable_grid.json +++ b/src/main/resources/assets/refinedstorage/blockstates/portable_grid.json @@ -3,16 +3,16 @@ "defaults": { "model": "refinedstorage:portable_grid", "textures": { - "texture0": "refinedstorage:blocks/portable_grid_0", - "texture1": "refinedstorage:blocks/portable_grid_1", - "texture2": "refinedstorage:blocks/portable_grid_2", - "texture3": "refinedstorage:blocks/portable_grid_3", - "texture4": "refinedstorage:blocks/portable_grid_4", - "texture5": "refinedstorage:blocks/portable_grid_5", - "texture6": "refinedstorage:blocks/portable_grid_6", - "texture7": "refinedstorage:blocks/portable_grid_7", - "particle": "refinedstorage:blocks/portable_grid_0" + "particle": "refinedstorage:blocks/portable_grid_1", + "texture0": "refinedstorage:blocks/portable_grid_1", + "texture2": "refinedstorage:blocks/portable_grid_3", + "texture3": "refinedstorage:blocks/portable_grid_4", + "texture4": "refinedstorage:blocks/portable_grid_5", + "texture5": "refinedstorage:blocks/portable_grid_6", + "texture6": "refinedstorage:blocks/portable_grid_7", + "texture7": "refinedstorage:blocks/portable_grid_8" }, + "transform": "forge:default-block", "uvlock": false }, "variants": { @@ -21,6 +21,50 @@ "transform": "forge:default-block" } ], + "disk_state": { + "normal": { + "textures": { + "disk0": "refinedstorage:blocks/portable_grid_disk", + "disk1": "refinedstorage:blocks/portable_grid_disk" + }, + "submodel": "refinedstorage:portable_grid_disk" + }, + "near_capacity": { + "textures": { + "disk0": "refinedstorage:blocks/portable_grid_disk_near_capacity", + "disk1": "refinedstorage:blocks/portable_grid_disk_near_capacity" + }, + "submodel": "refinedstorage:portable_grid_disk" + }, + "full": { + "textures": { + "disk0": "refinedstorage:blocks/portable_grid_disk_full", + "disk1": "refinedstorage:blocks/portable_grid_disk_full" + }, + "submodel": "refinedstorage:portable_grid_disk" + }, + "disconnected": { + "textures": { + "disk0": "refinedstorage:blocks/portable_grid_disk_disconnected", + "disk1": "refinedstorage:blocks/portable_grid_disk_disconnected" + }, + "submodel": "refinedstorage:portable_grid_disk" + }, + "none": { + } + }, + "connected": { + "true": { + "textures": { + "texture1": "refinedstorage:blocks/portable_grid_2" + } + }, + "false": { + "textures": { + "texture1": "refinedstorage:blocks/portable_grid_2_disconnected" + } + } + }, "direction": { "north": { "y": 0 diff --git a/src/main/resources/assets/refinedstorage/models/block/portable_grid.json b/src/main/resources/assets/refinedstorage/models/block/portable_grid.json index 90ca1cdcb..735dd919a 100644 --- a/src/main/resources/assets/refinedstorage/models/block/portable_grid.json +++ b/src/main/resources/assets/refinedstorage/models/block/portable_grid.json @@ -1,54 +1,20 @@ { "elements": [ { + "name": "cube", "from": [ - 0.0, - 6.0, - 9.0 + 0, + 6, + 5 ], "to": [ - 16.0, - 13.0, - 11.0 + 16, + 13, + 7 ], - "rotation": { - "origin": [ - 8.0, - 6.0, - 9.0 - ], - "axis": "x", - "angle": -22.5 - }, + "shade": true, "faces": { - "down": { - "uv": [ - 0, - 14, - 16, - 16 - ], - "texture": "#texture1" - }, - "up": { - "uv": [ - 0, - 14, - 16, - 16 - ], - "texture": "#texture0" - }, "north": { - "uv": [ - 0, - 0, - 16, - 7 - ], - "texture": "#texture0" - }, - "south": { "uv": [ 0, 7, @@ -57,16 +23,25 @@ ], "texture": "#texture0" }, + "east": { + "uv": [ + 0, + 7, + 2, + 14 + ], + "texture": "#texture1" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 7 + ], + "texture": "#texture0" + }, "west": { - "uv": [ - 0, - 7, - 2, - 14 - ], - "texture": "#texture1" - }, - "east": { "uv": [ 0, 0, @@ -74,97 +49,87 @@ 7 ], "texture": "#texture1" - } - } - }, - { - "from": [ - 16.0, - 2.0, - 2.0 - ], - "to": [ - 17.0, - 4.0, - 7.0 - ], - "faces": { - "down": { - "uv": [ - 3, - 8, - 4, - 13 - ], - "texture": "#texture1" }, "up": { "uv": [ - 2, - 8, - 3, - 13 - ], - "texture": "#texture1" - }, - "north": { - "uv": [ - 2, 0, - 3, + 0, + 16, 2 ], - "texture": "#texture1" + "texture": "#texture0", + "rotation": 180 }, - "south": { + "down": { + "uv": [ + 0, + 13, + 16, + 15 + ], + "texture": "#texture1", + "rotation": 180 + } + }, + "rotation": { + "origin": [ + 8, + 6, + 7 + ], + "axis": "x", + "angle": 22.5 + } + }, + { + "name": "cube", + "from": [ + 0, + 4, + 7 + ], + "to": [ + 16, + 6, + 16 + ], + "shade": true, + "faces": { + "north": { + "uv": [ + 0, + 14, + 16, + 16 + ], + "texture": "#texture0" + }, + "east": { "uv": [ - 2, - 2, 3, + 2, + 12, 4 ], "texture": "#texture1" }, - "west": { - "uv": [ - 2, - 6, - 7, - 8 - ], - "texture": "#texture1" - }, - "east": { - "uv": [ - 2, - 4, - 7, - 6 - ], - "texture": "#texture1" - } - } - }, - { - "from": [ - 0.0, - 4.0, - 0.0 - ], - "to": [ - 16.0, - 6.0, - 9.0 - ], - "faces": { - "down": { + "south": { "uv": [ 0, 0, 16, - 9 + 2 ], - "texture": "#texture3" + "texture": "#texture2" + }, + "west": { + "uv": [ + 3, + 0, + 12, + 2 + ], + "texture": "#texture1" }, "up": { "uv": [ @@ -173,86 +138,36 @@ 16, 11 ], - "texture": "#texture2" + "texture": "#texture2", + "rotation": 180 }, - "north": { - "uv": [ - 0, - 0, - 16, - 2 - ], - "texture": "#texture2" - }, - "south": { - "uv": [ - 0, - 14, - 16, - 16 - ], - "texture": "#texture0" - }, - "west": { - "uv": [ - 3, - 2, - 12, - 4 - ], - "texture": "#texture1" - }, - "east": { - "uv": [ - 3, - 0, - 12, - 2 - ], - "texture": "#texture1" - } - } - }, - { - "from": [ - 0.0, - 0.0, - 0.0 - ], - "to": [ - 16.0, - 4.0, - 16.0 - ], - "faces": { "down": { "uv": [ 0, 0, 16, - 16 + 9 ], - "texture": "#texture6" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#texture5" - }, + "texture": "#texture3", + "rotation": 180 + } + } + }, + { + "name": "cube", + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 4, + 16 + ], + "shade": true, + "faces": { "north": { - "uv": [ - 0, - 11, - 16, - 15 - ], - "texture": "#texture2" - }, - "south": { "uv": [ 0, 9, @@ -261,7 +176,7 @@ ], "texture": "#texture3" }, - "west": { + "east": { "uv": [ 0, 4, @@ -270,7 +185,16 @@ ], "texture": "#texture4" }, - "east": { + "south": { + "uv": [ + 0, + 11, + 16, + 15 + ], + "texture": "#texture2" + }, + "west": { "uv": [ 0, 0, @@ -278,49 +202,44 @@ 4 ], "texture": "#texture4" - } - } - }, - { - "from": [ - 1.0, - 4.0, - 9.0 - ], - "to": [ - 15.0, - 5.0, - 15.0 - ], - "faces": { - "down": { - "uv": [ - 0, - 0, - 14, - 6 - ], - "texture": "#texture7" }, "up": { "uv": [ 0, - 8, - 14, - 14 - ], - "texture": "#texture4" - }, - "north": { - "uv": [ - 2, - 13, + 0, 16, - 14 + 16 ], - "texture": "#texture1" + "texture": "#texture5", + "rotation": 180 }, - "south": { + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#texture6", + "rotation": 180 + } + } + }, + { + "name": "cube", + "from": [ + 1, + 4, + 1 + ], + "to": [ + 15, + 5, + 7 + ], + "shade": true, + "faces": { + "north": { "uv": [ 0, 15, @@ -329,7 +248,7 @@ ], "texture": "#texture2" }, - "west": { + "east": { "uv": [ 4, 9, @@ -338,7 +257,16 @@ ], "texture": "#texture1" }, - "east": { + "south": { + "uv": [ + 2, + 13, + 16, + 14 + ], + "texture": "#texture1" + }, + "west": { "uv": [ 4, 8, @@ -346,21 +274,89 @@ 9 ], "texture": "#texture1" + }, + "up": { + "uv": [ + 0, + 8, + 14, + 14 + ], + "texture": "#texture4", + "rotation": 180 + }, + "down": { + "uv": [ + 0, + 0, + 14, + 6 + ], + "texture": "#texture7", + "rotation": 180 } } }, { + "name": "cube", "from": [ - 12.0, + 3, 4.5, - 8.0 + 6 ], "to": [ - 13.0, + 4, 6.5, - 10.0 + 8 ], + "shade": true, "faces": { + "north": { + "uv": [ + 5, + 10, + 6, + 12 + ], + "texture": "#texture1" + }, + "east": { + "uv": [ + 7, + 4, + 9, + 6 + ], + "texture": "#texture1" + }, + "south": { + "uv": [ + 4, + 10, + 5, + 12 + ], + "texture": "#texture1" + }, + "west": { + "uv": [ + 6, + 10, + 8, + 12 + ], + "texture": "#texture1" + }, + "up": { + "uv": [ + 7, + 6, + 8, + 8 + ], + "texture": "#texture1", + "rotation": 180 + }, "down": { "uv": [ 8, @@ -368,6 +364,59 @@ 9, 8 ], + "texture": "#texture1", + "rotation": 180 + } + } + }, + { + "name": "cube", + "from": [ + 12, + 4.5, + 6 + ], + "to": [ + 13, + 6.5, + 8 + ], + "shade": true, + "faces": { + "north": { + "uv": [ + 9, + 4, + 10, + 6 + ], + "texture": "#texture1" + }, + "east": { + "uv": [ + 9, + 10, + 11, + 12 + ], + "texture": "#texture1" + }, + "south": { + "uv": [ + 8, + 10, + 9, + 12 + ], + "texture": "#texture1" + }, + "west": { + "uv": [ + 9, + 6, + 11, + 8 + ], "texture": "#texture1" }, "up": { @@ -377,58 +426,9 @@ 8, 8 ], - "texture": "#texture1" + "texture": "#texture1", + "rotation": 180 }, - "north": { - "uv": [ - 4, - 10, - 5, - 12 - ], - "texture": "#texture1" - }, - "south": { - "uv": [ - 5, - 10, - 6, - 12 - ], - "texture": "#texture1" - }, - "west": { - "uv": [ - 7, - 4, - 9, - 6 - ], - "texture": "#texture1" - }, - "east": { - "uv": [ - 6, - 10, - 8, - 12 - ], - "texture": "#texture1" - } - } - }, - { - "from": [ - 3.0, - 4.5, - 8.0 - ], - "to": [ - 4.0, - 6.5, - 10.0 - ], - "faces": { "down": { "uv": [ 8, @@ -436,52 +436,8 @@ 9, 8 ], - "texture": "#texture1" - }, - "up": { - "uv": [ - 7, - 6, - 8, - 8 - ], - "texture": "#texture1" - }, - "north": { - "uv": [ - 8, - 10, - 9, - 12 - ], - "texture": "#texture1" - }, - "south": { - "uv": [ - 9, - 4, - 10, - 6 - ], - "texture": "#texture1" - }, - "west": { - "uv": [ - 9, - 10, - 11, - 12 - ], - "texture": "#texture1" - }, - "east": { - "uv": [ - 9, - 6, - 11, - 8 - ], - "texture": "#texture1" + "texture": "#texture1", + "rotation": 180 } } } diff --git a/src/main/resources/assets/refinedstorage/models/block/portable_grid_disk.json b/src/main/resources/assets/refinedstorage/models/block/portable_grid_disk.json new file mode 100644 index 000000000..c3f5223d4 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/portable_grid_disk.json @@ -0,0 +1,110 @@ +{ + "elements": [ + { + "name": "disk", + "from": [ + -1, + 2, + 9 + ], + "to": [ + 0, + 4, + 14 + ], + "shade": true, + "faces": { + "north": { + "uv": [ + 5, + 5, + 6, + 7 + ], + "texture": "#disk1" + }, + "east": { + "uv": [ + 0, + 5, + 5, + 7 + ], + "texture": "#disk1" + }, + "south": { + "uv": [ + 11, + 5, + 12, + 7 + ], + "texture": "#disk1" + }, + "west": { + "uv": [ + 6, + 5, + 11, + 7 + ], + "texture": "#disk1" + }, + "up": { + "uv": [ + 5, + 0, + 6, + 5 + ], + "texture": "#disk1", + "rotation": 180 + }, + "down": { + "uv": [ + 6, + 0, + 7, + 5 + ], + "texture": "#disk1", + "rotation": 180 + } + } + }, + { + "name": "disk_led", + "from": [ + -1.05, + 2, + 12 + ], + "to": [ + -0.050000000000000044, + 3, + 13 + ], + "shade": true, + "faces": { + "east": { + "uv": [ + 2, + 1, + 3, + 2 + ], + "texture": "#disk1" + }, + "west": { + "uv": [ + 2, + 1, + 3, + 2 + ], + "texture": "#disk0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_0.png b/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_0.png deleted file mode 100644 index a6b7645a0ba4c8ce51d1544b7229057d7e3c4a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439 zcmV;o0Z9IdP)_MYgTK^mXAJ^x@V`Wy1GZ})oL}XR4PKT zShP~9qzJgn<#Ngkg@RvGE|;xZt*X{*G#WM@k8Ly>S+Cc#>2#{|a5%Jnzps2gpWAl3 zwe@;!o6W`+i-qm?dkK0dwOTE!*Xz1OXf~Uv0OIL%vfXZHx7$s)Ua!_}x9$0SehOfd z&J;sJeYINoIo}V5gK$2d;e hT`B$vTH?R|jUO6=#dFNPs8Ij_002ovPDHLkV1hnh$hiOj diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_1.png b/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_1.png index d6ee53cd935fe7e26120e988e83f9e26a6881bb9..a6b7645a0ba4c8ce51d1544b7229057d7e3c4a52 100644 GIT binary patch delta 413 zcmV;O0b>5n1GfW^B!7NML_t(|+QpN{ZUR9NME5hu;V;NZh%-V0AwcAu(*+RU-qtH? zR%^?ak3N*TXQ!*Wx<~8PYBj4=DnhYXv{I?02)N7Ta>@&Zf?rcEm#tc@s@7{X8a5t} zZ8RELuh+BbbgJ`kIJADhuY5kA+jhIP^?Gfa&Bhjsh3)ry34eMhwOTE!*Xz1OXf~Uv z0OIL%vfXZHx7$s)Ua!_}x9$0SehOfd&J;sJeYINoIo}V5gK$2dui<60S<7TH0y%RLc_PFCR^2@#lM{h9Yo{4;&O}!4-wo&@Zf?g2!fX& z_yZCAq4}RazDX6d=x7F}p{P!Gx?WXY$H?V!Vw$F$PA76QnItgJWHK*|b>sKg?RMPg z^?I`3?`1Zd5%c++Jef>nI2?*?+mc8m-UZg{H3cr0%b%6?-hZ3GYPI6VbUKxIJT9G1 zhZRxz*$Du*ZvxBZl9djJ16^FNSMu?Alt!cRfZ;cg8xBx)G#W{_+m%QpBK>|}DwT?q z%Vok>01>nUbOM6l^ZCrmrBX@i^}4?cue$PDso(&e7z_sd9^>(t2O$6l)oS&#Kq{3| zo6SZ!jw7vBOMkN2>__-UfPfc6-EKFrEK6{)^7%YbEEeei>?@E?r`2MyQ1|;?+U>S9 zn@s|lHP>o2#`!3K{9dn>>$;49ykFlYJD>p32M-b4MeyK)D+q#@ zAov3j{Gs`uKE6p6wCHFCrlF`#ce-9xUdPDga$=gMoK7clGMOYW&tx($jCJGp*zI=Q z==FNC-|uBMn-TN*oIIIKWH=m(ZQGJaB;Ezq>oo-~m&>1(^?%-*z-qPP#&kNBcswqh zPKOmy`Pm5ow{HT=<&u>ShXY+)uUGQ%c$7w?@qpnskQ)wAbu=1Dx7(FSBqIHOUn-S~ zl*?tpR{#;T19Sp{;Pd&+%B50C>h-$63$MEJTB+awofr%T{2t@+mUE1xo zG@DHVnKjpHHOBcUfc##smFv2UfV^MdCOe=37hqop+wE52tHXiu-vI}R5DW$d2#3Qj ztPu)@xE2TmI0s`L0uqbGczL4H=mU7h0euj_+VeAG;Vu&4i=$Ou9CpF$4CnZP3WWma f0N&N_0NDEhddXnX>w$_R00000NkvXXu0mjf)zZ`T delta 592 zcmV-W0hBYy%fNkll z_lJAC+P%ZDtk725o>SH7DA8z?!r`!3AP^v<(I{v#nJAG+P$(1S9&}ibidz4?fHBPo=zva-EQK~W;3~jEIXYJ4TnSW zdcCgjV%4+lDYeF>`m<$R_Mr@q^6Y0d=8#e$|>LZ3@+w_0SiT1m-dGNOdTcUFU< z5VGxdJKFE}w0~Nyq;}YXNrr;~RVo#-SS+NZQYkrHEEK5IZVPj(*%WIw8q}!QzpY-Y zQLS2~_qR78Fq_RUf-|clwaeuqsxV9fbwho*T#7O}kJ|H}pHwQ9UIggDfouNt@j<_f zMakmdOnzol$mc1OPE(U(27`eVj0yyUeqU5oMa&(l$bSO%bN<@ts{Q-9$7yF!Txm=d@ zR2$L9_zyl%qtSey!y4OcwpR~gu^7eUae1QZQw9Fd e)Tgif{rmy3Y6S^(i-+3)0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00EszL_t(IPmNQ@sscd}^oz_OW?d78qaHjc zm__hlzzBliMFf99!OxsyJ5|i8`_}h(4Moq+bf}u1^<**`iO1t|JRa#|u^54MDwT40 z?0bINcDv<4x7(H7ZYR^}l$gzC^yBeZ27`gLS}lo2qwWH$)rti!m&>1>?K6}1w&ilk zgUMtfkw`?^?KV52^CuGkY)#tR7K;Tt?e}}KxL&XHhr>at)#?i-+-=Ye2Ix8*4yDuS zNH7?bUau#`Vo?f(0%5}41_?F;OacYrPp1<*=ks}~R4Tu-(A||Dr2+#?qTlcHK1QPv z6Hx#RN~O~G0*ORIt=DUHKA)x0Xh=Gp{t6TBHWbh@)ct;!dc7`qSlMir$mMcm0B^$G zmP{tqd_Gr?$3vRUrqpUR0-9}KE|)3Cq&N-w^{mzHcB2I7)sdWl4X}VWDNX}}&1R!; z>tJBE|8HOb2|k}sfIuMN@HYH@Kli*|FW2zc=ie9(hxvFyq0kHXMuMFPVDIyrvhav- v;~15e!zt*=aE%|xvMjCv#M&`{Wm)nBLknP`n9TvB00000NkvXXu0mjfPVn?F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_3.png b/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_3.png index 9988b143c1f68486d8d57008edd2c3f25218a59f..a8bfc4a33a9bbc121ae59f6ec6c1528d9660dded 100644 GIT binary patch delta 592 zcmV-W0l z_lJAC+P%ZDtk725o>SH7DA8z?!r`!3AP^v<(I{v#nJAG+P$(1S9&}ibidz4?fHBPo=zva-EQK~W;3~jEIXYJ4TnSW zdcCgjV%4+lDYeF>`m<$R_Mr@q^6Y0d=8#e$|>LZ3@+w_0SiT1m-dGNOdTcUFU< z5VGxdJKFE}w0~Nyq;}YXNrr;~RVo#-SS+NZQYkrHEEK5IZVPj(*%WIw8q}!QzpY-Y zQLS2~_qR78Fq_RUf-|clwaeuqsxV9fbwho*T#7O}kJ|H}pHwQ9UIggDfouNt@j<_f zMakmdOnzol$mc1OPE(U(27`eVj0yyUeqU5oMa&(l$bSO%bN<@ts{Q-9$7yF!Txm=d@ zR2$L9_zyl%qtSey!y4OcwpR~gu^7eUae1QZQw9Fd e)Tgif{rmy3Y6S^(i-+3)0000fke zNw94jj^n^E4A}P_^E_i+SAJ4X+^1>6d7c=@5mi+o2m-J)O>tcp@;v7dGSEo{1fwDW zZQB;hvLMSc6h#5w_dgR*hraK*iRhv;71VXjyOElvL0Oh~yyV&NAjd+IJrZeW_`Hz)LG z0(n%~s6q*L1ISbS+FM?Ose8-CPlf6ioMFHRUKNC=gzVEq-=%Onfj~g~e!qCVUU9ixDxFS8lF6i4 z6xi?gve|6pa5%_zyOs5Nt-jT2r8*CNKA)o7?N;gadXh*a#D6Lli~2YciD)u7nM@=Y z49aLUlIe7+_INy&;czJZeqRQIfpoiFiAJMhF$Pn3JRV7 zIIKR9?liMXrIPN-{!GH|jDI{H6<@EHd_Es}KA&>G-{t%L%H#3S7>%u3ttRjHTSubE z^?Fq#fx^4p&VMcnC-5|z&2*hyF89X)!R2zP6TpMP`FyTCzy~}yc_N3mS^!}jILKr& z_RjF*RHZ9yPTN0P~; zSQOar_p;e+B!9#z7K{2g5{YOsIGIc& z7!1m2G?M9bs`hw1mf>(H{eE8tgMoCrU5Q4cVlf6&csw3SrBd1@7K>>YFr7|IJRaBN za5$_!knS|IN~MzS%Kl8k?u>st9u;4&mwY}Sc|MRsT071!TEfyJirG$IC&z6w^{&U95~2i zGWO2!`QmJT=NeCJ&m&@829kQK1y8!24 zWCDx?VpG)k$>9+?jquwAxO2T;*WI`XSgls|{*6XMkwwDffaK^OXg*Gn&*!DtZ0cFs z?Y2s*)lwfwoEWyz?E>tEm}?XY1zUIeow}ay-+VveG=0 z_sjPcbIvEU#()0 z_sjPcbIvEU#()qM+*W$42Ab+h=Sn3iwL6FJ65dNd&7o`|Nk2K z9?aq)JF}VO<-JVCE0s!CE|)Er%UL#?wL+m__$rl(6^ljrG5na@yBLqp<#Ms>_3E$h z_uFo_oBrK;I2>%d-P-ANvi*K9U$t5_FA|AZGMTjTcx~FOlSKSTOr=r+feli82A~tv@Aqvu9IDD}HnZt; zs)W&KWUW?9Ajt3;paaL_@vu&(V}rp!Nz3I@My2(7?Ss_obrnM{OucY8Y_V8OdfV-` zs?sD9SpjDc7=OUT;3tP%^?;!J{Vw{G$wU?LozG_la|8Hb(ChV73_x8Y_ezD=>t)?; z*Qfmtz~0Fq20x&ZKqm=87w9zapZ$d};u!C=sT_84bBxqM+*W$42Ab+h=Sn3iwL6FJ65dNd&7o`|Nk2K z9?aq)JF}VO<-JVCE0s!CE|)Er%UL#?wL+m__$rl(6^ljrG5na@yBLqp<#Ms>_3E$h z_uFo_oBrK;I2>%d-P-ANvi*K9U$t5_FA|AZGMTjTcx~FOlSKSTOr=r+feli82A~tv@Aqvu9IDD}HnZt; zs)W&KWUW?9Ajt3;paaL_@vu&(V}rp!Nz3I@My2(7?Ss_obrnM{OucY8Y_V8OdfV-` zs?sD9SpjDc7=OUT;3tP%^?;!J{Vw{G$wU?LozG_la|8Hb(ChV73_x8Y_ezD=>t)?; z*Qfmtz~0Fq20x&ZKqm=87w9zapZ$d};u!C=sT_84bBxV*zxy99A%!UuP4``7AgHL%iMacS zh_NE)h?%+d&FrZK;s!%bPyknK0KUku3PAk=>M#aiT~#*-=9>dvgw4~#_ZpyH`m&B( cuC9Ki369r-HgNZqOaK4?07*qoM6N<$f)KSfsQ>@~ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_8.png b/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e2fdcf3d86c29959167137e194f4515a669fac GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr-gY_Iq<3FyL_6J7NEC zc|FBeO<~{fu_+2GR-EtL@w=mAqtf$^nLEFpeY2AF5u3AL07G~V!@d(6xE%g6y)s}+ zhz&L8cs83kuI23I!{4PA#QoaT7qf0%-BQlJ>rG|_->3QjEn@I=^>bP0l+XkK)ebq^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk.png b/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk.png new file mode 100644 index 0000000000000000000000000000000000000000..2545c5710b70a5f7961419ea9c117354320ca0f1 GIT binary patch literal 1079 zcmaJ=TWHfz7!HV22g8XXIv)%XL}ATI(ss>>>qbo)t*oQe!X}8AC1-2ck`t3t+f5PX z1+Rz?J_%kygdskN`Z7_5D2k%s%Ro_7^hE`c2@WRcNo}VO)4<6&=jZ$W|NAfJXs&xx zQ)5db!!S*m&03!B&EZw?!ej0RJNz%P!EAA&{!$(ZY!hML%IK}|VBf}cr^$4{y z%)GUBp_lY#yA%^Uyb)sfisMl>!?br+Ji{DBgzZBEwwvU>jNj#0+e&gh@vM;bR8+J# zkN9ZoNO!>;88o5Ab#}1r6@@x*5HZ+_Gvo$JCCOF&D)bzh0moJ$WH8D77S)^0u`2cv z8|T|1rWlpk1mwjyl%-fJD+yv75Fij^5kXW0s0bok`#2iSxB8X5rq^Q8Taqgh;wb=> z%VoYC<*`2iLy?1m{%1YkUaV$V@`BX81@jzqX3tDllG&3O`S|@_y0g4kg8EM zY?d74l8lz*sD-y|OHl<~N<%#rOQ^CarV~(taTt@tgs!VPlw);n#tn$!nyAjT|8U`d zxr*u|gJ8da@ld^cxgsVwC}NLQ)v#L$c3qF{TDTmn56fFqi+p=GvUDFiY_&d$J%^4_x}P_T4l5V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk_disconnected.png b/src/main/resources/assets/refinedstorage/textures/blocks/portable_grid_disk_disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..e70a25007b538029537fd1fe919bcac41ccbdc00 GIT binary patch literal 1081 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