From 5ecfa7792c4d080b6ca1f15ce75e97490b4dec13 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 27 Jan 2020 14:57:21 +0100 Subject: [PATCH] Light and Shadow - Added config for disabling sand paper tool repairs - Fixed belts and filtering renderers leaving behind an undesirable GL state - Fixed pick block not working on vertical extractors/funnels - Shadow Steel and Refined Radiance are now obtainable --- .../java/com/simibubi/create/AllItems.java | 6 +- .../com/simibubi/create/CreateConfig.java | 24 +++ .../com/simibubi/create/ScreenResources.java | 2 +- .../relays/belt/BeltTileEntityRenderer.java | 1 + .../ChromaticCompoundCubeItem.java | 156 ++++++++++++++++++ .../curiosities/RefinedRadianceItem.java | 59 +++++++ .../modules/curiosities/ShadowSteelItem.java | 56 +++++++ .../tools/SandPaperPolishingRecipe.java | 12 +- .../block/belts/AttachedLogisticalBlock.java | 24 ++- .../logistics/block/belts/FunnelBlock.java | 11 +- .../block/extractor/ExtractorBlock.java | 11 +- .../block/extractor/LinkedExtractorBlock.java | 11 +- .../transposer/LinkedTransposerBlock.java | 11 +- .../block/transposer/TransposerBlock.java | 11 +- .../models/block/funnel/horizontal.json | 110 +++++++++--- .../create/textures/gui/jei/widgets.png | Bin 4435 -> 4435 bytes 16 files changed, 443 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/simibubi/create/modules/curiosities/RefinedRadianceItem.java create mode 100644 src/main/java/com/simibubi/create/modules/curiosities/ShadowSteelItem.java diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 45ea00132..95e13caec 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -9,6 +9,8 @@ import com.simibubi.create.modules.contraptions.WrenchItemRenderer; import com.simibubi.create.modules.contraptions.relays.belt.BeltConnectorItem; import com.simibubi.create.modules.contraptions.relays.gearbox.VerticalGearboxItem; import com.simibubi.create.modules.curiosities.ChromaticCompoundCubeItem; +import com.simibubi.create.modules.curiosities.RefinedRadianceItem; +import com.simibubi.create.modules.curiosities.ShadowSteelItem; import com.simibubi.create.modules.curiosities.blockzapper.BlockzapperItem; import com.simibubi.create.modules.curiosities.blockzapper.BlockzapperItemRenderer; import com.simibubi.create.modules.curiosities.deforester.DeforesterItem; @@ -67,8 +69,8 @@ public enum AllItems { ROSE_QUARTZ(ingredient()), POLISHED_ROSE_QUARTZ(ingredient()), CHROMATIC_COMPOUND(new ChromaticCompoundCubeItem(standardItemProperties().rarity(Rarity.UNCOMMON))), - SHADOW_STEEL(new Item(standardItemProperties().rarity(Rarity.UNCOMMON))), - REFINED_RADIANCE(new Item(standardItemProperties().rarity(Rarity.UNCOMMON))), + SHADOW_STEEL(new ShadowSteelItem(standardItemProperties().rarity(Rarity.UNCOMMON))), + REFINED_RADIANCE(new RefinedRadianceItem(standardItemProperties().rarity(Rarity.UNCOMMON))), ELECTRON_TUBE(ingredient()), INTEGRATED_CIRCUIT(ingredient()), diff --git a/src/main/java/com/simibubi/create/CreateConfig.java b/src/main/java/com/simibubi/create/CreateConfig.java index 596bb11f0..04857caf0 100644 --- a/src/main/java/com/simibubi/create/CreateConfig.java +++ b/src/main/java/com/simibubi/create/CreateConfig.java @@ -54,6 +54,10 @@ public class CreateConfig { // Curiosities public IntValue maxSymmetryWandRange; public BooleanValue allowGlassPanesInPartialBlocks; + public IntValue lightSourceCountForRefinedRadiance; + public BooleanValue enableRefinedRadianceRecipe; + public BooleanValue enableShadowSteelRecipe; + public BooleanValue enableSandPaperToolPolishing; // Contraptions public IntValue maxBeltLength, crushingDamage, maxMotorSpeed, maxRotationSpeed; @@ -279,6 +283,26 @@ public class CreateConfig { .comment("", "Allow Glass Panes to be put inside Blocks like Stairs, Slabs, Fences etc.") .translation(basePath + name).define(name, true); + name = "enableShadowSteelRecipe"; + enableShadowSteelRecipe = builder + .comment("", "Allow the standard Shadow Steel recipe.") + .translation(basePath + name).define(name, true); + + name = "enableRefinedRadianceRecipe"; + enableRefinedRadianceRecipe = builder + .comment("", "Allow the standard Refined Radiance recipes.") + .translation(basePath + name).define(name, true); + + name = "lightSourceCountForRefinedRadiance"; + lightSourceCountForRefinedRadiance = builder + .comment("", "The amount of Light sources destroyed before Chromatic Compound turns into Refined Radiance.") + .translation(basePath + name).defineInRange(name, 10, 1, Integer.MAX_VALUE); + + name = "enableSandPaperToolPolishing"; + enableSandPaperToolPolishing = builder + .comment("", "Enable the tool repairing mechanic involving sand paper.") + .translation(basePath + name).define(name, true); + builder.pop(); } diff --git a/src/main/java/com/simibubi/create/ScreenResources.java b/src/main/java/com/simibubi/create/ScreenResources.java index 50ad91493..2fec60633 100644 --- a/src/main/java/com/simibubi/create/ScreenResources.java +++ b/src/main/java/com/simibubi/create/ScreenResources.java @@ -68,7 +68,7 @@ public enum ScreenResources { // JEI JEI_SLOT("jei/widgets.png", 18, 18), - JEI_CATALYST_SLOT("jei/widgets.png", 0, 136, 18, 18), + JEI_CATALYST_SLOT("jei/widgets.png", 0, 156, 18, 18), JEI_ARROW("jei/widgets.png", 19, 10, 42, 10), JEI_LONG_ARROW("jei/widgets.png", 19, 0, 71, 10), JEI_DOWN_ARROW("jei/widgets.png", 0, 21, 18, 14), diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java index 570df9de4..5c1922bbe 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java @@ -170,6 +170,7 @@ public class BeltTileEntityRenderer extends TileEntityRenderer { GlStateManager.popMatrix(); } + GlStateManager.disableBlend(); GlStateManager.popMatrix(); } } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/ChromaticCompoundCubeItem.java b/src/main/java/com/simibubi/create/modules/curiosities/ChromaticCompoundCubeItem.java index dd5e721b7..b98a302d1 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/ChromaticCompoundCubeItem.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/ChromaticCompoundCubeItem.java @@ -1,14 +1,34 @@ package com.simibubi.create.modules.curiosities; +import java.util.Random; + +import com.simibubi.create.AllItems; +import com.simibubi.create.CreateConfig; import com.simibubi.create.foundation.item.IItemWithColorHandler; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.tileentity.BeaconTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.MutableBlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceContext.BlockMode; +import net.minecraft.util.math.RayTraceContext.FluidMode; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -38,6 +58,142 @@ public class ChromaticCompoundCubeItem extends Item implements IItemWithColorHan super(properties); } + @Override + public boolean shouldSyncTag() { + return true; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + int light = stack.getOrCreateTag().getInt("CollectingLight"); + return 1 - light / (float) CreateConfig.parameters.lightSourceCountForRefinedRadiance.get(); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + int light = stack.getOrCreateTag().getInt("CollectingLight"); + return light > 0; + } + + @Override + public int getRGBDurabilityForDisplay(ItemStack stack) { + return ColorHelper.mixColors(0x413c69, 0xFFFFFF, (float) (1 - getDurabilityForDisplay(stack))); + } + + @Override + public int getItemStackLimit(ItemStack stack) { + return showDurabilityBar(stack) ? 1 : 16; + } + + @Override + public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { + double y = entity.posY; + double yMotion = entity.getMotion().y; + World world = entity.world; + CompoundNBT data = entity.getPersistentData(); + CompoundNBT itemData = entity.getItem().getOrCreateTag(); + + Vec3d positionVec = entity.getPositionVec(); + if (world.isRemote) { + int light = itemData.getInt("CollectingLight"); + if (random.nextInt(CreateConfig.parameters.lightSourceCountForRefinedRadiance.get() + 20) < light) { + Vec3d start = VecHelper.offsetRandomly(positionVec, random, 3); + Vec3d motion = positionVec.subtract(start).normalize().scale(.2f); + world.addParticle(ParticleTypes.END_ROD, start.x, start.y, start.z, motion.x, motion.y, motion.z); + } + return false; + } + + // Convert to Shadow steel if in void + if (y < 0 && y - yMotion < -10 && CreateConfig.parameters.enableShadowSteelRecipe.get()) { + ItemStack newStack = AllItems.SHADOW_STEEL.asStack(); + newStack.setCount(stack.getCount()); + data.putBoolean("FromVoid", true); + entity.setItem(newStack); + } + + if (!CreateConfig.parameters.enableRefinedRadianceRecipe.get()) + return false; + + // Convert to Refined Radiance if eaten enough light sources + if (itemData.getInt("CollectingLight") >= CreateConfig.parameters.lightSourceCountForRefinedRadiance.get()) { + ItemStack newStack = AllItems.REFINED_RADIANCE.asStack(); + ItemEntity newEntity = new ItemEntity(world, entity.posX, entity.posY, entity.posZ, newStack); + newEntity.setMotion(entity.getMotion()); + newEntity.getPersistentData().putBoolean("FromLight", true); + itemData.remove("CollectingLight"); + world.addEntity(newEntity); + + stack.split(1); + entity.setItem(stack); + if (stack.isEmpty()) + entity.remove(); + return false; + } + + // Is inside beacon beam? + boolean isOverBeacon = false; + MutableBlockPos testPos = new MutableBlockPos(entity.getPosition()); + while (testPos.getY() > 0) { + testPos.move(Direction.DOWN); + BlockState state = world.getBlockState(testPos); + if (state.getOpacity(world, testPos) >= 15 && state.getBlock() != Blocks.BEDROCK) + break; + if (state.getBlock() == Blocks.BEACON) { + TileEntity te = world.getTileEntity(testPos); + if (!(te instanceof BeaconTileEntity)) + break; + BeaconTileEntity bte = (BeaconTileEntity) te; + if (bte.getLevels() != 0) + isOverBeacon = true; + break; + } + } + + if (isOverBeacon) { + ItemStack newStack = AllItems.REFINED_RADIANCE.asStack(); + newStack.setCount(stack.getCount()); + data.putBoolean("FromLight", true); + entity.setItem(newStack); + return false; + } + + // Find a light source and eat it. + Random r = world.rand; + int range = 3; + float rate = 1 / 2f; + if (r.nextFloat() > rate) + return false; + + BlockPos randomOffset = new BlockPos(VecHelper.offsetRandomly(positionVec, r, range)); + BlockState state = world.getBlockState(randomOffset); + if (state.getLightValue(world, randomOffset) == 0) + return false; + if (state.getBlockHardness(world, randomOffset) == -1) + return false; + if (state.getBlock() == Blocks.BEACON) + return false; + + RayTraceContext context = new RayTraceContext(positionVec, VecHelper.getCenterOf(randomOffset), + BlockMode.COLLIDER, FluidMode.NONE, entity); + if (!randomOffset.equals(world.rayTraceBlocks(context).getPos())) + return false; + + world.destroyBlock(randomOffset, false); + + ItemStack newStack = stack.split(1); + newStack.getOrCreateTag().putInt("CollectingLight", itemData.getInt("CollectingLight") + 1); + ItemEntity newEntity = new ItemEntity(world, entity.posX, entity.posY, entity.posZ, newStack); + newEntity.setMotion(entity.getMotion()); + newEntity.setDefaultPickupDelay(); + world.addEntity(newEntity); + entity.lifespan = 6000; + if (stack.isEmpty()) + entity.remove(); + + return false; + } + @Override @OnlyIn(value = Dist.CLIENT) public IItemColor getColorHandler() { diff --git a/src/main/java/com/simibubi/create/modules/curiosities/RefinedRadianceItem.java b/src/main/java/com/simibubi/create/modules/curiosities/RefinedRadianceItem.java new file mode 100644 index 000000000..c054fac33 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/RefinedRadianceItem.java @@ -0,0 +1,59 @@ +package com.simibubi.create.modules.curiosities; + +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class RefinedRadianceItem extends Item { + + public RefinedRadianceItem(Properties properties) { + super(properties); + } + + @Override + public boolean hasEffect(ItemStack stack) { + return true; + } + + @Override + public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { + World world = entity.world; + Vec3d pos = entity.getPositionVec(); + + if (world.isRemote && entity.hasNoGravity()) { + if (world.rand.nextFloat() < MathHelper.clamp(entity.getItem().getCount() - 10, 1, 100) / 64f) { + Vec3d ppos = VecHelper.offsetRandomly(pos, world.rand, .5f); + world.addParticle(ParticleTypes.END_ROD, ppos.x, pos.y, ppos.z, 0, -.1f, 0); + } + + if (!entity.getPersistentData().contains("ClientAnimationPlayed")) { + Vec3d basemotion = new Vec3d(0, 1, 0); + world.addParticle(ParticleTypes.FLASH, pos.x, pos.y, pos.z, 0, 0, 0); + for (int i = 0; i < 20; i++) { + Vec3d motion = VecHelper.offsetRandomly(basemotion, world.rand, 1); + world.addParticle(ParticleTypes.WITCH, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); + world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); + } + entity.getPersistentData().putBoolean("ClientAnimationPlayed", true); + } + + return false; + } + + if (!entity.getPersistentData().contains("FromLight")) + return false; + + entity.lifespan = 6000; + entity.setNoGravity(true); + entity.setMotion(entity.getMotion().add(0, .15f, 0)); + entity.getPersistentData().remove("FromLight"); + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/ShadowSteelItem.java b/src/main/java/com/simibubi/create/modules/curiosities/ShadowSteelItem.java new file mode 100644 index 000000000..bef9a714b --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/ShadowSteelItem.java @@ -0,0 +1,56 @@ +package com.simibubi.create.modules.curiosities; + +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class ShadowSteelItem extends Item { + + public ShadowSteelItem(Properties properties) { + super(properties); + } + + @Override + public boolean onEntityItemUpdate(ItemStack stack, ItemEntity entity) { + World world = entity.world; + Vec3d pos = entity.getPositionVec(); + + if (world.isRemote && entity.hasNoGravity()) { + if (world.rand.nextFloat() < MathHelper.clamp(entity.getItem().getCount() - 10, + Math.min(entity.getMotion().y * 20, 20), 100) / 64f) { + Vec3d ppos = VecHelper.offsetRandomly(pos, world.rand, .5f); + world.addParticle(ParticleTypes.END_ROD, ppos.x, pos.y, ppos.z, 0, -.1f, 0); + } + + if (!entity.getPersistentData().contains("ClientAnimationPlayed")) { + Vec3d basemotion = new Vec3d(0, 1, 0); + world.addParticle(ParticleTypes.FLASH, pos.x, pos.y, pos.z, 0, 0, 0); + for (int i = 0; i < 20; i++) { + Vec3d motion = VecHelper.offsetRandomly(basemotion, world.rand, 1); + world.addParticle(ParticleTypes.WITCH, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); + world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); + } + entity.getPersistentData().putBoolean("ClientAnimationPlayed", true); + } + + return false; + } + + if (!entity.getPersistentData().contains("FromVoid")) + return false; + + entity.setNoGravity(true); + float yMotion = (entity.fallDistance + 3) / 50f; + entity.setMotion(0, yMotion, 0); + entity.lifespan = 6000; + entity.getPersistentData().remove("FromVoid"); + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java b/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java index 50e4e479f..4f8a2c460 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import com.simibubi.create.AllRecipes; +import com.simibubi.create.CreateConfig; import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient; import com.simibubi.create.modules.contraptions.processing.ProcessingOutput; import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe; @@ -33,14 +34,15 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { } public static boolean canPolish(World world, ItemStack stack) { - return stack.isDamageable() || !getMatchingRecipes(world, stack).isEmpty(); + return (stack.isDamageable() && CreateConfig.parameters.enableSandPaperToolPolishing.get()) + || !getMatchingRecipes(world, stack).isEmpty(); } public static ItemStack applyPolish(World world, Vec3d position, ItemStack stack, ItemStack sandPaperStack) { List> matchingRecipes = getMatchingRecipes(world, stack); if (!matchingRecipes.isEmpty()) return matchingRecipes.get(0).getCraftingResult(new SandPaperInv(stack)).copy(); - if (stack.isDamageable()) { + if (stack.isDamageable() && CreateConfig.parameters.enableSandPaperToolPolishing.get()) { stack.setDamage(stack.getDamage() - (stack.getMaxDamage() - stack.getDamage()) / 2); @@ -76,12 +78,12 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { public boolean matches(SandPaperInv inv, World worldIn) { return ingredients.get(0).test(inv.getStackInSlot(0)); } - + public static List> getMatchingRecipes(World world, ItemStack stack) { return world.getRecipeManager().getRecipes(AllRecipes.SANDPAPER_POLISHING.getType(), new SandPaperInv(stack), world); } - + @Override protected int getMaxOutputCount() { return 1; @@ -96,6 +98,4 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { } - - } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java index 80a3ba6c5..74b3ec7c5 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java @@ -10,11 +10,16 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.HorizontalBlock; import net.minecraft.block.material.PushReaction; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; @@ -30,10 +35,12 @@ public abstract class AttachedLogisticalBlock extends HorizontalBlock implements public boolean hasBlockItem() { return !isVertical(); } - + protected abstract boolean isVertical(); protected abstract BlockState getVerticalDefaultState(); + + protected abstract BlockState getHorizontalDefaultState(); @Override public BlockState getStateForPlacement(BlockItemUseContext context) { @@ -49,6 +56,21 @@ public abstract class AttachedLogisticalBlock extends HorizontalBlock implements return state; } + + @Override + public ResourceLocation getLootTable() { + if (isVertical()) + return getHorizontalDefaultState().getBlock().getLootTable(); + return super.getLootTable(); + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + if (isVertical()) + return getHorizontalDefaultState().getBlock().getPickBlock(state, target, world, pos, player); + return super.getPickBlock(state, target, world, pos, player); + } @Override public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java index cd240d777..96d4ad170 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java @@ -22,7 +22,6 @@ import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; @@ -77,6 +76,11 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm return AllBlocks.VERTICAL_FUNNEL.getDefault(); } + @Override + protected BlockState getHorizontalDefaultState() { + return AllBlocks.BELT_FUNNEL.getDefault(); + } + @Override public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) { @@ -181,11 +185,6 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm protected boolean isVertical() { return true; } - - @Override - public ResourceLocation getLootTable() { - return AllBlocks.BELT_FUNNEL.get().getLootTable(); - } } } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java index 08e0c346b..172ed7d97 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java @@ -15,7 +15,6 @@ import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.shapes.ISelectionContext; @@ -41,6 +40,11 @@ public class ExtractorBlock extends BeltAttachableLogisticalBlock { protected BlockState getVerticalDefaultState() { return AllBlocks.VERTICAL_EXTRACTOR.getDefault(); } + + @Override + protected BlockState getHorizontalDefaultState() { + return AllBlocks.EXTRACTOR.getDefault(); + } @Override protected void fillStateContainer(Builder builder) { @@ -113,11 +117,6 @@ public class ExtractorBlock extends BeltAttachableLogisticalBlock { protected boolean isVertical() { return true; } - - @Override - public ResourceLocation getLootTable() { - return AllBlocks.EXTRACTOR.get().getLootTable(); - } } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java index e93785ab4..b265e2b22 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java @@ -11,7 +11,6 @@ import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; @@ -27,6 +26,11 @@ public class LinkedExtractorBlock extends ExtractorBlock { return AllBlocks.VERTICAL_LINKED_EXTRACTOR.get().getDefaultState(); } + @Override + protected BlockState getHorizontalDefaultState() { + return AllBlocks.LINKED_EXTRACTOR.get().getDefaultState(); + } + @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new LinkedExtractorTileEntity(); @@ -76,11 +80,6 @@ public class LinkedExtractorBlock extends ExtractorBlock { protected boolean isVertical() { return true; } - - @Override - public ResourceLocation getLootTable() { - return AllBlocks.LINKED_EXTRACTOR.get().getLootTable(); - } } } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/transposer/LinkedTransposerBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/transposer/LinkedTransposerBlock.java index c8cb4d3b6..f2bfe850f 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/transposer/LinkedTransposerBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/transposer/LinkedTransposerBlock.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlocks; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.ResourceLocation; import net.minecraft.world.IBlockReader; public class LinkedTransposerBlock extends TransposerBlock { @@ -20,6 +19,11 @@ public class LinkedTransposerBlock extends TransposerBlock { return AllBlocks.VERTICAL_LINKED_TRANSPOSER.get().getDefaultState(); } + @Override + protected BlockState getHorizontalDefaultState() { + return AllBlocks.LINKED_TRANSPOSER.get().getDefaultState(); + } + @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new LinkedTransposerTileEntity(); @@ -35,11 +39,6 @@ public class LinkedTransposerBlock extends TransposerBlock { protected boolean isVertical() { return true; } - - @Override - public ResourceLocation getLootTable() { - return AllBlocks.LINKED_TRANSPOSER.get().getLootTable(); - } } } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerBlock.java index 945a25252..819255690 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerBlock.java @@ -12,7 +12,6 @@ import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; @@ -57,6 +56,11 @@ public class TransposerBlock extends BeltAttachableLogisticalBlock { protected BlockState getVerticalDefaultState() { return AllBlocks.VERTICAL_TRANSPOSER.getDefault(); } + + @Override + protected BlockState getHorizontalDefaultState() { + return AllBlocks.TRANSPOSER.getDefault(); + } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { @@ -102,11 +106,6 @@ public class TransposerBlock extends BeltAttachableLogisticalBlock { protected boolean isVertical() { return true; } - - @Override - public ResourceLocation getLootTable() { - return AllBlocks.TRANSPOSER.get().getLootTable(); - } } } diff --git a/src/main/resources/assets/create/models/block/funnel/horizontal.json b/src/main/resources/assets/create/models/block/funnel/horizontal.json index cc1d1eaf2..dca41a007 100644 --- a/src/main/resources/assets/create/models/block/funnel/horizontal.json +++ b/src/main/resources/assets/create/models/block/funnel/horizontal.json @@ -12,63 +12,129 @@ "elements": [ { "name": "Cube", - "from": [1, 1, -1], + "from": [1, 1, 0], "to": [15, 2, 3], "faces": { "north": {"uv": [1, 14, 15, 15], "texture": "#3"}, - "east": {"uv": [0, 12, 1, 16], "rotation": 270, "texture": "#belt_funnel"}, + "east": {"uv": [0, 12, 1, 15], "rotation": 270, "texture": "#belt_funnel"}, "south": {"uv": [0, 13, 14, 14], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [0, 12, 1, 16], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [0, 12, 14, 16], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 14, 16], "texture": "#belt_funnel"} + "west": {"uv": [0, 12, 1, 15], "rotation": 90, "texture": "#belt_funnel"}, + "up": {"uv": [0, 12, 14, 15], "rotation": 180, "texture": "#belt_funnel"}, + "down": {"uv": [0, 12, 14, 15], "texture": "#belt_funnel"} + } + }, + { + "name": "Cube", + "from": [1.1, 1.1, -1], + "to": [14.9, 2, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [1, 14, 15, 15], "texture": "#3"}, + "east": {"uv": [0, 15, 1, 16], "rotation": 270, "texture": "#belt_funnel"}, + "south": {"uv": [0, 13, 14, 14], "texture": "#package_funnel_horizontal"}, + "west": {"uv": [0, 15, 1, 16], "rotation": 90, "texture": "#belt_funnel"}, + "up": {"uv": [0, 12, 14, 13], "rotation": 180, "texture": "#belt_funnel"}, + "down": {"uv": [0, 15, 14, 16], "texture": "#belt_funnel"} + } + }, + { + "name": "Cube", + "from": [11, 14, 0], + "to": [15, 15, 3], + "faces": { + "north": {"uv": [11, 1, 15, 2], "texture": "#3"}, + "east": {"uv": [13, 12, 14, 15], "rotation": 270, "texture": "#belt_funnel"}, + "south": {"uv": [10, 0, 14, 1], "texture": "#package_funnel_horizontal"}, + "west": {"uv": [13, 12, 14, 15], "rotation": 90, "texture": "#belt_funnel"}, + "up": {"uv": [0, 12, 4, 15], "rotation": 180, "texture": "#belt_funnel"}, + "down": {"uv": [0, 12, 4, 15], "texture": "#belt_funnel"} } }, { "name": "Cube", "from": [11, 14, -1], - "to": [15, 15, 3], + "to": [14.9, 14.9, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, "faces": { "north": {"uv": [11, 1, 15, 2], "texture": "#3"}, - "east": {"uv": [13, 12, 14, 16], "rotation": 270, "texture": "#belt_funnel"}, + "east": {"uv": [13, 15, 14, 16], "rotation": 270, "texture": "#belt_funnel"}, "south": {"uv": [10, 0, 14, 1], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [13, 12, 14, 16], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [0, 12, 4, 16], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 4, 16], "texture": "#belt_funnel"} + "west": {"uv": [13, 12, 14, 13], "rotation": 90, "texture": "#belt_funnel"}, + "up": {"uv": [0, 15, 4, 16], "rotation": 180, "texture": "#belt_funnel"}, + "down": {"uv": [0, 12, 4, 13], "texture": "#belt_funnel"} } }, { "name": "Cube", - "from": [1, 14, -1], + "from": [1, 14, 0], "to": [5, 15, 3], "faces": { "north": {"uv": [1, 1, 5, 2], "texture": "#3"}, - "east": {"uv": [13, 12, 14, 16], "rotation": 270, "texture": "#belt_funnel"}, + "east": {"uv": [13, 12, 14, 15], "rotation": 270, "texture": "#belt_funnel"}, "south": {"uv": [0, 0, 4, 1], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [13, 12, 14, 16], "rotation": 90, "texture": "#belt_funnel"}, - "up": {"uv": [10, 12, 14, 16], "rotation": 180, "texture": "#belt_funnel"}, - "down": {"uv": [0, 12, 4, 16], "texture": "#belt_funnel"} + "west": {"uv": [13, 12, 14, 15], "rotation": 90, "texture": "#belt_funnel"}, + "up": {"uv": [10, 12, 14, 15], "rotation": 180, "texture": "#belt_funnel"}, + "down": {"uv": [0, 12, 4, 15], "texture": "#belt_funnel"} } }, { "name": "Cube", - "from": [1, 2, -1], + "from": [1.1, 14, -1], + "to": [5, 14.9, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [1, 1, 5, 2], "texture": "#3"}, + "east": {"uv": [13, 12, 14, 13], "rotation": 270, "texture": "#belt_funnel"}, + "south": {"uv": [0, 0, 4, 1], "texture": "#package_funnel_horizontal"}, + "west": {"uv": [13, 15, 14, 16], "rotation": 90, "texture": "#belt_funnel"}, + "up": {"uv": [10, 15, 14, 16], "rotation": 180, "texture": "#belt_funnel"}, + "down": {"uv": [0, 12, 4, 13], "texture": "#belt_funnel"} + } + }, + { + "name": "Cube", + "from": [1, 2, 0], "to": [2, 14, 3], "faces": { "north": {"uv": [14, 2, 15, 14], "texture": "#3"}, - "east": {"uv": [1, 12, 13, 16], "rotation": 270, "texture": "#belt_funnel"}, + "east": {"uv": [1, 12, 13, 15], "rotation": 270, "texture": "#belt_funnel"}, "south": {"uv": [0, 1, 1, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [1, 12, 13, 16], "rotation": 90, "texture": "#belt_funnel"} + "west": {"uv": [1, 12, 13, 15], "rotation": 90, "texture": "#belt_funnel"} + } + }, + { + "name": "Cube", + "from": [1.1, 2, -1], + "to": [2, 14, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [14, 2, 15, 14], "texture": "#3"}, + "east": {"uv": [1, 12, 13, 13], "rotation": 270, "texture": "#belt_funnel"}, + "south": {"uv": [0, 1, 1, 13], "texture": "#package_funnel_horizontal"}, + "west": {"uv": [1, 15, 13, 16], "rotation": 90, "texture": "#belt_funnel"} + } + }, + { + "name": "Cube", + "from": [14, 2, 0], + "to": [15, 14, 3], + "faces": { + "north": {"uv": [1, 2, 2, 14], "texture": "#3"}, + "east": {"uv": [1, 12, 13, 15], "rotation": 270, "texture": "#belt_funnel"}, + "south": {"uv": [13, 1, 14, 13], "texture": "#package_funnel_horizontal"}, + "west": {"uv": [1, 12, 13, 15], "rotation": 90, "texture": "#belt_funnel"} } }, { "name": "Cube", "from": [14, 2, -1], - "to": [15, 14, 3], + "to": [14.9, 14, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, "faces": { "north": {"uv": [1, 2, 2, 14], "texture": "#3"}, - "east": {"uv": [1, 12, 13, 16], "rotation": 270, "texture": "#belt_funnel"}, + "east": {"uv": [1, 15, 13, 16], "rotation": 270, "texture": "#belt_funnel"}, "south": {"uv": [13, 1, 14, 13], "texture": "#package_funnel_horizontal"}, - "west": {"uv": [1, 12, 13, 16], "rotation": 90, "texture": "#belt_funnel"} + "west": {"uv": [1, 12, 13, 13], "rotation": 90, "texture": "#belt_funnel"} } }, { @@ -112,7 +178,7 @@ { "name": "Filter", "from": [5, 14, -1], - "to": [11, 15, 0], + "to": [11, 14.9, 0], "faces": { "north": {"uv": [6, 8, 12, 9], "texture": "#4"}, "east": {"uv": [2, 0, 3, 1], "rotation": 180, "texture": "#4"}, diff --git a/src/main/resources/assets/create/textures/gui/jei/widgets.png b/src/main/resources/assets/create/textures/gui/jei/widgets.png index 4c062dbc7e7d67a61c20a6d96dc51be44e8c9d76..2236c342ed20db00d0bdbe2258ede8909e47eebd 100644 GIT binary patch delta 3070 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 M07*qoM6N<$f~rOWA^-pY delta 3079 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 V-Jvm%hw=ab002ovPDHLkV1mB;754xD