diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java index 85839f337..8237dd007 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java @@ -2,7 +2,9 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; +import com.raoulvdberge.refinedstorage.render.PropertyObject; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; +import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -10,9 +12,13 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.property.IExtendedBlockState; public class BlockDiskDrive extends BlockNode { + public static final PropertyObject DISK_STATE = new PropertyObject<>("disk_state", Integer[].class); + public BlockDiskDrive() { super("disk_drive"); } @@ -31,6 +37,16 @@ public class BlockDiskDrive extends BlockNode { return true; } + @Override + protected BlockStateContainer.Builder createBlockStateBuilder() { + return super.createBlockStateBuilder().add(DISK_STATE); + } + + @Override + public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { + return ((IExtendedBlockState) super.getExtendedState(state, world, pos)).withProperty(DISK_STATE, ((TileDiskDrive) world.getTileEntity(pos)).getDiskState()); + } + @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { ((TileDiskDrive) world.getTileEntity(pos)).onBreak(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java index c3c5ff21e..93c68569a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/BakedModelDiskDrive.java @@ -1,6 +1,8 @@ package com.raoulvdberge.refinedstorage.render; import com.raoulvdberge.refinedstorage.block.BlockBase; +import com.raoulvdberge.refinedstorage.block.BlockDiskDrive; +import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.IBakedModel; @@ -9,6 +11,7 @@ import net.minecraft.client.renderer.block.model.ItemOverrideList; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.model.TRSRTransformation; +import net.minecraftforge.common.property.IExtendedBlockState; import javax.annotation.Nullable; import javax.vecmath.Vector3f; @@ -20,50 +23,65 @@ import java.util.Map; public class BakedModelDiskDrive implements IBakedModel { private IBakedModel base; private Map models = new HashMap<>(); - private Map> disks = new HashMap<>(); + private Map>> disks = new HashMap<>(); - public BakedModelDiskDrive(IBakedModel base, IBakedModel disk) { + public BakedModelDiskDrive(IBakedModel base, IBakedModel disk, IBakedModel diskFull, IBakedModel diskDisconnected) { this.base = base; for (EnumFacing facing : EnumFacing.HORIZONTALS) { models.put(facing, new BakedModelTRSR(base, facing)); - disks.put(facing, new ArrayList<>()); + disks.put(facing, new HashMap<>()); - for (int y = 0; y < 4; ++y) { - for (int x = 0; x < 2; ++x) { - BakedModelTRSR model = new BakedModelTRSR(disk, facing); + disks.get(facing).put(TileDiskDrive.DISK_STATE_NORMAL, new ArrayList<>()); + disks.get(facing).put(TileDiskDrive.DISK_STATE_FULL, new ArrayList<>()); + disks.get(facing).put(TileDiskDrive.DISK_STATE_DISCONNECTED, new ArrayList<>()); - Vector3f trans = model.transformation.getTranslation(); + initDiskModels(disk, TileDiskDrive.DISK_STATE_NORMAL, facing); + initDiskModels(diskFull, TileDiskDrive.DISK_STATE_FULL, facing); + initDiskModels(diskDisconnected, TileDiskDrive.DISK_STATE_DISCONNECTED, facing); + } + } - if (facing == EnumFacing.NORTH || facing == EnumFacing.SOUTH) { - trans.x += (((float) x * 7F) / 16F) * (facing == EnumFacing.NORTH ? -1 : 1); - } else if (facing == EnumFacing.EAST || facing == EnumFacing.WEST) { - trans.z += (((float) x * 7F) / 16F) * (facing == EnumFacing.EAST ? -1 : 1); - } + private void initDiskModels(IBakedModel disk, int type, EnumFacing facing) { + for (int y = 0; y < 4; ++y) { + for (int x = 0; x < 2; ++x) { + BakedModelTRSR model = new BakedModelTRSR(disk, facing); - trans.y -= ((float) y * 3F) / 16F; + Vector3f trans = model.transformation.getTranslation(); - model.transformation = new TRSRTransformation(trans, model.transformation.getLeftRot(), model.transformation.getScale(), model.transformation.getRightRot()); - - disks.get(facing).add(model); + if (facing == EnumFacing.NORTH || facing == EnumFacing.SOUTH) { + trans.x += (((float) x * 7F) / 16F) * (facing == EnumFacing.NORTH ? -1 : 1); + } else if (facing == EnumFacing.EAST || facing == EnumFacing.WEST) { + trans.z += (((float) x * 7F) / 16F) * (facing == EnumFacing.EAST ? -1 : 1); } + + trans.y -= ((float) y * 3F) / 16F; + + model.transformation = new TRSRTransformation(trans, model.transformation.getLeftRot(), model.transformation.getScale(), model.transformation.getRightRot()); + + disks.get(facing).get(type).add(model); } } } @Override public List getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { - if (state == null) { + if (!(state instanceof IExtendedBlockState)) { return base.getQuads(state, side, rand); } EnumFacing facing = state.getValue(BlockBase.DIRECTION); + Integer[] diskState = ((IExtendedBlockState) state).getValue(BlockDiskDrive.DISK_STATE); List quads = models.get(facing).getQuads(state, side, rand); - for (int i = 0; i < 8; ++i) { - quads.addAll(disks.get(facing).get(i).getQuads(state, side, rand)); + if (diskState != null) { + for (int i = 0; i < 8; ++i) { + if (diskState[i] != null && diskState[i] != TileDiskDrive.DISK_STATE_NONE) { + quads.addAll(disks.get(facing).get(diskState[i]).get(i).getQuads(state, side, rand)); + } + } } return quads; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java index ff0acd3fb..e04aef4a1 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/ModelDiskDrive.java @@ -16,6 +16,8 @@ import java.util.Collections; public class ModelDiskDrive implements IModel { private static final ResourceLocation MODEL_BASE = new ResourceLocation("refinedstorage:block/disk_drive"); private static final ResourceLocation MODEL_DISK = new ResourceLocation("refinedstorage:block/disk_drive_disk"); + private static final ResourceLocation MODEL_DISK_FULL = new ResourceLocation("refinedstorage:block/disk_drive_disk_full"); + private static final ResourceLocation MODEL_DISK_DISCONNECTED = new ResourceLocation("refinedstorage:block/disk_drive_disk_disconnected"); @Override public Collection getDependencies() { @@ -31,15 +33,24 @@ public class ModelDiskDrive implements IModel { public IBakedModel bake(IModelState state, VertexFormat format, Function bakedTextureGetter) { IModel baseModel; IModel diskModel; + IModel diskModelFull; + IModel diskModelDisconnected; try { baseModel = ModelLoaderRegistry.getModel(MODEL_BASE); diskModel = ModelLoaderRegistry.getModel(MODEL_DISK); + diskModelFull = ModelLoaderRegistry.getModel(MODEL_DISK_FULL); + diskModelDisconnected = ModelLoaderRegistry.getModel(MODEL_DISK_DISCONNECTED); } catch (Exception e) { throw new Error("Unable to load disk drive models", e); } - return new BakedModelDiskDrive(baseModel.bake(state, format, bakedTextureGetter), diskModel.bake(state, format, bakedTextureGetter)); + return new BakedModelDiskDrive( + baseModel.bake(state, format, bakedTextureGetter), + diskModel.bake(state, format, bakedTextureGetter), + diskModelFull.bake(state, format, bakedTextureGetter), + diskModelDisconnected.bake(state, format, bakedTextureGetter) + ); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/PropertyObject.java b/src/main/java/com/raoulvdberge/refinedstorage/render/PropertyObject.java new file mode 100755 index 000000000..4e9d44a82 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/PropertyObject.java @@ -0,0 +1,52 @@ +package com.raoulvdberge.refinedstorage.render; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import net.minecraftforge.common.property.IUnlistedProperty; + +import java.util.Objects; + +public class PropertyObject implements IUnlistedProperty { + private final String name; + private final Class clazz; + private final Predicate validator; + private final Function stringFunction; + + public PropertyObject(String name, Class clazz, Predicate validator, Function stringFunction) { + this.name = name; + this.clazz = clazz; + this.validator = validator; + this.stringFunction = stringFunction; + } + + public PropertyObject(String name, Class clazz) { + this(name, clazz, Predicates.alwaysTrue(), new Function() { + @Override + public String apply(T input) { + return Objects.toString(input); + } + }); + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean isValid(T value) { + return validator.apply(value); + } + + @Override + public Class getType() { + return clazz; + } + + @Override + public String valueToString(T value) { + return stringFunction.apply(value); + } +} + diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java index 9a4f760fa..234268632 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java @@ -109,6 +109,12 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl private static final String NBT_MODE = "Mode"; private static final String NBT_TYPE = "Type"; private static final String NBT_VOID_EXCESS = "VoidExcess"; + private static final String NBT_DISK_STATE = "DiskState_%d"; + + public static final int DISK_STATE_NORMAL = 0; + public static final int DISK_STATE_FULL = 1; + public static final int DISK_STATE_DISCONNECTED = 2; + public static final int DISK_STATE_NONE = 3; private ItemHandlerBasic disks = new ItemHandlerBasic(8, this, IItemValidator.STORAGE_DISK) { @Override @@ -156,6 +162,8 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl private int type = IType.ITEMS; private boolean voidExcess = false; + private Integer[] diskState = new Integer[8]; + public TileDiskDrive() { dataManager.addWatchedParameter(PRIORITY); dataManager.addWatchedParameter(COMPARE); @@ -202,6 +210,8 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl network.getItemStorageCache().invalidate(); network.getFluidStorageCache().invalidate(); + + updateBlock(); } @Override @@ -282,6 +292,45 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl return tag; } + @Override + public NBTTagCompound writeUpdate(NBTTagCompound tag) { + super.writeUpdate(tag); + + for (int i = 0; i < 8; ++i) { + int state = DISK_STATE_NONE; + + if (itemStorages[i] != null || fluidStorages[i] != null) { + if (!connected) { + state = DISK_STATE_DISCONNECTED; + } else { + state = DISK_STATE_NORMAL; + + if ((itemStorages[i] != null && itemStorages[i].getStored() == itemStorages[i].getCapacity()) || + (fluidStorages[i] != null && fluidStorages[i].getStored() == fluidStorages[i].getCapacity())) { + state = DISK_STATE_FULL; + } + } + } + + tag.setInteger(String.format(NBT_DISK_STATE, i), state); + } + + return tag; + } + + @Override + public void readUpdate(NBTTagCompound tag) { + super.readUpdate(tag); + + for (int i = 0; i < 8; ++i) { + diskState[i] = tag.getInteger(String.format(NBT_DISK_STATE, i)); + } + } + + public Integer[] getDiskState() { + return diskState; + } + @Override public int getCompare() { return compare; diff --git a/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk.json b/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk.json index 84294533a..d4c8564fe 100755 --- a/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk.json +++ b/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk.json @@ -1,5 +1,8 @@ { "__comment": "Model made by CyanideX", + "textures": { + "disk": "refinedstorage:blocks/disk_drive_disk" + }, "elements": [ { "name": "disk", diff --git a/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk_disconnected.json b/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk_disconnected.json new file mode 100755 index 000000000..c85e9786b --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk_disconnected.json @@ -0,0 +1,146 @@ +{ + "__comment": "Model made by CyanideX", + "textures": { + "disk": "refinedstorage:blocks/disk_drive_disk_disconnected" + }, + "elements": [ + { + "name": "disk", + "from": [ + 9.0, + 12.0, + -1.0 + ], + "to": [ + 14.0, + 14.0, + 0.0 + ], + "faces": { + "north": { + "texture": "#disk", + "uv": [ + 3.0, + 0.0, + 8.0, + 2.0 + ] + }, + "east": { + "texture": "#disk", + "uv": [ + 2.0, + 0.0, + 3.0, + 2.0 + ] + }, + "south": { + "texture": "#disk", + "uv": [ + 9.0, + 0.0, + 14.0, + 2.0 + ] + }, + "west": { + "texture": "#disk", + "uv": [ + 8.0, + 0.0, + 9.0, + 2.0 + ] + }, + "up": { + "texture": "#disk", + "uv": [ + 3.0, + 2.0, + 8.0, + 3.0 + ] + }, + "down": { + "texture": "#disk", + "uv": [ + 3.0, + 3.0, + 8.0, + 4.0 + ] + } + } + }, + { + "name": "led", + "from": [ + 10.0, + 11.95, + -1.05 + ], + "to": [ + 11.0, + 13.0, + -0.10000000000000009 + ], + "faces": { + "north": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "east": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "south": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "west": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "up": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "down": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk_full.json b/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk_full.json new file mode 100755 index 000000000..bee481873 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/block/disk_drive_disk_full.json @@ -0,0 +1,146 @@ +{ + "__comment": "Model made by CyanideX", + "textures": { + "disk": "refinedstorage:blocks/disk_drive_disk_full" + }, + "elements": [ + { + "name": "disk", + "from": [ + 9.0, + 12.0, + -1.0 + ], + "to": [ + 14.0, + 14.0, + 0.0 + ], + "faces": { + "north": { + "texture": "#disk", + "uv": [ + 3.0, + 0.0, + 8.0, + 2.0 + ] + }, + "east": { + "texture": "#disk", + "uv": [ + 2.0, + 0.0, + 3.0, + 2.0 + ] + }, + "south": { + "texture": "#disk", + "uv": [ + 9.0, + 0.0, + 14.0, + 2.0 + ] + }, + "west": { + "texture": "#disk", + "uv": [ + 8.0, + 0.0, + 9.0, + 2.0 + ] + }, + "up": { + "texture": "#disk", + "uv": [ + 3.0, + 2.0, + 8.0, + 3.0 + ] + }, + "down": { + "texture": "#disk", + "uv": [ + 3.0, + 3.0, + 8.0, + 4.0 + ] + } + } + }, + { + "name": "led", + "from": [ + 10.0, + 11.95, + -1.05 + ], + "to": [ + 11.0, + 13.0, + -0.10000000000000009 + ], + "faces": { + "north": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "east": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "south": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "west": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "up": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + }, + "down": { + "texture": "#disk", + "uv": [ + 14.0, + 1.0, + 15.0, + 2.0 + ] + } + } + } + ] +} \ No newline at end of file