From d50dcc31fa0623bcd557104ee78c3a224cde4d57 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 15 Jun 2020 22:20:29 +0200 Subject: [PATCH] Working on drive design. Several particle crash fixes. --- .../implementations/tiles/IChestOrDrive.java | 10 + .../java/appeng/block/misc/BlockCharger.java | 6 +- .../misc/BlockQuartzGrowthAccelerator.java | 3 +- .../block/storage/DriveSlotCellType.java | 50 ++++ .../appeng/block/storage/DriveSlotsState.java | 51 +++- .../client/render/effects/LightningFX.java | 3 +- .../render/model/AutoRotatingBakedModel.java | 5 + .../client/render/model/DriveBakedModel.java | 72 +++-- .../client/render/model/DriveModel.java | 22 +- .../tesr/DriveLedTileEntityRenderer.java | 158 ++++++++++ .../core/api/definitions/ApiBlocks.java | 15 +- .../items/storage/AbstractStorageCell.java | 4 +- .../java/appeng/tile/storage/TileChest.java | 11 + .../java/appeng/tile/storage/TileDrive.java | 93 +++++- .../models/block/drive/drive_base.json | 121 ++++++++ .../models/block/drive/drive_cell_empty.json | 6 + .../models/block/drive/drive_cell_fluids.json | 49 ++++ .../models/block/drive/drive_cell_items.json | 49 ++++ .../block/drive/drive_cell_led_base.json | 88 ++++++ .../models/block/drive_base.json | 172 ----------- .../models/block/drive_base_depth.json | 273 ------------------ .../models/block/drive_cell_empty.json | 32 -- .../models/block/drive_cell_full.json | 60 ---- .../models/block/drive_cell_off.json | 31 -- .../models/block/drive_cell_on.json | 60 ---- .../models/block/drive_cell_types_full.json | 60 ---- .../models/item/drive.json | 4 +- .../textures/block/drive_bottom.png | Bin 398 -> 0 bytes .../textures/block/drive_cell_states.png | Bin 182 -> 0 bytes .../textures/block/drive_front.png | Bin 442 -> 0 bytes .../textures/block/drive_front_flat.png | Bin 274 -> 0 bytes .../textures/block/drive_side.png | Bin 438 -> 0 bytes .../textures/block/drive_top.png | Bin 398 -> 0 bytes 33 files changed, 748 insertions(+), 760 deletions(-) create mode 100644 src/main/java/appeng/block/storage/DriveSlotCellType.java create mode 100644 src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_empty.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_base.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_base_depth.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_cell_empty.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_cell_full.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_cell_off.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_cell_on.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/block/drive_cell_types_full.json delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive_bottom.png delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive_cell_states.png delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive_front.png delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive_front_flat.png delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive_side.png delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/block/drive_top.png diff --git a/src/api/java/appeng/api/implementations/tiles/IChestOrDrive.java b/src/api/java/appeng/api/implementations/tiles/IChestOrDrive.java index 0be1d0030..e6da86baa 100644 --- a/src/api/java/appeng/api/implementations/tiles/IChestOrDrive.java +++ b/src/api/java/appeng/api/implementations/tiles/IChestOrDrive.java @@ -27,6 +27,9 @@ package appeng.api.implementations.tiles; import appeng.api.networking.IGridHost; import appeng.api.storage.ICellContainer; import appeng.api.util.IOrientable; +import net.minecraft.item.Item; + +import javax.annotation.Nullable; public interface IChestOrDrive extends ICellContainer, IGridHost, IOrientable @@ -63,4 +66,11 @@ public interface IChestOrDrive extends ICellContainer, IGridHost, IOrientable * @return is the cell currently blinking to show activity. */ boolean isCellBlinking( int slot ); + + /** + * Returns the item of the cell in the given slot or null. + */ + @Nullable + Item getCellItem(int slot ); + } diff --git a/src/main/java/appeng/block/misc/BlockCharger.java b/src/main/java/appeng/block/misc/BlockCharger.java index aee166a01..247c3e116 100644 --- a/src/main/java/appeng/block/misc/BlockCharger.java +++ b/src/main/java/appeng/block/misc/BlockCharger.java @@ -22,6 +22,7 @@ package appeng.block.misc; import appeng.api.AEApi; import appeng.api.util.AEAxisAlignedBB; import appeng.block.AEBaseTileBlock; +import appeng.client.render.effects.ChargedOreFX; import appeng.client.render.effects.LightningFX; import appeng.client.render.renderable.ItemRenderable; import appeng.client.render.tesr.ModularTESR; @@ -121,9 +122,8 @@ public class BlockCharger extends AEBaseTileBlock { if( AppEng.proxy.shouldAddParticles( r ) ) { - final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos - .getZ(), 0.0, 0.0, 0.0 ); - Minecraft.getInstance().particles.addEffect( fx ); + Minecraft.getInstance().particles.addParticle(LightningFX.TYPE, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos + .getZ(), 0.0, 0.0, 0.0); } } } diff --git a/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java b/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java index 028d72188..5ff64f469 100644 --- a/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java +++ b/src/main/java/appeng/block/misc/BlockQuartzGrowthAccelerator.java @@ -142,8 +142,7 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock. + */ + +package appeng.block.storage; + + +import net.minecraft.util.IStringSerializable; + + +/** + * Describes the type of cell present in a slot. + */ +public enum DriveSlotCellType implements IStringSerializable +{ + + EMPTY("empty"), + + ITEM("item"), + + FLUID("fluid"); + + private final String name; + + DriveSlotCellType(String name ) + { + this.name = name; + } + + @Override + public String getName() + { + return this.name; + } + +} diff --git a/src/main/java/appeng/block/storage/DriveSlotsState.java b/src/main/java/appeng/block/storage/DriveSlotsState.java index 48a6d4d74..5d4be1501 100644 --- a/src/main/java/appeng/block/storage/DriveSlotsState.java +++ b/src/main/java/appeng/block/storage/DriveSlotsState.java @@ -20,6 +20,9 @@ package appeng.block.storage; import appeng.api.implementations.tiles.IChestOrDrive; +import com.google.common.base.Preconditions; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; /** @@ -28,25 +31,37 @@ import appeng.api.implementations.tiles.IChestOrDrive; public class DriveSlotsState { - private final DriveSlotState[] slots; + private final Item[] cells; - private DriveSlotsState( DriveSlotState[] slots ) - { - this.slots = slots; + private final DriveSlotState[] states; + + public DriveSlotsState(Item[] cells, DriveSlotState[] states) { + Preconditions.checkArgument(cells.length == states.length); + this.cells = cells; + this.states = states; } - public DriveSlotState getState( int index ) + public DriveSlotState getState(int index ) { - if( index >= this.slots.length ) + if( index >= this.states.length ) { return DriveSlotState.EMPTY; } - return this.slots[index]; + return this.states[index]; + } + + public Item getCell(int index ) + { + if( index >= this.cells.length ) + { + return null; + } + return this.cells[index]; } public int getSlotCount() { - return this.slots.length; + return this.cells.length; } /** @@ -54,35 +69,39 @@ public class DriveSlotsState */ public static DriveSlotsState fromChestOrDrive( IChestOrDrive chestOrDrive ) { - DriveSlotState[] slots = new DriveSlotState[chestOrDrive.getCellCount()]; + DriveSlotState[] states = new DriveSlotState[chestOrDrive.getCellCount()]; + Item[] cells = new Item[chestOrDrive.getCellCount()]; for( int i = 0; i < chestOrDrive.getCellCount(); i++ ) { + cells[i] = chestOrDrive.getCellItem(i); + if( !chestOrDrive.isPowered() ) { if( chestOrDrive.getCellStatus( i ) != 0 ) { - slots[i] = DriveSlotState.OFFLINE; + states[i] = DriveSlotState.OFFLINE; } else { - slots[i] = DriveSlotState.EMPTY; + states[i] = DriveSlotState.EMPTY; } } else { - slots[i] = DriveSlotState.fromCellStatus( chestOrDrive.getCellStatus( i ) ); + states[i] = DriveSlotState.fromCellStatus( chestOrDrive.getCellStatus( i ) ); } } - return new DriveSlotsState( slots ); + return new DriveSlotsState( cells, states ); } public static DriveSlotsState createEmpty( int slotCount ) { - DriveSlotState[] slots = new DriveSlotState[slotCount]; + DriveSlotState[] states = new DriveSlotState[slotCount]; + Item[] cells = new Item[slotCount]; for( int i = 0; i < slotCount; i++ ) { - slots[i] = DriveSlotState.EMPTY; + states[i] = DriveSlotState.EMPTY; } - return new DriveSlotsState( slots ); + return new DriveSlotsState( cells, states ); } } diff --git a/src/main/java/appeng/client/render/effects/LightningFX.java b/src/main/java/appeng/client/render/effects/LightningFX.java index e6e58e0cf..307454c88 100644 --- a/src/main/java/appeng/client/render/effects/LightningFX.java +++ b/src/main/java/appeng/client/render/effects/LightningFX.java @@ -56,7 +56,7 @@ public class LightningFX extends SpriteTexturedParticle private final double[] verticesWithUV = new double[3]; private boolean hasData = false; - public LightningFX( final World w, final double x, final double y, final double z, final double r, final double g, final double b ) + private LightningFX( final World w, final double x, final double y, final double z, final double r, final double g, final double b ) { this( w, x, y, z, r, g, b, 6 ); this.regen(); @@ -117,7 +117,6 @@ public class LightningFX extends SpriteTexturedParticle @Override public void renderParticle(IVertexBuilder buffer, ActiveRenderInfo renderInfo, float partialTicks) { - Vec3d vec3d = renderInfo.getProjectedView(); float centerX = (float)(MathHelper.lerp(partialTicks, this.prevPosX, this.posX) - vec3d.getX()); float centerY = (float)(MathHelper.lerp(partialTicks, this.prevPosY, this.posY) - vec3d.getY()); diff --git a/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java b/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java index 0e2c62363..4fb24bc6e 100644 --- a/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java +++ b/src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java @@ -74,6 +74,11 @@ public class AutoRotatingBakedModel implements IBakedModel private List getRotatedModel(BlockState state, Direction side, Random rand, AEModelData modelData) { FacingToRotation f2r = FacingToRotation.get( modelData.getForward(), modelData.getUp() ); + + if (f2r.isRedundant()) { + return AutoRotatingBakedModel.this.parent.getQuads( state, side, rand, modelData ); + } + List original = AutoRotatingBakedModel.this.parent.getQuads( state, f2r.resultingRotate( side ), rand, modelData ); List rotated = new ArrayList<>( original.size() ); for( BakedQuad quad : original ) diff --git a/src/main/java/appeng/client/render/model/DriveBakedModel.java b/src/main/java/appeng/client/render/model/DriveBakedModel.java index 663f25d3f..326fde664 100644 --- a/src/main/java/appeng/client/render/model/DriveBakedModel.java +++ b/src/main/java/appeng/client/render/model/DriveBakedModel.java @@ -19,14 +19,17 @@ package appeng.client.render.model; -import appeng.block.storage.DriveSlotState; +import appeng.api.definitions.IItems; +import appeng.block.storage.DriveSlotCellType; import appeng.block.storage.DriveSlotsState; import appeng.client.render.DelegateBakedModel; -import appeng.tile.storage.TileDrive; +import appeng.core.Api; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; @@ -41,13 +44,11 @@ import java.util.Random; public class DriveBakedModel extends DelegateBakedModel { - private final IBakedModel bakedBase; - private final Map bakedCells; + private final Map bakedCells; - public DriveBakedModel( IBakedModel bakedBase, Map bakedCells ) + public DriveBakedModel( IBakedModel bakedBase, Map bakedCells ) { super(bakedBase); - this.bakedBase = bakedBase; this.bakedCells = bakedCells; } @@ -55,7 +56,7 @@ public class DriveBakedModel extends DelegateBakedModel @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData) { - List result = new ArrayList<>(this.bakedBase.getQuads(state, side, rand, extraData)); + List result = new ArrayList<>(super.getQuads(state, side, rand, extraData)); if (!(extraData instanceof DriveModelData)) { return result; @@ -70,29 +71,20 @@ public class DriveBakedModel extends DelegateBakedModel { for( int col = 0; col < 2; col++ ) { - DriveSlotState slotState = slotsState.getState( row * 2 + col ); - - IBakedModel bakedCell = this.bakedCells.get( slotState ); - Matrix4f transform = new Matrix4f(); - transform.setIdentity(); // Position this drive model copy at the correct slot. The transform is based on the // cell-model being in slot 0,0 at the top left of the drive. float xOffset = -col * 7 / 16.0f; float yOffset = -row * 3 / 16.0f; - transform.setTranslation( xOffset, yOffset, 0 ); - MatrixVertexTransformer transformer = new MatrixVertexTransformer( transform ); - for( BakedQuad bakedQuad : bakedCell.getQuads( state, null, rand, extraData ) ) - { - BakedQuadBuilder builder = new BakedQuadBuilder(); - transformer.setParent( builder ); - transformer.setVertexFormat( builder.getVertexFormat() ); - bakedQuad.pipe( transformer ); - result.add( builder.build() ); - } + int slot = row * 2 + col; + + // Add the drive chassis + Item cell = slotsState.getCell(slot); + IBakedModel cellChassisModel = getCellChassisModel(cell); + addModel(state, rand, extraData, result, cellChassisModel, transform); } } } @@ -100,4 +92,40 @@ public class DriveBakedModel extends DelegateBakedModel return result; } + @Override + public boolean isAmbientOcclusion() { + // We have faces inside the chassis that are facing east, but should not receive + // ambient occlusion from the east-side, but sadly this cannot be fine-tuned on a + // face-by-face basis. + return false; + } + + // Determine which drive chassis to show based on the used cell + private IBakedModel getCellChassisModel(Item cell) { + IItems items = Api.INSTANCE.definitions().items(); + if (cell == null) { + return bakedCells.get(DriveSlotCellType.EMPTY); + } else if (items.fluidCell1k().item() == cell + || items.fluidCell4k().item() == cell + || items.fluidCell16k().item() == cell + || items.fluidCell64k().item() == cell) { + return bakedCells.get(DriveSlotCellType.FLUID); + } else { + // Fall back to an item model + return bakedCells.get(DriveSlotCellType.ITEM); + } + } + + private static void addModel(@Nullable BlockState state, @Nonnull Random rand, @Nonnull IModelData extraData, List result, IBakedModel bakedCell, Matrix4f transform) { + MatrixVertexTransformer transformer = new MatrixVertexTransformer( transform ); + for( BakedQuad bakedQuad : bakedCell.getQuads( state, null, rand, extraData ) ) + { + BakedQuadBuilder builder = new BakedQuadBuilder(); + transformer.setParent( builder ); + transformer.setVertexFormat( builder.getVertexFormat() ); + bakedQuad.pipe( transformer ); + result.add( builder.build() ); + } + } + } diff --git a/src/main/java/appeng/client/render/model/DriveModel.java b/src/main/java/appeng/client/render/model/DriveModel.java index 3e195abf8..f509ed6f1 100644 --- a/src/main/java/appeng/client/render/model/DriveModel.java +++ b/src/main/java/appeng/client/render/model/DriveModel.java @@ -19,6 +19,7 @@ package appeng.client.render.model; +import appeng.block.storage.DriveSlotCellType; import appeng.block.storage.DriveSlotState; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -36,14 +37,13 @@ import java.util.function.Function; public class DriveModel implements IModelGeometry { - private static final ResourceLocation MODEL_BASE = new ResourceLocation( "appliedenergistics2:block/drive_base" ); + private static final ResourceLocation MODEL_BASE = new ResourceLocation( "appliedenergistics2:block/drive/drive_base" ); - private static final Map MODELS_CELLS = ImmutableMap.of( - DriveSlotState.EMPTY, new ResourceLocation( "appliedenergistics2:block/drive_cell_empty" ), - DriveSlotState.OFFLINE, new ResourceLocation( "appliedenergistics2:block/drive_cell_off" ), - DriveSlotState.ONLINE, new ResourceLocation( "appliedenergistics2:block/drive_cell_on" ), - DriveSlotState.TYPES_FULL, new ResourceLocation( "appliedenergistics2:block/drive_cell_types_full" ), - DriveSlotState.FULL, new ResourceLocation( "appliedenergistics2:block/drive_cell_full" ) ); + private static final Map MODELS_CELLS = ImmutableMap.of( + DriveSlotCellType.EMPTY, new ResourceLocation( "appliedenergistics2:block/drive/drive_cell_empty" ), + DriveSlotCellType.ITEM, new ResourceLocation( "appliedenergistics2:block/drive/drive_cell_items" ), + DriveSlotCellType.FLUID, new ResourceLocation( "appliedenergistics2:block/drive/drive_cell_fluids" ) + ); public static final Set DEPENDENCIES = ImmutableSet.builder() .addAll(MODELS_CELLS.values()) @@ -52,13 +52,13 @@ public class DriveModel implements IModelGeometry @Override public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, ItemOverrideList overrides, ResourceLocation modelLocation) { - EnumMap cellModels = new EnumMap<>( DriveSlotState.class ); + EnumMap cellModels = new EnumMap<>( DriveSlotCellType.class ); // Load the base model and the model for each cell state. - for( DriveSlotState slotState : MODELS_CELLS.keySet() ) + for( DriveSlotCellType cellType : MODELS_CELLS.keySet() ) { - IBakedModel cellModel = bakery.getBakedModel( MODELS_CELLS.get( slotState ), modelTransform, spriteGetter ); - cellModels.put( slotState, cellModel ); + IBakedModel cellModel = bakery.getBakedModel( MODELS_CELLS.get( cellType ), modelTransform, spriteGetter ); + cellModels.put( cellType, cellModel ); } IBakedModel baseModel = bakery.getBakedModel( MODEL_BASE, modelTransform, spriteGetter ); diff --git a/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java new file mode 100644 index 000000000..fe2022592 --- /dev/null +++ b/src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java @@ -0,0 +1,158 @@ +package appeng.client.render.tesr; + +import appeng.block.storage.DriveSlotState; +import appeng.client.render.FacingToRotation; +import appeng.client.render.cablebus.CubeBuilder; +import appeng.tile.storage.TileDrive; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import javafx.scene.DepthTest; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import org.lwjgl.system.MathUtil; + +import java.util.EnumMap; +import java.util.EnumSet; + +/** + * Renders the drive cell status indicators. + */ +@OnlyIn(Dist.CLIENT) +public class DriveLedTileEntityRenderer extends TileEntityRenderer { + + private static final EnumMap STATE_COLORS; + + // Color used for the cell indicator for blinking during recent activity + private static final Vector3f BLINK_COLOR = new Vector3f(1, 0.5f, 0.5f); + + static { + STATE_COLORS = new EnumMap<>(DriveSlotState.class); + STATE_COLORS.put(DriveSlotState.OFFLINE, new Vector3f(0, 0, 0)); + STATE_COLORS.put(DriveSlotState.ONLINE, new Vector3f(0, 1, 0)); + STATE_COLORS.put(DriveSlotState.TYPES_FULL, new Vector3f(0, 0.667f, 0)); + STATE_COLORS.put(DriveSlotState.FULL, new Vector3f(1, 0, 0)); + } + + private static final float L = 14/16.f; // left (x-axis) + private static final float R = 13/16.f; // right (x-axis) + private static final float T = 14/16.f; // top (x-axis) + private static final float B = 12.999f/16.f; // bottom (x-axis) + private static final float FR = 0.4f/16.f; // front (z-axis) + private static final float BA = 1/16.f; // back (z-axis) + + // Vertex data for the LED cuboid (has no back) + // Directions are when looking from the front onto the LED + private static final float[] LED_QUADS = { + // Front Face + R, T, FR, + L, T, FR, + L, B, FR, + R, B, FR, + // Left Face + L, T, FR, + L, T, BA, + L, B, BA, + L, B, FR, + // Right Face + R, T, BA, + R, T, FR, + R, B, FR, + R, B, BA, + // Top Face + R, T, BA, + L, T, BA, + L, T, FR, + R, T, FR, + // Bottom Face + R, B, FR, + L, B, FR, + L, B, BA, + R, B, BA, + }; + + private static final RenderType STATE = RenderType.makeType("ae_drive_leds", DefaultVertexFormats.POSITION_COLOR, 7, 32565, false, true, RenderType.State.getBuilder() + .build(false)); + + public DriveLedTileEntityRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { + super(rendererDispatcherIn); + } + + @Override + public void render(TileDrive drive, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffers, int combinedLightIn, int combinedOverlayIn) { + + if (drive.getCellCount() != 10) { + throw new IllegalStateException("Expected drive to have 10 slots"); + } + + ms.push(); + ms.translate(0.5, 0.5, 0.5); + FacingToRotation.get(drive.getForward(), drive.getUp()).push(ms); + ms.translate(-0.5, -0.5, -0.5); + + RenderState.TransparencyState TRANSLUCENT_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_"); + RenderType rt =RenderType.makeType("ae_drive_leds", DefaultVertexFormats.POSITION_COLOR, 7, 32565, false, true, RenderType.State.getBuilder() + .transparency(TRANSLUCENT_TRANSPARENCY) + .build(false)); + IVertexBuilder buffer = buffers.getBuffer(STATE); + + for (int row = 0; row < 5; row++) { + for (int col = 0; col < 2; col++) { + int slot = row * 2 + col; + Vector3f color = getColorForSlot(drive, slot, partialTicks); + if (color == null) { + continue; + } + + ms.push(); + + // Position this drive model copy at the correct slot. The transform is based on the + // cell-model being in slot 0,0 at the top left of the drive. + float xOffset = -col * 7 / 16.0f; + float yOffset = -row * 3 / 16.0f; + ms.translate(xOffset, yOffset, 0); + + for (int i = 0; i < LED_QUADS.length; i += 3) { + float x = LED_QUADS[i]; + float y = LED_QUADS[i+1]; + float z = LED_QUADS[i+2]; + buffer.pos(ms.getLast().getMatrix(), x, y, z).color(color.getX(), color.getY(), color.getZ(), 1.f).endVertex(); + } + + ms.pop(); + } + } + + ms.pop(); + + } + + private Vector3f getColorForSlot(TileDrive drive, int slot, float partialTicks) { + DriveSlotState state = DriveSlotState.fromCellStatus(drive.getCellStatus(slot)); + if (state == DriveSlotState.EMPTY) { + return null; + } + + Vector3f col = STATE_COLORS.get(state); + if (drive.isCellBlinking(slot)) { + // 200 ms interval (100ms to get to red, then 100ms back) + long t = System.currentTimeMillis() % 200; + float f = (t - 100) / 200.0f + 0.5f; + f = easeInOutCubic(f); + col = col.copy(); + col.lerp(BLINK_COLOR, f); + } + + return col; + } + + private static float easeInOutCubic(float x) { + return x < 0.5f ? 4 * x * x * x : 1 - (float) Math.pow(-2 * x + 2, 3) / 2; + } + +} diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index 0271dc3e3..9be106cda 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -39,7 +39,6 @@ import appeng.block.spatial.BlockSpatialIOPort; import appeng.block.spatial.BlockSpatialPylon; import appeng.block.storage.*; import appeng.bootstrap.*; -import appeng.bootstrap.components.IEntityRegistrationComponent; import appeng.bootstrap.components.IInitComponent; import appeng.bootstrap.definitions.TileEntityDefinition; import appeng.client.render.crafting.CraftingCubeRendering; @@ -48,16 +47,15 @@ import appeng.client.render.crafting.MonitorBakedModel; import appeng.client.render.model.AutoRotatingBakedModel; import appeng.client.render.spatial.SpatialPylonRendering; import appeng.client.render.tesr.CrankTESR; +import appeng.client.render.tesr.DriveLedTileEntityRenderer; import appeng.client.render.tesr.SkyChestTESR; import appeng.core.AppEng; -import appeng.core.features.registries.PartModels; import appeng.debug.*; import appeng.decorative.AEDecorativeBlock; import appeng.decorative.solid.*; import appeng.entity.EntityTinyTNTPrimed; import appeng.fluids.block.BlockFluidInterface; import appeng.fluids.tile.TileFluidInterface; -import appeng.helpers.AEGlassMaterial; import appeng.hooks.DispenserBehaviorTinyTNT; import appeng.tile.crafting.TileCraftingMonitorTile; import appeng.tile.crafting.TileCraftingStorageTile; @@ -78,7 +76,6 @@ import net.minecraft.block.*; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.RenderType; import net.minecraft.entity.EntityClassification; -import net.minecraft.entity.EntityType; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -365,7 +362,15 @@ public final class ApiBlocks implements IBlocks .build(); this.drive = registry.block( "drive", BlockDrive::new ) .features( AEFeature.STORAGE_CELLS, AEFeature.ME_DRIVE ) - .tileEntity( registry.tileEntity("drive", TileDrive.class, TileDrive::new).build() ) + .tileEntity( registry.tileEntity("drive", TileDrive.class, TileDrive::new) + .rendering(new TileEntityRenderingCustomizer() { + @Override + @OnlyIn(Dist.CLIENT) + public void customize(TileEntityRendering rendering) { + rendering.tileEntityRenderer(DriveLedTileEntityRenderer::new); + } + }) + .build() ) .rendering( new DriveRendering() ) .build(); this.chest = registry.block( "chest", BlockChest::new ) diff --git a/src/main/java/appeng/items/storage/AbstractStorageCell.java b/src/main/java/appeng/items/storage/AbstractStorageCell.java index 4bcf219c2..cb73e8c5f 100644 --- a/src/main/java/appeng/items/storage/AbstractStorageCell.java +++ b/src/main/java/appeng/items/storage/AbstractStorageCell.java @@ -72,7 +72,6 @@ public abstract class AbstractStorageCell> extends AEBaseI public AbstractStorageCell(Properties properties, final MaterialType whichCell, final int kilobytes ) { super(properties); - // FIXME this.setMaxStackSize( 1 ); ---- see point of registration this.totalBytes = kilobytes * 1024; this.component = whichCell; } @@ -244,4 +243,7 @@ public abstract class AbstractStorageCell> extends AEBaseI { return AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_DISASSEMBLY_CRAFTING ); } + + + } diff --git a/src/main/java/appeng/tile/storage/TileChest.java b/src/main/java/appeng/tile/storage/TileChest.java index 9d9e68b96..e6af08a2e 100644 --- a/src/main/java/appeng/tile/storage/TileChest.java +++ b/src/main/java/appeng/tile/storage/TileChest.java @@ -30,6 +30,7 @@ import appeng.container.implementations.ContainerMEMonitorable; import appeng.fluids.container.ContainerFluidTerminal; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; @@ -290,6 +291,16 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal return 0; } + @Nullable + @Override + public Item getCellItem(int slot) { + if (slot != 0) { + return null; + } + ItemStack cell = getCell(); + return cell.isEmpty() ? null : cell.getItem(); + } + @Override public boolean isPowered() { diff --git a/src/main/java/appeng/tile/storage/TileDrive.java b/src/main/java/appeng/tile/storage/TileDrive.java index b38ef0a81..97a588788 100644 --- a/src/main/java/appeng/tile/storage/TileDrive.java +++ b/src/main/java/appeng/tile/storage/TileDrive.java @@ -27,18 +27,18 @@ import java.util.IdentityHashMap; import java.util.List; import java.util.Map; -import appeng.block.AEBaseTileBlock; +import appeng.block.storage.DriveSlotCellType; import appeng.block.storage.DriveSlotsState; import appeng.client.render.model.DriveModelData; import appeng.container.implementations.ContainerDrive; import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.data.IModelData; -import net.minecraftforge.client.model.data.ModelDataMap; -import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.items.IItemHandler; import appeng.api.AEApi; @@ -70,8 +70,10 @@ import appeng.tile.inventory.AppEngCellInventory; import appeng.util.Platform; import appeng.util.inv.InvOperation; import appeng.util.inv.filter.IAEItemFilter; +import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPriorityHost @@ -89,6 +91,8 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior private Map>, List> inventoryHandlers; private int priority = 0; private boolean wasActive = false; + // This is only used on the client + private final Item[] cellItems = new Item[10]; /** * The state of all cells inside a drive as bitset, using the following format. @@ -123,29 +127,101 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior { newState |= BIT_POWER_MASK; } + for( int x = 0; x < this.getCellCount(); x++ ) { + newState |= (this.getCellStatus(x) << (3 * x)); + } + data.writeInt( newState ); - for( int x = 0; x < this.getCellCount(); x++ ) - { - newState |= ( this.getCellStatus( x ) << ( 3 * x ) ); + writeCellItemIds(data); + } + + private void writeCellItemIds(PacketBuffer data) { + List cellItemIds = new ArrayList<>(getCellCount()); + byte[] bm = new byte[getCellCount()]; + for( int x = 0; x < this.getCellCount(); x++ ) { + Item item = getCellItem(x); + if (item != null && item.getRegistryName() != null) { + ResourceLocation itemId = item.getRegistryName(); + int idx = cellItemIds.indexOf(itemId); + if (idx == -1) { + cellItemIds.add(itemId); + bm[x] = (byte) cellItemIds.size(); // We use 1-based in bm[] + } else { + bm[x] = (byte)(1 + idx); // 1-based indexing!! + } + } } - data.writeInt( newState ); + // Write out the list of unique cell item ids + data.writeByte(cellItemIds.size()); + for (ResourceLocation itemId : cellItemIds) { + data.writeResourceLocation(itemId); + } + // Then the lookup table for each slot + for (int i = 0; i < getCellCount(); i++) { + data.writeByte(bm[i]); + } } @Override protected boolean readFromStream( final PacketBuffer data ) throws IOException { - final boolean c = super.readFromStream( data ); + boolean c = super.readFromStream( data ); final int oldState = this.state; this.state = data.readInt(); + + c |= this.readCellItemIDs(data); + return ( this.state & BIT_STATE_MASK ) != ( oldState & BIT_STATE_MASK ) || c; } + private boolean readCellItemIDs(final PacketBuffer data ) { + int uniqueStrCount = data.readByte(); + String[] uniqueStrs = new String[uniqueStrCount]; + for (int i = 0; i < uniqueStrCount; i++) { + uniqueStrs[i] = data.readString(); + } + + boolean changed = false; + for (int i = 0; i < getCellCount(); i++) { + byte idx = data.readByte(); + + // an index of 0 indicates the slot is empty + Item item = null; + if (idx > 0) { + --idx; + String itemId = uniqueStrs[idx]; + item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemId)); + } + if (cellItems[i] != item) { + changed = true; + cellItems[i] = item; + } + } + + return changed; + } + @Override public int getCellCount() { return 10; } + + @Nullable + @Override + public Item getCellItem(int slot) { + // Client-side we'll need to actually use the synced state + if (world == null || world.isRemote) { + return cellItems[slot]; + } + + ItemStack stackInSlot = inv.getStackInSlot(slot); + if (!stackInSlot.isEmpty()) { + return stackInSlot.getItem(); + } + return null; + } @Override public int getCellStatus( final int slot ) @@ -427,3 +503,4 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior return ContainerDrive.TYPE; } } + diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json new file mode 100644 index 000000000..af3e66338 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_base.json @@ -0,0 +1,121 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "appliedenergistics2:block/drive/drive_inside", + "particle": "appliedenergistics2:block/drive/drive_side", + "side": "appliedenergistics2:block/drive/drive_side", + "bottom": "appliedenergistics2:block/drive/drive_bottom", + "top": "appliedenergistics2:block/drive/drive_top", + "front": "appliedenergistics2:block/drive/drive_front" + }, + "elements": [ + { + "name": "Right Side Panel", + "from": [0, 1, 0], + "to": [1.5, 15, 16], + "faces": { + "north": {"uv": [14, 1, 16, 15], "texture": "#front"}, + "east": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 1, 2, 15], "texture": "#side"}, + "west": {"uv": [0, 1, 16, 15], "texture": "#side"} + } + }, + { + "name": "Left Side Panel", + "from": [14.5, 1, 0], + "to": [16, 15, 16], + "faces": { + "north": {"uv": [0, 1, 2, 15], "texture": "#front"}, + "east": {"uv": [0, 1, 16, 15], "texture": "#side"}, + "south": {"uv": [14, 1, 16, 15], "texture": "#side"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#4"} + } + }, + { + "name": "Back Panel", + "from": [1.5, 1, 6], + "to": [14.5, 15, 16], + "faces": { + "north": {"uv": [2, 1, 15, 15], "texture": "#4"}, + "south": {"uv": [1.5, 1, 14.5, 15], "texture": "#side"} + } + }, + { + "name": "Bottom Panel", + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [0, 15, 16, 16], "texture": "#front"}, + "east": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "south": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "west": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#bottom"} + } + }, + { + "name": "Top Panel", + "from": [0, 15, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#front"}, + "east": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "west": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#top"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#4"} + } + }, + { + "name": "Middle Strut", + "from": [7.5, 1, 0], + "to": [8.5, 15, 8], + "faces": { + "north": {"uv": [7, 1, 9, 15], "texture": "#front"}, + "east": {"uv": [0, 0, 8, 14], "rotation": 180, "texture": "#4"}, + "west": {"uv": [0, 1, 8, 15], "texture": "#4"} + } + }, + { + "name": "Separator", + "from": [1.5, 3, 1], + "to": [14.5, 4, 8], + "faces": { + "north": {"uv": [1.5, 12, 14.5, 13], "texture": "#front"}, + "up": {"uv": [2.5, 1, 13.5, 8], "texture": "#bottom"}, + "down": {"uv": [2.5, 8, 13.5, 15], "texture": "#bottom"} + } + }, + { + "name": "Separator", + "from": [1.5, 6, 1], + "to": [14.5, 7, 8], + "faces": { + "north": {"uv": [1.5, 9, 14.5, 10], "texture": "#front"}, + "up": {"uv": [2.5, 1, 13.5, 8], "texture": "#bottom"}, + "down": {"uv": [2.5, 8, 13.5, 15], "texture": "#bottom"} + } + }, + { + "name": "Separator", + "from": [1.5, 9, 1], + "to": [14.5, 10, 8], + "faces": { + "north": {"uv": [1.5, 6, 14.5, 7], "texture": "#front"}, + "up": {"uv": [2.5, 1, 13.5, 8], "texture": "#bottom"}, + "down": {"uv": [2.5, 8, 13.5, 15], "texture": "#bottom"} + } + }, + { + "name": "Separator", + "from": [1.5, 12, 1], + "to": [14.5, 13, 8], + "faces": { + "north": {"uv": [1.5, 3, 14.5, 4], "texture": "#front"}, + "up": {"uv": [2.5, 1, 13.5, 8], "texture": "#bottom"}, + "down": {"uv": [2.5, 8, 13.5, 15], "texture": "#bottom"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_empty.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_empty.json new file mode 100644 index 000000000..358d2da03 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_empty.json @@ -0,0 +1,6 @@ +{ + "textures": { + }, + "elements": [ + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json new file mode 100644 index 000000000..c59604abd --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_fluids.json @@ -0,0 +1,49 @@ +{ + "textures": { + "front": "appliedenergistics2:block/drive/drive_cell_states" + }, + "elements": [ + { + "name": "Cell Backdrop", + "from": [ + 8.5, + 13.0, + 0.5 + ], + "to": [ + 14.5, + 15.0, + 2 + ], + "faces": { + "north": { + "texture": "#front", + "uv": [ + 0, + 12, + 5, + 14 + ] + }, + "up": { + "texture": "#front", + "uv": [ + 0, + 12, + 5, + 14 + ] + }, + "down": { + "texture": "#front", + "uv": [ + 0, + 12, + 5, + 14 + ] + } + } + } + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json new file mode 100644 index 000000000..008c52b12 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_items.json @@ -0,0 +1,49 @@ +{ + "textures": { + "front": "appliedenergistics2:block/drive/drive_cell_states" + }, + "elements": [ + { + "name": "Cell Backdrop", + "from": [ + 8.5, + 13.0, + 0.5 + ], + "to": [ + 14.5, + 15.0, + 2 + ], + "faces": { + "north": { + "texture": "#front", + "uv": [ + 0, + 8, + 5, + 10 + ] + }, + "up": { + "texture": "#front", + "uv": [ + 0, + 8, + 5, + 10 + ] + }, + "down": { + "texture": "#front", + "uv": [ + 0, + 8, + 5, + 10 + ] + } + } + } + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json new file mode 100644 index 000000000..d0dfe682a --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/block/drive/drive_cell_led_base.json @@ -0,0 +1,88 @@ +{ + "loader": "appliedenergistics2:uvlightmap", + "textures": { + "front": "appliedenergistics2:block/drive/drive/cell_state_offline" + }, + "elements": [ + { + "name": "Cell Light", + "from": [ + 9.0, + 13.0, + 0.0 + ], + "to": [ + 14.0, + 15.0, + 1.0 + ], + "faces": { + "north": { + "texture": "#front", + "uv": [ + 0, + 0, + 16, + 16 + ], + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + }, + "up": { + "texture": "#front", + "uv": [ + 0, + 0, + 16, + 16 + ], + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + }, + "down": { + "texture": "#front", + "uv": [ + 0, + 0, + 16, + 16 + ], + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + }, + "west": { + "texture": "#front", + "uv": [ + 0, + 0, + 16, + 16 + ], + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + }, + "east": { + "texture": "#front", + "uv": [ + 0, + 0, + 16, + 16 + ], + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + } + } + } + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_base.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_base.json deleted file mode 100644 index 576a27993..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_base.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "particle": "appliedenergistics2:block/drive_side", - "side": "appliedenergistics2:block/drive_side", - "bottom": "appliedenergistics2:block/drive_bottom", - "top": "appliedenergistics2:block/drive_top", - "front": "appliedenergistics2:block/drive_front", - "inner": "appliedenergistics2:block/drive_bottom" - }, - "elements": [ - { - "name": "Right Side Panel", - "from": [ - 0.0, - 1.0, - 0.0 - ], - "to": [ - 2.0, - 15.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#inner" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#side" - } - } - }, - { - "name": "Left Side Panel", - "from": [ - 14.0, - 1.0, - 0.0 - ], - "to": [ - 16.0, - 15.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#side" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#inner" - } - } - }, - { - "name": "Back Panel", - "from": [ - 2.0, - 1.0, - 8.0 - ], - "to": [ - 14.0, - 15.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#inner" - }, - "south": { - "texture": "#side" - } - } - }, - { - "name": "Bottom Panel", - "from": [ - 0.0, - 0.0, - 0.0 - ], - "to": [ - 16.0, - 1.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#side" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#side" - }, - "up": { - "texture": "#inner" - }, - "down": { - "texture": "#bottom" - } - } - }, - { - "name": "Top Panel", - "from": [ - 0.0, - 15.0, - 0.0 - ], - "to": [ - 16.0, - 16.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#side" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#side" - }, - "up": { - "texture": "#top" - }, - "down": { - "texture": "#inner" - } - } - }, - { - "name": "Front Panel", - "from": [ - 2.0, - 1.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 8.0 - ], - "faces": { - "north": { - "texture": "#front" - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_base_depth.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_base_depth.json deleted file mode 100644 index 24c3d5501..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_base_depth.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "side": "appliedenergistics2:block/drive_side", - "bottom": "appliedenergistics2:block/drive_bottom", - "top": "appliedenergistics2:block/drive_top", - "front": "appliedenergistics2:block/drive_front", - "inner": "appliedenergistics2:block/drive_bottom" - }, - "elements": [ - { - "name": "Right Side Panel", - "from": [ - 0.0, - 1.0, - 0.0 - ], - "to": [ - 2.0, - 15.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#inner" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#side" - } - } - }, - { - "name": "Left Side Panel", - "from": [ - 14.0, - 1.0, - 0.0 - ], - "to": [ - 16.0, - 15.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#side" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#inner" - } - } - }, - { - "name": "Back Panel", - "from": [ - 2.0, - 1.0, - 8.0 - ], - "to": [ - 14.0, - 15.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#inner" - }, - "south": { - "texture": "#side" - } - } - }, - { - "name": "Bottom Panel", - "from": [ - 0.0, - 0.0, - 0.0 - ], - "to": [ - 16.0, - 1.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#side" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#side" - }, - "up": { - "texture": "#inner" - }, - "down": { - "texture": "#bottom" - } - } - }, - { - "name": "Top Panel", - "from": [ - 0.0, - 15.0, - 0.0 - ], - "to": [ - 16.0, - 16.0, - 16.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#side" - }, - "south": { - "texture": "#side" - }, - "west": { - "texture": "#side" - }, - "up": { - "texture": "#top" - }, - "down": { - "texture": "#inner" - } - } - }, - { - "name": "Middle Strut", - "from": [ - 7.0, - 1.0, - 0.0 - ], - "to": [ - 9.0, - 15.0, - 8.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "east": { - "texture": "#inner" - }, - "west": { - "texture": "#inner" - } - } - }, - { - "name": "Separator", - "from": [ - 2.0, - 3.0, - 1.0 - ], - "to": [ - 14.0, - 4.0, - 8.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "up": { - "texture": "#inner" - }, - "down": { - "texture": "#inner" - } - } - }, - { - "name": "Separator", - "from": [ - 2.0, - 6.0, - 1.0 - ], - "to": [ - 14.0, - 7.0, - 8.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "up": { - "texture": "#inner" - }, - "down": { - "texture": "#inner" - } - } - }, - { - "name": "Separator", - "from": [ - 2.0, - 9.0, - 1.0 - ], - "to": [ - 14.0, - 10.0, - 8.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "up": { - "texture": "#inner" - }, - "down": { - "texture": "#inner" - } - } - }, - { - "name": "Separator", - "from": [ - 2.0, - 12.0, - 1.0 - ], - "to": [ - 14.0, - 13.0, - 8.0 - ], - "faces": { - "north": { - "texture": "#front" - }, - "up": { - "texture": "#inner" - }, - "down": { - "texture": "#inner" - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_empty.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_empty.json deleted file mode 100644 index 5050ef1f7..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_empty.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "front": "appliedenergistics2:block/drive_cell_states" - }, - "elements": [ - { - "name": "Cell Backdrop", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 10, - 5, - 12 - ] - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_full.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_full.json deleted file mode 100644 index 0bbb285a6..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_full.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "front": "appliedenergistics2:block/drive_cell_states" - }, - "elements": [ - { - "name": "Cell Backdrop", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 8, - 5, - 10 - ] - } - } - }, - { - "name": "Cell Light", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 6, - 5, - 8 - ], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_off.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_off.json deleted file mode 100644 index 69ebe9e0b..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_off.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "textures": { - "front": "appliedenergistics2:block/drive_cell_states" - }, - "elements": [ - { - "name": "Cell", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 0, - 5, - 2 - ] - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_on.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_on.json deleted file mode 100644 index 80c74f8b4..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_on.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "front": "appliedenergistics2:block/drive_cell_states" - }, - "elements": [ - { - "name": "Cell Backdrop", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 8, - 5, - 10 - ] - } - } - }, - { - "name": "Cell Light", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 2, - 5, - 4 - ], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_types_full.json b/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_types_full.json deleted file mode 100644 index d4ad0d60b..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/block/drive_cell_types_full.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "loader": "appliedenergistics2:uvlightmap", - "textures": { - "front": "appliedenergistics2:block/drive_cell_states" - }, - "elements": [ - { - "name": "Cell Backdrop", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 8, - 5, - 10 - ] - } - } - }, - { - "name": "Cell Light", - "from": [ - 9.0, - 13.0, - 0.0 - ], - "to": [ - 14.0, - 15.0, - 1.0 - ], - "faces": { - "north": { - "texture": "#front", - "uv": [ - 0, - 4, - 5, - 6 - ], - "uvlightmap": { - "sky": 0.007, - "block": 0.007 - } - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/drive.json b/src/main/resources/assets/appliedenergistics2/models/item/drive.json index ab935151b..a7ba28f68 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/drive.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/drive.json @@ -1,6 +1,6 @@ { - "parent": "appliedenergistics2:block/drive_base", + "parent": "appliedenergistics2:block/drive/drive_base", "textures": { - "front": "appliedenergistics2:block/drive_front_flat" + "front": "appliedenergistics2:block/block/drive_front_flat" } } diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive_bottom.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive_bottom.png deleted file mode 100644 index 6a87e174a2e43b44724edcf21803e1d38696666f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdp969eo`c7&i8E|4C$JU|>*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J8-0(?STwbkT} z^;FFb)iqRP8yXr+_0@EBb?)&BqgKU1{tB?AKkW0JSK3%C6BBL^55 z7&r?&B8wRq_?Ce%WBZ+z`3wvU_MR?|Asp9}6GTFSf3kK2Q(VY zk#JGqac}Y9oF%2AIcJxQVTt8IozkR?`BIWg;^ag*7@VeR$yTK@d}Ux@P%UwdC`m~y zNwrEYN=+QHnuXf&^0i%GBCL2dU8LChTQy=%(P0l1_P52 zBV#KAV=Ds_T>~>K1B0(uxz{r=Fi3%H2+mI{DNig)We7;j%q!9Ja}7}_GuAWJGc+*x TQnZkPfq}u()z4*}Q$iB}WkG9Q diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive_cell_states.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive_cell_states.png deleted file mode 100644 index 30110f56456e66bc7dc4f55bc8905c4ad079b4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFhqE|IEGZ*x-!X-?|=aZ^V>S1c^y~Wtul|LcrtnC zCmgntln^}BGE;E2&HaM%J5HV_40vu72QfCy;5ty9A8?s*hJnV<=EeJ@Iz jubP0l+XkKgXumA diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive_front.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive_front.png deleted file mode 100644 index 4e9bd62a2b0eb0d54e9ae155e466957eb41861aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUNSs54@ z6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dcykO3*KpO@I2IByq5LX5U z1~)q+M{9joTSH?#)r5ou4Ha1z8v`v>S#33Wc^Pq68+{#BSuIsLb!9n4S@Hk>|Jz(y zsm;K^z*rLG7tG-B>_!@hljQC0A~1CmuMPtP180FpWHAE+-!c$pY`?QIpMinF-_yl0 zMB;L5Zy;ZT0f#g9uE>%dzwd{c{M%5w#?$%I6uXX9T{#c^t(QCq{po*nBD0(F$pt$L z`=r~n_ZKWX(R65H(DPo=qt6<0-ktSq%YVKLIwr~ N22WQ%mvv4FO#mYmfk*%V diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive_front_flat.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive_front_flat.png deleted file mode 100644 index 00287e0d127fce8d4342ec65b2052eb0832f3f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFLBuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFl_O3aSW-rl~l6X_}Aa>`pgm=jEtF2{{R2~|IhFI zhuoO+?Q7B)gFdZllQz$DnfBrPclJp$n)>_Rr2hK;UY_}4L+8Xs!51o;s$r%#N5=<9?kvo-kw>QS+n6u0F!0s z5-7nW)h?v0ES$NJrD)Q$RXQ4bBqaVB8Z=4%KiKoXfK}kz{ra9WK0Np9|FCcvFeuFl Wopvmwt%`wxfx*+&&t;ucLK6USp=ziA diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive_side.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive_side.png deleted file mode 100644 index 6c7e4831f00092a2dd623bf67ad9459ea03435c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUNSs54@ z6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dcykO3*KpO@I2Acq%5LY)l zBS&j}S6f44J=KPW1`QQi7aIdDRoUF!Tx~UZc^Pq68~v1&6klIo2L}foRaq@nIdx?@ zMOpFx|NqBGKKjhSz`&T~?d~GXvpZ%Q0|NtRfk$L90|VbO5N2$@vofE7fx+L?#W6(U za%ztwUxNY9;h+UAh6%F&>vcr8=S(ZwxP~E(O=stP(Hkts*EJnb6q(UgtoKUwNjsOk ztJrpj8C>$*?zJs{0s_+ z8kkub7<|3Ty`F)AK?-C;aDG}zd16s2LqK9?UWuNcYluRbv7V`(p@G4dqJ<0$3=E#G KelF{r5}E+&YkM&O diff --git a/src/main/resources/assets/appliedenergistics2/textures/block/drive_top.png b/src/main/resources/assets/appliedenergistics2/textures/block/drive_top.png deleted file mode 100644 index 7ec66578158e7a321dc0d6e99aeaeb072c4130f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdp969eo`c7&i8E|4C$JU|>*4 z_6YK2V5m}KU}$JzVEDzrz|io5fuYoZf#FpG1B2BJ1_tqhIlBUF7#J8-0(?STwbkT} z^;FFb)iqRP8yXr+_0?9aSYf8Gs--Gxp|5JBtM>o@|J_V-oD2*Mj7i?^F5L3hj~rlN zVBjq9h%9Dc;9Ca5jO}+;<})xb*n7G-hHzX@P7nzR3JM7dN((4tWOi?xU}8{^9?)no zN5Vyc$GydabC#5fW=X8yj#A5mI;BY&^Q9!0#L0&g8n8glbfGSe#I8VpQA zjEt=ejI9hzbPdd`3=F