From b2e74463e38682c42e92dda947bc598a41df2f3d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Nov 2020 01:37:22 +0100 Subject: [PATCH 1/8] All your basin are output to us - Added useful goggle information to chutes - (0.3.0) Chutes can no longer carry a fan-like air stream - Fixed chutes overwriting contained items when picking them up from below - Basins can now push outputs to any open inventory - Basin output can now be controlled using a wrench --- src/generated/resources/.cache/cache | 20 +-- .../resources/assets/create/lang/en_us.json | 9 ++ .../assets/create/lang/unfinished/de_de.json | 11 +- .../assets/create/lang/unfinished/fr_fr.json | 11 +- .../assets/create/lang/unfinished/it_it.json | 11 +- .../assets/create/lang/unfinished/ja_jp.json | 11 +- .../assets/create/lang/unfinished/ko_kr.json | 11 +- .../assets/create/lang/unfinished/nl_nl.json | 11 +- .../assets/create/lang/unfinished/pt_br.json | 11 +- .../assets/create/lang/unfinished/ru_ru.json | 11 +- .../assets/create/lang/unfinished/zh_cn.json | 11 +- .../fluids/actors/ItemDrainRenderer.java | 2 +- .../contraptions/processing/BasinBlock.java | 52 ++---- .../processing/BasinRenderer.java | 9 ++ .../processing/BasinTileEntity.java | 82 +++++++++- .../block/chute/ChuteTileEntity.java | 150 ++++++++++-------- .../fluid/SmartFluidTankBehaviour.java | 6 +- .../assets/create/lang/default/messages.json | 9 ++ 18 files changed, 301 insertions(+), 137 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e31caaba9..08b56336f 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -394,16 +394,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 67f9a92292948241e01ce6043445b2b3ddcf5350 assets/create/lang/en_ud.json -ea9f7788b7cae3ddd4ba1ae74c54f558d6b3f584 assets/create/lang/en_us.json -d2741d202f1b76c0c57fbd25d5f35cfab258edb0 assets/create/lang/unfinished/de_de.json -ce08c4a4163e667a5c20dfd241cb56b0ff5d064e assets/create/lang/unfinished/fr_fr.json -6fe663867f28389fdac5ac75a12089ca7279a0cb assets/create/lang/unfinished/it_it.json -28b1bbb303a20f43266ae089b5d8b920523ee854 assets/create/lang/unfinished/ja_jp.json -cfc50d41b77b5dfeb49da61b95496a65b3d71169 assets/create/lang/unfinished/ko_kr.json -9f9e817483a92c960db5a6cdd30e0c9e0ac0b2f3 assets/create/lang/unfinished/nl_nl.json -6d638fa512c863203ff7207c9a68782ba4fd9997 assets/create/lang/unfinished/pt_br.json -0dc96a32325dc79e7f0cf980a7011475aa22ecc3 assets/create/lang/unfinished/ru_ru.json -311937a993d6c186ba4c433cd7befca8e4da6d89 assets/create/lang/unfinished/zh_cn.json +79560607a2c0adb5aee4e55dc5b1976136968b72 assets/create/lang/en_us.json +cd2dd93ca311499263387c5780ad08bc2351bb35 assets/create/lang/unfinished/de_de.json +e4a404357a223f97225651bdc35ef903f72abad4 assets/create/lang/unfinished/fr_fr.json +45b3eb5e4b3ad1dab08f5eeb87ffabe67fb42c34 assets/create/lang/unfinished/it_it.json +1b6513cb8880f8b02180c89857789851426e0888 assets/create/lang/unfinished/ja_jp.json +a1ca7668181dc77f04e637cc709cde8015246b10 assets/create/lang/unfinished/ko_kr.json +490f27bd5fe2c421f0d8e8b1dbd939f36a6ea147 assets/create/lang/unfinished/nl_nl.json +f885cbe3cdf420406bd9baa3ee06b2eaf44ee195 assets/create/lang/unfinished/pt_br.json +91a06ec754fb97031f70b09253f1ce7a12b7aadf assets/create/lang/unfinished/ru_ru.json +413c285cacf4484d1ff5f2b6b70a8d23595333e4 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c4d69c991..5a9163052 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -974,6 +974,15 @@ "create.tunnel.selection_mode.randomize": "Randomize", "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", + "create.tooltip.chute.header": "Chute Information", + "create.tooltip.chute.items_move_down": "Items move Downward", + "create.tooltip.chute.items_move_up": "Items move Upward", + "create.tooltip.chute.no_fans_attached": "No attached fans", + "create.tooltip.chute.fans_push_up": "Fans push from Below", + "create.tooltip.chute.fans_push_down": "Fans push from Above", + "create.tooltip.chute.fans_pull_up": "Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "No Targets", "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index a0469d075..c511ff5f4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1043", + "_": "Missing Localizations: 1051", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 3827b205c..bc6863ecd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 672", + "_": "Missing Localizations: 680", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index ec2e3e609..852f81c7e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 656", + "_": "Missing Localizations: 664", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 8283f2543..498bb4611 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 655", + "_": "Missing Localizations: 663", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 67dd3c869..fe0ebb976 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 656", + "_": "Missing Localizations: 664", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index b87dccf6b..3df2c42f0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 984", + "_": "Missing Localizations: 992", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 14e55ca88..f82349aa7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1050", + "_": "Missing Localizations: 1058", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index ad536d123..1fef9df90 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 325", + "_": "Missing Localizations: 333", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 4e17d99ea..7acb1ae6c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 338", + "_": "Missing Localizations: 346", "_": "->------------------------] Game Elements [------------------------<-", @@ -975,6 +975,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.tooltip.chute.header": "UNLOCALIZED: Chute Information", + "create.tooltip.chute.items_move_down": "UNLOCALIZED: Items move Downward", + "create.tooltip.chute.items_move_up": "UNLOCALIZED: Items move Upward", + "create.tooltip.chute.no_fans_attached": "UNLOCALIZED: No attached fans", + "create.tooltip.chute.fans_push_up": "UNLOCALIZED: Fans push from Below", + "create.tooltip.chute.fans_push_down": "UNLOCALIZED: Fans push from Above", + "create.tooltip.chute.fans_pull_up": "UNLOCALIZED: Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java index 8ee36ac2f..4ba3ff772 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java @@ -142,7 +142,7 @@ public class ItemDrainRenderer extends SmartTileEntityRenderer, IWrenchab protected void fillStateContainer(Builder p_206840_1_) { super.fillStateContainer(p_206840_1_.add(FACING)); } - + @Override public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { TileEntity tileEntity = world.getTileEntity(pos.up()); @@ -73,7 +72,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - return ActionResultType.FAIL; + if (!context.getWorld().isRemote) + withTileEntityDo(context.getWorld(), context.getPos(), bte -> bte.onWrenched(context.getFace())); + return ActionResultType.SUCCESS; } @Override @@ -142,11 +143,6 @@ public class BasinBlock extends Block implements ITE, IWrenchab return AllShapes.BASIN_BLOCK_SHAPE; } - @Override - public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState p_220082_4_, boolean p_220082_5_) { - updateDiagonalNeighbours(state, world, pos); - } - @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext ctx) { if (ctx.getEntity() instanceof ItemEntity) @@ -156,7 +152,6 @@ public class BasinBlock extends Block implements ITE, IWrenchab @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - updateDiagonalNeighbours(state, worldIn, pos); if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); @@ -186,35 +181,14 @@ public class BasinBlock extends Block implements ITE, IWrenchab return BasinTileEntity.class; } - @Override - public BlockState getStateForPlacement(BlockItemUseContext ctx) { - BlockState state = super.getStateForPlacement(ctx); - World world = ctx.getWorld(); - BlockPos pos = ctx.getPos(); - return updateDiagonalState(state, world, pos); - } - - protected void updateDiagonalNeighbours(BlockState state, World world, BlockPos pos) { - for (Direction direction : Iterate.horizontalDirections) { - BlockPos toUpdate = pos.up() - .offset(direction); - BlockState stateToUpdate = world.getBlockState(toUpdate); - BlockState updated = updateDiagonalState(stateToUpdate, world, toUpdate); - if (stateToUpdate != updated && !world.isRemote) - world.setBlockState(toUpdate, updated); - } - } - - public static BlockState updateDiagonalState(BlockState state, IBlockReader world, BlockPos pos) { - if (!(state.getBlock() instanceof BasinBlock)) - return state; - for (Direction direction : Iterate.horizontalDirections) { - BlockState diagonaloutputBasin = world.getBlockState(pos.down() - .offset(direction)); - if (diagonaloutputBasin.getBlock() instanceof BasinBlock) - return state.with(FACING, direction); - } - return state.with(FACING, Direction.DOWN); + public static boolean canOutputTo(IBlockReader world, BlockPos basinPos, Direction direction) { + BlockPos offset = basinPos.down() + .offset(direction); + DirectBeltInputBehaviour directBeltInputBehaviour = + TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); + if (directBeltInputBehaviour != null) + return directBeltInputBehaviour.canInsertFromSide(direction); + return false; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index bfb965e46..adbcc814f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -107,8 +107,17 @@ public class BasinRenderer extends SmartTileEntityRenderer { .add(directionVec.scale(.55) .subtract(0, 1 / 2f, 0)); + boolean outToBasin = basin.getWorld() + .getBlockState(basin.getPos() + .offset(direction)) + .getBlock() instanceof BasinBlock; + for (IntAttached intAttached : basin.visualizedOutputItems) { float progress = 1 - (intAttached.getFirst() - partialTicks) / BasinTileEntity.OUTPUT_ANIMATION_TIME; + + if (!outToBasin && progress > .35f) + continue; + ms.push(); MatrixStacker.of(ms) .translate(outVec) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 12a4dcca4..08890929f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -36,6 +36,8 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.nbt.StringNBT; import net.minecraft.particles.IParticleData; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; @@ -79,6 +81,9 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt protected LazyOptional itemCapability; protected LazyOptional fluidCapability; + List disabledSpoutputs; + Direction preferredSpoutput; + public static final int OUTPUT_ANIMATION_TIME = 10; List> visualizedOutputItems; List> visualizedOutputFluids; @@ -100,6 +105,8 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt tanks = Couple.create(inputTank, outputTank); visualizedOutputItems = Collections.synchronizedList(new ArrayList<>()); visualizedOutputFluids = Collections.synchronizedList(new ArrayList<>()); + disabledSpoutputs = new ArrayList<>(); + preferredSpoutput = null; } @Override @@ -129,6 +136,13 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt inputInventory.deserializeNBT(compound.getCompound("InputItems")); outputInventory.deserializeNBT(compound.getCompound("OutputItems")); + preferredSpoutput = null; + if (compound.contains("PreferredSpoutput")) + preferredSpoutput = NBTHelper.readEnum(compound, "PreferredSpoutput", Direction.class); + disabledSpoutputs.clear(); + ListNBT disabledList = compound.getList("DisabledSpoutput", NBT.TAG_STRING); + disabledList.forEach(d -> disabledSpoutputs.add(Direction.valueOf(((StringNBT) d).getString()))); + if (!clientPacket) return; @@ -145,6 +159,12 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt compound.put("InputItems", inputInventory.serializeNBT()); compound.put("OutputItems", outputInventory.serializeNBT()); + if (preferredSpoutput != null) + NBTHelper.writeEnum(compound, "PreferredSpoutput", preferredSpoutput); + ListNBT disabledList = new ListNBT(); + disabledSpoutputs.forEach(d -> disabledList.add(StringNBT.of(d.name()))); + compound.put("DisabledSpoutput", disabledList); + if (!clientPacket) return; @@ -186,8 +206,10 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt @Override public void lazyTick() { super.lazyTick(); + updateSpoutput(); if (!world.isRemote) return; + TileEntity tileEntity = world.getTileEntity(pos.up(2)); if (!(tileEntity instanceof MechanicalMixerTileEntity)) { setAreFluidsMoving(false); @@ -197,6 +219,45 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt setAreFluidsMoving(mixer.running && mixer.runningTicks <= 20); } + public void onWrenched(Direction face) { + BlockState blockState = getBlockState(); + Direction currentFacing = blockState.get(BasinBlock.FACING); + + disabledSpoutputs.remove(face); + if (currentFacing == face) { + if (preferredSpoutput == face) + preferredSpoutput = null; + disabledSpoutputs.add(face); + } else + preferredSpoutput = face; + + updateSpoutput(); + } + + private void updateSpoutput() { + if (world.isRemote) + return; + + BlockState blockState = getBlockState(); + Direction currentFacing = blockState.get(BasinBlock.FACING); + + if (currentFacing != Direction.DOWN) + notifyChangeOfContents(); + + Direction newFacing = Direction.DOWN; + for (Direction test : Iterate.horizontalDirections) { + boolean canOutputTo = BasinBlock.canOutputTo(world, pos, test); + if (canOutputTo && !disabledSpoutputs.contains(test)) + newFacing = test; + } + + if (preferredSpoutput != null && BasinBlock.canOutputTo(world, pos, preferredSpoutput)) + newFacing = preferredSpoutput; + + if (newFacing != currentFacing) + world.setBlockState(pos, blockState.with(BasinBlock.FACING, newFacing)); + } + @Override public void tick() { super.tick(); @@ -309,15 +370,15 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt // Output basin, try moving items to it TileEntity te = world.getTileEntity(pos.down() .offset(direction)); - if (!(te instanceof BasinTileEntity)) + if (te == null) return false; - targetInv = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + targetInv = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(null); - targetTank = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + targetTank = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(null); } - if (targetInv == null) + if (targetInv == null && !outputItems.isEmpty()) return false; for (ItemStack itemStack : outputItems) if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate) @@ -326,14 +387,21 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt else if (!simulate) visualizedOutputItems.add(IntAttached.withZero(itemStack)); + if (outputFluids.isEmpty()) + return true; if (targetTank == null) return false; - for (FluidStack fluidStack : outputFluids) - if (targetTank.fill(fluidStack.copy(), simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE) != fluidStack - .getAmount()) + + for (FluidStack fluidStack : outputFluids) { + FluidAction action = simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE; + int fill = targetTank instanceof SmartFluidTankBehaviour.InternalFluidHandler + ? ((SmartFluidTankBehaviour.InternalFluidHandler) targetTank).forceFill(fluidStack.copy(), action) + : targetTank.fill(fluidStack.copy(), action); + if (fill != fluidStack.getAmount()) return false; else if (!simulate) visualizedOutputFluids.add(IntAttached.withZero(fluidStack)); + } return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index 19fca9691..45b257ae2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -11,7 +11,6 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.fan.AirCurrent; import com.simibubi.create.content.contraptions.components.fan.EncasedFanBlock; import com.simibubi.create.content.contraptions.components.fan.EncasedFanTileEntity; -import com.simibubi.create.content.contraptions.components.fan.IAirCurrentSource; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; @@ -28,6 +27,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemS import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; import mcp.MethodsReturnNonnullByDefault; @@ -47,7 +47,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; @@ -56,9 +55,13 @@ import net.minecraftforge.items.ItemHandlerHelper; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation, IAirCurrentSource { +/* + * Commented Code: Chutes create air streams and act similarly to encased fans + * (Unfinished) + */ +public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInformation { // , IAirCurrentSource { - public AirCurrent airCurrent; +// public AirCurrent airCurrent; float pull; float push; @@ -70,11 +73,11 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor boolean canPickUpItems; float bottomPullDistance; + float beltBelowOffset; + TransportedItemStackHandlerBehaviour beltBelow; + boolean updateAirFlow; int airCurrentUpdateCooldown; int entitySearchCooldown; - boolean updateAirFlow; - TransportedItemStackHandlerBehaviour beltBelow; - float beltBelowOffset; LazyOptional capAbove; LazyOptional capBelow; @@ -89,12 +92,10 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor capAbove = LazyOptional.empty(); capBelow = LazyOptional.empty(); bottomPullDistance = 0; - airCurrent = new AirCurrent(this); +// airCurrent = new AirCurrent(this); updateAirFlow = true; } - - @Override public void addBehaviours(List behaviours) { behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen((d) -> canDirectlyInsertCached())); @@ -177,7 +178,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor private void updateAirFlow(float itemSpeed) { updateAirFlow = false; - airCurrent.rebuild(); +// airCurrent.rebuild(); if (itemSpeed > 0 && world != null && !world.isRemote) { float speed = pull - push; beltBelow = null; @@ -213,16 +214,16 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } private void findEntities(float itemSpeed) { - if (getSpeed() != 0) - airCurrent.findEntities(); - if (bottomPullDistance <= 0 && !getItem().isEmpty() || itemSpeed <= 0 || world == null || world.isRemote) +// if (getSpeed() != 0) +// airCurrent.findEntities(); + if (bottomPullDistance <= 0 && !getItem().isEmpty() || itemSpeed <= 0 || world == null || world.isRemote) return; Vec3d center = VecHelper.getCenterOf(pos); AxisAlignedBB searchArea = new AxisAlignedBB(center.add(0, -bottomPullDistance - 0.5, 0), center.add(0, -0.5, 0)).grow(.45f); for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, searchArea)) { setItem(itemEntity.getItem() - .copy(), + .copy(), (float) (itemEntity.getBoundingBox() .getCenter().y - pos.getY())); itemEntity.remove(); @@ -254,14 +255,14 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor updateAirFlow(itemSpeed); } - if (entitySearchCooldown-- <= 0) { + if (entitySearchCooldown-- <= 0 && item.isEmpty()) { entitySearchCooldown = 5; findEntities(itemSpeed); } extractFromBelt(itemSpeed); - if (getSpeed() != 0) - airCurrent.tick(); +// if (getSpeed() != 0) +// airCurrent.tick(); } public void blockBelowChanged() { @@ -319,16 +320,14 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (!capAbove.isPresent()) capAbove = grabCapability(Direction.UP); if (capAbove.isPresent()) - item = - ItemHelper.extract(capAbove.orElse(null), stack -> true, ExtractionCountMode.UPTO, 16, false); + item = ItemHelper.extract(capAbove.orElse(null), stack -> true, ExtractionCountMode.UPTO, 16, false); } private void handleInputFromBelow() { if (!capBelow.isPresent()) capBelow = grabCapability(Direction.DOWN); if (capBelow.isPresent()) - item = - ItemHelper.extract(capBelow.orElse(null), stack -> true, ExtractionCountMode.UPTO, 16, false); + item = ItemHelper.extract(capBelow.orElse(null), stack -> true, ExtractionCountMode.UPTO, 16, false); } private boolean handleDownwardOutput(boolean simulate) { @@ -505,9 +504,11 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor pull = compound.getFloat("Pull"); push = compound.getFloat("Push"); bottomPullDistance = compound.getFloat("BottomAirFlowDistance"); + super.read(compound, clientPacket); - if (clientPacket) - airCurrent.rebuild(); + +// if (clientPacket) +// airCurrent.rebuild(); if (hasWorld() && world != null && world.isRemote && !previousItem.equals(item, false) && !item.isEmpty()) { if (world.rand.nextInt(3) != 0) @@ -667,9 +668,18 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - tooltip.add(spacing + TextFormatting.GOLD + "Pull: " + TextFormatting.WHITE + pull); - tooltip.add(spacing + TextFormatting.GOLD + "Push: " + TextFormatting.WHITE + push); - tooltip.add(TextFormatting.YELLOW + "-> Item Motion: " + TextFormatting.WHITE + getItemMotion()); + boolean downward = getItemMotion() < 0; + tooltip.add(spacing + Lang.translate("tooltip.chute.header")); + if (pull == 0 && push == 0) + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.chute.no_fans_attached")); + if (pull != 0) + tooltip.add(spacing + TextFormatting.GRAY + + Lang.translate("tooltip.chute.fans_" + (pull > 0 ? "pull_up" : "push_down"))); + if (push != 0) + tooltip.add(spacing + TextFormatting.GRAY + + Lang.translate("tooltip.chute.fans_" + (push > 0 ? "push_up" : "pull_down"))); + tooltip.add(spacing + TextFormatting.YELLOW + "-> " + + Lang.translate("tooltip.chute.items_move_" + (downward ? "down" : "up"))); return true; } @@ -684,47 +694,47 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor return item; } - @Override - @Nullable - public AirCurrent getAirCurrent() { - return airCurrent; - } - - @Nullable - @Override - public World getAirCurrentWorld() { - return world; - } - - @Override - public BlockPos getAirCurrentPos() { - return pos; - } - - @Override - public float getSpeed() { - if (getBlockState().get(ChuteBlock.SHAPE) == Shape.NORMAL && getBlockState().get(ChuteBlock.FACING) != Direction.DOWN) - return 0; - return pull + push; - } - - @Override - @Nullable - public Direction getAirFlowDirection() { - float speed = getSpeed(); - if (speed == 0) - return null; - return speed > 0 ? Direction.UP : Direction.DOWN; - } - - @Override - public boolean isSourceRemoved() { - return removed; - } - - @Override - public Direction getAirflowOriginSide() { - return world != null && !(world.getTileEntity(pos.down()) instanceof IAirCurrentSource) - && getBlockState().get(ChuteBlock.FACING) == Direction.DOWN ? Direction.DOWN : Direction.UP; - } +// @Override +// @Nullable +// public AirCurrent getAirCurrent() { +// return airCurrent; +// } +// +// @Nullable +// @Override +// public World getAirCurrentWorld() { +// return world; +// } +// +// @Override +// public BlockPos getAirCurrentPos() { +// return pos; +// } +// +// @Override +// public float getSpeed() { +// if (getBlockState().get(ChuteBlock.SHAPE) == Shape.NORMAL && getBlockState().get(ChuteBlock.FACING) != Direction.DOWN) +// return 0; +// return pull + push; +// } +// +// @Override +// @Nullable +// public Direction getAirFlowDirection() { +// float speed = getSpeed(); +// if (speed == 0) +// return null; +// return speed > 0 ? Direction.UP : Direction.DOWN; +// } +// +// @Override +// public boolean isSourceRemoved() { +// return removed; +// } +// +// @Override +// public Direction getAirflowOriginSide() { +// return world != null && !(world.getTileEntity(pos.down()) instanceof IAirCurrentSource) +// && getBlockState().get(ChuteBlock.FACING) == Direction.DOWN ? Direction.DOWN : Direction.UP; +// } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 069b04075..c69c1aeb2 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -188,7 +188,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { }); } - class InternalFluidHandler extends CombinedTankWrapper { + public class InternalFluidHandler extends CombinedTankWrapper { public InternalFluidHandler(IFluidHandler[] handlers, boolean enforceVariety) { super(handlers); @@ -202,6 +202,10 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { return 0; return super.fill(resource, action); } + + public int forceFill(FluidStack resource, FluidAction action) { + return super.fill(resource, action); + } @Override public FluidStack drain(FluidStack resource, FluidAction action) { diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index a070b1bc8..ca49a10c0 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -438,6 +438,15 @@ "create.tunnel.selection_mode.randomize": "Randomize", "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", + "create.tooltip.chute.header": "Chute Information", + "create.tooltip.chute.items_move_down": "Items move Downward", + "create.tooltip.chute.items_move_up": "Items move Upward", + "create.tooltip.chute.no_fans_attached": "No attached fans", + "create.tooltip.chute.fans_push_up": "Fans push from Below", + "create.tooltip.chute.fans_push_down": "Fans push from Above", + "create.tooltip.chute.fans_pull_up": "Fans pull from Above", + "create.tooltip.chute.fans_pull_down": "Fans pull from Below", + "create.hint.mechanical_arm_no_targets.title": "No Targets", "create.hint.mechanical_arm_no_targets": "It appears this _Mechanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", "create.hint.horizontal_funnel.title": "Horizontal Funnels", From bbe0914b2f6613e4a4d52375a6b90a8bc59d0dd1 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Nov 2020 13:31:55 +0100 Subject: [PATCH 2/8] SU to confuse you - Reworked some of the tooltips presented by kinetic components --- src/generated/resources/.cache/cache | 20 ++++++++-------- .../resources/assets/create/lang/en_us.json | 3 +-- .../assets/create/lang/unfinished/de_de.json | 5 ++-- .../assets/create/lang/unfinished/fr_fr.json | 1 - .../assets/create/lang/unfinished/it_it.json | 1 - .../assets/create/lang/unfinished/ja_jp.json | 1 - .../assets/create/lang/unfinished/ko_kr.json | 1 - .../assets/create/lang/unfinished/nl_nl.json | 5 ++-- .../assets/create/lang/unfinished/pt_br.json | 5 ++-- .../assets/create/lang/unfinished/ru_ru.json | 1 - .../assets/create/lang/unfinished/zh_cn.json | 1 - .../base/GeneratingKineticTileEntity.java | 7 +++--- .../content/contraptions/base/IRotate.java | 2 +- .../contraptions/base/KineticTileEntity.java | 21 ++++++++-------- .../relays/gauge/SpeedGaugeTileEntity.java | 2 -- .../relays/gauge/StressGaugeTileEntity.java | 24 +++++++++++-------- .../foundation/item/ItemDescription.java | 5 ++-- .../assets/create/lang/default/messages.json | 3 +-- 18 files changed, 49 insertions(+), 59 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 08b56336f..68e403fc6 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -394,16 +394,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 67f9a92292948241e01ce6043445b2b3ddcf5350 assets/create/lang/en_ud.json -79560607a2c0adb5aee4e55dc5b1976136968b72 assets/create/lang/en_us.json -cd2dd93ca311499263387c5780ad08bc2351bb35 assets/create/lang/unfinished/de_de.json -e4a404357a223f97225651bdc35ef903f72abad4 assets/create/lang/unfinished/fr_fr.json -45b3eb5e4b3ad1dab08f5eeb87ffabe67fb42c34 assets/create/lang/unfinished/it_it.json -1b6513cb8880f8b02180c89857789851426e0888 assets/create/lang/unfinished/ja_jp.json -a1ca7668181dc77f04e637cc709cde8015246b10 assets/create/lang/unfinished/ko_kr.json -490f27bd5fe2c421f0d8e8b1dbd939f36a6ea147 assets/create/lang/unfinished/nl_nl.json -f885cbe3cdf420406bd9baa3ee06b2eaf44ee195 assets/create/lang/unfinished/pt_br.json -91a06ec754fb97031f70b09253f1ce7a12b7aadf assets/create/lang/unfinished/ru_ru.json -413c285cacf4484d1ff5f2b6b70a8d23595333e4 assets/create/lang/unfinished/zh_cn.json +64119d621b012cb67a88a72297cfbe64e276bd76 assets/create/lang/en_us.json +276e7bf74972ab6a32ffa1fcc91bb8adbfca7a45 assets/create/lang/unfinished/de_de.json +37cda56935f196f3c531afb0bf001c0ba56053c6 assets/create/lang/unfinished/fr_fr.json +96592f7ce4ed4ede69c3f42b5870d1b805f1fc23 assets/create/lang/unfinished/it_it.json +84b5c9d2586f1dd4067cdb60568420d151589e7f assets/create/lang/unfinished/ja_jp.json +4171adac242132ab5b8da5d362eeb6b9fae03213 assets/create/lang/unfinished/ko_kr.json +6798dd2c517ad9a201175fdbba5108b346478a44 assets/create/lang/unfinished/nl_nl.json +8c9358acc37b949dfc8c15fc750fd6f13a8104a3 assets/create/lang/unfinished/pt_br.json +fff47b09b35b20294dbc814fceb05430c2eec9af assets/create/lang/unfinished/ru_ru.json +c1481426852c9a0e651342ecaea541aa300a5168 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 5a9163052..d5687e841 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -720,8 +720,7 @@ "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", - "create.gui.goggles.at_current_speed": "At current Speed", - "create.gui.goggles.base_value": "Base Value", + "create.gui.goggles.at_current_speed": "at current speed", "create.gui.gauge.info_header": "Gauge Information:", "create.gui.speedometer.title": "Rotation Speed", "create.gui.stressometer.title": "Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index c511ff5f4..7f8d73ee7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1051", + "_": "Missing Localizations: 1050", "_": "->------------------------] Game Elements [------------------------<-", @@ -721,8 +721,7 @@ "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", - "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", - "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index bc6863ecd..28e47b355 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -722,7 +722,6 @@ "create.gui.goggles.generator_stats": "Statistiques du générateur:", "create.gui.goggles.kinetic_stats": "Statistiques cinétiques:", "create.gui.goggles.at_current_speed": "À la vitesse actuelle", - "create.gui.goggles.base_value": "Valeur de base", "create.gui.gauge.info_header": "Informations sur la jauge:", "create.gui.speedometer.title": "Vitesse de rotation", "create.gui.stressometer.title": "Stress du réseau", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 852f81c7e..3560dd163 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -722,7 +722,6 @@ "create.gui.goggles.generator_stats": "Statistiche del Generatore:", "create.gui.goggles.kinetic_stats": "Statistiche Cinetiche:", "create.gui.goggles.at_current_speed": "Alla velocità Attuale", - "create.gui.goggles.base_value": "Valore Base", "create.gui.gauge.info_header": "Informazioni sul Calibro:", "create.gui.speedometer.title": "Velocità di Rotazione", "create.gui.stressometer.title": "Stress della Rete", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 498bb4611..305b933c1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -722,7 +722,6 @@ "create.gui.goggles.generator_stats": "ジェネレータの統計:", "create.gui.goggles.kinetic_stats": "動力の統計:", "create.gui.goggles.at_current_speed": "現在の速度", - "create.gui.goggles.base_value": "基本値", "create.gui.gauge.info_header": "計器の情報:", "create.gui.speedometer.title": "回転速度", "create.gui.stressometer.title": "ネットワークの応力", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index fe0ebb976..d043a647f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -722,7 +722,6 @@ "create.gui.goggles.generator_stats": "발전 상태:", "create.gui.goggles.kinetic_stats": "가동 상태:", "create.gui.goggles.at_current_speed": "현재 속도", - "create.gui.goggles.base_value": "기본 수치", "create.gui.gauge.info_header": "게이지 정보:", "create.gui.speedometer.title": "회전 속도", "create.gui.stressometer.title": "네트워크 부하", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 3df2c42f0..549c4cda9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 992", + "_": "Missing Localizations: 991", "_": "->------------------------] Game Elements [------------------------<-", @@ -721,8 +721,7 @@ "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", - "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", - "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index f82349aa7..85ce6c924 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1058", + "_": "Missing Localizations: 1057", "_": "->------------------------] Game Elements [------------------------<-", @@ -721,8 +721,7 @@ "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", - "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", - "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", + "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 1fef9df90..6a6b3474c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -722,7 +722,6 @@ "create.gui.goggles.generator_stats": "Статистика генератора:", "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", "create.gui.goggles.at_current_speed": "На текущей скорости", - "create.gui.goggles.base_value": "Базовая стоимость", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", "create.gui.stressometer.title": "Сетевой момент", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 7acb1ae6c..d4245aa75 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -722,7 +722,6 @@ "create.gui.goggles.generator_stats": "产能器状态:", "create.gui.goggles.kinetic_stats": "动能状态:", "create.gui.goggles.at_current_speed": "当前速度应力值", - "create.gui.goggles.base_value": "应力基础值", "create.gui.gauge.info_header": "仪表信息:", "create.gui.speedometer.title": "旋转速度", "create.gui.stressometer.title": "网络应力", diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java index e04c3f99e..279f177cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java @@ -67,9 +67,10 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { speed = Math.abs(speed); float stressTotal = stressBase * speed; - String stressString = spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; - tooltip.add(String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressBase), Lang.translate("gui.goggles.base_value"))); - tooltip.add(String.format(stressString, TextFormatting.GRAY, IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed"))); + String stressString = + spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; + tooltip.add(" " + String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressTotal), + Lang.translate("gui.goggles.at_current_speed"))); added = true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java b/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java index 3f7663a38..225532912 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java @@ -108,7 +108,7 @@ public interface IRotate extends IWrenchable { StressImpact stressLevel = of(stressPercent); TextFormatting color = stressLevel.getRelativeColor(); - String level = color + ItemDescription.makeProgressBar(3, stressLevel.ordinal()); + String level = color + ItemDescription.makeProgressBar(3, Math.min(stressLevel.ordinal(), 2)); level += Lang.translate("tooltip.stressImpact."+Lang.asId(stressLevel.name())); level += String.format(" (%s%%) ", (int) (stressPercent * 100)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 88f96feae..a957c4065 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -1,5 +1,12 @@ package com.simibubi.create.content.contraptions.base; +import static net.minecraft.util.text.TextFormatting.GOLD; +import static net.minecraft.util.text.TextFormatting.GRAY; + +import java.util.List; + +import javax.annotation.Nullable; + import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.RotationPropagator; @@ -13,6 +20,7 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.resources.I18n; @@ -27,12 +35,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; -import javax.annotation.Nullable; -import java.util.List; - -import static net.minecraft.util.text.TextFormatting.GOLD; -import static net.minecraft.util.text.TextFormatting.GRAY; - public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation { @@ -413,14 +415,11 @@ public abstract class KineticTileEntity extends SmartTileEntity tooltip.add(spacing + Lang.translate("gui.goggles.kinetic_stats")); tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.stressImpact")); - float stressTotal = stressAtBase * Math.abs(getSpeed()); + float stressTotal = stressAtBase * Math.abs(getTheoreticalSpeed()); String stressString = spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; - - tooltip.add(String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressAtBase), - Lang.translate("gui.goggles.base_value"))); - tooltip.add(String.format(stressString, TextFormatting.GRAY, IHaveGoggleInformation.format(stressTotal), + tooltip.add(" " + String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed"))); added = true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java index 67af6486b..148ede6c6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java @@ -51,8 +51,6 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity{ tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.speedometer.title")); tooltip.add(spacing + SpeedLevel.getFormattedSpeedText(speed, overStressed)); - if (overStressed) - tooltip.add(spacing + TextFormatting.DARK_RED + Lang.translate("gui.stressometer.overstressed")); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java index fdd3b864c..3d6bdfb8e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java @@ -68,24 +68,28 @@ public class StressGaugeTileEntity extends GaugeTileEntity { tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stressometer.title")); if (getTheoreticalSpeed() == 0) - tooltip.add(TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) - + Lang.translate("gui.stressometer.no_rotation")); + tooltip.add(spacing + TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) + + Lang.translate("gui.stressometer.no_rotation")); else { tooltip.add(spacing + StressImpact.getFormattedStressText(stressFraction)); tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stressometer.capacity")); double remainingCapacity = capacity - getNetworkStress(); - double remainingCapacityAtBase = remainingCapacity / Math.abs(getTheoreticalSpeed()); - String capacityString = spacing + StressImpact.of(stressFraction).getRelativeColor() + "%s" - + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s"; - - tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacityAtBase), - Lang.translate("gui.goggles.base_value"))); - tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacity), - Lang.translate("gui.goggles.at_current_speed"))); + String su = Lang.translate("generic.unit.stress"); + if (remainingCapacity != capacity) { + String capacityString = spacing + StressImpact.of(stressFraction) + .getRelativeColor() + "%s" + su + TextFormatting.GRAY + " / " + TextFormatting.DARK_GRAY + "%s" + + su; + tooltip.add(" " + String.format(capacityString, IHaveGoggleInformation.format(remainingCapacity), + IHaveGoggleInformation.format(capacity))); + } else { + String capacityString = spacing + StressImpact.of(stressFraction) + .getRelativeColor() + "%s" + su; + tooltip.add(" " + String.format(capacityString, IHaveGoggleInformation.format(remainingCapacity))); + } } return true; diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java index 9a3d19da8..758649fb4 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java @@ -118,7 +118,6 @@ public class ItemDescription { add(linesOnShift, level); } - String stressUnit = Lang.translate("generic.unit.stress"); if (hasStressImpact && !(!isEngine && ((IRotate) block).hideStressImpact())) { List stressLevels = Lang.translatedOptions("tooltip.stressImpact", "low", "medium", "high"); double impact = impacts.get(id) @@ -130,7 +129,7 @@ public class ItemDescription { if (hasGlasses) level += " (" + impacts.get(id) - .get() + stressUnit + ")"; + .get() + "x " + rpmUnit + ")"; add(linesOnShift, GRAY + Lang.translate("tooltip.stressImpact")); add(linesOnShift, level); @@ -147,7 +146,7 @@ public class ItemDescription { String level = impactId.getAbsoluteColor() + makeProgressBar(3, index) + stressCapacityLevels.get(index); if (hasGlasses) - level += " (" + capacity + stressUnit + ")"; + level += " (" + capacity + "x " + rpmUnit + ")"; if (!isEngine && ((IRotate) block).showCapacityWithAnnotation()) level += " " + DARK_GRAY + TextFormatting.ITALIC + Lang.translate("tooltip.capacityProvided.asGenerator"); diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index ca49a10c0..eec9e2a6a 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -169,8 +169,7 @@ "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", - "create.gui.goggles.at_current_speed": "At current Speed", - "create.gui.goggles.base_value": "Base Value", + "create.gui.goggles.at_current_speed": "at current speed", "create.gui.gauge.info_header": "Gauge Information:", "create.gui.speedometer.title": "Rotation Speed", From e7a22c96e93a70e7dff971f2d839cf9e8e1ef197 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Nov 2020 17:19:11 +0100 Subject: [PATCH 3/8] Funnels for everybody - Fixed flapfunnels not taking secondary items off depots - Funnels can now sit horizontally on saws and drains - Added a recipe from natural to regular scoria --- src/generated/resources/.cache/cache | 2 + .../smelting/scoria_from_natural.json | 32 +++++++++++++ .../recipes/smelting/scoria_from_natural.json | 9 ++++ .../components/saw/SawTileEntity.java | 17 +++++-- .../fluids/actors/ItemDrainTileEntity.java | 15 +++++- .../block/depot/DepotTileEntity.java | 36 +++++++++++++- .../block/funnel/BeltFunnelBlock.java | 23 ++++----- .../logistics/block/funnel/FunnelBlock.java | 7 ++- .../block/funnel/FunnelTileEntity.java | 34 +------------ .../mechanicalArm/ArmInteractionPoint.java | 9 ++-- .../data/recipe/StandardRecipeGen.java | 3 ++ .../belt/DirectBeltInputBehaviour.java | 48 +++++++++++++++++++ .../block/belt_funnel/block_pulling.json | 4 +- .../block/belt_funnel/block_pushing.json | 4 +- 14 files changed, 183 insertions(+), 60 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria_from_natural.json create mode 100644 src/generated/resources/data/create/recipes/smelting/scoria_from_natural.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 68e403fc6..7e6225ab8 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -2096,6 +2096,7 @@ e340721aa78f260c2666214aa149241a37de216e data/create/advancements/recipes/create 070720cc271767b26ad51fa089b4cf2a64d309be data/create/advancements/recipes/create.palettes/smelting/gabbro.json 9a2901f6b918468b0034a8942178d6f3c82aeb6e data/create/advancements/recipes/create.palettes/smelting/limestone.json c8fb5d555eacec479af4fa6b9042656f1fe49a2e data/create/advancements/recipes/create.palettes/smelting/scoria.json +c4f13a0ff5827570018515109c1eda0b3f2fb3bc data/create/advancements/recipes/create.palettes/smelting/scoria_from_natural.json 459538728b06d4c72d7e65d8f7c98a75a48f3a52 data/create/advancements/recipes/create.palettes/spruce_window.json 6aaf96cdaa845b63ab67ba4b968ea4d811e2fef5 data/create/advancements/recipes/create.palettes/spruce_window_pane.json ab0cacba05f8def9cc91b993d464c297babf6fc3 data/create/advancements/recipes/create.palettes/tiled_glass_from_glass_colorless_stonecutting.json @@ -3211,6 +3212,7 @@ b032c79090adad2262ae94609e0b3747327d51a2 data/create/recipes/smelting/gold_ingot fe3e4c244c34aa6948243fabd6b42f04f80d4992 data/create/recipes/smelting/iron_ingot_from_crushed.json bf0e5df5a88e583e39a4e14b006cbf33b99611e1 data/create/recipes/smelting/limestone.json 2c230522bb0946bde6a51442cb15c5efeea99b15 data/create/recipes/smelting/scoria.json +f5317c85a9e10a5f9346e13aef8bb364a5203346 data/create/recipes/smelting/scoria_from_natural.json a5d23be4cc959eb47d84b210190abaafcf41f022 data/create/recipes/smelting/zinc_ingot_from_crushed.json 2d8e448bbe841871c5d9a022149c5f34fd5c0df1 data/create/recipes/smelting/zinc_ingot_from_ore.json ce7c3c6e1da9d6684c9537d1a558423925d89f33 data/create/recipes/smoking/bread.json diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria_from_natural.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria_from_natural.json new file mode 100644 index 000000000..9a19dd7c2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/smelting/scoria_from_natural.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:smelting/scoria_from_natural" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:natural_scoria" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:smelting/scoria_from_natural" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/smelting/scoria_from_natural.json b/src/generated/resources/data/create/recipes/smelting/scoria_from_natural.json new file mode 100644 index 000000000..922b7e043 --- /dev/null +++ b/src/generated/resources/data/create/recipes/smelting/scoria_from_natural.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:natural_scoria" + }, + "result": "create:scoria", + "experience": 0.0, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 70b3cce8a..fddd0b76d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -61,7 +61,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { private int recipeIndex; private LazyOptional invProvider = LazyOptional.empty(); private FilteringBehaviour filtering; - private boolean destroyed; public SawTileEntity(TileEntityType type) { super(type); @@ -76,7 +75,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { super.addBehaviours(behaviours); filtering = new FilteringBehaviour(this, new SawFilterSlot()).forRecipes(); behaviours.add(filtering); - behaviours.add(new DirectBeltInputBehaviour(this)); + behaviours.add(new DirectBeltInputBehaviour(this).allowingBeltFunnelsWhen(this::canProcess)); } @Override @@ -136,6 +135,19 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return; inventory.remainingTime = 0; + for (int slot = 0; slot < inventory.getSlots(); slot++) { + ItemStack stack = inventory.getStackInSlot(slot); + if (stack.isEmpty()) + continue; + ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE) + .tryExportingToBeltFunnel(stack, itemMovementFacing.getOpposite()); + if (tryExportingToBeltFunnel.getCount() != stack.getCount()) { + inventory.setStackInSlot(slot, tryExportingToBeltFunnel); + notifyUpdate(); + return; + } + } + BlockPos nextPos = pos.add(itemMovement.x, itemMovement.y, itemMovement.z); DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE); if (behaviour != null) { @@ -182,7 +194,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { @Override public void remove() { invProvider.invalidate(); - destroyed = true; super.remove(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java index 341b36e25..780220390 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java @@ -47,7 +47,8 @@ public class ItemDrainTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(new DirectBeltInputBehaviour(this).setInsertionHandler(this::tryInsertingFromSide)); + behaviours.add(new DirectBeltInputBehaviour(this).allowingBeltFunnels() + .setInsertionHandler(this::tryInsertingFromSide)); behaviours.add(internalTank = SmartFluidTankBehaviour.single(this, 1500) .allowExtraction() .forbidInsertion()); @@ -112,6 +113,18 @@ public class ItemDrainTileEntity extends SmartTileEntity { return; Direction side = heldItem.insertedFrom; + + ItemStack tryExportingToBeltFunnel = getBehaviour(DirectBeltInputBehaviour.TYPE) + .tryExportingToBeltFunnel(heldItem.stack, side.getOpposite()); + if (tryExportingToBeltFunnel.getCount() != heldItem.stack.getCount()) { + if (tryExportingToBeltFunnel.isEmpty()) + heldItem = null; + else + heldItem.stack = tryExportingToBeltFunnel; + notifyUpdate(); + return; + } + BlockPos nextPosition = pos.offset(side); DirectBeltInputBehaviour directBeltInputBehaviour = TileEntityBehaviour.get(world, nextPosition, DirectBeltInputBehaviour.TYPE); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java index 5ab990160..2eeedb782 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotTileEntity.java @@ -66,6 +66,8 @@ public class DepotTileEntity extends SmartTileEntity { return; if (world.isRemote) return; + if (handleBeltFunnelOutput()) + return; BeltProcessingBehaviour processingBehaviour = TileEntityBehaviour.get(world, pos.up(2), BeltProcessingBehaviour.TYPE); @@ -74,8 +76,8 @@ public class DepotTileEntity extends SmartTileEntity { if (!heldItem.locked && BeltProcessingBehaviour.isBlocked(world, pos)) return; - boolean wasLocked = heldItem.locked; ItemStack previousItem = heldItem.stack; + boolean wasLocked = heldItem.locked; ProcessingResult result = wasLocked ? processingBehaviour.handleHeldItem(heldItem, transportedHandler) : processingBehaviour.handleReceivedItem(heldItem, transportedHandler); if (result == ProcessingResult.REMOVE) { @@ -89,6 +91,35 @@ public class DepotTileEntity extends SmartTileEntity { sendData(); } + private boolean handleBeltFunnelOutput() { + for (int slot = 0; slot < processingOutputBuffer.getSlots(); slot++) { + ItemStack previousItem = processingOutputBuffer.getStackInSlot(slot); + if (previousItem.isEmpty()) + continue; + ItemStack afterInsert = + getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null); + if (previousItem.getCount() != afterInsert.getCount()) { + processingOutputBuffer.setStackInSlot(slot, afterInsert); + notifyUpdate(); + return true; + } + } + + ItemStack previousItem = heldItem.stack; + ItemStack afterInsert = + getBehaviour(DirectBeltInputBehaviour.TYPE).tryExportingToBeltFunnel(previousItem, null); + if (previousItem.getCount() != afterInsert.getCount()) { + if (afterInsert.isEmpty()) + heldItem = null; + else + heldItem.stack = afterInsert; + notifyUpdate(); + return true; + } + + return false; + } + @Override public void remove() { super.remove(); @@ -115,7 +146,8 @@ public class DepotTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(new DirectBeltInputBehaviour(this).setInsertionHandler(this::tryInsertingFromSide)); + behaviours.add(new DirectBeltInputBehaviour(this).allowingBeltFunnels() + .setInsertionHandler(this::tryInsertingFromSide)); transportedHandler = new TransportedItemStackHandlerBehaviour(this, this::applyToAllItems) .withStackPlacement(this::getWorldPositionOf); behaviours.add(transportedHandler); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index 3b98a4e55..ff54b4192 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.simibubi.create.content.logistics.block.depot.DepotBlock; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.Lang; @@ -133,7 +133,7 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench world.removeTileEntity(pos); } } - + @Override @OnlyIn(Dist.CLIENT) public boolean addDestroyEffects(BlockState state, World world, BlockPos pos, ParticleManager manager) { @@ -172,13 +172,14 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench public static boolean isOnValidBelt(BlockState state, IWorldReader world, BlockPos pos) { BlockState stateBelow = world.getBlockState(pos.down()); - if (stateBelow.getBlock() instanceof DepotBlock) - return true; - if (!(stateBelow.getBlock() instanceof BeltBlock)) + if ((stateBelow.getBlock() instanceof BeltBlock)) + return BeltBlock.canTransportObjects(stateBelow); + DirectBeltInputBehaviour directBeltInputBehaviour = + TileEntityBehaviour.get(world, pos.down(), DirectBeltInputBehaviour.TYPE); + if (directBeltInputBehaviour == null) return false; - if (!BeltBlock.canTransportObjects(stateBelow)) - return false; - return true; + return directBeltInputBehaviour.canSupportBeltFunnels(); + } @Override @@ -208,7 +209,8 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench else if (shape == Shape.EXTENDED) newShape = Shape.RETRACTED; else if (shape == Shape.RETRACTED) { - BlockState belt = world.getBlockState(context.getPos().down()); + BlockState belt = world.getBlockState(context.getPos() + .down()); if (belt.getBlock() instanceof BeltBlock && belt.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) newShape = Shape.RETRACTED; else @@ -216,8 +218,7 @@ public abstract class BeltFunnelBlock extends HorizontalBlock implements IWrench } if (newShape != shape) - world - .setBlockState(context.getPos(), state.with(SHAPE, newShape)); + world.setBlockState(context.getPos(), state.with(SHAPE, newShape)); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index 0084a6412..b194b8543 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -125,12 +125,15 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< return toInsert; if (simulate) inserter.simulate(); - if (!simulate) { + ItemStack insert = inserter.insert(toInsert); + + if (!simulate && insert.getCount() != toInsert.getCount()) { TileEntity tileEntity = worldIn.getTileEntity(pos); if (tileEntity instanceof FunnelTileEntity) ((FunnelTileEntity) tileEntity).onTransfer(toInsert); } - return inserter.insert(toInsert); + + return insert; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 378b19249..0404626ca 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -18,8 +18,6 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour.InterfaceProvider; @@ -94,7 +92,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn if (mode == Mode.PAUSED) extractionCooldown = 0; if (mode == Mode.TAKING_FROM_BELT) - tickAsPullingBeltFunnel(); + return; if (extractionCooldown > 0) { extractionCooldown--; @@ -137,17 +135,6 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn startCooldown(); } - private void tickAsPullingBeltFunnel() { - // Belts handle insertion from their side - if (AllBlocks.BELT.has(world.getBlockState(pos.down()))) - return; - TransportedItemStackHandlerBehaviour handler = - TileEntityBehaviour.get(world, pos.down(), TransportedItemStackHandlerBehaviour.TYPE); - if (handler == null) - return; - handler.handleCenteredProcessingOnAllItems(1 / 32f, this::collectFromHandler); - } - private void activateExtractingBeltFunnel() { BlockState blockState = getBlockState(); Direction facing = blockState.get(BeltFunnelBlock.HORIZONTAL_FACING); @@ -183,25 +170,6 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn return extractionCooldown = AllConfigs.SERVER.logistics.defaultExtractionTimer.get(); } - private TransportedResult collectFromHandler(TransportedItemStack stack) { - TransportedResult ignore = TransportedResult.doNothing(); - ItemStack toInsert = stack.stack.copy(); - if (!filtering.test(toInsert)) - return ignore; - ItemStack remainder = invManipulation.insert(toInsert); - if (remainder.equals(stack.stack, false)) - return ignore; - - flap(true); - onTransfer(toInsert); - - if (remainder.isEmpty()) - return TransportedResult.removeItem(); - TransportedItemStack changed = stack.copy(); - changed.stack = remainder; - return TransportedResult.convertTo(changed); - } - @Override public void addBehaviours(List behaviours) { invManipulation = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing()); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 75c75fde0..039e0e37a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -219,7 +219,7 @@ public abstract class ArmInteractionPoint { @Override boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP - && ((KineticTileEntity)reader.getTileEntity(pos)).getSpeed() != 0; + && ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0; } } @@ -298,7 +298,7 @@ public abstract class ArmInteractionPoint { return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING) .getOpposite(); } - + @Override ItemStack extract(World world, int slot, int amount, boolean simulate) { TileEntity te = world.getTileEntity(pos); @@ -441,12 +441,13 @@ public abstract class ArmInteractionPoint { return stack; if (simulate) inserter.simulate(); - if (!simulate) { + ItemStack insert = inserter.insert(stack); + if (!simulate && insert.getCount() != stack.getCount()) { TileEntity tileEntity = world.getTileEntity(pos); if (tileEntity instanceof FunnelTileEntity) ((FunnelTileEntity) tileEntity).onTransfer(stack); } - return inserter.insert(stack); + return insert; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index e2ca5de45..15a02e6fa 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -906,6 +906,9 @@ public class StandardRecipeGen extends CreateRecipeProvider { .inFurnace(), GRANITE = create(AllPaletteBlocks.GABBRO::get).viaCooking(() -> Blocks.GRANITE) .inFurnace(), + NAT_SCORIA = create(AllPaletteBlocks.SCORIA::get).withSuffix("_from_natural") + .viaCooking(AllPaletteBlocks.NATURAL_SCORIA::get) + .inFurnace(), FRAMED_GLASS = recycleGlass(AllPaletteBlocks.FRAMED_GLASS), TILED_GLASS = recycleGlass(AllPaletteBlocks.TILED_GLASS), diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java index 9aa32a05b..ed571d3a5 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/DirectBeltInputBehaviour.java @@ -1,12 +1,24 @@ package com.simibubi.create.foundation.tileEntity.behaviour.belt; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -22,11 +34,23 @@ public class DirectBeltInputBehaviour extends TileEntityBehaviour { private InsertionCallback tryInsert; private AvailabilityPredicate canInsert; + private Supplier supportsBeltFunnels; public DirectBeltInputBehaviour(SmartTileEntity te) { super(te); tryInsert = this::defaultInsertionCallback; canInsert = d -> true; + supportsBeltFunnels = () -> false; + } + + public DirectBeltInputBehaviour allowingBeltFunnelsWhen(Supplier pred) { + supportsBeltFunnels = pred; + return this; + } + + public DirectBeltInputBehaviour allowingBeltFunnels() { + supportsBeltFunnels = () -> true; + return this; } public DirectBeltInputBehaviour onlyInsertWhen(AvailabilityPredicate pred) { @@ -73,4 +97,28 @@ public class DirectBeltInputBehaviour extends TileEntityBehaviour { public boolean test(Direction side); } + public ItemStack tryExportingToBeltFunnel(ItemStack stack, @Nullable Direction side) { + BlockPos funnelPos = tileEntity.getPos() + .up(); + World world = getWorld(); + BlockState funnelState = world.getBlockState(funnelPos); + if (!(funnelState.getBlock() instanceof BeltFunnelBlock)) + return stack; + if (funnelState.get(BeltFunnelBlock.SHAPE) != Shape.PULLING) + return stack; + if (side != null && FunnelBlock.getFunnelFacing(funnelState) != side) + return stack; + TileEntity te = world.getTileEntity(funnelPos); + if (!(te instanceof FunnelTileEntity)) + return stack; + ItemStack insert = FunnelBlock.tryInsert(world, funnelPos, stack, false); + if (insert.getCount() != stack.getCount()) + ((FunnelTileEntity) te).flap(true); + return insert; + } + + public boolean canSupportBeltFunnels() { + return supportsBeltFunnels.get(); + } + } diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json b/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json index adfbea4bf..d59a3ae68 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json @@ -101,8 +101,8 @@ }, { "name": "RearBackPlate", - "from": [0, -5, 13], - "to": [16, -2, 16], + "from": [0.05, -5, 13], + "to": [15.95, -2, 15.95], "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, "faces": { "north": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json b/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json index a1c751f64..4fbd350ed 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json @@ -101,8 +101,8 @@ }, { "name": "RearBackPlate", - "from": [0, -5, 13], - "to": [16, -2, 16], + "from": [0.05, -5, 13], + "to": [15.95, -2, 15.95], "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, "faces": { "north": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, From b24648b4313ebc6f19871b4ecc7e07bddc67728d Mon Sep 17 00:00:00 2001 From: Daniel Amberson Date: Fri, 27 Nov 2020 10:48:38 -0600 Subject: [PATCH 4/8] i foRGOT ONE A --- .../textures/block/oxidized/copper_ore_0.png | Bin 733 -> 795 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_0.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_0.png index e619d85087323ecb6461e68675a5fb9e216544b8..0322810f0a258ba58d44dd0c55eed3a2a5863b75 100644 GIT binary patch delta 746 zcmVNd=~E9 zJV>x)GKn|}nVv|cQZP*uJLWAMe5vDTVF||#i%}78_r@JuT3tgSXE4H7*ZZi~>#Rqy zScD)!gskY=XV{xsV1XW@io4DMo?L0NptjWFk=bN~_Adv9q+(qXE!T4MOZ?})=8j7A`bVOz6>lrc+R{1=XRCx|6l?s+xN0?t4M=oXXlDJi1lMTzFmJ-p1jShNmVU1|}{MAFo8ZGM`yAt6Z{5|=0j5?Nw% zb2Ao6fuS0q|9%^;C$*5KF0Vk-G)(S(=6&rvM6`I1eH!JS>_AG>kyqH**oa30WhEUd zc0LUGwb6s2ff|{rYyUj?xa273^LYrG>vTGeoRQ_^VHj~T6{VpH!w^9?;6+KaTFp}~ c(r&l$2TCP;s-miCVpPWY6#Hxr)cf$HM=`81p=DGMS`ODG09XLYV#H6h#pX0fg1*bPS^lB7d1o zhG7VWEXz29Ac*3)*Xwc4VS`s_yI-@^=J|2&^I%iJ>XQ`}zU)*uoVC~{t_1$`^s1z(~ zR9HnU1OW_edo&tV{+_<42GqFucxK|1)P!*#wa%}ue+_;v?&2m2??|~^Mt_y|!!A&o zQ=MSg?0fO6H*!Kj;URp@@0>5cb{xkr3?eJER;xkbwL8t0dD$Lf1Dd+Mwb2k8&RsW( zBKQ}F_GLJc@Vu_;=E}=irywIxpfw~V2n+KX3bi0>PAMVW1T2>$Xf1LjgrLo67U;oX z0D5C<xb?RUihp<=kobHYqdrlJLF? Date: Fri, 27 Nov 2020 18:26:17 +0100 Subject: [PATCH 5/8] Filter redundancy - Brass tunnels now distribute across matching filtered outputs exclusively before sending items to unfiltered sides - Less chute logic on render thread pls --- .../belts/tunnel/BrassTunnelTileEntity.java | 46 ++++++++++++++----- .../block/chute/ChuteTileEntity.java | 3 +- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java index a33fa9015..c3100d370 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -132,23 +132,30 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (allFull || allEmpty) syncSet.forEach(te -> te.syncedOutputActive = notifySyncedOut); } - + if (validOutputs == null) return; if (stackToDistribute.isEmpty()) return; - for (Pair pair : validOutputs) { - BrassTunnelTileEntity tunnel = pair.getKey(); - Direction output = pair.getValue(); - if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) - continue; - distributionTargets.add(Pair.of(tunnel.pos, output)); - int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); - if (distance < 0) - distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); - else - distributionDistanceRight = Math.max(distributionDistanceRight, distance); + for (boolean filterPass : Iterate.trueAndFalse) { + for (Pair pair : validOutputs) { + BrassTunnelTileEntity tunnel = pair.getKey(); + Direction output = pair.getValue(); + if (filterPass && tunnel.flapFilterEmpty(output)) + continue; + if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) + continue; + distributionTargets.add(Pair.of(tunnel.pos, output)); + int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); + if (distance < 0) + distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); + else + distributionDistanceRight = Math.max(distributionDistanceRight, distance); + } + + if (!distributionTargets.isEmpty() && filterPass) + break; } if (distributionTargets.isEmpty()) @@ -317,6 +324,21 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return filtering.test(side, stack); } + public boolean flapFilterEmpty(Direction side) { + if (filtering == null) + return false; + if (filtering.get(side) == null) { + FilteringBehaviour adjacentFilter = + TileEntityBehaviour.get(world, pos.offset(side), FilteringBehaviour.TYPE); + if (adjacentFilter == null) + return true; + return adjacentFilter.getFilter() + .isEmpty(); + } + return filtering.getFilter(side) + .isEmpty(); + } + @Override public void initialize() { if (filtering == null) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index 45b257ae2..8ed7e992b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -134,7 +134,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void tick() { super.tick(); - canPickUpItems = canDirectlyInsert(); + if (!world.isRemote) + canPickUpItems = canDirectlyInsert(); float itemMotion = getItemMotion(); if (itemMotion != 0 && world != null && world.isRemote) From cbe23a6aba9cf35013d457b5bec01c64dfc7b57f Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Nov 2020 20:37:10 +0100 Subject: [PATCH 6/8] Fix coupling data not being sent to clients --- .../train/capability/CapabilityMinecartController.java | 10 ++++++++++ .../java/com/simibubi/create/events/CommonEvents.java | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java index 19bd2ef7f..cf3b5abe2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java @@ -36,6 +36,7 @@ import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.NonNullConsumer; import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.world.ChunkEvent; public class CapabilityMinecartController implements ICapabilitySerializable { @@ -200,6 +201,7 @@ public class CapabilityMinecartController implements ICapabilitySerializable() { diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index eef7bbb7f..3120fb8d1 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipe import com.simibubi.create.content.contraptions.wrench.WrenchItem; import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.foundation.command.AllCommands; +import com.simibubi.create.foundation.utility.Debug; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; @@ -25,6 +26,7 @@ import net.minecraftforge.event.TickEvent.WorldTickEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -121,5 +123,10 @@ public class CommonEvents { public static void attachCapabilities(AttachCapabilitiesEvent event) { CapabilityMinecartController.attach(event); } + + @SubscribeEvent + public static void startTracking(PlayerEvent.StartTracking event) { + CapabilityMinecartController.startTracking(event); + } } From 4d564464c55876cc23b283497ad24dc70cd3899d Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 27 Nov 2020 22:39:06 +0000 Subject: [PATCH 7/8] Cu Later! Updated copper oxidisation. --- .../textures/block/oxidized/copper_block_0.png | Bin 389 -> 479 bytes .../textures/block/oxidized/copper_block_1.png | Bin 665 -> 550 bytes .../textures/block/oxidized/copper_block_2.png | Bin 681 -> 554 bytes .../textures/block/oxidized/copper_block_3.png | Bin 676 -> 548 bytes .../textures/block/oxidized/copper_block_4.png | Bin 685 -> 572 bytes .../textures/block/oxidized/copper_block_5.png | Bin 690 -> 569 bytes .../textures/block/oxidized/copper_block_6.png | Bin 699 -> 545 bytes .../textures/block/oxidized/copper_block_7.png | Bin 543 -> 566 bytes .../textures/block/oxidized/copper_ore_0.png | Bin 795 -> 795 bytes .../textures/block/oxidized/copper_ore_1.png | Bin 788 -> 803 bytes .../textures/block/oxidized/copper_ore_2.png | Bin 794 -> 805 bytes .../textures/block/oxidized/copper_ore_3.png | Bin 794 -> 812 bytes .../textures/block/oxidized/copper_ore_4.png | Bin 782 -> 807 bytes .../textures/block/oxidized/copper_ore_5.png | Bin 794 -> 821 bytes .../textures/block/oxidized/copper_ore_6.png | Bin 781 -> 807 bytes .../textures/block/oxidized/copper_ore_7.png | Bin 733 -> 814 bytes .../block/oxidized/copper_shingles_0.png | Bin 373 -> 491 bytes .../block/oxidized/copper_shingles_1.png | Bin 618 -> 554 bytes .../block/oxidized/copper_shingles_2.png | Bin 637 -> 572 bytes .../block/oxidized/copper_shingles_3.png | Bin 615 -> 574 bytes .../block/oxidized/copper_shingles_4.png | Bin 629 -> 584 bytes .../block/oxidized/copper_shingles_5.png | Bin 633 -> 610 bytes .../block/oxidized/copper_shingles_6.png | Bin 610 -> 583 bytes .../block/oxidized/copper_shingles_7.png | Bin 394 -> 586 bytes .../textures/block/oxidized/copper_tiles_0.png | Bin 398 -> 608 bytes .../textures/block/oxidized/copper_tiles_1.png | Bin 697 -> 690 bytes .../textures/block/oxidized/copper_tiles_2.png | Bin 722 -> 707 bytes .../textures/block/oxidized/copper_tiles_3.png | Bin 718 -> 702 bytes .../textures/block/oxidized/copper_tiles_4.png | Bin 693 -> 707 bytes .../textures/block/oxidized/copper_tiles_5.png | Bin 730 -> 704 bytes .../textures/block/oxidized/copper_tiles_6.png | Bin 702 -> 652 bytes .../textures/block/oxidized/copper_tiles_7.png | Bin 694 -> 698 bytes 32 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_block_0.png b/src/main/resources/assets/create/textures/block/oxidized/copper_block_0.png index 7897603882a48a9b32054b3b67c03b3470c443fb..a0af685f2c024ff653cb68768af5cdb7b7f9702f 100644 GIT binary patch delta 453 zcmV;$0XqJL1K$IXB!3BTNLh0L01FcU01FcV0GgZ_0004zNkl;1IF!5^(%jk;Srq zvLUnHuemEb__X_@@j_+I?77>OG+2VjzRmlYTx*)3`uoEXX3lWMF5VmuK;%-`8A1U}~+L$D7+nTy3he5TY`?2yB_ vPjr8Cm8IXyPdOx61<7V4;9ihdOLFWFdiDTCjClPk00000NkvXXu0mjfa*EKu delta 362 zcmV-w0hRvW1BC;SB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ic z000ic0Tn1pfB*mi8c9S!R5(v#{CTG3|CdLv8L)vP8}2iBk10Z>9u0!zxNHcN>BL^bPMi78m1_JOv1Zf0e z^uR<0=oWyyh+`3rxB$9l7=Rmq98JhhgaMfA(B1*Qa$IDY}yNkl zAU>ldWd42dc*YitgySXl6eq06=YwhAOn;ztV!5$@CW${qPLAD~RD`pHjq?XFGM+hK z&sQ{0#Lfd~A>m}BJFC&5Sug6HcIud%dlRj*m_sO{Ezr|igX$t@SB@MyWu-L{mu6L= zWOrnP*fe9KQGXFRzpfFf#wm(YQA(Y%I#ZMlO;2n`GhctB>sh9v zQ31=^pL?D3n~(TTj238j@r1LfId1SRkb_%(7(2`oH+$!wQ@U{q?c0;?ck|T0Poq_C un;FhDvI5^o>oAq*%jy|UknCxrAnm_m5aRf_v=wFm0000OY$g!fHJG#yhACbII;N;dkXK{4jT;(XEOwxo$t++ocy&j6D7_> z;e0=s%O-(MHD*#W@L}iU)q)q$s#jZj|3~maVmM|_4T2}#%dY8pCm+4 zJ#uW1{v8AJ>wi-}MRFm8Dd(|j65;K^3>UARl&0naL=Ho8uuzL@WuP+<#T)BYxUQ9> zY7*np^)pCX1N{2j69x8D(s}ZrC^#KX7uG@K45Q4UM&zVb!JEh5U?Poi<`GdJ>ZXh~ zQYlOu3@MVfFO31Evh1`X=+|Cg9wl{|cCnO+RnDH0?M*>qtC;*QD0000zGnLmRj2`A{vPw|~se_vCl;Z68~{{;GHe z94tD6J@{F~kTNU%A(-T|94G!sR%tSzTKyNnY$4mi_v6PF!f6=9{)whrk#Ub#S_4V) zQj;+WP45V1E9wuAw5Y`7agHk7`4YA=8@h{>rZeaqN0G`5Hzu0Me|*1v`I2jU?}2hy8OCOvo7iG<5+D=@#DtvT_qf-!vBs%rm49 zXT@gfgc6r6SZ?UXbLMS%jMMbKUeR}M)00Qd>~ z1AZO{E*wBYLIMea)Y1c@B2cxZX`0wcY{$#IXBWXr+3edl^WN<2+Prx5z#3yVK82;ki0Fw1Ac0QN|Es9h0|Ob+{`*?@$T)>6oaUR_Xio%{1KIyi@Ja^ zq^89hRds1nx^cK-qP+7DCrb=B0&EXLb-4y9Mkg`2S>WZTQ{3zD+9|_4e>k)^VtJ4j zspaFBZp}!*kD`gws!$Uz3*~%JSy9224`ReelS+q1UCe)Rd<6NLSnZ#pQv2_Txc&nl WmIm`E&L0~90000H31q3f**pvH<@-(neX@QtU)aOVQ}V9%qtjdj#U1E;EjCIVpKi(5kAH5n+5W(O>+gs|jbQ7F z#DA7wqWAI@%>wz52ATD`jORtw_$kUJD`aplHQ4{|ijo3-)4xZpdNZ5k(MCYIB#AG# zAy-Sc9V@(>W!+e)=QR*3Uw^gh;h^dEhRl!WclAngiWc5F$;#?e@eq5B&WQ(i4s!(n z`EMl^XR+;$)qm<*Nau<3_71n0h+N1lMnfCzj&!Cn@_YF}=UK6-*23mq1oXxORbzO{ zor-mP@c7O_P7W;%(QSVVoyXnu#oI_+hC~?<)5(T4tQk{b~DYgnSWQ<=CE zZaR8VeF%dLS}n#y(-4!aM5YQ7#qXYx%=>4dDq7w`EN=vvDhw-(*EfwgIk-Gvm=)4H zzWES+n%&|O#r_Z|;l@3{hCJIRai@VSZuXf0A4ZZCiLnKqyrm=2V&AD)+Owvn4&`|U@hY7q+Cwk9@LNoRu1!I!Hl&@ZEjO*=zmSmR+^1wIQx^pkw|g= z@^y^oZC0S|xq>QWIn$XEzAu#p<1zxy$0hdK8fBirk+!9^!zTpjaycn%n}Ul7rsmYl z;Ds97%?6IP6w;I@bYcez#cd)A7dJT%J#M8FI`A8Yl0rnZ!msNbdry7bT^EuSIxeIX z-Px)Ys=wsh+kbHo1ja&9$Hm~P!0y4O9kO&RQOa@I0S)2jMLsZDu%f~1egw0~Ew!lQ z;n|DF=yvA#cR?<-c#SH#W1|VCal!!2or0NXh*N`R*F(1*U~oD_;3}*#&LPlfg#o6> zEKwaYQ{#~jH}vhG;+3+&p{LR7L^%I>XKU(~i{1TAA%AP_gw$oPtLx!|VFzAFW;~Z0 zSY-ykf6VL6H9npujoVS?knhy9(vPI>L{P%{PNKYhQ!VK-n#Qu*-axa@E6Hu+f^ zKK^^stlJf6VdUEC7fM_HgiBtvWB7--oaPLc6v7UOWT+g{kO|k=TJ!jU{0Avw2NvZ4 R#DxF=002ovPDHLkV1m$=H!A=D diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_block_4.png b/src/main/resources/assets/create/textures/block/oxidized/copper_block_4.png index a42ed99bf7f5e33222d4c2385b3e76a0f5c0f50b..54a5544866b5e227a794a8e516ecb67b8e98c16f 100644 GIT binary patch delta 527 zcmV+q0`UE<1-t~1IDY}|Nklp>s~fH3G|h(aL#U!4Yumvp86|5e@9h4b|`NaM*&(liwj2fvfO4|nqVbS?21I8lOh zbV=oNv=@H^@MD;0@Lb%#+(1y2&3LNBlaOUZ`qdak1M!)Xfq%zCB)@xns-cV%zyp$1 zBp&ZQu(C2;hx@`~#bK_Y!f3I=isZzRBu*%HB+NApmo>m}H4V;BUU*TL-gd4& z!7%m|CX{bq8;d%J}uGdpy|WhKNB zbOFw#+bpP%6@Tsa$)P!lXLSgO_yj^Jimbh($00>D%PDHLkV1n>m`=kH> delta 640 zcmV-`0)PFy1g!;-IDZ0PNkl2MW7~;yMs6l}Q38^jMe7(-R=ec)UjPa)QJznoU=iGB|u=jk|0|C7E z2m)YQmS}Z4kl+(4Tk2ij0wze_JS5l1*Ng4t`5Vuk-ml6_!haG3k)CDl^t~NBCHhe> z;=^GIu(g9DW7kCRk)V;?0^g2D7~ZZ?*Hf5)_#$n4b43}B z&nH6rUx@T}9Ajgti@VG%s#Th`j3Om<_4NV~92e~b z->+IU(W;Uaf;H~)P;S7nCe$%rKQ$8+!$gTpKnxTmuTQ$nYMd9ZghYb6*>gr$^#x|GIz4V0Cnihs?t(SH`Nv4k$;gkeDYsw1 z0zCsaaCxrAh>122@#*ss9zWc~qnkafTR~t|Kvby|xm2Mbb%{3zzp%Bnp(=u>&z|_T zwZ0;zWwTVX3d(IYSN@t7WK}5&qYIU#IZRbsoc=sVp8Z|fxZ7fGfU~UG#5o{wW-)V+ an*IQpd=5;XE9CY700005AmvJ|3E*$ zfAK#w5su(p)Tku9RD@-$>fQ<3Lw07ny1J`-7WZ&_9%ipY2_cA+|917ZEjI_7GJF0o zz##&0(XQXiQk=bf2m{G>SOJUsdAbk>0?7=d5#x{ki^@Wa7Jn6i<0uswg{20lFMq^( z?F#TLQ*YH9jV~VQP)}q`GVE~%5RR@Z={qsnC@kT9igP!^voO z!ch_?>~PxC}8@oM-T z^e2#*_oug!pGoY5l3h1^RM*}`0%na0l+4Jy5|7ckvVXpR;*sMyEIRtrf@W=`nN;2S zOC!c== z3`J_m4{%DR65BZ=*4ISo!dXXe_7YuW2Nd*;lUbLX1=!+W(c26bHn z;4`1Y1Q8%x{?yq*!Z3aW!q#E?E?>YCz~lCo1qlH{$;8<47=M$DGx|*2K;v<-)cso$ zejI!OQ3QKFo_`x6yx3My==w^S6@@Bm_yOuFv*k&8`gMrLeg}C~kU-=y?d;|AD(_@8 z!OV7}WD=Z-5Vq(9O~maDY+bp4ML|N6d4}mzkyqzPj>qWj?^;GC(gAeYiWFFLz8)s% zcXlvHQ(=YUq<>@*Kt+fkxjz5+iNm}=*SNaBv0UQK_bKkCW132nSy?_l$vxS~im75s z#*X9S_PGt5_}0XmOg`8y@T4qp)Yu_%q<9lpa>t4T5}M=~Zn+XB4@oS^z48<<|FrOq z$s@<14-u|c6;af{+D;Mqh|3JIL#L@=T$LE{%^v?t@_(~NtfVnp(iT?UR9UWgPu(F{ z6zBj6oCHE5$zq}?xk@r^msO>ISw&sJY9?5N8n4wbQL;`JC69i&T2UZ!I&1Irj1tP1 zW0Ye#%u77jEP=%ot!@k8AObBs?Qk9@DZ)t1v!gFZ>v{8>9xPEihC{N67n9!-<`;;T zB$8#zvVLxWW|McqM)lV#8a@&)#Pt0D+x<&8*lpt)<^OAGH9_{W+00iTKB3jyw f)z)mQmgMml5W5spQ{?x@00000NkvXXu0mjf^bj|a diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_block_6.png b/src/main/resources/assets/create/textures/block/oxidized/copper_block_6.png index 70286ad9e1d038b5260cad9962072ab7d88b0b26..82dca41dcc8409b527e2e424b48de9f3bac27057 100644 GIT binary patch delta 499 zcmVEwM2+VxfsPR>a01vEmo- zEA&_V20IgJz`_z51%%}h65ZuG=iGZ)UzhA_X3m*252A68cRqQ#P%olc;)&$V&kG^UXb+Udt0LC=J2~C9GWz5MKgDLb^8M_W3u1=B@K$^?vfbG;LP$N{I z?-j8~s=+JZB=kG%2DA9vQ?`_;&Y!Ug_K>g#k#wiJNNh@rF;#5dZRAEafV-*=y<+#g zwsjMc2$Ns{QLu<$4*);{tTS+MgB2>`z6Rir@#nbWWxo(hbEirmk={-sWs0v~UPXp8 phX*C}hNnhd;T?Y35XSuLd|%5<%;dKN2DJbH002ovPDHLkV1jEV=@$S1 delta 655 zcmV;A0&xAI1iJ;0IDZ0dNklO?p)_KJx?zD> zmJeXX8h(KvfNx;gJqv`8xJw5|9IjPkWALf$Zr5(!_l1stO zp)Ht9y1lZBo-=`o448b!b5XCY;k6Akk(=YC)wWt*%t1KPHVD@<6C4FTE~N6P3&_)9 z7bWYW6NX5M4(GfKerdV@nS2JN*hSvWC|2Je;Yid!>3^nCj~#4|S{gbhF&ieIs47e& zKVf6pGu0S`V;vT~3ysbs#OAoGA}%;NtO*m9UEz|p!)OZU-#zhZ1q#*^Cj0`_fJ~n3 zyw^hfrpeSM36@94go?xMO71l7)#mj+pB0HnPoBs18)*4cWb>X9nGKbV24mHLK^&5; zj~}pg41bp^dUWel5{0&RqNpCdh-E1v=lo#%9V+W}EG{pJ$}+k-e{#&03>5*mUOaz^ zGpoxAY1SXyjpr(7mFB4LClTyRqO-yv=@c0D*vn`81VbJTt@`q?Qejx0PHHjIv pz&;JS4f-TO6D4bgrVz>Y7kJ?JVk|?!U;qFB00>D%PDHLkV1l!-G;#m{ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_block_7.png b/src/main/resources/assets/create/textures/block/oxidized/copper_block_7.png index 390c46630591890e08e32598ceddb30706fda891..b4c9bdcf94260c449472674b8e5d55165ebdfea0 100644 GIT binary patch delta 520 zcmV+j0{8u&1hxc_Ie+L$L_t(I5nWSDQrkcfZ3!XlqA)H=14RLAyo7CXi5!C)aD&{1 zTO^xolbv%0^s(ehVS}Aa-g~17DW=Nv>GzrL9y$5^?a>e0m3i;YEWz(>eEGh#Pai&7 zzv&cAl4Rrs&etD5E$cTcBT-ULqtETlg;78;i2{HL2JdchA%C-sUesNk9ozQzE02K{ zcK;67?$|c_fKRd<;y_4o2^IdT+hNR%lg&Q{&}UtQ!}Q|6Aa7ZMDgLdSFLro)9Q*GW~nhlW{eWh zS!}pg#i3ogN`FG0N#M{5(pi~@0Oqj;EFo+wq<($wlqw~B)|)D~)9G9eZWObD991#X zn$9M3i6#f^thc6Jvr2)iI}YNPt`sL;N)|Fu$>KGri%%JKY*NJ86PCp>IXKeFBGX~h z3*a;I_k@>-^+hAGG1cuL4l|_L!sW;Stne9|#3a8LGJnSGcmd6cM@`BI1AHdBy7JJD zQ1AbPafjDe>tnt64clH`6!UXed4e#Z=^1-)i$6v{#(RZ<3c?)E zc(>428OGGL(rET@@7LY0QOPAZ^LDzPmM1o}#C10b7{oZd{RJU0T3st>8VpGxNO9Gntup0yFEYRq~y(T_9O) zb`iuleoQ2XW_jB9TDWym+RVi*867baVyz`Y5Aky{O_Rh>K~^N$Ye7}QoB*P}=}G#i6gh@? zpr@PKmJGUkynkm5S0JRY&n>{Sow@)%#7@yBh})tD#S^EbgjL3P4!TCxGnhn@q=g7y zBPuB83rvIn;?!A!iA}*Ux4=Q|s+Q{CEC~P=_?HD0K#Z0|C4ws~zR^t}Kv)b6mH5R6 zn>&7r>o^_6>z!mw^6BcD moSY|CTI+qjTzc4F6@3BKoUk;s>+|IR0000Qf-khYFeY&q}t$noh_4R?KX&4L!;8U;H;d!3i6NvoyqF7l-xF zd%xwsH-9HS6gyI>6wYVn;nEK9NiHP8+_1c>MpxneH zjf#q}JUrQpG_SPOlttnRlBSJD_Y#F)bzFNo1vMaCoR~TIfhV^d?Co9PTR4j>NwmLn zgt?`0T%UBL%I3#y6y2WKOk|4)*Vfk71`!oOPkaUFzJCX=84A8={yw5nTHUSBl5pzx z5#D(qb~2enhZHc4C{&}-5bgOj+KYKuwBvnxP<;CR{uTRVvp*U$<=gJkg0t5u^IpX002ovPDHLkV1iv0 BX_){3 delta 771 zcmV+e1N{7(2Ac+uB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000iZ z000iZ0XPLyBme*cut`KgR5(vfQ(bElQ4l@3*^ihso5VEmkx|E%3^!}oo}ag4FCG4?&rV}Eo;-$Ww8@q!X)RjXChYQH%+lgVH(7;u29s{HNs zdI+NkmSrIb0xm+u1znOup6~gbNc%#uz`-ltJ|3$UUQ7oV$Rd*y6Ub(>P*eq_atT7y zbtsC0t`}fUX@B5Z#zwhZhTriqBNXH^X49DWet%;5(HhGSSJu23BTLz z;(6|j0}l^v#DhM=?iNja+HZ1lZG0B)+&oCIWHO033YnfrrBX0W6FcTD9DJ$cXkiJ* z4U16`Z}-L>Tv}a2A!jhcSJ(Tf*XyiDu~>v4L4>U6+J9%*n_6Ij9-@l7&HZ=@a5|_yBw&dH1vZWgb+x`))89Uakx{ZQV9yp01Zd2 z5d!irKz|(-XK?YCQ>)2eZnZR`wCw(1|J|`fu)e+?8-{^at93Cnw5QI{Oc1S(AMiO* zBO`jG#YcS>f+`M&LxxCGNXk>PBVkhV$Vfm+ym@ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_1.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_1.png index 3fb1de8d8055bfd8e5195826f50a7f61c0603ef7..0f24f4c65c55c3a1346e2b3c3a82d33ded073253 100644 GIT binary patch delta 758 zcmV=q=*TaJ`mbY>1(E)8P7SKr0KnL?s5+>>G=f0d!1hiZ;a&|jYCDt7QjtEawgqJogyC?A z*Xl3yoQcyP4Syi-2rRcSjc>bUXcgf4-n?|;5m&md!}nY;JY^V$5VJRthxzq0>d%U3 z*6Mj3dsToe-$Tf{iC{7OHE)qfulCpvQXli1vbBWx ziBef2Q?=;Ay4O77ZI=kt8mL$vQWVT~eR(C-SXv$&*8j=np?v#7>M3?4lSy1Zc#1yF z09z`N0Dp7C@|H;24)MZf+cbS$P2jaJ+DMyeD6T#ljYJxrMny?j9`5W-s0v?`SeP>= z_!u`5xUoCfIT_&Y+ZiaIaB*Pl_$SupQaJnF#^LNdG9=O2{t@ODnU^eu`qsg>0vIV5H=jOIGA4tTX0?b=C~t(R?^{$^L)G=6mS2c3K@f+efDsHq zbvhlv;sLEt--dZVCPn=B@P~sM}NMSWx=f!8jS`*p%7+g zXC<-XXs!Yc==UfIIk6r~#?YuYq}uxBDe5-loY;N=dpdUbmCTqqdJDJ!y6u!iRDPDt`fZ{4=Oefm)?TelAq=yNoF8 zkp-2_W>G4Yu-*TO{7w!%s?Z(ksN9foYmb7x7?~D4ThCDv^xf#R+rm^Tm4a%M!n{{% z7Agmo|DZ!{?#cP4dHoOdf$RhGpF8^^v|f%zP|SHG62Z;tLnzt-mT))>#%4qg4;shv zFEuxVW`D~>$}@v*+6z}>3^N{w#?{B;F*Krvw~;C3VD4``R7A6>YzSey8 Z{{SBtcD#Fx73lx~002ovPDHLkV1hEeVD|t3 diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_2.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_2.png index 074f39f12cdd4bb023c88cb7b64cf94a3d79d4f3..e185bffdb1f112e4c69490a62e5ef86913981296 100644 GIT binary patch delta 760 zcmVkt9io zq6l2=b{m#uiFGEEfoJ4ZH^ya1Qa;B0N8TCEBRw(Y>E8Bp3J!Sg)K zb}EoZ@;LrlM}KO{7qSMXr%-->0O_a$+?hj~P7;z=vMeJC1JPJXBoe}y)3HVL*4`kT zU&2ZCRA^-4%%cTp!#WzIUHiR`JT=)mm5|P)p%;sgUDqW&F<8wG%m+{4I1X-9cTlW+ z!j!uw$QgXo*~0*V+kZ{Cn;XbxvLZ2IVv`(amuK2P(0?Jqo-bi&JcEy)4NNQp@#G~O zZ`5G~fa6A(c=1yB5cpjvqvUF(QbB2d2lBlkjOmvV(P!<$A%R~IScUI)AulXrShycU zquCTmX_^M5Nej;12x*Y^>SSIWhgK-S?Buyo|L?jj=7IAs{rW;JfPMcK6wW-K&!a#4 z7#*4cu78PK4(yHZ`?zhCVY#08-zRBYL)UUJt0oGC0u=7v>-9u5JdFyG@Lcf8=Io!M z6NB=l9OwwhsA*Wfjq-tqnfa?wBGSdc?)Ez7i23BC4P*KtiWJeG$_~cwk}tyrFw?i~ zBOF@>^9hL#4U@F8vJ%CV7i+|gih9?^k9vFn0000ZlVFgx@BZxYq&hx%!?o4}c-EcYQ+N9EzJFY;R^@_W7_$1lkBCwz zm&-^dlj!T~lfa76oCP{ywI~Q(;`2au0OiB7WEhCWojn1G;RSfGodfiYGE7LTE81?K0to7HZPA{Q)cqBb) zAK!qeLSf}4s*wd`i|-}ikv5NbB944E3+1{lQt33TS_`LR_n6*9b7rs#>DIxtiYx$EtF~j@{7wbVo?OHkHXS2n!
$ddI`g5fo$+{ohf?~~6sT4YQ7NBSb z*!uhX!GGKYL4d;FqWl|5nK*6u;I)-8fRi??p&{s;z1?m@Cuw*ZSyBdbWy1uXxONd) zl9$1gv_GGC8LUg=m!W#p7X$r`&rlkW(R!#%-$j-r+Wi&4-YAJ8ez zXY#(xc!wSo>)Yvcgnb6FKN>S-b$t(>v5!Yvd|@a` fF!B7X`RV@$b!~fK-2C0^00000NkvXXu0mjf4ZUze diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_3.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_3.png index 28cf0f840c820f596c05c584e04c51d2426ff443..555773515d72eff3aa4a61ce8f6dcb59822e9dc0 100644 GIT binary patch delta 767 zcmVBK(9;#>597d@%+UO++mkgYrNG8xmSer|q1K0V3IoHP6E%UWx1Wov6I zR1^ha7=l-;)k3G!k>_MGiEg(m&%EcANF=0Xs2Nq^H+1i=7&*)&agArgtm zujhHtgg~`gMJkoT=;){nEZCc~Km|H&3PP9oJf0m#^|XrF);AcGNuSj5-M)xop@3j8 zfJ(`7`5Z(n9*6Jyu&DG|tAyl89PR1HGLu@ZAT==pH66v*(it4PhErt~*<6m2*l0Cd z5G{h>x-ORdeSfHV9p(Kx(zCvVm07xqy$`SCUR+v%PL&LZD^*ny4gxSd5sSqnF=p{0 z>^IM$t*oJZT9Ftz@YwQwIBzg6JXEGa0%ZAV% z_kXho0Sb{OiPz5-O;$5c5N&EEWpi^g)P#nf2ypn~8F;Zg9I6Wso*){H!rOT%9co^P!rgTW z1Ly?NB|Nc66vDDBsXb5Q)a^Cd<9!+^Uj2Swvd{Yh*`x88B-HU-xVD4X7zG#*1ZFlu xRdA4CFsy(ZiWl4boY1ifh5*qv6v8}J$(i9@GXYRTQJVfrN{C9 zdk|Ha-FgipvW{HsBL!A)t~@{@nLw#ffaW+3GTAK5?hxMWBdE5G%+Vea=_qmwX|yYw zFo-yXz_;#IG4xF&nqM)ReI|+#bwHOG9}EVV`mu|p?tcL}-jF_Pe+JTu9-qR+NWp3I zFFMU3#;ecef8cx2%H=ZZ^*Sn@LsZu)FntR{&qSl+qrC9~dOQl>@o=5K9brF$Ubibs z6^lh^T{^Jtjh`MGmko-n&>ISv({$RG|5>+$P}YCy`z|F4apJE*W6d*}490iXq0tQR zN~hCcZhw5=N51(*{;g!N#V zydg6_rVGXTj>ltRpFwPo#$&QOo(tD@5X(}43AMn?>Qn_g1(U05%|Usw&8N{8TM%50 fHWAO)ny>yphO>d04mYG{00000NkvXXu0mjfJ7#1S diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_4.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_4.png index 3b1c1c1503336e5e112355dcf89cc9a11d9bfb7e..72cd444559a783847e859af746fd70e92807512e 100644 GIT binary patch delta 762 zcmVQH)T`_mHRdX#ALc>h@01E;^ zy6QFpe~VXLiqIeE(#xQ`aBmVakf2&b*HDXGT~}&9az1uuote&g%>%={@0|0TGv|5E zQC3%1V?|LA$1&L2?KW)NmiJUD1;=sZozHB^WK#MV!;fgST7S~PAWc&dh7mZp(P+p3 zUDxH?_kCzWpkA*dole8DESXp^nyWws>~l&&L45BU=tI3$hZ!B9hbk3g7rUJ)3>OLr zqX;S$%jI)W6Q&8S(s4YP@d3uXugK@~aR0ifw@y$9JrsqDH&qks2W8Z1HQ9pWxHzky zLA0rbPN#$MV1FBi8KV?rG2abjThkLWSSx>$=Z8Z#Wh)VJrK&38D3paoB9V~9_`}bz zvHKA-BeVEbJC!|h;)RL3$PMPvpx(Xa7mVv3c1{%}Q%U3p2B3PLNBwB9o9DRIHwo8u zp?CMtYHefK*_6o{JZNu9@Zp7p(ta7~R9Y$~No*41%ztvR^9{$sf)neQ5^cQRi?Ngg zbh8Jgvn;AjALm5y(&I(RLm2oF1!A>Qsh}2AF=+vJOv*_k@v2N<3e-&lf#+kccpq~& zn0*b6W>YGa%jF=NbYb0(_5+lV0bF3`s42nB-k-DI|5-KBaXnQU}kmt3l0jS s%eCgDZ0rkYw52Z$r4md$uQjj!KVV&YnI0{Cp8x;=07*qoM6N<$f~zuYVgLXD delta 737 zcmV<70v`RR295@hIe)-OL_t(I5iL_~Pt#Boe%jr(V_Ubu+!jGpjL}Fyz7SY2@ske1 ze(B5JkN8kvb(#RDvE+MO~Gc{ zHb$e7+!qQ3xUMVryk^Vi^U}vL{EER~ARQc($*73q1bn#H>wn1unx@Hb7>39Q0n4&r znkI6&oJ=e@nyWwsMng(Mhj>3-orcx2WHmoNL#G?c^~Uo}#7P2`iq+~hs75vmt`fLD zF1rVCf+N)Hb$E^kcVx-#7+kZMV5OQvr}a@La$OJC)-{Ap5P~4UMRy;Yr37s~1B@dX zxbSFMw(q(o&VStljIn@(xKdRWX%frA!Y~X;O#R+AS{Lu3-)Z2g)s`5~|9${vz{=t_ zdX|dcoiB3VZY#(a@~Bsf`ZPO2gC0l5#M27W;=-DQhunqOT`E(Hk3>(aNkQ_FM(0HuLUdogjKNOv=vAPMQ%J zj71FN+Z%E!Xz4kKnRV#8j?eq=WJNB`L2L{$AX)_sO^0ClSbM&W=Ikpu<2qd^w#j62 z!#=IquV)SU^}_&x=ffydf`lM2vl?~5hvMYsT60o1_C++>(ig|KqwUJ+<*WZ6&Y^x_ TK+r`{00000NkvXXu0mjf3WH{+ diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_5.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_5.png index cf817c3bc8d103fdc5e3354a629c79368e2d8ccb..bd1d9be2a4a48e6811b155edcdbcf4fee20ccda4 100644 GIT binary patch delta 777 zcmV+k1NQuy2DJu|Ie+I#L_t(I5hYVgYZFlv{$}PT6EibOW630a3AVI?f=w5K*qvL! zmFprDHx|T=xN^~ST?;M*7lPPdpc{XHf`Uk`pp*(Vedf_LuTEx?NoK}#ZqG2>xpVG$ zecyMLjg5^+Q4~Z`1h#g&4aafh-ZV{gyIr~GZ#Kg)q>p3x6@RT(OFB46(^LdO2tM3s zG~|I;EGE}}zYk3aRI623mW5<8DH98h<|L=Q8C1(v9F2KUk_rl@hWc&{ zlM@pN!VoGIvvW3to=Cv=eRQbx!|@)jCL`p+E3(pF*u-2?M@ADU{%8VT7c10u*0!mL zi*~CG(WVi4y?-9G85adrVDq?-mCL>y>vsMcR=0lx3h>ynp`;Xqgq5nQh{6Cop3rq& z0wcma-jx5~p)rkvaz)O_iJyc6w;g=fYtZuznVf^w+!+=ufuGJ0ud92oOiMB*L4Rx#;*7F-)j`Qs;0%DpjE3Up z0~8BWh$SxJ-ANy%iU+t3)(VS~%E0eKOc1I&J3IJfcCn=DxKDJmA|8D?q~Jvgj>Gr* zSWe9WCZn&R(QHblYywj>X~VqlSL=9BfrJ-Ido>x%NS@W|vKmv%!eRcmj59S!o28jA6pnck5{Va6^y84$k6R~rb$0B1;r)mP=Tg zNMPQgwut|=;~w_^opO^X&fkGcVp7)E*CS167=MTW&%S+?DD#0A*KZ*nkK=87mw-`- z0T;#Do9sd=l|qjg&|`6kPNyTe=i9hCeM4$|NEeE2I2>X*P3V(FR)ly$mw8aPgFZ+l(0g^buPOXl3K8H?^mC7aP zb}9vaW#WhUWVUeV_E9dE5ex$i)1k_ai`%IbadV}DujZKw>iYp&UJGJCB}^t0d?fHr zwTL6#0H#s_uYWt&pe<-{Mm`P;LsU##f>`;~JFOyo72$mX&ryDmf+hR822V%!_SjnWA800&e?)snb_9As>CBOXpJI=ENdgqgA+!-&>fK*;PH==OU`sZyx~ z(d+e;?w>D?@s#6gA+Zbv=543d{?EFv`hoR-PnpVTfXy=r!J6mudEDx(LQoH|Ei5d6 zxsg)h*nb_XvuzhRq_Vc*@01Oc8~8Ju3WX{F&V z@e@!pX}i0-i6IP3MGQGQQqdcf&9zYhmSy2(`(~R0Ffj~b;}R#NfNfe3EME{%pOb@= zt*9Q~pn>Aqn9XKa>=TIZt(2|)VKl)c2w^W$fH{@G%$k%1JH_*>vF4y`d?%^3)m^m00000NkvXXu0mjfmdj*Z diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_ore_6.png b/src/main/resources/assets/create/textures/block/oxidized/copper_ore_6.png index 06b434f2942f89974d8d825b0bdee489e3187cc5..3463f96ffd54992b503c21220fd5895c9cb5052a 100644 GIT binary patch delta 762 zcmVIMvPTiM#JD{VdJqIX$uZ_hnHzVACn zSzTR?6-7ZD$Kd5S4!Yg0JlnPn*LCHY-+5Va3! zbzSbh??V#;jYb3MbQ-BtN(L6}%~_xV-3|qzOMK21a%k)|usxN6TCy;cO2XSb#MtO4 z!YG1D$%>^SgqcWSFc{#7O5dKcFkx#r*FG&X?dUEhtTb{kQQ7zbct^NPWfzJ?O5(w3 zI}i>*==b~ZFMp>o8|$dl+jwqdB&_SX^LYC1JH0EI*DWYn8xe7(sw(0r1j7@iX-Z;B zZ5>bCI?8b#Klk<}Mh^V=)Ch{hB{T{9+fs;GJBj_xeOR`IQlS8~*Xt1;4c%4;4?8A2 z&%@_&6R+|C!bw90XJ>z0#}#sZ@AmN0*+be+OT{FKEq`L1S?*6;`09q}3?kgfrcinP z2}>7epeK@ewtEQFJCcWG`o^+{10Q0PSgls8SQ{2tAP(m26k___U*G!YY+%syv8?qdGHL4hP%-fdywOb&Ay zs*FbEUhTJpM_438kD5tYSy_oSp&<|<9&LRjmUD?|Vt8@l5)8w@V%VU>3Q%*fbas-9 zK_-(ypA;~414_AEj#+z_B~6pYJ$_6B^?xxWUTilKrri15_j<@?vk(zMU}klyLTVeG sj5P=4#kN5(II)GHRDy};vF6eL3-ugjmjt$7rvLx|07*qoM6N<$g1fL}=l}o! delta 736 zcmV<60w4XS28{-gIe))NL_t(I5iL{8auQJxJu}>4fB|Lz31BKOO)4f;YAkoUN=mnW zf#ok{?b<(Z=f;&wODPwou*kEJ02LSpmItP+(#~Xo>JpoxZG3GXf)u>JVXyNoE??->e*8~I@rTmYsI9l>tQq;K{&F6APDf=bn#j`^}{9b zH)P;LwFafBpnueJab?V4{TM@+WNNF0G>JK|&~=@Kd7E#d8wS|8h;Sq8ry9RkZ6-P~ zw~_4*(cTwOS_soXuwFY(>ytHrSCA`_}%&8GmTGJiLK}FRMA)-ULr>vwR-Q za@F-+saR4of(+cx*T)4j$= z<(ipgmN=FGvhnEdzv?a%kv5&p72JV`u-Aj2o|~qL=i>-M&H!1tTn1?qh9L$A1wPv; zHgUO_p?_8^qrMEJk_u{37Aj5MYPEtY#iMDYmJ*mUBk;R?4M&9)=E2(7 z-h@cyR1xr}eh26Z3QZGR9S3#UqR#mZJ~bVfhD8DK*&lHh;RF>BE+ SM95$O0000?X<|l7ids1QCu~Vje9pn ze}D@&x^ZJ%86vKc9Wimu+Kpl1$_NV+Fp-1>3n^L%r3E@2I(^Kv)A8O9yh+o!x!--9 zbM93Z7Z*cCQ4oe9*c``!>$=iUCX;BjTGHolwnQQ!W1Pc3(SK+(WPp=2O+^q4z>n+o zx_l6cMC8BcdC-JFwOWN~nuy2avasN6?gABXn^c4zu|H%Dp<1b8>sky-E{^e`B+~0O zjE#;W7!06NvwR^BVML?weIKVZ`qo4Yxl9B_J10Bss4Z9-6EQ7@<+UB4)51#{+sfyu zNgGbXfp7>yw}0D3WyZv~8pUeq2*r3x!Ybyj;@yvu{C;7WP@*Xeh$~f95e@<{JYg7y zB&J|T@UgLnXTn0cawsu!;WxPvgD{6!`n++Tti$hk zcy3$-E*0dob=#Io<%vvTlf$}~NwQU@O99F|2Qr!6liIQD#?tcQu>Nb=0LU7+{d*sR z1L<@cuYdY|2u~tHipFMcSl-zVuBD%Vf`d#xG(kz2Q&1}bpS~Lvk1d68-zM5lPY^QJ>2caJ# zu4V$_Py6*DoELjIwPU(vM%`mvyVuZtqL3tsfO%685dYta09!@_aDd7nMA!1r_%Z?u zrZpPKvlL8EFMpLv!s-3JO?)Qs^InF&Hw1J1Wc`(c-d5W%dM-|OmcpTXg>t1#H{FEJ zLR4!t1l|POgE=Bq6&j|c;o-&;JU)xyMFidmuzzrfaWKcg>f^vI!S{WZ4j7T*K@i|u zBgXKRBO7_X^YN4ubfZKfj?nG@BHl|d&!_VQdb8QY`G5I2+=F%Ow|AricNt#v@aFzg z6iP*8(M)RPXAV^};rS!^Q?_kGe87e|BLIU|!C;P|yVOB`HI2*VvfMPf@{#oE2E4Gg zwuYBCx1uV8cpS$u=JPo&cMYCGb)$jt(4)K#i^S%5pqNnk#KmGkE>y*h>^KIGMk4|5 z5-r==5`Qq)t6)vGT93$y5CvnHR#k8po$h~{Ofd>0 zC`U&}xvHsH6f%6@T)rzd(_ZHm#bOa3{2!~PA|wwi%fgKQK&ePBo=hgow?GT6>oTdV z;&zcj(KMm95|e=iqsU3XGqSQAz`kbJ6?9D&7bz({6nd(6RZplJhmod|d5yK>m;4U~ WZCC?yh%>za0000i%NWg|ezzsm+NZbUj0hJ(ISO8@KZ2>{rb?E2FLyD!u@tfyo&v@cJ zU0xJf|HBkTVKC40%Y#Qxd0xzkktnwjw$8U_BAB$xAuDEE^jhSM2)yw0Qr{ML?@3VciUWCUaQY2n;-Y z)%^0(l&$N+-eEkuNM*!Us0J_Vmv=@nyj-NTCC;_Q7?Z~@)e{dE&oE8a>DWfEA&INo zt+@mOCFvT;w&^<&4%g~o;2|(B4o(dbaJ>Ue3yx04FG^2&Abd_9GKN)&-Ko)V|00000NkvXX Hu0mjfukz7& delta 346 zcmV-g0j2)y1N8!sB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ib z000ib0l1NC?EnA)3Q0skR5(wKk}+-qF%U()i|CdJBp?z(spx4q2S=dbES!KNdU~ZdwtfVy}77?F2%JYzm*qTkN4Rs*#@Vm7nosc!+@5RdIBKw(5%fHjPn%?Pu z6ycS|*Yoy6l2eBFp5#N~=&v-vf5EVa1m0UAtNfZYsJS3W@Ybq88bxSwt@aM+qy-@M sbKy0!F}4iQKv!ffW$oKG!m}R26`Ao`<(A%DPXGV_07*qoM6N<$f)$*g-~a#s diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_1.png b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_1.png index 98fdc0f94d68f073fc83bd0c1276b644624ee489..a192f11997771a959b958ceebaa7d5d005da57cd 100644 GIT binary patch delta 508 zcmVBDNt;>^um80#ZT)6%~8}@K1aT z{0mT!Km!erCXg92lbDiYSLaK@FlffU^GdhclVtO7acYOR6S3Bch`}SWcTkhT%>=sz zMtuJ;mAmUtZs!(q*I47*9p;XftphOz#9TpzHR{HaJvsu91%L5oB9(O2ox;14t}N|| z+h2a~Bq3u1W+5AmMEoWxt=Wk1b}C53F#0?F8r?7>0hhd9m9Xwq@Ycz8tCa1sy96Kx z&RX$ts;vZ3uSpL1{-2KI@V#8ZEGrTry#9HVeFPiIeEfNYYEBQDThq zT?>-lnzFTbeQ(PG;;bLA4tz?E%zn`LouflK2bxDE8FdYadbv-nBsyG}0ame@p>>!U zwwD&V;1~U1<;zB6G15XX#zuX9Q4*a{)&WJNm!rAdGGZiS0I%q6qn{!!mWXO#Y^}LG yJGSHEOXU${<}9wtc=n|P9wV8y7kK&WsQ(9`9-;l8y_8-60000b^O1nLBkIDY~hNkl+@<)Am4EqJb0*?9Q*ob;#l&}% z-ln&LxcU+=x3abpFsGGuRD|oa6yu)*DRnV76l-D)=#oAX5u@!M*o}~s3B|zc1>0+* z#8@EDC-?fAPek?ReFtzLhsUL|hdUc8lYOBIO6JQcaAFNkdDf2$W&3e7)3pE@C2CKx z76W|OM5lWPN`Gby)j3s|kexBiQ%#It5XS?afsLgwsLW;u5>O&ZXWvgH;cLUk6HSB&;e(|(glo$FjTShPsUP@pTa1}cj z=b}q`0hGyVXkd-#So}9g4OS_}fpeIdRlq@hc&BYsoPYMwM*sQeDi6Cb4l?+{>9kUw zbI4jcGd7H`!*e5B@V4nZ8>mFZHC?yv)@P`Rv%mGMl9->~jj<&N1L522Uw9~s{8Ba+@nJlr1n>!iu zQt?!Spf0IDY}|Nkl?RCVCf>IUl-CEi={ z?)8iGbNeTsZS7-)f3ZodvDprg?_jK2`lC5Ow)qbu@zF(t^-}Lcz4~Zc?IHDz-$TAS z$=HAKHbs}k`3c5``2#BVss%ah9u}j+{3@V8mk`vQK7UH5_Yy{>t%{NS!P47@1S+D} zRa4sBlO-V@&!=R$B6eynXdNT@Aa;vDQ0Eb+z5GVXvv#ZRWkaI?IIp1+to?1~ZY_ Ra{vGU00>D%PDHLkV1k)*21Wn? delta 592 zcmV-W01p3c(F9msuW(LVL^oPoSvoZEnxc0>F%@LP4fE1)A0WM7eWX?0<-&P9lSfg z1_f4R|4oYXu zQzDuCU82RsoPS7EAzTVGNs^8F-iYQ9in#8A5rs=Z+P#9Gcq?-A^*1tA8a+C;ddn~K zx-Jt=_ua3vH4?u^6L4Mu&gx3fW>xgVBb3|tG_%a#3FIv z3slt_xwFX|Pt{T_P3{_Yp+J2imKknX;c)M4AI>%5a(_12h4@>9xJUwIY%b@_`D%=_ z{~ITDezJ%1<25yWb?S9G&$}zClbYRs|fL=??~$ z_>5G2%k%w?H-^#nX?3#kvLX?Bj4-gW>A7I$YJ7q zuTvYs)iwOvlUA4Y^5U&+GV73xy~a+tj{)mH_n|J5b>NbpGBeqIn~Ug&;}GY|R3y^a zSyKJA9QVec)qmXzDqztceH7vOZo%U0*ZL17h`D9cPPe|kT`1^!zO?H(B@X7ke?9Sw z)swm)#D;_C>C9vg_wfIM4l63Z^va6pF3jf(5u!}d0#Mx(Hmq?D8*)$DO z6IB^JoQ>vYxyggHr8U0-rplZV7zU}-d8jQNd_(VW4u1pI?^n8DdN^o08Hki0gB0mJ ztJ8F4)0VJo9Ip460a(}MnwhrV);pHAmIJSVw5`feT6cbS?EkHw#bA{v%Bl1m^^hIDY~eNkln{kIIo(Sxp6?^Sh|b0YE}%zT;`nakit~;S;@ln1q0JU}3p|z#5{u7%ZGZ1f5T=9F9EdbJhgqa* z7`~J5Y;gaMA{Er&NN(Ee8eUprVC6Vh^mLetQ0zN%-EbR}l>}j61&PP;$^mauiNHV|Cc$L4mEYt7#>tK7xs)n;Gw|L-p-SC@bmr zoE7**Y7o+vMSmh9gV9tjh`f_XV`X9f!xHq3*>5jzp#l!&vqvJ-ms2LEx0Mew5EFC5 zz7(pyPv!LGytdD07gnto@(JF(e$mwRN|$Q2)c@_J&i=zPV6zn@N6w8gS2TH=+v$fJ zK`{%0O^$(`{KZI|JOPG*bC?-+pOtghAUVg2H|fjSIDh{Qpe356!_0aY3>sR!#E^A6 z*1^nRkTToFP*6s8+lLA?FbM{Q(>QwU-T zN*la=^)tMg&)Hc3tHoBv`FyROcxf?E{LhrKUfXQF6rW1`0baqpKqZH<0ssI207*qo IM6N<$f(INJaR2}S diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_4.png b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_4.png index c9a6cf7b82146ed6e2e81c7634610edd208de6bb..2e59a7b2f957956ab07744e215b3fab4bb7bde61 100644 GIT binary patch delta 539 zcmV+$0_6Sm1jq!CIDY~9Nklu~a`LLOHKl3|L(7jIp2ZH-Rta@;5

u++Otojd=MwFE5L4PzGpRKA$zHU)KJF_8C?;!EW zwAX}82a&wSle2Q6(e`HZCT`jw)=Wn>328@`S@2hu*?7e002ovPDHLkV1n*>2?_uJ delta 584 zcmV-O0=NCh1oZ@vIDY~sNkl z|HVI$Q_fuA1AsVyjU9{lftT*ls*0_WrRnKu&(5^_@cx;?rVR;u%iU!w5 z6{|o(&DSdvR(}`5M^ztjH;|Jm2}P78p~cmPH=@MUS^x74Y0VBPy1rT>CLN=vr*@}5 z->=29Grb3-oce%mORV`eGyF2Darp&U?fx=8hI{wsm0unXmR#)x0+XW{tAnIT4A_IC z9>mL|$Z-AWYSDQ%N5)ZROo*iCIgKQuaK)2eOmoc*D}VhK-BV#lBk@#zrRX=TmOL^py!hYArVMr{C75CJ)dDIwXxMd7%9c)eJlx>q6+;8B7Ui zW#%+1c0rJsic{LUJCDdq80$}U8m`^Fef`p}%mv+U!y0WIKCDp}^0tvBRa*~8!s8zv WpzI4ImZwSp00005Wo diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_5.png b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_5.png index 703ec58aff3cde8c2bf6151b820211ced95d919a..f0fbc287062fbdb8ab2d390dc4ec1cb9dee85238 100644 GIT binary patch delta 564 zcmV-40?YmR1mXmcIe!#ML_t(I5mi%5P8&fGebpW?V*DXa7GQ6(GTDVeumwae!G`Qe z?g1BIg+y|J+y(9su|Ncg7zwcCvB@;=RnII^^XchVRj;b6YV6nfQT+M5j2I&%W`=Lw z1umbLK#+iLbN%=JKm2&g;Fi?MHj{dszt)EIA&H(%Vloi1uYW{`%QM=paPOg97e?(8 z{Xiay9Q&qke$l8OT7uE5SLr2MBQNQL=oCSuau)ljJ@@?<7EUCmn$v9$LPKRFpnQ&V zvhmCmsX7}U_*VMLB4sB=;fkzdrA&d4uMgyhDppX$A}*YyDXR7Y(b4%FDVk_+v4?zL8$ z$S_(d9oP>fk$>WFzov!zDkc#Xwr4FRN*|zL*O;F)36O!D@(mWQ7VYKG%s|0z^@wd@ z?iQIF|DO6rl{Y>B=bcvp{v%BUt-2XnBw|$-UIUG$x6C8!l<+oc9dfJ_Nsfb-?B>i+ zlL|~VSS^RA$MO2n_k5-Eq&EJKNw>=uddn3f1Wq0bx>zo`~z{EYb?;)$&ikh+7 zyMR_VcNW98F@GxO)}ddo19(*}P?cI$ZE97^QtKK;7RE2pOCAt#Z}KmvOZZCZzj*;-6ozuPB%%EKaCtc%m^-FKSl~>^E&LQ0tymjDzpR6#;GXqGsn%7}CUn21j0Ct>S z&&)Rp1KcJl`urs4Y>)U)Nb+eXwSTyd5P5rytW7z_LQK)L(@P6# zJ^F1=ZLIm;&Y2={c^*!=ukLPF3n?y&hT9f~v=QiRo0)Llucm)Xj=39&NnH)e1a&E+ zRJqktex$^9ae5JbVniA+<5{f>NakDcVq+I=zNYWMg2eT|o_NxQMaJ92C{|G$RF21# zsUv|^tVAZiWit6ZOH2bnOloPXn-uQTkIz+7)<2+hqi@m}c90a0d?qMBRL+VFHQfv) Z=pQb}5yY{2+?W6W002ovPDHLkV1j*W9S;Bi diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_6.png b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_6.png index 6292f78f9cb64e015880c3ed283822f56bc1460d..bfb4a4295a1b92495a4f27ff163126cd2ee82f86 100644 GIT binary patch delta 538 zcmV+#0_FYU1jhuBIDY~8NklSFtn1a5@LgOxzD=#E{ry*|;9n=1x6t|q=$w}|7LxGhA($UbgsTPsT% zRcE!)|AG^YWC%)oQzhRFvdSx&SG(qj&?2*oJM!h>uLWB4w|0)|F6`Jk>Dp|bcFn0= z2NIdFu5vO8nt$ts%&LSq`MJ86#Nx$%W5ngKG+DSE#abwEZPy9196bB!)k02Xp$v5D z6+V3bAs4^z&};yM@OD4RB^Z%_6+3)7l8dju{me_+8gvq1_zNL+<_ z7$&{En&{|YB-At8y>7e%j%SsgHpEg)urhF9ZP+q#aet-<07r3bZ;NgTw1pZUQS=?b zsA;ldsM4p?_Q&Y>5rO17(R z!r_t~*Ec__0gl|!TLy_Xl2NSZ5V7Mlkpump3h!12E1i71lFOTWXIQ#*8~?+IMhmUw c&bI%55fci+evN7%X#fBK07*qoM6N<$f_1A3IsgCw delta 565 zcmV-50?Pfz1mXmcIDY~ZNkl&pN_@eL; z{De91CvYW8r7Cd_Ns3jn&1R+hjby`ANgDO^>*=?c@!3gvdOMM_6fs709d)*3tXK)G z0&#NG-InpquRsD{aO8O0YPJH1cRPx8PplKia{KtWJR6vWw0{zCSDIqCZMh6$a3(R_ zP+qW4bWb5J;_W!neH++^C=*ME-Xsd{+f*&@G~fh;p>c4LNLB_>ro-nT=|L?RvHXyD z(Co{_;zyEa_jr4WPe^{(BR!7KNm(EE$yxc7x~SU{xrFdCKVRg_fk-e z+j z(cJ38)gXzam#v84_=N6LIpCrhkxmk8-!m)mDjWg?_YufcRyUg<2Ajk~7@Gnayh9sjz?gTDhc@!+%?-A9CeyETb;6kc^69#;>G`$P00000NkvXXu0mjf Di5VFK diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_7.png b/src/main/resources/assets/create/textures/block/oxidized/copper_shingles_7.png index 480bc3ad178b430c8315f980502559e1db11a193..6222672d94dd6e9d31d2ae770cecd6e13e16f78b 100644 GIT binary patch delta 540 zcmV+%0^|LP1Ih%DIe+{~L_t(I5lvIOP69y`y#p)kn&>`emZ)fq719|Cf63C{u<&P0 z?5vHYR05?jQ4>(m!e`=m&YfNGhRohM_dWMujxSFAVEiQBd!ZO3a?sn9!RS$l;HpCX zu)ifYqX(fuZE%igb%lNw&WhO;+zlMPei^bJr|_Lre!x+3HF_iV_ua8L7T6kN;@F1EB}(I5=I=A{zh0bOSCE1Aqgr$^eRkA}YJZ9%JP7a}IyLx=6RQlE#^2NsgO=4b|a$Ih@Jm zEjtMkonK$cX!2d(_1kkT8BdAbE%5!aEyKx|^kLHqNQR$8B#rlv>d4A85;HZCFeBgN zptk|zlav)_Gyu-ZppNB>GG92k#?np~cPhkOvBZ*UYkx{4&b|F_w;G9qD`Z#OrNbHC zhD0OAuDBuapc)Ac@a4JR@Nl#&$(1Em?_4z#b2Cg7Wl9dUN!M8=Oh{>z7woPU)o?8N z;=>zs(SBGNnHGd=WN=o|n&?ia)IU^RbPi&fqq7qqR#ru#v7TFz@$(M{4ItSDeZOpl emDlV8_7w*Mf1^t@iM_1=0000GcX4f8at0FO z!ljWwP$sZJUJbu3$!M%(y1M`WRXtr*jr+%k{mX0?yxmPE;S__f!*hscyug{YV#_=j z`(3#^G9h&0<>8FO@9ckiz^EdZ{%Sak8ZRL z_5_4{?~An&-Plb61(UE2&jc!%MBa2J(Xw17N|)LnfJ&GYZX=G%NJQPRRrygp;kKyW zD67DQwG)9R&9JyTA%hEZG_Bs(1zWmVz8H3uF8*U;sj5QqR%`>NCT>UCBF s0N*mC5`oK3b+q>1Z6t}>t9FBZ0V5n|_`WVw8~^|S07*qoM6N<$g0C*2p#T5? diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_0.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_0.png index 5df19a754afe239ff60cd458abc066669dde4f9f..ce106280e9268d520f92718c6ef9b8b711ab8e9a 100644 GIT binary patch delta 566 zcmV-60?GZ31KGQ*KrQthluE7r8&M0ORl(5_2r!96N5SAR-=5i-=q~O#cdxzgxohop zqPgo=!nwwnwm)y{>-(0H+(95Y<+`n1qeb!J;-=wKQw5PH z68MCCQ07QRtII#Fe_-NR)i~4C>=jXy8cAvW(~g~5tCtN&vlsyW=m1}Mu`iz*HK7oc zJ%WPq>#j+4Jf~>)-RY8TJgT{pbXOfJNm0(km1RsDWG&2t8 z%)4`LZv8M1sHdUhG=Xz>>~7HPoP5skBZq;A|9#>(dPO^LZ-uA#-k3?Oy7%A|=6ref zq^0lyA1BWrEE0W9?oXc&K4T@`&kWD*yk}q*U}X>&;bGvF;bl0o;XVTh;FD((6<`K4B(0Pfq*Me^ zBtdf6h7WL?<*zaM^sop$Nc8?d0B zo(Ka>3`TOz!uLSfICdyFaQ86=k0rw|GpOh0000ktU>85T3cQ%32#6nAochB$Mr`|o= z)Rmok7W8&1oF}Vr+?dh%&0uP3|M{ktV{mZ=Y`uKIPt>bNA}T1Qp!G~< z3+E$^r=lyPe=)(_s}6Rz^>jEfskNFz6Lh~A1J?qHW&FLoF}5@`zBNalUa~Qjb&fzL zxdNTgh~%T_wST=ucRh!nr(-!?qc8boQ!5DH3FEvoku{)D&KjM}EDH4h`F+Qv2;iF}g-nW^EyYyIKPkpadN{V}+Pczy^TS+9DY$;65WF&o|p6OWmC zyZu-fZ+V`I$iZ^8#4|^+6c_IhE*=lgmc1&`=C8>Gq>(FecXZqxi>DBYT$b@U`ssMvo4)#G`JhKvo zHLuS7!F_LJQXwezf$@Bci7-1mmOfxGYs&kOj0&WAopZ9r2I3$S>g*9d^iSOp*y{4r zuJ-F}cJn2vU9iq%BIBcYPV(Z2C%;z=6VX+5>ya*%6J{fQ`TftiIcHKT$IYGKCSLd1 eXd-ja=>GtM$REMk3y6yV0000uH$do3CNp_w?#%n0d!G9E zx~xkp4=`x=@%z^a0@GonXKcjp$5CJ32cS?|$%#I|;od2%WPix$G10fz+puigL%q5W zr{p3#m-L%+Y;GfJYf#^=w&6UTgX2yaozHBhrZ(S{^>F0j{KCTXcaP+cK&|r4Zw?2b zwTIydqANTTT^aqm=pG^=3u6s{WN`E7sOQ6&A7v1G7&JG6hca5$FGP6;{?#1w@HIg+TU&t7po>>&g|MgSL zY>Qi?Cz)a%G>V4unV#4Y&%8r^`asWAZ|j5JSo4`9AreBEJzNYeVSWt$vR3h#ZSlmK z4&khGX*{84s`9F+7jH3-dp-uo)%e*rA6%TDf|74johMXbKovHrkS3YIbSi?t1UQ1SImrw*>S^9 zJu2V2%7ONo-cK@f&a8=?2uqEgMI~g+!RFgCM~r~Xys>j?8pupea+B3(7f&PyH1%3% zD1vO}IDeRft}t`<`6YkO-J=VnXKg6vz%bwPL_9m(lN_*_Gv(~<$oOW?Sy^L%SoFl` zk`ZQs{L~#WTOEH{)toaA2ANnl%=AR+voIUooDDsptF@O;bU~O|WWCNm??0FWK`bmJ m%$eXj%z<|@l6%PL{{f%gN4D~~U7`R0002ovP6b4+LSTZLD@;xR diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_2.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_2.png index 0256e98a2bf20d61580ee8fed8687f923acbb579..5c8942bab9fd88642c91cff83fb50bee08b327e1 100644 GIT binary patch delta 662 zcmV;H0%`ry1;Yi9Ie&FYL_t(I5oMFjPE%17h1V&?2<`13xBexxBim}|08B8kO!Wnr zL!!QhK7+4NA}=A#fSG_%22w|;P$Cp;OC^!E$F=q?iN=$VUd}o{dwqKy_vYEWpL==_ zz2*ge9CR?29>-K>0*O0G?5rID4!G7&zIG8y#YcJqyX#HFvVQ?=VScWNTg6l)-sR@? zBji#J(s$RI$UiC~UkFUs_wM>JGSpmsao+P1oOOYPr7FLG&H5*9=7)3eLk|~oIO}-S zmS#-fTG>O6o4uB-K40*I&Xtwc*zd4nhx?@fL(QdcVA%f6-*I^F@uks?^m2ef`%3N* zpUO_aXKo_NvVTv%Yto_cFpu7Gk5_oKcu$y}#N_P+&JG9s&ttk0;um!>i%F3G?RWId zva*3UCgJQfK_<*|I9o6#8EUz};RF4PgP6JP)t7#w{?UM`ObwNG-gT%g(=(?wSIC5i zi;220Z1>5`8#DL1R`sP)3gQr_XL-}m!bYQG2b3yClz$tqtj$^zOH(JacrGy!d1ek; z=a;rQUkoe13k(>k&y8FZcfK3$H#))EGI7`n+7Vxvl!11xz_mIyLO=P^ zy@h7Afgk%P7#NOXd?W$?Mhcs&6~F*j`q9@@ctep(-A8$?3V$yV@4JnenH;X=hC=Zs zi`ObhCM~3wSF6Z8${~|YJ6-SPwL`?InbQ2M?Q|{L9fRV+edu{#`iw+^#e*Jf-{S1T zqSZE-Te#=+^`$KyY!QzdnC0h1dvVfrSKHog@WuxDNgsW!4G*G!e9rGEthLzLYlixi zkBj53+#xbPnty;Di6g~p*S>4fAbU51=3x`8LLC;tXcEcmK7Jll`O9LW5THd}%sdJ5 zzp+vYuXV{Jn4Ta=-+2zEvyO>8Cu!{?{fmQ`nT_R__Fd_d6Jilv3J{Y{$HUwrJzFwa zA`^NR6Lq0gKX**T%)EZ`(B>yo5Qhjo%bOl;+}>-r1AlJkQ(Q6R(RFRs9&eaBnMKAD zvCuPfQ2*6-#hF~%<)C&D9+tgBCec88rjYc_OOT|Qe3Yj!;w9nbdu-JLx z;KXB>o;f61Q-Jg@ftXMi6JT{YK&K1rJlo(6s8x@w7|y|uM*Iqh zd*bUv9lln-BjUqezdpR$@i+aUwbnT9GTC9Rl){Lyxo{pgy}t-Z%ky(`+#BQN5F^HQ zV%ba_$NSthqSZbd+Ox~09Ih`0xcJ#aARxC{#J7)4 zYbzoz@mEYjsaSW#gsJtzPc74-Pz>R|RA2hq?h&Fz^5u)tL#NXN9#9j8ZaGVnAQiLr zr<%Dpk2m~UDTH*0O*rchl-M9=ol-fiTGL}zmqw$DSbvm^8|MM%-0u9gg8Xtg(S)3N zij}-+a>aHcj?tMW30zXM|32WHC0>DEkSFSUoHO}~^T9-uT$G?LDdN(k#Zgo9_w<2Y zG0soPnfK|O6`!74&J5J#18SyZ`vVn;TjK}a#3Rn5{&>#vzzy$n)a0bmGf`*pmbRTdU(@J}}mV zJ|HIlA94>0_g0}=_j&h)7iS4J^?F!Db{hzTQWrM>015yANkvXXu0mjf)YL_3 delta 673 zcmV;S0$%;T1Sx_9J*<7L~G(kbnC2#v!~QNU*(rfZEaw zrW&`LsABEq1HkvGZycb$ID^`B0hN;PzEv#EynnH5FRv2x`yN)FFFyEbggyvB6pxUmq)_AOfiSi`4v23S^oC+;#6;j zNVu<+t(4ej34aK0hdAwW(*TWD9T!J2thMOzP?cwd)jMD-7MN~Uad8~u_~$u13Dw00 zzJKbntptH@9l!Qul#2B&PXaQl^_|a$&WC!V2=jIAmEBz3{l~-`2UiyTfx$z1!Y0Pd z3H*r+ak9AR{T_R=0Q2_AqHWHFkPq20v)FX7-4Qb|-+wH?5KVsE^hKU!EBQ&s9COaS zv%V{+O&7*<`uyhU9;RLgn# zQlKtR4moNI^MN_|%lwSYyfK|KnRA}&U~nTRBwS<1D?(LlL?RYg7E9aWC z?~mL##aCaNO^bO!>IrkeocNOocK8nJ_h+G6^JVp={hygRVD^;*-RPJZBIQ5~*Pci> zZyw*X^Ub129GAQpa^A{ByAwH6TVz%SwB$(=^BSGFoJ9BoF&R7_38c_V00000NkvXX Hu0mjfuclNr diff --git a/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_4.png b/src/main/resources/assets/create/textures/block/oxidized/copper_tiles_4.png index 926390a92899b505f3c5e43e4d406a43af4138f4..d7e4a3f9a85791fc316261d7a5e7ac35c39089f0 100644 GIT binary patch delta 662 zcmV;H0%`rV1;Yi9Ie&FYL_t(I5j|5)Pg6k@J@55Fi!BM1wonx0sQlRqMj_1tuIZa+CbMC!!&$(y3cW>v- z;++8P#vkk-|3xC!MRq)eWNsAIdI*odh1me-2WQwn=^*Yq{C`?5g{|El{Bqbr^(PM> z&R{x|Kz1xj?xGx?q7wo81jfSc(AGGj@`7Ho3qss-=E>&FJXWp8L4ubxgqYkj9- zlRXdU8v~!4-9UJ5fFBZXac|&#eDlb3`hjh2^D3`ecro-FonC+u(z)cnXn}<`!|N8W z5ZAd@kRe~KdJe@%lOn0`Qrs#};iB2bucJ%&0x}N@)FC9_ z7R0N@LON4XC2L=+cP*xvt-YSrVR~W&-jB~KW^KEH*=~znvbkjd02qtA7kPY*{6a_&pmVU8Gr1jCUR9 z!!tBnZJTf-9Y<<1ixS&bPgWD*Cv8hfL83lG+}E6|+=yr4Zr*u;p0J#WS)UB>Y}$z_ z9|#w1`rrwNNzU|vIEnK*IlDRAhU_QuiRi6uAJ}98ZkWuv-)my^Ys>~$hMVXNAaU(b zmwUwDe}4&q)ohPv?bA_ zdTOsVG4bqAsYlOx(jH5V?V*kSh}N4X)&c<^$?%zR$;~*RLA- zNnK;`vyUGgAmaomdKqLZD`=i8D5dbYKF9EqxPohs1b2}wuYcg^n+?mGPtd%uP};0v zt*9c9#j=*i1i5*LBbob~byN!)#hh#AEGDM*_wMO_DvO><;o1EHI6j`XO|dr_LTinF zYT4jVWBlN(gS-xr3kOhdU*6Th%r&hY&wMFY*s`uL=9)7`Fip!dFbAE?O9tPzuP~ar zvJ-IpylcSaN`D!v(kjP#y)2xsWtK*}_g9kyzga8c_pfVwZv)nnh~aP4a43R#(iVT@ zT->+~VieSuIoA^Wlkle|Yenhz>-$~(ft+Jbq_EKBf$R_s$k`N&CaxXe(kh@Unmrdy z)b5K%ddq5oI%LRsmNqofR)7=HM9W*lY01Abm}^IScz+Nzb5>JM%(;(Nm)jwBL2?jj z!j)UGCarFi0UnmElyKwRf<-Tz7s}|cey1$O(VU!f^Rc1EKv4%j&w%BGe@!&8jn)6p zLF}^^N)Duhg(l2_B-7+XPvA`kaOfoiQ4#+8pQrK`ai-7GDKf$pAyBqEcym0Zrbd$> z#vK+g!hhskm9`CM@p&jdCmG;Jmj1~}q)Bvltg1LgPZOVMCv(m(J_2~M%q zmv=jwK2uC)pI_@GcY`^QaUeNKa=;cBICHSG_fR(+$)pVOW)?=%lsrT6nLz@!1s}R4JZHr002ovPDHLkU;% zu+#!dLu-hw{22KMCM7z8(4dtTPzVhqkQ+&|p0gwl-z{>p=kD%z9-n#n;k9euzrt~x zL}y|#mk3aE*H}mo(K-zQ1GMKaaXd_;>nw66fn{7{k@(hGgnytCjnVpZ2iuP`Fu(h7 zw>DR^6aIJp!;g01ha*_7ppqSPVTe*8A{hCbwKgkVvUwPLyi~}d zc`!gZ8hJRl%a+e4W7KoNYG=Tf4c3lDIJ@k=|sFU+*=L!w#vO<04Y~b4$s?wg-PJfJ`o;O%a_r1^i6i)TrOz86f zU&vWDuBG}o`J2X`N#Y498G5&n8esQc2rDlY7}=+T8rp+9_N*)XYtQWMzxE zXj^rx7v&&)Fpm-sY97R%voJMvJ16=^IjB-hRUl4kQ#ojmvudMYan7AyG)7lhxX~o$ zfesr*;(rr5z$efRvSX1v|8t&cVmKGf021V!zMSU7k}79|v(t46*akx+PiH=hj(_J` zjUiJBZ=FV{gq#EFqMT?RB)0kX>5UVA0phIE&k=L5tpQ?b4iqA_EDEZh)13Gmh`+{I tCBG>No=s;%Sx^pC+ALfLX-%{94^JN)4`L<~Eerqv002ovPDHLkV1f+;E-?TA delta 685 zcmV;e0#g0J1=7-BWL#zbKP`>iA#0I#!sw9ni4k;)@C9Ny{&trXmO*MG-;GlBf0C6ovCTTzP_ zs1+O!dNIGTgvY%LtLt9R3XTiE7{!3+qgv}?_u(Sv0eiI$v~e+x5gP-?^H4qR;w^_* z{rE=bT7M=A;Wz;v3?o#2)xke_o(OOixIAu%M&M(;Kfrx%^x{U}NhHwlIhg+ZQq+VA z4JPL&vC>R)fPaJSDS2+eaM1~-QHq<$$er+>zCCLA$>jVn&?0U>3 ziCNlFkgFUp$NQ0IkJdbVZl!G|<^Cm{qi?UwhvT*lY$1y52~Is1=O)5#NfQn8>DbNh zFcaDOlT6?&4z2ENzkg<|XFq`QX!yPjN_8F5yRJ$yX@7r}hicY4+UQHa4}WDMjje2t zo|~w7Q})Gj@6sOsUMoY(2AksGqJ!EnYb_yksAq7OR$O(d&XvQ~Y>0BNZtoBHOq%6H zI&)ZyTXy3y2javn#>V;=2bqN&7cW{46ljtD#fdhNt}yk^9y3#z;>1^%3U57(uyaHX zc**m)=YJeMvu)}jD!&`HTB`@K8l}Rk+^>&3+n#Scv*#0U8mnZ$VV0Hy;ww%z#mN~t zNX@}jU}I0>UdJ7=zia{00Oeyjpr%}uPkv*Wd69#kUtb#e6F~O6pruon9H{3ta=?jI zvM*g6=-4BjoUEncY`uGGZhL0GrC|d_+-3#QJ0Tw-j zgW?_M@yd_zU4J+WfWt|OiYJ;l2F=oMJ+01ooV7mI^3QKM$we>`31s4lnHkFZsJyWu2tDLs7dUpE{$GSY6aEH`TTJ&wGV^M*2bfok%on)ZciVM#n@+YmtK=U sxpFc86s{WQ)aRPw*-bJ$dqfuh3$X3^u5hs``Tzg`07*qoM6N<$g2;w1mH+?% delta 657 zcmV;C0&e|`1-=E4Ie&0TL_t(I5p7dVPZL2Her7wn?auCM3z!HPBmv3+J=$XQEZqDH zdew^;gI7I*M_T@ff5AjZ%0)S0D@{P~B1E8Qu^r#%r4SRHWHPh!yz}vVta-fp!apyK zVz+1T!Ji^S9&^TGJn*O=?E^4)R=kP5zQH;=NPTpLuN@sAaDRD++Tj6ahaBz)$rV@^ zFex~=d<+&6ufi$LIoD#rf-DN*3Nco8nkbi?7V>7UWnmWeF=g|^PgfbR# zIqZ3Zk3EmMz>1JoH1VR@bp-UXHt=~t4&vs&eNN=*HL;aC+|7lmOL>rkq#zoQ7Xw3{ zY4L*drO(8e1%_>9r=>Yz&GMI~>cEVMc|a;Rk7hSC2mG!G=TqUyMy@{cnuVp!hT2F? zs0W)KFn=!*X7-!nGrd>N;`5gOEg4`5pDsBNz1T=~w`Z~LI|%;AS+hUvG(g-iEAg$% z|3bak`Jc=R&b{XSyH&3~3qa0n$LC#iexBjw0Ie%p4pt`}Ou)gI0Fwz0 z{t-I4m}uheYBe=fV4z z@#Fgybgnu$Yc!Edy9oR|3b`WokLqv$Ji1rGMX!VNW($+4iGMMEaD0kP6ii_6u#TrI z4`JCc#>F#%i_VI1pzqz*7c20gW;$XE>#6Yoh7X6z6pX`L4?bZ`~t>U4_xaeg<@{NfW zr#yWBacLLaDu2%!XBD;DKp5napDf_4dBu_#3#Br;y$jPUB|x0^4o@IG)SASbWvdc0 z@Td7cPaW#UIr3e6KK^DkM!c^l}Ps zUc{?+JaWB8ETrx0UB-M%f$1qpU3NWeXHxq3)DhBmnU|< n4mBa3_yfs){MDYghW`VuLJ!!6qGD|T0000~kW`_HvtrSYtjdY_;6Lo1~;@XWH zeFUFCJi=-B40gytCLKr8iKALQ01V*K!z~OZBeZ)Rgw5yzuYVoD47o0jq_CVRVkN(H z3$#2JA;(3vb|`oW%h|l*9CMDCX*)J7*<^2j2jz58H{zE$XFCzt(K)^y;8L@kSyva`8b0SDXt)artK|w4(5RAFal*;-yMO<|o3=fR)W81dJo) zCNSunfTZsi3xC4-LKpSV0oEjX6GObYYMKvD))) z=75}23(lfLL~=0KggS5&)&x25G$Y2#FCWBVUnAVCFF4PA4zeJeO$V*x2Ev<7zy{v!~DXeOGh9>_^z}ZT#`O*M9k*&*aVH96Vh#nFAlf jd69i;^8f5K8u$x82@W(B7OK(!0000SZ From 1bebaa6faa56c49f7f45fa3eafeffef94ec15d2b Mon Sep 17 00:00:00 2001 From: tterrag Date: Fri, 27 Nov 2020 23:46:25 -0500 Subject: [PATCH 8/8] Cache light levels by position within SuperByteBuffer#renderInto --- .../foundation/utility/SuperByteBuffer.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java index 76c20dbc8..defc49c7a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.utility; -import java.nio.ByteBuffer; import java.nio.Buffer; +import java.nio.ByteBuffer; import java.nio.ByteOrder; import com.mojang.blaze3d.matrix.MatrixStack; @@ -9,6 +9,8 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.mojang.datafixers.util.Pair; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import it.unimi.dsi.fastutil.longs.Long2DoubleMap; +import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder.DrawState; @@ -77,6 +79,8 @@ public class SuperByteBuffer { return (v - sprite.getMinV()) / f * 16.0F; } + private static final Long2DoubleMap skyLightCache = new Long2DoubleOpenHashMap(); + private static final Long2DoubleMap blockLightCache = new Long2DoubleOpenHashMap(); public void renderInto(MatrixStack input, IVertexBuilder builder) { ByteBuffer buffer = template; if (((Buffer)buffer).limit() == 0) @@ -90,6 +94,8 @@ public class SuperByteBuffer { .getModel(); t.multiply(localTransforms); + skyLightCache.clear(); + blockLightCache.clear(); for (int i = 0; i < vertexCount(buffer); i++) { float x = getX(buffer, i); float y = getY(buffer, i); @@ -269,15 +275,17 @@ public class SuperByteBuffer { private static int getLight(World world, Vector4f lightPos) { BlockPos.Mutable pos = new BlockPos.Mutable(); - float sky = 0, block = 0; + double sky = 0, block = 0; float offset = 1 / 8f; - for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) - for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) + for (float zOffset = offset; zOffset >= -offset; zOffset -= 2 * offset) { + for (float yOffset = offset; yOffset >= -offset; yOffset -= 2 * offset) { for (float xOffset = offset; xOffset >= -offset; xOffset -= 2 * offset) { pos.setPos(lightPos.getX() + xOffset, lightPos.getY() + yOffset, lightPos.getZ() + zOffset); - sky += world.getLightLevel(LightType.SKY, pos) / 8f; - block += world.getLightLevel(LightType.BLOCK, pos) / 8f; + sky += skyLightCache.computeIfAbsent(pos.toLong(), $ -> world.getLightLevel(LightType.SKY, pos) / 8.0); + block += blockLightCache.computeIfAbsent(pos.toLong(), $ -> world.getLightLevel(LightType.BLOCK, pos) / 8.0); } + } + } return ((int) sky) << 20 | ((int) block) << 4; }