From 13a4d0ca62237f2ba6e73a817436c8268981286c Mon Sep 17 00:00:00 2001 From: zelophed Date: Tue, 16 Mar 2021 17:21:32 +0100 Subject: [PATCH 1/5] funnel extraction - allow funnels to extract items when part of a contraption - also include a little animation for the new backtrack button --- .../block/funnel/FunnelMovementBehaviour.java | 68 +++++++++++++++++-- .../ponder/NavigatableSimiScreen.java | 38 +++++++---- 2 files changed, 88 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java index f6a4ceaf8..52ab6fb44 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java @@ -1,19 +1,23 @@ package com.simibubi.create.content.logistics.block.funnel; -import java.util.List; - import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.logistics.item.filter.FilterItem; - +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.item.ItemHelper; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.items.ItemHandlerHelper; +import java.util.List; + public class FunnelMovementBehaviour extends MovementBehaviour { private final boolean hasFilter; @@ -32,14 +36,67 @@ public class FunnelMovementBehaviour extends MovementBehaviour { @Override public Vec3d getActiveAreaOffset(MovementContext context) { - return new Vec3d(FunnelBlock.getFunnelFacing(context.state) - .getDirectionVec()).scale(.65); + Direction facing = FunnelBlock.getFunnelFacing(context.state); + Vec3d vec = new Vec3d(facing.getDirectionVec()); + if (facing != Direction.UP) + return vec.scale(context.state.get(FunnelBlock.EXTRACTING) ? .15 : .65); + + return vec.scale(.65); } @Override public void visitNewPosition(MovementContext context, BlockPos pos) { super.visitNewPosition(context, pos); + if (context.state.get(FunnelBlock.EXTRACTING)) + extract(context, pos); + else + succ(context, pos); + + + } + + private void extract(MovementContext context, BlockPos pos) { + World world = context.world; + + Vec3d entityPos = context.position; + if (context.state.get(FunnelBlock.FACING) != Direction.DOWN) + entityPos = entityPos.add(0, -.5f, 0); + + if (!world.getBlockState(pos).getCollisionShape(world, pos).isEmpty()) + return;//only drop items if the target block is a empty space + + if (!world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(new BlockPos(entityPos))).isEmpty()) + return;//don't drop items if there already are any in the target block space + + ItemStack filter = getFilter(context); + int filterAmount = context.tileData.getInt("FilterAmount"); + if (filterAmount <= 0) + filterAmount = hasFilter ? AllConfigs.SERVER.logistics.defaultExtractionLimit.get() : 1; + + ItemStack extract = ItemHelper.extract( + context.contraption.inventory, + s -> FilterItem.test(world, s, filter), + ItemHelper.ExtractionCountMode.UPTO, + filterAmount, + false); + + if (extract.isEmpty()) + return; + + if (world.isRemote) + return; + + + + ItemEntity entity = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, extract); + entity.setMotion(Vec3d.ZERO); + entity.setPickupDelay(5); + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f); + world.addEntity(entity); + } + + private void succ(MovementContext context, BlockPos pos) { World world = context.world; List items = world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(pos)); ItemStack filter = getFilter(context); @@ -61,7 +118,6 @@ public class FunnelMovementBehaviour extends MovementBehaviour { item.setItem(remainder); } - } private ItemStack getFilter(MovementContext context) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java index 4226aded7..d99d115b1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java @@ -1,13 +1,5 @@ package com.simibubi.create.foundation.ponder; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableInt; -import org.lwjgl.glfw.GLFW; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.IScreenRenderable; @@ -17,11 +9,18 @@ import com.simibubi.create.foundation.ponder.content.PonderTagScreen; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.animation.LerpedFloat; - import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; +import org.lwjgl.glfw.GLFW; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; public abstract class NavigatableSimiScreen extends AbstractSimiScreen { @@ -31,6 +30,9 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public final LerpedFloat transition = LerpedFloat.linear() .startWithValue(0) .chase(0, .1f, LerpedFloat.Chaser.LINEAR); + protected final LerpedFloat arrowAnimation = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.075f, LerpedFloat.Chaser.LINEAR); protected PonderButton backTrack; public NavigatableSimiScreen() { @@ -50,6 +52,7 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public void tick() { super.tick(); transition.tickChaser(); + arrowAnimation.tickChaser(); } @Override @@ -90,8 +93,13 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { RenderSystem.pushMatrix(); RenderSystem.translated(0, 0, 500); - if (backTrack.isHovered()) + if (backTrack.isHovered()) { drawString(font, Lang.translate(THINK_BACK), 15, height - 16, 0xffa3a3a3); + if (MathHelper.epsilonEquals(arrowAnimation.getValue(), arrowAnimation.getChaseTarget())) { + arrowAnimation.setValue(1); + arrowAnimation.setValue(1);//called twice to also set the previous value to 1 + } + } RenderSystem.popMatrix(); } @@ -149,8 +157,14 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { RenderSystem.translated(-depthPointX, -depthPointY, 0); if (backTrack != null) { - UIRenderHelper.breadcrumbArrow(21, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); - UIRenderHelper.breadcrumbArrow(-19, height - 51, 40, 20, 5, 0x40aa9999, 0x10aa9999); + int x = (int) MathHelper.lerp(arrowAnimation.getValue(partialTicks), -9, 21); + int maxX = backTrack.x + backTrack.getWidth(); + + if (x + 30 < backTrack.x) + UIRenderHelper.breadcrumbArrow(x + 30, height - 51, maxX - (x + 30), 20, 5, 0x40aa9999, 0x10aa9999); + + UIRenderHelper.breadcrumbArrow(x, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); + UIRenderHelper.breadcrumbArrow(x - 30, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); } } From a897b5e78bff19fd21aa923251765cdbcf19f4fb Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Mar 2021 21:04:42 +0100 Subject: [PATCH 2/5] Scene machine - Fix funnels not rendering filter slot items - Ponder scenes for the Deployer, Harvester and Plough - Fixed uvs on Deployer model - Ploughs can now harvest snow layers --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 45 +- .../assets/create/lang/unfinished/de_de.json | 47 +- .../assets/create/lang/unfinished/es_es.json | 47 +- .../assets/create/lang/unfinished/es_mx.json | 47 +- .../assets/create/lang/unfinished/fr_fr.json | 47 +- .../assets/create/lang/unfinished/it_it.json | 47 +- .../assets/create/lang/unfinished/ja_jp.json | 47 +- .../assets/create/lang/unfinished/ko_kr.json | 47 +- .../assets/create/lang/unfinished/nl_nl.json | 47 +- .../assets/create/lang/unfinished/pt_br.json | 47 +- .../assets/create/lang/unfinished/ru_ru.json | 47 +- .../assets/create/lang/unfinished/zh_cn.json | 47 +- .../assets/create/lang/unfinished/zh_tw.json | 47 +- .../data/create/advancements/aesthetics.json | 4 +- .../actors/PloughMovementBehaviour.java | 18 + .../components/deployer/DeployerRenderer.java | 11 +- .../deployer/DeployerTileEntity.java | 35 +- .../block/funnel/FunnelTileEntity.java | 11 +- .../foundation/ponder/PonderRegistry.java | 6 +- .../create/foundation/ponder/PonderWorld.java | 6 +- .../foundation/ponder/SceneBuilder.java | 6 +- .../ponder/content/DeployerScenes.java | 460 ++++++++++++++++++ .../ponder/content/MechanicalSawScenes.java | 2 + .../ponder/content/MovementActorScenes.java | 317 ++++++++++++ .../ponder/content/PonderIndex.java | 11 +- .../ponder/elements/TextWindowElement.java | 17 +- .../AnimateTileEntityInstruction.java | 15 +- .../models/block/deployer/hand_holding.json | 11 +- .../models/block/deployer/hand_pointing.json | 9 +- .../models/block/deployer/hand_punching.json | 28 +- .../resources/ponder/deployer/contraption.nbt | Bin 0 -> 870 bytes src/main/resources/ponder/deployer/filter.nbt | Bin 0 -> 785 bytes src/main/resources/ponder/deployer/modes.nbt | Bin 0 -> 508 bytes .../resources/ponder/deployer/redstone.nbt | Bin 0 -> 726 bytes src/main/resources/ponder/harvester.nbt | Bin 0 -> 624 bytes src/main/resources/ponder/plough.nbt | Bin 0 -> 974 bytes 37 files changed, 1493 insertions(+), 111 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java create mode 100644 src/main/resources/ponder/deployer/contraption.nbt create mode 100644 src/main/resources/ponder/deployer/filter.nbt create mode 100644 src/main/resources/ponder/deployer/modes.nbt create mode 100644 src/main/resources/ponder/deployer/redstone.nbt create mode 100644 src/main/resources/ponder/harvester.nbt create mode 100644 src/main/resources/ponder/plough.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1ec53cafb..24769c6d2 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -f7bdf2fb1af4cae8bca1735861d603cce0870985 assets/create/lang/en_us.json -f83d2acecd5ce6ebe8dfddffde3c5c3a68abd492 assets/create/lang/unfinished/de_de.json -35e50f9ba61af0ef900154213b0b25d1dc5469d3 assets/create/lang/unfinished/es_es.json -98c26496201d8f12be5f6fc0ddaf919d9098f825 assets/create/lang/unfinished/es_mx.json -161ac9821b2445c96c6d594885c2d32cd784e8c5 assets/create/lang/unfinished/fr_fr.json -0c1baeb251ff32329a8d34a7200101de2cb724c4 assets/create/lang/unfinished/it_it.json -b0ccadbcc765e7ddee1089b3ca65414f5aa1ad95 assets/create/lang/unfinished/ja_jp.json -9551b6b6df919ff7e2b7e14361e8061b65cd4857 assets/create/lang/unfinished/ko_kr.json -552b3ef71a2898d7e263035ade5b47fb0bcfec23 assets/create/lang/unfinished/nl_nl.json -1661f76a0ba088209fcd837a8a1676dbed186368 assets/create/lang/unfinished/pt_br.json -621af99986c9e334d224f9a356c25d7468a1ef47 assets/create/lang/unfinished/ru_ru.json -6340ad62aedc1fec27abb6b490c36b1fd1317214 assets/create/lang/unfinished/zh_cn.json -56a1fedad3d453a36c456085c836fcfbf9740b1d assets/create/lang/unfinished/zh_tw.json +14e0e7784c59a76deddf3bfc32e334ce043396fe assets/create/lang/en_us.json +9d0c4eb5b8fcf787b1bbdd35dcb2efd37b7b9f9c assets/create/lang/unfinished/de_de.json +7e78635390f2802b325aec510ebef35345e2c9a4 assets/create/lang/unfinished/es_es.json +f87b6f876dbb50c37ebbd67d9f636f70c5e4e7f2 assets/create/lang/unfinished/es_mx.json +866086d9a9fe1f4c39208bf592b75145dd67bb47 assets/create/lang/unfinished/fr_fr.json +2f32a7fbbfaa1d78c6f9975c4aa121def52280b7 assets/create/lang/unfinished/it_it.json +2041ea4e1e516f7953be44b06092b144df0359b3 assets/create/lang/unfinished/ja_jp.json +e5057798e54fe5485a36f71b7298c6b2c73cd1b4 assets/create/lang/unfinished/ko_kr.json +e4bdb059ad70595c66c84ebfc3cac6a3929e97c4 assets/create/lang/unfinished/nl_nl.json +849db8c87d521cdf0ce8dc21652f8d95eea47194 assets/create/lang/unfinished/pt_br.json +cdafda2402e1c3259eba15fdd55a446117fece83 assets/create/lang/unfinished/ru_ru.json +8063b79a864f2a1a56c30aabe6df4bd616c938c2 assets/create/lang/unfinished/zh_cn.json +bd9961903c4e125cd3029dad62a4a7fd690149aa assets/create/lang/unfinished/zh_tw.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 @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f9fdd6089..6cfdb91aa 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1947,6 +1947,37 @@ "create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "Using the Deployer", + "create.ponder.deployer.text_1": "Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "Items can also be inserted automatically", + "create.ponder.deployer.text_12": "Deployers carry a filter slot", + "create.ponder.deployer.text_13": "When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "Deployers can:", + "create.ponder.deployer.text_5": "Place Blocks,", + "create.ponder.deployer.text_6": "Use Items,", + "create.ponder.deployer.text_7": "Activate Blocks,", + "create.ponder.deployer.text_8": "Harvest blocks", + "create.ponder.deployer.text_9": "and Attack Mobs", + + "create.ponder.deployer_contraption.header": "Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input", @@ -2059,6 +2090,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "Speed and direction of movement depend on the Rotational Input", @@ -2068,6 +2103,12 @@ "create.ponder.mechanical_piston_modes.text_1": "Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2134,9 +2175,9 @@ "create.ponder.redstone_link.text_1": "Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "Rope Pulleys can move blocks vertically when given Rotational Force", 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 d3f057fa5..892ea386e 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: 1302", + "_": "Missing Localizations: 1337", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 0b0652617..bf6a5fb5d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 333", + "_": "Missing Localizations: 368", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index e232209e0..53e129369 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1232", + "_": "Missing Localizations: 1267", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 061ec4e47..2218aae58 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: 1014", + "_": "Missing Localizations: 1049", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 871dae9bd..369acaf8d 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: 350", + "_": "Missing Localizations: 385", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 e08d19db8..5db9138b5 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: 357", + "_": "Missing Localizations: 392", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 0de6cbdc1..9471b7f33 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: 403", + "_": "Missing Localizations: 438", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 6f11b4c0e..a4da4b57e 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: 1501", + "_": "Missing Localizations: 1536", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 4316c6e3e..40031e472 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: 1567", + "_": "Missing Localizations: 1602", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 d891d5922..e30cc25d8 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: 353", + "_": "Missing Localizations: 388", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", 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 d806010de..fcfec2f15 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: 351", + "_": "Missing Localizations: 386", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 691488640..1b8b2c0d9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 356", + "_": "Missing Localizations: 391", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java index 6f5216b79..527dc6f4b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.FarmlandBlock; import net.minecraft.block.FlowingFluidBlock; import net.minecraft.item.ItemStack; @@ -22,6 +23,9 @@ import net.minecraft.util.math.RayTraceResult.Type; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.storage.loot.LootContext; +import net.minecraft.world.storage.loot.LootParameter; +import net.minecraft.world.storage.loot.LootParameters; public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour { @@ -75,6 +79,20 @@ public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour { .getBlock() instanceof FarmlandBlock); } + @Override + protected void onBlockBroken(MovementContext context, BlockPos pos, BlockState brokenState) { + super.onBlockBroken(context, pos, brokenState); + + if (brokenState.getBlock() == Blocks.SNOW && context.world instanceof ServerWorld) { + ServerWorld world = (ServerWorld) context.world; + brokenState.getDrops(new LootContext.Builder(world).withParameter(LootParameters.BLOCK_STATE, brokenState) + .withParameter(LootParameters.POSITION, pos) + .withParameter(LootParameters.THIS_ENTITY, getPlayer(context)) + .withParameter(LootParameters.TOOL, new ItemStack(Items.IRON_SHOVEL))) + .forEach(s -> dropItem(context, s)); + } + } + @Override public void stopMoving(MovementContext context) { super.stopMoving(context); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 267763ce0..17aca279a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; -import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -123,15 +122,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer } protected Vec3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { - float progress = 0; - if (te.state == State.EXPANDING) - progress = 1 - (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - if (te.state == State.RETRACTING) - progress = (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - - float handLength = te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 - : te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; - float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (te.reach + handLength), 21 / 16f); + float distance = te.getHandOffset(partialTicks); Vec3d offset = new Vec3d(blockState.get(FACING) .getDirectionVec()).scale(distance); return offset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 4af470f72..531411595 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; @@ -53,6 +54,8 @@ public class DeployerTileEntity extends KineticTileEntity { private LazyOptional invHandler; private ListNBT deferredInventoryList; + private LerpedFloat animatedOffset; + enum State { WAITING, EXPANDING, RETRACTING, DUMPING; } @@ -67,6 +70,8 @@ public class DeployerTileEntity extends KineticTileEntity { mode = Mode.USE; heldItem = ItemStack.EMPTY; redstoneLocked = false; + animatedOffset = LerpedFloat.linear() + .startWithValue(0); } @Override @@ -106,7 +111,7 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void tick() { super.tick(); - + if (getSpeed() == 0) return; if (!world.isRemote && player != null && player.blockBreakingProgress != null) { @@ -365,11 +370,11 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (isItemHandlerCap(cap) && invHandler != null) + if (isItemHandlerCap(cap) && invHandler != null) return invHandler.cast(); return super.getCapability(cap, side); } - + @Override public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { if (super.addToTooltip(tooltip, isPlayerSneaking)) @@ -386,4 +391,28 @@ public class DeployerTileEntity extends KineticTileEntity { public boolean shouldRenderAsTE() { return true; } + + public float getHandOffset(float partialTicks) { + if (isVirtual()) + return animatedOffset.getValue(partialTicks); + + float progress = 0; + int timerSpeed = getTimerSpeed(); + AllBlockPartials handPose = getHandPose(); + + if (state == State.EXPANDING) + progress = 1 - (timer - partialTicks * timerSpeed) / 1000f; + if (state == State.RETRACTING) + progress = (timer - partialTicks * timerSpeed) / 1000f; + float handLength = handPose == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : handPose == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (reach + handLength), 21 / 16f); + + return distance; + } + + public void setAnimatedOffset(float offset) { + animatedOffset.setValue(offset); + } + } 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 63cf669d5..b32718469 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 @@ -4,7 +4,6 @@ import java.lang.ref.WeakReference; import java.util.List; import com.simibubi.create.AllBlocks; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; @@ -13,7 +12,6 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; -import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.item.TooltipHelper; @@ -42,7 +40,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -332,7 +329,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn extractionCooldown = compound.getInt("TransferCooldown"); if (clientPacket) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); } @Override @@ -386,4 +383,10 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn TooltipHelper.addHint(tooltip, "hint.horizontal_funnel"); return true; } + + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 6c7bf9cbb..9c2d866f9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -109,8 +109,10 @@ public class PonderRegistry { String filepath = "ponder/" + path + ".nbt"; InputStream resourceAsStream = Create.class.getClassLoader() .getResourceAsStream(filepath); - if (resourceAsStream == null) - throw new IllegalStateException("Could not find ponder schematic: " + filepath); + if (resourceAsStream == null) { + Create.logger.error("Ponder schematic missing: " + path); + return t; + } try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index 1edc3b83d..bed230311 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -12,6 +12,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.schematics.SchematicWorld; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -106,6 +107,7 @@ public class PonderWorld extends SchematicWorld { if (originalBlocks.containsKey(p)) blocks.put(p, originalBlocks.get(p)); }); + scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } public void pushFakeLight(int light) { @@ -280,7 +282,7 @@ public class PonderWorld extends SchematicWorld { } } } - + @Override protected BlockState processBlockStateForPrinting(BlockState state) { return state; @@ -295,5 +297,5 @@ public class PonderWorld extends SchematicWorld { public boolean isBlockPresent(BlockPos pos) { return true; // fix particle lighting } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 811aa75a9..84fc8560a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -177,7 +177,7 @@ public class SceneBuilder { public void showBasePlate() { world.showSection( scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.basePlateOffsetX, 0, scene.basePlateOffsetZ), - new Vec3i(scene.basePlateSize, 0, scene.basePlateSize)), + new Vec3i(scene.basePlateSize - 1, 0, scene.basePlateSize - 1)), Direction.UP); } @@ -513,6 +513,10 @@ public class SceneBuilder { public void movePulley(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); } + + public void moveDeployer(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); + } public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java new file mode 100644 index 000000000..720bd870d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -0,0 +1,460 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.SheepEntity; +import net.minecraft.item.DyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class DeployerScenes { + + public static void filter(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer", "Using the Deployer"); + scene.configureBasePlate(0, 0, 5); + + BlockPos potPosition = util.grid.at(1, 1, 2); + BlockPos deployerPos = util.grid.at(3, 1, 2); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.setBlock(potPosition, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(1, 1, 2)), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(deployerSelection, Direction.SOUTH); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.topOf(deployerPos)) + .text("Given Rotational Force, a Deployer can imitate player interactions"); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(44); + + scene.overlay.showSelectionWithText(util.select.position(deployerPos.west(2)), 60) + .text("It will always interact with the position 2 blocks in front of itself") + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .attachKeyFrame(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.DOWN); + scene.idle(24); + + scene.overlay.showText(50) + .pointAt(util.vector.topOf(deployerPos.west())) + .text("Blocks directly in front will not obstruct it") + .placeNearTarget(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(34); + scene.world.hideSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.UP); + scene.idle(20); + + String[] actions = + new String[] { "Place Blocks,", "Use Items,", "Activate Blocks,", "Harvest blocks", "and Attack Mobs" }; + + scene.overlay.showText(80) + .attachKeyFrame() + .independent(40) + .placeNearTarget() + .text("Deployers can:"); + + int y = 60; + for (String s : actions) { + scene.idle(15); + scene.overlay.showText(50) + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .independent(y) + .text(s); + y += 16; + } + scene.idle(50); + + ItemStack pot = new ItemStack(Items.FLOWER_POT); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() + .withItem(pot), 40); + scene.idle(7); + Class teType = DeployerTileEntity.class; + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(frontVec) + .text("Right-click the front to give it an Item to use"); + scene.idle(40); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.restoreBlocks(util.select.position(potPosition)); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + + scene.world.showSection(util.select.position(deployerPos.up()), Direction.DOWN); + + ItemStack tulip = new ItemStack(Items.RED_TULIP); + Vec3d entitySpawn = util.vector.topOf(deployerPos.up(3)); + + ElementLink entity1 = + scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), tulip); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", tulip.serializeNBT())); + scene.idle(10); + scene.overlay.showText(40) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Items can also be inserted automatically"); + scene.idle(30); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.getDefaultState(), false); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(25); + scene.world.hideSection(util.select.position(potPosition), Direction.UP); + scene.world.hideSection(util.select.position(deployerPos.up()), Direction.EAST); + scene.idle(20); + + Vec3d filterSlot = frontVec.add(0.375, 0.25, 0); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("Deployers carry a filter slot"); + scene.idle(50); + + ItemStack shears = new ItemStack(Items.SHEARS); + + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() + .withItem(shears), 40); + scene.idle(7); + scene.world.setFilterData(deployerSelection, teType, shears); + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(filterSlot) + .text("When a filter is set, it activates only while holding a matching item"); + scene.idle(70); + + ElementLink sheep = scene.world.createEntity(w -> { + SheepEntity entity = EntityType.SHEEP.create(w); + entity.setFleeceColor(DyeColor.PINK); + Vec3d p = util.vector.topOf(util.grid.at(1, 0, 2)); + entity.setPosition(p.x, p.y, p.z); + entity.prevPosX = p.x; + entity.prevPosY = p.y; + entity.prevPosZ = p.z; + entity.limbSwing = 0; + entity.prevRotationYaw = 210; + entity.rotationYaw = 210; + entity.prevRotationYawHead = 210; + entity.rotationYawHead = 210; + return entity; + }); + scene.idle(20); + scene.world.showSection(util.select.position(deployerPos.up()), Direction.WEST); + entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), shears); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", shears.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Only items matching the filter can now be inserted..."); + + scene.idle(70); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.modifyEntity(sheep, e -> ((SheepEntity) e).setSheared(true)); + scene.effects.emitParticles(util.vector.topOf(deployerPos.west(2)) + .add(0, -.25, 0), + Emitter.withinBlockSpace(new BlockParticleData(ParticleTypes.BLOCK, Blocks.PINK_WOOL.getDefaultState()), + util.vector.of(0, 0, 0)), + 25, 1); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.world.showSection(util.select.position(deployerPos.north()), Direction.SOUTH); + scene.idle(25); + + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.of(3.5, 1.25, 1.25)) + .text("...and only non-matching items will be extracted"); + scene.world.flapFunnel(deployerPos.north(), true); + scene.world.createItemEntity(util.vector.centerOf(deployerPos.north()) + .subtract(0, .45, 0), util.vector.of(0, 0, -0.1), new ItemStack(Items.PINK_WOOL)); + + scene.markAsFinished(); + for (int i = 0; i < 10; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(26); + } + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_modes", "Modes of the Deployer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + BlockPos deployerPos = util.grid.at(3, 1, 2); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + Selection grassBlock = util.select.position(1, 1, 2); + + Selection deployerSelection = util.select.position(deployerPos); + scene.world.showSection(deployerSelection, Direction.DOWN); + scene.idle(10); + scene.world.showSection(grassBlock, Direction.DOWN); + scene.idle(10); + + ItemStack tool = new ItemStack(Items.GOLDEN_HOE); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(deployerPos), Pointing.DOWN).withItem(tool), + 30); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, + nbt -> nbt.put("HeldItem", tool.serializeNBT())); + scene.idle(45); + + scene.world.setKineticSpeed(util.select.position(2, 0, 5), 16); + scene.world.setKineticSpeed(util.select.layer(1), -32); + scene.world.moveDeployer(deployerPos, 1, 25); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("By default, a Deployer imitates a Right-click interaction"); + + scene.idle(26); + scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.getDefaultState(), false); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(46); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); + scene.idle(45); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("Using a Wrench, it can be set to imitate a Left-click instead"); + + BlockPos breakingPos = deployerPos.west(2); + for (int i = 0; i < 4; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.moveDeployer(deployerPos, -1, 25); + if (i == 3) + scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, 0, 0), + new ItemStack(Blocks.DIRT)); + scene.idle(26); + + if (i == 0) + scene.markAsFinished(); + } + } + + public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_redstone", "Controlling Deployers with Redstone"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 3), Direction.DOWN); + + BlockPos deployerPos = util.grid.at(3, 1, 3); + Selection redstone = util.select.fromTo(3, 1, 1, 3, 1, 2); + BlockPos leverPos = util.grid.at(3, 1, 1); + + scene.world.toggleRedstonePower(redstone); + + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + scene.world.showSection(redstone, Direction.SOUTH); + scene.idle(31); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(60) + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("When powered by Redstone, Deployers will not activate"); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(10); + scene.world.moveDeployer(deployerPos, 1f, 30); + scene.idle(10); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(21); + + scene.overlay.showText(60) + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Before stopping, the Deployer will finish any started cycles"); + + scene.world.moveDeployer(deployerPos, -1f, 30); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(3); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.overlay.showText(100) + .colored(PonderPalette.GREEN) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + + } + + public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_contraption", "Using Deployers on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + Selection flowers = util.select.fromTo(4, 1, 1, 1, 1, 1); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 3); + BlockPos deployerPos = util.grid.at(4, 1, 3); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.showSection(util.select.layer(0) + .add(flowers), Direction.UP); + scene.idle(5); + + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 8, 1, 2), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(5); + + ElementLink contraption = + scene.world.showIndependentSection(deployerSelection, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(util.grid.at(4, 2, 3), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(deployerPos, Direction.WEST)) + .text("Whenever Deployers are moved as part of an animated Contraption..."); + scene.idle(70); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.restoreBlocks(util.select.position(4 - x, 1, 1)); + scene.idle(18); + } + + scene.overlay.showSelectionWithText(flowers, 90) + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .text("They activate at each visited location, using items from inventories anywhere on the contraption"); + scene.idle(100); + + scene.world.hideSection(flowers, Direction.UP); + scene.idle(15); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(flowers, Direction.UP); + + Vec3d frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) + .add(0, 0, -.125); + Vec3d filterSlot = frontVec.add(0, 0.25, 0.375); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("The Filter slot can be used to specify which items to pull"); + scene.idle(70); + + ItemStack poppy = new ItemStack(Items.POPPY); + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); + scene.idle(7); + scene.world.setFilterData(deployerSelection, DeployerTileEntity.class, poppy); + scene.idle(25); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(kinetics, -16); + scene.world.moveSection(pistonHead, util.vector.of(3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.getDefaultState(), false); + scene.idle(18); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index fb6aa603f..aa8d10831 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -173,6 +173,7 @@ public class MechanicalSawScenes { public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) @@ -265,6 +266,7 @@ public class MechanicalSawScenes { public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index 8c262ceca..20b35a35a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -1,19 +1,27 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FlappyPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.CropsBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -189,4 +197,313 @@ public class MovementActorScenes { scene.markAsFinished(); } + public static void harvester(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_harvester", "Using Mechanical Harvesters on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection crops = util.select.fromTo(4, 1, 2, 3, 1, 2) + .add(util.select.fromTo(3, 1, 1, 2, 1, 1) + .add(util.select.position(2, 1, 3)) + .add(util.select.position(1, 1, 2))); + + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos bearingPos = util.grid.at(4, 1, 4); + + scene.idle(5); + scene.world.showSection(crops, Direction.UP); + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 2, 4, 2, 2, 5) + .add(util.select.fromTo(2, 1, 5, 0, 1, 5)), Direction.DOWN); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.idle(10); + + for (int i = 0; i < 3; i++) { + scene.world.showSectionAndMerge(util.select.position(i, 1, 4), Direction.SOUTH, contraption); + scene.idle(5); + } + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 4), Direction.SOUTH)) + .text("Whenever Harvesters are moved as part of an animated Contraption..."); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + BlockState harvested = Blocks.WHEAT.getDefaultState(); + ItemStack wheatItem = new ItemStack(Items.WHEAT); + + scene.idle(5); + BlockPos current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.2, 0.3, 0), wheatItem); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(1, 0, 2)) + .text("They will harvest and reset any mature crops on their way") + .placeNearTarget(); + + scene.idle(101); + scene.world.hideSection(crops, Direction.DOWN); + scene.idle(15); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(crops, Direction.UP); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + scene.idle(10); + + scene.world.cycleBlockProperty(util.grid.at(1, 1, 5), LinearChassisBlock.STICKY_TOP); + scene.world.glueBlockOnto(util.grid.at(1, 2, 5), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 5), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + scene.idle(5); + current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + + scene.idle(116); + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + } + + public static void plough(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_plough", "Using Mechanical Ploughs on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection garbage = util.select.fromTo(2, 1, 3, 1, 1, 2); + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 2); + Selection dynamic = util.select.fromTo(4, 0, 6, 5, 1, 6); + + scene.showBasePlate(); + ElementLink cogs = + scene.world.showIndependentSection(util.select.fromTo(4, 0, 6, 5, 1, 6), Direction.UP); + scene.idle(5); + scene.world.showSection(kinetics.substract(dynamic), Direction.DOWN); + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 1, 3, 4, 1, 2), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); + scene.idle(20); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Whenever Ploughs are moved as part of an animated Contraption..."); + scene.idle(50); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + + Vec3d m = util.vector.of(-0.1, .2, 0); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 3), m, new ItemStack(Items.LEVER)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 2), m, new ItemStack(Items.TORCH)); + + scene.idle(30); + + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 3), m, new ItemStack(Items.RAIL)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 2), m, new ItemStack(Items.REDSTONE)); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.EAST)) + .text("...they will break blocks without a solid collision hitbox"); + scene.idle(50); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(garbage, Direction.UP); + scene.idle(40); + scene.world.setBlocks(garbage, Blocks.SNOW.getDefaultState(), false); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + ElementLink chest = + scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(15); + scene.effects.superGlue(util.grid.at(4, 2, 2), Direction.DOWN, true); + scene.idle(45); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.idle(30); + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.idle(15); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), + 40); + scene.idle(40); + scene.world.hideIndependentSection(chest, Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.idle(40); + + Selection dirt = util.select.fromTo(2, 0, 3, 1, 0, 2); + scene.world.hideSection(dirt, Direction.DOWN); + scene.idle(15); + scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.showSection(dirt, Direction.UP); + scene.overlay.showText(60) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Additionally, ploughs can create farmland"); + scene.idle(30); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(30); + scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + + scene.idle(50); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world.hideSection(kinetics.substract(dynamic), Direction.EAST); + scene.world.hideSection(dirt, Direction.DOWN); + scene.world.hideIndependentSection(pistonHead, Direction.EAST); + scene.world.moveSection(cogs, util.vector.of(-1, 0, 0), 15); + scene.idle(15); + scene.world.restoreBlocks(dirt); + scene.world.showSection(dirt, Direction.UP); + scene.world.showSection(util.select.fromTo(4, 1, 6, 4, 3, 4), Direction.NORTH); + scene.idle(15); + scene.world.showSectionAndMerge(util.select.fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); + scene.idle(15); + + BlockPos bearingPos = util.grid.at(4, 3, 4); + scene.addKeyframe(); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(util.select.position(5, 1, 6), -16); + scene.world.setKineticSpeed(util.select.position(4, 3, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 1, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 2, 5), 16); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world.rotateSection(contraption, 0, 0, 90, 20); + scene.world.rotateBearing(bearingPos, 90, 20); + + scene.idle(10); + ElementLink birb = scene.special.createBirb(util.vector.topOf(3, 0, 2) + .add(0, 0, 0.5), FlappyPose::new); + scene.idle(11); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.rotateSection(contraption, 0, 0, -135, 10); + scene.world.rotateBearing(bearingPos, -135, 10); + scene.idle(7); + scene.special.moveParrot(birb, util.vector.of(-20, 15, 0), 20); + scene.special.rotateParrot(birb, 0, 360, 0, 20); + scene.idle(3); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.idle(20); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.centerOf(util.grid.at(1, 3, 2))) + .text("...they can also launch entities without hurting them"); + scene.idle(30); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index d1c4b0a5d..e24c22914 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -148,6 +148,15 @@ public class PonderIndex { .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.DEPLOYER) + .addStoryBoard("deployer/filter", DeployerScenes::filter, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("deployer/modes", DeployerScenes::modes) + .addStoryBoard("deployer/redstone", DeployerScenes::redstone) + .addStoryBoard("deployer/contraption", DeployerScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_HARVESTER) + .addStoryBoard("harvester", MovementActorScenes::harvester); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_PLOUGH) + .addStoryBoard("plough", MovementActorScenes::plough); // Redstone PonderRegistry.forComponents(AllBlocks.PULSE_REPEATER) @@ -208,6 +217,7 @@ public class PonderIndex { .add(AllBlocks.MECHANICAL_CRAFTER) .add(AllBlocks.MECHANICAL_DRILL) .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) .add(AllBlocks.MECHANICAL_PUMP) .add(AllBlocks.MECHANICAL_ARM) .add(AllBlocks.MECHANICAL_PISTON) @@ -320,7 +330,6 @@ public class PonderIndex { .add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.SEATS[0]) .add(AllBlocks.REDSTONE_CONTACT) - .add(AllBlocks.SAIL) .add(Blocks.BELL) .add(Blocks.DISPENSER) .add(Blocks.DROPPER); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java index 2423c420e..cb985822c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -24,9 +24,9 @@ public class TextWindowElement extends AnimatedOverlayElement { // from 0 to 200 int y; - + Vec3d vec; - + boolean nearScene = false; int color = PonderPalette.WHITE.getColor(); @@ -52,7 +52,7 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.y = y; return this; } - + public Builder independent() { return independent(0); } @@ -71,12 +71,13 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.nearScene = true; return this; } - + public Builder attachKeyFrame() { - scene.builder().addLazyKeyframe(); + scene.builder() + .addLazyKeyframe(); return this; } - + } @Override @@ -86,7 +87,7 @@ public class TextWindowElement extends AnimatedOverlayElement { if (fade < 1 / 16f) return; Vec2f sceneToScreen = vec != null ? scene.getTransform() - .sceneToScreen(vec) : new Vec2f(0, (screen.height - 200) / 2 + y - 8); + .sceneToScreen(vec) : new Vec2f(screen.width / 2, (screen.height - 200) / 2 + y - 8); float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); @@ -122,7 +123,7 @@ public class TextWindowElement extends AnimatedOverlayElement { } FontHelper.drawSplitString(screen.getFontRenderer(), bakedText, targetX - 10, 3, textWidth, - ColorHelper.applyAlpha(brighterColor, fade)); + ColorHelper.applyAlpha(brighterColor, fade)); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java index fd788e53d..273d520b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.IBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; @@ -36,6 +37,14 @@ public class AnimateTileEntityInstruction extends TickingInstruction { .orElse(0f)); } + public static AnimateTileEntityInstruction deployer(BlockPos location, float totalDelta, int ticks) { + return new AnimateTileEntityInstruction(location, totalDelta, ticks, + (w, f) -> castIfPresent(w, location, DeployerTileEntity.class) + .ifPresent(deployer -> deployer.setAnimatedOffset(f)), + (w) -> castIfPresent(w, location, DeployerTileEntity.class).map(deployer -> deployer.getHandOffset(1)) + .orElse(0f)); + } + protected AnimateTileEntityInstruction(BlockPos location, float totalDelta, int ticks, BiConsumer setter, Function getter) { super(false, ticks); @@ -57,7 +66,11 @@ public class AnimateTileEntityInstruction extends TickingInstruction { public void tick(PonderScene scene) { super.tick(scene); PonderWorld world = scene.getWorld(); - setter.accept(world, (float) (remainingTicks == 0 ? target : getter.apply(world) + deltaPerTick)); + float current = getter.apply(world); + float next = (float) (remainingTicks == 0 ? target : current + deltaPerTick); + setter.accept(world, next); + if (remainingTicks == 0) // lock interpolation + setter.accept(world, next); } private static Optional castIfPresent(PonderWorld world, BlockPos pos, Class teType) { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_holding.json b/src/main/resources/assets/create/models/block/deployer/hand_holding.json index 9a585fb63..0548e608e 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_holding.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_holding.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,15 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 16], + "to": [10, 10, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 5, 4], "rotation": 180, "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 5, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 5, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [3, 0, 5, 4], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json index 09d55a11b..b0b91369a 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -51,15 +50,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 18], + "to": [10, 9.95, 18], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "west": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "up": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "down": {"uv": [4, 8, 8, 12], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_punching.json b/src/main/resources/assets/create/models/block/deployer/hand_punching.json index e60304921..2cde3a6ae 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_punching.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_punching.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,14 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 17], + "to": [10.05, 9.95, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [4, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 3, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 6, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 6, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [4, 8, 7, 12], "rotation": 270, "texture": "#mechanical_press_head"} } }, { @@ -88,28 +88,28 @@ } }, { - "from": [9, 8, 16], + "from": [9, 8, 15], "to": [11, 10, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { "north": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, - "east": {"uv": [0, 3, 2, 4], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 8, 2, 10], "rotation": 180, "texture": "#18"}, "west": {"uv": [0, 0, 1, 2], "rotation": 180, "texture": "#18"}, - "up": {"uv": [0, 0, 1, 2], "rotation": 90, "texture": "#18"}, + "up": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#18"}, "down": {"uv": [0, 0, 1, 2], "rotation": 270, "texture": "#18"} } }, { "from": [5, 7, 15], - "to": [9, 10, 17], + "to": [10, 11, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { - "north": {"uv": [0, 3, 4, 6], "texture": "#18"}, - "east": {"uv": [1, 2, 3, 5], "texture": "#18"}, + "north": {"uv": [6, 1, 10, 6], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 6, 3, 8], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#18"}, - "west": {"uv": [0, 2, 2, 5], "texture": "#18"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#18"}, + "west": {"uv": [0, 2, 2, 6], "texture": "#18"}, + "up": {"uv": [0, 0, 2, 5], "rotation": 90, "texture": "#18"}, "down": {"uv": [1, 4, 3, 8], "rotation": 270, "texture": "#18"} } } diff --git a/src/main/resources/ponder/deployer/contraption.nbt b/src/main/resources/ponder/deployer/contraption.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e92a1a98b3b4bc8a2dedd033de2a3b0ac6ce5473 GIT binary patch literal 870 zcmV-s1DX6EiwFP!000000JWCiPunmM$K57w(*gr&W8z_Z;Sbp*vrv%$XC}PU+XxY1IKsZPzTO3r4IS>*7)i=a6AW&@4%rB zoO1XM`SKm|wT|OCaC`?2b>NhPI^>HwMV*O6WxfFd}oioiqGt z<`1s25i0YNyyPk9g+=c>7Z!9tx_m^oQZ6CVY-|r1*BwHS)I{122@pB=(!cq7a(Qz0 zBOv}yH3H&YT^xI4bHVtU=IR`~plwGQ(CBaknNTx8UjJN8LFY?*8gi$0{Je&6hGgrM z8GHN?L1wv<0T~>rG*c2U3G(^RzST?`f%f}{`wQm>@q`~RV<5d1vjZp%52QNh#wvNP z1epE5EgQ9c{9r*EG<r+a%92M)7+hC6_TSapNM=N{DMFCQt>wR|K9ylrYI7Cc{u;QA&FGA!K=!ISm?qpp7%7QKK%-Le zu2LAOrs4cu5;tmiu2lv)f6c^JmruM5R%U7&1R``?HqsSJKs4ziH}eRVL@-fK?v!eo6oHd z@*t5^QV>Xw4r*P-EVvTBTD6U^g(MR46J;B##>T4H*akR`0S-36DTcKJ z$EvZZ;@Ac_jsXrfz$u1pptEhD^DZ3600$f3Y*JyMvtyw1E*!@I2OHoN0~_d!4Rqdx z;~3!JS{xra$)$8qZ_G&|BH#nY;*e#@-NV)g8cX0FvT2B(%xMAvCy_iNlv~Ihutg#* zg??~n)}QMQeKJ1~a8QnpqD7KGT*Fz%U#?X<=i?%GlmdkB);7JN`YYBO7ip+0Ef3+( zECl3Sj81C2E8Ziv;DKsL*4Nc)^;^x~)c%p0zpMF;zSCnm2d)+~!zew)X-(5VKN+9* z2jkP>M<2C^AT!3VT;vT%N&+fxJ}q@{c%&Mlf^WH~+YdtsN0NgO$4i|F`!rmw{wxvh z9lDC^`pICc+tXaP5Ym|4fFjX8V;OJ=>k@BOE|2rTNwq6{uwhb7#JpF!7dbmY=V=U+ zD;1oi!F>hswn^9W1$Q5R9LG&@;2m-NTt0Xlzw$T^^EmoVjoU57(RzIOsK(Klk8&LC znpmri(W`lJRPTMK0jF%^H`tWxysK>5DTzT!(BEkXs@o399MG$6tH@?l!X#jcl0_XV zES_&IM8dMk`eRQy_0KpH~vzO?d{Ijg<>ZkBsGc2M^{k>m?-L795x Pdq2=$qa)G&qYVH6Vq1LH literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/deployer/modes.nbt b/src/main/resources/ponder/deployer/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..da15f4de6e2b074565da28cf843c4ab47efcea8b GIT binary patch literal 508 zcmVoIL2WC93H?K77yqJ59q})4h!J$gPaAh z=FugP+_i`$YdbFDt4{b?GKXUi7M$HKI|2?(Otf|X6V$5TccYv{sy9H^Pip}SqWwL*2}%M zGQ!%!-gG4j*;K$gv@U}S@kiQRDBV=~N*e2?)ajH?d1oDcHA+_%m9zJf)l(sQ*-_4i yQm*NEZ$k{-P{LHca8pAK0N5T<_o+8p z5MgSB5vako7BnsrIk?nq8a!!1kV(CoRI~s>ZMebZjIze7(RdY&@4yKhILv{wYTg!( zSEH$Nd^tOn8z*q!Fb7Ui3Wq!g4td_j2^=`gf#WTES>tbri#gPS zIn-hsCvf1fT232+^umM?_A`V{oXuvx==q7>AJFqNJzv;;b|xmMmg)r{0$;>%Zz570C_Xd?TqqC1 zBa8JQBA@1NHa~Pu&Q7{-+R*Hx$)&msAv)q29|&{x_QpoXdUQe&It*c_6UP|$j6$ss zZ*189Nj#hV{tj$!KO{%zUyiIJ3;Xv63dzhtj9DVDkUVIf${ZEOb*raZ^}sQMF3#WT z>cge0T1>J8`ZI_RQ!Tvy|6b?;VDITm9I+b~U ze!Ek8+owuqsO-g0(p1tE?`cF<7P|(*Ax|_$&=#pSYC55R2@qXyjWG@C=oV2=Zw#p} z=?GYk+C;F&zY5*wiA+cRp-|c^Z57b!Uasd2cl@>Ckh58Nt0LbLt IooxyL08qfW#dVH{7fctKHkmP2JX7 z$Bt~5QXY)w!)fBSxM>*Fj#TyFe?HH6rsEU{O%QeRmmmnC<~54%6O;?>rI*5?#wKVq zQ>J`&Mfmbzf=F##blMw1%z5rb=W(pbdNf(0!2k{ca43Mo0Gw#qfF|qFqcbQxth)dw~fo`>8CM~ zE~XQB-ojsY@PKwsx*j4H8Pddh9c#utoPTNJq{M)DhBOqQiCv2UF%M}d zKoifI0M3vkoN>*S@Lm*c;psiE1bTbu_{~asF)fV_-4L9j;`Kq{wAoB|Pl%zRif`7` z!Zr_&IT|f^*-SB}jrFU&@B7nvcbLLw5O`hh{Rie{;{C#TSw3&4GvmFf5Lm+e&dgPyGmA{^fFeT+5JAa}9mro<9leq|u@3ztJBk K?xy7q3;+OzpEAJ! literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/plough.nbt b/src/main/resources/ponder/plough.nbt new file mode 100644 index 0000000000000000000000000000000000000000..24f190e64f683f0466aa069d80f44153d54fbf18 GIT binary patch literal 974 zcmV;<12Oy`iwFP!000000KHe+j@vd6r7pB(Z}t+PX;Ywm*$-IsIR%0iZ5|2)=^{bX zM}d~dGO-jXkaWD8qQ8~z>&OzdiY$4#+iVEv!RE|4oH?TzYEHa*3|khE88yTaX4FUW3f-x;kP&rf)Y=a+#C8U`ZY9^Cs8=FkHzqCem`phQ5C@ z98Bm-$>h(~%7Fc4xB&aruCQBSs-?zG?%GR;;N(+kFqlwlW*ei6B%JLDQl zYK{M_!8g1p1*BIPfaTdp8oD%-|9$Xq6Z`P6e);^Y=VLQ{A6Gt_ic^`26Er#WQ42RU`|K4x;AGcTv3l}S~3CFLiKI*G$HXD zRseZ^J5jc4ZXwN-M4`~hS$uPAVWiroyAP~(_uEEQCYNA#{>)SjWKQOnT9u%yZ?l9P z8`S#hCS53NRYB;A2?L11uCdPsAF*H?1FOnrx214}Bk&wdr>;Bq7$z&0RmAZY=VIa_ zpA_l?{+p1qiYaA6$vjdEc$y(^*? z|Hm;+(>1W={drp89~$5W4cy%^E%B1s$Bh9mvLu#xcdhDDZBQ5Yt5&J`RdcwlQf)z# z;HQ@KyW8r~*kO?v(k<76NJ)eVi;t}uxlYtkR- Date: Tue, 16 Mar 2021 15:52:37 -0700 Subject: [PATCH 3/5] Better contraption actor instancing. - Promoted actor instance creation to the ActorInstance class. - Drills and Harvesters' rotational speed is based on their movement speed with Flywheel on. - Deployers now use Flywheel. --- .../com/simibubi/create/AllTileEntities.java | 3 +- .../actors/ActorVertexAttributes.java | 1 + .../actors/ContraptionActorData.java | 8 ++ .../components/actors/DrillActorInstance.java | 53 +++++++ .../components/actors/DrillInstance.java | 17 --- .../actors/DrillMovementBehaviour.java | 9 +- .../components/actors/DrillRenderer.java | 2 +- .../actors/HarvesterActorInstance.java | 49 +++++++ .../actors/HarvesterMovementBehaviour.java | 9 +- .../components/actors/HarvesterRenderer.java | 21 --- .../deployer/DeployerActorInstance.java | 98 +++++++++++++ .../components/deployer/DeployerInstance.java | 132 ++++++++++++++++++ .../deployer/DeployerMovementBehaviour.java | 18 ++- .../components/deployer/DeployerRenderer.java | 13 +- .../structureMovement/MovementBehaviour.java | 10 +- .../render/ActorInstance.java | 29 ++++ .../render/ContraptionKineticRenderer.java | 55 +++++++- .../render/RenderedContraption.java | 19 +-- .../foundation/utility/MatrixStacker.java | 14 ++ .../create/foundation/utility/VecHelper.java | 3 +- .../create/shader/contraption_actor.vert | 6 +- 21 files changed, 498 insertions(+), 71 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 256d46aa9..88b073b28 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.crank.HandCrankRender import com.simibubi.create.content.contraptions.components.crank.HandCrankTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelTileEntity; +import com.simibubi.create.content.contraptions.components.deployer.DeployerInstance; import com.simibubi.create.content.contraptions.components.deployer.DeployerRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.fan.EncasedFanRenderer; @@ -476,7 +477,7 @@ public class AllTileEntities { public static final TileEntityEntry DEPLOYER = Create.registrate() .tileEntity("deployer", DeployerTileEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> DeployerInstance::new) .validBlocks(AllBlocks.DEPLOYER) .renderer(() -> DeployerRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java index f707b0532..a118962b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java @@ -12,6 +12,7 @@ public enum ActorVertexAttributes implements IVertexAttrib { AXIS("aAxis", CommonAttributes.NORMAL), INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), ROTATION_CENTER("aRotationCenter", CommonAttributes.NORMAL), + SPEED("aSpeed", CommonAttributes.FLOAT), ; private final String name; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index 56853e9d1..6e41d205c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -30,6 +30,8 @@ public class ContraptionActorData extends InstanceData { private byte rotationCenterY = 64; private byte rotationCenterZ = 64; + private float speed; + protected ContraptionActorData(InstancedModel owner) { super(owner); } @@ -57,6 +59,11 @@ public class ContraptionActorData extends InstanceData { return this; } + public ContraptionActorData setSpeed(float speed) { + this.speed = speed; + return this; + } + public ContraptionActorData setRotationAxis(Vector3f axis) { setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); return this; @@ -101,6 +108,7 @@ public class ContraptionActorData extends InstanceData { putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); putVec3(buf, localRotationX, localRotationY, localRotationZ); putVec3(buf, rotationCenterX, rotationCenterY, rotationCenterZ); + put(buf, speed); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java new file mode 100644 index 000000000..958670ede --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; + +public class DrillActorInstance extends ActorInstance { + + InstanceKey drillHead; + private Direction facing; + + public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> renderMaterial = modelManager.getActorMaterial(); + + BlockState state = context.state; + + facing = state.get(DrillBlock.FACING); + float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerY = facing.getHorizontalAngle(); + + drillHead = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state).createInstance(); + + drillHead.getInstance() + .setPosition(context.localPos) + .setBlockLight(localBlockLight()) + .setRotationOffset(0) + .setRotationAxis(0, 0, 1) + .setLocalRotation(eulerX, eulerY, 0) + .setSpeed(getSpeed(facing)); + } + + @Override + protected void tick() { + drillHead.getInstance().setSpeed(getSpeed(facing)); + } + + @Override + protected float getSpeed(Direction facing) { + if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite())) + return context.getAnimationSpeed(); + return 0; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 72b85d279..cb9a66d2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -22,23 +22,6 @@ public class DrillInstance extends SingleRotatingInstance { super(modelManager, tile); } - public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); - - Direction facing = state.get(DrillBlock.FACING); - float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); - float eulerY = facing.getHorizontalAngle(); - model.getInstance(model.createInstance()) - .setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationAxis(0, 0, 1) - .setLocalRotation(eulerX, eulerY, 0); - } - @Override protected InstancedModel getModel() { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 965d6c3c0..fd9a3959a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; @@ -15,6 +17,8 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import javax.annotation.Nullable; + public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override @@ -42,9 +46,10 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { return true; } + @Nullable @Override - public void addInstance(RenderedContraption contraption, MovementContext context) { - DrillInstance.addInstanceForContraption(contraption, context); + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new DrillActorInstance(kr, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index ad434c4eb..825ba510e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -42,7 +42,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { Direction facing = state.get(DrillBlock.FACING); float speed = (float) (context.contraption.stalled - || !VecHelper.isVecPointingTowards(context.relativeMotion, state.get(FACING) + || !VecHelper.isVecPointingTowards(context.relativeMotion, facing .getOpposite()) ? context.getAnimationSpeed() : 0); float time = AnimationTickHolder.getRenderTime() / 20; float angle = (float) (((time * speed) % 360)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java new file mode 100644 index 000000000..f0431d63a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; + +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; + +public class HarvesterActorInstance extends ActorInstance { + + InstanceKey harvester; + private Direction facing; + + public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> renderMaterial = modelManager.getActorMaterial(); + + BlockState state = context.state; + + facing = state.get(HORIZONTAL_FACING); + float originOffset = 1 / 16f; + Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); + + harvester = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance(); + + harvester.getInstance() + .setPosition(context.localPos) + .setBlockLight(localBlockLight()) + .setRotationOffset(0) + .setRotationCenter(rotOffset) + .setRotationAxis(-1, 0, 0) + .setLocalRotation(0, facing.getHorizontalAngle(), 0) + .setSpeed(getSpeed(facing)); + } + + @Override + protected void tick() { + harvester.getInstance().setSpeed(getSpeed(facing)); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index ea53b2b2c..2878d19da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; @@ -29,6 +31,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; +import javax.annotation.Nullable; + public class HarvesterMovementBehaviour extends MovementBehaviour { @Override @@ -42,9 +46,10 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { return true; } + @Nullable @Override - public void addInstance(RenderedContraption contraption, MovementContext context) { - HarvesterRenderer.addInstanceForContraption(contraption, context); + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new HarvesterActorInstance(kr, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index cd130936c..b22a1ba12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -43,24 +43,6 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); - - Direction facing = state.get(HORIZONTAL_FACING); - float originOffset = 1 / 16f; - Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); - model.getInstance(model.createInstance()) - .setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationCenter(rotOffset) - .setRotationAxis(-1, 0, 0) - .setLocalRotation(0, facing.getHorizontalAngle(), 0); - } - public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { BlockState blockState = context.state; @@ -90,7 +72,4 @@ public class HarvesterRenderer extends SafeTileEntityRenderer pole; + InstanceKey hand; + InstanceKey shaft; + + public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> mat = modelManager.basicMaterial(); + + BlockState state = context.state; + DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); + AllBlockPartials handPose = DeployerRenderer.getHandPose(mode); + + stationaryTimer = context.data.contains("StationaryTimer"); + facing = state.get(FACING); + + boolean rotatePole = state.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + yRot = AngleHelper.horizontalAngle(facing); + zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + zRotPole = rotatePole ? 90 : 0; + + pole = mat.getModel(AllBlockPartials.DEPLOYER_POLE, state).createInstance(); + hand = mat.getModel(handPose, state).createInstance(); + + Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); + shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING) + .getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileInstance.shaft(axis)) + .createInstance(); + + int blockLight = localBlockLight(); + + shaft.getInstance() + .setBlockLight(blockLight) + .setRotationAxis(axis) + .setPosition(context.localPos); + + pole.getInstance().setBlockLight(blockLight); + hand.getInstance().setBlockLight(blockLight); + } + + @Override + protected void tick() { + double factor; + if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { + factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; + } else { + Vec3d center = VecHelper.getCenterOf(new BlockPos(context.position)); + double distance = context.position.distanceTo(center); + double nextDistance = context.position.add(context.motion) + .distanceTo(center); + factor = .5f - MathHelper.clamp(MathHelper.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); + } + + Vec3d offset = new Vec3d(facing.getDirectionVec()).scale(factor); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(context.localPos) + .translate(offset); + + DeployerInstance.transformModel(msr, pole, hand, yRot, zRot, zRotPole); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java new file mode 100644 index 000000000..8ac245d1c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -0,0 +1,132 @@ +package com.simibubi.create.content.contraptions.components.deployer; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + +public class DeployerInstance extends ShaftInstance implements ITickableInstance { + + DeployerTileEntity tile; + + Direction facing; + + InstanceKey pole; + + AllBlockPartials currentHand; + InstanceKey hand; + + float yRot; + float zRot; + float zRotPole; + + public DeployerInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + this.tile = (DeployerTileEntity) super.tile; + facing = lastState.get(FACING); + + boolean rotatePole = lastState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + + yRot = AngleHelper.horizontalAngle(facing); + zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + zRotPole = rotatePole ? 90 : 0; + + pole = modelManager.basicMaterial().getModel(AllBlockPartials.DEPLOYER_POLE, lastState).createInstance(); + + updateHandPose(); + relight(pos, pole.getInstance()); + } + + @Override + public void tick() { + + updateHandPose(); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()) + .translate(getHandOffset(AnimationTickHolder.getPartialTicks())); + + transformModel(msr, pole, hand, yRot, zRot, zRotPole); + + } + + @Override + public void updateLight() { + super.updateLight(); + relight(pos, hand.getInstance(), pole.getInstance()); + } + + @Override + public void remove() { + super.remove(); + hand.delete(); + pole.delete(); + currentHand = null; // updateHandPose() uses an invalid key after a block update otherwise. + hand = null; + } + + private boolean updateHandPose() { + AllBlockPartials handPose = tile.getHandPose(); + + if (currentHand == handPose) return false; + currentHand = handPose; + + if (hand != null) hand.delete(); + + hand = modelManager.basicMaterial().getModel(currentHand, lastState).createInstance(); + + relight(pos, hand.getInstance()); + + return true; + } + + protected Vec3d getHandOffset(float partialTicks) { + float progress = 0; + if (tile.state == DeployerTileEntity.State.EXPANDING) + progress = 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + if (tile.state == DeployerTileEntity.State.RETRACTING) + progress = (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + + float handLength = tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f); + Vec3d offset = new Vec3d(facing.getDirectionVec()).scale(distance); + return offset; + } + + static void transformModel(MatrixStacker msr, InstanceKey pole, InstanceKey hand, float yRot, float zRot, float zRotPole) { + + msr.centre(); + msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); + msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI)); + + msr.push(); + msr.rotate(Direction.SOUTH, (float) ((zRotPole) / 180 * Math.PI)); + msr.unCentre(); + pole.getInstance().setTransform(msr.unwrap()); + msr.pop(); + + msr.unCentre(); + + hand.getInstance().setTransform(msr.unwrap()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index aa8f4240e..83738f6dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.contraptions.components.deployer; import java.util.Arrays; import java.util.List; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.commons.lang3.tuple.Pair; import com.mojang.blaze3d.matrix.MatrixStack; @@ -24,6 +27,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.Constants.NBT; +import javax.annotation.Nullable; + public class DeployerMovementBehaviour extends MovementBehaviour { @Override @@ -167,7 +172,18 @@ public class DeployerMovementBehaviour extends MovementBehaviour { @Override public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { - DeployerRenderer.renderInContraption(context, ms, msLocal, buffers); + if (!FastRenderDispatcher.available()) + DeployerRenderer.renderInContraption(context, ms, msLocal, buffers); } + @Override + public boolean hasSpecialInstancedRendering() { + return true; + } + + @Nullable + @Override + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new DeployerActorInstance(kr, context); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 267763ce0..8088de8cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -50,11 +50,17 @@ public class DeployerRenderer extends SafeTileEntityRenderer int light, int overlay) { renderItem(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); + + if (FastRenderDispatcher.available(te.getWorld())) return; + renderComponents(te, partialTicks, ms, buffer, light, overlay); } protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (te.heldItem.isEmpty()) return; + BlockState deployerState = te.getBlockState(); Vec3d offset = getHandOffset(te, partialTicks, deployerState).add(VecHelper.getCenterOf(BlockPos.ZERO)); ms.push(); @@ -166,8 +172,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer BlockPos pos = BlockPos.ZERO; Mode mode = NBTHelper.readEnum(context.tileData, "Mode", Mode.class); World world = context.world; - AllBlockPartials handPose = - mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; + AllBlockPartials handPose = getHandPose(mode); SuperByteBuffer pole = AllBlockPartials.DEPLOYER_POLE.renderOn(blockState); SuperByteBuffer hand = handPose.renderOn(blockState); @@ -198,4 +203,8 @@ public class DeployerRenderer extends SafeTileEntityRenderer .renderInto(ms, builder); } + static AllBlockPartials getHandPose(DeployerTileEntity.Mode mode) { + return mode == DeployerTileEntity.Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index 062a1601a..17a7c0af2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -8,10 +10,13 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; +import javax.annotation.Nullable; + public abstract class MovementBehaviour { public boolean isActive(MovementContext context) { @@ -61,7 +66,10 @@ public abstract class MovementBehaviour { IRenderTypeBuffer buffer) {} @OnlyIn(Dist.CLIENT) - public void addInstance(RenderedContraption contraption, MovementContext context) {} + @Nullable + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return null; + } public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java new file mode 100644 index 000000000..97d7ecc34 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.render; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; + +public abstract class ActorInstance { + protected final ContraptionKineticRenderer modelManager; + protected final MovementContext context; + + public ActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + this.modelManager = modelManager; + this.context = context; + } + + protected void tick() { } + + protected float getSpeed(Direction facing) { + if (context.contraption.stalled) + return 0; + + return !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()) ? context.getAnimationSpeed() : 0; + } + + protected int localBlockLight() { + return modelManager.contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index 8413118f7..56d968c93 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -1,20 +1,41 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.RenderMaterials; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.impl.BasicInstancedModel; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.feature.template.Template; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class ContraptionKineticRenderer extends InstancedTileRenderer { + protected ArrayList actors = new ArrayList<>(); + + public final RenderedContraption contraption; + + ContraptionKineticRenderer(RenderedContraption contraption) { + this.contraption = contraption; + } + @Override public void registerMaterials() { materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, BasicInstancedModel::new)); @@ -25,6 +46,36 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer(this, AllProgramSpecs.C_ACTOR, RotatingActorModel::new)); } + + @Override + public void beginFrame(double cameraX, double cameraY, double cameraZ) { + super.beginFrame(cameraX, cameraY, cameraZ); + + actors.forEach(ActorInstance::tick); + } + + @Nullable + public ActorInstance createActor(Pair actor) { + Template.BlockInfo blockInfo = actor.getLeft(); + MovementContext context = actor.getRight(); + + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); + + if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) { + ActorInstance instance = movementBehaviour.createInstance(this, context); + + actors.add(instance); + + return instance; + } + + return null; + } + + public RenderMaterial> getActorMaterial() { + return getMaterial(KineticRenderMaterials.ACTORS); + } + @Override public BlockPos getOriginCoordinate() { return BlockPos.ZERO; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 23cdc0c55..9beb21f64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -64,7 +64,7 @@ public class RenderedContraption { public RenderedContraption(World world, Contraption contraption) { this.contraption = contraption; this.lighter = contraption.makeLighter(); - this.kinetics = new ContraptionKineticRenderer(); + this.kinetics = new ContraptionKineticRenderer(this); this.renderWorld = setupRenderWorld(world, contraption); buildLayers(); @@ -86,10 +86,6 @@ public class RenderedContraption { return lighter; } - public RenderMaterial> getActorMaterial() { - return kinetics.getMaterial(KineticRenderMaterials.ACTORS); - } - public void doRenderLayer(RenderType layer, ContraptionProgram shader) { ContraptionModel structure = renderLayers.get(layer); if (structure != null) { @@ -172,18 +168,7 @@ public class RenderedContraption { } private void buildActors() { - List> actors = contraption.getActors(); - - for (MutablePair actor : actors) { - Template.BlockInfo blockInfo = actor.left; - MovementContext context = actor.right; - - MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); - - if (movementBehaviour != null) { - movementBehaviour.addInstance(this, context); - } - } + contraption.getActors().forEach(kinetics::createActor); } private static ContraptionModel buildStructureModel(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 8ebc71b26..e9610c6fe 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -109,4 +109,18 @@ public class MatrixStacker { return this; } + public MatrixStacker push() { + ms.push(); + return this; + } + + public MatrixStacker pop() { + ms.pop(); + return this; + } + + public MatrixStack unwrap() { + return ms; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index 7610ea984..611bbe2d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -60,7 +60,8 @@ public class VecHelper { } public static boolean isVecPointingTowards(Vec3d vec, Direction direction) { - return new Vec3d(direction.getDirectionVec()).distanceTo(vec.normalize()) < .75; + return new Vec3d(direction.getDirectionVec()).dotProduct(vec.normalize()) > 0; + //return new Vec3d(direction.getDirectionVec()).distanceTo(vec.normalize()) < .75; } public static Vec3d getCenterOf(Vec3i pos) { diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index cc31d18ed..31cdd6799 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -12,6 +12,7 @@ attribute float aOffset; attribute vec3 aAxis; attribute vec3 aInstanceRot; attribute vec3 aRotationCenter; +attribute float aSpeed; varying float Diffuse; @@ -57,11 +58,10 @@ mat4 rotation(vec3 rot) { } mat4 kineticRotation() { - const float speed = -20.; - float degrees = aOffset + uTime * speed * -3./10.; + float degrees = aOffset + uTime * aSpeed / 20.; float angle = fract(degrees / 360.) * PI * 2.; - return rotate(normalize(aAxis), angle); + return rotate(normalize(aAxis), -angle); } void main() { From 1d3e057dda27673f8c40a00644d85fb319dac316 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 17 Mar 2021 01:23:16 +0100 Subject: [PATCH 4/5] Last kinetic relays and generators - Fixed transparency depth sorting inside ponder UI - Scenes for Seq. Gearshift, Furnace Engine/Flywheel and Rotation Speed Controllers --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 16 + .../assets/create/lang/unfinished/de_de.json | 18 +- .../assets/create/lang/unfinished/es_es.json | 18 +- .../assets/create/lang/unfinished/es_mx.json | 18 +- .../assets/create/lang/unfinished/fr_fr.json | 18 +- .../assets/create/lang/unfinished/it_it.json | 18 +- .../assets/create/lang/unfinished/ja_jp.json | 18 +- .../assets/create/lang/unfinished/ko_kr.json | 18 +- .../assets/create/lang/unfinished/nl_nl.json | 18 +- .../assets/create/lang/unfinished/pt_br.json | 18 +- .../assets/create/lang/unfinished/ru_ru.json | 18 +- .../assets/create/lang/unfinished/zh_cn.json | 18 +- .../assets/create/lang/unfinished/zh_tw.json | 18 +- .../data/create/advancements/aesthetics.json | 4 +- .../flywheel/FlywheelTileEntity.java | 3 +- .../advanced/SpeedControllerRenderer.java | 3 +- .../advanced/SpeedControllerTileEntity.java | 5 + .../SequencedGearshiftTileEntity.java | 2 + .../create/foundation/ponder/PonderUI.java | 7 + .../ponder/content/KineticsScenes.java | 314 +++++++++++++++++- .../ponder/content/PonderIndex.java | 8 + .../renderState/SuperRenderTypeBuffer.java | 20 +- src/main/resources/ponder/furnace_engine.nbt | Bin 0 -> 600 bytes .../resources/ponder/sequenced_gearshift.nbt | Bin 0 -> 1021 bytes .../resources/ponder/speed_controller.nbt | Bin 0 -> 674 bytes 26 files changed, 594 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/ponder/furnace_engine.nbt create mode 100644 src/main/resources/ponder/sequenced_gearshift.nbt create mode 100644 src/main/resources/ponder/speed_controller.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 24769c6d2..63087dd59 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -14e0e7784c59a76deddf3bfc32e334ce043396fe assets/create/lang/en_us.json -9d0c4eb5b8fcf787b1bbdd35dcb2efd37b7b9f9c assets/create/lang/unfinished/de_de.json -7e78635390f2802b325aec510ebef35345e2c9a4 assets/create/lang/unfinished/es_es.json -f87b6f876dbb50c37ebbd67d9f636f70c5e4e7f2 assets/create/lang/unfinished/es_mx.json -866086d9a9fe1f4c39208bf592b75145dd67bb47 assets/create/lang/unfinished/fr_fr.json -2f32a7fbbfaa1d78c6f9975c4aa121def52280b7 assets/create/lang/unfinished/it_it.json -2041ea4e1e516f7953be44b06092b144df0359b3 assets/create/lang/unfinished/ja_jp.json -e5057798e54fe5485a36f71b7298c6b2c73cd1b4 assets/create/lang/unfinished/ko_kr.json -e4bdb059ad70595c66c84ebfc3cac6a3929e97c4 assets/create/lang/unfinished/nl_nl.json -849db8c87d521cdf0ce8dc21652f8d95eea47194 assets/create/lang/unfinished/pt_br.json -cdafda2402e1c3259eba15fdd55a446117fece83 assets/create/lang/unfinished/ru_ru.json -8063b79a864f2a1a56c30aabe6df4bd616c938c2 assets/create/lang/unfinished/zh_cn.json -bd9961903c4e125cd3029dad62a4a7fd690149aa assets/create/lang/unfinished/zh_tw.json +73cd8748a2a6277ec1ec1e4c0af4fe9cffbda8ce assets/create/lang/en_us.json +9777ac3724ec7d626437b12b67b533f6894afd29 assets/create/lang/unfinished/de_de.json +91e44b23201b2165b64837d9a8d0f3d5313a8058 assets/create/lang/unfinished/es_es.json +c859cb5f44c409adcdfa3de65642eb1f6c8fd5bc assets/create/lang/unfinished/es_mx.json +512e8b757d5a6b511a946f3cb56ce90653885f04 assets/create/lang/unfinished/fr_fr.json +af6c1fdea2304970eacaf8413e85fab5c0731918 assets/create/lang/unfinished/it_it.json +96063374af85f0f269b64262c319b3bde9623d45 assets/create/lang/unfinished/ja_jp.json +b5f1962be245e0042255d23c18de532f84a3b0fa assets/create/lang/unfinished/ko_kr.json +14b0b2b88be1d3d9d064f26a36b28e6762522809 assets/create/lang/unfinished/nl_nl.json +a8f5e1dcb5db76b2daffb056841fd0b785af5597 assets/create/lang/unfinished/pt_br.json +d06fb4feed18286366ed958044ab82d1bf2d15b8 assets/create/lang/unfinished/ru_ru.json +3498b6288bce0184992a2a4051c9416d76ad1a13 assets/create/lang/unfinished/zh_cn.json +8c26a0392f613db72705d56f46e8fdaa7e117dc6 assets/create/lang/unfinished/zh_tw.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 @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 6cfdb91aa..9aa47e056 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2020,6 +2020,11 @@ "create.ponder.funnel_transfer.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "Gantry setups can move attached Blocks.", @@ -2192,6 +2197,17 @@ "create.ponder.rope_pulley_modes.text_1": "Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "Shafts will relay rotation in a straight line.", 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 892ea386e..bf4699ed0 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: 1337", + "_": "Missing Localizations: 1350", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index bf6a5fb5d..e4d4a4f6c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 368", + "_": "Missing Localizations: 381", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 53e129369..7a61f13be 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1267", + "_": "Missing Localizations: 1280", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 2218aae58..19f3255d0 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: 1049", + "_": "Missing Localizations: 1062", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 369acaf8d..a4706944c 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: 385", + "_": "Missing Localizations: 398", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 5db9138b5..4549c93b4 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: 392", + "_": "Missing Localizations: 405", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 9471b7f33..a1d30849c 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: 438", + "_": "Missing Localizations: 451", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 a4da4b57e..905e5b4c4 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: 1536", + "_": "Missing Localizations: 1549", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 40031e472..0f0960a19 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: 1602", + "_": "Missing Localizations: 1615", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 e30cc25d8..571fe933e 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: 388", + "_": "Missing Localizations: 401", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", 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 fcfec2f15..9d5f52646 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: 386", + "_": "Missing Localizations: 399", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 1b8b2c0d9..b67952a4c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 391", + "_": "Missing Localizations: 404", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index d723cbe38..59a86f429 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:cogwheel", - "create:large_cogwheel" + "create:large_cogwheel", + "create:cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 2dab48a50..07dedf3b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -76,7 +76,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { super.tick(); if (world.isRemote) { - visualSpeed.target(getGeneratedSpeed()); + float targetSpeed = isVirtual() ? speed : getGeneratedSpeed(); + visualSpeed.target(targetSpeed); visualSpeed.tick(); angle += visualSpeed.value * 3 / 10f; angle %= 360; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index f4e324071..786a4b8b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -41,11 +41,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer 1 / 512f) @@ -897,4 +898,10 @@ public class PonderUI extends NavigatableSimiScreen { skipCooling = 15; } + @Override + public void removed() { + super.removed(); + SuperRenderTypeBuffer.vertexSortingOrigin = BlockPos.ZERO; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 03ab44c64..e2d9fcab8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -1,23 +1,32 @@ package com.simibubi.create.foundation.ponder.content; +import java.io.File; + import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.utility.Pointing; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FurnaceBlock; +import net.minecraft.block.RedstoneWireBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; @@ -280,7 +289,7 @@ public class KineticsScenes { scene.title("gearbox", "Relaying rotational force using Gearboxes"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - + scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP); scene.idle(10); @@ -689,4 +698,307 @@ public class KineticsScenes { scene.idle(90); } + public static void sequencedGearshift(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("sequenced_gearshift", "Controlling Rotational Speed using Sequenced Gearshifts"); + scene.configureBasePlate(1, 0, 5); + scene.showBasePlate(); + + Selection redstone = util.select.fromTo(3, 1, 0, 3, 1, 1); + + scene.world.showSection(util.select.position(6, 0, 3) + .add(redstone), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(6, 1, 2, 4, 1, 2), Direction.DOWN); + + BlockPos gearshiftPos = util.grid.at(3, 1, 2); + Selection gearshiftSelection = util.select.position(gearshiftPos); + BlockPos bearingPos = util.grid.at(1, 1, 2); + BlockPos buttonPos = util.grid.at(3, 1, 0); + Selection outputKinetics = util.select.fromTo(3, 1, 2, 1, 1, 2); + + scene.world.setKineticSpeed(gearshiftSelection, 0); + scene.idle(10); + + scene.world.showSection(gearshiftSelection, Direction.DOWN); + scene.idle(10); + + scene.world.showSection(util.select.fromTo(2, 1, 2, 1, 1, 2), Direction.EAST); + scene.idle(10); + + Vec3d top = util.vector.topOf(gearshiftPos); + scene.overlay.showText(60) + .text("Seq. Gearshifts relay rotation by following a timed list of instructions") + .attachKeyFrame() + .pointAt(top) + .placeNearTarget(); + scene.idle(80); + + scene.overlay.showControls(new InputWindowElement(top, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.overlay.showSelectionWithText(gearshiftSelection, 50) + .colored(PonderPalette.BLUE) + .text("Right-click it to open the Configuration UI") + .pointAt(top) + .placeNearTarget(); + scene.idle(60); + + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(0, 3, 2, 0, 0, 2), Direction.EAST); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(buttonPos); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.idle(20); + + scene.overlay.showText(80) + .text("Upon receiving a Redstone Signal, it will start running its configured sequence") + .attachKeyFrame() + .pointAt(top); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, -32); + scene.world.rotateBearing(bearingPos, -180, 40); + scene.world.rotateSection(contraption, -180, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + scene.idle(20); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + + scene.idle(20); + scene.overlay.showText(70) + .text("Once finished, it waits for the next Redstone Signal and starts over") + .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + scene.idle(80); + + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(buttonPos); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(20); + + scene.overlay.showText(60) + .text("A redstone comparator can be used to read the current progress") + .attachKeyFrame() + .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + + scene.world.hideSection(redstone, Direction.NORTH); + scene.idle(15); + + BlockPos wire = util.grid.at(5, 1, 0); + Selection nixie = util.select.position(4, 1, 0); + ElementLink comparator = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH); + scene.world.moveSection(comparator, util.vector.of(-2, 0, 0), 0); + scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 1)); + + scene.idle(5); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, -32); + scene.world.rotateBearing(bearingPos, -180, 40); + scene.world.rotateSection(contraption, -180, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 2)); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 3)); + scene.idle(20); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 4)); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.modifyBlock(wire, s -> s.with(RedstoneWireBlock.POWER, 0), false); + scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world.setKineticSpeed(outputKinetics, 0); + } + + public static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("furnace_engine", "Generating Rotational Force using the Furnace Engine"); + scene.configureBasePlate(0, 0, 6); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos furnacePos = util.grid.at(4, 1, 3); + BlockPos cogPos = util.grid.at(1, 1, 2); + BlockPos gaugePos = util.grid.at(1, 1, 1); + + scene.idle(5); + Selection furnaceSelect = util.select.position(furnacePos); + scene.world.showSection(furnaceSelect, Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(furnacePos.west()), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(furnacePos.west(3)), Direction.EAST); + scene.idle(10); + + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(furnacePos.west())) + .text("Furnace Engines generate Rotational Force while their attached Furnace is running"); + scene.idle(90); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(furnacePos), Pointing.DOWN).withItem(new ItemStack(Items.OAK_LOG)), + 30); + scene.idle(5); + scene.overlay + .showControls(new InputWindowElement(util.vector.blockSurface(furnacePos, Direction.NORTH), Pointing.RIGHT) + .withItem(new ItemStack(Items.COAL)), 30); + scene.idle(7); + scene.world.cycleBlockProperty(furnacePos, FurnaceBlock.LIT); + scene.effects.emitParticles(util.vector.of(4.5, 1.2, 2.9), Emitter.simple(ParticleTypes.LAVA, Vec3d.ZERO), 4, + 1); + scene.world.setKineticSpeed(util.select.fromTo(1, 1, 3, 1, 1, 1), 16); + scene.idle(40); + + scene.world.showSection(util.select.position(cogPos), Direction.SOUTH); + scene.idle(15); + scene.effects.rotationSpeedIndicator(cogPos); + scene.world.showSection(util.select.position(gaugePos), Direction.SOUTH); + scene.idle(15); + + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(gaugePos, Direction.WEST)) + .text("The provided Rotational Force has a very large stress capacity"); + scene.idle(90); + + ElementLink engine = + scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 3, 1, 1, 1)); + scene.world.moveSection(engine, util.vector.of(0, 1, 0), 15); + scene.idle(10); + scene.world.hideSection(furnaceSelect, Direction.NORTH); + scene.idle(15); + scene.world.setBlock(furnacePos, Blocks.BLAST_FURNACE.getDefaultState() + .with(FurnaceBlock.FACING, Direction.NORTH) + .with(FurnaceBlock.LIT, true), false); + scene.world.showSection(furnaceSelect, Direction.NORTH); + scene.idle(10); + scene.world.moveSection(engine, util.vector.of(0, -1, 0), 15); + scene.idle(10); + scene.world.setKineticSpeed(util.select.fromTo(1, 1, 3, 1, 1, 1), 32); + scene.idle(5); + scene.effects.rotationSpeedIndicator(cogPos); + + scene.overlay.showText(80) + .placeNearTarget() + .colored(PonderPalette.MEDIUM) + .pointAt(util.vector.topOf(furnacePos.west())) + .text("Using a Blast Furnace will double the efficiency of the Engine"); + + } + + public static void speedController(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("rotation_speed_controller", "Using the Rotational Speed Controller"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos cogPos = util.grid.at(1, 2, 1); + Selection gaugeSelect = util.select.position(1, 2, 3); + + scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.5f); + scene.world.setKineticSpeed(gaugeSelect, 0); + scene.world.showSection(util.select.fromTo(5, 1, 1, 2, 1, 1), Direction.DOWN); + scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 2, 3), Direction.DOWN); + scene.idle(10); + ElementLink rsc = + scene.world.showIndependentSection(util.select.position(0, 1, 1), Direction.DOWN); + scene.world.moveSection(rsc, util.vector.of(1, 0, 0), 0); + ElementLink rsc2 = + scene.world.showIndependentSection(util.select.position(1, 1, 1), Direction.DOWN); + scene.world.moveSection(rsc2, util.vector.of(0, -100, 0), 0); + scene.idle(10); + scene.world.showSection(util.select.position(1, 2, 1), Direction.DOWN); + scene.idle(15); + scene.effects.indicateSuccess(cogPos); + scene.world.moveSection(rsc2, util.vector.of(0, 100, 0), 0); + scene.world.moveSection(rsc, util.vector.of(0, -100, 0), 0); + scene.idle(5); + scene.world.showSection(util.select.position(1, 2, 2), Direction.DOWN); + scene.idle(10); + scene.world.setKineticSpeed(gaugeSelect, 8); + scene.effects.indicateSuccess(util.grid.at(1, 2, 3)); + + scene.overlay.showText(90) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(cogPos, Direction.NORTH)) + .text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them"); + scene.idle(100); + + Vec3d inputVec = util.vector.of(1.5, 1.75, 1); + scene.overlay.showFilterSlotInput(inputVec, 60); + + scene.overlay.showText(70) + .placeNearTarget() + .attachKeyFrame() + .pointAt(inputVec) + .text("Using the scroll input on its side, the conveyed speed can be configured"); + scene.idle(80); + + InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).scroll(); + scene.overlay.showControls(input, 40); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(55); + scene.markAsFinished(); + + scene.overlay.showControls(input, 30); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(55); + + scene.overlay.showControls(input, 30); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), -.05f); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(35); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index e24c22914..d73c72246 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -45,6 +45,9 @@ public class PonderIndex { PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, PonderTag.KINETIC_RELAYS); + PonderRegistry.forComponents(AllBlocks.SEQUENCED_GEARSHIFT) + .addStoryBoard("sequenced_gearshift", KineticsScenes::sequencedGearshift); + PonderRegistry.forComponents(AllBlocks.ENCASED_FAN) .addStoryBoard("fan/direction", FanScenes::direction, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("fan/processing", FanScenes::processing) @@ -67,6 +70,11 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); + PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE, AllBlocks.FLYWHEEL) + .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); + PonderRegistry.forComponents(AllBlocks.ROTATION_SPEED_CONTROLLER) + .addStoryBoard("speed_controller", KineticsScenes::speedController); + // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) diff --git a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java index 6c2eb5e87..66cefb99d 100644 --- a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.renderState; +import java.util.Objects; +import java.util.Optional; import java.util.SortedMap; import com.mojang.blaze3d.systems.RenderSystem; @@ -13,9 +15,11 @@ import net.minecraft.client.renderer.RegionRenderCacheBuilder; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; public class SuperRenderTypeBuffer implements IRenderTypeBuffer { + public static BlockPos vertexSortingOrigin = BlockPos.ZERO; static SuperRenderTypeBuffer instance; public static SuperRenderTypeBuffer getInstance() { @@ -65,6 +69,7 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { // Visible clones from net.minecraft.client.renderer.RenderTypeBuffers static final RegionRenderCacheBuilder blockBuilders = new RegionRenderCacheBuilder(); + static final SortedMap createEntityBuilders() { return Util.make(new Object2ObjectLinkedOpenHashMap<>(), (map) -> { map.put(Atlases.getEntitySolid(), blockBuilders.get(RenderType.getSolid())); @@ -86,7 +91,6 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { }); }); } - private static void assign(Object2ObjectLinkedOpenHashMap map, RenderType type) { map.put(type, new BufferBuilder(type.getExpectedBufferSize())); @@ -96,6 +100,20 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { super(new BufferBuilder(256), createEntityBuilders()); } + public void draw(RenderType p_228462_1_) { + BlockPos v = vertexSortingOrigin; + BufferBuilder bufferbuilder = layerBuffers.getOrDefault(p_228462_1_, this.fallbackBuffer); + boolean flag = Objects.equals(this.currentLayer, p_228462_1_.asOptional()); + if (flag || bufferbuilder != this.fallbackBuffer) { + if (this.activeConsumers.remove(bufferbuilder)) { + p_228462_1_.draw(bufferbuilder, v.getX(), v.getY(), v.getZ()); + if (flag) { + this.currentLayer = Optional.empty(); + } + } + } + } + } } diff --git a/src/main/resources/ponder/furnace_engine.nbt b/src/main/resources/ponder/furnace_engine.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fe916ecc784b5195a8482e1a2a2e3a7ce1d5661f GIT binary patch literal 600 zcmV-e0;l~SiwFP!000000F9N~irX*{h9{Pkb+WX(TUzKV^c8y96iRQF(mmW7tuuB+ z6v;>m?(T#2`6@fHlR8eA0pkNR-~8iWLUVu_aIfBw0YGz2~r6bv@Lk(wME4!JzUpZH~7ZBeoIn{s$U# z@p;)N3b^Y(E@UNh6<(o*rVDHJ($?ni8*cUz3;kNJ5cL^x$NPov#r;2Hv2{k~n4u}- zm?O(!h!K0tPS*NSZE&yhTSRrQGY~%mZg!_)0yn=gR~7mv9|w*HX*b5*CN|BTEJ7!Q z!MhIoXoJ*e7T{3TH0E4YQez0%oV`~m@Ov4xd_HujS1MqZTN6i*MP0_nLxwlD&e{V! z4mtnjY=y2l+f$ep(GOEXvaM3Mm4B4aq_(Ea3gvtNQAq6%$gxE_0AANI!D(BT(fwU{ ztZu+CdFw%)OIo_JkzVf1J|j+eyA7)p=5fY2Qc%_a*I0y}cd~5Gka&$goTwPAl|e1j mD)f`|l8kj>)ss&Bj*eb`mq9+G^Nn6e|H41EBOs1(2><|+VHkq| literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/sequenced_gearshift.nbt b/src/main/resources/ponder/sequenced_gearshift.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3d91ad4850a4fcc44778e7166a1590f8e5ea5c51 GIT binary patch literal 1021 zcmVb~jr#w|3pfAy%2kA8(S(GElvO{E30fsDd=9_PZpJwPGAp=4+{|y2{ zNcrjGhvFw3kO+j~hJz;MH6XodCX=Ne;=>mM668|XP9CvWKtgSp0qfDU@jGn1mQCP* zLmhBJ2b`L-cL2xluxaB24mi{SCv?E6Ir|QE_8sbc2!}f0gbp}0=fI)PfkT}S;ZO&h z&;h6BOdaY>9qN1thdSVdoj5}hh^Yz4(=nvlNC6Y0K+MgeT#Sg%Q}RKg0L@PXzv2*^ zVhSD6H`z9jeT!T{e6->M62)fbB$2C}DQ2V!$nnd<SJI@K195wC?@$D4CL5*uD9nS(0-0z{;r0ME*K70y_uAtJpQmb-iw zQsJ4S2J1L-w2ytY{F;Eu-Bk89&ND4{Z9S^NKZqqOnfKOtlYcnJ&1c*x{_7dA91dI!~nUE?b#!cm= zZfiA-BimI=ul5K$4cEZq@cRHM3r9bC<$#;&EI3Yj>s1{330KmRm z`8Mc4n?f!0|pqlpgj%U%aaDs_>x9s~kynBjRwImWAr@hUOC1BW5`@h|bB z4!xibz1YMd4jfv`34tVMCV-%qaz1#r%IhBEN4@&tbvnREFNB?AZst-=0%#wxltse4 zdvR{Tw1*c5Oxva4zZ_)QuaDqA*$<%AGm7hrO9O%3UZi9kpRjmlgS&0;#Q+{giX;9& zNjx4QlfJh5>_;*&HkzvtF>$(BieZIbk^ zPx3v(GA`)&yRQ34Q= z&#&F1@nYr`=Saz;Rq^RsUea{%wUe@#8^i6YK5PR$W>XFirdYyAv7tGb zkA>m(ZidHzNkzonKM^{S^Zx45VEym?{D4_9;ChwMv`9u+%kY(wDOdKX0)yE?Xz&*6 zyvBQJm9RU(Y*DYy zTKq@W(yc(PAx>ayo Date: Wed, 17 Mar 2021 23:31:30 +0100 Subject: [PATCH 5/5] Ponder on Tracks - Ponder scenes for the Cart Assembler --- src/generated/resources/.cache/cache | 26 +- .../resources/assets/create/lang/en_us.json | 25 + .../assets/create/lang/unfinished/de_de.json | 27 +- .../assets/create/lang/unfinished/es_es.json | 27 +- .../assets/create/lang/unfinished/es_mx.json | 27 +- .../assets/create/lang/unfinished/fr_fr.json | 27 +- .../assets/create/lang/unfinished/it_it.json | 27 +- .../assets/create/lang/unfinished/ja_jp.json | 27 +- .../assets/create/lang/unfinished/ko_kr.json | 27 +- .../assets/create/lang/unfinished/nl_nl.json | 27 +- .../assets/create/lang/unfinished/pt_br.json | 27 +- .../assets/create/lang/unfinished/ru_ru.json | 27 +- .../assets/create/lang/unfinished/zh_cn.json | 27 +- .../assets/create/lang/unfinished/zh_tw.json | 27 +- .../create/foundation/ponder/PonderUI.java | 36 +- .../foundation/ponder/SceneBuilder.java | 41 +- .../ponder/content/CartAssemblerScenes.java | 534 ++++++++++++++++++ .../ponder/content/KineticsScenes.java | 21 +- .../ponder/content/PonderIndex.java | 11 +- .../ponder/elements/MinecartElement.java | 113 ++++ .../ponder/elements/ParrotElement.java | 19 +- .../AnimateElementInstruction.java | 1 + .../AnimateMinecartInstruction.java | 28 + .../CreateMinecartInstruction.java | 18 + .../FadeIntoSceneInstruction.java | 8 +- .../ponder/cart_assembler/anchor.nbt | Bin 0 -> 560 bytes .../resources/ponder/cart_assembler/dual.nbt | Bin 0 -> 588 bytes .../resources/ponder/cart_assembler/modes.nbt | Bin 0 -> 561 bytes .../resources/ponder/cart_assembler/rails.nbt | Bin 0 -> 662 bytes 29 files changed, 1162 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java create mode 100644 src/main/resources/ponder/cart_assembler/anchor.nbt create mode 100644 src/main/resources/ponder/cart_assembler/dual.nbt create mode 100644 src/main/resources/ponder/cart_assembler/modes.nbt create mode 100644 src/main/resources/ponder/cart_assembler/rails.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 63087dd59..4c93571f0 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -73cd8748a2a6277ec1ec1e4c0af4fe9cffbda8ce assets/create/lang/en_us.json -9777ac3724ec7d626437b12b67b533f6894afd29 assets/create/lang/unfinished/de_de.json -91e44b23201b2165b64837d9a8d0f3d5313a8058 assets/create/lang/unfinished/es_es.json -c859cb5f44c409adcdfa3de65642eb1f6c8fd5bc assets/create/lang/unfinished/es_mx.json -512e8b757d5a6b511a946f3cb56ce90653885f04 assets/create/lang/unfinished/fr_fr.json -af6c1fdea2304970eacaf8413e85fab5c0731918 assets/create/lang/unfinished/it_it.json -96063374af85f0f269b64262c319b3bde9623d45 assets/create/lang/unfinished/ja_jp.json -b5f1962be245e0042255d23c18de532f84a3b0fa assets/create/lang/unfinished/ko_kr.json -14b0b2b88be1d3d9d064f26a36b28e6762522809 assets/create/lang/unfinished/nl_nl.json -a8f5e1dcb5db76b2daffb056841fd0b785af5597 assets/create/lang/unfinished/pt_br.json -d06fb4feed18286366ed958044ab82d1bf2d15b8 assets/create/lang/unfinished/ru_ru.json -3498b6288bce0184992a2a4051c9416d76ad1a13 assets/create/lang/unfinished/zh_cn.json -8c26a0392f613db72705d56f46e8fdaa7e117dc6 assets/create/lang/unfinished/zh_tw.json +e371fd4fccf90c4ee6f2fbea91ea5d70e3d6c652 assets/create/lang/en_us.json +610a33e7074c3fb8e88370bed76549bfcfe0eddb assets/create/lang/unfinished/de_de.json +29339e0bf9743251639a2598d17f194cd406602c assets/create/lang/unfinished/es_es.json +e7138596de0babd4fc90a4b8ffb8fdea13088086 assets/create/lang/unfinished/es_mx.json +a95f57787534ae5d4920fe8e4825fe3012fdcd70 assets/create/lang/unfinished/fr_fr.json +7956b67df2d19a9f890f893c9d736516cc6e8629 assets/create/lang/unfinished/it_it.json +95394f8cc9d53397e030c46a9abef4fa4348e2ad assets/create/lang/unfinished/ja_jp.json +edcd5ffe8239f13cedbd63ab11c8334a38b90c90 assets/create/lang/unfinished/ko_kr.json +1749d2d020f02a2ccca4698d85bfdc4dcf849e3f assets/create/lang/unfinished/nl_nl.json +83c43209c295b3d3d85f7bebaa9a8ce7b79d47da assets/create/lang/unfinished/pt_br.json +a1a67295a2fe537080254fc8b353699d4d30989a assets/create/lang/unfinished/ru_ru.json +a525852b4f3aa0af52816e02e5cf4181de0c60c5 assets/create/lang/unfinished/zh_cn.json +51242fa9de9994103e9373e5c8dd6941438ec9a8 assets/create/lang/unfinished/zh_tw.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 9aa47e056..5b572a2a7 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1907,6 +1907,26 @@ "create.ponder.brass_funnel.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction", @@ -1996,6 +2016,11 @@ "create.ponder.fan_source.text_1": "Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "Funnel compatibility", "create.ponder.funnel_compat.text_1": "Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "Vertical Saws", 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 bf4699ed0..82ea9ce8f 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: 1350", + "_": "Missing Localizations: 1370", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index e4d4a4f6c..477c1075f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 381", + "_": "Missing Localizations: 401", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 7a61f13be..5b8a24ac5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1280", + "_": "Missing Localizations: 1300", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 19f3255d0..54fec9d1c 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: 1062", + "_": "Missing Localizations: 1082", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 a4706944c..8f188d3ce 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: 398", + "_": "Missing Localizations: 418", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 4549c93b4..6a407c0a5 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: 405", + "_": "Missing Localizations: 425", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 a1d30849c..735d654f7 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: 451", + "_": "Missing Localizations: 471", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 905e5b4c4..f3dbea0b4 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: 1549", + "_": "Missing Localizations: 1569", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 0f0960a19..659fc213b 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: 1615", + "_": "Missing Localizations: 1635", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 571fe933e..bbfb96413 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: 401", + "_": "Missing Localizations: 421", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", 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 9d5f52646..68ae1cb13 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: 399", + "_": "Missing Localizations: 419", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index b67952a4c..fff451d2d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 404", + "_": "Missing Localizations: 424", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index 82b2f4379..b9feddb16 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -83,6 +83,9 @@ public class PonderUI extends NavigatableSimiScreen { private ClipboardHelper clipboardHelper; private BlockPos copiedBlockPos; + private LerpedFloat finishingFlash; + private int finishingFlashWarmup = 0; + private LerpedFloat lazyIndex; private int index = 0; private PonderTag referredToByTag; @@ -133,6 +136,9 @@ public class PonderUI extends NavigatableSimiScreen { .startWithValue(0) .chase(1, .1f, Chaser.EXP); clipboardHelper = new ClipboardHelper(); + finishingFlash = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .1f, Chaser.EXP); } @Override @@ -250,10 +256,22 @@ public class PonderUI extends NavigatableSimiScreen { if (skipCooling == 0) activeScene.tick(); } + lazyIndex.tickChaser(); fadeIn.tickChaser(); + finishingFlash.tickChaser(); progressBar.tick(); + if (activeScene.currentTime == activeScene.totalTime - 1) + finishingFlashWarmup = 30; + if (finishingFlashWarmup > 0) { + finishingFlashWarmup--; + if (finishingFlashWarmup == 0) { + finishingFlash.setValue(1); + finishingFlash.setValue(1); + } + } + if (!identifyMode) { float lazyIndexValue = lazyIndex.getValue(); if (Math.abs(lazyIndexValue - index) > 1 / 512f) @@ -389,10 +407,26 @@ public class PonderUI extends NavigatableSimiScreen { RenderSystem.pushMatrix(); RenderSystem.translated(story.basePlateOffsetX, 0, story.basePlateOffsetZ); RenderSystem.scaled(1, -1, 1); + + float flash = finishingFlash.getValue(partialTicks) * .9f; + float alpha = flash; + flash *= flash; + flash = ((flash * 2) - 1); + flash *= flash; + flash = 1 - flash; + for (int f = 0; f < 4; f++) { RenderSystem.translated(story.basePlateSize, 0, 0); RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 1 / 1024f); + RenderSystem.translated(0, 0, -1 / 1024f); + if (flash > 0) { + RenderSystem.pushMatrix(); + RenderSystem.scaled(1, .5 + flash * .75, 1); + GuiUtils.drawGradientRect(0, 0, -1, -story.basePlateSize, 0, 0x00_c6ffc9, + ColorHelper.applyAlpha(0xaa_c6ffc9, alpha)); + RenderSystem.popMatrix(); + } + RenderSystem.translated(0, 0, 2 / 1024f); GuiUtils.drawGradientRect(0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); RenderSystem.popMatrix(); RenderSystem.rotatef(-90, 0, 1, 0); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 84fc8560a..92450e9d8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -17,18 +17,23 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.ponder.content.PonderPalette; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import com.simibubi.create.foundation.ponder.elements.BeltItemElement; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement.MinecartConstructor; import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement.ParrotPose; import com.simibubi.create.foundation.ponder.elements.ParrotElement.SpinOnComponentPose; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.AnimateMinecartInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateTileEntityInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; +import com.simibubi.create.foundation.ponder.instructions.CreateMinecartInstruction; import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; @@ -328,12 +333,15 @@ public class SceneBuilder { } public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) { + showScrollInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), side, duration); + } + + public void showScrollInput(Vec3d location, Direction side, int duration) { Axis axis = side.getAxis(); float s = 1 / 16f; float q = 1 / 4f; Vec3d expands = new Vec3d(axis == Axis.X ? s : q, axis == Axis.Y ? s : q, axis == Axis.Z ? s : q); - addInstruction(new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), - expands, duration)); + addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); } public void showRepeaterScrollInput(BlockPos pos, int duration) { @@ -359,6 +367,10 @@ public class SceneBuilder { addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); } + public void hideElement(ElementLink link, Direction direction) { + addInstruction(new FadeOutOfSceneInstruction<>(15, direction, link)); + } + } public class SpecialInstructions { @@ -402,6 +414,22 @@ public class SceneBuilder { addInstruction(AnimateParrotInstruction.move(link, offset, duration)); } + public ElementLink createCart(Vec3d location, float angle, MinecartConstructor type) { + ElementLink link = new ElementLink<>(MinecartElement.class); + MinecartElement cart = new MinecartElement(location, angle, type); + addInstruction(new CreateMinecartInstruction(10, Direction.DOWN, cart)); + addInstruction(scene -> scene.linkElement(cart, link)); + return link; + } + + public void rotateCart(ElementLink link, float yRotation, int duration) { + addInstruction(AnimateMinecartInstruction.rotate(link, yRotation, duration)); + } + + public void moveCart(ElementLink link, Vec3d offset, int duration) { + addInstruction(AnimateMinecartInstruction.move(link, offset, duration)); + } + } public class WorldInstructions { @@ -445,6 +473,13 @@ public class SceneBuilder { return instruction.createLink(scene); } + public ElementLink showIndependentSectionImmediately(Selection selection) { + DisplayWorldSectionInstruction instruction = + new DisplayWorldSectionInstruction(0, Direction.DOWN, selection, Optional.empty()); + addInstruction(instruction); + return instruction.createLink(scene); + } + public void hideSection(Selection selection, Direction fadeOutDirection) { WorldSectionElement worldSectionElement = new WorldSectionElement(selection); ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); @@ -513,7 +548,7 @@ public class SceneBuilder { public void movePulley(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); } - + public void moveDeployer(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java new file mode 100644 index 000000000..037078293 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java @@ -0,0 +1,534 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssembleRailType; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.ChestMinecartEntity; +import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; +import net.minecraft.entity.item.minecart.MinecartEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.state.properties.RailShape; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class CartAssemblerScenes { + + public static void anchor(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler", "Moving Structures using Cart Assemblers"); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos assemblerPos = util.grid.at(2, 1, 2); + scene.world.setBlock(assemblerPos, Blocks.RAIL.getDefaultState(), false); + for (int z = 0; z < 5; z++) { + scene.world.showSection(util.select.position(2, 1, z), Direction.DOWN); + scene.idle(2); + } + + BlockPos leverPos = util.grid.at(0, 1, 2); + Selection toggle = util.select.fromTo(assemblerPos, leverPos); + + scene.idle(10); + + scene.overlay + .showControls(new InputWindowElement(util.vector.centerOf(assemblerPos), Pointing.DOWN).rightClick() + .withItem(AllBlocks.CART_ASSEMBLER.asStack()), 30); + scene.idle(7); + scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(20); + scene.world.showSection(util.select.fromTo(0, 1, 2, 1, 1, 2), Direction.EAST); + scene.idle(20); + scene.world.toggleRedstonePower(toggle); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(70) + .text("Powered Cart Assemblers mount attached structures to passing Minecarts") + .attachKeyFrame() + .pointAt(util.vector.topOf(assemblerPos)) + .placeNearTarget(); + scene.idle(80); + + ElementLink cart = + scene.special.createCart(util.vector.topOf(2, 0, 4), 90, MinecartEntity::new); + scene.world.showSection(util.select.position(assemblerPos.up()), Direction.DOWN); + scene.idle(10); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + ElementLink plank = + scene.world.makeSectionIndependent(util.select.position(assemblerPos.up())); + ElementLink anchor = + scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.east())); + scene.world.moveSection(anchor, util.vector.of(-1, 0, 0), 0); + scene.effects.indicateSuccess(assemblerPos); + scene.idle(1); + scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); + scene.world.moveSection(plank, util.vector.of(0, 0, -2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + + scene.world.toggleRedstonePower(toggle); + scene.idle(10); + + scene.overlay.showText(70) + .text("Without a redstone signal, it disassembles passing cart contraptions back into blocks") + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(assemblerPos)) + .placeNearTarget(); + scene.idle(80); + + scene.world.rotateSection(anchor, 0, 180, 0, 6); + scene.world.rotateSection(plank, 0, 180, 0, 6); + scene.idle(3); + + scene.world.moveSection(anchor, util.vector.of(0, 0, 2), 20); + scene.world.moveSection(plank, util.vector.of(0, 0, 2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.idle(21); + scene.world.moveSection(anchor, util.vector.of(0, -2, 0), 0); + scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.idle(30); + + scene.world.destroyBlock(assemblerPos.up()); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(1, 4, 2, 3, 3, 2), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(0, -1, 0), 0); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 3, 1), Direction.SOUTH, contraption); + scene.idle(15); + scene.effects.superGlue(util.grid.at(3, 2, 1), Direction.SOUTH, true); + scene.overlay.showText(80) + .attachKeyFrame() + .sharedText("movement_anchors") + .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.NORTH)) + .placeNearTarget(); + scene.idle(80); + scene.world.toggleRedstonePower(toggle); + scene.effects.indicateRedstone(leverPos); + + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + scene.world.moveSection(anchor, util.vector.of(0, 2, 0), 0); + scene.idle(1); + scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); + scene.world.moveSection(contraption, util.vector.of(0, 0, -2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(25); + + Vec3d cartCenter = util.vector.centerOf(assemblerPos.north(2)); + scene.overlay.showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.special.moveCart(cart, util.vector.of(0, -100, 4), 0); + scene.world.moveSection(anchor, util.vector.of(0, -100, 4), 0); + scene.world.moveSection(contraption, util.vector.of(0, -100, 4), 0); + ItemStack asStack = AllItems.MINECART_CONTRAPTION.asStack(); + ElementLink itemEntity = + scene.world.createItemEntity(cartCenter, util.vector.of(0, .1, 0), asStack); + scene.idle(40); + scene.overlay.showText(80) + .attachKeyFrame() + .text("Using a Wrench on the Minecart will let you carry the Contraption elsewhere") + .pointAt(cartCenter) + .placeNearTarget(); + scene.idle(80); + scene.world.modifyEntity(itemEntity, Entity::remove); + + scene.overlay.showControls(new InputWindowElement(cartCenter.add(0, 0, 4), Pointing.DOWN).rightClick() + .withItem(asStack), 20); + scene.idle(20); + scene.special.moveCart(cart, util.vector.of(0, 100.5, 0), 0); + scene.world.moveSection(anchor, util.vector.of(0, 100.5, 0), 0); + scene.world.moveSection(contraption, util.vector.of(0, 100.5, 0), 0); + scene.idle(1); + scene.special.moveCart(cart, util.vector.of(0, -.5, 0), 5); + scene.world.moveSection(anchor, util.vector.of(0, -.5, 0), 5); + scene.world.moveSection(contraption, util.vector.of(0, -.5, 0), 5); + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_modes", "Orientation Settings for Minecart Contraptions"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int z = 0; z < 4; z++) { + scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.idle(2); + } + for (int x = 2; x < 5; x++) { + scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.idle(2); + } + + BlockPos assemblerPos = util.grid.at(3, 1, 3); + scene.idle(5); + scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(3, 2, 3), Direction.DOWN); + scene.idle(10); + scene.world.glueBlockOnto(util.grid.at(2, 2, 3), Direction.EAST, contraption); + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.idle(10); + + ElementLink cart = + scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, MinecartEntity::new); + scene.idle(20); + scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.idle(10); + ElementLink anchor = + scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.idle(16); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.world.rotateSection(anchor, 0, -90, 0, 12); + scene.world.rotateSection(contraption, 0, -90, 0, 12); + scene.idle(9); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.idle(15); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("Cart Contraptions will rotate to face towards their carts' motion") + .pointAt(util.vector.of(1.5, 2.5, 0)) + .placeNearTarget(); + scene.idle(90); + + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.world.hideIndependentSection(anchor, Direction.UP); + scene.overlay.hideElement(cart, Direction.UP); + scene.idle(25); + + Vec3d blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH) + .add(0, 0, -2 / 16f); + scene.overlay.showScrollInput(blockSurface, Direction.NORTH, 60); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() + .withWrench(), 60); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(util.vector.of(3, 1.5, 3)) + .placeNearTarget() + .sharedText("behaviour_modify_wrench"); + scene.idle(70); + + contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); + cart = scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, MinecartEntity::new); + scene.idle(10); + scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.idle(10); + anchor = scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.idle(16); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.idle(9); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.idle(15); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("If the Assembler is set to Lock Rotation, the contraptions' orientation will never change") + .pointAt(util.vector.of(0, 2.5, 1.5)) + .placeNearTarget(); + scene.idle(90); + } + + public static void dual(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_dual", "Assembling Carriage Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int z = 0; z < 5; z++) { + scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.idle(2); + } + for (int x = 2; x < 6; x++) { + scene.world.showSection(util.select.position(x, 1, 4), Direction.DOWN); + scene.idle(2); + } + + BlockPos assembler1 = util.grid.at(2, 1, 4); + BlockPos assembler2 = util.grid.at(5, 1, 4); + Selection chassis = util.select.fromTo(5, 2, 4, 2, 2, 4); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 2), Direction.SOUTH); + scene.idle(5); + ElementLink cart = + scene.special.createCart(util.vector.topOf(assembler1.down()), 0, MinecartEntity::new); + ElementLink cart2 = + scene.special.createCart(util.vector.topOf(assembler2.down()), 0, ChestMinecartEntity::new); + scene.idle(15); + scene.world.setBlock(assembler1, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.CONTROLLER_RAIL), true); + scene.idle(5); + scene.world.setBlock(assembler2, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(5); + + ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(15); + scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(assembler2), 60); + scene.overlay.showSelectionWithText(util.select.position(assembler1), 60) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 4), Direction.NORTH)) + .placeNearTarget() + .text("Whenever two Cart Assembers share an attached structure...") + .attachKeyFrame(); + scene.idle(70); + + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 4), Direction.NORTH)) + .placeNearTarget() + .text("Powering either of them will create a Carriage Contraption"); + scene.idle(70); + + scene.effects.indicateRedstone(util.grid.at(2, 1, 2)); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 2, 1, 4)); + ElementLink anchors = + scene.world.showIndependentSectionImmediately(util.select.fromTo(assembler1.south(), assembler2.south())); + scene.world.moveSection(anchors, util.vector.of(0, 0, -1), 0); + scene.world.configureCenterOfRotation(anchors, util.vector.centerOf(util.grid.at(2, 2, 5))); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(util.grid.at(2, 2, 4))); + scene.idle(5); + + Vec3d m = util.vector.of(-0.5, 0, 0); + scene.special.moveCart(cart, m, 5); + scene.special.moveCart(cart2, m, 5); + scene.world.moveSection(contraption, m, 5); + scene.world.moveSection(anchors, m, 5); + scene.idle(5); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart2, util.vector.of(-.3, 0, 0), 8); + m = util.vector.of(-.5, 0, -.5); + scene.special.moveCart(cart, m, 8); + scene.world.moveSection(anchors, m, 8); + scene.world.moveSection(contraption, m, 8); + scene.world.rotateSection(anchors, 0, -10, 0, 8); + scene.world.rotateSection(contraption, 0, -10, 0, 8); + scene.idle(8); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart2, util.vector.of(-.4, 0, 0), 5); + m = util.vector.of(0, 0, -3.5); + scene.special.moveCart(cart, m, 25); + scene.world.moveSection(anchors, m, 25); + scene.world.moveSection(contraption, m, 25); + scene.world.rotateSection(anchors, 0, -33, 0, 10); + scene.world.rotateSection(contraption, 0, -33, 0, 10); + scene.idle(5); + scene.special.moveCart(cart2, util.vector.of(-0.8, 0, 0), 5); + scene.idle(5); + scene.special.moveCart(cart2, util.vector.of(-1.5, 0, 0), 9); + scene.world.rotateSection(anchors, 0, -42, 0, 9); + scene.world.rotateSection(contraption, 0, -42, 0, 9); + scene.idle(9); + m = util.vector.of(-.5, 0, -.5); + scene.special.moveCart(cart2, m, 2); + scene.special.rotateCart(cart2, -45, 2); + scene.world.rotateSection(anchors, 0, -5, 0, 5); + scene.world.rotateSection(contraption, 0, -5, 0, 5); + scene.idle(2); + scene.special.moveCart(cart2, util.vector.of(0, 0, -.5), 5); + scene.special.rotateCart(cart2, -45, 2); + scene.idle(10); + + scene.overlay.showText(70) + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.WEST)) + .placeNearTarget() + .text("The carts will behave like those connected via Minecart Coupling"); + scene.idle(80); + + } + + public static void rails(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_rails", "Other types of Minecarts and Rails"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int x = 0; x < 6; x++) { + scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.idle(2); + } + + BlockPos assembler = util.grid.at(3, 1, 3); + + Selection chassis = util.select.fromTo(4, 2, 3, 2, 2, 3); + + scene.idle(5); + scene.overlay.showText(70) + .attachKeyFrame() + .pointAt(util.vector.blockSurface(assembler, Direction.DOWN)) + .placeNearTarget() + .text("Cart Assemblers on Regular Tracks will not affect the passing carts' motion"); + scene.idle(10); + scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(70); + + ElementLink cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, MinecartEntity::new); + ElementLink anchor = + scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(assembler.south() + .up()), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); + scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.idle(10); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); + scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); + scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 25); + scene.idle(30); + scene.overlay.hideElement(cart, Direction.UP); + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.world.moveSection(anchor, util.vector.of(0, -3, 0), 0); + scene.idle(30); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler), Pointing.DOWN) + .withItem(new ItemStack(Items.POWERED_RAIL)), 50); + scene.idle(7); + scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.POWERED_RAIL), true); + scene.overlay.showText(100) + .attachKeyFrame() + .pointAt(util.vector.topOf(assembler)) + .placeNearTarget() + .text("When on Powered or Controller Rail, the carts will be held in place until it's Powered"); + scene.idle(110); + + scene.world.hideIndependentSection(anchor, Direction.DOWN); + cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, MinecartEntity::new); + anchor = scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + contraption = scene.world.showIndependentSection(util.select.position(assembler.south() + .up()), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); + scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.idle(10); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); + scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); + scene.special.moveCart(cart, util.vector.of(-2, 0, 0), 10); + scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + scene.idle(30); + + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.idle(5); + + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 15); + scene.special.moveCart(cart, util.vector.of(-3, 0, 0), 15); + + scene.idle(30); + scene.overlay.hideElement(cart, Direction.UP); + scene.world.hideIndependentSection(anchor, Direction.UP); + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.idle(20); + + cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, FurnaceMinecartEntity::new); + scene.idle(10); + scene.overlay.showText(50) + .attachKeyFrame() + .pointAt(util.vector.topOf(assembler.east(2))) + .placeNearTarget() + .text("Other types of Minecarts can be used as the anchor"); + scene.idle(50); + contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(assembler.up(2), Direction.DOWN, contraption); + scene.idle(15); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler.up()), Pointing.UP) + .withItem(new ItemStack(Items.CHARCOAL)), 40); + scene.idle(7); + scene.overlay.showText(80) + .pointAt(util.vector.blockSurface(assembler.up(2), Direction.WEST)) + .placeNearTarget() + .text("Furnace Carts will keep themselves powered, pulling fuel from any attached inventories"); + scene.idle(85); + + Emitter smoke = Emitter.simple(ParticleTypes.LARGE_SMOKE, util.vector.of(0, 0, 0)); + + scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 50); + scene.idle(20); + anchor = scene.world.showIndependentSectionImmediately(util.select.position(assembler.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 30); + scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 30); + + Vec3d vec = util.vector.centerOf(assembler) + .add(.25, .25, -0.5); + for (int i = 0; i < 7; i++) { + scene.effects.emitParticles(vec = vec.add(-.5, 0, 0), smoke, 2, 1); + scene.idle(5); + } + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index e2d9fcab8..2e6dfe173 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -1,7 +1,5 @@ package com.simibubi.create.foundation.ponder.content; -import java.io.File; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; @@ -854,7 +852,16 @@ public class KineticsScenes { } public static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("furnace_engine", "Generating Rotational Force using the Furnace Engine"); + furnaceEngine(scene, util, false); + } + + public static void flywheel(SceneBuilder scene, SceneBuildingUtil util) { + furnaceEngine(scene, util, true); + } + + private static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util, boolean flywheel) { + scene.title(flywheel ? "flywheel" : "furnace_engine", + "Generating Rotational Force using the " + (flywheel ? "Flywheel" : "Furnace Engine")); scene.configureBasePlate(0, 0, 6); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -871,11 +878,13 @@ public class KineticsScenes { scene.world.showSection(util.select.position(furnacePos.west(3)), Direction.EAST); scene.idle(10); + String text = flywheel ? "Flywheels are required for generating rotational force with the Furnace Engine" + : "Furnace Engines generate Rotational Force while their attached Furnace is running"; scene.overlay.showText(80) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(furnacePos.west())) - .text("Furnace Engines generate Rotational Force while their attached Furnace is running"); + .pointAt(util.vector.topOf(furnacePos.west(flywheel ? 3 : 1))) + .text(text); scene.idle(90); scene.overlay.showControls( @@ -993,7 +1002,7 @@ public class KineticsScenes { scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); scene.effects.rotationSpeedIndicator(cogPos); scene.idle(55); - + scene.overlay.showControls(input, 30); scene.idle(15); scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), -.05f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index d73c72246..fa3411878 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -70,8 +70,10 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); - PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE, AllBlocks.FLYWHEEL) + PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE) .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); + PonderRegistry.forComponents(AllBlocks.FLYWHEEL) + .addStoryBoard("furnace_engine", KineticsScenes::flywheel); PonderRegistry.forComponents(AllBlocks.ROTATION_SPEED_CONTROLLER) .addStoryBoard("speed_controller", KineticsScenes::speedController); @@ -142,6 +144,13 @@ public class PonderIndex { .addStoryBoard("gantry/direction", GantryScenes::direction) .addStoryBoard("gantry/subgantry", GantryScenes::subgantry); + // Cart Assembler + PonderRegistry.forComponents(AllBlocks.CART_ASSEMBLER) + .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("cart_assembler/modes", CartAssemblerScenes::modes) + .addStoryBoard("cart_assembler/dual", CartAssemblerScenes::dual) + .addStoryBoard("cart_assembler/rails", CartAssemblerScenes::rails); + // Movement Actors PonderRegistry.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, PonderTag.CONTRAPTION_ACTOR) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java new file mode 100644 index 000000000..e121895b9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java @@ -0,0 +1,113 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class MinecartElement extends AnimatedSceneElement { + + private Vec3d location; + private LerpedFloat rotation; + private AbstractMinecartEntity entity; + private MinecartConstructor constructor; + private float initialRotation; + + public interface MinecartConstructor { + AbstractMinecartEntity create(World w, double x, double y, double z); + } + + public MinecartElement(Vec3d location, float rotation, MinecartConstructor constructor) { + initialRotation = rotation; + this.location = location.add(0, 1 / 16f, 0); + this.constructor = constructor; + this.rotation = LerpedFloat.angular() + .startWithValue(rotation); + } + + @Override + public void reset(PonderScene scene) { + super.reset(scene); + entity.setPos(0, 0, 0); + entity.prevPosX = 0; + entity.prevPosY = 0; + entity.prevPosZ = 0; + entity.lastTickPosX = 0; + entity.lastTickPosY = 0; + entity.lastTickPosZ = 0; + rotation.startWithValue(initialRotation); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (entity == null) + entity = constructor.create(scene.getWorld(), 0, 0, 0); + + entity.ticksExisted++; + entity.onGround = true; + entity.prevPosX = entity.getX(); + entity.prevPosY = entity.getY(); + entity.prevPosZ = entity.getZ(); + entity.lastTickPosX = entity.getX(); + entity.lastTickPosY = entity.getY(); + entity.lastTickPosZ = entity.getZ(); + } + + public void setPositionOffset(Vec3d position, boolean immediate) { + if (entity == null) + return; + entity.setPosition(position.x, position.y, position.z); + if (!immediate) + return; + entity.prevPosX = position.x; + entity.prevPosY = position.y; + entity.prevPosZ = position.z; + } + + public void setRotation(float angle, boolean immediate) { + if (entity == null) + return; + rotation.setValue(angle); + if (!immediate) + return; + rotation.startWithValue(angle); + } + + public Vec3d getPositionOffset() { + return entity != null ? entity.getPositionVec() : Vec3d.ZERO; + } + + public Vec3d getRotation() { + return new Vec3d(0, rotation.getValue(), 0); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { + EntityRendererManager entityrenderermanager = Minecraft.getInstance() + .getRenderManager(); + if (entity == null) + entity = constructor.create(world, 0, 0, 0); + + ms.push(); + ms.translate(location.x, location.y, location.z); + ms.translate(MathHelper.lerp(pt, entity.prevPosX, entity.getX()), + MathHelper.lerp(pt, entity.prevPosY, entity.getY()), MathHelper.lerp(pt, entity.prevPosZ, entity.getZ())); + + MatrixStacker.of(ms) + .rotateY(rotation.getValue(pt)); + + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java index c2ea78695..99d8081aa 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java @@ -50,13 +50,17 @@ public class ParrotElement extends AnimatedSceneElement { entity.lastTickPosX = 0; entity.lastTickPosY = 0; entity.lastTickPosZ = 0; + entity.prevRotationPitch = entity.rotationPitch = 0; + entity.prevRotationYaw = entity.rotationYaw = 180; } @Override public void tick(PonderScene scene) { super.tick(scene); - if (entity == null) - return; + if (entity == null) { + entity = pose.create(scene.getWorld()); + entity.prevRotationYaw = entity.rotationYaw = 180; + } entity.ticksExisted++; entity.prevRotationYawHead = entity.rotationYawHead; @@ -112,8 +116,10 @@ public class ParrotElement extends AnimatedSceneElement { EntityRendererManager entityrenderermanager = Minecraft.getInstance() .getRenderManager(); - if (entity == null) + if (entity == null) { entity = pose.create(world); + entity.prevRotationYaw = entity.rotationYaw = 180; + } ms.push(); ms.translate(location.x, location.y, location.z); @@ -209,10 +215,13 @@ public class ParrotElement extends AnimatedSceneElement { double d1 = p_200602_2_.y - vec3d.y; double d2 = p_200602_2_.z - vec3d.z; double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - entity.rotationPitch = + float targetPitch = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d1, d3) * (double) (180F / (float) Math.PI))); - entity.rotationYaw = + float targetYaw = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); + + entity.rotationPitch = AngleHelper.angleLerp(.4f, entity.rotationPitch, targetPitch); + entity.rotationYaw = AngleHelper.angleLerp(.4f, entity.rotationYaw, targetYaw); } protected abstract Vec3d getFacedVec(PonderScene scene); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java index 629f31085..d2352b082 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java @@ -47,6 +47,7 @@ public class AnimateElementInstruction extends Tic if (element == null) return; if (remainingTicks == 0) { + setter.accept(element, target); setter.accept(element, target); return; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java new file mode 100644 index 000000000..8c23c2db7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import java.util.function.BiConsumer; +import java.util.function.Function; + +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; + +import net.minecraft.util.math.Vec3d; + +public class AnimateMinecartInstruction extends AnimateElementInstruction { + + public static AnimateMinecartInstruction rotate(ElementLink link, float rotation, int ticks) { + return new AnimateMinecartInstruction(link, new Vec3d(0, rotation, 0), ticks, + (wse, v) -> wse.setRotation((float) v.y, ticks == 0), MinecartElement::getRotation); + } + + public static AnimateMinecartInstruction move(ElementLink link, Vec3d offset, int ticks) { + return new AnimateMinecartInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0), + MinecartElement::getPositionOffset); + } + + protected AnimateMinecartInstruction(ElementLink link, Vec3d totalDelta, int ticks, + BiConsumer setter, Function getter) { + super(link, totalDelta, ticks, setter, getter); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java new file mode 100644 index 000000000..a6216f177 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.elements.MinecartElement; + +import net.minecraft.util.Direction; + +public class CreateMinecartInstruction extends FadeIntoSceneInstruction { + + public CreateMinecartInstruction(int fadeInTicks, Direction fadeInFrom, MinecartElement element) { + super(fadeInTicks, fadeInFrom, element); + } + + @Override + protected Class getElementClass() { + return MinecartElement.class; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index bad0f79b9..bb184144e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -23,6 +23,7 @@ public abstract class FadeIntoSceneInstruction e protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.addElement(element); + element.setVisible(true); element.setFade(0); element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); if (elementLink != null) @@ -32,10 +33,13 @@ public abstract class FadeIntoSceneInstruction e @Override public void tick(PonderScene scene) { super.tick(scene); - float fade = (remainingTicks / (float) totalTicks); + float fade = totalTicks == 0 ? 1 : (remainingTicks / (float) totalTicks); element.setFade(1 - fade * fade); - if (remainingTicks == 0) + if (remainingTicks == 0) { + if (totalTicks == 0) + element.setFade(1); element.setFade(1); + } } public ElementLink createLink(PonderScene scene) { diff --git a/src/main/resources/ponder/cart_assembler/anchor.nbt b/src/main/resources/ponder/cart_assembler/anchor.nbt new file mode 100644 index 0000000000000000000000000000000000000000..de8bc0bd15d445b01dc1a243e106846d3826f478 GIT binary patch literal 560 zcmV-00?+*)iwFP!000000IikJj@uv*#>a*vwxez@{r3nx_Ppnwt4fvjY7u9$Mj>Fq zr0MR1_4$h3*vUHBLfS>*fcWM&!+h8j06B0cpOFDTI~V=TAwx})BsyqE4$F-))!r3; z@ihn57}p04gTca)AUsE0Ym$H_8EMi84vXOM2u?qe8BP+=j5%ophedFBB!`VO>BPCx z2rtqIFXlKbg2N*?X+LMq#UeC=?Gc``2v6rYEP}%$IQ`%ee(?yu<~S^Z!-JdxnBEYB z^{>hrr5=Pjb{iR_atj|Ti(YwO2}`AL4i6iJHc((PGLTJyv;W|`9$b5>bb+?85s|-& zn7%oY1&E7RpPJv)81D7;4{$l5NoF(<@N5;RXROHrT^MWfiF#N>&3vR;H9{c~wr^9B z0skQm2wx6TV`asT?oYKOEGwgZXMIqw_;67;ZBAwPz=d{=*q4nGdhfh-#ZPM*wC&62 z&uN8JB|S9=D~pduC2Z!)F(L-|fr=(8$g zLhW7pZK)r9h8NKH7pTJDw>{-390AuxcNTTA{i-XnU-1*RLMONFR+k-;Z$qBXSH<|Y{tMaw literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cart_assembler/dual.nbt b/src/main/resources/ponder/cart_assembler/dual.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b7110b5810ad7ed5adf6c79f28b42dec9d24258a GIT binary patch literal 588 zcmV-S0<--eiwFP!000000IinKj+-zL#s_R?fvDR{|2;-8z3jQ?s#2xBA_peL3b7;G zTekaPeZCqt5K4d@sXG#ikiYrO*xv*>14w~8^@I!n+Go@MrjVfa$}4oxMhcrb?Z~{jVIDJGbnrKEdtrZhEjKJXpjv#RQ zhzWkh1i#iejKJXpjv#ObO9_54f?sPKM&NJ)M-VuDaDrc);MW?55jdQ{5d=;jg5Z}R z__fAi1P&)~#4INRrgxsf_D5k&UEj<4pk>laq@7i^yJ` z$X}f(W{KC{cm9twY(WzdH1Ucip3(3H4kK{J8nM6`?|rkt8EbB4e4c8O8RuTo2!f{X zXFT`m0%xkZImsHm$M))wCBVPQBf_Vn(pXrz_jgUDJm!VbVPZm3uXuM+IBlA|yMKhC z%f4H4Lfc+V5_sdhDh|K%o$=lrLF{GiFc9Qp7`f;vf$S{s=5$^i3cNp0XdUWEoA-k{ zsUTb>PY7FWtgmus9(*+rZZ9obsp@Ge-^&6+)!G=FgkvxbS}cbqH(^=npTJQ%KQP~3 zm^J=Fdj;*(TpNvTb6r3ETi0WIqbu7pXmBL#ibM2ysPl2uJC@D|S>7m%3;WNW_y13; zFKqvunYKB3+svqqFkd@a92#j$H}&O1|K%{+w;vX?ISEg;<#{+BuL^c)()wKLqB1rN a_4cdu@*b^IMu$JeANULV-~VVc3jhGv0vEsl literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cart_assembler/modes.nbt b/src/main/resources/ponder/cart_assembler/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..a287d78be02d3c9376c40ca33313dea24740ec5a GIT binary patch literal 561 zcmV-10?z#(iwFP!000000F{+ZkDD+MhR4`sfvws-RJ;8Hz4yH5UV4ct_2Y^hm@L*3 z8`*A&`osGBY9M?p0oHXCMULNjJo9=C2|x_Yh(AaHp!tUVZwwJiE37~R&4^)lC{^}s z5;yr61Fe+lgN8vNG?rVuL`*egK|^Mmz=K0QILw3753<1_3z|76@ZeAn4)fsjBk=G! z@bGzyLp?amgEJh3htJf*=PeHP;4lwPKbVKl%){p`4)x%$MNR@#9xR1uk7xT`WY5i? zA%x#5#JnvLqOV##X*BH>CUCcRE2drlQRR+9A_zndZ!(Q;_Lyr?mJ2lmGrxk%-Z6w< zES|atM2EUN35l8JNBel-TH_o?7jSgJTGACTXxNH|Y-s3$CS2hJ9-OIWx5Am$b+cgQ zTobMAwWVSI!I`#9>^?UYFVR|Tp5jRaY|l>!AI3wg3t=(MlyoiOf_laKQDLO2)Am*1 zx*%~4R-ta*5)tfSdGRGp%0hlI$>6DDKcKBU7xK)hf--#K)EhIJSmo0|iw_~v8;wqH61ki0*Dy1W5l&Vp?i_~Q>sSf$1x_2Y9#NVi| zpskuoC9z4a&8MHWIX17~+|4@E`lWVrAfHATC%L;jY@IBvg~pZoldk?3slHPFB{FVe z(ibQAns59p43P7nzwb}H3FF$PTxNyRt|xClbIX6CHbP0)vwz_q^2!9~fd~KqGffT_ literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cart_assembler/rails.nbt b/src/main/resources/ponder/cart_assembler/rails.nbt new file mode 100644 index 0000000000000000000000000000000000000000..783075672ad7036741efce223c0d5cb23664bbf1 GIT binary patch literal 662 zcmV;H0%`ppiwFP!000000Hv1Aa?>yrg|96swNof8_rtKCL=#2w zNGfT0FrJTVCr*s(hRdLg$K&YeyRy%b>^VRQGMb+#0H8f)bjbExLV+%sWH3V8N|@bR zU$5hwEP+lHsm6dqy+dVa_Jf zn2l-`6KVXLCTC~_Ln9d)^$)d%E3u^CS)(ncgzZazUVyyR8-x!>Kej8Au&TWyziCjf zcym-l=eJe&DlJgRWMB~7q? zxunJ0^ZQ9F=R;Z%Fg-R1vq=BhV}U1m9-$>skeJr{P>=E6q>Z1snS w7XyMePps=bI_Tf^p0~qvNR@W=$_L8q`4^q^4TfmEqfGyT-_^r@